Temporarily Revert "[DebugInfo] Terminate more location-list ranges at the end of blocks"
as it was causing significant compile time regressions.

This reverts commit r359426 while we come up with testcases and additional ideas.

llvm-svn: 360301
diff --git a/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp b/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
index 5601678..c006f3c 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
@@ -352,43 +352,17 @@
       }
     }
 
-    // Make sure locations for all variables are valid only until the end of
-    // the basic block (unless it's the last basic block, in which case let
-    // their liveness run off to the end of the function).
+    // Make sure locations for register-described variables are valid only
+    // until the end of the basic block (unless it's the last basic block, in
+    // which case let their liveness run off to the end of the function).
     if (!MBB.empty() && &MBB != &MF->back()) {
-      // Iterate over all variables that have open debug values.
-      SmallSet<unsigned, 8> RegsToClobber;
-      for (auto &Pair : LiveEntries) {
-        // Iterate over history entries for all open fragments.
-        SmallVector<EntryIndex, 8> IdxesToRemove;
-        for (EntryIndex Idx : Pair.second) {
-          DbgValueHistoryMap::Entry &Ent = DbgValues.getEntry(Pair.first, Idx);
-          assert(Ent.isDbgValue() && !Ent.isClosed());
-          const MachineInstr *DbgValue = Ent.getInstr();
-
-          // If this is a register or indirect DBG_VALUE, apply some futher
-          // tests to see if we should clobber it. Perform the clobbering
-          // later though, to keep LiveEntries iteration stable.
-          if (DbgValue->getOperand(0).isReg()) {
-            unsigned RegNo = DbgValue->getOperand(0).getReg();
-            if (TRI->isVirtualRegister(RegNo) || ChangingRegs.test(RegNo))
-              RegsToClobber.insert(RegNo);
-          } else {
-            // This is a constant, terminate it at end of the block. Store
-            // eliminated EntryIdx and delete later, for iteration stability.
-            EntryIndex ClobIdx = DbgValues.startClobber(Pair.first, MBB.back());
-            DbgValues.getEntry(Pair.first, Idx).endEntry(ClobIdx);
-            IdxesToRemove.push_back(Idx);
-          }
-        }
-
-        for (EntryIndex Idx : IdxesToRemove)
-          Pair.second.erase(Idx);
+      for (auto I = RegVars.begin(), E = RegVars.end(); I != E;) {
+        auto CurElem = I++; // CurElem can be erased below.
+        if (TRI->isVirtualRegister(CurElem->first) ||
+            ChangingRegs.test(CurElem->first))
+          clobberRegisterUses(RegVars, CurElem, DbgValues, LiveEntries,
+                              MBB.back());
       }
-
-      // Implement clobbering of registers at the end of BB.
-      for (unsigned Reg : RegsToClobber)
-        clobberRegisterUses(RegVars, Reg, DbgValues, LiveEntries, MBB.back());
     }
   }
 }
diff --git a/llvm/lib/CodeGen/LiveDebugValues.cpp b/llvm/lib/CodeGen/LiveDebugValues.cpp
index e36694d..449f10c 100644
--- a/llvm/lib/CodeGen/LiveDebugValues.cpp
+++ b/llvm/lib/CodeGen/LiveDebugValues.cpp
@@ -143,8 +143,7 @@
     enum VarLocKind {
       InvalidKind = 0,
       RegisterKind,
-      SpillLocKind,
-      ImmediateKind
+      SpillLocKind
     } Kind = InvalidKind;
 
     /// The value location. Stored separately to avoid repeatedly
@@ -153,9 +152,6 @@
       uint64_t RegNo;
       SpillLoc SpillLocation;
       uint64_t Hash;
-      int64_t Immediate;
-      const ConstantFP *FPImm;
-      const ConstantInt *CImm;
     } Loc;
 
     VarLoc(const MachineInstr &MI, LexicalScopes &LS)
@@ -168,15 +164,6 @@
       if (int RegNo = isDbgValueDescribedByReg(MI)) {
         Kind = RegisterKind;
         Loc.RegNo = RegNo;
-      } else if (MI.getOperand(0).isImm()) {
-        Kind = ImmediateKind;
-        Loc.Immediate = MI.getOperand(0).getImm();
-      } else if (MI.getOperand(0).isFPImm()) {
-        Kind = ImmediateKind;
-        Loc.FPImm = MI.getOperand(0).getFPImm();
-      } else if (MI.getOperand(0).isCImm()) {
-        Kind = ImmediateKind;
-        Loc.CImm = MI.getOperand(0).getCImm();
       }
     }
 
@@ -191,9 +178,6 @@
       Loc.SpillLocation = {SpillBase, SpillOffset};
     }
 
-    // Is the Loc field a constant or constant object?
-    bool isConstant() const { return Kind == ImmediateKind; }
-
     /// If this variable is described by a register, return it,
     /// otherwise return 0.
     unsigned isDescribedByReg() const {
@@ -211,8 +195,7 @@
 #endif
 
     bool operator==(const VarLoc &Other) const {
-      return Kind == Other.Kind && Var == Other.Var &&
-             Loc.Hash == Other.Loc.Hash;
+      return Var == Other.Var && Loc.Hash == Other.Loc.Hash;
     }
 
     /// This operator guarantees that VarLocs are sorted by Variable first.
@@ -425,23 +408,11 @@
   OpenRanges.erase(V);
 
   // Add the VarLoc to OpenRanges from this DBG_VALUE.
-  unsigned ID;
-  if (isDbgValueDescribedByReg(MI) || MI.getOperand(0).isImm() ||
-      MI.getOperand(0).isFPImm() || MI.getOperand(0).isCImm()) {
-    // Use normal VarLoc constructor for registers and immediates.
+  // TODO: Currently handles DBG_VALUE which has only reg as location.
+  if (isDbgValueDescribedByReg(MI)) {
     VarLoc VL(MI, LS);
-    ID = VarLocIDs.insert(VL);
+    unsigned ID = VarLocIDs.insert(VL);
     OpenRanges.insert(ID, VL.Var);
-  } else if (MI.hasOneMemOperand()) {
-    // It's a stack spill -- fetch spill base and offset.
-    VarLoc::SpillLoc SpillLocation = extractSpillBaseRegAndOffset(MI);
-    VarLoc VL(MI, SpillLocation.SpillBase, SpillLocation.SpillOffset, LS);
-    ID = VarLocIDs.insert(VL);
-    OpenRanges.insert(ID, VL.Var);
-  } else {
-    // This must be an undefined location. We should leave OpenRanges closed.
-    assert(MI.getOperand(0).isReg() && MI.getOperand(0).getReg() == 0 &&
-           "Unexpected non-undef DBG_VALUE encountered");
   }
 }
 
@@ -835,19 +806,12 @@
     // a new DBG_VALUE. process() will end this range however appropriate.
     const VarLoc &DiffIt = VarLocIDs[ID];
     const MachineInstr *DMI = &DiffIt.MI;
-    MachineInstr *MI = nullptr;
-    if (DiffIt.isConstant()) {
-      MachineOperand MO(DMI->getOperand(0));
-      MI = BuildMI(MBB, MBB.instr_begin(), DMI->getDebugLoc(), DMI->getDesc(),
-                   false, MO, DMI->getDebugVariable(),
-                   DMI->getDebugExpression());
-    } else {
-      MI = BuildMI(MBB, MBB.instr_begin(), DMI->getDebugLoc(), DMI->getDesc(),
-                   DMI->isIndirectDebugValue(), DMI->getOperand(0).getReg(),
-                   DMI->getDebugVariable(), DMI->getDebugExpression());
-      if (DMI->isIndirectDebugValue())
-        MI->getOperand(1).setImm(DMI->getOperand(1).getImm());
-    }
+    MachineInstr *MI =
+        BuildMI(MBB, MBB.instr_begin(), DMI->getDebugLoc(), DMI->getDesc(),
+                DMI->isIndirectDebugValue(), DMI->getOperand(0).getReg(),
+                DMI->getDebugVariable(), DMI->getDebugExpression());
+    if (DMI->isIndirectDebugValue())
+      MI->getOperand(1).setImm(DMI->getOperand(1).getImm());
     LLVM_DEBUG(dbgs() << "Inserted: "; MI->dump(););
     ILS.set(ID);
     ++NumInserted;