From 5af47dc4cd33f04ed4b5fbf4ea36d5df559d2773 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 7 Aug 2020 11:50:05 -0700 Subject: [PATCH] cranelift: Only emit stack maps when a function actually uses reference types This fix avoids a small slow down in scenarios where reference types are enabled but a given function doesn't actually use them. Fixes #1883 --- cranelift/codegen/src/regalloc/context.rs | 27 ++++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/cranelift/codegen/src/regalloc/context.rs b/cranelift/codegen/src/regalloc/context.rs index 8aa1003d42..505b1d127a 100644 --- a/cranelift/codegen/src/regalloc/context.rs +++ b/cranelift/codegen/src/regalloc/context.rs @@ -203,17 +203,22 @@ impl Context { &mut self.tracker, ); - // This function runs after register allocation has taken - // place, meaning values have locations assigned already. - if isa.flags().enable_safepoints() { - emit_stack_maps(func, domtree, &self.liveness, &mut self.tracker, isa); - } else { - // Make sure no references are used. - for val in func.dfg.values() { - let ty = func.dfg.value_type(val); - if ty.lane_type().is_ref() { - panic!("reference types were found but safepoints were not enabled."); - } + // If there are any reference types used, encode safepoints and emit + // stack maps. + // + // This function runs after register allocation has taken place, meaning + // values have locations assigned already, which is necessary for + // creating the stack maps. + let safepoints_enabled = isa.flags().enable_safepoints(); + for val in func.dfg.values() { + let ty = func.dfg.value_type(val); + if ty.lane_type().is_ref() { + assert!( + safepoints_enabled, + "reference types were found but safepoints were not enabled" + ); + emit_stack_maps(func, domtree, &self.liveness, &mut self.tracker, isa); + break; } }