mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
PHI elimination shouldn't require machineloopinfo since it's used at -O0. Move the requirement to LiveIntervalAnalysis instead. Note this does not change the number of times machineloopinfo is computed.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111285 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6542416560
commit
148341cc9b
@ -62,9 +62,10 @@ void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesCFG();
|
||||
AU.addRequired<AliasAnalysis>();
|
||||
AU.addPreserved<AliasAnalysis>();
|
||||
AU.addPreserved<LiveVariables>();
|
||||
AU.addRequired<LiveVariables>();
|
||||
AU.addPreservedID(MachineLoopInfoID);
|
||||
AU.addPreserved<LiveVariables>();
|
||||
AU.addRequired<MachineLoopInfo>();
|
||||
AU.addPreserved<MachineLoopInfo>();
|
||||
AU.addPreservedID(MachineDominatorsID);
|
||||
|
||||
if (!StrongPHIElim) {
|
||||
|
@ -45,22 +45,22 @@ char &llvm::PHIEliminationID = PHIElimination::ID;
|
||||
|
||||
void llvm::PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addPreserved<LiveVariables>();
|
||||
AU.addRequired<MachineLoopInfo>();
|
||||
AU.addPreserved<MachineDominatorTree>();
|
||||
AU.addPreservedID(MachineLoopInfoID);
|
||||
AU.addPreserved<MachineLoopInfo>();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
bool llvm::PHIElimination::runOnMachineFunction(MachineFunction &MF) {
|
||||
MRI = &MF.getRegInfo();
|
||||
MLI = getAnalysisIfAvailable<MachineLoopInfo>();
|
||||
|
||||
bool Changed = false;
|
||||
|
||||
// Split critical edges to help the coalescer
|
||||
if (LiveVariables *LV = getAnalysisIfAvailable<LiveVariables>())
|
||||
if (LiveVariables *LV = getAnalysisIfAvailable<LiveVariables>()) {
|
||||
MachineLoopInfo *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
|
||||
for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
|
||||
Changed |= SplitPHIEdges(MF, *I, *LV);
|
||||
Changed |= SplitPHIEdges(MF, *I, *LV, MLI);
|
||||
}
|
||||
|
||||
// Populate VRegPHIUseCount
|
||||
analyzePHINodes(MF);
|
||||
@ -380,7 +380,8 @@ void llvm::PHIElimination::analyzePHINodes(const MachineFunction& MF) {
|
||||
|
||||
bool llvm::PHIElimination::SplitPHIEdges(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
LiveVariables &LV) {
|
||||
LiveVariables &LV,
|
||||
MachineLoopInfo *MLI) {
|
||||
if (MBB.empty() || !MBB.front().isPHI() || MBB.isLandingPad())
|
||||
return false; // Quick exit for basic blocks without PHIs.
|
||||
|
||||
@ -397,7 +398,8 @@ bool llvm::PHIElimination::SplitPHIEdges(MachineFunction &MF,
|
||||
// out-of-line blocks into the loop which is very bad for code placement.
|
||||
if (PreMBB != &MBB &&
|
||||
!LV.isLiveIn(Reg, MBB) && LV.isLiveOut(Reg, *PreMBB)) {
|
||||
if (!(MLI->getLoopFor(PreMBB) == MLI->getLoopFor(&MBB) &&
|
||||
if (!MLI ||
|
||||
!(MLI->getLoopFor(PreMBB) == MLI->getLoopFor(&MBB) &&
|
||||
MLI->isLoopHeader(&MBB)))
|
||||
Changed |= PreMBB->SplitCriticalEdge(&MBB, this) != 0;
|
||||
}
|
||||
|
@ -24,7 +24,6 @@ namespace llvm {
|
||||
/// Lower PHI instructions to copies.
|
||||
class PHIElimination : public MachineFunctionPass {
|
||||
MachineRegisterInfo *MRI; // Machine register information
|
||||
MachineLoopInfo *MLI;
|
||||
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
@ -52,7 +51,7 @@ namespace llvm {
|
||||
|
||||
/// Split critical edges where necessary for good coalescer performance.
|
||||
bool SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
LiveVariables &LV);
|
||||
LiveVariables &LV, MachineLoopInfo *MLI);
|
||||
|
||||
/// SplitCriticalEdge - Split a critical edge from A to B by
|
||||
/// inserting a new MBB. Update branches in A and PHI instructions
|
||||
|
Loading…
Reference in New Issue
Block a user