Skip to content

Commit 8eecf61

Browse files
committed
Separate tables for libm and num_traits overwrites
1 parent 180a6b0 commit 8eecf61

File tree

5 files changed

+24
-6
lines changed

5 files changed

+24
-6
lines changed

crates/rustc_codegen_spirv/src/builder/builder_methods.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3319,6 +3319,8 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
33193319

33203320
let libm_intrinsic =
33213321
instance_def_id.and_then(|def_id| self.libm_intrinsics.borrow().get(&def_id).copied());
3322+
let num_traits_intrinsics = instance_def_id
3323+
.and_then(|def_id| self.num_traits_intrinsics.borrow().get(&def_id).copied());
33223324
let buffer_load_intrinsic = instance_def_id
33233325
.is_some_and(|def_id| self.buffer_load_intrinsics.borrow().contains(&def_id));
33243326
let buffer_store_intrinsic = instance_def_id
@@ -3328,7 +3330,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
33283330
let from_trait_impl =
33293331
instance_def_id.and_then(|def_id| self.from_trait_impls.borrow().get(&def_id).copied());
33303332

3331-
if let Some(libm_intrinsic) = libm_intrinsic {
3333+
if let Some(libm_intrinsic) = libm_intrinsic.or(num_traits_intrinsics) {
33323334
let result = self.call_libm_intrinsic(libm_intrinsic, result_type, args);
33333335
if result_type != result.ty {
33343336
bug!(

crates/rustc_codegen_spirv/src/builder/libm_intrinsics.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub enum LibmIntrinsic {
4343
Custom(LibmCustomIntrinsic),
4444
}
4545

46-
pub const TABLE: &[(&str, LibmIntrinsic)] = &[
46+
pub const LIBM_TABLE: &[(&str, LibmIntrinsic)] = &[
4747
("acos", LibmIntrinsic::GLOp(GLOp::Acos)),
4848
("acosf", LibmIntrinsic::GLOp(GLOp::Acos)),
4949
("acosh", LibmIntrinsic::GLOp(GLOp::Acosh)),
@@ -158,7 +158,6 @@ pub const TABLE: &[(&str, LibmIntrinsic)] = &[
158158
),
159159
("pow", LibmIntrinsic::GLOp(GLOp::Pow)),
160160
("powf", LibmIntrinsic::GLOp(GLOp::Pow)),
161-
("powi", LibmIntrinsic::Custom(LibmCustomIntrinsic::Powi)),
162161
(
163162
"remainder",
164163
LibmIntrinsic::Custom(LibmCustomIntrinsic::Remainder),
@@ -200,6 +199,9 @@ pub const TABLE: &[(&str, LibmIntrinsic)] = &[
200199
("truncf", LibmIntrinsic::GLOp(GLOp::Trunc)),
201200
];
202201

202+
pub const NUM_TRAITS_TABLE: &[(&str, LibmIntrinsic)] =
203+
&[("powi", LibmIntrinsic::Custom(LibmCustomIntrinsic::Powi))];
204+
203205
impl Builder<'_, '_> {
204206
pub fn call_libm_intrinsic(
205207
&mut self,

crates/rustc_codegen_spirv/src/codegen_cx/declare.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,10 @@ impl<'tcx> CodegenCx<'tcx> {
169169
// Check for usage of `num_traits` intrinsics (like Float::powi) that we can optimize
170170
if self.tcx.crate_name(def_id.krate) == self.sym.num_traits && !def_id.is_local() {
171171
let item_name = self.tcx.item_name(def_id);
172-
if let Some(&intrinsic) = self.sym.libm_intrinsics.get(&item_name) {
173-
self.libm_intrinsics.borrow_mut().insert(def_id, intrinsic);
172+
if let Some(&intrinsic) = self.sym.num_traits_intrinsics.get(&item_name) {
173+
self.num_traits_intrinsics
174+
.borrow_mut()
175+
.insert(def_id, intrinsic);
174176
}
175177
}
176178

crates/rustc_codegen_spirv/src/codegen_cx/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ pub struct CodegenCx<'tcx> {
6666
// FIXME(eddyb) should the maps exist at all, now that the `DefId` is known
6767
// at `call` time, and presumably its high-level details can be looked up?
6868
pub libm_intrinsics: RefCell<FxHashMap<DefId, super::builder::libm_intrinsics::LibmIntrinsic>>,
69+
pub num_traits_intrinsics:
70+
RefCell<FxHashMap<DefId, super::builder::libm_intrinsics::LibmIntrinsic>>,
6971

7072
/// All `panic!(...)`s and builtin panics (from MIR `Assert`s) call into one
7173
/// of these lang items, which we always replace with an "abort".
@@ -202,6 +204,7 @@ impl<'tcx> CodegenCx<'tcx> {
202204
sym,
203205
instruction_table: InstructionTable::new(),
204206
libm_intrinsics: Default::default(),
207+
num_traits_intrinsics: Default::default(),
205208
panic_entry_points: Default::default(),
206209
fmt_args_new_fn_ids: Default::default(),
207210
fmt_rt_arg_new_fn_ids_to_ty_and_spec: Default::default(),

crates/rustc_codegen_spirv/src/symbols.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ pub struct Symbols {
3434
pub attributes: FxHashMap<Symbol, SpirvAttribute>,
3535
pub execution_modes: FxHashMap<Symbol, (ExecutionMode, ExecutionModeExtraDim)>,
3636
pub libm_intrinsics: FxHashMap<Symbol, libm_intrinsics::LibmIntrinsic>,
37+
pub num_traits_intrinsics: FxHashMap<Symbol, libm_intrinsics::LibmIntrinsic>,
3738
}
3839

3940
const BUILTINS: &[(&str, BuiltIn)] = {
@@ -406,10 +407,17 @@ impl Symbols {
406407
}
407408

408409
let mut libm_intrinsics = FxHashMap::default();
409-
for &(a, b) in libm_intrinsics::TABLE {
410+
for &(a, b) in libm_intrinsics::LIBM_TABLE {
410411
let old = libm_intrinsics.insert(Symbol::intern(a), b);
411412
assert!(old.is_none());
412413
}
414+
415+
let mut num_traits_intrinsics = FxHashMap::default();
416+
for &(a, b) in libm_intrinsics::NUM_TRAITS_TABLE {
417+
let old = num_traits_intrinsics.insert(Symbol::intern(a), b);
418+
assert!(old.is_none());
419+
}
420+
413421
Self {
414422
discriminant: Symbol::intern("discriminant"),
415423
rust_gpu: Symbol::intern("rust_gpu"),
@@ -433,6 +441,7 @@ impl Symbols {
433441
attributes,
434442
execution_modes,
435443
libm_intrinsics,
444+
num_traits_intrinsics,
436445
}
437446
}
438447

0 commit comments

Comments
 (0)