Skip to content

Commit

Permalink
BranchRelaxation: Recompute live-ins when splitting a block
Browse files Browse the repository at this point in the history
Factors out and reuses live-in computation code from BranchFolding.

Differential Revision: https://reviews.llvm.org/D27558

llvm-svn: 290013
  • Loading branch information
MatzeB committed Dec 16, 2016
1 parent 2dfb688 commit 1819830
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 30 deletions.
7 changes: 7 additions & 0 deletions llvm/include/llvm/CodeGen/LivePhysRegs.h
Expand Up @@ -155,6 +155,13 @@ inline raw_ostream &operator<<(raw_ostream &OS, const LivePhysRegs& LR) {
return OS;
}

/// Compute the live-in list for \p MBB assuming all of its successors live-in
/// lists are up-to-date. Uses the given LivePhysReg instance \p LiveRegs; This
/// is just here to avoid repeated heap allocations when calling this multiple
/// times in a pass.
void computeLiveIns(LivePhysRegs &LiveRegs, const TargetRegisterInfo &TRI,
MachineBasicBlock &MBB);

} // end namespace llvm

#endif // LLVM_CODEGEN_LIVEPHYSREGS_H
3 changes: 3 additions & 0 deletions llvm/include/llvm/CodeGen/MachineBasicBlock.h
Expand Up @@ -289,6 +289,9 @@ class MachineBasicBlock
/// LiveIn insertion.
void sortUniqueLiveIns();

/// Clear live in list.
void clearLiveIns();

/// Add PhysReg as live in to this block, and ensure that there is a copy of
/// PhysReg to a virtual register of class RC. Return the virtual register
/// that is a copy of the live in PhysReg.
Expand Down
32 changes: 6 additions & 26 deletions llvm/lib/CodeGen/BranchFolding.cpp
Expand Up @@ -349,37 +349,16 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1,
return TailLen;
}

void BranchFolder::computeLiveIns(MachineBasicBlock &MBB) {
if (!UpdateLiveIns)
return;

LiveRegs.init(*TRI);
LiveRegs.addLiveOutsNoPristines(MBB);
for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend()))
LiveRegs.stepBackward(MI);

for (unsigned Reg : LiveRegs) {
// Skip the register if we are about to add one of its super registers.
bool ContainsSuperReg = false;
for (MCSuperRegIterator SReg(Reg, TRI); SReg.isValid(); ++SReg) {
if (LiveRegs.contains(*SReg)) {
ContainsSuperReg = true;
break;
}
}
if (ContainsSuperReg)
continue;
MBB.addLiveIn(Reg);
}
}

/// ReplaceTailWithBranchTo - Delete the instruction OldInst and everything
/// after it, replacing it with an unconditional branch to NewDest.
void BranchFolder::ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
MachineBasicBlock *NewDest) {
TII->ReplaceTailWithBranchTo(OldInst, NewDest);

computeLiveIns(*NewDest);
if (UpdateLiveIns) {
NewDest->clearLiveIns();
computeLiveIns(LiveRegs, *TRI, *NewDest);
}

++NumTailMerge;
}
Expand Down Expand Up @@ -417,7 +396,8 @@ MachineBasicBlock *BranchFolder::SplitMBBAt(MachineBasicBlock &CurMBB,
// NewMBB inherits CurMBB's block frequency.
MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));

computeLiveIns(*NewMBB);
if (UpdateLiveIns)
computeLiveIns(LiveRegs, *TRI, *NewMBB);

// Add the new block to the funclet.
const auto &FuncletI = FuncletMembership.find(&CurMBB);
Expand Down
1 change: 0 additions & 1 deletion llvm/lib/CodeGen/BranchFolding.h
Expand Up @@ -137,7 +137,6 @@ namespace llvm {
MachineBasicBlock* PredBB,
unsigned MinCommonTailLength);
void setCommonTailEdgeWeights(MachineBasicBlock &TailMBB);
void computeLiveIns(MachineBasicBlock &MBB);
void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
MachineBasicBlock *NewDest);
MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,
Expand Down
14 changes: 11 additions & 3 deletions llvm/lib/CodeGen/BranchRelaxation.cpp
Expand Up @@ -10,6 +10,7 @@
#include "llvm/CodeGen/Passes.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/LivePhysRegs.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/Target/TargetInstrInfo.h"
Expand Down Expand Up @@ -69,8 +70,10 @@ class BranchRelaxation : public MachineFunctionPass {

SmallVector<BasicBlockInfo, 16> BlockInfo;
std::unique_ptr<RegScavenger> RS;
LivePhysRegs LiveRegs;

MachineFunction *MF;
const TargetRegisterInfo *TRI;
const TargetInstrInfo *TII;

bool relaxBranchInstructions();
Expand Down Expand Up @@ -252,6 +255,10 @@ MachineBasicBlock *BranchRelaxation::splitBlockBeforeInstr(MachineInstr &MI,
// All BBOffsets following these blocks must be modified.
adjustBlockOffsets(*OrigBB);

// Need to fix live-in lists if we track liveness.
if (TRI->trackLivenessAfterRegAlloc(*MF))
computeLiveIns(LiveRegs, *TRI, *NewBB);

++NumSplit;

return NewBB;
Expand Down Expand Up @@ -411,8 +418,9 @@ bool BranchRelaxation::relaxBranchInstructions() {
for (MachineFunction::iterator I = MF->begin(); I != MF->end(); ++I) {
MachineBasicBlock &MBB = *I;

auto Last = MBB.rbegin();
if (Last == MBB.rend()) // Empty block.
// Empty block?
MachineBasicBlock::iterator Last = MBB.getLastNonDebugInstr();
if (Last == MBB.end())
continue;

// Expand the unconditional branch first if necessary. If there is a
Expand Down Expand Up @@ -473,7 +481,7 @@ bool BranchRelaxation::runOnMachineFunction(MachineFunction &mf) {
const TargetSubtargetInfo &ST = MF->getSubtarget();
TII = ST.getInstrInfo();

const TargetRegisterInfo *TRI = ST.getRegisterInfo();
TRI = ST.getRegisterInfo();
if (TRI->trackLivenessAfterRegAlloc(*MF))
RS.reset(new RegScavenger());

Expand Down
23 changes: 23 additions & 0 deletions llvm/lib/CodeGen/LivePhysRegs.cpp
Expand Up @@ -197,3 +197,26 @@ void LivePhysRegs::addLiveIns(const MachineBasicBlock &MBB) {
addPristines(*this, MF, MFI, *TRI);
addBlockLiveIns(MBB);
}

void llvm::computeLiveIns(LivePhysRegs &LiveRegs, const TargetRegisterInfo &TRI,
MachineBasicBlock &MBB) {
assert(MBB.livein_empty());
LiveRegs.init(TRI);
LiveRegs.addLiveOutsNoPristines(MBB);
for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend()))
LiveRegs.stepBackward(MI);

for (unsigned Reg : LiveRegs) {
// Skip the register if we are about to add one of its super registers.
bool ContainsSuperReg = false;
for (MCSuperRegIterator SReg(Reg, &TRI); SReg.isValid(); ++SReg) {
if (LiveRegs.contains(*SReg)) {
ContainsSuperReg = true;
break;
}
}
if (ContainsSuperReg)
continue;
MBB.addLiveIn(Reg);
}
}
4 changes: 4 additions & 0 deletions llvm/lib/CodeGen/MachineBasicBlock.cpp
Expand Up @@ -1288,3 +1288,7 @@ MachineBasicBlock::getEndClobberMask(const TargetRegisterInfo *TRI) const {
// care what kind of return it is, putting a mask after it is a no-op.
return isReturnBlock() && !succ_empty() ? TRI->getNoPreservedMask() : nullptr;
}

void MachineBasicBlock::clearLiveIns() {
LiveIns.clear();
}

0 comments on commit 1819830

Please sign in to comment.