Teach the local allocator to know that live-in values (e.g. arguments) are
authorChris Lattner <sabre@nondot.org>
Thu, 15 Jun 2006 22:21:53 +0000 (22:21 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 15 Jun 2006 22:21:53 +0000 (22:21 +0000)
live at function entry.  This prevents it from using arg registers for other
purposes before the arguments are used.

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

lib/CodeGen/RegAllocLocal.cpp

index e3921e4ed389705fdf352f746d928d849baa93a8..55d412960c220b0be52fecd78cd904f8f64743a3 100644 (file)
@@ -491,6 +491,26 @@ void RA::AllocateBasicBlock(MachineBasicBlock &MBB) {
   // loop over each instruction
   MachineBasicBlock::iterator MII = MBB.begin();
   const TargetInstrInfo &TII = *TM->getInstrInfo();
+  
+  // If this is the first basic block in the machine function, add live-in
+  // registers as active.
+  if (&MBB == &*MF->begin()) {
+    for (MachineFunction::livein_iterator I = MF->livein_begin(),
+         E = MF->livein_end(); I != E; ++I) {
+      unsigned Reg = I->first;
+      PhysRegsEverUsed[Reg] = true;
+      PhysRegsUsed[Reg] = 0;            // It is free and reserved now
+      PhysRegsUseOrder.push_back(Reg);
+      for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg);
+           *AliasSet; ++AliasSet) {
+        PhysRegsUseOrder.push_back(*AliasSet);
+        PhysRegsUsed[*AliasSet] = 0;  // It is free and reserved now
+        PhysRegsEverUsed[*AliasSet] = true;
+      }
+    }    
+  }
+  
+  // Otherwise, sequentially allocate each instruction in the MBB.
   while (MII != MBB.end()) {
     MachineInstr *MI = MII++;
     const TargetInstrDescriptor &TID = TII.get(MI->getOpcode());