Skip to content

Commit 484f160

Browse files
committed
simplify: port LoadTupleItem constant-fold to C
simplify_load_tuple_item_c: if src is a known tuple object, fold item access to LoadConst. Uses hir_c_load_tuple_item_idx for index, hir_func_add_reference to register the item, hir_type_from_object for the result type.
1 parent 7d1b03f commit 484f160

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

Python/jit/hir/simplify.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2798,9 +2798,12 @@ Register* simplifyInstr(Env& env, const Instr* instr) {
27982798
sync_c_env(cenv);
27992799
return r;
28002800
}
2801-
case Opcode::kLoadTupleItem:
2802-
return simplifyLoadTupleItem(
2803-
env, static_cast<const LoadTupleItem*>(instr));
2801+
case Opcode::kLoadTupleItem: {
2802+
SimplifyEnv cenv = make_c_env();
2803+
auto *r = static_cast<Register*>(simplify_load_tuple_item_c(&cenv, instr));
2804+
sync_c_env(cenv);
2805+
return r;
2806+
}
28042807
case Opcode::kLoadArrayItem:
28052808
return simplifyLoadArrayItem(
28062809
env, static_cast<const LoadArrayItem*>(instr));

Python/jit/hir/simplify_c.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,24 @@ void *simplify_primitive_compare_box_true_c(const void *instr) {
212212
return hir_c_get_operand(left_def, 0);
213213
}
214214

215+
/* ---- simplifyLoadTupleItem ----
216+
* If src is a known tuple object, fold to the constant item. */
217+
void *simplify_load_tuple_item_c(SimplifyEnv *env, const void *instr) {
218+
void *src = hir_c_get_operand(instr, 0);
219+
HirType src_type = hir_register_type(src);
220+
HirType t_tuple = HIR_TYPE_TUPLE;
221+
if (!hir_type_has_value_spec(&src_type, t_tuple)) return NULL;
222+
223+
simplify_env_emit_use_type(env, src, src_type);
224+
PyObject *tuple_obj = hir_type_object_spec(&src_type);
225+
size_t idx = hir_c_load_tuple_item_idx(instr);
226+
PyObject *item = PyTuple_GET_ITEM(tuple_obj, idx);
227+
extern PyObject *hir_func_add_reference(void *func, PyObject *obj);
228+
PyObject *ref = hir_func_add_reference(env->func, item);
229+
HirType item_type = hir_type_from_object(ref);
230+
return simplify_env_emit_load_const(env, item_type);
231+
}
232+
215233
/* ---- simplifyLoadField (partial — known float object) ----
216234
* If loadee is a known float and we're loading ob_fval, fold to constant. */
217235
void *simplify_load_field_float_c(SimplifyEnv *env, const void *instr) {

Python/jit/hir/simplify_c.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void *simplify_guard_type_identity_c(const void *instr);
3232
void *simplify_primitive_compare_box_true_c(const void *instr);
3333
void *simplify_unbox_box_c(const void *instr);
3434
void *simplify_cond_branch_check_type_c(SimplifyEnv *env, const void *instr);
35+
void *simplify_load_tuple_item_c(SimplifyEnv *env, const void *instr);
3536
void *simplify_load_field_float_c(SimplifyEnv *env, const void *instr);
3637
void *simplify_int_convert_c(SimplifyEnv *env, const void *instr);
3738

0 commit comments

Comments
 (0)