@@ -9,15 +9,23 @@ define void @zext_v4i8_all_lanes_used(<4 x i8> %src) {
9
9
; CHECK-LABEL: define void @zext_v4i8_all_lanes_used(
10
10
; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
11
11
; CHECK-NEXT: [[ENTRY:.*:]]
12
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze <4 x i8> [[SRC]]
13
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i8> [[TMP0]] to i32
14
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 24
15
+ ; CHECK-NEXT: [[TMP4:%.*]] = lshr i32 [[TMP1]], 16
16
+ ; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], 255
17
+ ; CHECK-NEXT: [[TMP6:%.*]] = lshr i32 [[TMP1]], 8
18
+ ; CHECK-NEXT: [[TMP7:%.*]] = and i32 [[TMP6]], 255
19
+ ; CHECK-NEXT: [[TMP9:%.*]] = and i32 [[TMP1]], 255
12
20
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
13
21
; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
14
22
; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
15
23
; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
16
24
; CHECK-NEXT: [[EXT_3:%.*]] = extractelement <4 x i32> [[EXT9]], i64 3
17
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_0 ]])
18
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_1 ]])
19
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_2 ]])
20
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_3 ]])
25
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP9 ]])
26
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP7 ]])
27
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP5 ]])
28
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP2 ]])
21
29
; CHECK-NEXT: ret void
22
30
;
23
31
entry:
@@ -68,13 +76,20 @@ define void @zext_v4i8_3_lanes_used_1(<4 x i8> %src) {
68
76
; CHECK-LABEL: define void @zext_v4i8_3_lanes_used_1(
69
77
; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
70
78
; CHECK-NEXT: [[ENTRY:.*:]]
79
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze <4 x i8> [[SRC]]
80
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i8> [[TMP0]] to i32
81
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 24
82
+ ; CHECK-NEXT: [[TMP4:%.*]] = lshr i32 [[TMP1]], 16
83
+ ; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], 255
84
+ ; CHECK-NEXT: [[TMP6:%.*]] = lshr i32 [[TMP1]], 8
85
+ ; CHECK-NEXT: [[TMP7:%.*]] = and i32 [[TMP6]], 255
71
86
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
72
87
; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
73
88
; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
74
89
; CHECK-NEXT: [[EXT_3:%.*]] = extractelement <4 x i32> [[EXT9]], i64 3
75
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_1 ]])
76
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_2 ]])
77
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_3 ]])
90
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP7 ]])
91
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP5 ]])
92
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP2 ]])
78
93
; CHECK-NEXT: ret void
79
94
;
80
95
entry:
@@ -93,13 +108,19 @@ define void @zext_v4i8_3_lanes_used_2(<4 x i8> %src) {
93
108
; CHECK-LABEL: define void @zext_v4i8_3_lanes_used_2(
94
109
; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
95
110
; CHECK-NEXT: [[ENTRY:.*:]]
111
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze <4 x i8> [[SRC]]
112
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i8> [[TMP0]] to i32
113
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 24
114
+ ; CHECK-NEXT: [[TMP4:%.*]] = lshr i32 [[TMP1]], 8
115
+ ; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], 255
116
+ ; CHECK-NEXT: [[TMP7:%.*]] = and i32 [[TMP1]], 255
96
117
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
97
118
; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
98
119
; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
99
120
; CHECK-NEXT: [[EXT_3:%.*]] = extractelement <4 x i32> [[EXT9]], i64 3
100
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_0 ]])
101
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_1 ]])
102
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_3 ]])
121
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP7 ]])
122
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP5 ]])
123
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP2 ]])
103
124
; CHECK-NEXT: ret void
104
125
;
105
126
entry:
@@ -118,11 +139,17 @@ define void @zext_v4i8_2_lanes_used_1(<4 x i8> %src) {
118
139
; CHECK-LABEL: define void @zext_v4i8_2_lanes_used_1(
119
140
; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
120
141
; CHECK-NEXT: [[ENTRY:.*:]]
142
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze <4 x i8> [[SRC]]
143
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i8> [[TMP0]] to i32
144
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 16
145
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[TMP2]], 255
146
+ ; CHECK-NEXT: [[TMP4:%.*]] = lshr i32 [[TMP1]], 8
147
+ ; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], 255
121
148
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
122
149
; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
123
150
; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
124
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_1 ]])
125
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_2 ]])
151
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP5 ]])
152
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP3 ]])
126
153
; CHECK-NEXT: ret void
127
154
;
128
155
entry:
@@ -139,11 +166,16 @@ define void @zext_v4i8_2_lanes_used_2(<4 x i8> %src) {
139
166
; CHECK-LABEL: define void @zext_v4i8_2_lanes_used_2(
140
167
; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
141
168
; CHECK-NEXT: [[ENTRY:.*:]]
169
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze <4 x i8> [[SRC]]
170
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i8> [[TMP0]] to i32
171
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 16
172
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[TMP2]], 255
173
+ ; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP1]], 255
142
174
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
143
175
; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
144
176
; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
145
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_0 ]])
146
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_2 ]])
177
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP5 ]])
178
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP3 ]])
147
179
; CHECK-NEXT: ret void
148
180
;
149
181
entry:
@@ -160,15 +192,22 @@ define void @zext_v4i8_all_lanes_used_noundef(<4 x i8> noundef %src) {
160
192
; CHECK-LABEL: define void @zext_v4i8_all_lanes_used_noundef(
161
193
; CHECK-SAME: <4 x i8> noundef [[SRC:%.*]]) {
162
194
; CHECK-NEXT: [[ENTRY:.*:]]
195
+ ; CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i8> [[SRC]] to i32
196
+ ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[TMP0]], 24
197
+ ; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[TMP0]], 16
198
+ ; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[TMP3]], 255
199
+ ; CHECK-NEXT: [[TMP5:%.*]] = lshr i32 [[TMP0]], 8
200
+ ; CHECK-NEXT: [[TMP6:%.*]] = and i32 [[TMP5]], 255
201
+ ; CHECK-NEXT: [[TMP8:%.*]] = and i32 [[TMP0]], 255
163
202
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
164
203
; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
165
204
; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
166
205
; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
167
206
; CHECK-NEXT: [[EXT_3:%.*]] = extractelement <4 x i32> [[EXT9]], i64 3
168
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_0 ]])
169
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_1 ]])
170
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_2 ]])
171
- ; CHECK-NEXT: call void @use.i32(i32 [[EXT_3 ]])
207
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP8 ]])
208
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP6 ]])
209
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP4 ]])
210
+ ; CHECK-NEXT: call void @use.i32(i32 [[TMP1 ]])
172
211
; CHECK-NEXT: ret void
173
212
;
174
213
entry:
@@ -221,15 +260,23 @@ define void @zext_v4i16_all_lanes_used(<4 x i16> %src) {
221
260
; CHECK-LABEL: define void @zext_v4i16_all_lanes_used(
222
261
; CHECK-SAME: <4 x i16> [[SRC:%.*]]) {
223
262
; CHECK-NEXT: [[ENTRY:.*:]]
263
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze <4 x i16> [[SRC]]
264
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i16> [[TMP0]] to i64
265
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i64 [[TMP1]], 48
266
+ ; CHECK-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP1]], 32
267
+ ; CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 65535
268
+ ; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP1]], 16
269
+ ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 65535
270
+ ; CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP1]], 65535
224
271
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i16> [[SRC]] to <4 x i64>
225
272
; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i64> [[EXT9]], i64 0
226
273
; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i64> [[EXT9]], i64 1
227
274
; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i64> [[EXT9]], i64 2
228
275
; CHECK-NEXT: [[EXT_3:%.*]] = extractelement <4 x i64> [[EXT9]], i64 3
229
- ; CHECK-NEXT: call void @use.i64(i64 [[EXT_0 ]])
230
- ; CHECK-NEXT: call void @use.i64(i64 [[EXT_1 ]])
231
- ; CHECK-NEXT: call void @use.i64(i64 [[EXT_2 ]])
232
- ; CHECK-NEXT: call void @use.i64(i64 [[EXT_3 ]])
276
+ ; CHECK-NEXT: call void @use.i64(i64 [[TMP9 ]])
277
+ ; CHECK-NEXT: call void @use.i64(i64 [[TMP7 ]])
278
+ ; CHECK-NEXT: call void @use.i64(i64 [[TMP5 ]])
279
+ ; CHECK-NEXT: call void @use.i64(i64 [[TMP2 ]])
233
280
; CHECK-NEXT: ret void
234
281
;
235
282
entry:
@@ -250,11 +297,15 @@ define void @zext_v2i32_all_lanes_used(<2 x i32> %src) {
250
297
; CHECK-LABEL: define void @zext_v2i32_all_lanes_used(
251
298
; CHECK-SAME: <2 x i32> [[SRC:%.*]]) {
252
299
; CHECK-NEXT: [[ENTRY:.*:]]
300
+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze <2 x i32> [[SRC]]
301
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[TMP0]] to i64
302
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i64 [[TMP1]], 32
303
+ ; CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP1]], 4294967295
253
304
; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <2 x i32> [[SRC]] to <2 x i64>
254
305
; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <2 x i64> [[EXT9]], i64 0
255
306
; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <2 x i64> [[EXT9]], i64 1
256
- ; CHECK-NEXT: call void @use.i64(i64 [[EXT_0 ]])
257
- ; CHECK-NEXT: call void @use.i64(i64 [[EXT_1 ]])
307
+ ; CHECK-NEXT: call void @use.i64(i64 [[TMP5 ]])
308
+ ; CHECK-NEXT: call void @use.i64(i64 [[TMP2 ]])
258
309
; CHECK-NEXT: ret void
259
310
;
260
311
entry:
@@ -266,3 +317,32 @@ entry:
266
317
call void @use.i64 (i64 %ext.1 )
267
318
ret void
268
319
}
320
+
321
+ define void @zext_nxv4i8_all_lanes_used (<vscale x 4 x i8 > %src ) {
322
+ ; CHECK-LABEL: define void @zext_nxv4i8_all_lanes_used(
323
+ ; CHECK-SAME: <vscale x 4 x i8> [[SRC:%.*]]) {
324
+ ; CHECK-NEXT: [[ENTRY:.*:]]
325
+ ; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <vscale x 4 x i8> [[SRC]] to <vscale x 4 x i32>
326
+ ; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <vscale x 4 x i32> [[EXT9]], i64 0
327
+ ; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <vscale x 4 x i32> [[EXT9]], i64 1
328
+ ; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <vscale x 4 x i32> [[EXT9]], i64 2
329
+ ; CHECK-NEXT: [[EXT_3:%.*]] = extractelement <vscale x 4 x i32> [[EXT9]], i64 3
330
+ ; CHECK-NEXT: call void @use.i32(i32 [[EXT_0]])
331
+ ; CHECK-NEXT: call void @use.i32(i32 [[EXT_1]])
332
+ ; CHECK-NEXT: call void @use.i32(i32 [[EXT_2]])
333
+ ; CHECK-NEXT: call void @use.i32(i32 [[EXT_3]])
334
+ ; CHECK-NEXT: ret void
335
+ ;
336
+ entry:
337
+ %ext9 = zext nneg <vscale x 4 x i8 > %src to <vscale x 4 x i32 >
338
+ %ext.0 = extractelement <vscale x 4 x i32 > %ext9 , i64 0
339
+ %ext.1 = extractelement <vscale x 4 x i32 > %ext9 , i64 1
340
+ %ext.2 = extractelement <vscale x 4 x i32 > %ext9 , i64 2
341
+ %ext.3 = extractelement <vscale x 4 x i32 > %ext9 , i64 3
342
+
343
+ call void @use.i32 (i32 %ext.0 )
344
+ call void @use.i32 (i32 %ext.1 )
345
+ call void @use.i32 (i32 %ext.2 )
346
+ call void @use.i32 (i32 %ext.3 )
347
+ ret void
348
+ }
0 commit comments