Scavenger asserts.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Sun, 2 Aug 2009 18:28:41 +0000 (18:28 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Sun, 2 Aug 2009 18:28:41 +0000 (18:28 +0000)
Allow imp-def and imp-use of anything in the scavenger asserts, just like the machine code verifier.
Allow redefinition of a sub-register of a live register.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77904 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/RegisterScavenging.h
lib/CodeGen/RegisterScavenging.cpp
test/CodeGen/Blackfin/load-intr.ll

index 458c2e4487f9ce31b6f4769838e970f2daad392f..fc75aea2bcb8b76901f50026fc4f70e7ffae513e 100644 (file)
@@ -113,6 +113,9 @@ public:
   bool isUsed(unsigned Reg) const   { return !RegsAvailable[Reg]; }
   bool isUnused(unsigned Reg) const { return RegsAvailable[Reg]; }
 
+  /// isSuperRegUsed - Test if a super register is currently being used.
+  bool isSuperRegUsed(unsigned Reg) const;
+
   /// getRegsUsed - return all registers currently in use in used.
   void getRegsUsed(BitVector &used, bool includeReserved);
 
index 972cf13a24020381fcb5d850734c2381b2a0592a..e32d23264d65b5d9dd08713887dc03d088ba90bc 100644 (file)
@@ -57,6 +57,14 @@ static bool RedefinesSuperRegPart(const MachineInstr *MI,
   return RedefinesSuperRegPart(MI, MO.getReg(), TRI);
 }
 
+bool RegScavenger::isSuperRegUsed(unsigned Reg) const {
+  for (const unsigned *SuperRegs = TRI->getSuperRegisters(Reg);
+       unsigned SuperReg = *SuperRegs; ++SuperRegs)
+    if (isUsed(SuperReg))
+      return true;
+  return false;
+}
+
 /// setUsed - Set the register and its sub-registers as being used.
 void RegScavenger::setUsed(unsigned Reg) {
   RegsAvailable.reset(Reg);
@@ -218,7 +226,7 @@ void RegScavenger::forward() {
     const MachineOperand MO = *UseMOs[i].first;
     unsigned Reg = MO.getReg();
 
-    assert(isUsed(Reg) && "Using an undefined register!");
+    assert((MO.isImplicit() || isUsed(Reg)) && "Using an undefined register!");
 
     if (MO.isKill() && !isReserved(Reg)) {
       KillRegs.set(Reg);
@@ -269,7 +277,8 @@ void RegScavenger::forward() {
 
     // Implicit def is allowed to "re-define" any register. Similarly,
     // implicitly defined registers can be clobbered.
-    assert((isReserved(Reg) || isUnused(Reg) ||
+    assert((MO.isImplicit() || isReserved(Reg) || isUnused(Reg) ||
+            isSuperRegUsed(Reg) ||
             isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
            "Re-defining a live register!");
     setUsed(Reg);
index 9d74237022892852ec1cfaf2dbe3111feac0f524..9ef8b978aca7eb29bf57d1fec08d1b5d0ea9fcc1 100644 (file)
@@ -1,7 +1,4 @@
 ; RUN: llvm-as < %s | llc -march=bfin -verify-machineinstrs | FileCheck %s
-; XFAIL: *
-; Assertion failed: (isUsed(Reg) && "Using an undefined register!"),
-; function forward, file lib/CodeGen/RegisterScavenging.cpp, line 221.
 
 define i16 @f(i32* %p) nounwind {
 entry: