[llvm-commits] [llvm] r122631 - in /llvm/trunk/lib/Target/MBlaze: MBlazeFrameInfo.cpp MBlazeRegisterInfo.cpp

Wesley Peck peckw at wesleypeck.com
Wed Dec 29 11:46:28 PST 2010


Author: peckw
Date: Wed Dec 29 13:46:28 2010
New Revision: 122631

URL: http://llvm.org/viewvc/llvm-project?rev=122631&view=rev
Log:
Fix stack layout error in MBlaze backend.

Modified:
    llvm/trunk/lib/Target/MBlaze/MBlazeFrameInfo.cpp
    llvm/trunk/lib/Target/MBlaze/MBlazeRegisterInfo.cpp

Modified: llvm/trunk/lib/Target/MBlaze/MBlazeFrameInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MBlaze/MBlazeFrameInfo.cpp?rev=122631&r1=122630&r2=122631&view=diff
==============================================================================
--- llvm/trunk/lib/Target/MBlaze/MBlazeFrameInfo.cpp (original)
+++ llvm/trunk/lib/Target/MBlaze/MBlazeFrameInfo.cpp Wed Dec 29 13:46:28 2010
@@ -11,6 +11,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+#define DEBUG_TYPE "mblaze-frame-info"
+
 #include "MBlazeFrameInfo.h"
 #include "MBlazeInstrInfo.h"
 #include "MBlazeMachineFunction.h"
@@ -24,6 +26,9 @@
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
 
 using namespace llvm;
 
@@ -66,6 +71,23 @@
 
   int StackAdjust = 0;
   int StackOffset = -28;
+
+  // In this loop we are searching frame indexes that corrospond to incoming
+  // arguments that are already in the stack. We look for instruction sequences
+  // like the following:
+  //    
+  //    LWI REG, FI1, 0
+  //    ...
+  //    SWI REG, FI2, 0
+  //
+  // As long as there are no defs of REG in the ... part, we can eliminate
+  // the SWI instruction because the value has already been stored to the
+  // stack by the caller. All we need to do is locate FI at the correct
+  // stack location according to the calling convensions.
+  //
+  // Additionally, if the SWI operation kills the def of REG then we don't
+  // need the LWI operation so we can erase it as well.
+#if 1
   for (unsigned i = 0, e = LiveInFI.size(); i < e; ++i) {
     for (MachineBasicBlock::iterator I=MIB; I != MIE; ++I) {
       if (I->getOpcode() != MBlaze::LWI || I->getNumOperands() != 3 ||
@@ -75,60 +97,88 @@
       unsigned FIReg = I->getOperand(0).getReg();
       MachineBasicBlock::iterator SI = I;
       for (SI++; SI != MIE; ++SI) {
-        if (!SI->getOperand(0).isReg()) continue;
-        if (!SI->getOperand(1).isFI()) continue;
-        if (SI->getOpcode() != MBlaze::SWI) continue;
+        if (!SI->getOperand(0).isReg() ||
+            !SI->getOperand(1).isFI() ||
+            SI->getOpcode() != MBlaze::SWI) continue;
 
         int FI = SI->getOperand(1).getIndex();
-        if (SI->getOperand(0).getReg() != FIReg) continue;
-        if (MFI->isFixedObjectIndex(FI)) continue;
-        if (MFI->getObjectSize(FI) != 4) continue;
+        if (SI->getOperand(0).getReg() != FIReg ||
+            MFI->isFixedObjectIndex(FI) ||
+            MFI->getObjectSize(FI) != 4) continue;
+
         if (SI->getOperand(0).isDef()) break;
 
-        if (SI->getOperand(0).isKill())
+        if (SI->getOperand(0).isKill()) {
+          DEBUG(dbgs() << "LWI for FI#" << I->getOperand(1).getIndex() 
+                       << " removed\n");
           EraseInstr.push_back(I);
+        }
+
         EraseInstr.push_back(SI);
+        DEBUG(dbgs() << "SWI for FI#" << FI << " removed\n");
+
         MBlazeFI->recordLoadArgsFI(FI, StackOffset);
+        DEBUG(dbgs() << "FI#" << FI << " relocated to " << StackOffset << "\n");
+
         StackOffset -= 4;
         StackAdjust += 4;
         break;
       }
     }
   }
+#endif
 
-  for (MachineBasicBlock::iterator I=MBB->begin(), E=MBB->end(); I != E; ++I) {
-    if (I->getOpcode() != MBlaze::SWI || I->getNumOperands() != 3 ||
-        !I->getOperand(1).isFI() || !I->getOperand(0).isReg() ||
-        I->getOperand(1).getIndex() < 0) continue;
+  // In this loop we are searching for frame indexes that corrospond to
+  // incoming arguments that are in registers. We look for instruction
+  // sequences like the following:
+  //    
+  //    ...  SWI REG, FI, 0
+  // 
+  // As long as the ... part does not define REG and if REG is an incoming
+  // parameter register then we know that, according to ABI convensions, the
+  // caller has allocated stack space for it already.  Instead of allocating
+  // stack space on our frame, we record the correct location in the callers
+  // frame.
+#if 1
+  for (MachineRegisterInfo::livein_iterator LI = LII; LI != LIE; ++LI) {
+    for (MachineBasicBlock::iterator I=MIB; I != MIE; ++I) {
+      if (I->definesRegister(LI->first))
+        break;
+
+      if (I->getOpcode() != MBlaze::SWI || I->getNumOperands() != 3 ||
+          !I->getOperand(1).isFI() || !I->getOperand(0).isReg() ||
+          I->getOperand(1).getIndex() < 0) continue;
 
-    unsigned FIReg = 0;
-    for (MachineRegisterInfo::livein_iterator LI = LII; LI != LIE; ++LI) {
       if (I->getOperand(0).getReg() == LI->first) {
-        FIReg = LI->first;
-        break;
-      }
-    }
+        int FI = I->getOperand(1).getIndex();
+        MBlazeFI->recordLiveIn(FI);
 
-    if (FIReg) {
-      int FI = I->getOperand(1).getIndex();
-      MBlazeFI->recordLiveIn(FI);
-
-      StackAdjust += 4;
-      switch (FIReg) {
-      default: llvm_unreachable("invalid incoming parameter!");
-      case MBlaze::R5:  MBlazeFI->recordLoadArgsFI(FI, -4); break;
-      case MBlaze::R6:  MBlazeFI->recordLoadArgsFI(FI, -8); break;
-      case MBlaze::R7:  MBlazeFI->recordLoadArgsFI(FI, -12); break;
-      case MBlaze::R8:  MBlazeFI->recordLoadArgsFI(FI, -16); break;
-      case MBlaze::R9:  MBlazeFI->recordLoadArgsFI(FI, -20); break;
-      case MBlaze::R10: MBlazeFI->recordLoadArgsFI(FI, -24); break;
+        int FILoc = 0;
+        switch (LI->first) {
+        default: llvm_unreachable("invalid incoming parameter!");
+        case MBlaze::R5:  FILoc = -4; break;
+        case MBlaze::R6:  FILoc = -8; break;
+        case MBlaze::R7:  FILoc = -12; break;
+        case MBlaze::R8:  FILoc = -16; break;
+        case MBlaze::R9:  FILoc = -20; break;
+        case MBlaze::R10: FILoc = -24; break;
+        }
+
+        StackAdjust += 4;
+        MBlazeFI->recordLoadArgsFI(FI, FILoc);
+        DEBUG(dbgs() << "FI#" << FI << " relocated to " << FILoc << "\n");
+        break;
       }
     }
   }
+#endif
 
+  // Go ahead and erase all of the instructions that we determined were
+  // no longer needed.
   for (int i = 0, e = EraseInstr.size(); i < e; ++i)
     MBB->erase(EraseInstr[i]);
 
+  DEBUG(dbgs() << "Final stack adjustment: " << StackAdjust << "\n");
   MBlazeFI->setStackAdjust(StackAdjust);
 }
 
@@ -230,7 +280,10 @@
 
   // Get the number of bytes to allocate from the FrameInfo
   unsigned FrameSize = MFI->getStackSize();
+  DEBUG(dbgs() << "Original Frame Size: " << FrameSize << "\n" );
+
   FrameSize -= MBlazeFI->getStackAdjust();
+  DEBUG(dbgs() << "Adjusted Frame Size: " << FrameSize << "\n" );
 
   // Get the alignments provided by the target, and the maximum alignment
   // (if any) of the fixed frame objects.
@@ -241,6 +294,7 @@
   // Make sure the frame is aligned.
   FrameSize = (FrameSize + AlignMask) & ~AlignMask;
   MFI->setStackSize(FrameSize);
+  DEBUG(dbgs() << "Aligned Frame Size: " << FrameSize << "\n" );
 }
 
 // hasFP - Return true if the specified function should have a dedicated frame

Modified: llvm/trunk/lib/Target/MBlaze/MBlazeRegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MBlaze/MBlazeRegisterInfo.cpp?rev=122631&r1=122630&r2=122631&view=diff
==============================================================================
--- llvm/trunk/lib/Target/MBlaze/MBlazeRegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/MBlaze/MBlazeRegisterInfo.cpp Wed Dec 29 13:46:28 2010
@@ -12,7 +12,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#define DEBUG_TYPE "mblaze-reg-info"
+#define DEBUG_TYPE "mblaze-frame-info"
 
 #include "MBlaze.h"
 #include "MBlazeSubtarget.h"
@@ -277,25 +277,32 @@
 
   unsigned oi = i == 2 ? 1 : 2;
 
-  DEBUG(errs() << "\nFunction : " << MF.getFunction()->getName() << "\n";
-        errs() << "<--------->\n" << MI);
+  DEBUG(dbgs() << "\nFunction : " << MF.getFunction()->getName() << "\n";
+        dbgs() << "<--------->\n" << MI);
 
   int FrameIndex = MI.getOperand(i).getIndex();
   int stackSize  = MF.getFrameInfo()->getStackSize();
   int spOffset   = MF.getFrameInfo()->getObjectOffset(FrameIndex);
 
-  DEBUG(errs() << "FrameIndex : " << FrameIndex << "\n"
+  DEBUG(dbgs() << "FrameIndex : " << FrameIndex << "\n"
                << "spOffset   : " << spOffset << "\n"
-               << "stackSize  : " << stackSize << "\n");
+               << "stackSize  : " << stackSize << "\n"
+               << "isFixed    : " << MFI->isFixedObjectIndex(FrameIndex) << "\n"
+               << "isLiveIn   : " << MBlazeFI->isLiveIn(FrameIndex) << "\n"
+               << "isSpill    : " << MFI->isSpillSlotObjectIndex(FrameIndex)
+               << "\n" );
 
   // as explained on LowerFormalArguments, detect negative offsets
   // and adjust SPOffsets considering the final stack size.
   int Offset = (spOffset < 0) ? (stackSize - spOffset) : spOffset;
   Offset += MI.getOperand(oi).getImm();
-  if (!MFI->isFixedObjectIndex(FrameIndex) && !MBlazeFI->isLiveIn(FrameIndex) && spOffset >= 0)
+  if (!MFI->isFixedObjectIndex(FrameIndex) && 
+      !MFI->isSpillSlotObjectIndex(FrameIndex) &&
+      !MBlazeFI->isLiveIn(FrameIndex) && 
+      spOffset >= 0)
     Offset -= MBlazeFI->getStackAdjust();
 
-  DEBUG(errs() << "Offset     : " << Offset << "\n" << "<--------->\n");
+  DEBUG(dbgs() << "Offset     : " << Offset << "\n" << "<--------->\n");
 
   MI.getOperand(oi).ChangeToImmediate(Offset);
   MI.getOperand(i).ChangeToRegister(getFrameRegister(MF), false);





More information about the llvm-commits mailing list