Preserve load alignment in instcombine transformations. I've been unable to
authorBob Wilson <bob.wilson@apple.com>
Fri, 29 Jan 2010 22:39:21 +0000 (22:39 +0000)
committerBob Wilson <bob.wilson@apple.com>
Fri, 29 Jan 2010 22:39:21 +0000 (22:39 +0000)
create a testcase where this matters.  The select+load transformation only
occurs when isSafeToLoadUnconditionally is true, and in those situations,
instcombine also changes the underlying objects to be aligned.  This seems
like a good idea regardless, and I've verified that it doesn't pessimize
the subsequent realignment.

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

lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp

index 306ed6728bc4d86e2e5c0e71d63bd523050f598c..e58c954e91786a98a4300716e22d1da1dc682cd7 100644 (file)
@@ -117,6 +117,7 @@ static Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI,
         // the result of the loaded value.
         Value *NewLoad = 
           IC.Builder->CreateLoad(CastOp, LI.isVolatile(), CI->getName());
+        cast<LoadInst>(NewLoad)->setAlignment(LI.getAlignment());
         // Now cast the result of the load.
         return new BitCastInst(NewLoad, LI.getType());
       }
@@ -205,6 +206,8 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
                                         SI->getOperand(1)->getName()+".val");
         Value *V2 = Builder->CreateLoad(SI->getOperand(2),
                                         SI->getOperand(2)->getName()+".val");
+        cast<LoadInst>(V1)->setAlignment(LI.getAlignment());
+        cast<LoadInst>(V2)->setAlignment(LI.getAlignment());
         return SelectInst::Create(SI->getCondition(), V1, V2);
       }