diff --git a/cranelift/codegen/src/ir/instructions.rs b/cranelift/codegen/src/ir/instructions.rs index 6354b92580..f835bd5f4a 100644 --- a/cranelift/codegen/src/ir/instructions.rs +++ b/cranelift/codegen/src/ir/instructions.rs @@ -59,6 +59,14 @@ impl Opcode { pub fn constraints(self) -> OpcodeConstraints { OPCODE_CONSTRAINTS[self as usize - 1] } + + /// Returns true if the instruction is a resumable trap. + pub fn is_resumable_trap(&self) -> bool { + match self { + Opcode::ResumableTrap | Opcode::ResumableTrapnz => true, + _ => false, + } + } } // This trait really belongs in cranelift-reader where it is used by the `.clif` file parser, but since diff --git a/cranelift/codegen/src/regalloc/safepoint.rs b/cranelift/codegen/src/regalloc/safepoint.rs index 128900d360..0700735611 100644 --- a/cranelift/codegen/src/regalloc/safepoint.rs +++ b/cranelift/codegen/src/regalloc/safepoint.rs @@ -1,6 +1,6 @@ use crate::cursor::{Cursor, FuncCursor}; use crate::dominator_tree::DominatorTree; -use crate::ir::{Function, InstBuilder, InstructionData, Opcode, TrapCode}; +use crate::ir::{Function, InstBuilder, Opcode}; use crate::isa::TargetIsa; use crate::regalloc::live_value_tracker::LiveValueTracker; use crate::regalloc::liveness::Liveness; @@ -51,11 +51,7 @@ pub fn emit_stackmaps( pos.goto_top(block); while let Some(inst) = pos.next_inst() { - if let InstructionData::Trap { - code: TrapCode::Interrupt, - .. - } = &pos.func.dfg[inst] - { + if pos.func.dfg[inst].opcode().is_resumable_trap() { insert_and_encode_safepoint(&mut pos, tracker, isa); } else if pos.func.dfg[inst].opcode().is_call() { insert_and_encode_safepoint(&mut pos, tracker, isa);