[llvm-commits] [llvm-gcc-4.2] r102561 -	/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
    Jakob Stoklund Olesen 
    stoklund at 2pi.dk
       
    Wed Apr 28 16:42:58 PDT 2010
    
    
  
Author: stoklund
Date: Wed Apr 28 18:42:58 2010
New Revision: 102561
URL: http://llvm.org/viewvc/llvm-project?rev=102561&view=rev
Log:
Obey the alignment specified on byval arguments.
This could cause problems in a function like this:
  typedef struct {
      long double location;
      long double length;
  } mstr;
  mstr x;
  void bar(int i, int j, mstr y) {
    x = y;
  }
The %y argument to bar() has align 4:
  define void @bar(i32 %i, i32 %j, %struct.mstr* byval align 4 %y) nounwind ssp {
But a 16-byte aligned memcpy was emitted:
  call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast (%struct.mstr* @x to i8*), i8* %y1, i32 32, i32 16, i1 false)
Modified:
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=102561&r1=102560&r2=102561&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Wed Apr 28 18:42:58 2010
@@ -7395,6 +7395,13 @@
       Alignment = DECL_ALIGN(exp) / 8;
   }
 
+  // Function arguments may have extra alignment attributes.
+  if (Argument *Arg = dyn_cast<Argument>(Decl)) {
+    unsigned pa = Arg->getParent()->getParamAlignment(Arg->getArgNo()+1);
+    if (pa && pa < Alignment)
+      Alignment = pa;
+  }
+
   return LValue(BitCastToType(Decl, PTy), Alignment);
 }
 
    
    
More information about the llvm-commits
mailing list