forked from OSchip/llvm-project
TailDuplicator: Use Register
This commit is contained in:
parent
cac655f233
commit
edb4a5cb36
|
@ -50,13 +50,13 @@ class TailDuplicator {
|
|||
unsigned TailDupSize;
|
||||
|
||||
// A list of virtual registers for which to update SSA form.
|
||||
SmallVector<unsigned, 16> SSAUpdateVRs;
|
||||
SmallVector<Register, 16> SSAUpdateVRs;
|
||||
|
||||
// For each virtual register in SSAUpdateVals keep a list of source virtual
|
||||
// registers.
|
||||
using AvailableValsTy = std::vector<std::pair<MachineBasicBlock *, unsigned>>;
|
||||
using AvailableValsTy = std::vector<std::pair<MachineBasicBlock *, Register>>;
|
||||
|
||||
DenseMap<unsigned, AvailableValsTy> SSAUpdateVals;
|
||||
DenseMap<Register, AvailableValsTy> SSAUpdateVals;
|
||||
|
||||
public:
|
||||
/// Prepare to run on a specific machine function.
|
||||
|
@ -98,24 +98,24 @@ public:
|
|||
private:
|
||||
using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
|
||||
|
||||
void addSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
|
||||
void addSSAUpdateEntry(Register OrigReg, Register NewReg,
|
||||
MachineBasicBlock *BB);
|
||||
void processPHI(MachineInstr *MI, MachineBasicBlock *TailBB,
|
||||
MachineBasicBlock *PredBB,
|
||||
DenseMap<unsigned, RegSubRegPair> &LocalVRMap,
|
||||
SmallVectorImpl<std::pair<unsigned, RegSubRegPair>> &Copies,
|
||||
const DenseSet<unsigned> &UsedByPhi, bool Remove);
|
||||
DenseMap<Register, RegSubRegPair> &LocalVRMap,
|
||||
SmallVectorImpl<std::pair<Register, RegSubRegPair>> &Copies,
|
||||
const DenseSet<Register> &UsedByPhi, bool Remove);
|
||||
void duplicateInstruction(MachineInstr *MI, MachineBasicBlock *TailBB,
|
||||
MachineBasicBlock *PredBB,
|
||||
DenseMap<unsigned, RegSubRegPair> &LocalVRMap,
|
||||
const DenseSet<unsigned> &UsedByPhi);
|
||||
DenseMap<Register, RegSubRegPair> &LocalVRMap,
|
||||
const DenseSet<Register> &UsedByPhi);
|
||||
void updateSuccessorsPHIs(MachineBasicBlock *FromBB, bool isDead,
|
||||
SmallVectorImpl<MachineBasicBlock *> &TDBBs,
|
||||
SmallSetVector<MachineBasicBlock *, 8> &Succs);
|
||||
bool canCompletelyDuplicateBB(MachineBasicBlock &BB);
|
||||
bool duplicateSimpleBB(MachineBasicBlock *TailBB,
|
||||
SmallVectorImpl<MachineBasicBlock *> &TDBBs,
|
||||
const DenseSet<unsigned> &RegsUsedByPhi,
|
||||
const DenseSet<Register> &RegsUsedByPhi,
|
||||
SmallVectorImpl<MachineInstr *> &Copies);
|
||||
bool tailDuplicate(bool IsSimple,
|
||||
MachineBasicBlock *TailBB,
|
||||
|
@ -124,7 +124,7 @@ private:
|
|||
SmallVectorImpl<MachineInstr *> &Copies,
|
||||
SmallVectorImpl<MachineBasicBlock *> *CandidatePtr);
|
||||
void appendCopies(MachineBasicBlock *MBB,
|
||||
SmallVectorImpl<std::pair<unsigned,RegSubRegPair>> &CopyInfos,
|
||||
SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
|
||||
SmallVectorImpl<MachineInstr *> &Copies);
|
||||
|
||||
void removeDeadBlock(
|
||||
|
|
|
@ -206,11 +206,11 @@ bool TailDuplicator::tailDuplicateAndUpdate(
|
|||
}
|
||||
|
||||
// Add the new vregs as available values.
|
||||
DenseMap<unsigned, AvailableValsTy>::iterator LI =
|
||||
DenseMap<Register, AvailableValsTy>::iterator LI =
|
||||
SSAUpdateVals.find(VReg);
|
||||
for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
|
||||
MachineBasicBlock *SrcBB = LI->second[j].first;
|
||||
unsigned SrcReg = LI->second[j].second;
|
||||
Register SrcReg = LI->second[j].second;
|
||||
SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
|
||||
}
|
||||
|
||||
|
@ -294,7 +294,7 @@ bool TailDuplicator::tailDuplicateBlocks() {
|
|||
return MadeChange;
|
||||
}
|
||||
|
||||
static bool isDefLiveOut(unsigned Reg, MachineBasicBlock *BB,
|
||||
static bool isDefLiveOut(Register Reg, MachineBasicBlock *BB,
|
||||
const MachineRegisterInfo *MRI) {
|
||||
for (MachineInstr &UseMI : MRI->use_instructions(Reg)) {
|
||||
if (UseMI.isDebugValue())
|
||||
|
@ -316,7 +316,7 @@ static unsigned getPHISrcRegOpIdx(MachineInstr *MI, MachineBasicBlock *SrcBB) {
|
|||
// used to determine which registers are liveout while modifying the
|
||||
// block (which is why we need to copy the information).
|
||||
static void getRegsUsedByPHIs(const MachineBasicBlock &BB,
|
||||
DenseSet<unsigned> *UsedByPhi) {
|
||||
DenseSet<Register> *UsedByPhi) {
|
||||
for (const auto &MI : BB) {
|
||||
if (!MI.isPHI())
|
||||
break;
|
||||
|
@ -328,9 +328,9 @@ static void getRegsUsedByPHIs(const MachineBasicBlock &BB,
|
|||
}
|
||||
|
||||
/// Add a definition and source virtual registers pair for SSA update.
|
||||
void TailDuplicator::addSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
|
||||
void TailDuplicator::addSSAUpdateEntry(Register OrigReg, Register NewReg,
|
||||
MachineBasicBlock *BB) {
|
||||
DenseMap<unsigned, AvailableValsTy>::iterator LI =
|
||||
DenseMap<Register, AvailableValsTy>::iterator LI =
|
||||
SSAUpdateVals.find(OrigReg);
|
||||
if (LI != SSAUpdateVals.end())
|
||||
LI->second.push_back(std::make_pair(BB, NewReg));
|
||||
|
@ -346,9 +346,9 @@ void TailDuplicator::addSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
|
|||
/// source register that's contributed by PredBB and update SSA update map.
|
||||
void TailDuplicator::processPHI(
|
||||
MachineInstr *MI, MachineBasicBlock *TailBB, MachineBasicBlock *PredBB,
|
||||
DenseMap<unsigned, RegSubRegPair> &LocalVRMap,
|
||||
SmallVectorImpl<std::pair<unsigned, RegSubRegPair>> &Copies,
|
||||
const DenseSet<unsigned> &RegsUsedByPhi, bool Remove) {
|
||||
DenseMap<Register, RegSubRegPair> &LocalVRMap,
|
||||
SmallVectorImpl<std::pair<Register, RegSubRegPair>> &Copies,
|
||||
const DenseSet<Register> &RegsUsedByPhi, bool Remove) {
|
||||
Register DefReg = MI->getOperand(0).getReg();
|
||||
unsigned SrcOpIdx = getPHISrcRegOpIdx(MI, PredBB);
|
||||
assert(SrcOpIdx && "Unable to find matching PHI source?");
|
||||
|
@ -378,8 +378,8 @@ void TailDuplicator::processPHI(
|
|||
/// the source operands due to earlier PHI translation.
|
||||
void TailDuplicator::duplicateInstruction(
|
||||
MachineInstr *MI, MachineBasicBlock *TailBB, MachineBasicBlock *PredBB,
|
||||
DenseMap<unsigned, RegSubRegPair> &LocalVRMap,
|
||||
const DenseSet<unsigned> &UsedByPhi) {
|
||||
DenseMap<Register, RegSubRegPair> &LocalVRMap,
|
||||
const DenseSet<Register> &UsedByPhi) {
|
||||
// Allow duplication of CFI instructions.
|
||||
if (MI->isCFIInstruction()) {
|
||||
BuildMI(*PredBB, PredBB->end(), PredBB->findDebugLoc(PredBB->begin()),
|
||||
|
@ -504,7 +504,7 @@ void TailDuplicator::updateSuccessorsPHIs(
|
|||
// If Idx is set, the operands at Idx and Idx+1 must be removed.
|
||||
// We reuse the location to avoid expensive RemoveOperand calls.
|
||||
|
||||
DenseMap<unsigned, AvailableValsTy>::iterator LI =
|
||||
DenseMap<Register, AvailableValsTy>::iterator LI =
|
||||
SSAUpdateVals.find(Reg);
|
||||
if (LI != SSAUpdateVals.end()) {
|
||||
// This register is defined in the tail block.
|
||||
|
@ -517,7 +517,7 @@ void TailDuplicator::updateSuccessorsPHIs(
|
|||
if (!SrcBB->isSuccessor(SuccBB))
|
||||
continue;
|
||||
|
||||
unsigned SrcReg = LI->second[j].second;
|
||||
Register SrcReg = LI->second[j].second;
|
||||
if (Idx != 0) {
|
||||
MI.getOperand(Idx).setReg(SrcReg);
|
||||
MI.getOperand(Idx + 1).setMBB(SrcBB);
|
||||
|
@ -708,7 +708,7 @@ bool TailDuplicator::canCompletelyDuplicateBB(MachineBasicBlock &BB) {
|
|||
|
||||
bool TailDuplicator::duplicateSimpleBB(
|
||||
MachineBasicBlock *TailBB, SmallVectorImpl<MachineBasicBlock *> &TDBBs,
|
||||
const DenseSet<unsigned> &UsedByPhi,
|
||||
const DenseSet<Register> &UsedByPhi,
|
||||
SmallVectorImpl<MachineInstr *> &Copies) {
|
||||
SmallPtrSet<MachineBasicBlock *, 8> Succs(TailBB->succ_begin(),
|
||||
TailBB->succ_end());
|
||||
|
@ -815,7 +815,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
|
|||
|
||||
bool ShouldUpdateTerminators = TailBB->canFallThrough();
|
||||
|
||||
DenseSet<unsigned> UsedByPhi;
|
||||
DenseSet<Register> UsedByPhi;
|
||||
getRegsUsedByPHIs(*TailBB, &UsedByPhi);
|
||||
|
||||
if (IsSimple)
|
||||
|
@ -860,8 +860,8 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
|
|||
TII->removeBranch(*PredBB);
|
||||
|
||||
// Clone the contents of TailBB into PredBB.
|
||||
DenseMap<unsigned, RegSubRegPair> LocalVRMap;
|
||||
SmallVector<std::pair<unsigned, RegSubRegPair>, 4> CopyInfos;
|
||||
DenseMap<Register, RegSubRegPair> LocalVRMap;
|
||||
SmallVector<std::pair<Register, RegSubRegPair>, 4> CopyInfos;
|
||||
for (MachineBasicBlock::iterator I = TailBB->begin(), E = TailBB->end();
|
||||
I != E; /* empty */) {
|
||||
MachineInstr *MI = &*I;
|
||||
|
@ -920,8 +920,8 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
|
|||
// duplicating the instructions in all cases.
|
||||
TII->removeBranch(*PrevBB);
|
||||
if (PreRegAlloc) {
|
||||
DenseMap<unsigned, RegSubRegPair> LocalVRMap;
|
||||
SmallVector<std::pair<unsigned, RegSubRegPair>, 4> CopyInfos;
|
||||
DenseMap<Register, RegSubRegPair> LocalVRMap;
|
||||
SmallVector<std::pair<Register, RegSubRegPair>, 4> CopyInfos;
|
||||
MachineBasicBlock::iterator I = TailBB->begin();
|
||||
// Process PHI instructions first.
|
||||
while (I != TailBB->end() && I->isPHI()) {
|
||||
|
@ -988,8 +988,8 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
|
|||
if (PredBB->succ_size() != 1)
|
||||
continue;
|
||||
|
||||
DenseMap<unsigned, RegSubRegPair> LocalVRMap;
|
||||
SmallVector<std::pair<unsigned, RegSubRegPair>, 4> CopyInfos;
|
||||
DenseMap<Register, RegSubRegPair> LocalVRMap;
|
||||
SmallVector<std::pair<Register, RegSubRegPair>, 4> CopyInfos;
|
||||
MachineBasicBlock::iterator I = TailBB->begin();
|
||||
// Process PHI instructions first.
|
||||
while (I != TailBB->end() && I->isPHI()) {
|
||||
|
@ -1007,7 +1007,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
|
|||
/// At the end of the block \p MBB generate COPY instructions between registers
|
||||
/// described by \p CopyInfos. Append resulting instructions to \p Copies.
|
||||
void TailDuplicator::appendCopies(MachineBasicBlock *MBB,
|
||||
SmallVectorImpl<std::pair<unsigned,RegSubRegPair>> &CopyInfos,
|
||||
SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
|
||||
SmallVectorImpl<MachineInstr*> &Copies) {
|
||||
MachineBasicBlock::iterator Loc = MBB->getFirstTerminator();
|
||||
const MCInstrDesc &CopyD = TII->get(TargetOpcode::COPY);
|
||||
|
|
Loading…
Reference in New Issue