xref: /llvm-project/llvm/test/Transforms/InstCombine/canonicalize-or-with-overflow-icmp.ll (revision c59ea32f82128f550b471ed96b7ac093ff448c60)
1*c59ea32fSYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*c59ea32fSYingwei Zheng; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3*c59ea32fSYingwei Zheng
4*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32)
5*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32)
6*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32)
7*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32)
8*c59ea32fSYingwei Zheng
9*c59ea32fSYingwei Zhengdeclare void @use(i1)
10*c59ea32fSYingwei Zheng
11*c59ea32fSYingwei Zheng; Tests from PR75360
12*c59ea32fSYingwei Zhengdefine i1 @ckd_add_unsigned(i31 %num) {
13*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @ckd_add_unsigned(
14*c59ea32fSYingwei Zheng; CHECK-SAME: i31 [[NUM:%.*]]) {
15*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = icmp eq i31 [[NUM]], -1
16*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A2]]
17*c59ea32fSYingwei Zheng;
18*c59ea32fSYingwei Zheng  %a0 = zext i31 %num to i32
19*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
20*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
21*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
22*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 0
23*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
24*c59ea32fSYingwei Zheng  ret i1 %a5
25*c59ea32fSYingwei Zheng}
26*c59ea32fSYingwei Zheng
27*c59ea32fSYingwei Zhengdefine i1 @ckd_add_unsigned_commuted(i31 %num) {
28*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @ckd_add_unsigned_commuted(
29*c59ea32fSYingwei Zheng; CHECK-SAME: i31 [[NUM:%.*]]) {
30*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = icmp eq i31 [[NUM]], -1
31*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A2]]
32*c59ea32fSYingwei Zheng;
33*c59ea32fSYingwei Zheng  %a0 = zext i31 %num to i32
34*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
35*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
36*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
37*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 0
38*c59ea32fSYingwei Zheng  %a5 = or i1 %a4, %a2
39*c59ea32fSYingwei Zheng  ret i1 %a5
40*c59ea32fSYingwei Zheng}
41*c59ea32fSYingwei Zheng
42*c59ea32fSYingwei Zhengdefine i1 @ckd_add_unsigned_imply_true(i31 %num) {
43*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @ckd_add_unsigned_imply_true(
44*c59ea32fSYingwei Zheng; CHECK-SAME: i31 [[NUM:%.*]]) {
45*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 true
46*c59ea32fSYingwei Zheng;
47*c59ea32fSYingwei Zheng  %a0 = zext i31 %num to i32
48*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
49*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
50*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
51*c59ea32fSYingwei Zheng  %a4 = icmp sgt i32 %a3, -1
52*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
53*c59ea32fSYingwei Zheng  ret i1 %a5
54*c59ea32fSYingwei Zheng}
55*c59ea32fSYingwei Zheng
56*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp(i32 %a0) {
57*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp(
58*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
59*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[A0]], -2147483647
60*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = icmp sgt i32 [[TMP1]], -1
61*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
62*c59ea32fSYingwei Zheng;
63*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
64*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
65*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
66*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 0
67*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
68*c59ea32fSYingwei Zheng  ret i1 %a5
69*c59ea32fSYingwei Zheng}
70*c59ea32fSYingwei Zheng
71*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_ssub_with_overflow_icmp(i32 %a0) {
72*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_ssub_with_overflow_icmp(
73*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
74*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[A0]], 1
75*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[TMP1]]
76*c59ea32fSYingwei Zheng;
77*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a0, i32 1)
78*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
79*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
80*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 0
81*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
82*c59ea32fSYingwei Zheng  ret i1 %a5
83*c59ea32fSYingwei Zheng}
84*c59ea32fSYingwei Zheng
85*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_uadd_with_overflow_icmp(i32 %a0) {
86*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_uadd_with_overflow_icmp(
87*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
88*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[A0]], 1
89*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = icmp ult i32 [[TMP1]], 10
90*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
91*c59ea32fSYingwei Zheng;
92*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a0, i32 1)
93*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
94*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
95*c59ea32fSYingwei Zheng  %a4 = icmp ult i32 %a3, 10
96*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
97*c59ea32fSYingwei Zheng  ret i1 %a5
98*c59ea32fSYingwei Zheng}
99*c59ea32fSYingwei Zheng
100*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_eq(i32 %a0) {
101*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_eq(
102*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
103*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = icmp eq i32 [[A0]], 2147483647
104*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[A0]], 9
105*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[TMP1]]
106*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
107*c59ea32fSYingwei Zheng;
108*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
109*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
110*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
111*c59ea32fSYingwei Zheng  %a4 = icmp eq i32 %a3, 10
112*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
113*c59ea32fSYingwei Zheng  ret i1 %a5
114*c59ea32fSYingwei Zheng}
115*c59ea32fSYingwei Zheng
116*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_uadd_with_overflow_icmp_ne(i32 %a0) {
117*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_uadd_with_overflow_icmp_ne(
118*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
119*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i32 [[A0]], 9
120*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[TMP1]]
121*c59ea32fSYingwei Zheng;
122*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a0, i32 1)
123*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
124*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
125*c59ea32fSYingwei Zheng  %a4 = icmp ne i32 %a3, 10
126*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
127*c59ea32fSYingwei Zheng  ret i1 %a5
128*c59ea32fSYingwei Zheng}
129*c59ea32fSYingwei Zheng
130*c59ea32fSYingwei Zheng; Negative tests
131*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_mismatched_pred(i32 %a0) {
132*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_mismatched_pred(
133*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
134*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 1)
135*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
136*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
137*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp ult i32 [[A3]], 2
138*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
139*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
140*c59ea32fSYingwei Zheng;
141*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
142*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
143*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
144*c59ea32fSYingwei Zheng  %a4 = icmp ult i32 %a3, 2
145*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
146*c59ea32fSYingwei Zheng  ret i1 %a5
147*c59ea32fSYingwei Zheng}
148*c59ea32fSYingwei Zheng
149*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant1(i32 %a0, i32 %c) {
150*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant1(
151*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]], i32 [[C:%.*]]) {
152*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 [[C]])
153*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
154*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
155*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp slt i32 [[A3]], 0
156*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
157*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
158*c59ea32fSYingwei Zheng;
159*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 %c)
160*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
161*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
162*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 0
163*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
164*c59ea32fSYingwei Zheng  ret i1 %a5
165*c59ea32fSYingwei Zheng}
166*c59ea32fSYingwei Zheng
167*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant2(i32 %a0, i32 %c) {
168*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant2(
169*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]], i32 [[C:%.*]]) {
170*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 1)
171*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
172*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
173*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp slt i32 [[A3]], [[C]]
174*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
175*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
176*c59ea32fSYingwei Zheng;
177*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
178*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
179*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
180*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, %c
181*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
182*c59ea32fSYingwei Zheng  ret i1 %a5
183*c59ea32fSYingwei Zheng}
184*c59ea32fSYingwei Zheng
185*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_multiuse(i32 %a0) {
186*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_multiuse(
187*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
188*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 1)
189*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
190*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
191*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp slt i32 [[A3]], 0
192*c59ea32fSYingwei Zheng; CHECK-NEXT:    call void @use(i1 [[A4]])
193*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
194*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
195*c59ea32fSYingwei Zheng;
196*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1)
197*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
198*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
199*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 0
200*c59ea32fSYingwei Zheng  call void @use(i1 %a4)
201*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
202*c59ea32fSYingwei Zheng  ret i1 %a5
203*c59ea32fSYingwei Zheng}
204*c59ea32fSYingwei Zheng
205*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_overflow(i32 %a0) {
206*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_overflow(
207*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
208*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 -2147483647)
209*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
210*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
211*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp slt i32 [[A3]], 2
212*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
213*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
214*c59ea32fSYingwei Zheng;
215*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 -2147483647)
216*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
217*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
218*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 2
219*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
220*c59ea32fSYingwei Zheng  ret i1 %a5
221*c59ea32fSYingwei Zheng}
222*c59ea32fSYingwei Zheng
223*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_uadd_with_overflow_icmp_overflow(i32 %a0) {
224*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_uadd_with_overflow_icmp_overflow(
225*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
226*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[A0]], i32 3)
227*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
228*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
229*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp ult i32 [[A3]], 2
230*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
231*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
232*c59ea32fSYingwei Zheng;
233*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a0, i32 3)
234*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
235*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
236*c59ea32fSYingwei Zheng  %a4 = icmp ult i32 %a3, 2
237*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
238*c59ea32fSYingwei Zheng  ret i1 %a5
239*c59ea32fSYingwei Zheng}
240*c59ea32fSYingwei Zheng
241*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_ssub_with_overflow_icmp_overflow(i32 %a0) {
242*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_ssub_with_overflow_icmp_overflow(
243*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
244*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[A0]], i32 -2147483648)
245*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
246*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
247*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp slt i32 [[A3]], -1
248*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
249*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
250*c59ea32fSYingwei Zheng;
251*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a0, i32 -2147483648)
252*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
253*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
254*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, -1
255*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
256*c59ea32fSYingwei Zheng  ret i1 %a5
257*c59ea32fSYingwei Zheng}
258*c59ea32fSYingwei Zheng
259*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_smul_with_overflow_icmp(i32 %a0) {
260*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_smul_with_overflow_icmp(
261*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) {
262*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A1:%.*]] = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[A0]], i32 3)
263*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1
264*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0
265*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A4:%.*]] = icmp slt i32 [[A3]], 10
266*c59ea32fSYingwei Zheng; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A2]], [[A4]]
267*c59ea32fSYingwei Zheng; CHECK-NEXT:    ret i1 [[A5]]
268*c59ea32fSYingwei Zheng;
269*c59ea32fSYingwei Zheng  %a1 = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %a0, i32 3)
270*c59ea32fSYingwei Zheng  %a2 = extractvalue { i32, i1 } %a1, 1
271*c59ea32fSYingwei Zheng  %a3 = extractvalue { i32, i1 } %a1, 0
272*c59ea32fSYingwei Zheng  %a4 = icmp slt i32 %a3, 10
273*c59ea32fSYingwei Zheng  %a5 = or i1 %a2, %a4
274*c59ea32fSYingwei Zheng  ret i1 %a5
275*c59ea32fSYingwei Zheng}
276