@@ -16,12 +16,7 @@ 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: [[SUB:%.*]] = sub i32 0, [[A:%.*]]
20
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SUB]], [[A]]
21
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[AND]], i1 true), !range !0
22
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0
23
- ; CHECK-NEXT: [[SUB1:%.*]] = xor i32 [[LZ]], 31
24
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i32 [[LZ]], i32 [[SUB1]]
19
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 true), !range !0
25
20
; CHECK-NEXT: ret i32 [[COND]]
26
21
;
27
22
%sub = sub i32 0 , %a
@@ -35,12 +30,7 @@ define i32 @select_clz_to_ctz(i32 %a) {
35
30
36
31
define i32 @select_clz_to_ctz_preserve_flag (i32 %a ) {
37
32
; CHECK-LABEL: @select_clz_to_ctz_preserve_flag(
38
- ; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A:%.*]]
39
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SUB]], [[A]]
40
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[AND]], i1 false), !range !0
41
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0
42
- ; CHECK-NEXT: [[SUB1:%.*]] = xor i32 [[LZ]], 31
43
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i32 [[LZ]], i32 [[SUB1]]
33
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 false), !range !0
44
34
; CHECK-NEXT: ret i32 [[COND]]
45
35
;
46
36
%sub = sub i32 0 , %a
@@ -54,12 +44,7 @@ define i32 @select_clz_to_ctz_preserve_flag(i32 %a) {
54
44
55
45
define <2 x i32 > @select_clz_to_ctz_vec (<2 x i32 > %a ) {
56
46
; CHECK-LABEL: @select_clz_to_ctz_vec(
57
- ; CHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> zeroinitializer, [[A:%.*]]
58
- ; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[SUB]], [[A]]
59
- ; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[AND]], i1 true)
60
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq <2 x i32> [[A]], zeroinitializer
61
- ; CHECK-NEXT: [[SUB1:%.*]] = xor <2 x i32> [[LZ]], <i32 31, i32 31>
62
- ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[TOBOOL]], <2 x i32> [[LZ]], <2 x i32> [[SUB1]]
47
+ ; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[A:%.*]], i1 true)
63
48
; CHECK-NEXT: ret <2 x i32> [[COND]]
64
49
;
65
50
%sub = sub <2 x i32 > zeroinitializer , %a
@@ -76,10 +61,9 @@ define i32 @select_clz_to_ctz_extra_use(i32 %a) {
76
61
; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A:%.*]]
77
62
; CHECK-NEXT: [[AND:%.*]] = and i32 [[SUB]], [[A]]
78
63
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[AND]], i1 true), !range !0
79
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0
80
64
; CHECK-NEXT: [[SUB1:%.*]] = xor i32 [[LZ]], 31
81
65
; CHECK-NEXT: call void @use(i32 [[SUB1]])
82
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL ]], i32 [[LZ]], i32 [[SUB1]]
66
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.cttz.i32(i32 [[A ]], i1 true), !range !0
83
67
; CHECK-NEXT: ret i32 [[COND]]
84
68
;
85
69
%sub = sub i32 0 , %a
@@ -94,12 +78,7 @@ define i32 @select_clz_to_ctz_extra_use(i32 %a) {
94
78
95
79
define i32 @select_clz_to_ctz_and_commuted (i32 %a ) {
96
80
; CHECK-LABEL: @select_clz_to_ctz_and_commuted(
97
- ; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A:%.*]]
98
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SUB]], [[A]]
99
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[AND]], i1 true), !range !0
100
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0
101
- ; CHECK-NEXT: [[SUB1:%.*]] = xor i32 [[LZ]], 31
102
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i32 [[LZ]], i32 [[SUB1]]
81
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.cttz.i32(i32 [[A:%.*]], i1 true), !range !0
103
82
; CHECK-NEXT: ret i32 [[COND]]
104
83
;
105
84
%sub = sub i32 0 , %a
@@ -113,13 +92,9 @@ define i32 @select_clz_to_ctz_and_commuted(i32 %a) {
113
92
114
93
define i32 @select_clz_to_ctz_icmp_ne (i32 %a ) {
115
94
; CHECK-LABEL: @select_clz_to_ctz_icmp_ne(
116
- ; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A:%.*]]
117
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SUB]], [[A]]
118
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[AND]], i1 true), !range !0
119
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[A]], 0
95
+ ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[A:%.*]], 0
120
96
; CHECK-NEXT: call void @use2(i1 [[TOBOOL]])
121
- ; CHECK-NEXT: [[SUB1:%.*]] = xor i32 [[LZ]], 31
122
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i32 [[SUB1]], i32 [[LZ]]
97
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.cttz.i32(i32 [[A]], i1 true), !range !0
123
98
; CHECK-NEXT: ret i32 [[COND]]
124
99
;
125
100
%sub = sub i32 0 , %a
@@ -134,12 +109,7 @@ define i32 @select_clz_to_ctz_icmp_ne(i32 %a) {
134
109
135
110
define i64 @select_clz_to_ctz_i64 (i64 %a ) {
136
111
; CHECK-LABEL: @select_clz_to_ctz_i64(
137
- ; CHECK-NEXT: [[SUB:%.*]] = sub i64 0, [[A:%.*]]
138
- ; CHECK-NEXT: [[AND:%.*]] = and i64 [[SUB]], [[A]]
139
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i64 @llvm.ctlz.i64(i64 [[AND]], i1 true), !range !1
140
- ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[A]], 0
141
- ; CHECK-NEXT: [[SUB1:%.*]] = xor i64 [[LZ]], 63
142
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i64 [[LZ]], i64 [[SUB1]]
112
+ ; CHECK-NEXT: [[COND:%.*]] = call i64 @llvm.cttz.i64(i64 [[A:%.*]], i1 true), !range !1
143
113
; CHECK-NEXT: ret i64 [[COND]]
144
114
;
145
115
%sub = sub i64 0 , %a
0 commit comments