Skip to content

Commit 5fe4d0b

Browse files
committed
[AArch64][GlobalISel] Legalize Insert vector element
This attempts to standardize and extend some of the insert vector element lowering. Most notably: - More types are handled by splitting illegal vectors - The index type for G_INSERT_VECTOR_ELT is canonicalized to TLI.getVectorIdxTy(), similar to extact_vector_element. - Some of the existing patterns now have the index type specified to make sure they can apply to GISel too. - The C++ selection code has been removed, relying on tablegen patterns. - G_INSERT_VECTOR_ELT with small GPR input elements are pre-selected to use a i32 type, allowing the existing patterns to apply. - Variable index inserts are lowered in post-legalizer lowering, expanding into a stack store and reload.
1 parent 1c48c92 commit 5fe4d0b

16 files changed

+954
-626
lines changed

llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def : GINodeEquiv<G_CTLZ_ZERO_UNDEF, ctlz_zero_undef>;
141141
def : GINodeEquiv<G_CTTZ_ZERO_UNDEF, cttz_zero_undef>;
142142
def : GINodeEquiv<G_CTPOP, ctpop>;
143143
def : GINodeEquiv<G_EXTRACT_VECTOR_ELT, extractelt>;
144+
def : GINodeEquiv<G_INSERT_VECTOR_ELT, vector_insert>;
144145
def : GINodeEquiv<G_CONCAT_VECTORS, concat_vectors>;
145146
def : GINodeEquiv<G_BUILD_VECTOR, build_vector>;
146147
def : GINodeEquiv<G_FCEIL, fceil>;

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2969,7 +2969,22 @@ bool IRTranslator::translateInsertElement(const User &U,
29692969
Register Res = getOrCreateVReg(U);
29702970
Register Val = getOrCreateVReg(*U.getOperand(0));
29712971
Register Elt = getOrCreateVReg(*U.getOperand(1));
2972-
Register Idx = getOrCreateVReg(*U.getOperand(2));
2972+
const auto &TLI = *MF->getSubtarget().getTargetLowering();
2973+
unsigned PreferredVecIdxWidth = TLI.getVectorIdxTy(*DL).getSizeInBits();
2974+
Register Idx;
2975+
if (auto *CI = dyn_cast<ConstantInt>(U.getOperand(2))) {
2976+
if (CI->getBitWidth() != PreferredVecIdxWidth) {
2977+
APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
2978+
auto *NewIdxCI = ConstantInt::get(CI->getContext(), NewIdx);
2979+
Idx = getOrCreateVReg(*NewIdxCI);
2980+
}
2981+
}
2982+
if (!Idx)
2983+
Idx = getOrCreateVReg(*U.getOperand(2));
2984+
if (MRI->getType(Idx).getSizeInBits() != PreferredVecIdxWidth) {
2985+
const LLT VecIdxTy = LLT::scalar(PreferredVecIdxWidth);
2986+
Idx = MIRBuilder.buildZExtOrTrunc(VecIdxTy, Idx).getReg(0);
2987+
}
29732988
MIRBuilder.buildInsertVectorElement(Res, Val, Elt, Idx);
29742989
return true;
29752990
}

llvm/lib/Target/AArch64/AArch64Combine.td

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ def ext: GICombineRule <
114114
(apply [{ applyEXT(*${root}, ${matchinfo}); }])
115115
>;
116116

117+
def insertelt_nonconst: GICombineRule <
118+
(defs root:$root, shuffle_matchdata:$matchinfo),
119+
(match (wip_match_opcode G_INSERT_VECTOR_ELT):$root,
120+
[{ return matchNonConstInsert(*${root}, MRI); }]),
121+
(apply [{ applyNonConstInsert(*${root}, MRI, B); }])
122+
>;
123+
117124
def shuf_to_ins_matchdata : GIDefMatchData<"std::tuple<Register, int, Register, int>">;
118125
def shuf_to_ins: GICombineRule <
119126
(defs root:$root, shuf_to_ins_matchdata:$matchinfo),
@@ -140,8 +147,7 @@ def form_duplane : GICombineRule <
140147
>;
141148

142149
def shuffle_vector_lowering : GICombineGroup<[dup, rev, ext, zip, uzp, trn,
143-
form_duplane,
144-
shuf_to_ins]>;
150+
form_duplane, shuf_to_ins]>;
145151

146152
// Turn G_UNMERGE_VALUES -> G_EXTRACT_VECTOR_ELT's
147153
def vector_unmerge_lowering : GICombineRule <
@@ -269,7 +275,7 @@ def AArch64PostLegalizerLowering
269275
lower_vector_fcmp, form_truncstore,
270276
vector_sext_inreg_to_shift,
271277
unmerge_ext_to_unmerge, lower_mull,
272-
vector_unmerge_lowering]> {
278+
vector_unmerge_lowering, insertelt_nonconst]> {
273279
}
274280

275281
// Post-legalization combines which are primarily optimizations.

llvm/lib/Target/AArch64/AArch64InstrAtomics.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,10 @@ let Predicates = [HasLSE] in {
547547
let Predicates = [HasRCPC3, HasNEON] in {
548548
// LDAP1 loads
549549
def : Pat<(vector_insert (v2i64 VecListOne128:$Rd),
550-
(i64 (acquiring_load<atomic_load_64> GPR64sp:$Rn)), VectorIndexD:$idx),
550+
(i64 (acquiring_load<atomic_load_64> GPR64sp:$Rn)), (i64 VectorIndexD:$idx)),
551551
(LDAP1 VecListOne128:$Rd, VectorIndexD:$idx, GPR64sp:$Rn)>;
552552
def : Pat<(vector_insert (v2f64 VecListOne128:$Rd),
553-
(f64 (bitconvert (i64 (acquiring_load<atomic_load_64> GPR64sp:$Rn)))), VectorIndexD:$idx),
553+
(f64 (bitconvert (i64 (acquiring_load<atomic_load_64> GPR64sp:$Rn)))), (i64 VectorIndexD:$idx)),
554554
(LDAP1 VecListOne128:$Rd, VectorIndexD:$idx, GPR64sp:$Rn)>;
555555
def : Pat<(v1i64 (scalar_to_vector
556556
(i64 (acquiring_load<atomic_load_64> GPR64sp:$Rn)))),

llvm/lib/Target/AArch64/AArch64InstrFormats.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7982,7 +7982,7 @@ class SIMDInsFromMain<string size, ValueType vectype,
79827982
"|" # size # "\t$Rd$idx, $Rn}",
79837983
"$Rd = $dst",
79847984
[(set V128:$dst,
7985-
(vector_insert (vectype V128:$Rd), regtype:$Rn, idxtype:$idx))]> {
7985+
(vector_insert (vectype V128:$Rd), regtype:$Rn, (i64 idxtype:$idx)))]> {
79867986
let Inst{14-11} = 0b0011;
79877987
}
79887988

@@ -7996,8 +7996,8 @@ class SIMDInsFromElement<string size, ValueType vectype,
79967996
[(set V128:$dst,
79977997
(vector_insert
79987998
(vectype V128:$Rd),
7999-
(elttype (vector_extract (vectype V128:$Rn), idxtype:$idx2)),
8000-
idxtype:$idx))]>;
7999+
(elttype (vector_extract (vectype V128:$Rn), (i64 idxtype:$idx2))),
8000+
(i64 idxtype:$idx)))]>;
80018001

80028002
class SIMDInsMainMovAlias<string size, Instruction inst,
80038003
RegisterClass regtype, Operand idxtype>

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6540,6 +6540,15 @@ def : Pat<(v8i8 (vector_insert (v8i8 V64:$Rn), (i32 GPR32:$Rm), (i64 VectorIndex
65406540
VectorIndexB:$imm, GPR32:$Rm),
65416541
dsub)>;
65426542

6543+
def : Pat<(v8i8 (vector_insert (v8i8 V64:$Rn), (i8 FPR8:$Rm), (i64 VectorIndexB:$imm))),
6544+
(EXTRACT_SUBREG
6545+
(INSvi8lane (v16i8 (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), V64:$Rn, dsub)),
6546+
VectorIndexB:$imm, (v16i8 (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), FPR8:$Rm, bsub)), (i64 0)),
6547+
dsub)>;
6548+
def : Pat<(v16i8 (vector_insert (v16i8 V128:$Rn), (i8 FPR8:$Rm), (i64 VectorIndexB:$imm))),
6549+
(INSvi8lane V128:$Rn, VectorIndexB:$imm,
6550+
(v16i8 (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), FPR8:$Rm, bsub)), (i64 0))>;
6551+
65436552
// Copy an element at a constant index in one vector into a constant indexed
65446553
// element of another.
65456554
// FIXME refactor to a shared class/dev parameterized on vector type, vector
@@ -6572,26 +6581,26 @@ def : Pat<(v2i64 (int_aarch64_neon_vcopy_lane
65726581
multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
65736582
ValueType VTScal, Instruction INS> {
65746583
def : Pat<(VT128 (vector_insert V128:$src,
6575-
(VTScal (vector_extract (VT128 V128:$Rn), imm:$Immn)),
6576-
imm:$Immd)),
6584+
(VTScal (vector_extract (VT128 V128:$Rn), (i64 imm:$Immn))),
6585+
(i64 imm:$Immd))),
65776586
(INS V128:$src, imm:$Immd, V128:$Rn, imm:$Immn)>;
65786587

65796588
def : Pat<(VT128 (vector_insert V128:$src,
6580-
(VTScal (vector_extract (VT64 V64:$Rn), imm:$Immn)),
6581-
imm:$Immd)),
6589+
(VTScal (vector_extract (VT64 V64:$Rn), (i64 imm:$Immn))),
6590+
(i64 imm:$Immd))),
65826591
(INS V128:$src, imm:$Immd,
65836592
(SUBREG_TO_REG (i64 0), V64:$Rn, dsub), imm:$Immn)>;
65846593

65856594
def : Pat<(VT64 (vector_insert V64:$src,
6586-
(VTScal (vector_extract (VT128 V128:$Rn), imm:$Immn)),
6587-
imm:$Immd)),
6595+
(VTScal (vector_extract (VT128 V128:$Rn), (i64 imm:$Immn))),
6596+
(i64 imm:$Immd))),
65886597
(EXTRACT_SUBREG (INS (SUBREG_TO_REG (i64 0), V64:$src, dsub),
65896598
imm:$Immd, V128:$Rn, imm:$Immn),
65906599
dsub)>;
65916600

65926601
def : Pat<(VT64 (vector_insert V64:$src,
6593-
(VTScal (vector_extract (VT64 V64:$Rn), imm:$Immn)),
6594-
imm:$Immd)),
6602+
(VTScal (vector_extract (VT64 V64:$Rn), (i64 imm:$Immn))),
6603+
(i64 imm:$Immd))),
65956604
(EXTRACT_SUBREG
65966605
(INS (SUBREG_TO_REG (i64 0), V64:$src, dsub), imm:$Immd,
65976606
(SUBREG_TO_REG (i64 0), V64:$Rn, dsub), imm:$Immn),
@@ -6610,14 +6619,14 @@ defm : Neon_INS_elt_pattern<v2i64, v1i64, i64, INSvi64lane>;
66106619

66116620
// Insert from bitcast
66126621
// vector_insert(bitcast(f32 src), n, lane) -> INSvi32lane(src, lane, INSERT_SUBREG(-, n), 0)
6613-
def : Pat<(v4i32 (vector_insert v4i32:$src, (i32 (bitconvert (f32 FPR32:$Sn))), imm:$Immd)),
6622+
def : Pat<(v4i32 (vector_insert v4i32:$src, (i32 (bitconvert (f32 FPR32:$Sn))), (i64 imm:$Immd))),
66146623
(INSvi32lane V128:$src, imm:$Immd, (INSERT_SUBREG (IMPLICIT_DEF), FPR32:$Sn, ssub), 0)>;
6615-
def : Pat<(v2i32 (vector_insert v2i32:$src, (i32 (bitconvert (f32 FPR32:$Sn))), imm:$Immd)),
6624+
def : Pat<(v2i32 (vector_insert v2i32:$src, (i32 (bitconvert (f32 FPR32:$Sn))), (i64 imm:$Immd))),
66166625
(EXTRACT_SUBREG
66176626
(INSvi32lane (v4i32 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), V64:$src, dsub)),
66186627
imm:$Immd, (INSERT_SUBREG (IMPLICIT_DEF), FPR32:$Sn, ssub), 0),
66196628
dsub)>;
6620-
def : Pat<(v2i64 (vector_insert v2i64:$src, (i64 (bitconvert (f64 FPR64:$Sn))), imm:$Immd)),
6629+
def : Pat<(v2i64 (vector_insert v2i64:$src, (i64 (bitconvert (f64 FPR64:$Sn))), (i64 imm:$Immd))),
66216630
(INSvi64lane V128:$src, imm:$Immd, (INSERT_SUBREG (IMPLICIT_DEF), FPR64:$Sn, dsub), 0)>;
66226631

66236632
// bitcast of an extract
@@ -7999,7 +8008,7 @@ def : Pat<(v8bf16 (AArch64dup (bf16 (load GPR64sp:$Rn)))),
79998008
class Ld1Lane128Pat<SDPatternOperator scalar_load, Operand VecIndex,
80008009
ValueType VTy, ValueType STy, Instruction LD1>
80018010
: Pat<(vector_insert (VTy VecListOne128:$Rd),
8002-
(STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx),
8011+
(STy (scalar_load GPR64sp:$Rn)), (i64 VecIndex:$idx)),
80038012
(LD1 VecListOne128:$Rd, VecIndex:$idx, GPR64sp:$Rn)>;
80048013

80058014
def : Ld1Lane128Pat<extloadi8, VectorIndexB, v16i8, i32, LD1i8>;
@@ -8022,14 +8031,14 @@ class Ld1Lane128IdxOpPat<SDPatternOperator scalar_load, Operand
80228031
VecIndex, ValueType VTy, ValueType STy,
80238032
Instruction LD1, SDNodeXForm IdxOp>
80248033
: Pat<(vector_insert (VTy VecListOne128:$Rd),
8025-
(STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx),
8034+
(STy (scalar_load GPR64sp:$Rn)), (i64 VecIndex:$idx)),
80268035
(LD1 VecListOne128:$Rd, (IdxOp VecIndex:$idx), GPR64sp:$Rn)>;
80278036

80288037
class Ld1Lane64IdxOpPat<SDPatternOperator scalar_load, Operand VecIndex,
80298038
ValueType VTy, ValueType STy, Instruction LD1,
80308039
SDNodeXForm IdxOp>
80318040
: Pat<(vector_insert (VTy VecListOne64:$Rd),
8032-
(STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx),
8041+
(STy (scalar_load GPR64sp:$Rn)), (i64 VecIndex:$idx)),
80338042
(EXTRACT_SUBREG
80348043
(LD1 (SUBREG_TO_REG (i32 0), VecListOne64:$Rd, dsub),
80358044
(IdxOp VecIndex:$idx), GPR64sp:$Rn),
@@ -8069,7 +8078,7 @@ let Predicates = [IsNeonAvailable] in {
80698078
class Ld1Lane64Pat<SDPatternOperator scalar_load, Operand VecIndex,
80708079
ValueType VTy, ValueType STy, Instruction LD1>
80718080
: Pat<(vector_insert (VTy VecListOne64:$Rd),
8072-
(STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx),
8081+
(STy (scalar_load GPR64sp:$Rn)), (i64 VecIndex:$idx)),
80738082
(EXTRACT_SUBREG
80748083
(LD1 (SUBREG_TO_REG (i32 0), VecListOne64:$Rd, dsub),
80758084
VecIndex:$idx, GPR64sp:$Rn),

llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp

Lines changed: 25 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ class AArch64InstructionSelector : public InstructionSelector {
191191
MachineInstr *tryAdvSIMDModImmFP(Register Dst, unsigned DstSize, APInt Bits,
192192
MachineIRBuilder &MIRBuilder);
193193

194-
bool selectInsertElt(MachineInstr &I, MachineRegisterInfo &MRI);
195194
bool tryOptConstantBuildVec(MachineInstr &MI, LLT DstTy,
196195
MachineRegisterInfo &MRI);
197196
/// \returns true if a G_BUILD_VECTOR instruction \p MI can be selected as a
@@ -2121,6 +2120,31 @@ bool AArch64InstructionSelector::preISelLower(MachineInstr &I) {
21212120
}
21222121
return false;
21232122
}
2123+
case TargetOpcode::G_INSERT_VECTOR_ELT: {
2124+
Register InsReg = I.getOperand(2).getReg();
2125+
LLT SrcTy = MRI.getType(InsReg);
2126+
if (RBI.getRegBank(InsReg, MRI, TRI)->getID() == AArch64::GPRRegBankID &&
2127+
SrcTy.getSizeInBits() < 32) {
2128+
if (auto *MI = MRI.getVRegDef(InsReg)) {
2129+
if (MI->getOpcode() == TargetOpcode::G_TRUNC &&
2130+
(MRI.getType(MI->getOperand(1).getReg()).getSizeInBits() == 32 ||
2131+
MRI.getType(MI->getOperand(1).getReg()).getSizeInBits() == 64)) {
2132+
I.getOperand(2).setReg(MI->getOperand(1).getReg());
2133+
return true;
2134+
}
2135+
}
2136+
auto Ext = MIB.buildAnyExt(LLT::scalar(32), InsReg);
2137+
Register ExtDst = Ext.getReg(0);
2138+
MRI.setRegBank(ExtDst, RBI.getRegBank(AArch64::GPRRegBankID));
2139+
if (!select(*Ext)) {
2140+
LLVM_DEBUG(dbgs() << "Failed to select G_ANYEXT in G_INSERT_VECTOR_ELT");
2141+
return false;
2142+
}
2143+
I.getOperand(2).setReg(ExtDst);
2144+
return true;
2145+
}
2146+
return false;
2147+
}
21242148
default:
21252149
return false;
21262150
}
@@ -3487,8 +3511,6 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
34873511
return selectShuffleVector(I, MRI);
34883512
case TargetOpcode::G_EXTRACT_VECTOR_ELT:
34893513
return selectExtractElt(I, MRI);
3490-
case TargetOpcode::G_INSERT_VECTOR_ELT:
3491-
return selectInsertElt(I, MRI);
34923514
case TargetOpcode::G_CONCAT_VECTORS:
34933515
return selectConcatVectors(I, MRI);
34943516
case TargetOpcode::G_JUMP_TABLE:
@@ -5319,65 +5341,6 @@ bool AArch64InstructionSelector::selectUSMovFromExtend(
53195341
return true;
53205342
}
53215343

5322-
bool AArch64InstructionSelector::selectInsertElt(MachineInstr &I,
5323-
MachineRegisterInfo &MRI) {
5324-
assert(I.getOpcode() == TargetOpcode::G_INSERT_VECTOR_ELT);
5325-
5326-
// Get information on the destination.
5327-
Register DstReg = I.getOperand(0).getReg();
5328-
const LLT DstTy = MRI.getType(DstReg);
5329-
unsigned VecSize = DstTy.getSizeInBits();
5330-
5331-
// Get information on the element we want to insert into the destination.
5332-
Register EltReg = I.getOperand(2).getReg();
5333-
const LLT EltTy = MRI.getType(EltReg);
5334-
unsigned EltSize = EltTy.getSizeInBits();
5335-
if (EltSize < 8 || EltSize > 64)
5336-
return false;
5337-
5338-
// Find the definition of the index. Bail out if it's not defined by a
5339-
// G_CONSTANT.
5340-
Register IdxReg = I.getOperand(3).getReg();
5341-
auto VRegAndVal = getIConstantVRegValWithLookThrough(IdxReg, MRI);
5342-
if (!VRegAndVal)
5343-
return false;
5344-
unsigned LaneIdx = VRegAndVal->Value.getSExtValue();
5345-
5346-
// Perform the lane insert.
5347-
Register SrcReg = I.getOperand(1).getReg();
5348-
const RegisterBank &EltRB = *RBI.getRegBank(EltReg, MRI, TRI);
5349-
5350-
if (VecSize < 128) {
5351-
// If the vector we're inserting into is smaller than 128 bits, widen it
5352-
// to 128 to do the insert.
5353-
MachineInstr *ScalarToVec =
5354-
emitScalarToVector(VecSize, &AArch64::FPR128RegClass, SrcReg, MIB);
5355-
if (!ScalarToVec)
5356-
return false;
5357-
SrcReg = ScalarToVec->getOperand(0).getReg();
5358-
}
5359-
5360-
// Create an insert into a new FPR128 register.
5361-
// Note that if our vector is already 128 bits, we end up emitting an extra
5362-
// register.
5363-
MachineInstr *InsMI =
5364-
emitLaneInsert(std::nullopt, SrcReg, EltReg, LaneIdx, EltRB, MIB);
5365-
5366-
if (VecSize < 128) {
5367-
// If we had to widen to perform the insert, then we have to demote back to
5368-
// the original size to get the result we want.
5369-
if (!emitNarrowVector(DstReg, InsMI->getOperand(0).getReg(), MIB, MRI))
5370-
return false;
5371-
} else {
5372-
// No widening needed.
5373-
InsMI->getOperand(0).setReg(DstReg);
5374-
constrainSelectedInstRegOperands(*InsMI, TII, TRI, RBI);
5375-
}
5376-
5377-
I.eraseFromParent();
5378-
return true;
5379-
}
5380-
53815344
MachineInstr *AArch64InstructionSelector::tryAdvSIMDModImm8(
53825345
Register Dst, unsigned DstSize, APInt Bits, MachineIRBuilder &Builder) {
53835346
unsigned int Op;

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -870,8 +870,14 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
870870
.clampMaxNumElements(1, p0, 2);
871871

872872
getActionDefinitionsBuilder(G_INSERT_VECTOR_ELT)
873-
.legalIf(typeInSet(0, {v16s8, v8s8, v8s16, v4s16, v4s32, v2s32, v2s64}))
874-
.widenVectorEltsToVectorMinSize(0, 64);
873+
.legalIf(typeInSet(0, {v16s8, v8s8, v8s16, v4s16, v4s32, v2s32, v2s64, v2p0}))
874+
.widenVectorEltsToVectorMinSize(0, 64)
875+
.moreElementsToNextPow2(0)
876+
.clampNumElements(0, v8s8, v16s8)
877+
.clampNumElements(0, v4s16, v8s16)
878+
.clampNumElements(0, v2s32, v4s32)
879+
.clampMaxNumElements(0, s64, 2)
880+
.clampMaxNumElements(0, p0, 2);
875881

876882
getActionDefinitionsBuilder(G_BUILD_VECTOR)
877883
.legalFor({{v8s8, s8},
@@ -2001,11 +2007,11 @@ bool AArch64LegalizerInfo::legalizeFCopySign(MachineInstr &MI,
20012007
// Widen In1 and In2 to 128 bits. We want these to eventually become
20022008
// INSERT_SUBREGs.
20032009
auto Undef = MIRBuilder.buildUndef(VecTy);
2004-
auto Zero = MIRBuilder.buildConstant(DstTy, 0);
2010+
auto ZeroIdx = MIRBuilder.buildConstant(LLT::scalar(64), 0);
20052011
auto Ins1 = MIRBuilder.buildInsertVectorElement(
2006-
VecTy, Undef, MI.getOperand(1).getReg(), Zero);
2012+
VecTy, Undef, MI.getOperand(1).getReg(), ZeroIdx);
20072013
auto Ins2 = MIRBuilder.buildInsertVectorElement(
2008-
VecTy, Undef, MI.getOperand(2).getReg(), Zero);
2014+
VecTy, Undef, MI.getOperand(2).getReg(), ZeroIdx);
20092015

20102016
// Construct the mask.
20112017
auto Mask = MIRBuilder.buildConstant(VecTy, EltMask);

0 commit comments

Comments
 (0)