summaryrefslogtreecommitdiff
path: root/test/Analysis
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis')
-rw-r--r--test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll87
1 files changed, 87 insertions, 0 deletions
diff --git a/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll b/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll
index 3a0ab0f03b9..e797b377556 100644
--- a/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll
+++ b/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll
@@ -100,3 +100,90 @@ backedge:
exit:
ret i8 0
}
+
+; Merging cont block into do block. Make sure that we do not incorrectly have the cont
+; LVI info as LVI info for the beginning of do block. LVI info for %i is Range[0,1)
+; at beginning of cont Block, which is incorrect at the beginning of do block.
+define i32 @test3(i32 %i, i1 %f, i32 %n) {
+; CHECK-LABEL: LVI for function 'test3':
+; CHECK-LABEL: entry
+; CHECK: ; LatticeVal for: 'i32 %i' is: overdefined
+; CHECK: %c = icmp ne i32 %i, -2134
+; CHECK: br i1 %c, label %cont, label %exit
+entry:
+ %c = icmp ne i32 %i, -2134
+ br i1 %c, label %do, label %exit
+
+exit:
+ %c1 = icmp ne i32 %i, -42
+ br i1 %c1, label %exit2, label %exit
+
+; CHECK-LABEL: cont:
+; Here cont is merged to do and i is any value except -2134.
+; i is not the single value: zero.
+; CHECK-NOT: ; LatticeVal for: 'i32 %i' is: constantrange<0, 1>
+; CHECK: ; LatticeVal for: 'i32 %i' is: constantrange<-2133, -2134>
+; CHECK: ; LatticeVal for: ' %cond.0 = icmp sgt i32 %i, 0' in BB: '%cont' is: overdefined
+; CHECK: %cond.0 = icmp sgt i32 %i, 0
+; CHECK: %consume = call i32 @consume
+; CHECK: %cond = icmp eq i32 %i, 0
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond)
+; CHECK: %cond.3 = icmp sgt i32 %i, %n
+; CHECK: br i1 %cond.3, label %exit2, label %exit
+cont:
+ %cond.3 = icmp sgt i32 %i, %n
+ br i1 %cond.3, label %exit2, label %exit
+
+do:
+ %cond.0 = icmp sgt i32 %i, 0
+ %consume = call i32 @consume(i1 %cond.0)
+ %cond = icmp eq i32 %i, 0
+ call void (i1, ...) @llvm.experimental.guard(i1 %cond) [ "deopt"() ]
+ %cond.2 = icmp sgt i32 %i, 0
+ br i1 %cond.2, label %exit, label %cont
+
+exit2:
+; CHECK-LABEL: exit2:
+; LatticeVal for: 'i32 %i' is: constantrange<-2134, 1>
+ ret i32 30
+}
+
+; FIXME: We should be able to merge cont into do.
+; When we do so, LVI for cont cannot be the one for the merged do block.
+define i32 @test4(i32 %i, i1 %f, i32 %n) {
+; CHECK-LABEL: LVI for function 'test4':
+entry:
+ %c = icmp ne i32 %i, -2134
+ br i1 %c, label %do, label %exit
+
+exit: ; preds = %do, %cont, %exit, %entry
+ %c1 = icmp ne i32 %i, -42
+ br i1 %c1, label %exit2, label %exit
+
+cont: ; preds = %do
+; CHECK-LABEL: cont:
+; CHECK: ; LatticeVal for: 'i1 %f' is: constantrange<-1, 0>
+; CHECK: call void @dummy(i1 %f)
+ call void @dummy(i1 %f)
+ br label %exit2
+
+do: ; preds = %entry
+; CHECK-LABEL: do:
+; CHECK: ; LatticeVal for: 'i1 %f' is: overdefined
+; CHECK: call void @dummy(i1 %f)
+; CHECK: br i1 %cond, label %exit, label %cont
+ call void @dummy(i1 %f)
+ %consume = call i32 @exit()
+ call void @llvm.assume(i1 %f)
+ %cond = icmp eq i1 %f, false
+ br i1 %cond, label %exit, label %cont
+
+exit2: ; preds = %cont, %exit
+ ret i32 30
+}
+
+declare i32 @exit()
+declare i32 @consume(i1)
+declare void @llvm.assume(i1) nounwind
+declare void @dummy(i1) nounwind
+declare void @llvm.experimental.guard(i1, ...)