Skip to content

Commit d1e1a40

Browse files
committed
[ConstraintElimination] Add test for #48253.
Test from #48253.
1 parent f0f70ae commit d1e1a40

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed

llvm/test/Transforms/ConstraintElimination/wrapping-math.ll

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,203 @@ else:
7171
%c.2 = icmp eq i8 %sub.2, 0
7272
ret i1 %c.2
7373
}
74+
75+
; Test from https://github.com/llvm/llvm-project/issues/48253.
76+
define i1 @test_48253_eq_ne(i8 %a, i8 %b) {
77+
; CHECK-LABEL: @test_48253_eq_ne(
78+
; CHECK-NEXT: entry:
79+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp ne i8 [[A:%.*]], [[B:%.*]]
80+
; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i8 [[B]], 0
81+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_1]], [[CMP_2]]
82+
; CHECK-NEXT: br i1 [[OR]], label [[EXIT_1:%.*]], label [[IF_END:%.*]]
83+
; CHECK: if.end:
84+
; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[B]], -1
85+
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[SUB_1]], [[A]]
86+
; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[B]], -2
87+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[SUB_2]], [[A]]
88+
; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 [[T_1]], [[C_2]]
89+
; CHECK-NEXT: ret i1 [[XOR_1]]
90+
; CHECK: exit.1:
91+
; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[B]], -1
92+
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[SUB_3]], [[A]]
93+
; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[B]], -2
94+
; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[SUB_4]], [[A]]
95+
; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[C_3]], [[C_4]]
96+
; CHECK-NEXT: ret i1 [[XOR_2]]
97+
;
98+
entry:
99+
%cmp.1 = icmp ne i8 %a, %b
100+
%cmp.2 = icmp eq i8 %b, 0
101+
%or = or i1 %cmp.1, %cmp.2
102+
br i1 %or, label %exit.1, label %if.end
103+
104+
if.end:
105+
%sub.1 = add i8 %b, -1
106+
%t.1 = icmp ult i8 %sub.1, %a
107+
%sub.2 = add i8 %b, -2
108+
%c.2 = icmp ult i8 %sub.2, %a
109+
%xor.1 = xor i1 %t.1, %c.2
110+
ret i1 %xor.1
111+
112+
exit.1:
113+
%sub.3 = add i8 %b, -1
114+
%c.3 = icmp ult i8 %sub.3, %a
115+
%sub.4 = add i8 %b, -2
116+
%c.4 = icmp ult i8 %sub.4, %a
117+
%xor.2 = xor i1 %c.3, %c.4
118+
ret i1 %xor.2
119+
}
120+
121+
define i1 @test_ult(i8 %a, i8 %b) {
122+
; CHECK-LABEL: @test_ult(
123+
; CHECK-NEXT: entry:
124+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp uge i8 [[A:%.*]], 20
125+
; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i8 [[A]], [[B:%.*]]
126+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
127+
; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1
128+
; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -2
129+
; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[A]], -20
130+
; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[A]], 21
131+
; CHECK-NEXT: [[ADD_1:%.*]] = add i8 [[A]], 1
132+
; CHECK-NEXT: br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]]
133+
; CHECK: if.end:
134+
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[SUB_1]], [[B]]
135+
; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[SUB_2]], [[B]]
136+
; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 [[T_1]], [[T_2]]
137+
; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8 [[SUB_3]], [[B]]
138+
; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], [[T_3]]
139+
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[SUB_4]], [[B]]
140+
; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]]
141+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[ADD_1]], [[B]]
142+
; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]]
143+
; CHECK-NEXT: ret i1 [[XOR_4]]
144+
; CHECK: exit.1:
145+
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[SUB_1]], [[B]]
146+
; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[SUB_2]], [[B]]
147+
; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]]
148+
; CHECK-NEXT: [[C_5:%.*]] = icmp ult i8 [[SUB_3]], [[B]]
149+
; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]]
150+
; CHECK-NEXT: [[C_6:%.*]] = icmp ult i8 [[SUB_4]], [[B]]
151+
; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]]
152+
; CHECK-NEXT: [[C_7:%.*]] = icmp ult i8 [[ADD_1]], [[B]]
153+
; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]]
154+
; CHECK-NEXT: ret i1 [[XOR_8]]
155+
;
156+
entry:
157+
%cmp.1 = icmp uge i8 %a, 20
158+
%cmp.2 = icmp ult i8 %a, %b
159+
%and = and i1 %cmp.1, %cmp.2
160+
%sub.1 = add i8 %a, -1
161+
%sub.2 = add i8 %a, -2
162+
%sub.3 = add i8 %a, -20
163+
%sub.4 = add i8 %a, 21
164+
%add.1 = add i8 %a, 1
165+
br i1 %and, label %if.end, label %exit.1
166+
167+
if.end:
168+
%t.1 = icmp ult i8 %sub.1, %b
169+
%t.2 = icmp ult i8 %sub.2, %b
170+
%xor.1 = xor i1 %t.1, %t.2
171+
172+
%t.3 = icmp ult i8 %sub.3, %b
173+
%xor.2 = xor i1 %xor.1, %t.3
174+
175+
%c.1 = icmp ult i8 %sub.4, %b
176+
%xor.3 = xor i1 %xor.2, %c.1
177+
178+
%c.2 = icmp ult i8 %add.1, %b
179+
%xor.4 = xor i1 %xor.3, %c.2
180+
ret i1 %xor.4
181+
182+
exit.1:
183+
%c.3 = icmp ult i8 %sub.1, %b
184+
%c.4 = icmp ult i8 %sub.2, %b
185+
%xor.5 = xor i1 %c.3, %c.4
186+
187+
%c.5 = icmp ult i8 %sub.3, %b
188+
%xor.6 = xor i1 %xor.5, %c.5
189+
190+
%c.6 = icmp ult i8 %sub.4, %b
191+
%xor.7 = xor i1 %xor.6, %c.6
192+
193+
%c.7 = icmp ult i8 %add.1, %b
194+
%xor.8 = xor i1 %xor.7, %c.7
195+
ret i1 %xor.8
196+
}
197+
198+
define i1 @test_slt(i8 %a, i8 %b) {
199+
; CHECK-LABEL: @test_slt(
200+
; CHECK-NEXT: entry:
201+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp sge i8 [[A:%.*]], 20
202+
; CHECK-NEXT: [[CMP_2:%.*]] = icmp slt i8 [[A]], [[B:%.*]]
203+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
204+
; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1
205+
; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -2
206+
; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[A]], -20
207+
; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[A]], 21
208+
; CHECK-NEXT: [[ADD_1:%.*]] = add i8 [[A]], 1
209+
; CHECK-NEXT: br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]]
210+
; CHECK: if.end:
211+
; CHECK-NEXT: [[T_1:%.*]] = icmp slt i8 [[SUB_1]], [[B]]
212+
; CHECK-NEXT: [[T_2:%.*]] = icmp slt i8 [[SUB_2]], [[B]]
213+
; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 [[T_1]], [[T_2]]
214+
; CHECK-NEXT: [[T_3:%.*]] = icmp slt i8 [[SUB_3]], [[B]]
215+
; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], [[T_3]]
216+
; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[SUB_4]], [[B]]
217+
; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]]
218+
; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[ADD_1]], [[B]]
219+
; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]]
220+
; CHECK-NEXT: ret i1 [[XOR_4]]
221+
; CHECK: exit.1:
222+
; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[SUB_1]], [[B]]
223+
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[SUB_2]], [[B]]
224+
; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]]
225+
; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[SUB_3]], [[B]]
226+
; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]]
227+
; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[SUB_4]], [[B]]
228+
; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]]
229+
; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ADD_1]], [[B]]
230+
; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]]
231+
; CHECK-NEXT: ret i1 [[XOR_8]]
232+
;
233+
entry:
234+
%cmp.1 = icmp sge i8 %a, 20
235+
%cmp.2 = icmp slt i8 %a, %b
236+
%and = and i1 %cmp.1, %cmp.2
237+
%sub.1 = add i8 %a, -1
238+
%sub.2 = add i8 %a, -2
239+
%sub.3 = add i8 %a, -20
240+
%sub.4 = add i8 %a, 21
241+
%add.1 = add i8 %a, 1
242+
br i1 %and, label %if.end, label %exit.1
243+
244+
if.end:
245+
%t.1 = icmp slt i8 %sub.1, %b
246+
%t.2 = icmp slt i8 %sub.2, %b
247+
%xor.1 = xor i1 %t.1, %t.2
248+
249+
%t.3 = icmp slt i8 %sub.3, %b
250+
%xor.2 = xor i1 %xor.1, %t.3
251+
252+
%c.1 = icmp slt i8 %sub.4, %b
253+
%xor.3 = xor i1 %xor.2, %c.1
254+
255+
%c.2 = icmp slt i8 %add.1, %b
256+
%xor.4 = xor i1 %xor.3, %c.2
257+
ret i1 %xor.4
258+
259+
exit.1:
260+
%c.3 = icmp slt i8 %sub.1, %b
261+
%c.4 = icmp slt i8 %sub.2, %b
262+
%xor.5 = xor i1 %c.3, %c.4
263+
264+
%c.5 = icmp slt i8 %sub.3, %b
265+
%xor.6 = xor i1 %xor.5, %c.5
266+
267+
%c.6 = icmp slt i8 %sub.4, %b
268+
%xor.7 = xor i1 %xor.6, %c.6
269+
270+
%c.7 = icmp slt i8 %add.1, %b
271+
%xor.8 = xor i1 %xor.7, %c.7
272+
ret i1 %xor.8
273+
}

0 commit comments

Comments
 (0)