LiveIntervalAnalysis: Remove LiveVariables requirement

This requirement was a huge hack to keep LiveVariables alive because it
was optionally used by TwoAddressInstructionPass and PHIElimination.
However we have AnalysisUsage::addUsedIfAvailable() which we can use in
those passes.

This re-applies r260806 with LiveVariables manually added to PowerPC to
hopefully not break the stage 2 bots this time.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267954 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matthias Braun 2016-04-28 23:42:51 +00:00
parent 36575f0cb1
commit 66bbcee0a9
4 changed files with 11 additions and 8 deletions

View File

@ -9,8 +9,7 @@
// //
// This file implements the LiveInterval analysis pass which is used // This file implements the LiveInterval analysis pass which is used
// by the Linear Scan Register allocator. This pass linearizes the // by the Linear Scan Register allocator. This pass linearizes the
// basic blocks of the function in DFS order and uses the // basic blocks of the function in DFS order and computes live intervals for
// LiveVariables pass to conservatively compute live intervals for
// each virtual and physical register. // each virtual and physical register.
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -46,7 +45,6 @@ char &llvm::LiveIntervalsID = LiveIntervals::ID;
INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals", INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals",
"Live Interval Analysis", false, false) "Live Interval Analysis", false, false)
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
INITIALIZE_PASS_DEPENDENCY(LiveVariables)
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
INITIALIZE_PASS_DEPENDENCY(SlotIndexes) INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
INITIALIZE_PASS_END(LiveIntervals, "liveintervals", INITIALIZE_PASS_END(LiveIntervals, "liveintervals",
@ -75,10 +73,6 @@ void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG(); AU.setPreservesCFG();
AU.addRequired<AAResultsWrapperPass>(); AU.addRequired<AAResultsWrapperPass>();
AU.addPreserved<AAResultsWrapperPass>(); AU.addPreserved<AAResultsWrapperPass>();
// LiveVariables isn't really required by this analysis, it is only required
// here to make sure it is live during TwoAddressInstructionPass and
// PHIElimination. This is temporary.
AU.addRequired<LiveVariables>();
AU.addPreserved<LiveVariables>(); AU.addPreserved<LiveVariables>();
AU.addPreservedID(MachineLoopInfoID); AU.addPreservedID(MachineLoopInfoID);
AU.addRequiredTransitiveID(MachineDominatorsID); AU.addRequiredTransitiveID(MachineDominatorsID);

View File

@ -120,6 +120,7 @@ INITIALIZE_PASS_END(PHIElimination, "phi-node-elimination",
"Eliminate PHI nodes for register allocation", false, false) "Eliminate PHI nodes for register allocation", false, false)
void PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const { void PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addUsedIfAvailable<LiveVariables>();
AU.addPreserved<LiveVariables>(); AU.addPreserved<LiveVariables>();
AU.addPreserved<SlotIndexes>(); AU.addPreserved<SlotIndexes>();
AU.addPreserved<LiveIntervals>(); AU.addPreserved<LiveIntervals>();

View File

@ -156,6 +156,7 @@ public:
void getAnalysisUsage(AnalysisUsage &AU) const override { void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesCFG(); AU.setPreservesCFG();
AU.addRequired<AAResultsWrapperPass>(); AU.addRequired<AAResultsWrapperPass>();
AU.addUsedIfAvailable<LiveVariables>();
AU.addPreserved<LiveVariables>(); AU.addPreserved<LiveVariables>();
AU.addPreserved<SlotIndexes>(); AU.addPreserved<SlotIndexes>();
AU.addPreserved<LiveIntervals>(); AU.addPreserved<LiveIntervals>();

View File

@ -15,6 +15,7 @@
#include "PPC.h" #include "PPC.h"
#include "PPCTargetObjectFile.h" #include "PPCTargetObjectFile.h"
#include "PPCTargetTransformInfo.h" #include "PPCTargetTransformInfo.h"
#include "llvm/CodeGen/LiveVariables.h"
#include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/Passes.h"
#include "llvm/IR/Function.h" #include "llvm/IR/Function.h"
#include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/LegacyPassManager.h"
@ -387,8 +388,14 @@ void PPCPassConfig::addPreRegAlloc() {
insertPass(VSXFMAMutateEarly ? &RegisterCoalescerID : &MachineSchedulerID, insertPass(VSXFMAMutateEarly ? &RegisterCoalescerID : &MachineSchedulerID,
&PPCVSXFMAMutateID); &PPCVSXFMAMutateID);
} }
if (getPPCTargetMachine().getRelocationModel() == Reloc::PIC_) if (getPPCTargetMachine().getRelocationModel() == Reloc::PIC_) {
// FIXME: LiveVariables should not be necessary here!
// PPCTLSDYnamicCallPass uses LiveIntervals which previously dependet on
// LiveVariables. This (unnecessary) dependency has been removed now,
// however a stage-2 clang build fails without LiveVariables computed here.
addPass(&LiveVariablesID, false);
addPass(createPPCTLSDynamicCallPass()); addPass(createPPCTLSDynamicCallPass());
}
if (EnableExtraTOCRegDeps) if (EnableExtraTOCRegDeps)
addPass(createPPCTOCRegDepsPass()); addPass(createPPCTOCRegDepsPass());
} }