@@ -9,7 +9,7 @@ use gccjit::FunctionType;
99use gccjit:: { ComparisonOp , Function , RValue , ToRValue , Type , UnaryOp } ;
1010#[ cfg( feature = "master" ) ]
1111use rustc_abi:: ExternAbi ;
12- use rustc_abi:: HasDataLayout ;
12+ use rustc_abi:: { BackendRepr , HasDataLayout } ;
1313use rustc_codegen_ssa:: MemFlags ;
1414use rustc_codegen_ssa:: base:: wants_msvc_seh;
1515use rustc_codegen_ssa:: common:: IntPredicate ;
@@ -181,14 +181,19 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
181181 sym:: volatile_load | sym:: unaligned_volatile_load => {
182182 let tp_ty = fn_args. type_at ( 0 ) ;
183183 let ptr = args[ 0 ] . immediate ( ) ;
184+ let layout = self . layout_of ( tp_ty) ;
184185 let load = if let PassMode :: Cast { cast : ref ty, pad_i32 : _ } = fn_abi. ret . mode {
185186 let gcc_ty = ty. gcc_type ( self ) ;
186187 self . volatile_load ( gcc_ty, ptr)
187188 } else {
188- self . volatile_load ( self . layout_of ( tp_ty ) . gcc_type ( self ) , ptr)
189+ self . volatile_load ( layout . gcc_type ( self ) , ptr)
189190 } ;
190191 // TODO(antoyo): set alignment.
191- self . to_immediate ( load, self . layout_of ( tp_ty) )
192+ if let BackendRepr :: Scalar ( scalar) = layout. backend_repr {
193+ self . to_immediate_scalar ( load, scalar)
194+ } else {
195+ load
196+ }
192197 }
193198 sym:: volatile_store => {
194199 let dst = args[ 0 ] . deref ( self . cx ( ) ) ;
0 commit comments