Skip to content

Commit 907dbb3

Browse files
committed
pre instr select lower to force load/store of pointers to xlen integers
1 parent 7d9d4f2 commit 907dbb3

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,26 @@ void RISCVInstructionSelector::preISelLower(MachineInstr &MI,
786786
replacePtrWithInt(MI.getOperand(1), MIB, MRI);
787787
MI.setDesc(TII.get(TargetOpcode::G_AND));
788788
MRI.setType(DstReg, sXLen);
789+
break;
790+
}
791+
case TargetOpcode::G_LOAD: {
792+
Register DstReg = MI.getOperand(0).getReg();
793+
const LLT DstTy = MRI.getType(DstReg);
794+
if (!(DstTy.isVector() && DstTy.getElementType().isPointer()))
795+
break;
796+
const LLT sXLen = LLT::scalar(STI.getXLen());
797+
MRI.setType(DstReg, LLT::scalable_vector(DstTy.getElementCount().getKnownMinValue(), sXLen));
798+
break;
799+
}
800+
case TargetOpcode::G_STORE: {
801+
MachineOperand &SrcOp = MI.getOperand(0);
802+
const LLT SrcTy = MRI.getType(SrcOp.getReg());
803+
if (!(SrcTy.isVector() && SrcTy.getElementType().isPointer()))
804+
break;
805+
const LLT sXLen = LLT::scalar(STI.getXLen());
806+
auto Copy = MIB.buildCopy(LLT::scalable_vector(SrcTy.getElementCount().getKnownMinValue(), sXLen), SrcOp);
807+
Register NewSrc = Copy.getReg(0);
808+
SrcOp.setReg(NewSrc);
789809
}
790810
}
791811
}

0 commit comments

Comments
 (0)