diff options
| author | Max Bernstein <ruby@bernsteinbear.com> | 2025-11-14 14:53:22 -0500 |
|---|---|---|
| committer | Max Bernstein <tekknolagi@gmail.com> | 2025-11-14 12:41:05 -0800 |
| commit | f0e57720e45dc0ad2c06cf7b1ff02f683f3ccaaa (patch) | |
| tree | bddcf6d5dd6f58a00f6a7756a631af52eab88e59 | |
| parent | 7a7035eeadef7eb5c11c80e40f6bbd2e87c029e4 (diff) | |
ZJIT: Move special Fixnum BOP_MULT into cruby_methods
| -rw-r--r-- | zjit/src/cruby_methods.rs | 6 | ||||
| -rw-r--r-- | zjit/src/hir.rs | 2 | ||||
| -rw-r--r-- | zjit/src/hir/opt_tests.rs | 34 |
3 files changed, 25 insertions, 17 deletions
diff --git a/zjit/src/cruby_methods.rs b/zjit/src/cruby_methods.rs index 806baeb90a..a94ed9a642 100644 --- a/zjit/src/cruby_methods.rs +++ b/zjit/src/cruby_methods.rs @@ -229,6 +229,7 @@ pub fn init() -> Annotations { annotate!(rb_cInteger, "==", inline_integer_eq); annotate!(rb_cInteger, "+", inline_integer_plus); annotate!(rb_cInteger, "-", inline_integer_minus); + annotate!(rb_cInteger, "*", inline_integer_mult); annotate!(rb_cInteger, ">", inline_integer_gt); annotate!(rb_cString, "to_s", inline_string_to_s, types::StringExact); let thread_singleton = unsafe { rb_singleton_class(rb_cThread) }; @@ -457,6 +458,11 @@ fn inline_integer_minus(fun: &mut hir::Function, block: hir::BlockId, recv: hir: try_inline_fixnum_op(fun, block, &|left, right| hir::Insn::FixnumSub { left, right, state }, BOP_MINUS, recv, other, state) } +fn inline_integer_mult(fun: &mut hir::Function, block: hir::BlockId, recv: hir::InsnId, args: &[hir::InsnId], state: hir::InsnId) -> Option<hir::InsnId> { + let &[other] = args else { return None; }; + try_inline_fixnum_op(fun, block, &|left, right| hir::Insn::FixnumMult { left, right, state }, BOP_MULT, recv, other, state) +} + fn inline_integer_gt(fun: &mut hir::Function, block: hir::BlockId, recv: hir::InsnId, args: &[hir::InsnId], state: hir::InsnId) -> Option<hir::InsnId> { let &[other] = args else { return None; }; try_inline_fixnum_op(fun, block, &|left, right| hir::Insn::FixnumGt { left, right }, BOP_GT, recv, other, state) diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index 9039d9e150..8945065645 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -2319,8 +2319,6 @@ impl Function { assert!(self.blocks[block.0].insns.is_empty()); for insn_id in old_insns { match self.find(insn_id) { - Insn::SendWithoutBlock { recv, args, state, cd, .. } if ruby_call_method_id(cd) == ID!(mult) && args.len() == 1 => - self.try_rewrite_fixnum_op(block, insn_id, &|left, right| Insn::FixnumMult { left, right, state }, BOP_MULT, recv, args[0], state), Insn::SendWithoutBlock { recv, args, state, cd, .. } if ruby_call_method_id(cd) == ID!(div) && args.len() == 1 => self.try_rewrite_fixnum_op(block, insn_id, &|left, right| Insn::FixnumDiv { left, right, state }, BOP_DIV, recv, args[0], state), Insn::SendWithoutBlock { recv, args, state, cd, .. } if ruby_call_method_id(cd) == ID!(modulo) && args.len() == 1 => diff --git a/zjit/src/hir/opt_tests.rs b/zjit/src/hir/opt_tests.rs index 19e9e2a4f1..23c9c40b87 100644 --- a/zjit/src/hir/opt_tests.rs +++ b/zjit/src/hir/opt_tests.rs @@ -198,10 +198,11 @@ mod hir_opt_tests { bb2(v6:BasicObject): v10:Fixnum[6] = Const Value(6) v12:Fixnum[7] = Const Value(7) - PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v22:Fixnum[42] = Const Value(42) + PatchPoint MethodRedefined(Integer@0x1000, *@0x1008, cme:0x1010) + v24:Fixnum[42] = Const Value(42) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v22 + Return v24 "); } @@ -225,18 +226,20 @@ mod hir_opt_tests { Jump bb2(v5, v6) bb2(v8:BasicObject, v9:BasicObject): v13:Fixnum[0] = Const Value(0) - PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v32:Fixnum = GuardType v9, Fixnum - v41:Fixnum[0] = Const Value(0) + PatchPoint MethodRedefined(Integer@0x1000, *@0x1008, cme:0x1010) + v33:Fixnum = GuardType v9, Fixnum + v45:Fixnum[0] = Const Value(0) + IncrCounter inline_cfunc_optimized_send_count v20:Fixnum[0] = Const Value(0) - PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v35:Fixnum = GuardType v9, Fixnum - v42:Fixnum[0] = Const Value(0) - PatchPoint MethodRedefined(Integer@0x1000, +@0x1008, cme:0x1010) - v43:Fixnum[0] = Const Value(0) + PatchPoint MethodRedefined(Integer@0x1000, *@0x1008, cme:0x1010) + v38:Fixnum = GuardType v9, Fixnum + v46:Fixnum[0] = Const Value(0) + IncrCounter inline_cfunc_optimized_send_count + PatchPoint MethodRedefined(Integer@0x1000, +@0x1038, cme:0x1040) + v47:Fixnum[0] = Const Value(0) IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v43 + Return v47 "); } @@ -1754,9 +1757,10 @@ mod hir_opt_tests { EntryPoint JIT(0) Jump bb2(v6, v7, v8) bb2(v10:BasicObject, v11:BasicObject, v12:BasicObject): - PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v29:Fixnum = GuardType v11, Fixnum - v30:Fixnum = GuardType v12, Fixnum + PatchPoint MethodRedefined(Integer@0x1000, *@0x1008, cme:0x1010) + v30:Fixnum = GuardType v11, Fixnum + v31:Fixnum = GuardType v12, Fixnum + IncrCounter inline_cfunc_optimized_send_count v23:Fixnum[5] = Const Value(5) CheckInterrupts Return v23 |
