Skip to content

Commit 913822f

Browse files
committed
[SelectionDAG] Deal with POISON for INSERT_VECTOR_ELT/INSERT_SUBVECTOR (part 3)
Target specific patches to avoid regressions seen after "part 1" aiming at fixing github issue #141034. One perhaps controversial change here is that convertToScalableVector now uses POISON instead of UNDEF for any additional elements added when converting to the scalable vector. This can avoid that we end up with things like t31: nxv1f32 = t32: v2f32 = extract_subvector t31, Constant:i64<0> t38: nxv1f32 = insert_subvector undef:nxv1f32, t32, Constant:i64<0> since if we instead try to insert into poison we can just use t31 instead of t38 without the risk that t31 would be more poisonous.
1 parent 332a73f commit 913822f

11 files changed

+93
-342
lines changed

llvm/include/llvm/CodeGen/SelectionDAG.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,8 +953,17 @@ class SelectionDAG {
953953
}
954954

955955
/// Insert \p SubVec at the \p Idx element of \p Vec.
956+
/// If \p SkipUndef is true and \p SubVec is UNDEF/POISON, then \p Vec is
957+
/// returned.
956958
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec,
957-
unsigned Idx) {
959+
unsigned Idx, bool SkipUndef = false) {
960+
// Skipping insert of UNDEF could result in POISON elements remaining in the
961+
// resulting vector. The SkipUndef is useful in situations when getNode
962+
// can't reason well enough about ignoring the insert, e.g. when having
963+
// scalable vectors and the user of this method knows that the subvector
964+
// being replaced isn't POISON.
965+
if (SkipUndef && SubVec.isUndef())
966+
return Vec;
958967
return getNode(ISD::INSERT_SUBVECTOR, DL, Vec.getValueType(), Vec, SubVec,
959968
getVectorIdxConstant(Idx, DL));
960969
}

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14925,11 +14925,14 @@ SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op,
1492514925

1492614926
if (PreferDUPAndInsert) {
1492714927
// First, build a constant vector with the common element.
14928-
SmallVector<SDValue, 8> Ops(NumElts, Value);
14928+
// Make sure to freeze the common element first, since we will use it also
14929+
// for indices that should be UNDEF (so we want to avoid making those
14930+
// elements more poisonous).
14931+
SmallVector<SDValue, 8> Ops(NumElts, DAG.getFreeze(Value));
1492914932
SDValue NewVector = LowerBUILD_VECTOR(DAG.getBuildVector(VT, dl, Ops), DAG);
1493014933
// Next, insert the elements that do not match the common value.
1493114934
for (unsigned I = 0; I < NumElts; ++I)
14932-
if (Op.getOperand(I) != Value)
14935+
if (Op.getOperand(I) != Value && !Op.getOperand(I).isUndef())
1493314936
NewVector =
1493414937
DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VT, NewVector,
1493514938
Op.getOperand(I), DAG.getConstant(I, dl, MVT::i64));
@@ -28486,7 +28489,7 @@ static SDValue convertToScalableVector(SelectionDAG &DAG, EVT VT, SDValue V) {
2848628489
"Expected a fixed length vector operand!");
2848728490
SDLoc DL(V);
2848828491
SDValue Zero = DAG.getConstant(0, DL, MVT::i64);
28489-
return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT, DAG.getUNDEF(VT), V, Zero);
28492+
return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT, DAG.getPOISON(VT), V, Zero);
2849028493
}
2849128494

2849228495
// Shrink V so it's just big enough to maintain a VT's worth of data.

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2844,7 +2844,7 @@ static SDValue convertToScalableVector(EVT VT, SDValue V, SelectionDAG &DAG,
28442844
assert(V.getValueType().isFixedLengthVector() &&
28452845
"Expected a fixed length vector operand!");
28462846
SDLoc DL(V);
2847-
return DAG.getInsertSubvector(DL, DAG.getUNDEF(VT), V, 0);
2847+
return DAG.getInsertSubvector(DL, DAG.getPOISON(VT), V, 0);
28482848
}
28492849

28502850
// Shrink V so it's just big enough to maintain a VT's worth of data.
@@ -4327,7 +4327,8 @@ static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
43274327
DAG.getNode(ISD::BUILD_VECTOR, DL, OneRegVT, OneVRegOfOps);
43284328
SubBV = convertToScalableVector(M1VT, SubBV, DAG, Subtarget);
43294329
unsigned InsertIdx = (i / ElemsPerVReg) * NumOpElts;
4330-
Vec = DAG.getInsertSubvector(DL, Vec, SubBV, InsertIdx);
4330+
Vec = DAG.getInsertSubvector(DL, Vec, SubBV, InsertIdx,
4331+
/*SkipUndef=*/true);
43314332
}
43324333
return convertFromScalableVector(VT, Vec, DAG, Subtarget);
43334334
}
@@ -7813,10 +7814,8 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
78137814
SDValue Vec = DAG.getUNDEF(VT);
78147815
for (const auto &OpIdx : enumerate(Op->ops())) {
78157816
SDValue SubVec = OpIdx.value();
7816-
// Don't insert undef subvectors.
7817-
if (SubVec.isUndef())
7818-
continue;
7819-
Vec = DAG.getInsertSubvector(DL, Vec, SubVec, OpIdx.index() * NumOpElts);
7817+
Vec = DAG.getInsertSubvector(DL, Vec, SubVec, OpIdx.index() * NumOpElts,
7818+
/*SkipUndef=*/true);
78207819
}
78217820
return Vec;
78227821
}
@@ -12143,9 +12142,10 @@ SDValue RISCVTargetLowering::lowerVECTOR_REVERSE(SDValue Op,
1214312142
Hi = DAG.getNode(ISD::VECTOR_REVERSE, DL, HiVT, Hi);
1214412143
// Reassemble the low and high pieces reversed.
1214512144
// FIXME: This is a CONCAT_VECTORS.
12146-
SDValue Res = DAG.getInsertSubvector(DL, DAG.getUNDEF(VecVT), Hi, 0);
12147-
return DAG.getInsertSubvector(DL, Res, Lo,
12148-
LoVT.getVectorMinNumElements());
12145+
SDValue Res = DAG.getInsertSubvector(DL, DAG.getUNDEF(VecVT), Hi, 0,
12146+
/*SkipUndef=*/true);
12147+
return DAG.getInsertSubvector(DL, Res, Lo, LoVT.getVectorMinNumElements(),
12148+
/*SkipUndef=*/true);
1214912149
}
1215012150

1215112151
// Just promote the int type to i16 which will double the LMUL.

llvm/test/CodeGen/AArch64/sve-fixed-length-fp-vselect.ll

Lines changed: 6 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ define void @select_v16f16(ptr %a, ptr %b) vscale_range(2,0) #0 {
3737
; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0]
3838
; CHECK-NEXT: ld1h { z1.h }, p0/z, [x1]
3939
; CHECK-NEXT: fcmeq p1.h, p0/z, z0.h, z1.h
40-
; CHECK-NEXT: mov z2.h, p1/z, #-1 // =0xffffffffffffffff
41-
; CHECK-NEXT: ptrue p1.h
42-
; CHECK-NEXT: and z2.h, z2.h, #0x1
43-
; CHECK-NEXT: cmpne p1.h, p1/z, z2.h, #0
4440
; CHECK-NEXT: sel z0.h, p1, z0.h, z1.h
4541
; CHECK-NEXT: st1h { z0.h }, p0, [x0]
4642
; CHECK-NEXT: ret
@@ -63,15 +59,8 @@ define void @select_v32f16(ptr %a, ptr %b) #0 {
6359
; VBITS_GE_256-NEXT: ld1h { z3.h }, p0/z, [x1]
6460
; VBITS_GE_256-NEXT: fcmeq p1.h, p0/z, z0.h, z1.h
6561
; VBITS_GE_256-NEXT: fcmeq p2.h, p0/z, z2.h, z3.h
66-
; VBITS_GE_256-NEXT: mov z4.h, p1/z, #-1 // =0xffffffffffffffff
67-
; VBITS_GE_256-NEXT: ptrue p1.h
68-
; VBITS_GE_256-NEXT: mov z5.h, p2/z, #-1 // =0xffffffffffffffff
69-
; VBITS_GE_256-NEXT: and z4.h, z4.h, #0x1
70-
; VBITS_GE_256-NEXT: and z5.h, z5.h, #0x1
71-
; VBITS_GE_256-NEXT: cmpne p2.h, p1/z, z4.h, #0
72-
; VBITS_GE_256-NEXT: cmpne p1.h, p1/z, z5.h, #0
73-
; VBITS_GE_256-NEXT: sel z0.h, p2, z0.h, z1.h
74-
; VBITS_GE_256-NEXT: sel z1.h, p1, z2.h, z3.h
62+
; VBITS_GE_256-NEXT: sel z0.h, p1, z0.h, z1.h
63+
; VBITS_GE_256-NEXT: sel z1.h, p2, z2.h, z3.h
7564
; VBITS_GE_256-NEXT: st1h { z0.h }, p0, [x0, x8, lsl #1]
7665
; VBITS_GE_256-NEXT: st1h { z1.h }, p0, [x0]
7766
; VBITS_GE_256-NEXT: ret
@@ -82,10 +71,6 @@ define void @select_v32f16(ptr %a, ptr %b) #0 {
8271
; VBITS_GE_512-NEXT: ld1h { z0.h }, p0/z, [x0]
8372
; VBITS_GE_512-NEXT: ld1h { z1.h }, p0/z, [x1]
8473
; VBITS_GE_512-NEXT: fcmeq p1.h, p0/z, z0.h, z1.h
85-
; VBITS_GE_512-NEXT: mov z2.h, p1/z, #-1 // =0xffffffffffffffff
86-
; VBITS_GE_512-NEXT: ptrue p1.h
87-
; VBITS_GE_512-NEXT: and z2.h, z2.h, #0x1
88-
; VBITS_GE_512-NEXT: cmpne p1.h, p1/z, z2.h, #0
8974
; VBITS_GE_512-NEXT: sel z0.h, p1, z0.h, z1.h
9075
; VBITS_GE_512-NEXT: st1h { z0.h }, p0, [x0]
9176
; VBITS_GE_512-NEXT: ret
@@ -104,10 +89,6 @@ define void @select_v64f16(ptr %a, ptr %b) vscale_range(8,0) #0 {
10489
; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0]
10590
; CHECK-NEXT: ld1h { z1.h }, p0/z, [x1]
10691
; CHECK-NEXT: fcmeq p1.h, p0/z, z0.h, z1.h
107-
; CHECK-NEXT: mov z2.h, p1/z, #-1 // =0xffffffffffffffff
108-
; CHECK-NEXT: ptrue p1.h
109-
; CHECK-NEXT: and z2.h, z2.h, #0x1
110-
; CHECK-NEXT: cmpne p1.h, p1/z, z2.h, #0
11192
; CHECK-NEXT: sel z0.h, p1, z0.h, z1.h
11293
; CHECK-NEXT: st1h { z0.h }, p0, [x0]
11394
; CHECK-NEXT: ret
@@ -126,10 +107,6 @@ define void @select_v128f16(ptr %a, ptr %b) vscale_range(16,0) #0 {
126107
; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0]
127108
; CHECK-NEXT: ld1h { z1.h }, p0/z, [x1]
128109
; CHECK-NEXT: fcmeq p1.h, p0/z, z0.h, z1.h
129-
; CHECK-NEXT: mov z2.h, p1/z, #-1 // =0xffffffffffffffff
130-
; CHECK-NEXT: ptrue p1.h
131-
; CHECK-NEXT: and z2.h, z2.h, #0x1
132-
; CHECK-NEXT: cmpne p1.h, p1/z, z2.h, #0
133110
; CHECK-NEXT: sel z0.h, p1, z0.h, z1.h
134111
; CHECK-NEXT: st1h { z0.h }, p0, [x0]
135112
; CHECK-NEXT: ret
@@ -173,10 +150,6 @@ define void @select_v8f32(ptr %a, ptr %b) vscale_range(2,0) #0 {
173150
; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0]
174151
; CHECK-NEXT: ld1w { z1.s }, p0/z, [x1]
175152
; CHECK-NEXT: fcmeq p1.s, p0/z, z0.s, z1.s
176-
; CHECK-NEXT: mov z2.s, p1/z, #-1 // =0xffffffffffffffff
177-
; CHECK-NEXT: ptrue p1.s
178-
; CHECK-NEXT: and z2.s, z2.s, #0x1
179-
; CHECK-NEXT: cmpne p1.s, p1/z, z2.s, #0
180153
; CHECK-NEXT: sel z0.s, p1, z0.s, z1.s
181154
; CHECK-NEXT: st1w { z0.s }, p0, [x0]
182155
; CHECK-NEXT: ret
@@ -199,15 +172,8 @@ define void @select_v16f32(ptr %a, ptr %b) #0 {
199172
; VBITS_GE_256-NEXT: ld1w { z3.s }, p0/z, [x1]
200173
; VBITS_GE_256-NEXT: fcmeq p1.s, p0/z, z0.s, z1.s
201174
; VBITS_GE_256-NEXT: fcmeq p2.s, p0/z, z2.s, z3.s
202-
; VBITS_GE_256-NEXT: mov z4.s, p1/z, #-1 // =0xffffffffffffffff
203-
; VBITS_GE_256-NEXT: ptrue p1.s
204-
; VBITS_GE_256-NEXT: mov z5.s, p2/z, #-1 // =0xffffffffffffffff
205-
; VBITS_GE_256-NEXT: and z4.s, z4.s, #0x1
206-
; VBITS_GE_256-NEXT: and z5.s, z5.s, #0x1
207-
; VBITS_GE_256-NEXT: cmpne p2.s, p1/z, z4.s, #0
208-
; VBITS_GE_256-NEXT: cmpne p1.s, p1/z, z5.s, #0
209-
; VBITS_GE_256-NEXT: sel z0.s, p2, z0.s, z1.s
210-
; VBITS_GE_256-NEXT: sel z1.s, p1, z2.s, z3.s
175+
; VBITS_GE_256-NEXT: sel z0.s, p1, z0.s, z1.s
176+
; VBITS_GE_256-NEXT: sel z1.s, p2, z2.s, z3.s
211177
; VBITS_GE_256-NEXT: st1w { z0.s }, p0, [x0, x8, lsl #2]
212178
; VBITS_GE_256-NEXT: st1w { z1.s }, p0, [x0]
213179
; VBITS_GE_256-NEXT: ret
@@ -218,10 +184,6 @@ define void @select_v16f32(ptr %a, ptr %b) #0 {
218184
; VBITS_GE_512-NEXT: ld1w { z0.s }, p0/z, [x0]
219185
; VBITS_GE_512-NEXT: ld1w { z1.s }, p0/z, [x1]
220186
; VBITS_GE_512-NEXT: fcmeq p1.s, p0/z, z0.s, z1.s
221-
; VBITS_GE_512-NEXT: mov z2.s, p1/z, #-1 // =0xffffffffffffffff
222-
; VBITS_GE_512-NEXT: ptrue p1.s
223-
; VBITS_GE_512-NEXT: and z2.s, z2.s, #0x1
224-
; VBITS_GE_512-NEXT: cmpne p1.s, p1/z, z2.s, #0
225187
; VBITS_GE_512-NEXT: sel z0.s, p1, z0.s, z1.s
226188
; VBITS_GE_512-NEXT: st1w { z0.s }, p0, [x0]
227189
; VBITS_GE_512-NEXT: ret
@@ -240,10 +202,6 @@ define void @select_v32f32(ptr %a, ptr %b) vscale_range(8,0) #0 {
240202
; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0]
241203
; CHECK-NEXT: ld1w { z1.s }, p0/z, [x1]
242204
; CHECK-NEXT: fcmeq p1.s, p0/z, z0.s, z1.s
243-
; CHECK-NEXT: mov z2.s, p1/z, #-1 // =0xffffffffffffffff
244-
; CHECK-NEXT: ptrue p1.s
245-
; CHECK-NEXT: and z2.s, z2.s, #0x1
246-
; CHECK-NEXT: cmpne p1.s, p1/z, z2.s, #0
247205
; CHECK-NEXT: sel z0.s, p1, z0.s, z1.s
248206
; CHECK-NEXT: st1w { z0.s }, p0, [x0]
249207
; CHECK-NEXT: ret
@@ -262,10 +220,6 @@ define void @select_v64f32(ptr %a, ptr %b) vscale_range(16,0) #0 {
262220
; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0]
263221
; CHECK-NEXT: ld1w { z1.s }, p0/z, [x1]
264222
; CHECK-NEXT: fcmeq p1.s, p0/z, z0.s, z1.s
265-
; CHECK-NEXT: mov z2.s, p1/z, #-1 // =0xffffffffffffffff
266-
; CHECK-NEXT: ptrue p1.s
267-
; CHECK-NEXT: and z2.s, z2.s, #0x1
268-
; CHECK-NEXT: cmpne p1.s, p1/z, z2.s, #0
269223
; CHECK-NEXT: sel z0.s, p1, z0.s, z1.s
270224
; CHECK-NEXT: st1w { z0.s }, p0, [x0]
271225
; CHECK-NEXT: ret
@@ -310,10 +264,6 @@ define void @select_v4f64(ptr %a, ptr %b) vscale_range(2,0) #0 {
310264
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0]
311265
; CHECK-NEXT: ld1d { z1.d }, p0/z, [x1]
312266
; CHECK-NEXT: fcmeq p1.d, p0/z, z0.d, z1.d
313-
; CHECK-NEXT: mov z2.d, p1/z, #-1 // =0xffffffffffffffff
314-
; CHECK-NEXT: ptrue p1.d
315-
; CHECK-NEXT: and z2.d, z2.d, #0x1
316-
; CHECK-NEXT: cmpne p1.d, p1/z, z2.d, #0
317267
; CHECK-NEXT: sel z0.d, p1, z0.d, z1.d
318268
; CHECK-NEXT: st1d { z0.d }, p0, [x0]
319269
; CHECK-NEXT: ret
@@ -336,15 +286,8 @@ define void @select_v8f64(ptr %a, ptr %b) #0 {
336286
; VBITS_GE_256-NEXT: ld1d { z3.d }, p0/z, [x1]
337287
; VBITS_GE_256-NEXT: fcmeq p1.d, p0/z, z0.d, z1.d
338288
; VBITS_GE_256-NEXT: fcmeq p2.d, p0/z, z2.d, z3.d
339-
; VBITS_GE_256-NEXT: mov z4.d, p1/z, #-1 // =0xffffffffffffffff
340-
; VBITS_GE_256-NEXT: ptrue p1.d
341-
; VBITS_GE_256-NEXT: mov z5.d, p2/z, #-1 // =0xffffffffffffffff
342-
; VBITS_GE_256-NEXT: and z4.d, z4.d, #0x1
343-
; VBITS_GE_256-NEXT: and z5.d, z5.d, #0x1
344-
; VBITS_GE_256-NEXT: cmpne p2.d, p1/z, z4.d, #0
345-
; VBITS_GE_256-NEXT: cmpne p1.d, p1/z, z5.d, #0
346-
; VBITS_GE_256-NEXT: sel z0.d, p2, z0.d, z1.d
347-
; VBITS_GE_256-NEXT: sel z1.d, p1, z2.d, z3.d
289+
; VBITS_GE_256-NEXT: sel z0.d, p1, z0.d, z1.d
290+
; VBITS_GE_256-NEXT: sel z1.d, p2, z2.d, z3.d
348291
; VBITS_GE_256-NEXT: st1d { z0.d }, p0, [x0, x8, lsl #3]
349292
; VBITS_GE_256-NEXT: st1d { z1.d }, p0, [x0]
350293
; VBITS_GE_256-NEXT: ret
@@ -355,10 +298,6 @@ define void @select_v8f64(ptr %a, ptr %b) #0 {
355298
; VBITS_GE_512-NEXT: ld1d { z0.d }, p0/z, [x0]
356299
; VBITS_GE_512-NEXT: ld1d { z1.d }, p0/z, [x1]
357300
; VBITS_GE_512-NEXT: fcmeq p1.d, p0/z, z0.d, z1.d
358-
; VBITS_GE_512-NEXT: mov z2.d, p1/z, #-1 // =0xffffffffffffffff
359-
; VBITS_GE_512-NEXT: ptrue p1.d
360-
; VBITS_GE_512-NEXT: and z2.d, z2.d, #0x1
361-
; VBITS_GE_512-NEXT: cmpne p1.d, p1/z, z2.d, #0
362301
; VBITS_GE_512-NEXT: sel z0.d, p1, z0.d, z1.d
363302
; VBITS_GE_512-NEXT: st1d { z0.d }, p0, [x0]
364303
; VBITS_GE_512-NEXT: ret
@@ -377,10 +316,6 @@ define void @select_v16f64(ptr %a, ptr %b) vscale_range(8,0) #0 {
377316
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0]
378317
; CHECK-NEXT: ld1d { z1.d }, p0/z, [x1]
379318
; CHECK-NEXT: fcmeq p1.d, p0/z, z0.d, z1.d
380-
; CHECK-NEXT: mov z2.d, p1/z, #-1 // =0xffffffffffffffff
381-
; CHECK-NEXT: ptrue p1.d
382-
; CHECK-NEXT: and z2.d, z2.d, #0x1
383-
; CHECK-NEXT: cmpne p1.d, p1/z, z2.d, #0
384319
; CHECK-NEXT: sel z0.d, p1, z0.d, z1.d
385320
; CHECK-NEXT: st1d { z0.d }, p0, [x0]
386321
; CHECK-NEXT: ret
@@ -399,10 +334,6 @@ define void @select_v32f64(ptr %a, ptr %b) vscale_range(16,0) #0 {
399334
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0]
400335
; CHECK-NEXT: ld1d { z1.d }, p0/z, [x1]
401336
; CHECK-NEXT: fcmeq p1.d, p0/z, z0.d, z1.d
402-
; CHECK-NEXT: mov z2.d, p1/z, #-1 // =0xffffffffffffffff
403-
; CHECK-NEXT: ptrue p1.d
404-
; CHECK-NEXT: and z2.d, z2.d, #0x1
405-
; CHECK-NEXT: cmpne p1.d, p1/z, z2.d, #0
406337
; CHECK-NEXT: sel z0.d, p1, z0.d, z1.d
407338
; CHECK-NEXT: st1d { z0.d }, p0, [x0]
408339
; CHECK-NEXT: ret

llvm/test/CodeGen/AArch64/sve-fixed-length-frame-offests.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ define void @foo(ptr %a) #0 {
1212
; CHECK: SelectionDAG has 13 nodes:
1313
; CHECK-NEXT: t0: ch,glue = EntryToken
1414
; CHECK-NEXT: t2: i64,ch = CopyFromReg t0, Register:i64 %0
15-
; CHECK-NEXT: t21: nxv2i64,ch = LDR_ZXI<Mem:(volatile load (<vscale x 1 x s128>) from %ir.a, align 64)> t2, TargetConstant:i64<0>, t0
15+
; CHECK-NEXT: t22: nxv2i64,ch = LDR_ZXI<Mem:(volatile load (<vscale x 1 x s128>) from %ir.a, align 64)> t2, TargetConstant:i64<0>, t0
1616
; CHECK-NEXT: t8: i64 = ADDXri TargetFrameIndex:i64<1>, TargetConstant:i32<0>, TargetConstant:i32<0>
1717
; CHECK-NEXT: t6: i64 = ADDXri TargetFrameIndex:i64<0>, TargetConstant:i32<0>, TargetConstant:i32<0>
18-
; CHECK-NEXT: t22: ch = STR_ZXI<Mem:(volatile store (<vscale x 1 x s128>) into %ir.r0, align 64)> t21, t6, TargetConstant:i64<0>, t21:1
19-
; CHECK-NEXT: t23: ch = STR_ZXI<Mem:(volatile store (<vscale x 1 x s128>) into %ir.r1, align 64)> t21, t8, TargetConstant:i64<0>, t22
20-
; CHECK-NEXT: t10: ch = RET_ReallyLR t23
18+
; CHECK-NEXT: t23: ch = STR_ZXI<Mem:(volatile store (<vscale x 1 x s128>) into %ir.r0, align 64)> t22, t6, TargetConstant:i64<0>, t22:1
19+
; CHECK-NEXT: t24: ch = STR_ZXI<Mem:(volatile store (<vscale x 1 x s128>) into %ir.r1, align 64)> t22, t8, TargetConstant:i64<0>, t23
20+
; CHECK-NEXT: t10: ch = RET_ReallyLR t24
2121
; CHECK-EMPTY:
2222
entry:
2323
%r0 = alloca <8 x i64>

0 commit comments

Comments
 (0)