Skip to content

Commit ab3eb80

Browse files
committed
simplify: port CondBranchCheckType + add CompareOp static_asserts
CondBranchCheckType fully ported to C — all paths covered (type matches → Branch true, type impossible → Branch false, else NULL). No C++ fallback needed. Added 15 static_asserts in hir_instr_c_verify.cpp verifying HIR_CMP_* and HIR_PCMP_* C constants match C++ CompareOp and PrimitiveCompareOp enums at compile time.
1 parent a7f7aaf commit ab3eb80

File tree

4 files changed

+47
-3
lines changed

4 files changed

+47
-3
lines changed

Python/jit/hir/hir_instr_c_verify.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,22 @@ struct HirInstrLayoutVerifier {
241241
"Send frame_state_ layout mismatch — reversed mixin order?");
242242
};
243243

244+
/* ---- CompareOp / PrimitiveCompareOp enum value verification ---- */
245+
static_assert(static_cast<int>(CompareOp::kLessThan) == HIR_CMP_LessThan, "CompareOp mismatch");
246+
static_assert(static_cast<int>(CompareOp::kEqual) == HIR_CMP_Equal, "CompareOp mismatch");
247+
static_assert(static_cast<int>(CompareOp::kNotEqual) == HIR_CMP_NotEqual, "CompareOp mismatch");
248+
static_assert(static_cast<int>(CompareOp::kIn) == HIR_CMP_In, "CompareOp mismatch");
249+
static_assert(static_cast<int>(CompareOp::kNotIn) == HIR_CMP_NotIn, "CompareOp mismatch");
250+
static_assert(static_cast<int>(CompareOp::kExcMatch) == HIR_CMP_ExcMatch, "CompareOp mismatch");
251+
static_assert(static_cast<int>(CompareOp::kGreaterThanUnsigned) == HIR_CMP_GreaterThanUnsigned, "CompareOp mismatch");
252+
static_assert(static_cast<int>(CompareOp::kLessThanEqualUnsigned) == HIR_CMP_LessThanEqualUnsigned, "CompareOp mismatch");
253+
254+
static_assert(static_cast<int>(PrimitiveCompareOp::kEqual) == HIR_PCMP_Equal, "PrimitiveCompareOp mismatch");
255+
static_assert(static_cast<int>(PrimitiveCompareOp::kNotEqual) == HIR_PCMP_NotEqual, "PrimitiveCompareOp mismatch");
256+
static_assert(static_cast<int>(PrimitiveCompareOp::kLessThan) == HIR_PCMP_LessThan, "PrimitiveCompareOp mismatch");
257+
static_assert(static_cast<int>(PrimitiveCompareOp::kGreaterThanUnsigned) == HIR_PCMP_GreaterThanUnsigned, "PrimitiveCompareOp mismatch");
258+
static_assert(static_cast<int>(PrimitiveCompareOp::kLessThanEqualUnsigned) == HIR_PCMP_LessThanEqualUnsigned, "PrimitiveCompareOp mismatch");
259+
244260
/* ---- Runtime read-through-cast verification ----
245261
* Creates C++ HIR objects, casts to C structs, reads via C accessors.
246262
* Validates that layout compatibility translates to correct field reads. */

Python/jit/hir/simplify.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2761,9 +2761,12 @@ Register* simplifyInstr(Env& env, const Instr* instr) {
27612761
if (r) return r;
27622762
return simplifyCondBranch(env, instr);
27632763
}
2764-
case Opcode::kCondBranchCheckType:
2765-
return simplifyCondBranchCheckType(
2766-
env, static_cast<const CondBranchCheckType*>(instr));
2764+
case Opcode::kCondBranchCheckType: {
2765+
SimplifyEnv cenv = make_c_env();
2766+
auto *r = static_cast<Register*>(simplify_cond_branch_check_type_c(&cenv, instr));
2767+
sync_c_env(cenv);
2768+
return r;
2769+
}
27672770

27682771
case Opcode::kGetLength:
27692772
return simplifyGetLength(env, instr);

Python/jit/hir/simplify_c.c

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

215+
/* ---- simplifyCondBranchCheckType ----
216+
* If value type is subtype of expected → Branch to true_bb.
217+
* If value type can't be expected → Branch to false_bb. */
218+
void *simplify_cond_branch_check_type_c(SimplifyEnv *env, const void *instr) {
219+
void *value = hir_c_get_operand(instr, 0);
220+
HirType actual_type = hir_register_type(value);
221+
const HirCondBranchCheckType *cbct = (const HirCondBranchCheckType *)instr;
222+
HirType expected_type = cbct->type;
223+
224+
if (hir_type_is_subtype(actual_type, expected_type)) {
225+
simplify_env_emit_use_type(env, value, actual_type);
226+
extern void *hir_c_create_branch_cpp(void *target_block);
227+
void *branch = hir_c_create_branch_cpp(cbct->true_edge.to);
228+
return simplify_env_emit(env, branch);
229+
}
230+
if (!hir_type_could_be(&actual_type, &expected_type)) {
231+
simplify_env_emit_use_type(env, value, actual_type);
232+
extern void *hir_c_create_branch_cpp(void *target_block);
233+
void *branch = hir_c_create_branch_cpp(cbct->false_edge.to);
234+
return simplify_env_emit(env, branch);
235+
}
236+
return NULL;
237+
}
238+
215239
/* ---- simplifyUnbox (partial — unbox(box(x)) → x) ---- */
216240
void *simplify_unbox_box_c(const void *instr) {
217241
void *input = hir_c_get_operand(instr, 0);

Python/jit/hir/simplify_c.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ void *simplify_refine_type_c(const void *instr);
3131
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);
34+
void *simplify_cond_branch_check_type_c(SimplifyEnv *env, const void *instr);
3435
void *simplify_int_convert_c(SimplifyEnv *env, const void *instr);
3536

3637
/* Env-using handlers (Category 2) */

0 commit comments

Comments
 (0)