summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-11-14 14:53:22 -0500
committerMax Bernstein <tekknolagi@gmail.com>2025-11-14 12:41:05 -0800
commitf0e57720e45dc0ad2c06cf7b1ff02f683f3ccaaa (patch)
treebddcf6d5dd6f58a00f6a7756a631af52eab88e59
parent7a7035eeadef7eb5c11c80e40f6bbd2e87c029e4 (diff)
ZJIT: Move special Fixnum BOP_MULT 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.rs34
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