summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-07-27 20:58:46 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-07-27 20:58:46 +0000
commit4021a7bf2582ba6b51d5d107feb3a809cc33d81d (patch)
treef19ab139516428541e56ee1ce43a44883532758b
parent4586df765e927de6eb2d21ee849f7b847b3e91ec (diff)
downloadbcm5719-llvm-4021a7bf2582ba6b51d5d107feb3a809cc33d81d.tar.gz
bcm5719-llvm-4021a7bf2582ba6b51d5d107feb3a809cc33d81d.zip
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
-rw-r--r--llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h1
-rw-r--r--llvm/lib/CodeGen/LiveIntervalAnalysis.cpp37
2 files changed, 37 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h b/llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h
index a344b1ff1b5..fe22d8af027 100644
--- a/llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h
+++ b/llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h
@@ -375,6 +375,7 @@ namespace llvm {
void computeLiveInRegUnits();
void computeRegUnitInterval(LiveInterval*);
+ void computeVirtRegInterval(LiveInterval*);
class HMEditor;
};
diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
index 819707f59f5..bc0ec157f62 100644
--- a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -27,6 +27,7 @@
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetMachine.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
@@ -38,6 +39,11 @@
#include <cmath>
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;
INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals",
"Live Interval Analysis", false, false)
@@ -105,7 +111,25 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
AllocatableRegs = TRI->getAllocatableSet(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();
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
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud