xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/overflow-ops.ll (revision 486ed885339d70cd71ee55567282a43cce28d763)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s --check-prefixes=CHECK,CONSTPROP
3; RUN: opt < %s -instsimplify -S | FileCheck %s --check-prefixes=CHECK,INSTSIMPLIFY
4; We must *NOT* have any check-lines with prefixes other than CHECK here.
5; If we do, that means the rules are different between the passes.
6
7declare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8)
8declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8)
9declare {i8, i1} @llvm.umul.with.overflow.i8(i8, i8)
10
11declare {i8, i1} @llvm.sadd.with.overflow.i8(i8, i8)
12declare {i8, i1} @llvm.ssub.with.overflow.i8(i8, i8)
13declare {i8, i1} @llvm.smul.with.overflow.i8(i8, i8)
14
15;;-----------------------------
16;; uadd
17;;-----------------------------
18
19define {i8, i1} @uadd_1() nounwind {
20; CHECK-LABEL: @uadd_1(
21; CHECK-NEXT:    ret { i8, i1 } { i8 -114, i1 false }
22;
23  %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 42, i8 100)
24  ret {i8, i1} %t
25}
26
27define {i8, i1} @uadd_2() nounwind {
28; CHECK-LABEL: @uadd_2(
29; CHECK-NEXT:    ret { i8, i1 } { i8 6, i1 true }
30;
31  %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 120)
32  ret {i8, i1} %t
33}
34
35define {i8, i1} @uadd_undef() nounwind {
36; CHECK-LABEL: @uadd_undef(
37; CHECK-NEXT:    ret { i8, i1 } { i8 undef, i1 false }
38;
39  %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 undef)
40  ret {i8, i1} %t
41}
42
43;;-----------------------------
44;; usub
45;;-----------------------------
46
47define {i8, i1} @usub_1() nounwind {
48; CHECK-LABEL: @usub_1(
49; CHECK-NEXT:    ret { i8, i1 } { i8 2, i1 false }
50;
51  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 2)
52  ret {i8, i1} %t
53}
54
55define {i8, i1} @usub_2() nounwind {
56; CHECK-LABEL: @usub_2(
57; CHECK-NEXT:    ret { i8, i1 } { i8 -2, i1 true }
58;
59  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 6)
60  ret {i8, i1} %t
61}
62
63define {i8, i1} @usub_undef() nounwind {
64; CHECK-LABEL: @usub_undef(
65; CHECK-NEXT:    ret { i8, i1 } { i8 undef, i1 false }
66;
67  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 undef)
68  ret {i8, i1} %t
69}
70
71;;-----------------------------
72;; umul
73;;-----------------------------
74
75define {i8, i1} @umul_1() nounwind {
76; CHECK-LABEL: @umul_1(
77; CHECK-NEXT:    ret { i8, i1 } { i8 44, i1 true }
78;
79  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 3)
80  ret {i8, i1} %t
81}
82
83define {i8, i1} @umul_2() nounwind {
84; CHECK-LABEL: @umul_2(
85; CHECK-NEXT:    ret { i8, i1 } { i8 -56, i1 false }
86;
87  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 2)
88  ret {i8, i1} %t
89}
90
91define {i8, i1} @umul_undef() nounwind {
92; CHECK-LABEL: @umul_undef(
93; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
94;
95  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 undef, i8 2)
96  ret {i8, i1} %t
97}
98
99define {i8, i1} @umul_both_undef() nounwind {
100; CHECK-LABEL: @umul_both_undef(
101; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
102;
103  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 undef, i8 undef)
104  ret {i8, i1} %t
105}
106
107;;-----------------------------
108;; sadd
109;;-----------------------------
110
111define {i8, i1} @sadd_1() nounwind {
112; CHECK-LABEL: @sadd_1(
113; CHECK-NEXT:    ret { i8, i1 } { i8 44, i1 false }
114;
115  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 42, i8 2)
116  ret {i8, i1} %t
117}
118
119define {i8, i1} @sadd_2() nounwind {
120; CHECK-LABEL: @sadd_2(
121; CHECK-NEXT:    ret { i8, i1 } { i8 -126, i1 true }
122;
123  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 120, i8 10)
124  ret {i8, i1} %t
125}
126
127define {i8, i1} @sadd_3() nounwind {
128; CHECK-LABEL: @sadd_3(
129; CHECK-NEXT:    ret { i8, i1 } { i8 -110, i1 false }
130;
131  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 10)
132  ret {i8, i1} %t
133}
134
135define {i8, i1} @sadd_4() nounwind {
136; CHECK-LABEL: @sadd_4(
137; CHECK-NEXT:    ret { i8, i1 } { i8 126, i1 true }
138;
139  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 -10)
140  ret {i8, i1} %t
141}
142
143define {i8, i1} @sadd_5() nounwind {
144; CHECK-LABEL: @sadd_5(
145; CHECK-NEXT:    ret { i8, i1 } { i8 -8, i1 false }
146;
147  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 2, i8 -10)
148  ret {i8, i1} %t
149}
150
151define {i8, i1} @sadd_undef() nounwind {
152; CHECK-LABEL: @sadd_undef(
153; CHECK-NEXT:    ret { i8, i1 } { i8 undef, i1 false }
154;
155  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 undef, i8 -10)
156  ret {i8, i1} %t
157}
158
159;;-----------------------------
160;; ssub
161;;-----------------------------
162
163define {i8, i1} @ssub_1() nounwind {
164; CHECK-LABEL: @ssub_1(
165; CHECK-NEXT:    ret { i8, i1 } { i8 2, i1 false }
166;
167  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 2)
168  ret {i8, i1} %t
169}
170
171define {i8, i1} @ssub_2() nounwind {
172; CHECK-LABEL: @ssub_2(
173; CHECK-NEXT:    ret { i8, i1 } { i8 -2, i1 false }
174;
175  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 6)
176  ret {i8, i1} %t
177}
178
179define {i8, i1} @ssub_3() nounwind {
180; CHECK-LABEL: @ssub_3(
181; CHECK-NEXT:    ret { i8, i1 } { i8 126, i1 true }
182;
183  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 120)
184  ret {i8, i1} %t
185}
186
187define {i8, i1} @ssub_3b() nounwind {
188; CHECK-LABEL: @ssub_3b(
189; CHECK-NEXT:    ret { i8, i1 } { i8 -20, i1 false }
190;
191  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 10)
192  ret {i8, i1} %t
193}
194
195define {i8, i1} @ssub_4() nounwind {
196; CHECK-LABEL: @ssub_4(
197; CHECK-NEXT:    ret { i8, i1 } { i8 -126, i1 true }
198;
199  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 120, i8 -10)
200  ret {i8, i1} %t
201}
202
203define {i8, i1} @ssub_4b() nounwind {
204; CHECK-LABEL: @ssub_4b(
205; CHECK-NEXT:    ret { i8, i1 } { i8 30, i1 false }
206;
207  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 20, i8 -10)
208  ret {i8, i1} %t
209}
210
211define {i8, i1} @ssub_5() nounwind {
212; CHECK-LABEL: @ssub_5(
213; CHECK-NEXT:    ret { i8, i1 } { i8 -10, i1 false }
214;
215  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -20, i8 -10)
216  ret {i8, i1} %t
217}
218
219define {i8, i1} @ssub_undef() nounwind {
220; CHECK-LABEL: @ssub_undef(
221; CHECK-NEXT:    ret { i8, i1 } { i8 undef, i1 false }
222;
223  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 undef, i8 -10)
224  ret {i8, i1} %t
225}
226
227;;-----------------------------
228;; smul
229;;-----------------------------
230
231define {i8, i1} @smul_1() nounwind {
232; CHECK-LABEL: @smul_1(
233; CHECK-NEXT:    ret { i8, i1 } { i8 -56, i1 true }
234;
235  %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 -10)
236  ret {i8, i1} %t
237}
238
239define {i8, i1} @smul_undef() nounwind {
240; CHECK-LABEL: @smul_undef(
241; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
242;
243  %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 undef)
244  ret {i8, i1} %t
245}
246
247define {i8, i1} @smul_both_undef() nounwind {
248; CHECK-LABEL: @smul_both_undef(
249; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
250;
251  %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 undef, i8 undef)
252  ret {i8, i1} %t
253}
254