Skip to content

Commit f02c5d8

Browse files
committed
simplify: port StoreSubscr dict optimization to C (Category a)
First emit-dependent handler using emitCallStaticInstr pattern. If target is DictExact, calls PyDict mp_ass_subscript directly + emits CheckNeg with DeoptBase frame_state. Uses HIR_TYPE_DICTEXACT named constant. Adds simplify_env_emit_call_static_instr and simplify_env_emit_check_neg helpers.
1 parent da2d057 commit f02c5d8

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

Python/jit/hir/simplify.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2876,8 +2876,12 @@ Register* simplifyInstr(Env& env, const Instr* instr) {
28762876
case Opcode::kVectorCall:
28772877
return simplifyVectorCall(env, static_cast<const VectorCall*>(instr));
28782878

2879-
case Opcode::kStoreSubscr:
2880-
return simplifyStoreSubscr(env, instr);
2879+
case Opcode::kStoreSubscr: {
2880+
SimplifyEnv cenv = make_c_env();
2881+
auto *r = static_cast<Register*>(simplify_store_subscr_c(&cenv, instr));
2882+
sync_c_env(cenv);
2883+
return r;
2884+
}
28812885

28822886
case Opcode::kCIntToCBool: {
28832887
SimplifyEnv cenv = make_c_env();

Python/jit/hir/simplify_c.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,43 @@ void *simplify_env_emit_primitive_box_bool(SimplifyEnv *env, void *src) {
121121
return simplify_env_emit(env, instr);
122122
}
123123

124+
/* Returns the INSTRUCTION (not output reg) so caller can set operands */
125+
void *simplify_env_emit_call_static_instr(SimplifyEnv *env, size_t n_operands,
126+
void *addr, HirType ret_type) {
127+
void *reg = hir_func_alloc_register(env->func);
128+
extern void *hir_c_create_call_static_reg(size_t n, void *dst, void *addr, HirType ret);
129+
void *instr = hir_c_create_call_static_reg(n_operands, reg, addr, ret_type);
130+
simplify_env_emit(env, instr);
131+
return instr;
132+
}
133+
134+
void *simplify_env_emit_check_neg(SimplifyEnv *env, void *src, void *frame_state) {
135+
extern void *hir_c_create_check_neg(void *func, void *src, void *fs);
136+
void *instr = hir_c_create_check_neg(env->func, src, frame_state);
137+
return simplify_env_emit(env, instr);
138+
}
139+
140+
/* ---- simplifyStoreSubscr ----
141+
* If target is DictExact, call mp_ass_subscript directly + check_neg. */
142+
void *simplify_store_subscr_c(SimplifyEnv *env, const void *instr) {
143+
void *target = hir_c_get_operand(instr, 0);
144+
HirType target_type = hir_register_type(target);
145+
HirType t_dict_exact = HIR_TYPE_DICTEXACT;
146+
147+
if (!hir_type_is_subtype(target_type, t_dict_exact)) return NULL;
148+
149+
void *addr = (void *)PyDict_Type.tp_as_mapping->mp_ass_subscript;
150+
HirType t_cint32 = HIR_TYPE_CINT32;
151+
void *call = simplify_env_emit_call_static_instr(env, 3, addr, t_cint32);
152+
hir_c_set_operand(call, 0, hir_c_get_operand(instr, 0));
153+
hir_c_set_operand(call, 1, hir_c_get_operand(instr, 1));
154+
hir_c_set_operand(call, 2, hir_c_get_operand(instr, 2));
155+
156+
void *fs = hir_c_get_frame_state(instr);
157+
simplify_env_emit_check_neg(env, hir_c_output(call), fs);
158+
return NULL;
159+
}
160+
124161
/* Helper: create HirType with int specialization */
125162
static HirType make_int_spec_type(HirType base, intptr_t val) {
126163
base.bits_and_flags |= ((uint64_t)HIR_SPEC_INT << HIR_TYPE_SPEC_SHIFT);

Python/jit/hir/simplify_c.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ void *simplify_cint_to_cbool_c(SimplifyEnv *env, const void *instr);
4545
void *simplify_cond_branch_const_c(SimplifyEnv *env, const void *instr);
4646
void *simplify_compare_c(SimplifyEnv *env, const void *instr);
4747
void *simplify_is_neg_and_err_c(SimplifyEnv *env, const void *instr);
48+
void *simplify_store_subscr_c(SimplifyEnv *env, const void *instr);
4849
void *simplify_load_var_object_size_c(SimplifyEnv *env, const void *instr);
4950

5051
#ifdef __cplusplus

0 commit comments

Comments
 (0)