| Index: lib/CodeGen/CGExprComplex.cpp
|
| diff --git a/lib/CodeGen/CGExprComplex.cpp b/lib/CodeGen/CGExprComplex.cpp
|
| index 0a53d4f1277f3493e8e6a206f16a3b26c5d6788d..0067c38285a0496b6c6a23ee98b604fe5e0c05b3 100644
|
| --- a/lib/CodeGen/CGExprComplex.cpp
|
| +++ b/lib/CodeGen/CGExprComplex.cpp
|
| @@ -18,6 +18,7 @@
|
| #include "llvm/ADT/SmallString.h"
|
| #include "llvm/IR/Constants.h"
|
| #include "llvm/IR/Function.h"
|
| +#include "llvm/IR/GlobalValue.h" // @LOCALMOD not needed after merge
|
| using namespace clang;
|
| using namespace CodeGen;
|
|
|
| @@ -291,17 +292,27 @@ public:
|
| ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr,
|
| bool isVolatile) {
|
| llvm::Value *Real=0, *Imag=0;
|
| + // @LOCALMOD-START I submitted a fix upstream for this issue, but the code
|
| + // was re-written to use LValue instead of Value, so this
|
| + // fix will be wrong after the merge.
|
| + // We should cherry-pick my fix, which is past 3.3.
|
| + unsigned Align = 0;
|
| +
|
| + if (llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(SrcPtr))
|
| + Align = GV->getAlignment();
|
|
|
| if (!IgnoreReal || isVolatile) {
|
| llvm::Value *RealP = Builder.CreateStructGEP(SrcPtr, 0,
|
| SrcPtr->getName() + ".realp");
|
| - Real = Builder.CreateLoad(RealP, isVolatile, SrcPtr->getName() + ".real");
|
| + Real = Builder.CreateAlignedLoad(RealP, Align, isVolatile,
|
| + SrcPtr->getName() + ".real");
|
| }
|
|
|
| if (!IgnoreImag || isVolatile) {
|
| llvm::Value *ImagP = Builder.CreateStructGEP(SrcPtr, 1,
|
| SrcPtr->getName() + ".imagp");
|
| - Imag = Builder.CreateLoad(ImagP, isVolatile, SrcPtr->getName() + ".imag");
|
| + Imag = Builder.CreateAlignedLoad(ImagP, Align, isVolatile,
|
| + SrcPtr->getName() + ".imag");
|
| }
|
| return ComplexPairTy(Real, Imag);
|
| }
|
| @@ -312,9 +323,14 @@ void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *Ptr,
|
| bool isVolatile) {
|
| llvm::Value *RealPtr = Builder.CreateStructGEP(Ptr, 0, "real");
|
| llvm::Value *ImagPtr = Builder.CreateStructGEP(Ptr, 1, "imag");
|
| + unsigned Align = 0;
|
| +
|
| + if (llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(Ptr))
|
| + Align = GV->getAlignment();
|
|
|
| - Builder.CreateStore(Val.first, RealPtr, isVolatile);
|
| - Builder.CreateStore(Val.second, ImagPtr, isVolatile);
|
| + Builder.CreateAlignedStore(Val.first, RealPtr, Align, isVolatile);
|
| + Builder.CreateAlignedStore(Val.second, ImagPtr, Align, isVolatile);
|
| + // @LOCALMOD-END
|
| }
|
|
|
|
|
|
|