Add a flag to enable/disable subregister liveness.
authorMatthias Braun <matze@braunis.de>
Wed, 10 Dec 2014 01:12:30 +0000 (01:12 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 10 Dec 2014 01:12:30 +0000 (01:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223884 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineRegisterInfo.h
include/llvm/Target/TargetSubtargetInfo.h
lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/LiveRangeCalc.cpp
lib/CodeGen/MachineRegisterInfo.cpp

index ba86853dc0d5206c8cf8d8c4f61be1b73040be4d..caa48a5cf0cfcc4bc07e0e4c576f3b5dfc7e816c 100644 (file)
@@ -52,6 +52,9 @@ private:
   /// accurate when after this flag is cleared.
   bool TracksLiveness;
 
+  /// True if subregister liveness is tracked.
+  bool TracksSubRegLiveness;
+
   /// VRegInfo - Information we keep for each virtual register.
   ///
   /// Each element in this list contains the register class of the vreg and the
@@ -179,6 +182,12 @@ public:
   /// information.
   void invalidateLiveness() { TracksLiveness = false; }
 
+  bool tracksSubRegLiveness() const { return TracksSubRegLiveness; }
+
+  void enableSubRegLiveness(bool Enable = true) {
+    TracksSubRegLiveness = Enable;
+  }
+
   //===--------------------------------------------------------------------===//
   // Register Info
   //===--------------------------------------------------------------------===//
index 80ff9e354da4d0209edb47a6336d274c563eba51..4ff88d07bf27b03f514d9e828a3f0c5d3610d329 100644 (file)
@@ -168,6 +168,11 @@ public:
   virtual std::unique_ptr<PBQPRAConstraint> getCustomPBQPConstraints() const {
     return nullptr;
   }
+
+  /// Enable tracking of subregister liveness in register allocator.
+  virtual bool enableSubRegLiveness() const {
+    return false;
+  }
 };
 
 } // End llvm namespace
index 9f7d50367720746cf910f49474d17e5f3dc7f351..77e7149c71343807a0ef092c34dc55ef030ab735 100644 (file)
@@ -63,6 +63,10 @@ static cl::opt<bool> EnablePrecomputePhysRegs(
 static bool EnablePrecomputePhysRegs = false;
 #endif // NDEBUG
 
+static cl::opt<bool> EnableSubRegLiveness(
+  "enable-subreg-liveness", cl::Hidden, cl::init(true),
+  cl::desc("Enable subregister liveness tracking."));
+
 void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesCFG();
   AU.addRequired<AliasAnalysis>();
@@ -116,6 +120,10 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
   AA = &getAnalysis<AliasAnalysis>();
   Indexes = &getAnalysis<SlotIndexes>();
   DomTree = &getAnalysis<MachineDominatorTree>();
+
+  if (EnableSubRegLiveness && MF->getSubtarget().enableSubRegLiveness())
+    MRI->enableSubRegLiveness(true);
+
   if (!LRCalc)
     LRCalc = new LiveRangeCalc();
 
index 4433fb1aaa2b8013eadaec1a3984298fededbaf4..daa1ee05f6a38c53e22e7a2db20dca1f95337ade 100644 (file)
@@ -55,7 +55,7 @@ void LiveRangeCalc::createDeadDefs(LiveInterval &LI) {
     const MachineInstr *MI = MO.getParent();
     SlotIndex Idx = getDefIndex(*Indexes, *MI, MO.isEarlyClobber());
     unsigned SubReg = MO.getSubReg();
-    if (SubReg != 0 || LI.hasSubRanges()) {
+    if (LI.hasSubRanges() || (SubReg != 0 && MRI->tracksSubRegLiveness())) {
       unsigned Mask = SubReg != 0 ? TRI.getSubRegIndexLaneMask(SubReg)
                                   : MRI->getMaxLaneMaskForVReg(Reg);
 
@@ -179,7 +179,8 @@ void LiveRangeCalc::extendToUses(LiveInterval &LI) {
       continue;
     SlotIndex Idx = getUseIndex(*Indexes, MO);
     unsigned SubReg = MO.getSubReg();
-    if (MO.isUse() && (LI.hasSubRanges() || SubReg != 0)) {
+    if (MO.isUse() && (LI.hasSubRanges() ||
+                       (MRI->tracksSubRegLiveness() && SubReg != 0))) {
       unsigned Mask = SubReg != 0
         ? TRI.getSubRegIndexLaneMask(SubReg)
         : Mask = MRI->getMaxLaneMaskForVReg(Reg);
index c2fc4a7de4696e044a514da59c0c836bfeb82f46..aba9e5c986d5f3ec66204c227f40b6d1f399e5e1 100644 (file)
@@ -24,7 +24,8 @@ using namespace llvm;
 void MachineRegisterInfo::Delegate::anchor() {}
 
 MachineRegisterInfo::MachineRegisterInfo(const MachineFunction *MF)
-  : MF(MF), TheDelegate(nullptr), IsSSA(true), TracksLiveness(true) {
+  : MF(MF), TheDelegate(nullptr), IsSSA(true), TracksLiveness(true),
+    TracksSubRegLiveness(false) {
   VRegInfo.reserve(256);
   RegAllocHints.reserve(256);
   UsedRegUnits.resize(getTargetRegisterInfo()->getNumRegUnits());