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;
; 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:
; 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:
; 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: