[llvm-commits] [llvm] r121918 - in /llvm/trunk/lib/CodeGen: LiveIntervalUnion.cpp RegAllocGreedy.cpp
Jakob Stoklund Olesen
stoklund at 2pi.dk
Wed Dec 15 15:46:13 PST 2010
Author: stoklund
Date: Wed Dec 15 17:46:13 2010
New Revision: 121918
URL: http://llvm.org/viewvc/llvm-project?rev=121918&view=rev
Log:
Start using SplitKit and MachineLoopRanges in RegAllocGreedy in preparation of
live range splitting around loops guided by register pressure.
So far, trySplit() simply prints a lot of debug output.
Modified:
llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp
llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
Modified: llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp?rev=121918&r1=121917&r2=121918&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp Wed Dec 15 17:46:13 2010
@@ -83,8 +83,8 @@
void LiveIntervalUnion::InterferenceResult::print(raw_ostream &OS,
const TargetRegisterInfo *TRI) const {
- OS << '[' << start() << ';' << stop() << ")\t";
- interference()->print(OS, TRI);
+ OS << '[' << start() << ';' << stop() << "):";
+ TRI->printReg(interference()->reg, OS);
}
void LiveIntervalUnion::Query::print(raw_ostream &OS,
Modified: llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp?rev=121918&r1=121917&r2=121918&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp Wed Dec 15 17:46:13 2010
@@ -17,6 +17,7 @@
#include "LiveIntervalUnion.h"
#include "RegAllocBase.h"
#include "Spiller.h"
+#include "SplitKit.h"
#include "VirtRegMap.h"
#include "VirtRegRewriter.h"
#include "llvm/Analysis/AliasAnalysis.h"
@@ -27,6 +28,7 @@
#include "llvm/CodeGen/LiveStackAnalysis.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachineLoopRanges.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
@@ -50,9 +52,11 @@
// analyses
LiveStacks *LS;
-
+ MachineLoopInfo *Loops;
+ MachineLoopRanges *LoopRanges;
// state
std::auto_ptr<Spiller> SpillerInstance;
+ std::auto_ptr<SplitAnalysis> SA;
public:
RAGreedy();
@@ -106,6 +110,7 @@
initializeLiveStacksPass(*PassRegistry::getPassRegistry());
initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry());
initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
+ initializeMachineLoopRangesPass(*PassRegistry::getPassRegistry());
initializeVirtRegMapPass(*PassRegistry::getPassRegistry());
}
@@ -125,6 +130,8 @@
AU.addPreservedID(MachineDominatorsID);
AU.addRequired<MachineLoopInfo>();
AU.addPreserved<MachineLoopInfo>();
+ AU.addRequired<MachineLoopRanges>();
+ AU.addPreserved<MachineLoopRanges>();
AU.addRequired<VirtRegMap>();
AU.addPreserved<VirtRegMap>();
MachineFunctionPass::getAnalysisUsage(AU);
@@ -256,14 +263,32 @@
unsigned RAGreedy::trySplit(LiveInterval &VirtReg, AllocationOrder &Order,
SmallVectorImpl<LiveInterval*>&SplitVRegs) {
NamedRegionTimer T("Splitter", TimerGroupName, TimePassesIsEnabled);
- DEBUG({
- Order.rewind();
- while (unsigned PhysReg = Order.next()) {
- query(VirtReg, PhysReg).print(dbgs(), TRI);
- for (const unsigned *AI = TRI->getAliasSet(PhysReg); *AI; ++AI)
- query(VirtReg, *AI).print(dbgs(), TRI);
+ SA->analyze(&VirtReg);
+
+ // Get the set of loops that have VirtReg uses and are splittable.
+ SplitAnalysis::LoopPtrSet SplitLoops;
+ SA->getSplitLoops(SplitLoops);
+
+ Order.rewind();
+ while (unsigned PhysReg = Order.next()) {
+ for (const unsigned *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) {
+ LiveIntervalUnion::Query &Q = query(VirtReg, *AI);
+ if (!Q.checkInterference())
+ continue;
+ LiveIntervalUnion::InterferenceResult IR = Q.firstInterference();
+ do {
+ DEBUG({dbgs() << " "; IR.print(dbgs(), TRI);});
+ for (SplitAnalysis::LoopPtrSet::iterator I = SplitLoops.begin(),
+ E = SplitLoops.end(); I != E; ++I) {
+ MachineLoopRange *Range = LoopRanges->getLoopRange(*I);
+ if (!Range->overlaps(IR.start(), IR.stop()))
+ continue;
+ DEBUG(dbgs() << ", overlaps " << *Range);
+ }
+ DEBUG(dbgs() << '\n');
+ } while (Q.nextInterference(IR));
}
- });
+ }
return 0;
}
@@ -336,9 +361,12 @@
MF = &mf;
RegAllocBase::init(getAnalysis<VirtRegMap>(), getAnalysis<LiveIntervals>());
-
ReservedRegs = TRI->getReservedRegs(*MF);
SpillerInstance.reset(createInlineSpiller(*this, *MF, *VRM));
+ Loops = &getAnalysis<MachineLoopInfo>();
+ LoopRanges = &getAnalysis<MachineLoopRanges>();
+ SA.reset(new SplitAnalysis(*MF, *LIS, *Loops));
+
allocatePhysRegs();
addMBBLiveIns(MF);
More information about the llvm-commits
mailing list