@@ -9,15 +9,23 @@ define void @zext_v4i8_all_lanes_used(<4 x i8> %src) {
99; CHECK-LABEL: define void @zext_v4i8_all_lanes_used(
1010; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
1111; 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
1220; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
1321; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
1422; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
1523; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
1624; 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 ]])
2129; CHECK-NEXT: ret void
2230;
2331entry:
@@ -68,13 +76,20 @@ define void @zext_v4i8_3_lanes_used_1(<4 x i8> %src) {
6876; CHECK-LABEL: define void @zext_v4i8_3_lanes_used_1(
6977; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
7078; 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
7186; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
7287; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
7388; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
7489; 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 ]])
7893; CHECK-NEXT: ret void
7994;
8095entry:
@@ -93,13 +108,19 @@ define void @zext_v4i8_3_lanes_used_2(<4 x i8> %src) {
93108; CHECK-LABEL: define void @zext_v4i8_3_lanes_used_2(
94109; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
95110; 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
96117; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
97118; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
98119; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
99120; 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 ]])
103124; CHECK-NEXT: ret void
104125;
105126entry:
@@ -118,11 +139,17 @@ define void @zext_v4i8_2_lanes_used_1(<4 x i8> %src) {
118139; CHECK-LABEL: define void @zext_v4i8_2_lanes_used_1(
119140; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
120141; 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
121148; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
122149; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
123150; 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 ]])
126153; CHECK-NEXT: ret void
127154;
128155entry:
@@ -139,11 +166,16 @@ define void @zext_v4i8_2_lanes_used_2(<4 x i8> %src) {
139166; CHECK-LABEL: define void @zext_v4i8_2_lanes_used_2(
140167; CHECK-SAME: <4 x i8> [[SRC:%.*]]) {
141168; 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
142174; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
143175; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
144176; 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 ]])
147179; CHECK-NEXT: ret void
148180;
149181entry:
@@ -160,15 +192,22 @@ define void @zext_v4i8_all_lanes_used_noundef(<4 x i8> noundef %src) {
160192; CHECK-LABEL: define void @zext_v4i8_all_lanes_used_noundef(
161193; CHECK-SAME: <4 x i8> noundef [[SRC:%.*]]) {
162194; 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
163202; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i8> [[SRC]] to <4 x i32>
164203; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i32> [[EXT9]], i64 0
165204; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i32> [[EXT9]], i64 1
166205; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i32> [[EXT9]], i64 2
167206; 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 ]])
172211; CHECK-NEXT: ret void
173212;
174213entry:
@@ -221,15 +260,23 @@ define void @zext_v4i16_all_lanes_used(<4 x i16> %src) {
221260; CHECK-LABEL: define void @zext_v4i16_all_lanes_used(
222261; CHECK-SAME: <4 x i16> [[SRC:%.*]]) {
223262; 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
224271; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <4 x i16> [[SRC]] to <4 x i64>
225272; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <4 x i64> [[EXT9]], i64 0
226273; CHECK-NEXT: [[EXT_1:%.*]] = extractelement <4 x i64> [[EXT9]], i64 1
227274; CHECK-NEXT: [[EXT_2:%.*]] = extractelement <4 x i64> [[EXT9]], i64 2
228275; 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 ]])
233280; CHECK-NEXT: ret void
234281;
235282entry:
@@ -250,11 +297,15 @@ define void @zext_v2i32_all_lanes_used(<2 x i32> %src) {
250297; CHECK-LABEL: define void @zext_v2i32_all_lanes_used(
251298; CHECK-SAME: <2 x i32> [[SRC:%.*]]) {
252299; 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
253304; CHECK-NEXT: [[EXT9:%.*]] = zext nneg <2 x i32> [[SRC]] to <2 x i64>
254305; CHECK-NEXT: [[EXT_0:%.*]] = extractelement <2 x i64> [[EXT9]], i64 0
255306; 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 ]])
258309; CHECK-NEXT: ret void
259310;
260311entry:
@@ -266,3 +317,32 @@ entry:
266317 call void @use.i64 (i64 %ext.1 )
267318 ret void
268319}
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