[llvm] r200941 - Track register pressure a bit more carefully (weird corner case).

Andrew Trick atrick at apple.com
Thu Feb 6 11:20:41 PST 2014


Author: atrick
Date: Thu Feb  6 13:20:41 2014
New Revision: 200941

URL: http://llvm.org/viewvc/llvm-project?rev=200941&view=rev
Log:
Track register pressure a bit more carefully (weird corner case).

This solves a problem where a def machine operand has no uses but has
not been marked dead. In this case, the initial RP analysis was being
extra precise and determining from LiveIntervals the the register was
actually dead. This caused us to omit the register from the RP
tracker's block live out. That's all good, but the per-instruction
summary still accounted for it as a valid def. This could cause an
assertion in the tracker later when we underflow pressure.

This is from a bug report on an out-of-tree target. It is not
reproducible on well-behaved targets. I'm just making an obvious fix
without unit test.

Modified:
    llvm/trunk/lib/CodeGen/RegisterPressure.cpp

Modified: llvm/trunk/lib/CodeGen/RegisterPressure.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterPressure.cpp?rev=200941&r1=200940&r2=200941&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegisterPressure.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegisterPressure.cpp Thu Feb  6 13:20:41 2014
@@ -506,7 +506,14 @@ bool RegPressureTracker::recede(SmallVec
         DeadDef = LRQ.isDeadDef();
       }
     }
-    if (!DeadDef) {
+    if (DeadDef) {
+      // LiveIntervals knows this is a dead even though it's MachineOperand is
+      // not flagged as such. Since this register will not be recorded as
+      // live-out, increase its PDiff value to avoid underflowing pressure.
+      if (PDiff)
+        PDiff->addPressureChange(Reg, false, MRI);
+    }
+    else {
       if (LiveRegs.erase(Reg))
         decreaseRegPressure(Reg);
       else





More information about the llvm-commits mailing list