diff options
author | Mark Shannon <mark@hotpy.org> | 2024-03-20 18:24:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-20 18:24:02 (GMT) |
commit | 63289b9dfbc7d87e81f1517422ee91b6b6d19531 (patch) | |
tree | 4b68c10a90ddcc4fcc798a586a831d710b6d9aab | |
parent | dcaf33a41d5d220523d71c9b35bc08f5b8405dac (diff) | |
download | cpython-63289b9dfbc7d87e81f1517422ee91b6b6d19531.zip cpython-63289b9dfbc7d87e81f1517422ee91b6b6d19531.tar.gz cpython-63289b9dfbc7d87e81f1517422ee91b6b6d19531.tar.bz2 |
GH-117066: Tier 2 optimizer: Don't throw away good traces if we can't optimize them perfectly. (GH-117067)
-rw-r--r-- | Python/optimizer_analysis.c | 16 | ||||
-rw-r--r-- | Python/optimizer_bytecodes.c | 4 | ||||
-rw-r--r-- | Python/optimizer_cases.c.h | 4 |
3 files changed, 16 insertions, 8 deletions
diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c index 0c95616..603ac68 100644 --- a/Python/optimizer_analysis.c +++ b/Python/optimizer_analysis.c @@ -406,24 +406,28 @@ optimize_uops( out_of_space: DPRINTF(3, "\n"); DPRINTF(1, "Out of space in abstract interpreter\n"); - _Py_uop_abstractcontext_fini(ctx); - return 0; - + goto done; error: DPRINTF(3, "\n"); DPRINTF(1, "Encountered error in abstract interpreter\n"); _Py_uop_abstractcontext_fini(ctx); - return 0; + return -1; hit_bottom: // Attempted to push a "bottom" (contradition) symbol onto the stack. // This means that the abstract interpreter has hit unreachable code. - // We *could* generate an _EXIT_TRACE or _FATAL_ERROR here, but it's - // simpler to just admit failure and not create the executor. + // We *could* generate an _EXIT_TRACE or _FATAL_ERROR here, but hitting + // bottom indicates type instability, so we are probably better off + // retrying later. DPRINTF(3, "\n"); DPRINTF(1, "Hit bottom in abstract interpreter\n"); _Py_uop_abstractcontext_fini(ctx); return 0; +done: + /* Cannot optimize further, but there would be no benefit + * in retrying later */ + _Py_uop_abstractcontext_fini(ctx); + return 1; } diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index ef08c0d..a1ef644 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -546,7 +546,9 @@ dummy_func(void) { PyFunctionObject *func = (PyFunctionObject *)(this_instr + 2)->operand; DPRINTF(3, "func: %p ", func); if (func == NULL) { - goto error; + DPRINTF(3, "\n"); + DPRINTF(1, "Missing function\n"); + goto done; } PyCodeObject *co = (PyCodeObject *)func->func_code; diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 610d1b1..a0ecf58 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1599,7 +1599,9 @@ PyFunctionObject *func = (PyFunctionObject *)(this_instr + 2)->operand; DPRINTF(3, "func: %p ", func); if (func == NULL) { - goto error; + DPRINTF(3, "\n"); + DPRINTF(1, "Missing function\n"); + goto done; } PyCodeObject *co = (PyCodeObject *)func->func_code; assert(self_or_null != NULL); |