Skip to content

Commit dd1ec86

Browse files
committed
[ConstraintElimination] Add more assume tests.
1 parent 6ffc695 commit dd1ec86

File tree

1 file changed

+217
-1
lines changed
  • llvm/test/Transforms/ConstraintElimination

1 file changed

+217
-1
lines changed

llvm/test/Transforms/ConstraintElimination/assumes.ll

Lines changed: 217 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,129 @@ else:
5454
ret i1 %res.4
5555
}
5656

57+
define i1 @assume_dominates_with_may_unwind_call_before_assume(i8 %a, i8 %b, i1 %c) {
58+
; CHECK-LABEL: @assume_dominates_with_may_unwind_call_before_assume(
59+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
60+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
61+
; CHECK-NEXT: call void @may_unwind()
62+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
63+
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
64+
; CHECK: then:
65+
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
66+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
67+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
68+
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
69+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
70+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
71+
; CHECK-NEXT: ret i1 [[RES_2]]
72+
; CHECK: else:
73+
; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
74+
; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[A]], [[B]]
75+
; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_3]], [[T_4]]
76+
; CHECK-NEXT: [[ADD_2_1:%.*]] = add nuw nsw i8 [[A]], 2
77+
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2_1]], [[B]]
78+
; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_2]]
79+
; CHECK-NEXT: ret i1 [[RES_4]]
80+
;
81+
%add.1 = add nsw nuw i8 %a, 1
82+
%cmp.1 = icmp ule i8 %add.1, %b
83+
call void @may_unwind()
84+
call void @llvm.assume(i1 %cmp.1)
85+
br i1 %c, label %then, label %else
86+
87+
then:
88+
%t.1 = icmp ule i8 %add.1, %b
89+
%t.2 = icmp ule i8 %a, %b
90+
%res.1 = xor i1 %t.1, %t.2
91+
%add.2 = add nsw nuw i8 %a, 2
92+
%c.1 = icmp ule i8 %add.2, %b
93+
%res.2 = xor i1 %res.1, %c.1
94+
ret i1 %res.2
95+
96+
else:
97+
%t.3 = icmp ule i8 %add.1, %b
98+
%t.4 = icmp ule i8 %a, %b
99+
%res.3 = xor i1 %t.3, %t.4
100+
%add.2.1 = add nsw nuw i8 %a, 2
101+
%c.2 = icmp ule i8 %add.2.1, %b
102+
%res.4 = xor i1 %res.3, %c.2
103+
ret i1 %res.4
104+
}
105+
106+
define i1 @assume_dominates_with_may_unwind_call_after_assume(i8 %a, i8 %b, i1 %c) {
107+
; CHECK-LABEL: @assume_dominates_with_may_unwind_call_after_assume(
108+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
109+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
110+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
111+
; CHECK-NEXT: call void @may_unwind()
112+
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
113+
; CHECK: then:
114+
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
115+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
116+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
117+
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
118+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
119+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
120+
; CHECK-NEXT: ret i1 [[RES_2]]
121+
; CHECK: else:
122+
; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
123+
; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[A]], [[B]]
124+
; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_3]], [[T_4]]
125+
; CHECK-NEXT: [[ADD_2_1:%.*]] = add nuw nsw i8 [[A]], 2
126+
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2_1]], [[B]]
127+
; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_2]]
128+
; CHECK-NEXT: ret i1 [[RES_4]]
129+
;
130+
%add.1 = add nsw nuw i8 %a, 1
131+
%cmp.1 = icmp ule i8 %add.1, %b
132+
call void @llvm.assume(i1 %cmp.1)
133+
call void @may_unwind()
134+
br i1 %c, label %then, label %else
135+
136+
then:
137+
%t.1 = icmp ule i8 %add.1, %b
138+
%t.2 = icmp ule i8 %a, %b
139+
%res.1 = xor i1 %t.1, %t.2
140+
%add.2 = add nsw nuw i8 %a, 2
141+
%c.1 = icmp ule i8 %add.2, %b
142+
%res.2 = xor i1 %res.1, %c.1
143+
ret i1 %res.2
144+
145+
else:
146+
%t.3 = icmp ule i8 %add.1, %b
147+
%t.4 = icmp ule i8 %a, %b
148+
%res.3 = xor i1 %t.3, %t.4
149+
%add.2.1 = add nsw nuw i8 %a, 2
150+
%c.2 = icmp ule i8 %add.2.1, %b
151+
%res.4 = xor i1 %res.3, %c.2
152+
ret i1 %res.4
153+
}
154+
155+
define i1 @assume_single_bb(i8 %a, i8 %b, i1 %c) {
156+
; CHECK-LABEL: @assume_single_bb(
157+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
158+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
159+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
160+
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
161+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
162+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
163+
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
164+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
165+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
166+
; CHECK-NEXT: ret i1 [[RES_2]]
167+
;
168+
%add.1 = add nsw nuw i8 %a, 1
169+
%cmp.1 = icmp ule i8 %add.1, %b
170+
call void @llvm.assume(i1 %cmp.1)
171+
%t.1 = icmp ule i8 %add.1, %b
172+
%t.2 = icmp ule i8 %a, %b
173+
%res.1 = xor i1 %t.1, %t.2
174+
%add.2 = add nsw nuw i8 %a, 2
175+
%c.1 = icmp ule i8 %add.2, %b
176+
%res.2 = xor i1 %res.1, %c.1
177+
ret i1 %res.2
178+
}
179+
57180
define i1 @assume_same_bb(i8 %a, i8 %b, i1 %c) {
58181
; CHECK-LABEL: @assume_same_bb(
59182
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
@@ -101,7 +224,6 @@ else:
101224
ret i1 %res.4
102225
}
103226

104-
105227
define i1 @assume_same_bb2(i8 %a, i8 %b, i1 %c) {
106228
; CHECK-LABEL: @assume_same_bb2(
107229
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
@@ -270,3 +392,97 @@ define i1 @assume_same_bb_after_condition_may_unwind_between(i8 %a, i8 %b, i1 %c
270392
exit:
271393
ret i1 %res.2
272394
}
395+
396+
; The information of from the assume can be used to simplify %t.2.
397+
define i1 @assume_single_bb_conditions_after_assume(i8 %a, i8 %b, i1 %c) {
398+
; CHECK-LABEL: @assume_single_bb_conditions_after_assume(
399+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
400+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
401+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
402+
; CHECK-NEXT: call void @use(i1 [[C_1]])
403+
; CHECK-NEXT: call void @may_unwind()
404+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
405+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
406+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[T_2]]
407+
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
408+
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
409+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
410+
; CHECK-NEXT: ret i1 [[RES_2]]
411+
;
412+
%add.1 = add nsw nuw i8 %a, 1
413+
%cmp.1 = icmp ule i8 %add.1, %b
414+
%c.1 = icmp ule i8 %add.1, %b
415+
call void @use(i1 %c.1)
416+
417+
call void @may_unwind()
418+
call void @llvm.assume(i1 %cmp.1)
419+
%t.2 = icmp ule i8 %a, %b
420+
%res.1 = xor i1 %c.1, %t.2
421+
%add.2 = add nsw nuw i8 %a, 2
422+
%c.2 = icmp ule i8 %add.2, %b
423+
%res.2 = xor i1 %res.1, %c.2
424+
ret i1 %res.2
425+
}
426+
427+
; The information of from the assume can be used to simplify %t.2.
428+
define i1 @assume_single_bb_assume_at_end_after_may_unwind(i8 %a, i8 %b, i1 %c) {
429+
; CHECK-LABEL: @assume_single_bb_assume_at_end_after_may_unwind(
430+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
431+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
432+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
433+
; CHECK-NEXT: call void @use(i1 [[C_1]])
434+
; CHECK-NEXT: call void @may_unwind()
435+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
436+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[T_2]]
437+
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
438+
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
439+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
440+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
441+
; CHECK-NEXT: ret i1 [[RES_2]]
442+
;
443+
%add.1 = add nsw nuw i8 %a, 1
444+
%cmp.1 = icmp ule i8 %add.1, %b
445+
%c.1 = icmp ule i8 %add.1, %b
446+
call void @use(i1 %c.1)
447+
448+
call void @may_unwind()
449+
%t.2 = icmp ule i8 %a, %b
450+
%res.1 = xor i1 %c.1, %t.2
451+
%add.2 = add nsw nuw i8 %a, 2
452+
%c.2 = icmp ule i8 %add.2, %b
453+
%res.2 = xor i1 %res.1, %c.2
454+
call void @llvm.assume(i1 %cmp.1)
455+
ret i1 %res.2
456+
}
457+
458+
; The definition of %t.2 is before the @llvm.assume call, but all uses are
459+
; after the call. %t.2 can be simplified.
460+
define i1 @all_uses_after_assume(i8 %a, i8 %b, i1 %c) {
461+
; CHECK-LABEL: @all_uses_after_assume(
462+
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
463+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
464+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
465+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
466+
; CHECK-NEXT: call void @use(i1 [[C_1]])
467+
; CHECK-NEXT: call void @may_unwind()
468+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
469+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[T_2]]
470+
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
471+
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
472+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
473+
; CHECK-NEXT: ret i1 [[RES_2]]
474+
;
475+
%add.1 = add nsw nuw i8 %a, 1
476+
%cmp.1 = icmp ule i8 %add.1, %b
477+
%c.1 = icmp ule i8 %add.1, %b
478+
%t.2 = icmp ule i8 %a, %b
479+
call void @use(i1 %c.1)
480+
481+
call void @may_unwind()
482+
call void @llvm.assume(i1 %cmp.1)
483+
%res.1 = xor i1 %c.1, %t.2
484+
%add.2 = add nsw nuw i8 %a, 2
485+
%c.2 = icmp ule i8 %add.2, %b
486+
%res.2 = xor i1 %res.1, %c.2
487+
ret i1 %res.2
488+
}

0 commit comments

Comments
 (0)