diff options
Diffstat (limited to 'lib/Target/AMDGPU/SIFixSGPRCopies.cpp')
| -rw-r--r-- | lib/Target/AMDGPU/SIFixSGPRCopies.cpp | 114 |
1 files changed, 34 insertions, 80 deletions
diff --git a/lib/Target/AMDGPU/SIFixSGPRCopies.cpp b/lib/Target/AMDGPU/SIFixSGPRCopies.cpp index 8b155c2d2780..566e0d3febc7 100644 --- a/lib/Target/AMDGPU/SIFixSGPRCopies.cpp +++ b/lib/Target/AMDGPU/SIFixSGPRCopies.cpp @@ -69,6 +69,7 @@ #include "AMDGPUSubtarget.h" #include "SIInstrInfo.h" #include "SIRegisterInfo.h" +#include "MCTargetDesc/AMDGPUMCTargetDesc.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallSet.h" @@ -81,7 +82,6 @@ #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" -#include "llvm/CodeGen/MachinePostDominators.h" #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/Pass.h" #include "llvm/Support/CodeGen.h" @@ -110,12 +110,7 @@ namespace { class SIFixSGPRCopies : public MachineFunctionPass { MachineDominatorTree *MDT; - MachinePostDominatorTree *MPDT; - DenseMap<MachineBasicBlock *, SetVector<MachineBasicBlock*>> PDF; - void computePDF(MachineFunction * MF); -#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) - void printPDF(); -#endif + public: static char ID; @@ -128,8 +123,6 @@ public: void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired<MachineDominatorTree>(); AU.addPreserved<MachineDominatorTree>(); - AU.addRequired<MachinePostDominatorTree>(); - AU.addPreserved<MachinePostDominatorTree>(); AU.setPreservesCFG(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -417,6 +410,12 @@ bool searchPredecessors(const MachineBasicBlock *MBB, return false; } +static bool predsHasDivergentTerminator(MachineBasicBlock *MBB, + const TargetRegisterInfo *TRI) { + return searchPredecessors(MBB, nullptr, [TRI](MachineBasicBlock *MBB) { + return hasTerminatorThatModifiesExec(*MBB, *TRI); }); +} + // Checks if there is potential path From instruction To instruction. // If CutOff is specified and it sits in between of that path we ignore // a higher portion of the path and report it is not reachable. @@ -515,9 +514,9 @@ static bool hoistAndMergeSGPRInits(unsigned Reg, if (MDT.dominates(MI1, MI2)) { if (!intereferes(MI2, MI1)) { - DEBUG(dbgs() << "Erasing from " - << printMBBReference(*MI2->getParent()) << " " - << *MI2); + LLVM_DEBUG(dbgs() + << "Erasing from " + << printMBBReference(*MI2->getParent()) << " " << *MI2); MI2->eraseFromParent(); Defs.erase(I2++); Changed = true; @@ -525,9 +524,9 @@ static bool hoistAndMergeSGPRInits(unsigned Reg, } } else if (MDT.dominates(MI2, MI1)) { if (!intereferes(MI1, MI2)) { - DEBUG(dbgs() << "Erasing from " - << printMBBReference(*MI1->getParent()) << " " - << *MI1); + LLVM_DEBUG(dbgs() + << "Erasing from " + << printMBBReference(*MI1->getParent()) << " " << *MI1); MI1->eraseFromParent(); Defs.erase(I1++); Changed = true; @@ -543,11 +542,12 @@ static bool hoistAndMergeSGPRInits(unsigned Reg, MachineBasicBlock::iterator I = MBB->getFirstNonPHI(); if (!intereferes(MI1, I) && !intereferes(MI2, I)) { - DEBUG(dbgs() << "Erasing from " - << printMBBReference(*MI1->getParent()) << " " << *MI1 - << "and moving from " - << printMBBReference(*MI2->getParent()) << " to " - << printMBBReference(*I->getParent()) << " " << *MI2); + LLVM_DEBUG(dbgs() + << "Erasing from " + << printMBBReference(*MI1->getParent()) << " " << *MI1 + << "and moving from " + << printMBBReference(*MI2->getParent()) << " to " + << printMBBReference(*I->getParent()) << " " << *MI2); I->getParent()->splice(I, MI2->getParent(), MI2); MI1->eraseFromParent(); Defs.erase(I1++); @@ -567,47 +567,12 @@ static bool hoistAndMergeSGPRInits(unsigned Reg, return Changed; } -void SIFixSGPRCopies::computePDF(MachineFunction *MF) { - MachineFunction::iterator B = MF->begin(); - MachineFunction::iterator E = MF->end(); - for (; B != E; ++B) { - if (B->succ_size() > 1) { - for (auto S : B->successors()) { - MachineDomTreeNode *runner = MPDT->getNode(&*S); - MachineDomTreeNode *sentinel = MPDT->getNode(&*B)->getIDom(); - while (runner && runner != sentinel) { - PDF[runner->getBlock()].insert(&*B); - runner = runner->getIDom(); - } - } - } - } -} - -#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) -void SIFixSGPRCopies::printPDF() { - dbgs() << "\n######## PostDominanceFrontiers set #########\n"; - for (auto &I : PDF) { - dbgs() << "PDF[ " << I.first->getNumber() << "] : "; - for (auto &J : I.second) { - dbgs() << J->getNumber() << ' '; - } - dbgs() << '\n'; - } - dbgs() << "\n##############################################\n"; -} -#endif - bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) { - const SISubtarget &ST = MF.getSubtarget<SISubtarget>(); + const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); MachineRegisterInfo &MRI = MF.getRegInfo(); const SIRegisterInfo *TRI = ST.getRegisterInfo(); const SIInstrInfo *TII = ST.getInstrInfo(); MDT = &getAnalysis<MachineDominatorTree>(); - MPDT = &getAnalysis<MachinePostDominatorTree>(); - PDF.clear(); - computePDF(&MF); - DEBUG(printPDF()); SmallVector<MachineInstr *, 16> Worklist; @@ -661,28 +626,17 @@ bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) { if (!TRI->isSGPRClass(MRI.getRegClass(Reg))) break; - // We don't need to fix the PHI if all the source blocks - // have no divergent control dependecies + // We don't need to fix the PHI if the common dominator of the + // two incoming blocks terminates with a uniform branch. bool HasVGPROperand = phiHasVGPROperands(MI, MRI, TRI, TII); - if (!HasVGPROperand) { - bool Uniform = true; - MachineBasicBlock * Join = MI.getParent(); - for (auto &O : MI.explicit_operands()) { - if (O.isMBB()) { - MachineBasicBlock * Source = O.getMBB(); - SetVector<MachineBasicBlock*> &SourcePDF = PDF[Source]; - SetVector<MachineBasicBlock*> &JoinPDF = PDF[Join]; - SetVector<MachineBasicBlock*> CDList; - for (auto &I : SourcePDF) { - if (!JoinPDF.count(I) || /* back edge */MDT->dominates(Join, I)) { - if (hasTerminatorThatModifiesExec(*I, *TRI)) - Uniform = false; - } - } - } - } - if (Uniform) { - DEBUG(dbgs() << "Not fixing PHI for uniform branch: " << MI << '\n'); + if (MI.getNumExplicitOperands() == 5 && !HasVGPROperand) { + MachineBasicBlock *MBB0 = MI.getOperand(2).getMBB(); + MachineBasicBlock *MBB1 = MI.getOperand(4).getMBB(); + + if (!predsHasDivergentTerminator(MBB0, TRI) && + !predsHasDivergentTerminator(MBB1, TRI)) { + LLVM_DEBUG(dbgs() + << "Not fixing PHI for uniform branch: " << MI << '\n'); break; } } @@ -722,7 +676,7 @@ bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) { SmallSet<unsigned, 8> Visited; if (HasVGPROperand || !phiHasBreakDef(MI, MRI, Visited)) { - DEBUG(dbgs() << "Fixing PHI: " << MI); + LLVM_DEBUG(dbgs() << "Fixing PHI: " << MI); TII->moveToVALU(MI); } break; @@ -734,7 +688,7 @@ bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) { continue; } - DEBUG(dbgs() << "Fixing REG_SEQUENCE: " << MI); + LLVM_DEBUG(dbgs() << "Fixing REG_SEQUENCE: " << MI); TII->moveToVALU(MI); break; @@ -745,7 +699,7 @@ bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) { Src1RC = MRI.getRegClass(MI.getOperand(2).getReg()); if (TRI->isSGPRClass(DstRC) && (TRI->hasVGPRs(Src0RC) || TRI->hasVGPRs(Src1RC))) { - DEBUG(dbgs() << " Fixing INSERT_SUBREG: " << MI); + LLVM_DEBUG(dbgs() << " Fixing INSERT_SUBREG: " << MI); TII->moveToVALU(MI); } break; |
