[llvm] 470a975 - [ConstraintElimination] Add missing dominance check.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 16 13:01:39 PDT 2022
Author: Florian Hahn
Date: 2022-03-16T20:01:24Z
New Revision: 470a975c84f435303823a302871de4dfe72c5b10
URL: https://github.com/llvm/llvm-project/commit/470a975c84f435303823a302871de4dfe72c5b10
DIFF: https://github.com/llvm/llvm-project/commit/470a975c84f435303823a302871de4dfe72c5b10.diff
LOG: [ConstraintElimination] Add missing dominance check.
When dealing with an unconditional branch, the condition can only added
if BB properly dominates the successor.
Added:
Modified:
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
llvm/test/Transforms/ConstraintElimination/assumes.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 733b83465a922..acf2d4da360dc 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -421,7 +421,7 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT) {
auto CanAdd = [&BB, &DT](BasicBlock *Succ) {
if (BB.getSingleSuccessor()) {
assert(BB.getSingleSuccessor() == Succ);
- return true;
+ return DT.properlyDominates(&BB, Succ);
}
return any_of(successors(&BB),
[Succ](const BasicBlock *S) { return S != Succ; }) &&
diff --git a/llvm/test/Transforms/ConstraintElimination/assumes.ll b/llvm/test/Transforms/ConstraintElimination/assumes.ll
index b7e1d2491c404..41a79b154f41e 100644
--- a/llvm/test/Transforms/ConstraintElimination/assumes.ll
+++ b/llvm/test/Transforms/ConstraintElimination/assumes.ll
@@ -164,7 +164,7 @@ define i1 @assume_does_not_dominates_successor_with_may_unwind_call_before_assum
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[A]], 0
-; CHECK-NEXT: ret i1 true
+; CHECK-NEXT: ret i1 [[C_2]]
;
entry:
br i1 %i.0, label %exit, label %if.then
@@ -202,6 +202,62 @@ exit:
ret i1 %c.2
}
+define i1 @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_2(i16 %a, i1 %c) {
+; CHECK-LABEL: @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
+; CHECK: then:
+; CHECK-NEXT: call void @may_unwind()
+; CHECK-NEXT: [[C_1:%.*]] = icmp eq i16 [[A:%.*]], 0
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
+; CHECK-NEXT: br label [[EXIT]]
+; CHECK: exit:
+; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[A]], 0
+; CHECK-NEXT: ret i1 [[C_2]]
+;
+entry:
+ br i1 %c, label %then, label %exit
+
+then:
+ call void @may_unwind()
+ %c.1 = icmp eq i16 %a, 0
+ call void @llvm.assume(i1 %c.1)
+ br label %exit
+
+exit:
+ %c.2 = icmp eq i16 %a, 0
+ ret i1 %c.2
+}
+
+define i1 @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_cycle(i16 %a, i1 %c) {
+; CHECK-LABEL: @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_cycle(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
+; CHECK: then:
+; CHECK-NEXT: call void @may_unwind()
+; CHECK-NEXT: [[C_1:%.*]] = icmp eq i16 [[A:%.*]], 0
+; CHECK-NEXT: call void @use(i1 [[C_1]])
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
+; CHECK-NEXT: br label [[THEN]]
+; CHECK: exit:
+; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[A]], 0
+; CHECK-NEXT: ret i1 [[C_2]]
+;
+entry:
+ br i1 %c, label %then, label %exit
+
+then:
+ call void @may_unwind()
+ %c.1 = icmp eq i16 %a, 0
+ call void @use(i1 %c.1)
+ call void @llvm.assume(i1 %c.1)
+ br label %then
+
+exit:
+ %c.2 = icmp eq i16 %a, 0
+ ret i1 %c.2
+}
+
define i1 @assume_single_bb(i8 %a, i8 %b, i1 %c) {
; CHECK-LABEL: @assume_single_bb(
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
More information about the llvm-commits
mailing list