From: Mark Shannon Date: Wed, 6 Mar 2024 10:46:42 +0000 (+0000) Subject: GH-115687: Most comparisons create Booleans, so propagate that information (GH-116360) X-Git-Tag: v3.13.0a5~87 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=33c0aa3bb9b334593e27fe4b2b0fe912117a1ee1;p=thirdparty%2FPython%2Fcpython.git GH-115687: Most comparisons create Booleans, so propagate that information (GH-116360) Most comparisons create booleans --- diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index ee67a2b075b0..07a1adb8cb8a 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -351,6 +351,35 @@ dummy_func(void) { } } + op(_COMPARE_OP, (left, right -- res)) { + if (oparg & 16) { + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + } + else { + OUT_OF_SPACE_IF_NULL(res = _Py_uop_sym_new_not_null(ctx)); + } + } + + op(_COMPARE_OP_INT, (left, right -- res)) { + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + } + + op(_COMPARE_OP_FLOAT, (left, right -- res)) { + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + } + + op(_COMPARE_OP_STR, (left, right -- res)) { + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + } + + op(_IS_OP, (left, right -- res)) { + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + } + + op(_CONTAINS_OP, (left, right -- res)) { + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + } + op(_LOAD_CONST, (-- value)) { // There should be no LOAD_CONST. It should be all // replaced by peephole_opt. diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 4ed1ac90c1e4..32dfca9c2271 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1130,55 +1130,78 @@ } case _COMPARE_OP: { + _Py_UopsSymbol *right; + _Py_UopsSymbol *left; _Py_UopsSymbol *res; - res = sym_new_unknown(ctx); - if (res == NULL) goto out_of_space; + right = stack_pointer[-1]; + left = stack_pointer[-2]; + if (oparg & 16) { + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + } + else { + OUT_OF_SPACE_IF_NULL(res = _Py_uop_sym_new_not_null(ctx)); + } stack_pointer[-2] = res; stack_pointer += -1; break; } case _COMPARE_OP_FLOAT: { + _Py_UopsSymbol *right; + _Py_UopsSymbol *left; _Py_UopsSymbol *res; - res = sym_new_unknown(ctx); - if (res == NULL) goto out_of_space; + right = stack_pointer[-1]; + left = stack_pointer[-2]; + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); stack_pointer[-2] = res; stack_pointer += -1; break; } case _COMPARE_OP_INT: { + _Py_UopsSymbol *right; + _Py_UopsSymbol *left; _Py_UopsSymbol *res; - res = sym_new_unknown(ctx); - if (res == NULL) goto out_of_space; + right = stack_pointer[-1]; + left = stack_pointer[-2]; + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); stack_pointer[-2] = res; stack_pointer += -1; break; } case _COMPARE_OP_STR: { + _Py_UopsSymbol *right; + _Py_UopsSymbol *left; _Py_UopsSymbol *res; - res = sym_new_unknown(ctx); - if (res == NULL) goto out_of_space; + right = stack_pointer[-1]; + left = stack_pointer[-2]; + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); stack_pointer[-2] = res; stack_pointer += -1; break; } case _IS_OP: { - _Py_UopsSymbol *b; - b = sym_new_unknown(ctx); - if (b == NULL) goto out_of_space; - stack_pointer[-2] = b; + _Py_UopsSymbol *right; + _Py_UopsSymbol *left; + _Py_UopsSymbol *res; + right = stack_pointer[-1]; + left = stack_pointer[-2]; + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + stack_pointer[-2] = res; stack_pointer += -1; break; } case _CONTAINS_OP: { - _Py_UopsSymbol *b; - b = sym_new_unknown(ctx); - if (b == NULL) goto out_of_space; - stack_pointer[-2] = b; + _Py_UopsSymbol *right; + _Py_UopsSymbol *left; + _Py_UopsSymbol *res; + right = stack_pointer[-1]; + left = stack_pointer[-2]; + OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type)); + stack_pointer[-2] = res; stack_pointer += -1; break; }