Fix bug in RegScavenger::scavengeRegister().
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 15 Jul 2009 22:32:11 +0000 (22:32 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 15 Jul 2009 22:32:11 +0000 (22:32 +0000)
Reserved registers are not candidates for scavenging, and they were removed
from the candidate list like this:

CreateRegClassMask(RC, Candidates);
Candidates ^= ReservedRegs;

However, when there are reserved registers outside RC, this causes invalid
bits to be set in Candidates.

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

lib/CodeGen/RegisterScavenging.cpp

index 84cff8d5d882ce04ac3fd86ffbb7ba3eb9c00a89..98f485045f67837acedd5eebcdb94eeac4ac389f 100644 (file)
@@ -426,7 +426,7 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
   // Mask off the registers which are not in the TargetRegisterClass.
   BitVector Candidates(NumPhysRegs, false);
   CreateRegClassMask(RC, Candidates);
-  Candidates ^= ReservedRegs // Do not include reserved registers.
+  Candidates ^= ReservedRegs & Candidates; // Do not include reserved registers.
 
   // Exclude all the registers being used by the instruction.
   for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {