Skip to content

Commit e30c257

Browse files
committed
[CVP,SCCP] Precommit test for D75055.
Test case for PR44949.
1 parent 1b86ad2 commit e30c257

File tree

3 files changed

+739
-0
lines changed

3 files changed

+739
-0
lines changed
Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -correlated-propagation %s | FileCheck %s
3+
4+
; Test case for PR44949.
5+
6+
; We can remove `%res = and i64 %p, 255`, because %r = 0 and we can eliminate
7+
; %p as well.
8+
define i64 @constant_and_undef(i1 %c1, i64 %a) {
9+
; CHECK-LABEL: @constant_and_undef(
10+
; CHECK-NEXT: entry:
11+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
12+
; CHECK: bb1:
13+
; CHECK-NEXT: br label [[BB3:%.*]]
14+
; CHECK: bb2:
15+
; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 0
16+
; CHECK-NEXT: br label [[BB3]]
17+
; CHECK: bb3:
18+
; CHECK-NEXT: ret i64 0
19+
;
20+
entry:
21+
br i1 %c1, label %bb1, label %bb2
22+
23+
bb1:
24+
br label %bb3
25+
26+
bb2:
27+
%r = and i64 %a, 0
28+
br label %bb3
29+
30+
bb3:
31+
%p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ]
32+
%res = and i64 %p, 255
33+
ret i64 %res
34+
}
35+
36+
; Check that we go to overdefined when merging a constant range with undef. We
37+
; cannot remove '%res = and i64 %p, 255'.
38+
; FIXME: should not remove '%res = and i64 %p, 255'
39+
define i64 @constant_range_and_undef(i1 %cond, i64 %a) {
40+
; CHECK-LABEL: @constant_range_and_undef(
41+
; CHECK-NEXT: entry:
42+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
43+
; CHECK: bb1:
44+
; CHECK-NEXT: br label [[BB3:%.*]]
45+
; CHECK: bb2:
46+
; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255
47+
; CHECK-NEXT: br label [[BB3]]
48+
; CHECK: bb3:
49+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ [[R]], [[BB2]] ]
50+
; CHECK-NEXT: ret i64 [[P]]
51+
;
52+
entry:
53+
br i1 %cond, label %bb1, label %bb2
54+
55+
bb1:
56+
br label %bb3
57+
58+
bb2:
59+
%r = and i64 %a, 255
60+
br label %bb3
61+
62+
bb3:
63+
%p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ]
64+
%res = and i64 %p, 255
65+
ret i64 %res
66+
}
67+
68+
define i64 @constant_range_and_undef2(i1 %c1, i1 %c2, i64 %a) {
69+
; CHECK-LABEL: @constant_range_and_undef2(
70+
; CHECK-NEXT: entry:
71+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
72+
; CHECK: bb1:
73+
; CHECK-NEXT: [[V1:%.*]] = add nuw nsw i64 undef, undef
74+
; CHECK-NEXT: br label [[BB3:%.*]]
75+
; CHECK: bb2:
76+
; CHECK-NEXT: [[V2:%.*]] = and i64 [[A:%.*]], 255
77+
; CHECK-NEXT: br label [[BB3]]
78+
; CHECK: bb3:
79+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[V1]], [[BB1]] ], [ [[V2]], [[BB2]] ]
80+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB4:%.*]], label [[BB5:%.*]]
81+
; CHECK: bb4:
82+
; CHECK-NEXT: br label [[BB6:%.*]]
83+
; CHECK: bb5:
84+
; CHECK-NEXT: [[V3:%.*]] = and i64 [[A]], 255
85+
; CHECK-NEXT: br label [[BB6]]
86+
; CHECK: bb6:
87+
; CHECK-NEXT: [[P2:%.*]] = phi i64 [ [[P]], [[BB4]] ], [ [[V3]], [[BB5]] ]
88+
; CHECK-NEXT: [[RES:%.*]] = and i64 [[P2]], 255
89+
; CHECK-NEXT: ret i64 [[RES]]
90+
;
91+
entry:
92+
br i1 %c1, label %bb1, label %bb2
93+
94+
bb1:
95+
%v1 = add i64 undef, undef
96+
br label %bb3
97+
98+
bb2:
99+
%v2 = and i64 %a, 255
100+
br label %bb3
101+
102+
bb3:
103+
%p = phi i64 [ %v1, %bb1 ], [ %v2, %bb2 ]
104+
br i1 %c2, label %bb4, label %bb5
105+
106+
bb4:
107+
br label %bb6
108+
109+
bb5:
110+
%v3 = and i64 %a, 255
111+
br label %bb6
112+
113+
bb6:
114+
%p2 = phi i64 [ %p, %bb4 ], [ %v3, %bb5 ]
115+
%res = and i64 %p2, 255
116+
ret i64 %res
117+
}
118+
119+
define i1 @constant_range_and_undef_3(i1 %cond, i64 %a) {
120+
; CHECK-LABEL: @constant_range_and_undef_3(
121+
; CHECK-NEXT: entry:
122+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
123+
; CHECK: bb1:
124+
; CHECK-NEXT: br label [[BB3:%.*]]
125+
; CHECK: bb2:
126+
; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255
127+
; CHECK-NEXT: br label [[BB3]]
128+
; CHECK: bb3:
129+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ [[R]], [[BB2]] ]
130+
; CHECK-NEXT: [[C:%.*]] = icmp ult i64 [[P]], 256
131+
; CHECK-NEXT: ret i1 [[C]]
132+
;
133+
entry:
134+
br i1 %cond, label %bb1, label %bb2
135+
136+
bb1:
137+
br label %bb3
138+
139+
bb2:
140+
%r = and i64 %a, 255
141+
br label %bb3
142+
143+
bb3:
144+
%p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ]
145+
%c = icmp ult i64 %p, 256
146+
ret i1 %c
147+
}
148+
149+
; Same as @constant_range_and_undef, but with 3 incoming
150+
; values: undef, a constant and a constant range.
151+
define i64 @constant_range_and_undef_3_incoming_v1(i1 %c1, i1 %c2, i64 %a) {
152+
; CHECK-LABEL: @constant_range_and_undef_3_incoming_v1(
153+
; CHECK-NEXT: entry:
154+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
155+
; CHECK: bb1:
156+
; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255
157+
; CHECK-NEXT: br label [[BB4:%.*]]
158+
; CHECK: bb2:
159+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]]
160+
; CHECK: bb3:
161+
; CHECK-NEXT: br label [[BB4]]
162+
; CHECK: bb4:
163+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ 10, [[BB2]] ], [ undef, [[BB3]] ]
164+
; CHECK-NEXT: ret i64 [[P]]
165+
;
166+
entry:
167+
br i1 %c1, label %bb1, label %bb2
168+
169+
bb1:
170+
%r = and i64 %a, 255
171+
br label %bb4
172+
173+
bb2:
174+
br i1 %c2, label %bb3, label %bb4
175+
176+
bb3:
177+
br label %bb4
178+
179+
bb4:
180+
%p = phi i64 [ %r, %bb1 ], [ 10, %bb2], [ undef, %bb3 ]
181+
%res = and i64 %p, 255
182+
ret i64 %res
183+
}
184+
185+
; Same as @constant_range_and_undef_3_incoming_v1, but with different order of
186+
; incoming values.
187+
define i64 @constant_range_and_undef_3_incoming_v2(i1 %c1, i1 %c2, i64 %a) {
188+
; CHECK-LABEL: @constant_range_and_undef_3_incoming_v2(
189+
; CHECK-NEXT: entry:
190+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
191+
; CHECK: bb1:
192+
; CHECK-NEXT: br label [[BB4:%.*]]
193+
; CHECK: bb2:
194+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]]
195+
; CHECK: bb3:
196+
; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255
197+
; CHECK-NEXT: br label [[BB4]]
198+
; CHECK: bb4:
199+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ 10, [[BB2]] ], [ [[R]], [[BB3]] ]
200+
; CHECK-NEXT: ret i64 [[P]]
201+
;
202+
entry:
203+
br i1 %c1, label %bb1, label %bb2
204+
205+
bb1:
206+
br label %bb4
207+
208+
bb2:
209+
br i1 %c2, label %bb3, label %bb4
210+
211+
bb3:
212+
%r = and i64 %a, 255
213+
br label %bb4
214+
215+
bb4:
216+
%p = phi i64 [ undef, %bb1 ], [ 10, %bb2], [ %r, %bb3 ]
217+
%res = and i64 %p, 255
218+
ret i64 %res
219+
}
220+
221+
; Same as @constant_range_and_undef_3_incoming_v1, but with different order of
222+
; incoming values.
223+
define i64 @constant_range_and_undef_3_incoming_v3(i1 %c1, i1 %c2, i64 %a) {
224+
; CHECK-LABEL: @constant_range_and_undef_3_incoming_v3(
225+
; CHECK-NEXT: entry:
226+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
227+
; CHECK: bb1:
228+
; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255
229+
; CHECK-NEXT: br label [[BB4:%.*]]
230+
; CHECK: bb2:
231+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]]
232+
; CHECK: bb3:
233+
; CHECK-NEXT: br label [[BB4]]
234+
; CHECK: bb4:
235+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ undef, [[BB2]] ], [ 10, [[BB3]] ]
236+
; CHECK-NEXT: ret i64 [[P]]
237+
;
238+
entry:
239+
br i1 %c1, label %bb1, label %bb2
240+
241+
bb1:
242+
%r = and i64 %a, 255
243+
br label %bb4
244+
245+
bb2:
246+
br i1 %c2, label %bb3, label %bb4
247+
248+
bb3:
249+
br label %bb4
250+
251+
bb4:
252+
%p = phi i64 [ %r, %bb1 ], [ undef, %bb2], [ 10, %bb3 ]
253+
%res = and i64 %p, 255
254+
ret i64 %res
255+
}
256+
257+
258+
define i64 @constant_range_and_phi_constant_undef(i1 %c1, i1 %c2, i64 %a) {
259+
; CHECK-LABEL: @constant_range_and_phi_constant_undef(
260+
; CHECK-NEXT: entry:
261+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
262+
; CHECK: bb1:
263+
; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255
264+
; CHECK-NEXT: br label [[BB5:%.*]]
265+
; CHECK: bb2:
266+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4:%.*]]
267+
; CHECK: bb3:
268+
; CHECK-NEXT: br label [[BB4]]
269+
; CHECK: bb4:
270+
; CHECK-NEXT: br label [[BB5]]
271+
; CHECK: bb5:
272+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ 10, [[BB4]] ]
273+
; CHECK-NEXT: ret i64 [[P]]
274+
;
275+
entry:
276+
br i1 %c1, label %bb1, label %bb2
277+
278+
bb1:
279+
%r = and i64 %a, 255
280+
br label %bb5
281+
282+
bb2:
283+
br i1 %c2, label %bb3, label %bb4
284+
285+
bb3:
286+
br label %bb4
287+
288+
bb4:
289+
%p.1 = phi i64 [ 10, %bb2 ], [ undef, %bb3]
290+
br label %bb5
291+
292+
bb5:
293+
%p = phi i64 [ %r, %bb1 ], [ %p.1, %bb4]
294+
%res = and i64 %p, 255
295+
ret i64 %res
296+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -ipsccp %s | FileCheck %s
3+
4+
; Make sure IPSCCP does not assume %r < 256 for @f1. Undef is passed at a call
5+
; site, which won't be eliminated.
6+
7+
define i1 @constant_and_undef(i64 %a) {
8+
; CHECK-LABEL: @constant_and_undef(
9+
; CHECK-NEXT: [[C_1:%.*]] = call i1 @f1(i64 undef)
10+
; CHECK-NEXT: br label [[BB1:%.*]]
11+
; CHECK: bb1:
12+
; CHECK-NEXT: [[C_2:%.*]] = call i1 @f1(i64 10)
13+
; CHECK-NEXT: br label [[BB2:%.*]]
14+
; CHECK: bb2:
15+
; CHECK-NEXT: [[RANGE:%.*]] = and i64 [[A:%.*]], 255
16+
; CHECK-NEXT: [[C_3:%.*]] = call i1 @f1(i64 [[RANGE]])
17+
; CHECK-NEXT: [[R_1:%.*]] = and i1 [[C_1]], [[C_2]]
18+
; CHECK-NEXT: [[R_2:%.*]] = and i1 [[R_1]], [[C_3]]
19+
; CHECK-NEXT: ret i1 [[R_2]]
20+
;
21+
%c.1 = call i1 @f1(i64 undef)
22+
br label %bb1
23+
24+
bb1:
25+
%c.2 = call i1 @f1(i64 10)
26+
br label %bb2
27+
28+
bb2:
29+
%range = and i64 %a, 255
30+
%c.3 = call i1 @f1(i64 %range)
31+
%r.1 = and i1 %c.1, %c.2
32+
%r.2 = and i1 %r.1, %c.3
33+
ret i1 %r.2
34+
}
35+
36+
declare void @sideeffect(i1, i64 %a)
37+
38+
define internal i1 @f1(i64 %r) {
39+
; CHECK-LABEL: define {{.*}} @f1(
40+
; CHECK-NEXT: [[C:%.*]] = icmp ult i64 [[R:%.*]], 256
41+
; CHECK-NEXT: call void @sideeffect(i1 [[C]], i64 [[R]])
42+
; CHECK-NEXT: ret i1 [[C]]
43+
;
44+
%c = icmp ult i64 %r, 256
45+
call void @sideeffect(i1 %c, i64 %r)
46+
ret i1 %c
47+
}

0 commit comments

Comments
 (0)