forked from OSchip/llvm-project
X86FloatingPoint: Fix livein lists
After transforming FP to ST registers: - Do not add the ST register to the livein lists, they are reserved so we do not need to track their liveness. - Remove the FP registers from the livein lists, they don't have defs or uses anymore and so are not live. - (The setKillFlags() call is moved to an earlier place as it relies on the FP registers still being present in the livein list.) llvm-svn: 304342
This commit is contained in:
parent
43692a2245
commit
ac4beccaca
|
@ -335,6 +335,9 @@ public:
|
|||
return make_range(livein_begin(), livein_end());
|
||||
}
|
||||
|
||||
/// Remove entry from the livein set and return iterator to the next.
|
||||
livein_iterator removeLiveIn(livein_iterator I);
|
||||
|
||||
/// Get the clobber mask for the start of this basic block. Funclets use this
|
||||
/// to prevent register allocation across funclet transitions.
|
||||
const uint32_t *getBeginClobberMask(const TargetRegisterInfo *TRI) const;
|
||||
|
|
|
@ -350,6 +350,11 @@ void MachineBasicBlock::removeLiveIn(MCPhysReg Reg, LaneBitmask LaneMask) {
|
|||
LiveIns.erase(I);
|
||||
}
|
||||
|
||||
MachineBasicBlock::livein_iterator
|
||||
MachineBasicBlock::removeLiveIn(MachineBasicBlock::livein_iterator I) {
|
||||
return LiveIns.erase(I);
|
||||
}
|
||||
|
||||
bool MachineBasicBlock::isLiveIn(MCPhysReg Reg, LaneBitmask LaneMask) const {
|
||||
livein_iterator I = find_if(
|
||||
LiveIns, [Reg](const RegisterMaskPair &LI) { return LI.PhysReg == Reg; });
|
||||
|
|
|
@ -123,20 +123,26 @@ namespace {
|
|||
EdgeBundles *Bundles;
|
||||
|
||||
// Return a bitmask of FP registers in block's live-in list.
|
||||
static unsigned calcLiveInMask(MachineBasicBlock *MBB) {
|
||||
static unsigned calcLiveInMask(MachineBasicBlock *MBB, bool RemoveFPs) {
|
||||
unsigned Mask = 0;
|
||||
for (const auto &LI : MBB->liveins()) {
|
||||
MCPhysReg Reg = LI.PhysReg;
|
||||
static_assert(X86::FP7 - X86::FP0 == 7, "sequential FP regnumbers");
|
||||
if (Reg < X86::FP0 || Reg > X86::FP6)
|
||||
continue;
|
||||
Mask |= 1 << (Reg - X86::FP0);
|
||||
for (MachineBasicBlock::livein_iterator I = MBB->livein_begin();
|
||||
I != MBB->livein_end(); ) {
|
||||
MCPhysReg Reg = I->PhysReg;
|
||||
static_assert(X86::FP6 - X86::FP0 == 6, "sequential regnums");
|
||||
if (Reg >= X86::FP0 && Reg <= X86::FP6) {
|
||||
Mask |= 1 << (Reg - X86::FP0);
|
||||
if (RemoveFPs) {
|
||||
I = MBB->removeLiveIn(I);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
++I;
|
||||
}
|
||||
return Mask;
|
||||
}
|
||||
|
||||
// Partition all the CFG edges into LiveBundles.
|
||||
void bundleCFG(MachineFunction &MF);
|
||||
void bundleCFGRecomputeKillFlags(MachineFunction &MF);
|
||||
|
||||
MachineBasicBlock *MBB; // Current basic block
|
||||
|
||||
|
@ -329,7 +335,7 @@ bool FPS::runOnMachineFunction(MachineFunction &MF) {
|
|||
TII = MF.getSubtarget().getInstrInfo();
|
||||
|
||||
// Prepare cross-MBB liveness.
|
||||
bundleCFG(MF);
|
||||
bundleCFGRecomputeKillFlags(MF);
|
||||
|
||||
StackTop = 0;
|
||||
|
||||
|
@ -377,13 +383,15 @@ bool FPS::runOnMachineFunction(MachineFunction &MF) {
|
|||
/// registers live-out from a block is identical to the live-in set of all
|
||||
/// successors. This is not enforced by the normal live-in lists since
|
||||
/// registers may be implicitly defined, or not used by all successors.
|
||||
void FPS::bundleCFG(MachineFunction &MF) {
|
||||
void FPS::bundleCFGRecomputeKillFlags(MachineFunction &MF) {
|
||||
assert(LiveBundles.empty() && "Stale data in LiveBundles");
|
||||
LiveBundles.resize(Bundles->getNumBundles());
|
||||
|
||||
// Gather the actual live-in masks for all MBBs.
|
||||
for (MachineBasicBlock &MBB : MF) {
|
||||
const unsigned Mask = calcLiveInMask(&MBB);
|
||||
setKillFlags(MBB);
|
||||
|
||||
const unsigned Mask = calcLiveInMask(&MBB, false);
|
||||
if (!Mask)
|
||||
continue;
|
||||
// Update MBB ingoing bundle mask.
|
||||
|
@ -398,7 +406,6 @@ bool FPS::processBasicBlock(MachineFunction &MF, MachineBasicBlock &BB) {
|
|||
bool Changed = false;
|
||||
MBB = &BB;
|
||||
|
||||
setKillFlags(BB);
|
||||
setupBlockStack();
|
||||
|
||||
for (MachineBasicBlock::iterator I = BB.begin(); I != BB.end(); ++I) {
|
||||
|
@ -509,8 +516,6 @@ void FPS::setupBlockStack() {
|
|||
|
||||
// Push the fixed live-in registers.
|
||||
for (unsigned i = Bundle.FixCount; i > 0; --i) {
|
||||
static_assert(X86::ST7 - X86::ST0 == 7, "sequential ST regnumbers");
|
||||
MBB->addLiveIn(X86::ST0+i-1);
|
||||
DEBUG(dbgs() << "Live-in st(" << (i-1) << "): %FP"
|
||||
<< unsigned(Bundle.FixStack[i-1]) << '\n');
|
||||
pushReg(Bundle.FixStack[i-1]);
|
||||
|
@ -519,7 +524,8 @@ void FPS::setupBlockStack() {
|
|||
// Kill off unwanted live-ins. This can happen with a critical edge.
|
||||
// FIXME: We could keep these live registers around as zombies. They may need
|
||||
// to be revived at the end of a short block. It might save a few instrs.
|
||||
adjustLiveRegs(calcLiveInMask(MBB), MBB->begin());
|
||||
unsigned Mask = calcLiveInMask(MBB, /*RemoveFPs=*/true);
|
||||
adjustLiveRegs(Mask, MBB->begin());
|
||||
DEBUG(MBB->dump());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue