xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/sext-signed-predicates.ll (revision 4e9fe860d2dd462e514586a3b90ad373dc07b797)
1*4e9fe860SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*4e9fe860SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3*4e9fe860SFlorian Hahn
4*4e9fe860SFlorian Hahndefine i1 @cmp_sext(i32 %a, i32 %b){
5*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext(
6*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
7*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
8*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
9*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
10*4e9fe860SFlorian Hahn; CHECK:       then:
11*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SA:%.*]] = sext i32 [[A]] to i64
12*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SB:%.*]] = sext i32 [[B]] to i64
13*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
14*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 true
15*4e9fe860SFlorian Hahn; CHECK:       else:
16*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 false
17*4e9fe860SFlorian Hahn;
18*4e9fe860SFlorian Hahnentry:
19*4e9fe860SFlorian Hahn  %cmp = icmp slt i32 %a, %b
20*4e9fe860SFlorian Hahn  br i1 %cmp, label %then, label %else
21*4e9fe860SFlorian Hahn
22*4e9fe860SFlorian Hahnthen:
23*4e9fe860SFlorian Hahn  %sa = sext i32 %a to i64
24*4e9fe860SFlorian Hahn  %sb = sext i32 %b to i64
25*4e9fe860SFlorian Hahn  %add = add nsw i64 %sa, 1
26*4e9fe860SFlorian Hahn  %cmp2 = icmp sge i64 %sb, %add
27*4e9fe860SFlorian Hahn  ret i1 %cmp2
28*4e9fe860SFlorian Hahn
29*4e9fe860SFlorian Hahnelse:
30*4e9fe860SFlorian Hahn  ret i1 false
31*4e9fe860SFlorian Hahn}
32*4e9fe860SFlorian Hahn
33*4e9fe860SFlorian Hahndefine i1 @cmp_sext_add(i32 %a, i32 %b){
34*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_add(
35*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
36*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
37*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
38*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
39*4e9fe860SFlorian Hahn; CHECK:       then:
40*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[A1:%.*]] = add nsw i32 [[A]], 1
41*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[B1:%.*]] = add nsw i32 [[B]], 1
42*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SA:%.*]] = sext i32 [[A1]] to i64
43*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SB:%.*]] = sext i32 [[B1]] to i64
44*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
45*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 true
46*4e9fe860SFlorian Hahn; CHECK:       else:
47*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 false
48*4e9fe860SFlorian Hahn;
49*4e9fe860SFlorian Hahnentry:
50*4e9fe860SFlorian Hahn  %cmp = icmp slt i32 %a, %b
51*4e9fe860SFlorian Hahn  br i1 %cmp, label %then, label %else
52*4e9fe860SFlorian Hahn
53*4e9fe860SFlorian Hahnthen:
54*4e9fe860SFlorian Hahn  %a1 = add nsw i32 %a, 1
55*4e9fe860SFlorian Hahn  %b1 = add nsw i32 %b, 1
56*4e9fe860SFlorian Hahn  %sa = sext i32 %a1 to i64
57*4e9fe860SFlorian Hahn  %sb = sext i32 %b1 to i64
58*4e9fe860SFlorian Hahn  %add = add nsw i64 %sa, 1
59*4e9fe860SFlorian Hahn  %cmp2 = icmp sge i64 %sb, %add
60*4e9fe860SFlorian Hahn  ret i1 %cmp2
61*4e9fe860SFlorian Hahn
62*4e9fe860SFlorian Hahnelse:
63*4e9fe860SFlorian Hahn  ret i1 false
64*4e9fe860SFlorian Hahn}
65*4e9fe860SFlorian Hahn
66*4e9fe860SFlorian Hahndefine i1 @cmp_sext_dynamic_increment(i32 %a, i32 %b, i64 %c){
67*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_dynamic_increment(
68*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]]) {
69*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
70*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[POS:%.*]] = icmp slt i64 [[C]], 2
71*4e9fe860SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[POS]])
72*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
73*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
74*4e9fe860SFlorian Hahn; CHECK:       then:
75*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SA:%.*]] = sext i32 [[A]] to i64
76*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SB:%.*]] = sext i32 [[B]] to i64
77*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], [[C]]
78*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 true
79*4e9fe860SFlorian Hahn; CHECK:       else:
80*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 false
81*4e9fe860SFlorian Hahn;
82*4e9fe860SFlorian Hahnentry:
83*4e9fe860SFlorian Hahn  %pos = icmp slt i64 %c, 2
84*4e9fe860SFlorian Hahn  call void @llvm.assume(i1 %pos)
85*4e9fe860SFlorian Hahn  %cmp = icmp slt i32 %a, %b
86*4e9fe860SFlorian Hahn  br i1 %cmp, label %then, label %else
87*4e9fe860SFlorian Hahn
88*4e9fe860SFlorian Hahnthen:
89*4e9fe860SFlorian Hahn  %sa = sext i32 %a to i64
90*4e9fe860SFlorian Hahn  %sb = sext i32 %b to i64
91*4e9fe860SFlorian Hahn  %add = add nsw i64 %sa, %c
92*4e9fe860SFlorian Hahn  %cmp2 = icmp sge i64 %sb, %add
93*4e9fe860SFlorian Hahn  ret i1 %cmp2
94*4e9fe860SFlorian Hahn
95*4e9fe860SFlorian Hahnelse:
96*4e9fe860SFlorian Hahn  ret i1 false
97*4e9fe860SFlorian Hahn}
98*4e9fe860SFlorian Hahn
99*4e9fe860SFlorian Hahndefine i1 @cmp_zext_nneg(i32 %a, i32 %b){
100*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_zext_nneg(
101*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
102*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
103*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
104*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
105*4e9fe860SFlorian Hahn; CHECK:       then:
106*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SA:%.*]] = zext nneg i32 [[A]] to i64
107*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SB:%.*]] = zext nneg i32 [[B]] to i64
108*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
109*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 true
110*4e9fe860SFlorian Hahn; CHECK:       else:
111*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 false
112*4e9fe860SFlorian Hahn;
113*4e9fe860SFlorian Hahnentry:
114*4e9fe860SFlorian Hahn  %cmp = icmp slt i32 %a, %b
115*4e9fe860SFlorian Hahn  br i1 %cmp, label %then, label %else
116*4e9fe860SFlorian Hahn
117*4e9fe860SFlorian Hahnthen:
118*4e9fe860SFlorian Hahn  %sa = zext nneg i32 %a to i64
119*4e9fe860SFlorian Hahn  %sb = zext nneg i32 %b to i64
120*4e9fe860SFlorian Hahn  %add = add nsw i64 %sa, 1
121*4e9fe860SFlorian Hahn  %cmp2 = icmp sge i64 %sb, %add
122*4e9fe860SFlorian Hahn  ret i1 %cmp2
123*4e9fe860SFlorian Hahn
124*4e9fe860SFlorian Hahnelse:
125*4e9fe860SFlorian Hahn  ret i1 false
126*4e9fe860SFlorian Hahn}
127*4e9fe860SFlorian Hahn
128*4e9fe860SFlorian Hahn; Negative tests
129*4e9fe860SFlorian Hahn
130*4e9fe860SFlorian Hahndefine i1 @cmp_zext(i32 %a, i32 %b){
131*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_zext(
132*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
133*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
134*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
135*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
136*4e9fe860SFlorian Hahn; CHECK:       then:
137*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SA:%.*]] = zext i32 [[A]] to i64
138*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SB:%.*]] = zext i32 [[B]] to i64
139*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
140*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
141*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 [[CMP2]]
142*4e9fe860SFlorian Hahn; CHECK:       else:
143*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 false
144*4e9fe860SFlorian Hahn;
145*4e9fe860SFlorian Hahnentry:
146*4e9fe860SFlorian Hahn  %cmp = icmp slt i32 %a, %b
147*4e9fe860SFlorian Hahn  br i1 %cmp, label %then, label %else
148*4e9fe860SFlorian Hahn
149*4e9fe860SFlorian Hahnthen:
150*4e9fe860SFlorian Hahn  %sa = zext i32 %a to i64
151*4e9fe860SFlorian Hahn  %sb = zext i32 %b to i64
152*4e9fe860SFlorian Hahn  %add = add nsw i64 %sa, 1
153*4e9fe860SFlorian Hahn  %cmp2 = icmp sge i64 %sb, %add
154*4e9fe860SFlorian Hahn  ret i1 %cmp2
155*4e9fe860SFlorian Hahn
156*4e9fe860SFlorian Hahnelse:
157*4e9fe860SFlorian Hahn  ret i1 false
158*4e9fe860SFlorian Hahn}
159*4e9fe860SFlorian Hahn
160*4e9fe860SFlorian Hahndefine i1 @cmp_sext_unknown_increment(i32 %a, i32 %b, i64 %c){
161*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_unknown_increment(
162*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]]) {
163*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
164*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
165*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
166*4e9fe860SFlorian Hahn; CHECK:       then:
167*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SA:%.*]] = sext i32 [[A]] to i64
168*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SB:%.*]] = sext i32 [[B]] to i64
169*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], [[C]]
170*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
171*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 [[CMP2]]
172*4e9fe860SFlorian Hahn; CHECK:       else:
173*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 false
174*4e9fe860SFlorian Hahn;
175*4e9fe860SFlorian Hahnentry:
176*4e9fe860SFlorian Hahn  %cmp = icmp slt i32 %a, %b
177*4e9fe860SFlorian Hahn  br i1 %cmp, label %then, label %else
178*4e9fe860SFlorian Hahn
179*4e9fe860SFlorian Hahnthen:
180*4e9fe860SFlorian Hahn  %sa = sext i32 %a to i64
181*4e9fe860SFlorian Hahn  %sb = sext i32 %b to i64
182*4e9fe860SFlorian Hahn  %add = add nsw i64 %sa, %c
183*4e9fe860SFlorian Hahn  %cmp2 = icmp sge i64 %sb, %add
184*4e9fe860SFlorian Hahn  ret i1 %cmp2
185*4e9fe860SFlorian Hahn
186*4e9fe860SFlorian Hahnelse:
187*4e9fe860SFlorian Hahn  ret i1 false
188*4e9fe860SFlorian Hahn}
189*4e9fe860SFlorian Hahn
190*4e9fe860SFlorian Hahndefine i1 @cmp_sext_sgt(i32 %a, i32 %b){
191*4e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_sgt(
192*4e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
193*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
194*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
195*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
196*4e9fe860SFlorian Hahn; CHECK:       then:
197*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SA:%.*]] = sext i32 [[A]] to i64
198*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[SB:%.*]] = sext i32 [[B]] to i64
199*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
200*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i64 [[SB]], [[ADD]]
201*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 [[CMP2]]
202*4e9fe860SFlorian Hahn; CHECK:       else:
203*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret i1 false
204*4e9fe860SFlorian Hahn;
205*4e9fe860SFlorian Hahnentry:
206*4e9fe860SFlorian Hahn  %cmp = icmp slt i32 %a, %b
207*4e9fe860SFlorian Hahn  br i1 %cmp, label %then, label %else
208*4e9fe860SFlorian Hahn
209*4e9fe860SFlorian Hahnthen:
210*4e9fe860SFlorian Hahn  %sa = sext i32 %a to i64
211*4e9fe860SFlorian Hahn  %sb = sext i32 %b to i64
212*4e9fe860SFlorian Hahn  %add = add nsw i64 %sa, 1
213*4e9fe860SFlorian Hahn  %cmp2 = icmp sgt i64 %sb, %add
214*4e9fe860SFlorian Hahn  ret i1 %cmp2
215*4e9fe860SFlorian Hahn
216*4e9fe860SFlorian Hahnelse:
217*4e9fe860SFlorian Hahn  ret i1 false
218*4e9fe860SFlorian Hahn}
219*4e9fe860SFlorian Hahn
220*4e9fe860SFlorian Hahndeclare void @use(i1)
221*4e9fe860SFlorian Hahn
222*4e9fe860SFlorian Hahndefine void @sge_sext(i16 %x, i32 %y) {
223*4e9fe860SFlorian Hahn; CHECK-LABEL: define void @sge_sext(
224*4e9fe860SFlorian Hahn; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
225*4e9fe860SFlorian Hahn; CHECK-NEXT:  entry:
226*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[X_EXT:%.*]] = sext i16 [[X]] to i32
227*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i32 [[X_EXT]], [[Y]]
228*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i32 [[Y]], -10
229*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
230*4e9fe860SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]]
231*4e9fe860SFlorian Hahn; CHECK:       bb1:
232*4e9fe860SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
233*4e9fe860SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
234*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp sge i32 [[X_EXT]], -9
235*4e9fe860SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
236*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sge i32 [[X_EXT]], -9
237*4e9fe860SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
238*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i32 [[Y]], [[X_EXT]]
239*4e9fe860SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
240*4e9fe860SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sge i16 [[X]], -9
241*4e9fe860SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
242*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret void
243*4e9fe860SFlorian Hahn; CHECK:       bb2:
244*4e9fe860SFlorian Hahn; CHECK-NEXT:    ret void
245*4e9fe860SFlorian Hahn;
246*4e9fe860SFlorian Hahnentry:
247*4e9fe860SFlorian Hahn  %x.ext = sext i16 %x to i32
248*4e9fe860SFlorian Hahn  %c.1 = icmp sge i32 %x.ext, %y
249*4e9fe860SFlorian Hahn  %c.2 = icmp sge i32 %y, -10
250*4e9fe860SFlorian Hahn  %and = and i1 %c.1, %c.2
251*4e9fe860SFlorian Hahn  br i1 %and, label %bb1, label %bb2
252*4e9fe860SFlorian Hahn
253*4e9fe860SFlorian Hahnbb1:
254*4e9fe860SFlorian Hahn  %t.1 = icmp sge i32 %x.ext, %y
255*4e9fe860SFlorian Hahn  call void @use(i1 %t.1)
256*4e9fe860SFlorian Hahn  %t.2 = icmp sge i16 %x, -10
257*4e9fe860SFlorian Hahn  call void @use(i1 %t.2)
258*4e9fe860SFlorian Hahn  %t.3 = icmp sge i32 %x.ext, -9
259*4e9fe860SFlorian Hahn  call void @use(i1 %t.3)
260*4e9fe860SFlorian Hahn  %c.3 = icmp sge i32 %x.ext, -9
261*4e9fe860SFlorian Hahn  call void @use(i1 %c.3)
262*4e9fe860SFlorian Hahn  %c.4 = icmp sge i32 %y, %x.ext
263*4e9fe860SFlorian Hahn  call void @use(i1 %c.4)
264*4e9fe860SFlorian Hahn  %c.5 = icmp sge i16 %x, -9
265*4e9fe860SFlorian Hahn  call void @use(i1 %c.5)
266*4e9fe860SFlorian Hahn  ret void
267*4e9fe860SFlorian Hahn
268*4e9fe860SFlorian Hahnbb2:
269*4e9fe860SFlorian Hahn  ret void
270*4e9fe860SFlorian Hahn}
271