@@ -3,7 +3,7 @@ use crate::maybe_pqp_cg_ssa as rustc_codegen_ssa;
33
44use super :: Builder ;
55use crate :: abi:: ConvSpirvType ;
6- use crate :: builder_spirv:: SpirvValue ;
6+ use crate :: builder_spirv:: { SpirvValue , SpirvValueExt , SpirvValueKind } ;
77use crate :: codegen_cx:: CodegenCx ;
88use crate :: spirv_type:: SpirvType ;
99use rspirv:: dr;
@@ -127,12 +127,20 @@ impl<'a, 'tcx> AsmBuilderMethods<'tcx> for Builder<'a, 'tcx> {
127127 } ;
128128
129129 if let Some ( in_value) = in_value
130- && let ( BackendRepr :: Scalar ( scalar) , OperandValue :: Immediate ( in_value_spv) ) =
131- ( in_value. layout . backend_repr , & mut in_value. val )
132- && let Primitive :: Pointer ( _) = scalar. primitive ( )
130+ && let OperandValue :: Immediate ( in_value_spv) = & mut in_value. val
133131 {
134- let in_value_precise_type = in_value. layout . spirv_type ( self . span ( ) , self ) ;
135- * in_value_spv = self . pointercast ( * in_value_spv, in_value_precise_type) ;
132+ if let SpirvValueKind :: FnAddr { function } = in_value_spv. kind
133+ && let SpirvType :: Pointer { pointee } = self . lookup_type ( in_value_spv. ty )
134+ {
135+ // reference to function pointer must be unwrapped from its pointer to be used in calls
136+ * in_value_spv = function. with_type ( pointee) ;
137+ } else if let BackendRepr :: Scalar ( scalar) = in_value. layout . backend_repr
138+ && let Primitive :: Pointer ( _) = scalar. primitive ( )
139+ {
140+ // ordinary SPIR-V value
141+ let in_value_precise_type = in_value. layout . spirv_type ( self . span ( ) , self ) ;
142+ * in_value_spv = self . pointercast ( * in_value_spv, in_value_precise_type) ;
143+ }
136144 }
137145 if let Some ( out_place) = out_place {
138146 let out_place_precise_type = out_place. layout . spirv_type ( self . span ( ) , self ) ;
0 commit comments