@@ -16,8 +16,8 @@ declare void @use2(i1)
16
16
17
17
define i32 @select_clz_to_ctz (i32 %a ) {
18
18
; CHECK-LABEL: @select_clz_to_ctz(
19
- ; CHECK-NEXT: [[COND :%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 true), !range [[RNG0:![0-9]+]]
20
- ; CHECK-NEXT: ret i32 [[COND ]]
19
+ ; CHECK-NEXT: [[SUB1 :%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 true), !range [[RNG0:![0-9]+]]
20
+ ; CHECK-NEXT: ret i32 [[SUB1 ]]
21
21
;
22
22
%sub = sub i32 0 , %a
23
23
%and = and i32 %sub , %a
@@ -74,8 +74,7 @@ define i32 @select_clz_to_ctz_extra_use(i32 %a) {
74
74
; CHECK-LABEL: @select_clz_to_ctz_extra_use(
75
75
; CHECK-NEXT: [[SUB1:%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 true), !range [[RNG0]]
76
76
; CHECK-NEXT: call void @use(i32 [[SUB1]])
77
- ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.cttz.i32(i32 [[A]], i1 true), !range [[RNG0]]
78
- ; CHECK-NEXT: ret i32 [[COND]]
77
+ ; CHECK-NEXT: ret i32 [[SUB1]]
79
78
;
80
79
%sub = sub i32 0 , %a
81
80
%and = and i32 %sub , %a
@@ -89,8 +88,8 @@ define i32 @select_clz_to_ctz_extra_use(i32 %a) {
89
88
90
89
define i32 @select_clz_to_ctz_and_commuted (i32 %a ) {
91
90
; CHECK-LABEL: @select_clz_to_ctz_and_commuted(
92
- ; CHECK-NEXT: [[COND :%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 true), !range [[RNG0]]
93
- ; CHECK-NEXT: ret i32 [[COND ]]
91
+ ; CHECK-NEXT: [[SUB1 :%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 true), !range [[RNG0]]
92
+ ; CHECK-NEXT: ret i32 [[SUB1 ]]
94
93
;
95
94
%sub = sub i32 0 , %a
96
95
%and = and i32 %a , %sub
@@ -105,8 +104,8 @@ define i32 @select_clz_to_ctz_icmp_ne(i32 %a) {
105
104
; CHECK-LABEL: @select_clz_to_ctz_icmp_ne(
106
105
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[A:%.*]], 0
107
106
; CHECK-NEXT: call void @use2(i1 [[TOBOOL]])
108
- ; CHECK-NEXT: [[COND :%.*]] = call i32 @llvm.cttz.i32(i32 [[A]], i1 true), !range [[RNG0]]
109
- ; CHECK-NEXT: ret i32 [[COND ]]
107
+ ; CHECK-NEXT: [[SUB1 :%.*]] = call i32 @llvm.cttz.i32(i32 [[A]], i1 true), !range [[RNG0]]
108
+ ; CHECK-NEXT: ret i32 [[SUB1 ]]
110
109
;
111
110
%sub = sub i32 0 , %a
112
111
%and = and i32 %sub , %a
@@ -120,8 +119,8 @@ define i32 @select_clz_to_ctz_icmp_ne(i32 %a) {
120
119
121
120
define i64 @select_clz_to_ctz_i64 (i64 %a ) {
122
121
; CHECK-LABEL: @select_clz_to_ctz_i64(
123
- ; CHECK-NEXT: [[COND :%.*]] = call i64 @llvm.cttz.i64(i64 [[A:%.*]], i1 true), !range [[RNG1:![0-9]+]]
124
- ; CHECK-NEXT: ret i64 [[COND ]]
122
+ ; CHECK-NEXT: [[SUB1 :%.*]] = call i64 @llvm.cttz.i64(i64 [[A:%.*]], i1 true), !range [[RNG1:![0-9]+]]
123
+ ; CHECK-NEXT: ret i64 [[SUB1 ]]
125
124
;
126
125
%sub = sub i64 0 , %a
127
126
%and = and i64 %sub , %a
@@ -139,10 +138,8 @@ define i32 @select_clz_to_ctz_wrong_sub(i32 %a) {
139
138
; CHECK-NEXT: [[SUB:%.*]] = sub i32 1, [[A:%.*]]
140
139
; CHECK-NEXT: [[AND:%.*]] = and i32 [[SUB]], [[A]]
141
140
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[AND]], i1 true), !range [[RNG0]]
142
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0
143
141
; CHECK-NEXT: [[SUB1:%.*]] = xor i32 [[LZ]], 31
144
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i32 [[LZ]], i32 [[SUB1]]
145
- ; CHECK-NEXT: ret i32 [[COND]]
142
+ ; CHECK-NEXT: ret i32 [[SUB1]]
146
143
;
147
144
%sub = sub i32 1 , %a
148
145
%and = and i32 %sub , %a
@@ -159,10 +156,8 @@ define i64 @select_clz_to_ctz_i64_wrong_xor(i64 %a) {
159
156
; CHECK-NEXT: [[SUB:%.*]] = sub i64 0, [[A:%.*]]
160
157
; CHECK-NEXT: [[AND:%.*]] = and i64 [[SUB]], [[A]]
161
158
; CHECK-NEXT: [[LZ:%.*]] = tail call i64 @llvm.ctlz.i64(i64 [[AND]], i1 true), !range [[RNG1]]
162
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[A]], 0
163
159
; CHECK-NEXT: [[SUB11:%.*]] = or i64 [[LZ]], 64
164
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i64 [[LZ]], i64 [[SUB11]]
165
- ; CHECK-NEXT: ret i64 [[COND]]
160
+ ; CHECK-NEXT: ret i64 [[SUB11]]
166
161
;
167
162
%sub = sub i64 0 , %a
168
163
%and = and i64 %sub , %a
@@ -175,12 +170,9 @@ define i64 @select_clz_to_ctz_i64_wrong_xor(i64 %a) {
175
170
176
171
define i64 @select_clz_to_ctz_i64_wrong_icmp_cst (i64 %a ) {
177
172
; CHECK-LABEL: @select_clz_to_ctz_i64_wrong_icmp_cst(
178
- ; CHECK-NEXT: [[SUB:%.*]] = sub i64 0, [[A:%.*]]
179
- ; CHECK-NEXT: [[AND:%.*]] = and i64 [[SUB]], [[A]]
180
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i64 @llvm.ctlz.i64(i64 [[AND]], i1 true), !range [[RNG1]]
181
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[A]], 1
182
- ; CHECK-NEXT: [[SUB1:%.*]] = xor i64 [[LZ]], 63
183
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i64 [[LZ]], i64 [[SUB1]]
173
+ ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[A:%.*]], 1
174
+ ; CHECK-NEXT: [[SUB1:%.*]] = call i64 @llvm.cttz.i64(i64 [[A]], i1 true), !range [[RNG1]]
175
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i64 63, i64 [[SUB1]]
184
176
; CHECK-NEXT: ret i64 [[COND]]
185
177
;
186
178
%sub = sub i64 0 , %a
@@ -255,8 +247,8 @@ define i4 @PR45762(i3 %x4) {
255
247
; CHECK-NEXT: [[T7:%.*]] = zext i3 [[T4]] to i4
256
248
; CHECK-NEXT: [[ONE_HOT_16:%.*]] = shl nuw i4 1, [[T7]]
257
249
; CHECK-NEXT: [[OR_69_NOT:%.*]] = icmp eq i3 [[X4]], 0
258
- ; CHECK-NEXT: [[UMUL_231:%.*]] = select i1 [[OR_69_NOT ]], i4 0, i4 [[T7]]
259
- ; CHECK-NEXT: [[SEL_71:%.*]] = shl i4 [[ONE_HOT_16 ]], [[UMUL_231]]
250
+ ; CHECK-NEXT: [[UMUL_231:%.*]] = shl i4 [[ONE_HOT_16 ]], [[T7]]
251
+ ; CHECK-NEXT: [[SEL_71:%.*]] = select i1 [[OR_69_NOT ]], i4 -8, i4 [[UMUL_231]]
260
252
; CHECK-NEXT: ret i4 [[SEL_71]]
261
253
;
262
254
%t4 = call i3 @llvm.cttz.i3 (i3 %x4 , i1 false )
@@ -284,8 +276,8 @@ define i4 @PR45762_logical(i3 %x4) {
284
276
; CHECK-NEXT: [[T7:%.*]] = zext i3 [[T4]] to i4
285
277
; CHECK-NEXT: [[ONE_HOT_16:%.*]] = shl nuw i4 1, [[T7]]
286
278
; CHECK-NEXT: [[OR_69_NOT:%.*]] = icmp eq i3 [[X4]], 0
287
- ; CHECK-NEXT: [[UMUL_231:%.*]] = select i1 [[OR_69_NOT ]], i4 0, i4 [[T7]]
288
- ; CHECK-NEXT: [[SEL_71:%.*]] = shl i4 [[ONE_HOT_16 ]], [[UMUL_231]]
279
+ ; CHECK-NEXT: [[UMUL_231:%.*]] = shl i4 [[ONE_HOT_16 ]], [[T7]]
280
+ ; CHECK-NEXT: [[SEL_71:%.*]] = select i1 [[OR_69_NOT ]], i4 -8, i4 [[UMUL_231]]
289
281
; CHECK-NEXT: ret i4 [[SEL_71]]
290
282
;
291
283
%t4 = call i3 @llvm.cttz.i3 (i3 %x4 , i1 false )
0 commit comments