@@ -477,6 +477,8 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
477477 bx : & mut Builder < ' a , ' ll , ' tcx > ,
478478 load : & ' ll Value ,
479479 scalar : abi:: Scalar ,
480+ layout : TyAndLayout < ' tcx > ,
481+ offset : Size ,
480482 ) {
481483 if !scalar. is_always_valid ( bx) {
482484 bx. noundef_metadata ( load) ;
@@ -488,10 +490,18 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
488490 bx. range_metadata ( load, scalar. valid_range ) ;
489491 }
490492 }
491- abi:: Pointer if !scalar. valid_range . contains ( 0 ) => {
492- bx. nonnull_metadata ( load) ;
493+ abi:: Pointer => {
494+ if !scalar. valid_range . contains ( 0 ) {
495+ bx. nonnull_metadata ( load) ;
496+ }
497+
498+ if let Some ( pointee) = layout. pointee_info_at ( bx, offset) {
499+ if let Some ( _) = pointee. safe {
500+ bx. align_metadata ( load, pointee. align ) ;
501+ }
502+ }
493503 }
494- _ => { }
504+ abi :: F32 | abi :: F64 => { }
495505 }
496506 }
497507
@@ -509,7 +519,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
509519 let llval = const_llval. unwrap_or_else ( || {
510520 let load = self . load ( place. layout . llvm_type ( self ) , place. llval , place. align ) ;
511521 if let abi:: Abi :: Scalar ( scalar) = place. layout . abi {
512- scalar_load_metadata ( self , load, scalar) ;
522+ scalar_load_metadata ( self , load, scalar, place . layout , Size :: ZERO ) ;
513523 }
514524 load
515525 } ) ;
@@ -518,17 +528,17 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
518528 let b_offset = a. value . size ( self ) . align_to ( b. value . align ( self ) . abi ) ;
519529 let pair_ty = place. layout . llvm_type ( self ) ;
520530
521- let mut load = |i, scalar : abi:: Scalar , align| {
531+ let mut load = |i, scalar : abi:: Scalar , layout , align, offset | {
522532 let llptr = self . struct_gep ( pair_ty, place. llval , i as u64 ) ;
523533 let llty = place. layout . scalar_pair_element_llvm_type ( self , i, false ) ;
524534 let load = self . load ( llty, llptr, align) ;
525- scalar_load_metadata ( self , load, scalar) ;
535+ scalar_load_metadata ( self , load, scalar, layout , offset ) ;
526536 self . to_immediate_scalar ( load, scalar)
527537 } ;
528538
529539 OperandValue :: Pair (
530- load ( 0 , a, place. align ) ,
531- load ( 1 , b, place. align . restrict_for_offset ( b_offset) ) ,
540+ load ( 0 , a, place. layout , place . align , Size :: ZERO ) ,
541+ load ( 1 , b, place. layout , place . align . restrict_for_offset ( b_offset) , b_offset ) ,
532542 )
533543 } else {
534544 OperandValue :: Ref ( place. llval , None , place. align )
@@ -1208,6 +1218,18 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
12081218 }
12091219 }
12101220
1221+ fn align_metadata ( & mut self , load : & ' ll Value , align : Align ) {
1222+ unsafe {
1223+ let v = [ self . cx . const_u64 ( align. bytes ( ) ) ] ;
1224+
1225+ llvm:: LLVMSetMetadata (
1226+ load,
1227+ llvm:: MD_align as c_uint ,
1228+ llvm:: LLVMMDNodeInContext ( self . cx . llcx , v. as_ptr ( ) , v. len ( ) as c_uint ) ,
1229+ ) ;
1230+ }
1231+ }
1232+
12111233 fn noundef_metadata ( & mut self , load : & ' ll Value ) {
12121234 unsafe {
12131235 llvm:: LLVMSetMetadata (
0 commit comments