Index: llvm/trunk/lib/Transforms/Scalar/LoopLoadElimination.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopLoadElimination.cpp +++ llvm/trunk/lib/Transforms/Scalar/LoopLoadElimination.cpp @@ -415,7 +415,9 @@ Value *InitialPtr = SEE.expandCodeFor(PtrSCEV->getStart(), Ptr->getType(), PH->getTerminator()); Value *Initial = - new LoadInst(InitialPtr, "load_initial", PH->getTerminator()); + new LoadInst(InitialPtr, "load_initial", /* isVolatile */ false, + Cand.Load->getAlignment(), PH->getTerminator()); + PHINode *PHI = PHINode::Create(Initial->getType(), 2, "store_forwarded", &L->getHeader()->front()); PHI->addIncoming(Initial, PH); Index: llvm/trunk/test/Transforms/LoopLoadElim/forward.ll =================================================================== --- llvm/trunk/test/Transforms/LoopLoadElim/forward.ll +++ llvm/trunk/test/Transforms/LoopLoadElim/forward.ll @@ -16,8 +16,8 @@ ; CHECK-NOT: %found.conflict{{.*}} = entry: -; for.body.ph: -; CHECK: %load_initial = load i32, i32* %A +; Make sure the hoisted load keeps the alignment +; CHECK: %load_initial = load i32, i32* %A, align 1 br label %for.body for.body: ; preds = %for.body, %entry @@ -34,7 +34,7 @@ %a_p1 = add i32 %b, 2 store i32 %a_p1, i32* %Aidx_next, align 4 - %a = load i32, i32* %Aidx, align 4 + %a = load i32, i32* %Aidx, align 1 ; CHECK: %c = mul i32 %store_forwarded, 2 %c = mul i32 %a, 2 store i32 %c, i32* %Cidx, align 4