]> granicus.if.org Git - clang/commitdiff
Set load/store alignment when doing ABI coercions.
authorDaniel Dunbar <daniel@zuster.org>
Sat, 7 Feb 2009 02:46:03 +0000 (02:46 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 7 Feb 2009 02:46:03 +0000 (02:46 +0000)
 - Currently, this is producing poor code, but we prefer correctness
   to performance for now. Eventually we should be able to generally
   avoid having to set the alignment when we control the alignment of
   the alloca.

 - This knocks out 33/1000 failures on my single argument ABI tests,
   down to 22/1000 and 18 of these appear to be gcc bugs. Woot.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64001 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp

index 9c4472ee92a6ca7f5ce7667741f238850aba45f7..fbc421cb9e68b379e280dc748a0d29a99866657d 100644 (file)
@@ -959,7 +959,10 @@ static llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
   if (SrcSize == DstSize) {
     llvm::Value *Casted =
       CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
-    return CGF.Builder.CreateLoad(Casted);
+    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
+    // FIXME: Use better alignment / avoid requiring aligned load.
+    Load->setAlignment(1);
+    return Load;
   } else {
     assert(SrcSize < DstSize && "Coercion is losing source bits!");
 
@@ -968,7 +971,10 @@ static llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
     llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
     llvm::Value *Casted = 
       CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
-    CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
+    llvm::StoreInst *Store = 
+      CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
+    // FIXME: Use better alignment / avoid requiring aligned store.
+    Store->setAlignment(1);
     return CGF.Builder.CreateLoad(Tmp);
   }
 }
@@ -992,7 +998,8 @@ static void CreateCoercedStore(llvm::Value *Src,
   if (SrcSize == DstSize) {
     llvm::Value *Casted =
       CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
-    CGF.Builder.CreateStore(Src, Casted);
+    // FIXME: Use better alignment / avoid requiring aligned store.
+    CGF.Builder.CreateStore(Src, Casted)->setAlignment(1);
   } else {
     assert(SrcSize > DstSize && "Coercion is missing bits!");
     
@@ -1002,7 +1009,10 @@ static void CreateCoercedStore(llvm::Value *Src,
     CGF.Builder.CreateStore(Src, Tmp);
     llvm::Value *Casted = 
       CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
-    CGF.Builder.CreateStore(CGF.Builder.CreateLoad(Casted), DstPtr);
+    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
+    // FIXME: Use better alignment / avoid requiring aligned load.
+    Load->setAlignment(1);
+    CGF.Builder.CreateStore(Load, DstPtr);
   }
 }