More asserts around physreg uses
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 13 May 2010 00:19:39 +0000 (00:19 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 13 May 2010 00:19:39 +0000 (00:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103685 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocFast.cpp

index eac8407fff396f8b95774ba82b1adcc4f799c56b..304162a303fd48d1266cb1b0d4c2e3afaaf1e487 100644 (file)
@@ -487,7 +487,7 @@ unsigned RAFast::reloadVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
 }
 
 /// reservePhysReg - Mark PhysReg as reserved. This is very similar to
-/// defineVirtReg except the physreg is reverved instead of allocated.
+/// defineVirtReg except the physreg is reserved instead of allocated.
 void RAFast::reservePhysReg(MachineBasicBlock &MBB, MachineInstr *MI,
                             unsigned PhysReg) {
   UsedInInstr.set(PhysReg);
@@ -623,6 +623,16 @@ void RAFast::AllocateBasicBlock(MachineBasicBlock &MBB) {
       if (!Reg || !TargetRegisterInfo::isPhysicalRegister(Reg) ||
           ReservedRegs.test(Reg)) continue;
       if (MO.isUse()) {
+#ifndef NDEBUG
+        // We are using a physreg directly. It had better not be clobbered by a
+        // virtreg.
+        assert(PhysRegState[Reg] <= regReserved && "Using clobbered physreg");
+        if (PhysRegState[Reg] == regDisabled)
+          for (const unsigned *AS = TRI->getAliasSet(Reg);
+               unsigned Alias = *AS; ++AS)
+            assert(PhysRegState[Alias] <= regReserved &&
+                   "Physreg alias was clobbered");
+#endif
         PhysKills.push_back(Reg); // Any clean physreg use is a kill.
         UsedInInstr.set(Reg);
       } else if (MO.isEarlyClobber()) {