Modify AllocateLocalVar method to take a size argument.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1318 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 5993daf..383bd2a 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -16,6 +16,7 @@
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/Target/MachineFrameInfo.h"
 #include "llvm/Target/MachineRegInfo.h"
+#include "llvm/Target/MachineCacheInfo.h"
 #include "llvm/Method.h"
 #include "llvm/iOther.h"
 #include "llvm/Instruction.h"
@@ -192,6 +193,24 @@
   return os;
 }
 
+// Align data larger than one L1 cache line on L1 cache line boundaries.
+// Align all smaller data on the next higher 2^x boundary (4, 8, ...).
+//
+// THIS FUNCTION HAS BEEN COPIED FROM EMITASSEMBLY.CPP AND
+// SHOULD BE USED DIRECTLY THERE
+// 
+inline unsigned int
+SizeToAlignment(unsigned int size, const TargetMachine& target)
+{
+  unsigned short cacheLineSize = target.getCacheInfo().getCacheLineSize(1); 
+  if (size > (unsigned) cacheLineSize / 2)
+    return cacheLineSize;
+  else
+    for (unsigned sz=1; /*no condition*/; sz *= 2)
+      if (sz >= size)
+        return sz;
+}
+
 static unsigned int
 ComputeMaxOptionalArgsSize(const TargetMachine& target, const Method* method)
 {
@@ -248,7 +267,8 @@
 
 int
 MachineCodeForMethod::allocateLocalVar(const TargetMachine& target,
-                                       const Value* val)
+                                       const Value* val,
+                                       unsigned int size)
 {
   // Check if we've allocated a stack slot for this value already
   // 
@@ -258,9 +278,15 @@
       bool growUp;
       int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this,
                                                                        growUp);
-      unsigned int  size  = target.findOptimalStorageSize(val->getType());
-      unsigned char align = target.DataLayout.getTypeAlignment(val->getType());
+      unsigned char align;
+      if (size == 0)
+        {
+          size  = target.findOptimalStorageSize(val->getType());
+          // align = target.DataLayout.getTypeAlignment(val->getType());
+        }
       
+      align = SizeToAlignment(size, target);
+          
       offset = getAutomaticVarsSize();
       if (! growUp)
         offset += size;