Skip to content

Commit

Permalink
[ConstraintElimination] Add missing dominance check.
Browse files Browse the repository at this point in the history
When dealing with an unconditional branch, the condition can only added
if BB properly dominates the successor.
  • Loading branch information
fhahn committed Mar 16, 2022
1 parent fb8d23b commit 470a975
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
Expand Up @@ -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; }) &&
Expand Down
58 changes: 57 additions & 1 deletion llvm/test/Transforms/ConstraintElimination/assumes.ll
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 470a975

Please sign in to comment.