X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FRegAllocLocal.cpp;h=2cf8e6327e44a44a718baf919890d204a658652a;hb=da8d96d1a1769d0614c46d9880ac3c21cbc8e74c;hp=4c7ccdf8758db9bc0e81ab278e890179e698848f;hpb=aebcce840429a2f9dd0a17c300a91901528cb953;p=oota-llvm.git diff --git a/lib/CodeGen/RegAllocLocal.cpp b/lib/CodeGen/RegAllocLocal.cpp index 4c7ccdf8758..2cf8e6327e4 100644 --- a/lib/CodeGen/RegAllocLocal.cpp +++ b/lib/CodeGen/RegAllocLocal.cpp @@ -21,11 +21,10 @@ #include "llvm/CodeGen/LiveVariables.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" -#include "Support/CommandLine.h" -#include "Support/Debug.h" -#include "Support/DenseMap.h" -#include "Support/Statistic.h" -#include +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Debug.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/Statistic.h" using namespace llvm; namespace { @@ -226,7 +225,8 @@ int RA::getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC) { return I->second; // Already has space allocated? // Allocate a new stack object for this spill location... - int FrameIdx = MF->getFrameInfo()->CreateStackObject(RC); + int FrameIdx = MF->getFrameInfo()->CreateStackObject(RC->getSize(), + RC->getAlignment()); // Assign the slot... StackSlotForVirtReg.insert(I, std::make_pair(VirtReg, FrameIdx)); @@ -268,7 +268,7 @@ void RA::spillVirtReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const TargetRegisterClass *RC = MF->getSSARegMap()->getRegClass(VirtReg); int FrameIndex = getStackSpaceFor(VirtReg, RC); DEBUG(std::cerr << " to stack slot #" << FrameIndex); - RegInfo->storeRegToStackSlot(MBB, I, PhysReg, FrameIndex, RC); + RegInfo->storeRegToStackSlot(MBB, I, PhysReg, FrameIndex); ++NumStores; // Update statistics } @@ -356,39 +356,6 @@ unsigned RA::getFreeReg(const TargetRegisterClass *RC) { /// void RA::liberatePhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator &I, unsigned PhysReg) { - // FIXME: This code checks to see if a register is available, but it really - // wants to know if a reg is available BEFORE the instruction executes. If - // called after killed operands are freed, it runs the risk of reallocating a - // used operand... -#if 0 - if (isPhysRegAvailable(PhysReg)) return; // Already available... - - // Check to see if the register is directly used, not indirectly used through - // aliases. If aliased registers are the ones actually used, we cannot be - // sure that we will be able to save the whole thing if we do a reg-reg copy. - if (PhysRegsUsed[PhysReg] != -1) { - // The virtual register held... - unsigned VirtReg = PhysRegsUsed[PhysReg]->second; - - // Check to see if there is a compatible register available. If so, we can - // move the value into the new register... - // - const TargetRegisterClass *RC = RegInfo->getRegClass(PhysReg); - if (unsigned NewReg = getFreeReg(RC)) { - // Emit the code to copy the value... - RegInfo->copyRegToReg(MBB, I, NewReg, PhysReg, RC); - - // Update our internal state to indicate that PhysReg is available and Reg - // isn't. - getVirt2PhysRegMapSlot[VirtReg] = 0; - removePhysReg(PhysReg); // Free the physreg - - // Move reference over to new register... - assignVirtToPhysReg(VirtReg, NewReg); - return; - } - } -#endif spillPhysReg(MBB, I, PhysReg); } @@ -424,7 +391,7 @@ unsigned RA::getReg(MachineBasicBlock &MBB, MachineInstr *I, "PhysReg in PhysRegsUseOrder, but is not allocated?"); if (PhysRegsUsed[R]) { // If the current register is compatible, use it. - if (RegInfo->getRegClass(R) == RC) { + if (RC->contains(R)) { PhysReg = R; break; } else { @@ -432,7 +399,7 @@ unsigned RA::getReg(MachineBasicBlock &MBB, MachineInstr *I, // compatible, use it. for (const unsigned *AliasSet = RegInfo->getAliasSet(R); *AliasSet; ++AliasSet) { - if (RegInfo->getRegClass(*AliasSet) == RC) { + if (RC->contains(*AliasSet)) { PhysReg = *AliasSet; // Take an aliased register break; } @@ -507,7 +474,7 @@ MachineInstr *RA::reloadVirtReg(MachineBasicBlock &MBB, MachineInstr *MI, << RegInfo->getName(PhysReg) << "\n"); // Add move instruction(s) - RegInfo->loadRegFromStackSlot(MBB, MI, PhysReg, FrameIndex, RC); + RegInfo->loadRegFromStackSlot(MBB, MI, PhysReg, FrameIndex); ++NumLoads; // Update statistics MI->SetMachineOperandReg(OpNum, PhysReg); // Assign the input register