1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Add a -new-live-intervals experimental option.

This option replaces the existing live interval computation with one
based on LiveRangeCalc.cpp. The new algorithm does not depend on
LiveVariables, and it can be run at any time, before or after leaving
SSA form.

llvm-svn: 160892
This commit is contained in:
Jakob Stoklund Olesen 2012-07-27 20:58:46 +00:00
parent 06f27a2297
commit d60f4942e6
2 changed files with 37 additions and 1 deletions

View File

@ -375,6 +375,7 @@ namespace llvm {
void computeLiveInRegUnits(); void computeLiveInRegUnits();
void computeRegUnitInterval(LiveInterval*); void computeRegUnitInterval(LiveInterval*);
void computeVirtRegInterval(LiveInterval*);
class HMEditor; class HMEditor;
}; };

View File

@ -27,6 +27,7 @@
#include "llvm/Target/TargetRegisterInfo.h" #include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetMachine.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
@ -38,6 +39,11 @@
#include <cmath> #include <cmath>
using namespace llvm; using namespace llvm;
// Switch to the new experimental algorithm for computing live intervals.
static cl::opt<bool>
NewLiveIntervals("new-live-intervals", cl::Hidden,
cl::desc("Use new algorithm forcomputing live intervals"));
char LiveIntervals::ID = 0; char LiveIntervals::ID = 0;
INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals", INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals",
"Live Interval Analysis", false, false) "Live Interval Analysis", false, false)
@ -105,7 +111,25 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
AllocatableRegs = TRI->getAllocatableSet(fn); AllocatableRegs = TRI->getAllocatableSet(fn);
ReservedRegs = TRI->getReservedRegs(fn); ReservedRegs = TRI->getReservedRegs(fn);
computeIntervals(); // Allocate space for all virtual registers.
VirtRegIntervals.resize(MRI->getNumVirtRegs());
if (NewLiveIntervals) {
// This is the new way of computing live intervals.
// It is independent of LiveVariables, and it can run at any time.
for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
if (MRI->reg_nodbg_empty(Reg))
continue;
LiveInterval *LI = createInterval(Reg);
VirtRegIntervals[Reg] = LI;
computeVirtRegInterval(LI);
}
} else {
// This is the old way of computing live intervals.
// It depends on LiveVariables.
computeIntervals();
}
computeLiveInRegUnits(); computeLiveInRegUnits();
DEBUG(dump()); DEBUG(dump());
@ -442,6 +466,17 @@ LiveInterval* LiveIntervals::createInterval(unsigned reg) {
} }
/// computeVirtRegInterval - Compute the live interval of a virtual register,
/// based on defs and uses.
void LiveIntervals::computeVirtRegInterval(LiveInterval *LI) {
assert(LRCalc && "LRCalc not initialized.");
assert(LI->empty() && "Should only compute empty intervals.");
LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
LRCalc->createDeadDefs(LI);
LRCalc->extendToUses(LI);
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Register Unit Liveness // Register Unit Liveness
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//