summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2012-05-22 14:17:53 +0000
committerDuncan Sands <baldrick@free.fr>2012-05-22 14:17:53 +0000
commit5cdbb1de7d9ca578330b35b7fb7b10296216316b (patch)
tree46567e7a91d9af1f6634437743f3ba9b8425fb98 /test
parent85b9e56bac85b30ede70e46ef9f60e4dec3b88f3 (diff)
downloadllvm-5cdbb1de7d9ca578330b35b7fb7b10296216316b.tar.gz
llvm-5cdbb1de7d9ca578330b35b7fb7b10296216316b.tar.bz2
llvm-5cdbb1de7d9ca578330b35b7fb7b10296216316b.tar.xz
Fix PR12858, a crash due to GVN's PRE not fully removing an instruction from the
leader table. That's because it wasn't expecting instructions to turn up as leader for a value number that is not its own, but equality propagation could create this situation. One solution is to have the leader table use a WeakVH but this slows down GVN by about 5%. Instead just have equality propagation not add instructions to the leader table, only constants and arguments. In theory this might cause GVN to run more (each time it changes something it runs again) but it doesn't seem to occur enough to cause a slow down. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157251 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Transforms/GVN/2012-05-22-PreCrash.ll33
1 files changed, 33 insertions, 0 deletions
diff --git a/test/Transforms/GVN/2012-05-22-PreCrash.ll b/test/Transforms/GVN/2012-05-22-PreCrash.ll
new file mode 100644
index 0000000000..b488dda9c3
--- /dev/null
+++ b/test/Transforms/GVN/2012-05-22-PreCrash.ll
@@ -0,0 +1,33 @@
+; RUN: opt < %s -gvn
+; PR12858
+
+define void @fn5(i16 signext %p1, i8 signext %p2) nounwind uwtable {
+entry:
+ br i1 undef, label %if.else, label %if.then
+
+if.then: ; preds = %entry
+ br label %if.end
+
+if.else: ; preds = %entry
+ %conv = sext i16 %p1 to i32
+ br label %if.end
+
+if.end: ; preds = %if.else, %if.then
+ %conv1 = sext i16 %p1 to i32
+ br i1 undef, label %if.then3, label %if.else4
+
+if.then3: ; preds = %if.end
+ br label %if.end12
+
+if.else4: ; preds = %if.end
+ %conv7 = sext i8 %p2 to i32
+ %cmp8 = icmp eq i32 %conv1, %conv7
+ br i1 %cmp8, label %if.then10, label %if.end12
+
+if.then10: ; preds = %if.else4
+ br label %if.end12
+
+if.end12: ; preds = %if.then10, %if.else4, %if.then3
+ %conv13 = sext i8 %p2 to i32
+ ret void
+}