[llvm-commits] [dragonegg] r164884 - in /dragonegg/trunk: src/Convert.cpp src/x86/Target.cpp test/validator/c++/MRVAlignment.cpp

Duncan Sands baldrick at free.fr
Fri Sep 28 23:15:14 PDT 2012


Author: baldrick
Date: Sat Sep 29 01:15:14 2012
New Revision: 164884

URL: http://llvm.org/viewvc/llvm-project?rev=164884&view=rev
Log:
Yet more places where the ABI code wasn't paying any attention to alignment.
The reason I'm just hacking the alignment to 1 rather than doing something
better is that I have a complete rewrite in the pipeline.

Added:
    dragonegg/trunk/test/validator/c++/MRVAlignment.cpp
Modified:
    dragonegg/trunk/src/Convert.cpp
    dragonegg/trunk/src/x86/Target.cpp

Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=164884&r1=164883&r2=164884&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Sat Sep 29 01:15:14 2012
@@ -1371,10 +1371,11 @@
           if (StructType *STy = dyn_cast<StructType>(Fn->getReturnType())) {
             llvm::Value *Idxs[2];
             Idxs[0] = Builder.getInt32(0);
+            bool Packed = STy->isPacked();
             for (unsigned ri = 0; ri < STy->getNumElements(); ++ri) {
               Idxs[1] = Builder.getInt32(ri);
               Value *GEP = Builder.CreateGEP(ReturnLoc.Ptr, Idxs, "mrv_gep");
-              Value *E = Builder.CreateLoad(GEP, "mrv");
+              Value *E = Builder.CreateAlignedLoad(GEP, /*Align*/Packed, "mrv");
               RetVals.push_back(E);
             }
             // If the return type specifies an empty struct then return one.

Modified: dragonegg/trunk/src/x86/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/x86/Target.cpp?rev=164884&r1=164883&r2=164884&view=diff
==============================================================================
--- dragonegg/trunk/src/x86/Target.cpp (original)
+++ dragonegg/trunk/src/x86/Target.cpp Sat Sep 29 01:15:14 2012
@@ -1678,9 +1678,9 @@
   if (STy->getElementType(SrcFieldNo)->isVectorTy()) {
     Value *ElemIndex = ConstantInt::get(Type::getInt32Ty(Context), SrcElemNo);
     Value *EVIElem = Builder.CreateExtractElement(EVI, ElemIndex, "mrv");
-    Builder.CreateStore(EVIElem, GEP, isVolatile);
+    Builder.CreateAlignedStore(EVIElem, GEP, 1, isVolatile);
   } else {
-    Builder.CreateStore(EVI, GEP, isVolatile);
+    Builder.CreateAlignedStore(EVI, GEP, 1, isVolatile);
   }
 }
 
@@ -1712,16 +1712,16 @@
     Value *E0Index = ConstantInt::get(Type::getInt32Ty(Context), 0);
     Value *EVI0 = Builder.CreateExtractElement(EVI, E0Index, "mrv.v");
     Value *GEP0 = Builder.CreateStructGEP(Dest, 0, "mrv_gep");
-    Builder.CreateStore(EVI0, GEP0, isVolatile);
+    Builder.CreateAlignedStore(EVI0, GEP0, 1, isVolatile);
 
     Value *E1Index = ConstantInt::get(Type::getInt32Ty(Context), 1);
     Value *EVI1 = Builder.CreateExtractElement(EVI, E1Index, "mrv.v");
     Value *GEP1 = Builder.CreateStructGEP(Dest, 1, "mrv_gep");
-    Builder.CreateStore(EVI1, GEP1, isVolatile);
+    Builder.CreateAlignedStore(EVI1, GEP1, 1, isVolatile);
 
     Value *GEP2 = Builder.CreateStructGEP(Dest, 2, "mrv_gep");
     Value *EVI2 = Builder.CreateExtractValue(Src, 1, "mrv_gr");
-    Builder.CreateStore(EVI2, GEP2, isVolatile);
+    Builder.CreateAlignedStore(EVI2, GEP2, 1, isVolatile);
     return;
   }
 
@@ -1733,7 +1733,7 @@
     if (DestElemType->isSingleValueType()) {
       Value *GEP = Builder.CreateStructGEP(Dest, DNO, "mrv_gep");
       Value *EVI = Builder.CreateExtractValue(Src, SNO, "mrv_gr");
-      Builder.CreateStore(EVI, GEP, isVolatile);
+      Builder.CreateAlignedStore(EVI, GEP, 1, isVolatile);
       ++DNO; ++SNO;
       continue;
     }
@@ -1747,13 +1747,13 @@
       Idxs[2] = ConstantInt::get(Type::getInt32Ty(Context), 0);
       Value *GEP = Builder.CreateGEP(Dest, Idxs, "mrv_gep");
       Value *EVI = Builder.CreateExtractValue(Src, 0, "mrv_gr");
-      Builder.CreateStore(EVI, GEP, isVolatile);
+      Builder.CreateAlignedStore(EVI, GEP, 1, isVolatile);
       ++SNO;
 
       Idxs[2] = ConstantInt::get(Type::getInt32Ty(Context), 1);
       GEP = Builder.CreateGEP(Dest, Idxs, "mrv_gep");
       EVI = Builder.CreateExtractValue(Src, 1, "mrv_gr");
-      Builder.CreateStore(EVI, GEP, isVolatile);
+      Builder.CreateAlignedStore(EVI, GEP, 1, isVolatile);
       ++DNO; ++SNO;
       continue;
     }

Added: dragonegg/trunk/test/validator/c++/MRVAlignment.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/c%2B%2B/MRVAlignment.cpp?rev=164884&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/c++/MRVAlignment.cpp (added)
+++ dragonegg/trunk/test/validator/c++/MRVAlignment.cpp Sat Sep 29 01:15:14 2012
@@ -0,0 +1,15 @@
+// RUN: %dragonegg %s -S -o - | FileCheck %s
+
+struct P {
+  char a;
+  unsigned b;
+  unsigned c;
+  unsigned d;
+};
+
+void bar(const P&);
+P qaz();
+void foo() {
+  bar(qaz());
+// CHECK: store i64 %mrv_gr2, {{.*}}, align 1
+}





More information about the llvm-commits mailing list