diff options
| author | Max Bernstein <ruby@bernsteinbear.com> | 2025-11-14 15:04:33 -0500 |
|---|---|---|
| committer | Max Bernstein <tekknolagi@gmail.com> | 2025-11-14 12:41:05 -0800 |
| commit | 22d2bb0132cc6ea28ba42f2fd7006409f76b12b9 (patch) | |
| tree | 5ab560a23834a5fb2b0d277aae40107f896647a9 | |
| parent | 35c2c656da9dc6a023d14a697f2ab4e354785da5 (diff) | |
ZJIT: Move special Fixnum BOP_AND 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 | 11 |
3 files changed, 12 insertions, 7 deletions
diff --git a/zjit/src/cruby_methods.rs b/zjit/src/cruby_methods.rs index 5696e6c4d5..aa5d1b25ec 100644 --- a/zjit/src/cruby_methods.rs +++ b/zjit/src/cruby_methods.rs @@ -232,6 +232,7 @@ pub fn init() -> Annotations { annotate!(rb_cInteger, "*", inline_integer_mult); annotate!(rb_cInteger, "/", inline_integer_div); annotate!(rb_cInteger, "%", inline_integer_mod); + annotate!(rb_cInteger, "&", inline_integer_and); annotate!(rb_cInteger, ">", inline_integer_gt); annotate!(rb_cInteger, ">=", inline_integer_ge); annotate!(rb_cInteger, "<", inline_integer_lt); @@ -478,6 +479,11 @@ fn inline_integer_mod(fun: &mut hir::Function, block: hir::BlockId, recv: hir::I try_inline_fixnum_op(fun, block, &|left, right| hir::Insn::FixnumMod { left, right, state }, BOP_MOD, recv, other, state) } +fn inline_integer_and(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::FixnumAnd { left, right, }, BOP_AND, 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 4b329ab374..143762414a 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!(and) && args.len() == 1 => - self.try_rewrite_fixnum_op(block, insn_id, &|left, right| Insn::FixnumAnd { left, right }, BOP_AND, recv, args[0], state), Insn::SendWithoutBlock { recv, args, state, cd, .. } if ruby_call_method_id(cd) == ID!(or) && args.len() == 1 => self.try_rewrite_fixnum_op(block, insn_id, &|left, right| Insn::FixnumOr { left, right }, BOP_OR, recv, args[0], state), Insn::SendWithoutBlock { recv, args, state, cd, .. } if ruby_call_method_id(cd) == ID!(freeze) && args.is_empty() => diff --git a/zjit/src/hir/opt_tests.rs b/zjit/src/hir/opt_tests.rs index 8c0e246f44..d518b0dc47 100644 --- a/zjit/src/hir/opt_tests.rs +++ b/zjit/src/hir/opt_tests.rs @@ -4606,12 +4606,13 @@ 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, 28) - v25:Fixnum = GuardType v11, Fixnum - v26:Fixnum = GuardType v12, Fixnum - v27:Fixnum = FixnumAnd v25, v26 + PatchPoint MethodRedefined(Integer@0x1000, &@0x1008, cme:0x1010) + v26:Fixnum = GuardType v11, Fixnum + v27:Fixnum = GuardType v12, Fixnum + v28:Fixnum = FixnumAnd v26, v27 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v27 + Return v28 "); } |
