[llvm-branch-commits] [llvm] AMDGPU: Support VALU add instructions in localstackalloc (PR #101692)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Aug 2 12:46:57 PDT 2024
================
@@ -877,6 +948,86 @@ Register SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, Register BaseReg,
int64_t Offset) const {
const SIInstrInfo *TII = ST.getInstrInfo();
+
+ switch (MI.getOpcode()) {
+ case AMDGPU::V_ADD_U32_e32:
+ case AMDGPU::V_ADD_CO_U32_e32: {
+ MachineOperand *FIOp = &MI.getOperand(2);
+ MachineOperand *ImmOp = &MI.getOperand(1);
+ if (!FIOp->isFI())
+ std::swap(FIOp, ImmOp);
+
+ if (!ImmOp->isImm()) {
+ assert(Offset == 0);
+ FIOp->ChangeToRegister(BaseReg, false);
+ TII->legalizeOperandsVOP2(MI.getMF()->getRegInfo(), MI);
+ return;
+ }
+
+ int64_t TotalOffset = ImmOp->getImm() + Offset;
+ if (TotalOffset == 0) {
+ MI.setDesc(TII->get(AMDGPU::COPY));
+ for (unsigned I = MI.getNumOperands() - 1; I != 1; --I)
+ MI.removeOperand(I);
+
+ MI.getOperand(1).ChangeToRegister(BaseReg, false);
+ return;
+ }
+
+ ImmOp->setImm(TotalOffset);
+
+ MachineBasicBlock *MBB = MI.getParent();
+ MachineFunction *MF = MBB->getParent();
+ MachineRegisterInfo &MRI = MF->getRegInfo();
+
+ // FIXME: materializeFrameBaseRegister does not know the register class of
+ // the uses of the frame index, and assumes SGPR for enableFlatScratch. Emit
+ // a copy so we have a legal operand and hope the register coalescer can
+ // clean it up.
+ if (isSGPRReg(MRI, BaseReg)) {
+ Register BaseRegVGPR =
+ MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
+ BuildMI(*MBB, MI, MI.getDebugLoc(), TII->get(AMDGPU::COPY), BaseRegVGPR)
+ .addReg(BaseReg);
+ MI.getOperand(2).ChangeToRegister(BaseRegVGPR, false);
+ } else {
+ MI.getOperand(2).ChangeToRegister(BaseReg, false);
+ }
+ return;
+ }
+ case AMDGPU::V_ADD_U32_e64:
+ case AMDGPU::V_ADD_CO_U32_e64: {
+ int Src0Idx = MI.getNumExplicitDefs();
----------------
arsenm wrote:
It should work if the clamp is set. This isn't changing the value
https://github.com/llvm/llvm-project/pull/101692
More information about the llvm-branch-commits
mailing list