@@ -410,17 +410,17 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
410
410
}
411
411
}
412
412
413
- fn load ( & mut self , ptr : & ' ll Value , align : Align ) -> & ' ll Value {
413
+ fn load ( & mut self , ty : & ' ll Type , ptr : & ' ll Value , align : Align ) -> & ' ll Value {
414
414
unsafe {
415
- let load = llvm:: LLVMBuildLoad ( self . llbuilder , ptr, UNNAMED ) ;
415
+ let load = llvm:: LLVMBuildLoad2 ( self . llbuilder , ty , ptr, UNNAMED ) ;
416
416
llvm:: LLVMSetAlignment ( load, align. bytes ( ) as c_uint ) ;
417
417
load
418
418
}
419
419
}
420
420
421
- fn volatile_load ( & mut self , ptr : & ' ll Value ) -> & ' ll Value {
421
+ fn volatile_load ( & mut self , ty : & ' ll Type , ptr : & ' ll Value ) -> & ' ll Value {
422
422
unsafe {
423
- let load = llvm:: LLVMBuildLoad ( self . llbuilder , ptr, UNNAMED ) ;
423
+ let load = llvm:: LLVMBuildLoad2 ( self . llbuilder , ty , ptr, UNNAMED ) ;
424
424
llvm:: LLVMSetVolatile ( load, llvm:: True ) ;
425
425
load
426
426
}
@@ -488,7 +488,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
488
488
}
489
489
}
490
490
let llval = const_llval. unwrap_or_else ( || {
491
- let load = self . load ( place. llval , place. align ) ;
491
+ let load = self . load ( place. layout . llvm_type ( self ) , place . llval , place. align ) ;
492
492
if let abi:: Abi :: Scalar ( ref scalar) = place. layout . abi {
493
493
scalar_load_metadata ( self , load, scalar) ;
494
494
}
@@ -500,7 +500,8 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
500
500
501
501
let mut load = |i, scalar : & abi:: Scalar , align| {
502
502
let llptr = self . struct_gep ( place. llval , i as u64 ) ;
503
- let load = self . load ( llptr, align) ;
503
+ let llty = place. layout . scalar_pair_element_llvm_type ( self , i, false ) ;
504
+ let load = self . load ( llty, llptr, align) ;
504
505
scalar_load_metadata ( self , load, scalar) ;
505
506
self . to_immediate_scalar ( load, scalar)
506
507
} ;
@@ -817,13 +818,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
817
818
size : & ' ll Value ,
818
819
flags : MemFlags ,
819
820
) {
820
- if flags. contains ( MemFlags :: NONTEMPORAL ) {
821
- // HACK(nox): This is inefficient but there is no nontemporal memcpy.
822
- let val = self . load ( src, src_align) ;
823
- let ptr = self . pointercast ( dst, self . type_ptr_to ( self . val_ty ( val) ) ) ;
824
- self . store_with_flags ( val, ptr, dst_align, flags) ;
825
- return ;
826
- }
821
+ assert ! ( !flags. contains( MemFlags :: NONTEMPORAL ) , "non-temporal memcpy not supported" ) ;
827
822
let size = self . intcast ( size, self . type_isize ( ) , false ) ;
828
823
let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
829
824
let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
@@ -850,13 +845,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
850
845
size : & ' ll Value ,
851
846
flags : MemFlags ,
852
847
) {
853
- if flags. contains ( MemFlags :: NONTEMPORAL ) {
854
- // HACK(nox): This is inefficient but there is no nontemporal memmove.
855
- let val = self . load ( src, src_align) ;
856
- let ptr = self . pointercast ( dst, self . type_ptr_to ( self . val_ty ( val) ) ) ;
857
- self . store_with_flags ( val, ptr, dst_align, flags) ;
858
- return ;
859
- }
848
+ assert ! ( !flags. contains( MemFlags :: NONTEMPORAL ) , "non-temporal memmove not supported" ) ;
860
849
let size = self . intcast ( size, self . type_isize ( ) , false ) ;
861
850
let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
862
851
let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
0 commit comments