@@ -9,7 +9,7 @@ use gccjit::FunctionType;
9
9
use gccjit:: { ComparisonOp , Function , RValue , ToRValue , Type , UnaryOp } ;
10
10
#[ cfg( feature = "master" ) ]
11
11
use rustc_abi:: ExternAbi ;
12
- use rustc_abi:: HasDataLayout ;
12
+ use rustc_abi:: { BackendRepr , HasDataLayout } ;
13
13
use rustc_codegen_ssa:: MemFlags ;
14
14
use rustc_codegen_ssa:: base:: wants_msvc_seh;
15
15
use rustc_codegen_ssa:: common:: IntPredicate ;
@@ -181,14 +181,19 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
181
181
sym:: volatile_load | sym:: unaligned_volatile_load => {
182
182
let tp_ty = fn_args. type_at ( 0 ) ;
183
183
let ptr = args[ 0 ] . immediate ( ) ;
184
+ let layout = self . layout_of ( tp_ty) ;
184
185
let load = if let PassMode :: Cast { cast : ref ty, pad_i32 : _ } = fn_abi. ret . mode {
185
186
let gcc_ty = ty. gcc_type ( self ) ;
186
187
self . volatile_load ( gcc_ty, ptr)
187
188
} else {
188
- self . volatile_load ( self . layout_of ( tp_ty ) . gcc_type ( self ) , ptr)
189
+ self . volatile_load ( layout . gcc_type ( self ) , ptr)
189
190
} ;
190
191
// 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
+ }
192
197
}
193
198
sym:: volatile_store => {
194
199
let dst = args[ 0 ] . deref ( self . cx ( ) ) ;
0 commit comments