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