@@ -478,6 +478,8 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
478478 bx : & mut Builder < ' a , ' ll , ' tcx > ,
479479 load : & ' ll Value ,
480480 scalar : abi:: Scalar ,
481+ layout : TyAndLayout < ' tcx > ,
482+ offset : Size ,
481483 ) {
482484 if !scalar. is_always_valid ( bx) {
483485 bx. noundef_metadata ( load) ;
@@ -489,10 +491,18 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
489491 bx. range_metadata ( load, scalar. valid_range ) ;
490492 }
491493 }
492- abi:: Pointer if !scalar. valid_range . contains ( 0 ) => {
493- bx. nonnull_metadata ( load) ;
494+ abi:: Pointer => {
495+ if !scalar. valid_range . contains ( 0 ) {
496+ bx. nonnull_metadata ( load) ;
497+ }
498+
499+ if let Some ( pointee) = layout. pointee_info_at ( bx, offset) {
500+ if let Some ( _) = pointee. safe {
501+ bx. align_metadata ( load, pointee. align ) ;
502+ }
503+ }
494504 }
495- _ => { }
505+ abi :: F32 | abi :: F64 => { }
496506 }
497507 }
498508
@@ -510,7 +520,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
510520 let llval = const_llval. unwrap_or_else ( || {
511521 let load = self . load ( place. layout . llvm_type ( self ) , place. llval , place. align ) ;
512522 if let abi:: Abi :: Scalar ( scalar) = place. layout . abi {
513- scalar_load_metadata ( self , load, scalar) ;
523+ scalar_load_metadata ( self , load, scalar, place . layout , Size :: ZERO ) ;
514524 }
515525 load
516526 } ) ;
@@ -519,17 +529,17 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
519529 let b_offset = a. value . size ( self ) . align_to ( b. value . align ( self ) . abi ) ;
520530 let pair_ty = place. layout . llvm_type ( self ) ;
521531
522- let mut load = |i, scalar : abi:: Scalar , align| {
532+ let mut load = |i, scalar : abi:: Scalar , layout , align, offset | {
523533 let llptr = self . struct_gep ( pair_ty, place. llval , i as u64 ) ;
524534 let llty = place. layout . scalar_pair_element_llvm_type ( self , i, false ) ;
525535 let load = self . load ( llty, llptr, align) ;
526- scalar_load_metadata ( self , load, scalar) ;
536+ scalar_load_metadata ( self , load, scalar, layout , offset ) ;
527537 self . to_immediate_scalar ( load, scalar)
528538 } ;
529539
530540 OperandValue :: Pair (
531- load ( 0 , a, place. align ) ,
532- load ( 1 , b, place. align . restrict_for_offset ( b_offset) ) ,
541+ load ( 0 , a, place. layout , place . align , Size :: ZERO ) ,
542+ load ( 1 , b, place. layout , place . align . restrict_for_offset ( b_offset) , b_offset ) ,
533543 )
534544 } else {
535545 OperandValue :: Ref ( place. llval , None , place. align )
@@ -1219,6 +1229,18 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
12191229 }
12201230 }
12211231
1232+ fn align_metadata ( & mut self , load : & ' ll Value , align : Align ) {
1233+ unsafe {
1234+ let v = [ self . cx . const_u64 ( align. bytes ( ) ) ] ;
1235+
1236+ llvm:: LLVMSetMetadata (
1237+ load,
1238+ llvm:: MD_align as c_uint ,
1239+ llvm:: LLVMMDNodeInContext ( self . cx . llcx , v. as_ptr ( ) , v. len ( ) as c_uint ) ,
1240+ ) ;
1241+ }
1242+ }
1243+
12221244 fn noundef_metadata ( & mut self , load : & ' ll Value ) {
12231245 unsafe {
12241246 llvm:: LLVMSetMetadata (
0 commit comments