6
6
#
7
7
# and (lshr x, cst), mask -> ubfx x, cst, width
8
8
9
+ # LSB = 5
10
+ # Width = LSB + trailing_ones(255) - 1 =
11
+ # 5 + 8 - 1 = 12
12
+
9
13
...
10
14
---
11
15
name : ubfx_s32
@@ -15,18 +19,16 @@ body: |
15
19
bb.0:
16
20
liveins: $w0
17
21
18
- ; LSB = 5
19
- ; Width = LSB + trailing_ones(255) - 1 =
20
- ; 5 + 8 - 1 = 12
21
22
22
23
; CHECK-LABEL: name: ubfx_s32
23
24
; CHECK: liveins: $w0
24
- ; CHECK: %x:_(s32) = COPY $w0
25
- ; CHECK: %lsb:_(s32) = G_CONSTANT i32 5
26
- ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
27
- ; CHECK: %and:_(s32) = G_UBFX %x, %lsb(s32), [[C]]
28
- ; CHECK: $w0 = COPY %and(s32)
29
- ; CHECK: RET_ReallyLR implicit $w0
25
+ ; CHECK-NEXT: {{ $}}
26
+ ; CHECK-NEXT: %x:_(s32) = COPY $w0
27
+ ; CHECK-NEXT: %lsb:_(s32) = G_CONSTANT i32 5
28
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
29
+ ; CHECK-NEXT: %and:_(s32) = G_UBFX %x, %lsb(s32), [[C]]
30
+ ; CHECK-NEXT: $w0 = COPY %and(s32)
31
+ ; CHECK-NEXT: RET_ReallyLR implicit $w0
30
32
%x:_(s32) = COPY $w0
31
33
%lsb:_(s32) = G_CONSTANT i32 5
32
34
%mask:_(s32) = G_CONSTANT i32 255
@@ -35,6 +37,10 @@ body: |
35
37
$w0 = COPY %and
36
38
RET_ReallyLR implicit $w0
37
39
40
+ # LSB = 5
41
+ # Width = LSB + trailing_ones(1) - 1 =
42
+ # 5 + 1 - 1 = 5
43
+
38
44
...
39
45
---
40
46
name : ubfx_s64
@@ -44,18 +50,15 @@ body: |
44
50
bb.0:
45
51
liveins: $x0
46
52
47
- ; LSB = 5
48
- ; Width = LSB + trailing_ones(1) - 1 =
49
- ; 5 + 1 - 1 = 5
50
-
51
53
; CHECK-LABEL: name: ubfx_s64
52
54
; CHECK: liveins: $x0
53
- ; CHECK: %x:_(s64) = COPY $x0
54
- ; CHECK: %lsb:_(s64) = G_CONSTANT i64 5
55
- ; CHECK: %mask:_(s64) = G_CONSTANT i64 1
56
- ; CHECK: %and:_(s64) = G_UBFX %x, %lsb(s64), %mask
57
- ; CHECK: $x0 = COPY %and(s64)
58
- ; CHECK: RET_ReallyLR implicit $x0
55
+ ; CHECK-NEXT: {{ $}}
56
+ ; CHECK-NEXT: %x:_(s64) = COPY $x0
57
+ ; CHECK-NEXT: %lsb:_(s64) = G_CONSTANT i64 5
58
+ ; CHECK-NEXT: %mask:_(s64) = G_CONSTANT i64 1
59
+ ; CHECK-NEXT: %and:_(s64) = G_UBFX %x, %lsb(s64), %mask
60
+ ; CHECK-NEXT: $x0 = COPY %and(s64)
61
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
59
62
%x:_(s64) = COPY $x0
60
63
%lsb:_(s64) = G_CONSTANT i64 5
61
64
%mask:_(s64) = G_CONSTANT i64 1
@@ -64,6 +67,8 @@ body: |
64
67
$x0 = COPY %and
65
68
RET_ReallyLR implicit $x0
66
69
70
+ # UBFX needs to be selected to UBFMWri/UBFMXri, so we need constants.
71
+
67
72
...
68
73
---
69
74
name : dont_combine_no_and_cst
@@ -73,17 +78,17 @@ body: |
73
78
bb.0:
74
79
liveins: $w0, $w1
75
80
76
- ; UBFX needs to be selected to UBFMWri/UBFMXri, so we need constants.
77
81
78
82
; CHECK-LABEL: name: dont_combine_no_and_cst
79
83
; CHECK: liveins: $w0, $w1
80
- ; CHECK: %x:_(s32) = COPY $w0
81
- ; CHECK: %y:_(s32) = COPY $w1
82
- ; CHECK: %lsb:_(s32) = G_CONSTANT i32 5
83
- ; CHECK: %shift:_(s32) = G_LSHR %x, %lsb(s32)
84
- ; CHECK: %and:_(s32) = G_AND %shift, %y
85
- ; CHECK: $w0 = COPY %and(s32)
86
- ; CHECK: RET_ReallyLR implicit $w0
84
+ ; CHECK-NEXT: {{ $}}
85
+ ; CHECK-NEXT: %x:_(s32) = COPY $w0
86
+ ; CHECK-NEXT: %y:_(s32) = COPY $w1
87
+ ; CHECK-NEXT: %lsb:_(s32) = G_CONSTANT i32 5
88
+ ; CHECK-NEXT: %shift:_(s32) = G_LSHR %x, %lsb(s32)
89
+ ; CHECK-NEXT: %and:_(s32) = G_AND %shift, %y
90
+ ; CHECK-NEXT: $w0 = COPY %and(s32)
91
+ ; CHECK-NEXT: RET_ReallyLR implicit $w0
87
92
%x:_(s32) = COPY $w0
88
93
%y:_(s32) = COPY $w1
89
94
%lsb:_(s32) = G_CONSTANT i32 5
@@ -102,13 +107,14 @@ body: |
102
107
liveins: $w0
103
108
; CHECK-LABEL: name: dont_combine_and_cst_not_mask
104
109
; CHECK: liveins: $w0
105
- ; CHECK: %x:_(s32) = COPY $w0
106
- ; CHECK: %lsb:_(s32) = G_CONSTANT i32 5
107
- ; CHECK: %not_a_mask:_(s32) = G_CONSTANT i32 2
108
- ; CHECK: %shift:_(s32) = G_LSHR %x, %lsb(s32)
109
- ; CHECK: %and:_(s32) = G_AND %shift, %not_a_mask
110
- ; CHECK: $w0 = COPY %and(s32)
111
- ; CHECK: RET_ReallyLR implicit $w0
110
+ ; CHECK-NEXT: {{ $}}
111
+ ; CHECK-NEXT: %x:_(s32) = COPY $w0
112
+ ; CHECK-NEXT: %lsb:_(s32) = G_CONSTANT i32 5
113
+ ; CHECK-NEXT: %not_a_mask:_(s32) = G_CONSTANT i32 2
114
+ ; CHECK-NEXT: %shift:_(s32) = G_LSHR %x, %lsb(s32)
115
+ ; CHECK-NEXT: %and:_(s32) = G_AND %shift, %not_a_mask
116
+ ; CHECK-NEXT: $w0 = COPY %and(s32)
117
+ ; CHECK-NEXT: RET_ReallyLR implicit $w0
112
118
%x:_(s32) = COPY $w0
113
119
%lsb:_(s32) = G_CONSTANT i32 5
114
120
%not_a_mask:_(s32) = G_CONSTANT i32 2
@@ -127,14 +133,15 @@ body: |
127
133
liveins: $x0
128
134
; CHECK-LABEL: name: dont_combine_shift_more_than_one_use
129
135
; CHECK: liveins: $x0
130
- ; CHECK: %x:_(s64) = COPY $x0
131
- ; CHECK: %lsb:_(s64) = G_CONSTANT i64 5
132
- ; CHECK: %mask:_(s64) = G_CONSTANT i64 1
133
- ; CHECK: %shift:_(s64) = G_LSHR %x, %lsb(s64)
134
- ; CHECK: %and:_(s64) = G_AND %shift, %mask
135
- ; CHECK: %sub:_(s64) = G_SUB %and, %shift
136
- ; CHECK: $x0 = COPY %sub(s64)
137
- ; CHECK: RET_ReallyLR implicit $x0
136
+ ; CHECK-NEXT: {{ $}}
137
+ ; CHECK-NEXT: %x:_(s64) = COPY $x0
138
+ ; CHECK-NEXT: %lsb:_(s64) = G_CONSTANT i64 5
139
+ ; CHECK-NEXT: %mask:_(s64) = G_CONSTANT i64 1
140
+ ; CHECK-NEXT: %shift:_(s64) = G_LSHR %x, %lsb(s64)
141
+ ; CHECK-NEXT: %and:_(s64) = G_AND %shift, %mask
142
+ ; CHECK-NEXT: %sub:_(s64) = G_SUB %and, %shift
143
+ ; CHECK-NEXT: $x0 = COPY %sub(s64)
144
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
138
145
%x:_(s64) = COPY $x0
139
146
%lsb:_(s64) = G_CONSTANT i64 5
140
147
%mask:_(s64) = G_CONSTANT i64 1
@@ -144,6 +151,8 @@ body: |
144
151
$x0 = COPY %sub
145
152
RET_ReallyLR implicit $x0
146
153
154
+ # LSB must be in [0, reg_size)
155
+
147
156
...
148
157
---
149
158
name : dont_combine_negative_lsb
@@ -153,17 +162,17 @@ body: |
153
162
bb.0:
154
163
liveins: $w0
155
164
156
- ; LSB must be in [0, reg_size)
157
165
158
166
; CHECK-LABEL: name: dont_combine_negative_lsb
159
167
; CHECK: liveins: $w0
160
- ; CHECK: %x:_(s32) = COPY $w0
161
- ; CHECK: %negative:_(s32) = G_CONSTANT i32 -1
162
- ; CHECK: %mask:_(s32) = G_CONSTANT i32 255
163
- ; CHECK: %shift:_(s32) = G_LSHR %x, %negative(s32)
164
- ; CHECK: %and:_(s32) = G_AND %shift, %mask
165
- ; CHECK: $w0 = COPY %and(s32)
166
- ; CHECK: RET_ReallyLR implicit $w0
168
+ ; CHECK-NEXT: {{ $}}
169
+ ; CHECK-NEXT: %x:_(s32) = COPY $w0
170
+ ; CHECK-NEXT: %negative:_(s32) = G_CONSTANT i32 -1
171
+ ; CHECK-NEXT: %mask:_(s32) = G_CONSTANT i32 255
172
+ ; CHECK-NEXT: %shift:_(s32) = G_LSHR %x, %negative(s32)
173
+ ; CHECK-NEXT: %and:_(s32) = G_AND %shift, %mask
174
+ ; CHECK-NEXT: $w0 = COPY %and(s32)
175
+ ; CHECK-NEXT: RET_ReallyLR implicit $w0
167
176
%x:_(s32) = COPY $w0
168
177
%negative:_(s32) = G_CONSTANT i32 -1
169
178
%mask:_(s32) = G_CONSTANT i32 255
@@ -172,6 +181,8 @@ body: |
172
181
$w0 = COPY %and
173
182
RET_ReallyLR implicit $w0
174
183
184
+ # LSB must be in [0, reg_size)
185
+
175
186
...
176
187
---
177
188
name : dont_combine_lsb_too_large
@@ -181,17 +192,17 @@ body: |
181
192
bb.0:
182
193
liveins: $w0
183
194
184
- ; LSB must be in [0, reg_size)
185
195
186
196
; CHECK-LABEL: name: dont_combine_lsb_too_large
187
197
; CHECK: liveins: $w0
188
- ; CHECK: %x:_(s32) = COPY $w0
189
- ; CHECK: %too_large:_(s32) = G_CONSTANT i32 32
190
- ; CHECK: %mask:_(s32) = G_CONSTANT i32 255
191
- ; CHECK: %shift:_(s32) = G_LSHR %x, %too_large(s32)
192
- ; CHECK: %and:_(s32) = G_AND %shift, %mask
193
- ; CHECK: $w0 = COPY %and(s32)
194
- ; CHECK: RET_ReallyLR implicit $w0
198
+ ; CHECK-NEXT: {{ $}}
199
+ ; CHECK-NEXT: %x:_(s32) = COPY $w0
200
+ ; CHECK-NEXT: %too_large:_(s32) = G_CONSTANT i32 32
201
+ ; CHECK-NEXT: %mask:_(s32) = G_CONSTANT i32 255
202
+ ; CHECK-NEXT: %shift:_(s32) = G_LSHR %x, %too_large(s32)
203
+ ; CHECK-NEXT: %and:_(s32) = G_AND %shift, %mask
204
+ ; CHECK-NEXT: $w0 = COPY %and(s32)
205
+ ; CHECK-NEXT: RET_ReallyLR implicit $w0
195
206
%x:_(s32) = COPY $w0
196
207
%too_large:_(s32) = G_CONSTANT i32 32
197
208
%mask:_(s32) = G_CONSTANT i32 255
@@ -210,15 +221,16 @@ body: |
210
221
liveins: $d0
211
222
; CHECK-LABEL: name: dont_combine_vector
212
223
; CHECK: liveins: $d0
213
- ; CHECK: %x:_(<2 x s32>) = COPY $d0
214
- ; CHECK: %lsb_cst:_(s32) = G_CONSTANT i32 5
215
- ; CHECK: %lsb:_(<2 x s32>) = G_BUILD_VECTOR %lsb_cst(s32), %lsb_cst(s32)
216
- ; CHECK: %mask_cst:_(s32) = G_CONSTANT i32 255
217
- ; CHECK: %mask:_(<2 x s32>) = G_BUILD_VECTOR %mask_cst(s32), %mask_cst(s32)
218
- ; CHECK: %shift:_(<2 x s32>) = G_LSHR %x, %lsb(<2 x s32>)
219
- ; CHECK: %and:_(<2 x s32>) = G_AND %shift, %mask
220
- ; CHECK: $d0 = COPY %and(<2 x s32>)
221
- ; CHECK: RET_ReallyLR implicit $d0
224
+ ; CHECK-NEXT: {{ $}}
225
+ ; CHECK-NEXT: %x:_(<2 x s32>) = COPY $d0
226
+ ; CHECK-NEXT: %lsb_cst:_(s32) = G_CONSTANT i32 5
227
+ ; CHECK-NEXT: %lsb:_(<2 x s32>) = G_BUILD_VECTOR %lsb_cst(s32), %lsb_cst(s32)
228
+ ; CHECK-NEXT: %mask_cst:_(s32) = G_CONSTANT i32 255
229
+ ; CHECK-NEXT: %mask:_(<2 x s32>) = G_BUILD_VECTOR %mask_cst(s32), %mask_cst(s32)
230
+ ; CHECK-NEXT: %shift:_(<2 x s32>) = G_LSHR %x, %lsb(<2 x s32>)
231
+ ; CHECK-NEXT: %and:_(<2 x s32>) = G_AND %shift, %mask
232
+ ; CHECK-NEXT: $d0 = COPY %and(<2 x s32>)
233
+ ; CHECK-NEXT: RET_ReallyLR implicit $d0
222
234
%x:_(<2 x s32>) = COPY $d0
223
235
%lsb_cst:_(s32) = G_CONSTANT i32 5
224
236
%lsb:_(<2 x s32>) = G_BUILD_VECTOR %lsb_cst, %lsb_cst
@@ -229,6 +241,9 @@ body: |
229
241
$d0 = COPY %and
230
242
RET_ReallyLR implicit $d0
231
243
244
+ # mask = 0111 1111 1111 ... 1111
245
+ # mask + 1 = 1000 0000 0000 ... 0000
246
+
232
247
...
233
248
---
234
249
name : max_signed_int_mask
@@ -237,16 +252,15 @@ legalized: true
237
252
body : |
238
253
bb.0:
239
254
liveins: $x0
240
- ; mask = 0111 1111 1111 ... 1111
241
- ; mask + 1 = 1000 0000 0000 ... 0000
242
255
; CHECK-LABEL: name: max_signed_int_mask
243
256
; CHECK: liveins: $x0
244
- ; CHECK: %x:_(s64) = COPY $x0
245
- ; CHECK: %lsb:_(s64) = G_CONSTANT i64 0
246
- ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 63
247
- ; CHECK: %and:_(s64) = G_UBFX %x, %lsb(s64), [[C]]
248
- ; CHECK: $x0 = COPY %and(s64)
249
- ; CHECK: RET_ReallyLR implicit $x0
257
+ ; CHECK-NEXT: {{ $}}
258
+ ; CHECK-NEXT: %x:_(s64) = COPY $x0
259
+ ; CHECK-NEXT: %lsb:_(s64) = G_CONSTANT i64 0
260
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 63
261
+ ; CHECK-NEXT: %and:_(s64) = G_UBFX %x, %lsb(s64), [[C]]
262
+ ; CHECK-NEXT: $x0 = COPY %and(s64)
263
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
250
264
%x:_(s64) = COPY $x0
251
265
%lsb:_(s64) = G_CONSTANT i64 0
252
266
%mask:_(s64) = G_CONSTANT i64 9223372036854775807
@@ -255,6 +269,9 @@ body: |
255
269
$x0 = COPY %and
256
270
RET_ReallyLR implicit $x0
257
271
272
+ # mask = 1111 1111 1111 ... 1111
273
+ # mask + 1 = 0000 0000 0000 ... 000
274
+
258
275
...
259
276
---
260
277
name : max_unsigned_int_mask
@@ -263,16 +280,15 @@ legalized: true
263
280
body : |
264
281
bb.0:
265
282
liveins: $x0
266
- ; mask = 1111 1111 1111 ... 1111
267
- ; mask + 1 = 0000 0000 0000 ... 000
268
283
; CHECK-LABEL: name: max_unsigned_int_mask
269
284
; CHECK: liveins: $x0
270
- ; CHECK: %x:_(s64) = COPY $x0
271
- ; CHECK: %lsb:_(s64) = G_CONSTANT i64 5
272
- ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
273
- ; CHECK: %and:_(s64) = G_UBFX %x, %lsb(s64), [[C]]
274
- ; CHECK: $x0 = COPY %and(s64)
275
- ; CHECK: RET_ReallyLR implicit $x0
285
+ ; CHECK-NEXT: {{ $}}
286
+ ; CHECK-NEXT: %x:_(s64) = COPY $x0
287
+ ; CHECK-NEXT: %lsb:_(s64) = G_CONSTANT i64 5
288
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
289
+ ; CHECK-NEXT: %and:_(s64) = G_UBFX %x, %lsb(s64), [[C]]
290
+ ; CHECK-NEXT: $x0 = COPY %and(s64)
291
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
276
292
%x:_(s64) = COPY $x0
277
293
%lsb:_(s64) = G_CONSTANT i64 5
278
294
%mask:_(s64) = G_CONSTANT i64 18446744073709551615
0 commit comments