Skip to content

Commit 5e2b227

Browse files
committed
Use GInsertVectorElement and align stack vectors to 16
1 parent 7b573c1 commit 5e2b227

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

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

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -486,24 +486,25 @@ bool matchNonConstInsert(MachineInstr &MI, MachineRegisterInfo &MRI) {
486486

487487
void applyNonConstInsert(MachineInstr &MI, MachineRegisterInfo &MRI,
488488
MachineIRBuilder &Builder) {
489-
assert(MI.getOpcode() == TargetOpcode::G_INSERT_VECTOR_ELT);
490-
bool InsertVal = true;
491-
Builder.setInstrAndDebugLoc(MI);
489+
auto &Insert = cast<GInsertVectorElement>(MI);
490+
Builder.setInstrAndDebugLoc(Insert);
492491

493-
Register Offset = MI.getOperand(3).getReg();
494-
LLT VecTy = MRI.getType(MI.getOperand(0).getReg());
495-
LLT EltTy = MRI.getType(MI.getOperand(2).getReg());
496-
LLT IdxTy = MRI.getType(MI.getOperand(3).getReg());
492+
Register Offset = Insert.getIndexReg();
493+
LLT VecTy = MRI.getType(Insert.getReg(0));
494+
LLT EltTy = MRI.getType(Insert.getElementReg());
495+
LLT IdxTy = MRI.getType(Insert.getIndexReg());
497496

498497
// Create a stack slot and store the vector into it
499498
MachineFunction &MF = Builder.getMF();
499+
Align Alignment(
500+
std::min<uint64_t>(VecTy.getSizeInBytes().getKnownMinValue(), 16));
500501
int FrameIdx = MF.getFrameInfo().CreateStackObject(VecTy.getSizeInBytes(),
501-
Align(8), false);
502+
Alignment, false);
502503
LLT FramePtrTy = LLT::pointer(0, 64);
503504
MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIdx);
504505
auto StackTemp = Builder.buildFrameIndex(FramePtrTy, FrameIdx);
505506

506-
Builder.buildStore(MI.getOperand(1), StackTemp, PtrInfo, Align(8));
507+
Builder.buildStore(Insert.getOperand(1), StackTemp, PtrInfo, Align(8));
507508

508509
// Get the pointer to the element, and be sure not to hit undefined behavior
509510
// if the index is out of bounds.
@@ -518,10 +519,10 @@ void applyNonConstInsert(MachineInstr &MI, MachineRegisterInfo &MRI,
518519
.getReg(0);
519520

520521
// Write the inserted element
521-
Builder.buildStore(MI.getOperand(2).getReg(), EltPtr, PtrInfo, Align(1));
522+
Builder.buildStore(Insert.getElementReg(), EltPtr, PtrInfo, Align(1));
522523
// Reload the whole vector.
523-
Builder.buildLoad(MI.getOperand(0).getReg(), StackTemp, PtrInfo, Align(8));
524-
MI.eraseFromParent();
524+
Builder.buildLoad(Insert.getReg(0), StackTemp, PtrInfo, Align(8));
525+
Insert.eraseFromParent();
525526
}
526527

527528
/// Match a G_SHUFFLE_VECTOR with a mask which corresponds to a

0 commit comments

Comments
 (0)