Skip to content

Commit 470a975

Browse files
committed
[ConstraintElimination] Add missing dominance check.
When dealing with an unconditional branch, the condition can only added if BB properly dominates the successor.
1 parent fb8d23b commit 470a975

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT) {
421421
auto CanAdd = [&BB, &DT](BasicBlock *Succ) {
422422
if (BB.getSingleSuccessor()) {
423423
assert(BB.getSingleSuccessor() == Succ);
424-
return true;
424+
return DT.properlyDominates(&BB, Succ);
425425
}
426426
return any_of(successors(&BB),
427427
[Succ](const BasicBlock *S) { return S != Succ; }) &&

llvm/test/Transforms/ConstraintElimination/assumes.ll

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ define i1 @assume_does_not_dominates_successor_with_may_unwind_call_before_assum
164164
; CHECK-NEXT: br label [[EXIT]]
165165
; CHECK: exit:
166166
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[A]], 0
167-
; CHECK-NEXT: ret i1 true
167+
; CHECK-NEXT: ret i1 [[C_2]]
168168
;
169169
entry:
170170
br i1 %i.0, label %exit, label %if.then
@@ -202,6 +202,62 @@ exit:
202202
ret i1 %c.2
203203
}
204204

205+
define i1 @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_2(i16 %a, i1 %c) {
206+
; CHECK-LABEL: @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_2(
207+
; CHECK-NEXT: entry:
208+
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
209+
; CHECK: then:
210+
; CHECK-NEXT: call void @may_unwind()
211+
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i16 [[A:%.*]], 0
212+
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
213+
; CHECK-NEXT: br label [[EXIT]]
214+
; CHECK: exit:
215+
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[A]], 0
216+
; CHECK-NEXT: ret i1 [[C_2]]
217+
;
218+
entry:
219+
br i1 %c, label %then, label %exit
220+
221+
then:
222+
call void @may_unwind()
223+
%c.1 = icmp eq i16 %a, 0
224+
call void @llvm.assume(i1 %c.1)
225+
br label %exit
226+
227+
exit:
228+
%c.2 = icmp eq i16 %a, 0
229+
ret i1 %c.2
230+
}
231+
232+
define i1 @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_cycle(i16 %a, i1 %c) {
233+
; CHECK-LABEL: @assume_dominates_successor_with_may_unwind_call_before_assume_uncond_branch_cycle(
234+
; CHECK-NEXT: entry:
235+
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]
236+
; CHECK: then:
237+
; CHECK-NEXT: call void @may_unwind()
238+
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i16 [[A:%.*]], 0
239+
; CHECK-NEXT: call void @use(i1 [[C_1]])
240+
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
241+
; CHECK-NEXT: br label [[THEN]]
242+
; CHECK: exit:
243+
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[A]], 0
244+
; CHECK-NEXT: ret i1 [[C_2]]
245+
;
246+
entry:
247+
br i1 %c, label %then, label %exit
248+
249+
then:
250+
call void @may_unwind()
251+
%c.1 = icmp eq i16 %a, 0
252+
call void @use(i1 %c.1)
253+
call void @llvm.assume(i1 %c.1)
254+
br label %then
255+
256+
exit:
257+
%c.2 = icmp eq i16 %a, 0
258+
ret i1 %c.2
259+
}
260+
205261
define i1 @assume_single_bb(i8 %a, i8 %b, i1 %c) {
206262
; CHECK-LABEL: @assume_single_bb(
207263
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1

0 commit comments

Comments
 (0)