@@ -478,6 +478,8 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
478
478
bx : & mut Builder < ' a , ' ll , ' tcx > ,
479
479
load : & ' ll Value ,
480
480
scalar : abi:: Scalar ,
481
+ layout : TyAndLayout < ' tcx > ,
482
+ offset : Size ,
481
483
) {
482
484
if !scalar. is_always_valid ( bx) {
483
485
bx. noundef_metadata ( load) ;
@@ -489,10 +491,18 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
489
491
bx. range_metadata ( load, scalar. valid_range ) ;
490
492
}
491
493
}
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
+ }
494
504
}
495
- _ => { }
505
+ abi :: F32 | abi :: F64 => { }
496
506
}
497
507
}
498
508
@@ -510,7 +520,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
510
520
let llval = const_llval. unwrap_or_else ( || {
511
521
let load = self . load ( place. layout . llvm_type ( self ) , place. llval , place. align ) ;
512
522
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 ) ;
514
524
}
515
525
load
516
526
} ) ;
@@ -519,17 +529,17 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
519
529
let b_offset = a. value . size ( self ) . align_to ( b. value . align ( self ) . abi ) ;
520
530
let pair_ty = place. layout . llvm_type ( self ) ;
521
531
522
- let mut load = |i, scalar : abi:: Scalar , align| {
532
+ let mut load = |i, scalar : abi:: Scalar , layout , align, offset | {
523
533
let llptr = self . struct_gep ( pair_ty, place. llval , i as u64 ) ;
524
534
let llty = place. layout . scalar_pair_element_llvm_type ( self , i, false ) ;
525
535
let load = self . load ( llty, llptr, align) ;
526
- scalar_load_metadata ( self , load, scalar) ;
536
+ scalar_load_metadata ( self , load, scalar, layout , offset ) ;
527
537
self . to_immediate_scalar ( load, scalar)
528
538
} ;
529
539
530
540
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 ) ,
533
543
)
534
544
} else {
535
545
OperandValue :: Ref ( place. llval , None , place. align )
@@ -1219,6 +1229,18 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
1219
1229
}
1220
1230
}
1221
1231
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
+
1222
1244
fn noundef_metadata ( & mut self , load : & ' ll Value ) {
1223
1245
unsafe {
1224
1246
llvm:: LLVMSetMetadata (
0 commit comments