Skip to content

Commit 9838c85

Browse files
committed
[RISCV] Copy typepromotion-overflow.ll from AArch64. NFC
1 parent 742a06f commit 9838c85

File tree

1 file changed

+388
-0
lines changed

1 file changed

+388
-0
lines changed
Lines changed: 388 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,388 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=riscv64 -mattr=+m %s -o - | FileCheck %s
3+
4+
define zeroext i16 @overflow_add(i16 zeroext %a, i16 zeroext %b) {
5+
; CHECK-LABEL: overflow_add:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: add a0, a1, a0
8+
; CHECK-NEXT: ori a0, a0, 1
9+
; CHECK-NEXT: slli a0, a0, 48
10+
; CHECK-NEXT: srli a1, a0, 48
11+
; CHECK-NEXT: li a2, 1024
12+
; CHECK-NEXT: li a0, 2
13+
; CHECK-NEXT: bltu a2, a1, .LBB0_2
14+
; CHECK-NEXT: # %bb.1:
15+
; CHECK-NEXT: li a0, 5
16+
; CHECK-NEXT: .LBB0_2:
17+
; CHECK-NEXT: ret
18+
%add = add i16 %b, %a
19+
%or = or i16 %add, 1
20+
%cmp = icmp ugt i16 %or, 1024
21+
%res = select i1 %cmp, i16 2, i16 5
22+
ret i16 %res
23+
}
24+
25+
define zeroext i16 @overflow_sub(i16 zeroext %a, i16 zeroext %b) {
26+
; CHECK-LABEL: overflow_sub:
27+
; CHECK: # %bb.0:
28+
; CHECK-NEXT: subw a0, a0, a1
29+
; CHECK-NEXT: ori a0, a0, 1
30+
; CHECK-NEXT: slli a0, a0, 48
31+
; CHECK-NEXT: srli a1, a0, 48
32+
; CHECK-NEXT: li a2, 1024
33+
; CHECK-NEXT: li a0, 2
34+
; CHECK-NEXT: bltu a2, a1, .LBB1_2
35+
; CHECK-NEXT: # %bb.1:
36+
; CHECK-NEXT: li a0, 5
37+
; CHECK-NEXT: .LBB1_2:
38+
; CHECK-NEXT: ret
39+
%add = sub i16 %a, %b
40+
%or = or i16 %add, 1
41+
%cmp = icmp ugt i16 %or, 1024
42+
%res = select i1 %cmp, i16 2, i16 5
43+
ret i16 %res
44+
}
45+
46+
define zeroext i16 @overflow_mul(i16 zeroext %a, i16 zeroext %b) {
47+
; CHECK-LABEL: overflow_mul:
48+
; CHECK: # %bb.0:
49+
; CHECK-NEXT: mul a0, a1, a0
50+
; CHECK-NEXT: ori a0, a0, 1
51+
; CHECK-NEXT: slli a0, a0, 48
52+
; CHECK-NEXT: srli a1, a0, 48
53+
; CHECK-NEXT: li a2, 1024
54+
; CHECK-NEXT: li a0, 2
55+
; CHECK-NEXT: bltu a2, a1, .LBB2_2
56+
; CHECK-NEXT: # %bb.1:
57+
; CHECK-NEXT: li a0, 5
58+
; CHECK-NEXT: .LBB2_2:
59+
; CHECK-NEXT: ret
60+
%add = mul i16 %b, %a
61+
%or = or i16 %add, 1
62+
%cmp = icmp ugt i16 %or, 1024
63+
%res = select i1 %cmp, i16 2, i16 5
64+
ret i16 %res
65+
}
66+
67+
define zeroext i16 @overflow_shl(i16 zeroext %a, i16 zeroext %b) {
68+
; CHECK-LABEL: overflow_shl:
69+
; CHECK: # %bb.0:
70+
; CHECK-NEXT: sll a0, a0, a1
71+
; CHECK-NEXT: ori a0, a0, 1
72+
; CHECK-NEXT: slli a0, a0, 48
73+
; CHECK-NEXT: srli a1, a0, 48
74+
; CHECK-NEXT: li a2, 1024
75+
; CHECK-NEXT: li a0, 2
76+
; CHECK-NEXT: bltu a2, a1, .LBB3_2
77+
; CHECK-NEXT: # %bb.1:
78+
; CHECK-NEXT: li a0, 5
79+
; CHECK-NEXT: .LBB3_2:
80+
; CHECK-NEXT: ret
81+
%add = shl i16 %a, %b
82+
%or = or i16 %add, 1
83+
%cmp = icmp ugt i16 %or, 1024
84+
%res = select i1 %cmp, i16 2, i16 5
85+
ret i16 %res
86+
}
87+
88+
define i32 @overflow_add_no_consts(i8 zeroext %a, i8 zeroext %b, i8 zeroext %limit) {
89+
; CHECK-LABEL: overflow_add_no_consts:
90+
; CHECK: # %bb.0:
91+
; CHECK-NEXT: add a0, a1, a0
92+
; CHECK-NEXT: andi a1, a0, 255
93+
; CHECK-NEXT: li a0, 8
94+
; CHECK-NEXT: bltu a2, a1, .LBB4_2
95+
; CHECK-NEXT: # %bb.1:
96+
; CHECK-NEXT: li a0, 16
97+
; CHECK-NEXT: .LBB4_2:
98+
; CHECK-NEXT: ret
99+
%add = add i8 %b, %a
100+
%cmp = icmp ugt i8 %add, %limit
101+
%res = select i1 %cmp, i32 8, i32 16
102+
ret i32 %res
103+
}
104+
105+
define i32 @overflow_add_const_limit(i8 zeroext %a, i8 zeroext %b) {
106+
; CHECK-LABEL: overflow_add_const_limit:
107+
; CHECK: # %bb.0:
108+
; CHECK-NEXT: add a0, a1, a0
109+
; CHECK-NEXT: andi a1, a0, 255
110+
; CHECK-NEXT: li a2, 128
111+
; CHECK-NEXT: li a0, 8
112+
; CHECK-NEXT: bltu a2, a1, .LBB5_2
113+
; CHECK-NEXT: # %bb.1:
114+
; CHECK-NEXT: li a0, 16
115+
; CHECK-NEXT: .LBB5_2:
116+
; CHECK-NEXT: ret
117+
%add = add i8 %b, %a
118+
%cmp = icmp ugt i8 %add, -128
119+
%res = select i1 %cmp, i32 8, i32 16
120+
ret i32 %res
121+
}
122+
123+
define i32 @overflow_add_positive_const_limit(i8 zeroext %a) {
124+
; CHECK-LABEL: overflow_add_positive_const_limit:
125+
; CHECK: # %bb.0:
126+
; CHECK-NEXT: slli a0, a0, 56
127+
; CHECK-NEXT: srai a1, a0, 56
128+
; CHECK-NEXT: li a2, -1
129+
; CHECK-NEXT: li a0, 8
130+
; CHECK-NEXT: blt a1, a2, .LBB6_2
131+
; CHECK-NEXT: # %bb.1:
132+
; CHECK-NEXT: li a0, 16
133+
; CHECK-NEXT: .LBB6_2:
134+
; CHECK-NEXT: ret
135+
%cmp = icmp slt i8 %a, -1
136+
%res = select i1 %cmp, i32 8, i32 16
137+
ret i32 %res
138+
}
139+
140+
define i32 @unsafe_add_underflow(i8 zeroext %a) {
141+
; CHECK-LABEL: unsafe_add_underflow:
142+
; CHECK: # %bb.0:
143+
; CHECK-NEXT: mv a1, a0
144+
; CHECK-NEXT: li a2, 1
145+
; CHECK-NEXT: li a0, 8
146+
; CHECK-NEXT: beq a1, a2, .LBB7_2
147+
; CHECK-NEXT: # %bb.1:
148+
; CHECK-NEXT: li a0, 16
149+
; CHECK-NEXT: .LBB7_2:
150+
; CHECK-NEXT: ret
151+
%cmp = icmp eq i8 %a, 1
152+
%res = select i1 %cmp, i32 8, i32 16
153+
ret i32 %res
154+
}
155+
156+
define i32 @safe_add_underflow(i8 zeroext %a) {
157+
; CHECK-LABEL: safe_add_underflow:
158+
; CHECK: # %bb.0:
159+
; CHECK-NEXT: mv a1, a0
160+
; CHECK-NEXT: li a0, 8
161+
; CHECK-NEXT: beqz a1, .LBB8_2
162+
; CHECK-NEXT: # %bb.1:
163+
; CHECK-NEXT: li a0, 16
164+
; CHECK-NEXT: .LBB8_2:
165+
; CHECK-NEXT: ret
166+
%cmp = icmp eq i8 %a, 0
167+
%res = select i1 %cmp, i32 8, i32 16
168+
ret i32 %res
169+
}
170+
171+
define i32 @safe_add_underflow_neg(i8 zeroext %a) {
172+
; CHECK-LABEL: safe_add_underflow_neg:
173+
; CHECK: # %bb.0:
174+
; CHECK-NEXT: addi a0, a0, -2
175+
; CHECK-NEXT: andi a1, a0, 255
176+
; CHECK-NEXT: li a2, 251
177+
; CHECK-NEXT: li a0, 8
178+
; CHECK-NEXT: bltu a1, a2, .LBB9_2
179+
; CHECK-NEXT: # %bb.1:
180+
; CHECK-NEXT: li a0, 16
181+
; CHECK-NEXT: .LBB9_2:
182+
; CHECK-NEXT: ret
183+
%add = add i8 %a, -2
184+
%cmp = icmp ult i8 %add, -5
185+
%res = select i1 %cmp, i32 8, i32 16
186+
ret i32 %res
187+
}
188+
189+
define i32 @overflow_sub_negative_const_limit(i8 zeroext %a) {
190+
; CHECK-LABEL: overflow_sub_negative_const_limit:
191+
; CHECK: # %bb.0:
192+
; CHECK-NEXT: slli a0, a0, 56
193+
; CHECK-NEXT: srai a1, a0, 56
194+
; CHECK-NEXT: li a2, -1
195+
; CHECK-NEXT: li a0, 8
196+
; CHECK-NEXT: blt a1, a2, .LBB10_2
197+
; CHECK-NEXT: # %bb.1:
198+
; CHECK-NEXT: li a0, 16
199+
; CHECK-NEXT: .LBB10_2:
200+
; CHECK-NEXT: ret
201+
%cmp = icmp slt i8 %a, -1
202+
%res = select i1 %cmp, i32 8, i32 16
203+
ret i32 %res
204+
}
205+
206+
; This is valid so long as the icmp immediate is sext.
207+
define i32 @sext_sub_underflow(i8 zeroext %a) {
208+
; CHECK-LABEL: sext_sub_underflow:
209+
; CHECK: # %bb.0:
210+
; CHECK-NEXT: addi a0, a0, -6
211+
; CHECK-NEXT: andi a1, a0, 255
212+
; CHECK-NEXT: li a2, 250
213+
; CHECK-NEXT: li a0, 8
214+
; CHECK-NEXT: bltu a2, a1, .LBB11_2
215+
; CHECK-NEXT: # %bb.1:
216+
; CHECK-NEXT: li a0, 16
217+
; CHECK-NEXT: .LBB11_2:
218+
; CHECK-NEXT: ret
219+
%sub = add i8 %a, -6
220+
%cmp = icmp ugt i8 %sub, -6
221+
%res = select i1 %cmp, i32 8, i32 16
222+
ret i32 %res
223+
}
224+
225+
define i32 @safe_sub_underflow(i8 zeroext %a) {
226+
; CHECK-LABEL: safe_sub_underflow:
227+
; CHECK: # %bb.0:
228+
; CHECK-NEXT: mv a1, a0
229+
; CHECK-NEXT: li a0, 16
230+
; CHECK-NEXT: beqz a1, .LBB12_2
231+
; CHECK-NEXT: # %bb.1:
232+
; CHECK-NEXT: li a0, 8
233+
; CHECK-NEXT: .LBB12_2:
234+
; CHECK-NEXT: ret
235+
%cmp.not = icmp eq i8 %a, 0
236+
%res = select i1 %cmp.not, i32 16, i32 8
237+
ret i32 %res
238+
}
239+
240+
define i32 @safe_sub_underflow_neg(i8 zeroext %a) {
241+
; CHECK-LABEL: safe_sub_underflow_neg:
242+
; CHECK: # %bb.0:
243+
; CHECK-NEXT: addi a0, a0, -4
244+
; CHECK-NEXT: andi a1, a0, 255
245+
; CHECK-NEXT: li a2, 250
246+
; CHECK-NEXT: li a0, 8
247+
; CHECK-NEXT: bltu a2, a1, .LBB13_2
248+
; CHECK-NEXT: # %bb.1:
249+
; CHECK-NEXT: li a0, 16
250+
; CHECK-NEXT: .LBB13_2:
251+
; CHECK-NEXT: ret
252+
%sub = add i8 %a, -4
253+
%cmp = icmp ugt i8 %sub, -6
254+
%res = select i1 %cmp, i32 8, i32 16
255+
ret i32 %res
256+
}
257+
258+
; This is valid so long as the icmp immediate is sext.
259+
define i32 @sext_sub_underflow_neg(i8 zeroext %a) {
260+
; CHECK-LABEL: sext_sub_underflow_neg:
261+
; CHECK: # %bb.0:
262+
; CHECK-NEXT: addi a0, a0, -4
263+
; CHECK-NEXT: andi a1, a0, 255
264+
; CHECK-NEXT: li a2, 253
265+
; CHECK-NEXT: li a0, 8
266+
; CHECK-NEXT: bltu a1, a2, .LBB14_2
267+
; CHECK-NEXT: # %bb.1:
268+
; CHECK-NEXT: li a0, 16
269+
; CHECK-NEXT: .LBB14_2:
270+
; CHECK-NEXT: ret
271+
%sub = add i8 %a, -4
272+
%cmp = icmp ult i8 %sub, -3
273+
%res = select i1 %cmp, i32 8, i32 16
274+
ret i32 %res
275+
}
276+
277+
define i32 @safe_sub_imm_var(ptr nocapture readonly %b) local_unnamed_addr #1 {
278+
; CHECK-LABEL: safe_sub_imm_var:
279+
; CHECK: # %bb.0: # %entry
280+
; CHECK-NEXT: li a0, 0
281+
; CHECK-NEXT: ret
282+
entry:
283+
ret i32 0
284+
}
285+
286+
define i32 @safe_sub_var_imm(ptr nocapture readonly %b) local_unnamed_addr #1 {
287+
; CHECK-LABEL: safe_sub_var_imm:
288+
; CHECK: # %bb.0: # %entry
289+
; CHECK-NEXT: lbu a0, 0(a0)
290+
; CHECK-NEXT: addi a0, a0, 8
291+
; CHECK-NEXT: andi a0, a0, 255
292+
; CHECK-NEXT: sltiu a0, a0, 253
293+
; CHECK-NEXT: xori a0, a0, 1
294+
; CHECK-NEXT: ret
295+
entry:
296+
%0 = load i8, ptr %b, align 1
297+
%sub = add nsw i8 %0, 8
298+
%cmp = icmp ugt i8 %sub, -4
299+
%conv4 = zext i1 %cmp to i32
300+
ret i32 %conv4
301+
}
302+
303+
define i32 @safe_add_imm_var(ptr nocapture readnone %b) {
304+
; CHECK-LABEL: safe_add_imm_var:
305+
; CHECK: # %bb.0: # %entry
306+
; CHECK-NEXT: li a0, 1
307+
; CHECK-NEXT: ret
308+
entry:
309+
ret i32 1
310+
}
311+
312+
define i32 @safe_add_var_imm(ptr nocapture readnone %b) {
313+
; CHECK-LABEL: safe_add_var_imm:
314+
; CHECK: # %bb.0: # %entry
315+
; CHECK-NEXT: li a0, 1
316+
; CHECK-NEXT: ret
317+
entry:
318+
ret i32 1
319+
}
320+
321+
define i8 @convert_add_order(i8 zeroext %arg) {
322+
; CHECK-LABEL: convert_add_order:
323+
; CHECK: # %bb.0:
324+
; CHECK-NEXT: ori a1, a0, 1
325+
; CHECK-NEXT: sltiu a2, a1, 50
326+
; CHECK-NEXT: addi a1, a1, -40
327+
; CHECK-NEXT: andi a1, a1, 255
328+
; CHECK-NEXT: sltiu a1, a1, 20
329+
; CHECK-NEXT: li a3, 2
330+
; CHECK-NEXT: sub a3, a3, a1
331+
; CHECK-NEXT: addi a2, a2, -1
332+
; CHECK-NEXT: or a2, a2, a3
333+
; CHECK-NEXT: and a0, a2, a0
334+
; CHECK-NEXT: ret
335+
%shl = or i8 %arg, 1
336+
%cmp.0 = icmp ult i8 %shl, 50
337+
%sub = add nsw i8 %shl, -40
338+
%cmp.1 = icmp ult i8 %sub, 20
339+
%mask.sel.v = select i1 %cmp.1, i8 1, i8 2
340+
%mask.sel = select i1 %cmp.0, i8 %mask.sel.v, i8 -1
341+
%res = and i8 %mask.sel, %arg
342+
ret i8 %res
343+
}
344+
345+
define i8 @underflow_if_sub(i32 %arg, i8 zeroext %arg1) {
346+
; CHECK-LABEL: underflow_if_sub:
347+
; CHECK: # %bb.0:
348+
; CHECK-NEXT: sext.w a2, a0
349+
; CHECK-NEXT: sgtz a2, a2
350+
; CHECK-NEXT: and a0, a2, a0
351+
; CHECK-NEXT: addi a0, a0, -11
352+
; CHECK-NEXT: andi a2, a0, 247
353+
; CHECK-NEXT: bltu a2, a1, .LBB20_2
354+
; CHECK-NEXT: # %bb.1:
355+
; CHECK-NEXT: li a0, 100
356+
; CHECK-NEXT: .LBB20_2:
357+
; CHECK-NEXT: ret
358+
%cmp = icmp sgt i32 %arg, 0
359+
%conv = zext i1 %cmp to i32
360+
%and = and i32 %conv, %arg
361+
%trunc = trunc i32 %and to i8
362+
%conv1 = add nuw nsw i8 %trunc, -11
363+
%cmp.1 = icmp ult i8 %conv1, %arg1
364+
%res = select i1 %cmp.1, i8 %conv1, i8 100
365+
ret i8 %res
366+
}
367+
368+
define i8 @underflow_if_sub_signext(i32 %arg, i8 signext %arg1) {
369+
; CHECK-LABEL: underflow_if_sub_signext:
370+
; CHECK: # %bb.0:
371+
; CHECK-NEXT: sext.w a2, a0
372+
; CHECK-NEXT: sgtz a2, a2
373+
; CHECK-NEXT: and a0, a2, a0
374+
; CHECK-NEXT: addi a0, a0, -11
375+
; CHECK-NEXT: bltu a0, a1, .LBB21_2
376+
; CHECK-NEXT: # %bb.1:
377+
; CHECK-NEXT: li a0, 100
378+
; CHECK-NEXT: .LBB21_2:
379+
; CHECK-NEXT: ret
380+
%cmp = icmp sgt i32 %arg, 0
381+
%conv = zext i1 %cmp to i32
382+
%and = and i32 %conv, %arg
383+
%trunc = trunc i32 %and to i8
384+
%conv1 = add nuw nsw i8 %trunc, -11
385+
%cmp.1 = icmp ult i8 %conv1, %arg1
386+
%res = select i1 %cmp.1, i8 %conv1, i8 100
387+
ret i8 %res
388+
}

0 commit comments

Comments
 (0)