[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