summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-11-14 15:04:33 -0500
committerMax Bernstein <tekknolagi@gmail.com>2025-11-14 12:41:05 -0800
commit22d2bb0132cc6ea28ba42f2fd7006409f76b12b9 (patch)
tree5ab560a23834a5fb2b0d277aae40107f896647a9
parent35c2c656da9dc6a023d14a697f2ab4e354785da5 (diff)
ZJIT: Move special Fixnum BOP_AND into cruby_methods
-rw-r--r--zjit/src/cruby_methods.rs6
-rw-r--r--zjit/src/hir.rs2
-rw-r--r--zjit/src/hir/opt_tests.rs11
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
");
}