@@ -410,17 +410,17 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
410410 }
411411 }
412412
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 {
414414 unsafe {
415- let load = llvm:: LLVMBuildLoad ( self . llbuilder , ptr, UNNAMED ) ;
415+ let load = llvm:: LLVMBuildLoad2 ( self . llbuilder , ty , ptr, UNNAMED ) ;
416416 llvm:: LLVMSetAlignment ( load, align. bytes ( ) as c_uint ) ;
417417 load
418418 }
419419 }
420420
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 {
422422 unsafe {
423- let load = llvm:: LLVMBuildLoad ( self . llbuilder , ptr, UNNAMED ) ;
423+ let load = llvm:: LLVMBuildLoad2 ( self . llbuilder , ty , ptr, UNNAMED ) ;
424424 llvm:: LLVMSetVolatile ( load, llvm:: True ) ;
425425 load
426426 }
@@ -488,7 +488,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
488488 }
489489 }
490490 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 ) ;
492492 if let abi:: Abi :: Scalar ( ref scalar) = place. layout . abi {
493493 scalar_load_metadata ( self , load, scalar) ;
494494 }
@@ -500,7 +500,8 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
500500
501501 let mut load = |i, scalar : & abi:: Scalar , align| {
502502 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) ;
504505 scalar_load_metadata ( self , load, scalar) ;
505506 self . to_immediate_scalar ( load, scalar)
506507 } ;
@@ -817,13 +818,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
817818 size : & ' ll Value ,
818819 flags : MemFlags ,
819820 ) {
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" ) ;
827822 let size = self . intcast ( size, self . type_isize ( ) , false ) ;
828823 let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
829824 let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
@@ -850,13 +845,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
850845 size : & ' ll Value ,
851846 flags : MemFlags ,
852847 ) {
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" ) ;
860849 let size = self . intcast ( size, self . type_isize ( ) , false ) ;
861850 let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
862851 let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
0 commit comments