xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/trunc.ll (revision 5fa59edfa73a69ab146d7b9cc115de5770d11dca)
1*5fa59edfSYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2*5fa59edfSYingwei Zheng; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3*5fa59edfSYingwei Zheng
4*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_zext_icmp_trunc_nuw(i16 %x, i32 %y) {
5*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc_nuw(
6*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
7*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = zext i16 [[X]] to i32
8*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]]
9*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
10*5fa59edfSYingwei Zheng; CHECK:       [[IF_THEN]]:
11*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CONV:%.*]] = trunc nuw i32 [[Y]] to i16
12*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
13*5fa59edfSYingwei Zheng; CHECK:       [[IF_ELSE]]:
14*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
15*5fa59edfSYingwei Zheng;
16*5fa59edfSYingwei Zheng  %ext = zext i16 %x to i32
17*5fa59edfSYingwei Zheng  %cond = icmp ult i32 %y, %ext
18*5fa59edfSYingwei Zheng  br i1 %cond, label %if.then, label %if.else
19*5fa59edfSYingwei Zheng
20*5fa59edfSYingwei Zhengif.then:
21*5fa59edfSYingwei Zheng  %conv = trunc nuw i32 %y to i16
22*5fa59edfSYingwei Zheng  %cmp = icmp eq i16 %x, %conv
23*5fa59edfSYingwei Zheng  ret i1 %cmp
24*5fa59edfSYingwei Zheng
25*5fa59edfSYingwei Zhengif.else:
26*5fa59edfSYingwei Zheng  ret i1 false
27*5fa59edfSYingwei Zheng}
28*5fa59edfSYingwei Zheng
29*5fa59edfSYingwei Zhengdefine i1 @test_icmp_slt_sext_icmp_trunc_nsw(i16 %x, i32 %y) {
30*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_slt_sext_icmp_trunc_nsw(
31*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
32*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = sext i16 [[X]] to i32
33*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[Y]], [[EXT]]
34*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
35*5fa59edfSYingwei Zheng; CHECK:       [[IF_THEN]]:
36*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CONV:%.*]] = trunc nsw i32 [[Y]] to i16
37*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
38*5fa59edfSYingwei Zheng; CHECK:       [[IF_ELSE]]:
39*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
40*5fa59edfSYingwei Zheng;
41*5fa59edfSYingwei Zheng  %ext = sext i16 %x to i32
42*5fa59edfSYingwei Zheng  %cond = icmp slt i32 %y, %ext
43*5fa59edfSYingwei Zheng  br i1 %cond, label %if.then, label %if.else
44*5fa59edfSYingwei Zheng
45*5fa59edfSYingwei Zhengif.then:
46*5fa59edfSYingwei Zheng  %conv = trunc nsw i32 %y to i16
47*5fa59edfSYingwei Zheng  %cmp = icmp slt i16 %x, %conv
48*5fa59edfSYingwei Zheng  ret i1 %cmp
49*5fa59edfSYingwei Zheng
50*5fa59edfSYingwei Zhengif.else:
51*5fa59edfSYingwei Zheng  ret i1 false
52*5fa59edfSYingwei Zheng}
53*5fa59edfSYingwei Zheng
54*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_trunc_nsw_nneg_icmp_trunc_nuw(i64 %x, i32 %y) {
55*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_trunc_nsw_nneg_icmp_trunc_nuw(
56*5fa59edfSYingwei Zheng; CHECK-SAME: i64 [[X:%.*]], i32 [[Y:%.*]]) {
57*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = trunc nsw i64 [[X]] to i32
58*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[NNEG:%.*]] = icmp sgt i64 [[X]], -1
59*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]]
60*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i1 [[NNEG]], [[COND]]
61*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[AND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
62*5fa59edfSYingwei Zheng; CHECK:       [[IF_THEN]]:
63*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CONV:%.*]] = zext i32 [[Y]] to i64
64*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
65*5fa59edfSYingwei Zheng; CHECK:       [[IF_ELSE]]:
66*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
67*5fa59edfSYingwei Zheng;
68*5fa59edfSYingwei Zheng  %ext = trunc nsw i64 %x to i32
69*5fa59edfSYingwei Zheng  %nneg = icmp sgt i64 %x, -1
70*5fa59edfSYingwei Zheng  %cond = icmp ult i32 %y, %ext
71*5fa59edfSYingwei Zheng  %and = and i1 %nneg, %cond
72*5fa59edfSYingwei Zheng  br i1 %and, label %if.then, label %if.else
73*5fa59edfSYingwei Zheng
74*5fa59edfSYingwei Zhengif.then:
75*5fa59edfSYingwei Zheng  %conv = zext i32 %y to i64
76*5fa59edfSYingwei Zheng  %cmp = icmp eq i64 %x, %conv
77*5fa59edfSYingwei Zheng  ret i1 %cmp
78*5fa59edfSYingwei Zheng
79*5fa59edfSYingwei Zhengif.else:
80*5fa59edfSYingwei Zheng  ret i1 false
81*5fa59edfSYingwei Zheng}
82*5fa59edfSYingwei Zheng
83*5fa59edfSYingwei Zhengdefine i1 @test2(i32 %n) {
84*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test2(
85*5fa59edfSYingwei Zheng; CHECK-SAME: i32 [[N:%.*]]) {
86*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = icmp sgt i32 [[N]], 0
87*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
88*5fa59edfSYingwei Zheng; CHECK:       [[IF_THEN]]:
89*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i32 [[N]] to i64
90*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[END:%.*]] = add nsw i64 [[EXT]], -1
91*5fa59edfSYingwei Zheng; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
92*5fa59edfSYingwei Zheng; CHECK:       [[FOR_BODY]]:
93*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[INDVAR:%.*]] = phi i64 [ 0, %[[IF_THEN]] ], [ [[INDVAR_NEXT:%.*]], %[[FOR_NEXT:.*]] ]
94*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[INDVAR]], [[END]]
95*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_ELSE]], label %[[FOR_NEXT]]
96*5fa59edfSYingwei Zheng; CHECK:       [[FOR_NEXT]]:
97*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[INDVAR_NEXT]] = add nuw nsw i64 [[INDVAR]], 1
98*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = call i1 @cond()
99*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[COND2]], label %[[FOR_BODY]], label %[[FOR_END:.*]]
100*5fa59edfSYingwei Zheng; CHECK:       [[FOR_END]]:
101*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[TRUNC:%.*]] = trunc nsw i64 [[INDVAR_NEXT]] to i32
102*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 true
103*5fa59edfSYingwei Zheng; CHECK:       [[IF_ELSE]]:
104*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
105*5fa59edfSYingwei Zheng;
106*5fa59edfSYingwei Zheng  %cond = icmp sgt i32 %n, 0
107*5fa59edfSYingwei Zheng  br i1 %cond, label %if.then, label %if.else
108*5fa59edfSYingwei Zheng
109*5fa59edfSYingwei Zhengif.then:
110*5fa59edfSYingwei Zheng  %ext = zext nneg i32 %n to i64
111*5fa59edfSYingwei Zheng  %end = add nsw i64 %ext, -1
112*5fa59edfSYingwei Zheng  br label %for.body
113*5fa59edfSYingwei Zheng
114*5fa59edfSYingwei Zhengfor.body:
115*5fa59edfSYingwei Zheng  %indvar = phi i64 [ 0, %if.then ], [ %indvar.next, %for.next ]
116*5fa59edfSYingwei Zheng  %cmp = icmp eq i64 %indvar, %end
117*5fa59edfSYingwei Zheng  br i1 %cmp, label %if.else, label %for.next
118*5fa59edfSYingwei Zheng
119*5fa59edfSYingwei Zhengfor.next:
120*5fa59edfSYingwei Zheng  %indvar.next = add nuw nsw i64 %indvar, 1
121*5fa59edfSYingwei Zheng  %cond2 = call i1 @cond()
122*5fa59edfSYingwei Zheng  br i1 %cond2, label %for.body, label %for.end
123*5fa59edfSYingwei Zheng
124*5fa59edfSYingwei Zhengfor.end:
125*5fa59edfSYingwei Zheng  %trunc = trunc nsw i64 %indvar.next to i32
126*5fa59edfSYingwei Zheng  %res = icmp sgt i32 %n, %trunc
127*5fa59edfSYingwei Zheng  ret i1 %res
128*5fa59edfSYingwei Zheng
129*5fa59edfSYingwei Zhengif.else:
130*5fa59edfSYingwei Zheng  ret i1 false
131*5fa59edfSYingwei Zheng}
132*5fa59edfSYingwei Zheng
133*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_zext_icmp_trunc(i16 %x, i32 %y) {
134*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc(
135*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
136*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = zext i16 [[X]] to i32
137*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]]
138*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
139*5fa59edfSYingwei Zheng; CHECK:       [[IF_THEN]]:
140*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CONV:%.*]] = trunc i32 [[Y]] to i16
141*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]]
142*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
143*5fa59edfSYingwei Zheng; CHECK:       [[IF_ELSE]]:
144*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
145*5fa59edfSYingwei Zheng;
146*5fa59edfSYingwei Zheng  %ext = zext i16 %x to i32
147*5fa59edfSYingwei Zheng  %cond = icmp ult i32 %y, %ext
148*5fa59edfSYingwei Zheng  br i1 %cond, label %if.then, label %if.else
149*5fa59edfSYingwei Zheng
150*5fa59edfSYingwei Zhengif.then:
151*5fa59edfSYingwei Zheng  %conv = trunc i32 %y to i16
152*5fa59edfSYingwei Zheng  %cmp = icmp eq i16 %x, %conv
153*5fa59edfSYingwei Zheng  ret i1 %cmp
154*5fa59edfSYingwei Zheng
155*5fa59edfSYingwei Zhengif.else:
156*5fa59edfSYingwei Zheng  ret i1 false
157*5fa59edfSYingwei Zheng}
158*5fa59edfSYingwei Zheng
159*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_zext_icmp_trunc_nuw_i128(i16 %x, i128 %y) {
160*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc_nuw_i128(
161*5fa59edfSYingwei Zheng; CHECK-SAME: i16 [[X:%.*]], i128 [[Y:%.*]]) {
162*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = zext i16 [[X]] to i128
163*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = icmp ult i128 [[Y]], [[EXT]]
164*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
165*5fa59edfSYingwei Zheng; CHECK:       [[IF_THEN]]:
166*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CONV:%.*]] = trunc nuw i128 [[Y]] to i16
167*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]]
168*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
169*5fa59edfSYingwei Zheng; CHECK:       [[IF_ELSE]]:
170*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
171*5fa59edfSYingwei Zheng;
172*5fa59edfSYingwei Zheng  %ext = zext i16 %x to i128
173*5fa59edfSYingwei Zheng  %cond = icmp ult i128 %y, %ext
174*5fa59edfSYingwei Zheng  br i1 %cond, label %if.then, label %if.else
175*5fa59edfSYingwei Zheng
176*5fa59edfSYingwei Zhengif.then:
177*5fa59edfSYingwei Zheng  %conv = trunc nuw i128 %y to i16
178*5fa59edfSYingwei Zheng  %cmp = icmp eq i16 %x, %conv
179*5fa59edfSYingwei Zheng  ret i1 %cmp
180*5fa59edfSYingwei Zheng
181*5fa59edfSYingwei Zhengif.else:
182*5fa59edfSYingwei Zheng  ret i1 false
183*5fa59edfSYingwei Zheng}
184*5fa59edfSYingwei Zheng
185*5fa59edfSYingwei Zheng; We do not know the sign of %x, so we cannot infer nuw for %ext.
186*5fa59edfSYingwei Zhengdefine i1 @test_icmp_ult_trunc_nsw_icmp_trunc_nuw(i64 %x, i32 %y) {
187*5fa59edfSYingwei Zheng; CHECK-LABEL: define i1 @test_icmp_ult_trunc_nsw_icmp_trunc_nuw(
188*5fa59edfSYingwei Zheng; CHECK-SAME: i64 [[X:%.*]], i32 [[Y:%.*]]) {
189*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = trunc nsw i64 [[X]] to i32
190*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]]
191*5fa59edfSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
192*5fa59edfSYingwei Zheng; CHECK:       [[IF_THEN]]:
193*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CONV:%.*]] = zext i32 [[Y]] to i64
194*5fa59edfSYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[X]], [[CONV]]
195*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
196*5fa59edfSYingwei Zheng; CHECK:       [[IF_ELSE]]:
197*5fa59edfSYingwei Zheng; CHECK-NEXT:    ret i1 false
198*5fa59edfSYingwei Zheng;
199*5fa59edfSYingwei Zheng  %ext = trunc nsw i64 %x to i32
200*5fa59edfSYingwei Zheng  %cond = icmp ult i32 %y, %ext
201*5fa59edfSYingwei Zheng  br i1 %cond, label %if.then, label %if.else
202*5fa59edfSYingwei Zheng
203*5fa59edfSYingwei Zhengif.then:
204*5fa59edfSYingwei Zheng  %conv = zext i32 %y to i64
205*5fa59edfSYingwei Zheng  %cmp = icmp eq i64 %x, %conv
206*5fa59edfSYingwei Zheng  ret i1 %cmp
207*5fa59edfSYingwei Zheng
208*5fa59edfSYingwei Zhengif.else:
209*5fa59edfSYingwei Zheng  ret i1 false
210*5fa59edfSYingwei Zheng}
211*5fa59edfSYingwei Zheng
212*5fa59edfSYingwei Zhengdeclare void @cond()
213