summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-11-24 22:18:43 -0500
committerMax Bernstein <tekknolagi@gmail.com>2025-12-01 15:19:26 -0800
commitfd7d17abde4943edaefac7840f7258c8283d1d8e (patch)
treeed3fe67c8769296c54d21ef87eea804905f09c97
parent8ce78821cd8713d149ff27d9fbed38799e983349 (diff)
ZJIT: Don't use GuardTypeNot
Use actual receiver type. This gives us better method lookup.
-rw-r--r--zjit/src/hir.rs4
-rw-r--r--zjit/src/hir/opt_tests.rs11
2 files changed, 7 insertions, 8 deletions
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs
index e5c1f7a542..bab6d1c841 100644
--- a/zjit/src/hir.rs
+++ b/zjit/src/hir.rs
@@ -2677,8 +2677,8 @@ impl Function {
self.insn_types[guard.0] = self.infer_type(guard);
self.make_equal_to(insn_id, guard);
} else {
- self.push_insn(block, Insn::GuardTypeNot { val, guard_type: types::String, state});
- let send_to_s = self.push_insn(block, Insn::SendWithoutBlock { recv: val, cd, args: vec![], state, reason: ObjToStringNotString });
+ let recv = self.push_insn(block, Insn::GuardType { val, guard_type: Type::from_profiled_type(recv_type), state});
+ let send_to_s = self.push_insn(block, Insn::SendWithoutBlock { recv, cd, args: vec![], state, reason: ObjToStringNotString });
self.make_equal_to(insn_id, send_to_s);
}
}
diff --git a/zjit/src/hir/opt_tests.rs b/zjit/src/hir/opt_tests.rs
index 4faaa402d8..029b3735f5 100644
--- a/zjit/src/hir/opt_tests.rs
+++ b/zjit/src/hir/opt_tests.rs
@@ -4137,12 +4137,11 @@ mod hir_opt_tests {
Jump bb2(v5, v6)
bb2(v8:BasicObject, v9:BasicObject):
v13:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000))
- v26:BasicObject = GuardTypeNot v9, String
+ v26:ArrayExact = GuardType v9, ArrayExact
PatchPoint MethodRedefined(Array@0x1008, to_s@0x1010, cme:0x1018)
PatchPoint NoSingletonClass(Array@0x1008)
- v31:ArrayExact = GuardType v9, ArrayExact
- v32:BasicObject = CCallWithFrame v31, :Array#to_s@0x1040
- v19:String = AnyToString v9, str: v32
+ v31:BasicObject = CCallWithFrame v26, :Array#to_s@0x1040
+ v19:String = AnyToString v9, str: v31
v21:StringExact = StringConcat v13, v19
CheckInterrupts
Return v21
@@ -5919,7 +5918,7 @@ mod hir_opt_tests {
bb2(v8:BasicObject, v9:BasicObject):
PatchPoint MethodRedefined(Integer@0x1000, to_s@0x1008, cme:0x1010)
v21:Fixnum = GuardType v9, Fixnum
- v22:StringExact = CCallVariadic Integer#to_s@0x1038, v21
+ v22:StringExact = CCallVariadic v21, :Integer#to_s@0x1038
CheckInterrupts
Return v22
");
@@ -5944,7 +5943,7 @@ mod hir_opt_tests {
bb2(v8:BasicObject, v9:BasicObject):
PatchPoint MethodRedefined(Integer@0x1000, to_s@0x1008, cme:0x1010)
v21:Integer = GuardType v9, Integer
- v22:StringExact = CCallVariadic Integer#to_s@0x1038, v21
+ v22:StringExact = CCallVariadic v21, :Integer#to_s@0x1038
CheckInterrupts
Return v22
");