diff options
author | Lei Huang <lei@ca.ibm.com> | 2025-06-12 14:38:54 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-12 14:38:54 -0400 |
commit | edf636afe405ff90da7bf1834aa334bd52bc861e (patch) | |
tree | f476d88d6832fbfa017379b05f5776ae9e467f96 /llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp | |
parent | 3c1053811e6925e8b9f7a044f3a18bfda1d7ccfe (diff) | |
download | llvm-edf636afe405ff90da7bf1834aa334bd52bc861e.zip llvm-edf636afe405ff90da7bf1834aa334bd52bc861e.tar.gz llvm-edf636afe405ff90da7bf1834aa334bd52bc861e.tar.bz2 |
[PowerPC][NFC] Update lowering STXVP to STXV in Oct word spilling (#142220)
Remove explicit register arithmetic from spilling ACC and STXVP code.
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp | 93 |
1 files changed, 43 insertions, 50 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp index 45183af..9dc69e2 100644 --- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -1238,42 +1238,6 @@ static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed, #endif } -static void spillRegPairs(MachineBasicBlock &MBB, - MachineBasicBlock::iterator II, DebugLoc DL, - const TargetInstrInfo &TII, Register SrcReg, - unsigned FrameIndex, bool IsLittleEndian, - bool IsKilled, bool TwoPairs) { - unsigned Offset = 0; - // The register arithmetic in this function does not support virtual - // registers. - assert(!SrcReg.isVirtual() && - "Spilling register pairs does not support virtual registers."); - - if (TwoPairs) - Offset = IsLittleEndian ? 48 : 0; - else - Offset = IsLittleEndian ? 16 : 0; - Register Reg = (SrcReg > PPC::VSRp15) ? PPC::V0 + (SrcReg - PPC::VSRp16) * 2 - : PPC::VSL0 + (SrcReg - PPC::VSRp0) * 2; - addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV)) - .addReg(Reg, getKillRegState(IsKilled)), - FrameIndex, Offset); - Offset += IsLittleEndian ? -16 : 16; - addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV)) - .addReg(Reg + 1, getKillRegState(IsKilled)), - FrameIndex, Offset); - if (TwoPairs) { - Offset += IsLittleEndian ? -16 : 16; - addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV)) - .addReg(Reg + 2, getKillRegState(IsKilled)), - FrameIndex, Offset); - Offset += IsLittleEndian ? -16 : 16; - addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV)) - .addReg(Reg + 3, getKillRegState(IsKilled)), - FrameIndex, Offset); - } -} - /// Remove any STXVP[X] instructions and split them out into a pair of /// STXV[X] instructions if --disable-auto-paired-vec-st is specified on /// the command line. @@ -1290,8 +1254,21 @@ void PPCRegisterInfo::lowerOctWordSpilling(MachineBasicBlock::iterator II, Register SrcReg = MI.getOperand(0).getReg(); bool IsLittleEndian = Subtarget.isLittleEndian(); bool IsKilled = MI.getOperand(0).isKill(); - spillRegPairs(MBB, II, DL, TII, SrcReg, FrameIndex, IsLittleEndian, IsKilled, - /* TwoPairs */ false); + + assert(PPC::VSRpRCRegClass.contains(SrcReg) && + "Expecting STXVP to be utilizing a VSRp register."); + + addFrameReference( + BuildMI(MBB, II, DL, TII.get(PPC::STXV)) + .addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_vsx0), + getKillRegState(IsKilled)), + FrameIndex, IsLittleEndian ? 16 : 0); + addFrameReference( + BuildMI(MBB, II, DL, TII.get(PPC::STXV)) + .addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_vsx1), + getKillRegState(IsKilled)), + FrameIndex, IsLittleEndian ? 0 : 16); + // Discard the original instruction. MBB.erase(II); } @@ -1325,8 +1302,6 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II, bool IsKilled = MI.getOperand(0).isKill(); bool IsPrimed = PPC::ACCRCRegClass.contains(SrcReg); - Register Reg = - PPC::VSRp0 + (SrcReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2; bool IsLittleEndian = Subtarget.isLittleEndian(); emitAccSpillRestoreInfo(MBB, IsPrimed, false); @@ -1337,16 +1312,34 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II, // adjust the offset of the store that is within the 64-byte stack slot. if (IsPrimed) BuildMI(MBB, II, DL, TII.get(PPC::XXMFACC), SrcReg).addReg(SrcReg); - if (DisableAutoPairedVecSt) - spillRegPairs(MBB, II, DL, TII, Reg, FrameIndex, IsLittleEndian, IsKilled, - /* TwoPairs */ true); - else { - addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXVP)) - .addReg(Reg, getKillRegState(IsKilled)), - FrameIndex, IsLittleEndian ? 32 : 0); - addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXVP)) - .addReg(Reg + 1, getKillRegState(IsKilled)), - FrameIndex, IsLittleEndian ? 0 : 32); + if (DisableAutoPairedVecSt) { + auto spillPair = [&](Register Reg, int Offset) { + addFrameReference( + BuildMI(MBB, II, DL, TII.get(PPC::STXV)) + .addReg(TargetRegisterInfo::getSubReg(Reg, PPC::sub_vsx0), + getKillRegState(IsKilled)), + FrameIndex, Offset); + addFrameReference( + BuildMI(MBB, II, DL, TII.get(PPC::STXV)) + .addReg(TargetRegisterInfo::getSubReg(Reg, PPC::sub_vsx1), + getKillRegState(IsKilled)), + FrameIndex, IsLittleEndian ? Offset - 16 : Offset + 16); + }; + spillPair(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair0), + IsLittleEndian ? 48 : 0); + spillPair(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair1), + IsLittleEndian ? 16 : 32); + } else { + addFrameReference( + BuildMI(MBB, II, DL, TII.get(PPC::STXVP)) + .addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair0), + getKillRegState(IsKilled)), + FrameIndex, IsLittleEndian ? 32 : 0); + addFrameReference( + BuildMI(MBB, II, DL, TII.get(PPC::STXVP)) + .addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair1), + getKillRegState(IsKilled)), + FrameIndex, IsLittleEndian ? 0 : 32); } if (IsPrimed && !IsKilled) BuildMI(MBB, II, DL, TII.get(PPC::XXMTACC), SrcReg).addReg(SrcReg); |