[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