diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index dc1ccc4bafcd..f2c2d1cdf5ae 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -462,8 +462,15 @@ static LoadInst *combineLoadToNewType(InstCombiner &IC, LoadInst &LI, Type *NewT NewPtr->getType()->getPointerAddressSpace() == AS)) NewPtr = IC.Builder.CreateBitCast(Ptr, NewTy->getPointerTo(AS)); + unsigned Align = LI.getAlignment(); + if (!Align) + // If old load did not have an explicit alignment specified, + // manually preserve the implied (ABI) alignment of the load. + // Else we may inadvertently incorrectly over-promise alignment. + Align = IC.getDataLayout().getABITypeAlignment(LI.getType()); + LoadInst *NewLoad = IC.Builder.CreateAlignedLoad( - NewTy, NewPtr, LI.getAlignment(), LI.isVolatile(), LI.getName() + Suffix); + NewTy, NewPtr, Align, LI.isVolatile(), LI.getName() + Suffix); NewLoad->setAtomic(LI.getOrdering(), LI.getSyncScopeID()); copyMetadataForLoad(*NewLoad, LI); return NewLoad; diff --git a/llvm/test/Transforms/InstCombine/load-bitcast64.ll b/llvm/test/Transforms/InstCombine/load-bitcast64.ll index 58bc923da699..270bd6f5f811 100644 --- a/llvm/test/Transforms/InstCombine/load-bitcast64.ll +++ b/llvm/test/Transforms/InstCombine/load-bitcast64.ll @@ -8,7 +8,7 @@ define i64* @test1(i8* %x) { ; CHECK-LABEL: @test1( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = bitcast i8* [[X:%.*]] to i64** -; CHECK-NEXT: [[B1:%.*]] = load i64*, i64** [[TMP0]], align 8 +; CHECK-NEXT: [[B1:%.*]] = load i64*, i64** [[TMP0]], align 4 ; CHECK-NEXT: ret i64* [[B1]] ; entry: @@ -57,7 +57,7 @@ define i64 @test4(i8* %x) { ; CHECK-LABEL: @test4( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = bitcast i8* [[X:%.*]] to i64* -; CHECK-NEXT: [[B1:%.*]] = load i64, i64* [[TMP0]], align 4 +; CHECK-NEXT: [[B1:%.*]] = load i64, i64* [[TMP0]], align 8 ; CHECK-NEXT: ret i64 [[B1]] ; entry: @@ -88,7 +88,7 @@ define i64 @test6(i8* %x) { ; CHECK-LABEL: @test6( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = bitcast i8* [[X:%.*]] to i64* -; CHECK-NEXT: [[B1:%.*]] = load i64, i64* [[TMP0]], align 4 +; CHECK-NEXT: [[B1:%.*]] = load i64, i64* [[TMP0]], align 8 ; CHECK-NEXT: ret i64 [[B1]] ; entry: