Skip to content

Commit edf636a

Browse files
authored
[PowerPC][NFC] Update lowering STXVP to STXV in Oct word spilling (llvm#142220)
Remove explicit register arithmetic from spilling ACC and STXVP code.
1 parent 3c10538 commit edf636a

File tree

1 file changed

+43
-50
lines changed

1 file changed

+43
-50
lines changed

llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp

Lines changed: 43 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,42 +1238,6 @@ static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed,
12381238
#endif
12391239
}
12401240

1241-
static void spillRegPairs(MachineBasicBlock &MBB,
1242-
MachineBasicBlock::iterator II, DebugLoc DL,
1243-
const TargetInstrInfo &TII, Register SrcReg,
1244-
unsigned FrameIndex, bool IsLittleEndian,
1245-
bool IsKilled, bool TwoPairs) {
1246-
unsigned Offset = 0;
1247-
// The register arithmetic in this function does not support virtual
1248-
// registers.
1249-
assert(!SrcReg.isVirtual() &&
1250-
"Spilling register pairs does not support virtual registers.");
1251-
1252-
if (TwoPairs)
1253-
Offset = IsLittleEndian ? 48 : 0;
1254-
else
1255-
Offset = IsLittleEndian ? 16 : 0;
1256-
Register Reg = (SrcReg > PPC::VSRp15) ? PPC::V0 + (SrcReg - PPC::VSRp16) * 2
1257-
: PPC::VSL0 + (SrcReg - PPC::VSRp0) * 2;
1258-
addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1259-
.addReg(Reg, getKillRegState(IsKilled)),
1260-
FrameIndex, Offset);
1261-
Offset += IsLittleEndian ? -16 : 16;
1262-
addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1263-
.addReg(Reg + 1, getKillRegState(IsKilled)),
1264-
FrameIndex, Offset);
1265-
if (TwoPairs) {
1266-
Offset += IsLittleEndian ? -16 : 16;
1267-
addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1268-
.addReg(Reg + 2, getKillRegState(IsKilled)),
1269-
FrameIndex, Offset);
1270-
Offset += IsLittleEndian ? -16 : 16;
1271-
addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1272-
.addReg(Reg + 3, getKillRegState(IsKilled)),
1273-
FrameIndex, Offset);
1274-
}
1275-
}
1276-
12771241
/// Remove any STXVP[X] instructions and split them out into a pair of
12781242
/// STXV[X] instructions if --disable-auto-paired-vec-st is specified on
12791243
/// the command line.
@@ -1290,8 +1254,21 @@ void PPCRegisterInfo::lowerOctWordSpilling(MachineBasicBlock::iterator II,
12901254
Register SrcReg = MI.getOperand(0).getReg();
12911255
bool IsLittleEndian = Subtarget.isLittleEndian();
12921256
bool IsKilled = MI.getOperand(0).isKill();
1293-
spillRegPairs(MBB, II, DL, TII, SrcReg, FrameIndex, IsLittleEndian, IsKilled,
1294-
/* TwoPairs */ false);
1257+
1258+
assert(PPC::VSRpRCRegClass.contains(SrcReg) &&
1259+
"Expecting STXVP to be utilizing a VSRp register.");
1260+
1261+
addFrameReference(
1262+
BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1263+
.addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_vsx0),
1264+
getKillRegState(IsKilled)),
1265+
FrameIndex, IsLittleEndian ? 16 : 0);
1266+
addFrameReference(
1267+
BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1268+
.addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_vsx1),
1269+
getKillRegState(IsKilled)),
1270+
FrameIndex, IsLittleEndian ? 0 : 16);
1271+
12951272
// Discard the original instruction.
12961273
MBB.erase(II);
12971274
}
@@ -1325,8 +1302,6 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
13251302
bool IsKilled = MI.getOperand(0).isKill();
13261303

13271304
bool IsPrimed = PPC::ACCRCRegClass.contains(SrcReg);
1328-
Register Reg =
1329-
PPC::VSRp0 + (SrcReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2;
13301305
bool IsLittleEndian = Subtarget.isLittleEndian();
13311306

13321307
emitAccSpillRestoreInfo(MBB, IsPrimed, false);
@@ -1337,16 +1312,34 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
13371312
// adjust the offset of the store that is within the 64-byte stack slot.
13381313
if (IsPrimed)
13391314
BuildMI(MBB, II, DL, TII.get(PPC::XXMFACC), SrcReg).addReg(SrcReg);
1340-
if (DisableAutoPairedVecSt)
1341-
spillRegPairs(MBB, II, DL, TII, Reg, FrameIndex, IsLittleEndian, IsKilled,
1342-
/* TwoPairs */ true);
1343-
else {
1344-
addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXVP))
1345-
.addReg(Reg, getKillRegState(IsKilled)),
1346-
FrameIndex, IsLittleEndian ? 32 : 0);
1347-
addFrameReference(BuildMI(MBB, II, DL, TII.get(PPC::STXVP))
1348-
.addReg(Reg + 1, getKillRegState(IsKilled)),
1349-
FrameIndex, IsLittleEndian ? 0 : 32);
1315+
if (DisableAutoPairedVecSt) {
1316+
auto spillPair = [&](Register Reg, int Offset) {
1317+
addFrameReference(
1318+
BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1319+
.addReg(TargetRegisterInfo::getSubReg(Reg, PPC::sub_vsx0),
1320+
getKillRegState(IsKilled)),
1321+
FrameIndex, Offset);
1322+
addFrameReference(
1323+
BuildMI(MBB, II, DL, TII.get(PPC::STXV))
1324+
.addReg(TargetRegisterInfo::getSubReg(Reg, PPC::sub_vsx1),
1325+
getKillRegState(IsKilled)),
1326+
FrameIndex, IsLittleEndian ? Offset - 16 : Offset + 16);
1327+
};
1328+
spillPair(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair0),
1329+
IsLittleEndian ? 48 : 0);
1330+
spillPair(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair1),
1331+
IsLittleEndian ? 16 : 32);
1332+
} else {
1333+
addFrameReference(
1334+
BuildMI(MBB, II, DL, TII.get(PPC::STXVP))
1335+
.addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair0),
1336+
getKillRegState(IsKilled)),
1337+
FrameIndex, IsLittleEndian ? 32 : 0);
1338+
addFrameReference(
1339+
BuildMI(MBB, II, DL, TII.get(PPC::STXVP))
1340+
.addReg(TargetRegisterInfo::getSubReg(SrcReg, PPC::sub_pair1),
1341+
getKillRegState(IsKilled)),
1342+
FrameIndex, IsLittleEndian ? 0 : 32);
13501343
}
13511344
if (IsPrimed && !IsKilled)
13521345
BuildMI(MBB, II, DL, TII.get(PPC::XXMTACC), SrcReg).addReg(SrcReg);

0 commit comments

Comments
 (0)