summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-11-14 14:54:40 -0500
committerMax Bernstein <tekknolagi@gmail.com>2025-11-14 12:41:05 -0800
commit0851c2aa6609aa53bcd038362699ff7fc7fdd2ff (patch)
tree598aaea39328702d65569e894c1f23e84f7611ee
parentf0e57720e45dc0ad2c06cf7b1ff02f683f3ccaaa (diff)
ZJIT: Move special Fixnum BOP_DIV 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.rs9
3 files changed, 11 insertions, 6 deletions
diff --git a/zjit/src/cruby_methods.rs b/zjit/src/cruby_methods.rs
index a94ed9a642..cab439face 100644
--- a/zjit/src/cruby_methods.rs
+++ b/zjit/src/cruby_methods.rs
@@ -230,6 +230,7 @@ pub fn init() -> Annotations {
annotate!(rb_cInteger, "+", inline_integer_plus);
annotate!(rb_cInteger, "-", inline_integer_minus);
annotate!(rb_cInteger, "*", inline_integer_mult);
+ annotate!(rb_cInteger, "/", inline_integer_div);
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) };
@@ -463,6 +464,11 @@ fn inline_integer_mult(fun: &mut hir::Function, block: hir::BlockId, recv: hir::
try_inline_fixnum_op(fun, block, &|left, right| hir::Insn::FixnumMult { left, right, state }, BOP_MULT, recv, other, state)
}
+fn inline_integer_div(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::FixnumDiv { left, right, state }, BOP_DIV, 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 8945065645..a41aed3b89 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!(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 =>
self.try_rewrite_fixnum_op(block, insn_id, &|left, right| Insn::FixnumMod { left, right, state }, BOP_MOD, recv, args[0], state),
Insn::SendWithoutBlock { recv, args, state, cd, .. } if ruby_call_method_id(cd) == ID!(lt) && args.len() == 1 =>
diff --git a/zjit/src/hir/opt_tests.rs b/zjit/src/hir/opt_tests.rs
index 23c9c40b87..faec1452b3 100644
--- a/zjit/src/hir/opt_tests.rs
+++ b/zjit/src/hir/opt_tests.rs
@@ -1788,10 +1788,11 @@ 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_DIV)
- v29:Fixnum = GuardType v11, Fixnum
- v30:Fixnum = GuardType v12, Fixnum
- v31:Fixnum = FixnumDiv v29, v30
+ PatchPoint MethodRedefined(Integer@0x1000, /@0x1008, cme:0x1010)
+ v30:Fixnum = GuardType v11, Fixnum
+ v31:Fixnum = GuardType v12, Fixnum
+ v32:Fixnum = FixnumDiv v30, v31
+ IncrCounter inline_cfunc_optimized_send_count
v23:Fixnum[5] = Const Value(5)
CheckInterrupts
Return v23