xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/overflow-ops.ll (revision b280ee1dd7e9b36ae7aaa3953556e4b7a7f31a29)
1486ed885SArthur Eubanks; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*b280ee1dSBjorn Pettersson; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3486ed885SArthur Eubanks
4486ed885SArthur Eubanksdeclare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8)
5486ed885SArthur Eubanksdeclare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8)
6486ed885SArthur Eubanksdeclare {i8, i1} @llvm.umul.with.overflow.i8(i8, i8)
7486ed885SArthur Eubanks
8486ed885SArthur Eubanksdeclare {i8, i1} @llvm.sadd.with.overflow.i8(i8, i8)
9486ed885SArthur Eubanksdeclare {i8, i1} @llvm.ssub.with.overflow.i8(i8, i8)
10486ed885SArthur Eubanksdeclare {i8, i1} @llvm.smul.with.overflow.i8(i8, i8)
11486ed885SArthur Eubanks
12486ed885SArthur Eubanks;;-----------------------------
13486ed885SArthur Eubanks;; uadd
14486ed885SArthur Eubanks;;-----------------------------
15486ed885SArthur Eubanks
16486ed885SArthur Eubanksdefine {i8, i1} @uadd_1() nounwind {
17486ed885SArthur Eubanks; CHECK-LABEL: @uadd_1(
18486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -114, i1 false }
19486ed885SArthur Eubanks;
20486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 42, i8 100)
21486ed885SArthur Eubanks  ret {i8, i1} %t
22486ed885SArthur Eubanks}
23486ed885SArthur Eubanks
24486ed885SArthur Eubanksdefine {i8, i1} @uadd_2() nounwind {
25486ed885SArthur Eubanks; CHECK-LABEL: @uadd_2(
26486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 6, i1 true }
27486ed885SArthur Eubanks;
28486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 120)
29486ed885SArthur Eubanks  ret {i8, i1} %t
30486ed885SArthur Eubanks}
31486ed885SArthur Eubanks
32486ed885SArthur Eubanksdefine {i8, i1} @uadd_undef() nounwind {
33486ed885SArthur Eubanks; CHECK-LABEL: @uadd_undef(
34807b019cSGeorge Mitenkov; CHECK-NEXT:    ret { i8, i1 } { i8 -1, i1 false }
35486ed885SArthur Eubanks;
36486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 undef)
37486ed885SArthur Eubanks  ret {i8, i1} %t
38486ed885SArthur Eubanks}
39486ed885SArthur Eubanks
40486ed885SArthur Eubanks;;-----------------------------
41486ed885SArthur Eubanks;; usub
42486ed885SArthur Eubanks;;-----------------------------
43486ed885SArthur Eubanks
44486ed885SArthur Eubanksdefine {i8, i1} @usub_1() nounwind {
45486ed885SArthur Eubanks; CHECK-LABEL: @usub_1(
46486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 2, i1 false }
47486ed885SArthur Eubanks;
48486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 2)
49486ed885SArthur Eubanks  ret {i8, i1} %t
50486ed885SArthur Eubanks}
51486ed885SArthur Eubanks
52486ed885SArthur Eubanksdefine {i8, i1} @usub_2() nounwind {
53486ed885SArthur Eubanks; CHECK-LABEL: @usub_2(
54486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -2, i1 true }
55486ed885SArthur Eubanks;
56486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 6)
57486ed885SArthur Eubanks  ret {i8, i1} %t
58486ed885SArthur Eubanks}
59486ed885SArthur Eubanks
60486ed885SArthur Eubanksdefine {i8, i1} @usub_undef() nounwind {
61486ed885SArthur Eubanks; CHECK-LABEL: @usub_undef(
62807b019cSGeorge Mitenkov; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
63486ed885SArthur Eubanks;
64486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 undef)
65486ed885SArthur Eubanks  ret {i8, i1} %t
66486ed885SArthur Eubanks}
67486ed885SArthur Eubanks
68486ed885SArthur Eubanks;;-----------------------------
69486ed885SArthur Eubanks;; umul
70486ed885SArthur Eubanks;;-----------------------------
71486ed885SArthur Eubanks
72486ed885SArthur Eubanksdefine {i8, i1} @umul_1() nounwind {
73486ed885SArthur Eubanks; CHECK-LABEL: @umul_1(
74486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 44, i1 true }
75486ed885SArthur Eubanks;
76486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 3)
77486ed885SArthur Eubanks  ret {i8, i1} %t
78486ed885SArthur Eubanks}
79486ed885SArthur Eubanks
80486ed885SArthur Eubanksdefine {i8, i1} @umul_2() nounwind {
81486ed885SArthur Eubanks; CHECK-LABEL: @umul_2(
82486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -56, i1 false }
83486ed885SArthur Eubanks;
84486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 2)
85486ed885SArthur Eubanks  ret {i8, i1} %t
86486ed885SArthur Eubanks}
87486ed885SArthur Eubanks
88486ed885SArthur Eubanksdefine {i8, i1} @umul_undef() nounwind {
89486ed885SArthur Eubanks; CHECK-LABEL: @umul_undef(
90486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
91486ed885SArthur Eubanks;
92486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 undef, i8 2)
93486ed885SArthur Eubanks  ret {i8, i1} %t
94486ed885SArthur Eubanks}
95486ed885SArthur Eubanks
96486ed885SArthur Eubanksdefine {i8, i1} @umul_both_undef() nounwind {
97486ed885SArthur Eubanks; CHECK-LABEL: @umul_both_undef(
98486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
99486ed885SArthur Eubanks;
100486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 undef, i8 undef)
101486ed885SArthur Eubanks  ret {i8, i1} %t
102486ed885SArthur Eubanks}
103486ed885SArthur Eubanks
104486ed885SArthur Eubanks;;-----------------------------
105486ed885SArthur Eubanks;; sadd
106486ed885SArthur Eubanks;;-----------------------------
107486ed885SArthur Eubanks
108486ed885SArthur Eubanksdefine {i8, i1} @sadd_1() nounwind {
109486ed885SArthur Eubanks; CHECK-LABEL: @sadd_1(
110486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 44, i1 false }
111486ed885SArthur Eubanks;
112486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 42, i8 2)
113486ed885SArthur Eubanks  ret {i8, i1} %t
114486ed885SArthur Eubanks}
115486ed885SArthur Eubanks
116486ed885SArthur Eubanksdefine {i8, i1} @sadd_2() nounwind {
117486ed885SArthur Eubanks; CHECK-LABEL: @sadd_2(
118486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -126, i1 true }
119486ed885SArthur Eubanks;
120486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 120, i8 10)
121486ed885SArthur Eubanks  ret {i8, i1} %t
122486ed885SArthur Eubanks}
123486ed885SArthur Eubanks
124486ed885SArthur Eubanksdefine {i8, i1} @sadd_3() nounwind {
125486ed885SArthur Eubanks; CHECK-LABEL: @sadd_3(
126486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -110, i1 false }
127486ed885SArthur Eubanks;
128486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 10)
129486ed885SArthur Eubanks  ret {i8, i1} %t
130486ed885SArthur Eubanks}
131486ed885SArthur Eubanks
132486ed885SArthur Eubanksdefine {i8, i1} @sadd_4() nounwind {
133486ed885SArthur Eubanks; CHECK-LABEL: @sadd_4(
134486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 126, i1 true }
135486ed885SArthur Eubanks;
136486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 -10)
137486ed885SArthur Eubanks  ret {i8, i1} %t
138486ed885SArthur Eubanks}
139486ed885SArthur Eubanks
140486ed885SArthur Eubanksdefine {i8, i1} @sadd_5() nounwind {
141486ed885SArthur Eubanks; CHECK-LABEL: @sadd_5(
142486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -8, i1 false }
143486ed885SArthur Eubanks;
144486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 2, i8 -10)
145486ed885SArthur Eubanks  ret {i8, i1} %t
146486ed885SArthur Eubanks}
147486ed885SArthur Eubanks
148486ed885SArthur Eubanksdefine {i8, i1} @sadd_undef() nounwind {
149486ed885SArthur Eubanks; CHECK-LABEL: @sadd_undef(
150807b019cSGeorge Mitenkov; CHECK-NEXT:    ret { i8, i1 } { i8 -1, i1 false }
151486ed885SArthur Eubanks;
152486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 undef, i8 -10)
153486ed885SArthur Eubanks  ret {i8, i1} %t
154486ed885SArthur Eubanks}
155486ed885SArthur Eubanks
156486ed885SArthur Eubanks;;-----------------------------
157486ed885SArthur Eubanks;; ssub
158486ed885SArthur Eubanks;;-----------------------------
159486ed885SArthur Eubanks
160486ed885SArthur Eubanksdefine {i8, i1} @ssub_1() nounwind {
161486ed885SArthur Eubanks; CHECK-LABEL: @ssub_1(
162486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 2, i1 false }
163486ed885SArthur Eubanks;
164486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 2)
165486ed885SArthur Eubanks  ret {i8, i1} %t
166486ed885SArthur Eubanks}
167486ed885SArthur Eubanks
168486ed885SArthur Eubanksdefine {i8, i1} @ssub_2() nounwind {
169486ed885SArthur Eubanks; CHECK-LABEL: @ssub_2(
170486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -2, i1 false }
171486ed885SArthur Eubanks;
172486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 6)
173486ed885SArthur Eubanks  ret {i8, i1} %t
174486ed885SArthur Eubanks}
175486ed885SArthur Eubanks
176486ed885SArthur Eubanksdefine {i8, i1} @ssub_3() nounwind {
177486ed885SArthur Eubanks; CHECK-LABEL: @ssub_3(
178486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 126, i1 true }
179486ed885SArthur Eubanks;
180486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 120)
181486ed885SArthur Eubanks  ret {i8, i1} %t
182486ed885SArthur Eubanks}
183486ed885SArthur Eubanks
184486ed885SArthur Eubanksdefine {i8, i1} @ssub_3b() nounwind {
185486ed885SArthur Eubanks; CHECK-LABEL: @ssub_3b(
186486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -20, i1 false }
187486ed885SArthur Eubanks;
188486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 10)
189486ed885SArthur Eubanks  ret {i8, i1} %t
190486ed885SArthur Eubanks}
191486ed885SArthur Eubanks
192486ed885SArthur Eubanksdefine {i8, i1} @ssub_4() nounwind {
193486ed885SArthur Eubanks; CHECK-LABEL: @ssub_4(
194486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -126, i1 true }
195486ed885SArthur Eubanks;
196486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 120, i8 -10)
197486ed885SArthur Eubanks  ret {i8, i1} %t
198486ed885SArthur Eubanks}
199486ed885SArthur Eubanks
200486ed885SArthur Eubanksdefine {i8, i1} @ssub_4b() nounwind {
201486ed885SArthur Eubanks; CHECK-LABEL: @ssub_4b(
202486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 30, i1 false }
203486ed885SArthur Eubanks;
204486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 20, i8 -10)
205486ed885SArthur Eubanks  ret {i8, i1} %t
206486ed885SArthur Eubanks}
207486ed885SArthur Eubanks
208486ed885SArthur Eubanksdefine {i8, i1} @ssub_5() nounwind {
209486ed885SArthur Eubanks; CHECK-LABEL: @ssub_5(
210486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -10, i1 false }
211486ed885SArthur Eubanks;
212486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -20, i8 -10)
213486ed885SArthur Eubanks  ret {i8, i1} %t
214486ed885SArthur Eubanks}
215486ed885SArthur Eubanks
216486ed885SArthur Eubanksdefine {i8, i1} @ssub_undef() nounwind {
217486ed885SArthur Eubanks; CHECK-LABEL: @ssub_undef(
218807b019cSGeorge Mitenkov; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
219486ed885SArthur Eubanks;
220486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 undef, i8 -10)
221486ed885SArthur Eubanks  ret {i8, i1} %t
222486ed885SArthur Eubanks}
223486ed885SArthur Eubanks
224486ed885SArthur Eubanks;;-----------------------------
225486ed885SArthur Eubanks;; smul
226486ed885SArthur Eubanks;;-----------------------------
227486ed885SArthur Eubanks
228486ed885SArthur Eubanksdefine {i8, i1} @smul_1() nounwind {
229486ed885SArthur Eubanks; CHECK-LABEL: @smul_1(
230486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } { i8 -56, i1 true }
231486ed885SArthur Eubanks;
232486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 -10)
233486ed885SArthur Eubanks  ret {i8, i1} %t
234486ed885SArthur Eubanks}
235486ed885SArthur Eubanks
236486ed885SArthur Eubanksdefine {i8, i1} @smul_undef() nounwind {
237486ed885SArthur Eubanks; CHECK-LABEL: @smul_undef(
238486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
239486ed885SArthur Eubanks;
240486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 undef)
241486ed885SArthur Eubanks  ret {i8, i1} %t
242486ed885SArthur Eubanks}
243486ed885SArthur Eubanks
244486ed885SArthur Eubanksdefine {i8, i1} @smul_both_undef() nounwind {
245486ed885SArthur Eubanks; CHECK-LABEL: @smul_both_undef(
246486ed885SArthur Eubanks; CHECK-NEXT:    ret { i8, i1 } zeroinitializer
247486ed885SArthur Eubanks;
248486ed885SArthur Eubanks  %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 undef, i8 undef)
249486ed885SArthur Eubanks  ret {i8, i1} %t
250486ed885SArthur Eubanks}
251