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