Fix errors in computing downgrowing offsets, and in
computing size of extra outgoing args.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1256 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 46a8029..b6e8805 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -191,8 +191,9 @@
       {
         CallInst* callInst = cast<CallInst>(*I);
         unsigned int numOperands = callInst->getNumOperands() - 1;
-        unsigned int numExtra = numOperands
-                                - frameInfo.getNumFixedOutgoingArgs();
+        int numExtra = (int) numOperands - frameInfo.getNumFixedOutgoingArgs();
+        if (numExtra <= 0)
+          continue;
         
         unsigned int sizeForThisCall;
         if (frameInfo.argsOnStackHaveFixedSize())
@@ -243,11 +244,12 @@
       bool growUp;
       int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this,
                                                                        growUp);
+      unsigned int size = target.findOptimalStorageSize(val->getType());
+      
       offset = growUp? firstOffset + getAutomaticVarsSize()
-                     : firstOffset - getAutomaticVarsSize();
+                     : firstOffset - getAutomaticVarsSize() - size;
       offsets[val] = offset;
       
-      unsigned int size = target.findOptimalStorageSize(val->getType());
       incrementAutomaticVarsSize(size);
     }
   return offset;
@@ -259,10 +261,11 @@
 {
   bool growUp;
   int firstOffset = target.getFrameInfo().getRegSpillAreaOffset(*this, growUp);
-  int offset = growUp? firstOffset + getRegSpillsSize()
-                     : firstOffset - getRegSpillsSize();
-  
   unsigned int size = target.findOptimalStorageSize(type);
+  
+  int offset = growUp? firstOffset + getRegSpillsSize()
+                     : firstOffset - getRegSpillsSize() - size;
+  
   incrementRegSpillsSize(size);
   
   return offset;
@@ -275,18 +278,18 @@
   const MachineFrameInfo& frameInfo = target.getFrameInfo();
   bool growUp;
   int firstOffset = frameInfo.getFirstOptionalOutgoingArgOffset(*this, growUp);
-  int offset = growUp? firstOffset + getCurrentOptionalArgsSize()
-                     : firstOffset - getCurrentOptionalArgsSize();
-  
+
   int size = MAXINT;
   if (frameInfo.argsOnStackHaveFixedSize())
     size = frameInfo.getSizeOfEachArgOnStack(); 
   else
     {
-      assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets");
       size = target.findOptimalStorageSize(type);
+      assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets");
     }
   
+  int offset = growUp? firstOffset + getCurrentOptionalArgsSize()
+                     : firstOffset - getCurrentOptionalArgsSize() - size;
   incrementCurrentOptionalArgsSize(size);
   
   return offset;
@@ -305,7 +308,7 @@
   bool growUp;
   int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp);
   int offset = growUp? firstTmpOffset + currentTmpValuesSize
-                     : firstTmpOffset - currentTmpValuesSize;
+                     : firstTmpOffset - currentTmpValuesSize - size;
   currentTmpValuesSize += size;
   return offset;
 }