xref: /llvm-project/llvm/test/Transforms/InstCombine/sext-and.ll (revision 6ad1dd3bdcc8f9bfdf9f6074c8dffe0675a2e4cf)
1*6ad1dd3bSLee Wei; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2*6ad1dd3bSLee Wei; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3*6ad1dd3bSLee Wei
4*6ad1dd3bSLee Weideclare void @use(i8)
5*6ad1dd3bSLee Wei
6*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and(i8 %x) {
7*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and(
8*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
9*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X]], -127
10*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 1
11*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
12*6ad1dd3bSLee Wei;
13*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
14*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
15*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, 1
16*6ad1dd3bSLee Wei  ret i1 %3
17*6ad1dd3bSLee Wei}
18*6ad1dd3bSLee Wei
19*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and1(i8 %x) {
20*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and1(
21*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
22*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X]], -127
23*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 1
24*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
25*6ad1dd3bSLee Wei;
26*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
27*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
28*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, 1
29*6ad1dd3bSLee Wei  ret i1 %3
30*6ad1dd3bSLee Wei}
31*6ad1dd3bSLee Wei
32*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and2(i8 %x) {
33*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and2(
34*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
35*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X]], -126
36*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 2
37*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
38*6ad1dd3bSLee Wei;
39*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
40*6ad1dd3bSLee Wei  %2 = and i32 %1, 1073741826
41*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, 2
42*6ad1dd3bSLee Wei  ret i1 %3
43*6ad1dd3bSLee Wei}
44*6ad1dd3bSLee Wei
45*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and3(i8 %x) {
46*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and3(
47*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
48*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X]], -126
49*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 2
50*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
51*6ad1dd3bSLee Wei;
52*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
53*6ad1dd3bSLee Wei  %2 = and i32 %1, 1073741826
54*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, 2
55*6ad1dd3bSLee Wei  ret i1 %3
56*6ad1dd3bSLee Wei}
57*6ad1dd3bSLee Wei
58*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use(i8 %x) {
59*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use(
60*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
61*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[X]] to i32
62*6ad1dd3bSLee Wei; CHECK-NEXT:    call void @use(i32 [[TMP1]])
63*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X]], -127
64*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 1
65*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
66*6ad1dd3bSLee Wei;
67*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
68*6ad1dd3bSLee Wei  call void @use(i32 %1)
69*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
70*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, 1
71*6ad1dd3bSLee Wei  ret i1 %3
72*6ad1dd3bSLee Wei}
73*6ad1dd3bSLee Wei
74*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use1(i8 %x) {
75*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use1(
76*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
77*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[X]] to i32
78*6ad1dd3bSLee Wei; CHECK-NEXT:    call void @use(i32 [[TMP1]])
79*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X]], -127
80*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 1
81*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
82*6ad1dd3bSLee Wei;
83*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
84*6ad1dd3bSLee Wei  call void @use(i32 %1)
85*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
86*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, 1
87*6ad1dd3bSLee Wei  ret i1 %3
88*6ad1dd3bSLee Wei}
89*6ad1dd3bSLee Wei
90*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use2(i8 %x) {
91*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use2(
92*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
93*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[X]] to i32
94*6ad1dd3bSLee Wei; CHECK-NEXT:    call void @use(i32 [[TMP1]])
95*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X]], -126
96*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 2
97*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
98*6ad1dd3bSLee Wei;
99*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
100*6ad1dd3bSLee Wei  call void @use(i32 %1)
101*6ad1dd3bSLee Wei  %2 = and i32 %1, 1073741826
102*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, 2
103*6ad1dd3bSLee Wei  ret i1 %3
104*6ad1dd3bSLee Wei}
105*6ad1dd3bSLee Wei
106*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use3(i8 %x) {
107*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use3(
108*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
109*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[X]] to i32
110*6ad1dd3bSLee Wei; CHECK-NEXT:    call void @use(i32 [[TMP1]])
111*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X]], -126
112*6ad1dd3bSLee Wei; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 2
113*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 [[TMP3]]
114*6ad1dd3bSLee Wei;
115*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
116*6ad1dd3bSLee Wei  call void @use(i32 %1)
117*6ad1dd3bSLee Wei  %2 = and i32 %1, 1073741826
118*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, 2
119*6ad1dd3bSLee Wei  ret i1 %3
120*6ad1dd3bSLee Wei}
121*6ad1dd3bSLee Wei
122*6ad1dd3bSLee Wei; Negative tests
123*6ad1dd3bSLee Wei
124*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong(i8 %x) {
125*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong(
126*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
127*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 false
128*6ad1dd3bSLee Wei;
129*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
130*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
131*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, -1
132*6ad1dd3bSLee Wei  ret i1 %3
133*6ad1dd3bSLee Wei}
134*6ad1dd3bSLee Wei
135*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong2(i8 %x) {
136*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong2(
137*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
138*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 false
139*6ad1dd3bSLee Wei;
140*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
141*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
142*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, 128
143*6ad1dd3bSLee Wei  ret i1 %3
144*6ad1dd3bSLee Wei}
145*6ad1dd3bSLee Wei
146*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong3(i8 %x) {
147*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong3(
148*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
149*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 false
150*6ad1dd3bSLee Wei;
151*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
152*6ad1dd3bSLee Wei  %2 = and i32 %1, 128
153*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, -2147483648
154*6ad1dd3bSLee Wei  ret i1 %3
155*6ad1dd3bSLee Wei}
156*6ad1dd3bSLee Wei
157*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong4(i8 %x) {
158*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong4(
159*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
160*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 false
161*6ad1dd3bSLee Wei;
162*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
163*6ad1dd3bSLee Wei  %2 = and i32 %1, 128
164*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, 1
165*6ad1dd3bSLee Wei  ret i1 %3
166*6ad1dd3bSLee Wei}
167*6ad1dd3bSLee Wei
168*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong5(i8 %x) {
169*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong5(
170*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
171*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 false
172*6ad1dd3bSLee Wei;
173*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
174*6ad1dd3bSLee Wei  %2 = and i32 %1, -256
175*6ad1dd3bSLee Wei  %3 = icmp eq i32 %2, 1
176*6ad1dd3bSLee Wei  ret i1 %3
177*6ad1dd3bSLee Wei}
178*6ad1dd3bSLee Wei
179*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong6(i8 %x) {
180*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong6(
181*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
182*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 true
183*6ad1dd3bSLee Wei;
184*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
185*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
186*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, -1
187*6ad1dd3bSLee Wei  ret i1 %3
188*6ad1dd3bSLee Wei}
189*6ad1dd3bSLee Wei
190*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong7(i8 %x) {
191*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong7(
192*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
193*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 true
194*6ad1dd3bSLee Wei;
195*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
196*6ad1dd3bSLee Wei  %2 = and i32 %1, -2147483647
197*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, 128
198*6ad1dd3bSLee Wei  ret i1 %3
199*6ad1dd3bSLee Wei}
200*6ad1dd3bSLee Wei
201*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong8(i8 %x) {
202*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong8(
203*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
204*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 true
205*6ad1dd3bSLee Wei;
206*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
207*6ad1dd3bSLee Wei  %2 = and i32 %1, 128
208*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, -2147483648
209*6ad1dd3bSLee Wei  ret i1 %3
210*6ad1dd3bSLee Wei}
211*6ad1dd3bSLee Wei
212*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong9(i8 %x) {
213*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong9(
214*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
215*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 true
216*6ad1dd3bSLee Wei;
217*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
218*6ad1dd3bSLee Wei  %2 = and i32 %1, 128
219*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, 1
220*6ad1dd3bSLee Wei  ret i1 %3
221*6ad1dd3bSLee Wei}
222*6ad1dd3bSLee Wei
223*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong10(i8 %x) {
224*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong10(
225*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) {
226*6ad1dd3bSLee Wei; CHECK-NEXT:    ret i1 true
227*6ad1dd3bSLee Wei;
228*6ad1dd3bSLee Wei  %1 = sext i8 %x to i32
229*6ad1dd3bSLee Wei  %2 = and i32 %1, -256
230*6ad1dd3bSLee Wei  %3 = icmp ne i32 %2, 1
231*6ad1dd3bSLee Wei  ret i1 %3
232*6ad1dd3bSLee Wei}
233