diff --git a/lib/CodeGen/InlineSpiller.cpp b/lib/CodeGen/InlineSpiller.cpp index 73980f38b99..05aa3886575 100644 --- a/lib/CodeGen/InlineSpiller.cpp +++ b/lib/CodeGen/InlineSpiller.cpp @@ -19,6 +19,7 @@ #include "VirtRegMap.h" #include "llvm/CodeGen/LiveIntervalAnalysis.h" #include "llvm/CodeGen/LiveStackAnalysis.h" +#include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineLoopInfo.h" @@ -40,6 +41,7 @@ class InlineSpiller : public Spiller { MachineFunction &mf_; LiveIntervals &lis_; LiveStacks &lss_; + MachineDominatorTree &mdt_; MachineLoopInfo &loops_; VirtRegMap &vrm_; MachineFrameInfo &mfi_; @@ -68,6 +70,7 @@ public: mf_(mf), lis_(pass.getAnalysis()), lss_(pass.getAnalysis()), + mdt_(pass.getAnalysis()), loops_(pass.getAnalysis()), vrm_(vrm), mfi_(*mf.getFrameInfo()), @@ -112,7 +115,7 @@ bool InlineSpiller::split() { // Try splitting around loops. if (const MachineLoop *loop = splitAnalysis_.getBestSplitLoop()) { - SplitEditor(splitAnalysis_, lis_, vrm_, *edit_) + SplitEditor(splitAnalysis_, lis_, vrm_, mdt_, *edit_) .splitAroundLoop(loop); return true; } @@ -120,14 +123,14 @@ bool InlineSpiller::split() { // Try splitting into single block intervals. SplitAnalysis::BlockPtrSet blocks; if (splitAnalysis_.getMultiUseBlocks(blocks)) { - SplitEditor(splitAnalysis_, lis_, vrm_, *edit_) + SplitEditor(splitAnalysis_, lis_, vrm_, mdt_, *edit_) .splitSingleBlocks(blocks); return true; } // Try splitting inside a basic block. if (const MachineBasicBlock *MBB = splitAnalysis_.getBlockForInsideSplit()) { - SplitEditor(splitAnalysis_, lis_, vrm_, *edit_) + SplitEditor(splitAnalysis_, lis_, vrm_, mdt_, *edit_) .splitInsideBlock(MBB); return true; } diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp index 18fd118259e..947a6c74bd1 100644 --- a/lib/CodeGen/RegAllocLinearScan.cpp +++ b/lib/CodeGen/RegAllocLinearScan.cpp @@ -97,6 +97,7 @@ namespace { initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry()); initializePreAllocSplittingPass(*PassRegistry::getPassRegistry()); initializeLiveStacksPass(*PassRegistry::getPassRegistry()); + initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry()); initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry()); initializeVirtRegMapPass(*PassRegistry::getPassRegistry()); initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry()); @@ -208,6 +209,7 @@ namespace { AU.addPreserved(); AU.addRequired(); AU.addPreserved(); + AU.addRequiredID(MachineDominatorsID); AU.addPreservedID(MachineDominatorsID); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index a89a977695f..f81c479f818 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -18,6 +18,7 @@ #include "VirtRegMap.h" #include "llvm/CodeGen/CalcSpillWeights.h" #include "llvm/CodeGen/LiveIntervalAnalysis.h" +#include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" @@ -603,14 +604,17 @@ VNInfo *LiveIntervalMap::defByCopyFrom(unsigned Reg, //===----------------------------------------------------------------------===// /// Create a new SplitEditor for editing the LiveInterval analyzed by SA. -SplitEditor::SplitEditor(SplitAnalysis &sa, LiveIntervals &lis, VirtRegMap &vrm, +SplitEditor::SplitEditor(SplitAnalysis &sa, + LiveIntervals &lis, + VirtRegMap &vrm, + MachineDominatorTree &mdt, LiveRangeEdit &edit) : sa_(sa), lis_(lis), vrm_(vrm), mri_(vrm.getMachineFunction().getRegInfo()), tii_(*vrm.getMachineFunction().getTarget().getInstrInfo()), edit_(edit), - dupli_(lis_, edit.getParent()), - openli_(lis_, edit.getParent()) + dupli_(lis_, mdt, edit.getParent()), + openli_(lis_, mdt, edit.getParent()) { } diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index 9c109dc4d5f..9ba7cbeb100 100644 --- a/lib/CodeGen/SplitKit.h +++ b/lib/CodeGen/SplitKit.h @@ -22,6 +22,7 @@ class LiveInterval; class LiveIntervals; class LiveRangeEdit; class MachineInstr; +class MachineDominatorTree; class MachineLoop; class MachineLoopInfo; class MachineRegisterInfo; @@ -154,6 +155,7 @@ public: /// Values in parentli_ may map to any number of openli_ values, including 0. class LiveIntervalMap { LiveIntervals &lis_; + MachineDominatorTree &mdt_; // The parent interval is never changed. const LiveInterval &parentli_; @@ -171,8 +173,9 @@ class LiveIntervalMap { public: LiveIntervalMap(LiveIntervals &lis, + MachineDominatorTree &mdt, const LiveInterval &parentli) - : lis_(lis), parentli_(parentli), li_(0) {} + : lis_(lis), mdt_(mdt), parentli_(parentli), li_(0) {} /// reset - clear all data structures and start a new live interval. void reset(LiveInterval *); @@ -285,7 +288,8 @@ class SplitEditor { public: /// Create a new SplitEditor for editing the LiveInterval analyzed by SA. /// Newly created intervals will be appended to newIntervals. - SplitEditor(SplitAnalysis &SA, LiveIntervals&, VirtRegMap&, LiveRangeEdit&); + SplitEditor(SplitAnalysis &SA, LiveIntervals&, VirtRegMap&, + MachineDominatorTree&, LiveRangeEdit&); /// getAnalysis - Get the corresponding analysis. SplitAnalysis &getAnalysis() { return sa_; }