Bug fix in offset alignment computations: don't subtract the padding
value from size *before* subtracting size from offset!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1283 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 4e1865d..3ce7a2a 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -251,21 +251,24 @@
   int offset = getOffset(val);
   if (offset == INVALID_FRAME_OFFSET)
     {
+      bool growUp;
+      int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this,
+                                                                       growUp);
       unsigned int  size  = target.findOptimalStorageSize(val->getType());
       unsigned char align = target.DataLayout.getTypeAlignment(val->getType());
       
       offset = getAutomaticVarsSize();
+      if (! growUp)
+        offset += size; 
+      
       if (unsigned int mod = offset % align)
         {
           offset += align - mod;
           size   += align - mod;
         }
       
-      bool growUp;
-      int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this,
-                                                                       growUp);
       offset = growUp? firstOffset + offset
-                     : firstOffset - offset - size;
+                     : firstOffset - offset;
       
       offsets[val] = offset;
       
@@ -281,29 +284,33 @@
   unsigned int size  = target.findOptimalStorageSize(type);
   unsigned char align = target.DataLayout.getTypeAlignment(type);
   
-  int offset = getRegSpillsSize();
-  if (unsigned int mod = offset % align)
-    {
-      offset += align - mod;
-      size   += align - mod;
-    }
-  
   bool growUp;
   int firstOffset = target.getFrameInfo().getRegSpillAreaOffset(*this, growUp);
+  
+  int offset = getRegSpillsSize();
+  if (! growUp)
+    offset += size; 
+  
+  if (unsigned int mod = offset % align)
+    {
+      offset    += align - mod;
+      size += align - mod;
+    }
+  
   offset = growUp? firstOffset + offset
-                 : firstOffset - offset - size;
+                 : firstOffset - offset;
   
   incrementRegSpillsSize(size);
   
   return offset;
 }
-  
+
 int
 MachineCodeForMethod::allocateOptionalArg(const TargetMachine& target,
                                           const Type* type)
 {
   const MachineFrameInfo& frameInfo = target.getFrameInfo();
-
+  
   int size = MAXINT;
   if (frameInfo.argsOnStackHaveFixedSize())
     size = frameInfo.getSizeOfEachArgOnStack(); 
@@ -314,17 +321,21 @@
     }
   unsigned char align = target.DataLayout.getTypeAlignment(type);
   
+  bool growUp;
+  int firstOffset = frameInfo.getFirstOptionalOutgoingArgOffset(*this, growUp);
+  
   int offset = getCurrentOptionalArgsSize();
+  if (! growUp)
+    offset += size; 
+  
   if (unsigned int mod = offset % align)
     {
       offset += align - mod;
       size   += align - mod;
     }
   
-  bool growUp;
-  int firstOffset = frameInfo.getFirstOptionalOutgoingArgOffset(*this, growUp);
   offset = growUp? firstOffset + offset
-                 : firstOffset - offset - size;
+                 : firstOffset - offset;
   
   incrementCurrentOptionalArgsSize(size);
   
@@ -349,17 +360,21 @@
          align = 2*align)
     ;
   
+  bool growUp;
+  int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp);
+  
   int offset = currentTmpValuesSize;
+  if (! growUp)
+    offset += size; 
+  
   if (unsigned int mod = offset % align)
     {
       offset += align - mod;
       size   += align - mod;
     }
   
-  bool growUp;
-  int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp);
   offset = growUp? firstTmpOffset + offset
-                 : firstTmpOffset - offset - size;
+                 : firstTmpOffset - offset;
   
   currentTmpValuesSize += size;
   return offset;
@@ -371,17 +386,6 @@
   currentTmpValuesSize = 0;
 }
 
-
-// void
-// MachineCodeForMethod::putLocalVarAtOffsetFromSP(const Value* local,
-//                                                 int offset,
-//                                                 unsigned int size)
-// {
-//   offsetsFromSP[local] = offset;
-//   incrementAutomaticVarsSize(size);
-// }
-// 
-
 int
 MachineCodeForMethod::getOffset(const Value* val) const
 {
@@ -389,15 +393,6 @@
   return (pair == offsets.end())? INVALID_FRAME_OFFSET : (*pair).second;
 }
 
-
-// int
-// MachineCodeForMethod::getOffsetFromSP(const Value* local) const
-// {
-//   hash_map<const Value*, int>::const_iterator pair = offsetsFromSP.find(local);
-//   return (pair == offsetsFromSP.end())? INVALID_FRAME_OFFSET : (*pair).second;
-// }
-
-
 void
 MachineCodeForMethod::dump() const
 {