1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
6 define i1 @fold_sext_to_and(i8 %x) {
7 ; CHECK-LABEL: define i1 @fold_sext_to_and(
8 ; CHECK-SAME: i8 [[X:%.*]]) {
9 ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -127
10 ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 1
11 ; CHECK-NEXT: ret i1 [[TMP3]]
13 %1 = sext i8 %x to i32
14 %2 = and i32 %1, -2147483647
15 %3 = icmp eq i32 %2, 1
19 define i1 @fold_sext_to_and1(i8 %x) {
20 ; CHECK-LABEL: define i1 @fold_sext_to_and1(
21 ; CHECK-SAME: i8 [[X:%.*]]) {
22 ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -127
23 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 1
24 ; CHECK-NEXT: ret i1 [[TMP3]]
26 %1 = sext i8 %x to i32
27 %2 = and i32 %1, -2147483647
28 %3 = icmp ne i32 %2, 1
32 define i1 @fold_sext_to_and2(i8 %x) {
33 ; CHECK-LABEL: define i1 @fold_sext_to_and2(
34 ; CHECK-SAME: i8 [[X:%.*]]) {
35 ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -126
36 ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 2
37 ; CHECK-NEXT: ret i1 [[TMP3]]
39 %1 = sext i8 %x to i32
40 %2 = and i32 %1, 1073741826
41 %3 = icmp eq i32 %2, 2
45 define i1 @fold_sext_to_and3(i8 %x) {
46 ; CHECK-LABEL: define i1 @fold_sext_to_and3(
47 ; CHECK-SAME: i8 [[X:%.*]]) {
48 ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -126
49 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 2
50 ; CHECK-NEXT: ret i1 [[TMP3]]
52 %1 = sext i8 %x to i32
53 %2 = and i32 %1, 1073741826
54 %3 = icmp ne i32 %2, 2
58 define i1 @fold_sext_to_and_multi_use(i8 %x) {
59 ; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use(
60 ; CHECK-SAME: i8 [[X:%.*]]) {
61 ; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
62 ; CHECK-NEXT: call void @use(i32 [[TMP1]])
63 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -127
64 ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 1
65 ; CHECK-NEXT: ret i1 [[TMP3]]
67 %1 = sext i8 %x to i32
68 call void @use(i32 %1)
69 %2 = and i32 %1, -2147483647
70 %3 = icmp eq i32 %2, 1
74 define i1 @fold_sext_to_and_multi_use1(i8 %x) {
75 ; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use1(
76 ; CHECK-SAME: i8 [[X:%.*]]) {
77 ; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
78 ; CHECK-NEXT: call void @use(i32 [[TMP1]])
79 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -127
80 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 1
81 ; CHECK-NEXT: ret i1 [[TMP3]]
83 %1 = sext i8 %x to i32
84 call void @use(i32 %1)
85 %2 = and i32 %1, -2147483647
86 %3 = icmp ne i32 %2, 1
90 define i1 @fold_sext_to_and_multi_use2(i8 %x) {
91 ; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use2(
92 ; CHECK-SAME: i8 [[X:%.*]]) {
93 ; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
94 ; CHECK-NEXT: call void @use(i32 [[TMP1]])
95 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -126
96 ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 2
97 ; CHECK-NEXT: ret i1 [[TMP3]]
99 %1 = sext i8 %x to i32
100 call void @use(i32 %1)
101 %2 = and i32 %1, 1073741826
102 %3 = icmp eq i32 %2, 2
106 define i1 @fold_sext_to_and_multi_use3(i8 %x) {
107 ; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use3(
108 ; CHECK-SAME: i8 [[X:%.*]]) {
109 ; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
110 ; CHECK-NEXT: call void @use(i32 [[TMP1]])
111 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -126
112 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 2
113 ; CHECK-NEXT: ret i1 [[TMP3]]
115 %1 = sext i8 %x to i32
116 call void @use(i32 %1)
117 %2 = and i32 %1, 1073741826
118 %3 = icmp ne i32 %2, 2
124 define i1 @fold_sext_to_and_wrong(i8 %x) {
125 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong(
126 ; CHECK-SAME: i8 [[X:%.*]]) {
127 ; CHECK-NEXT: ret i1 false
129 %1 = sext i8 %x to i32
130 %2 = and i32 %1, -2147483647
131 %3 = icmp eq i32 %2, -1
135 define i1 @fold_sext_to_and_wrong2(i8 %x) {
136 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong2(
137 ; CHECK-SAME: i8 [[X:%.*]]) {
138 ; CHECK-NEXT: ret i1 false
140 %1 = sext i8 %x to i32
141 %2 = and i32 %1, -2147483647
142 %3 = icmp eq i32 %2, 128
146 define i1 @fold_sext_to_and_wrong3(i8 %x) {
147 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong3(
148 ; CHECK-SAME: i8 [[X:%.*]]) {
149 ; CHECK-NEXT: ret i1 false
151 %1 = sext i8 %x to i32
153 %3 = icmp eq i32 %2, -2147483648
157 define i1 @fold_sext_to_and_wrong4(i8 %x) {
158 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong4(
159 ; CHECK-SAME: i8 [[X:%.*]]) {
160 ; CHECK-NEXT: ret i1 false
162 %1 = sext i8 %x to i32
164 %3 = icmp eq i32 %2, 1
168 define i1 @fold_sext_to_and_wrong5(i8 %x) {
169 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong5(
170 ; CHECK-SAME: i8 [[X:%.*]]) {
171 ; CHECK-NEXT: ret i1 false
173 %1 = sext i8 %x to i32
174 %2 = and i32 %1, -256
175 %3 = icmp eq i32 %2, 1
179 define i1 @fold_sext_to_and_wrong6(i8 %x) {
180 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong6(
181 ; CHECK-SAME: i8 [[X:%.*]]) {
182 ; CHECK-NEXT: ret i1 true
184 %1 = sext i8 %x to i32
185 %2 = and i32 %1, -2147483647
186 %3 = icmp ne i32 %2, -1
190 define i1 @fold_sext_to_and_wrong7(i8 %x) {
191 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong7(
192 ; CHECK-SAME: i8 [[X:%.*]]) {
193 ; CHECK-NEXT: ret i1 true
195 %1 = sext i8 %x to i32
196 %2 = and i32 %1, -2147483647
197 %3 = icmp ne i32 %2, 128
201 define i1 @fold_sext_to_and_wrong8(i8 %x) {
202 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong8(
203 ; CHECK-SAME: i8 [[X:%.*]]) {
204 ; CHECK-NEXT: ret i1 true
206 %1 = sext i8 %x to i32
208 %3 = icmp ne i32 %2, -2147483648
212 define i1 @fold_sext_to_and_wrong9(i8 %x) {
213 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong9(
214 ; CHECK-SAME: i8 [[X:%.*]]) {
215 ; CHECK-NEXT: ret i1 true
217 %1 = sext i8 %x to i32
219 %3 = icmp ne i32 %2, 1
223 define i1 @fold_sext_to_and_wrong10(i8 %x) {
224 ; CHECK-LABEL: define i1 @fold_sext_to_and_wrong10(
225 ; CHECK-SAME: i8 [[X:%.*]]) {
226 ; CHECK-NEXT: ret i1 true
228 %1 = sext i8 %x to i32
229 %2 = and i32 %1, -256
230 %3 = icmp ne i32 %2, 1