aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/optimizer_analysis.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/optimizer_analysis.c')
-rw-r--r--Python/optimizer_analysis.c80
1 files changed, 34 insertions, 46 deletions
diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c
index 842b2e48923..e5d3793bd4d 100644
--- a/Python/optimizer_analysis.c
+++ b/Python/optimizer_analysis.c
@@ -297,20 +297,6 @@ remove_globals(_PyInterpreterFrame *frame, _PyUOpInstruction *buffer,
INST->oparg = ARG; \
INST->operand = OPERAND;
-#define OUT_OF_SPACE_IF_NULL(EXPR) \
- do { \
- if ((EXPR) == NULL) { \
- goto out_of_space; \
- } \
- } while (0);
-
-#define _LOAD_ATTR_NOT_NULL \
- do { \
- OUT_OF_SPACE_IF_NULL(attr = _Py_uop_sym_new_not_null(ctx)); \
- OUT_OF_SPACE_IF_NULL(null = _Py_uop_sym_new_null(ctx)); \
- } while (0);
-
-
/* Shortened forms for convenience, used in optimizer_bytecodes.c */
#define sym_is_not_null _Py_uop_sym_is_not_null
#define sym_is_const _Py_uop_sym_is_const
@@ -324,10 +310,10 @@ remove_globals(_PyInterpreterFrame *frame, _PyUOpInstruction *buffer,
#define sym_has_type _Py_uop_sym_has_type
#define sym_get_type _Py_uop_sym_get_type
#define sym_matches_type _Py_uop_sym_matches_type
-#define sym_set_null _Py_uop_sym_set_null
-#define sym_set_non_null _Py_uop_sym_set_non_null
-#define sym_set_type _Py_uop_sym_set_type
-#define sym_set_const _Py_uop_sym_set_const
+#define sym_set_null(SYM) _Py_uop_sym_set_null(ctx, SYM)
+#define sym_set_non_null(SYM) _Py_uop_sym_set_non_null(ctx, SYM)
+#define sym_set_type(SYM, TYPE) _Py_uop_sym_set_type(ctx, SYM, TYPE)
+#define sym_set_const(SYM, CNST) _Py_uop_sym_set_const(ctx, SYM, CNST)
#define sym_is_bottom _Py_uop_sym_is_bottom
#define sym_truthiness _Py_uop_sym_truthiness
#define frame_new _Py_uop_frame_new
@@ -408,18 +394,20 @@ optimize_uops(
_PyUOpInstruction *first_valid_check_stack = NULL;
_PyUOpInstruction *corresponding_check_stack = NULL;
- if (_Py_uop_abstractcontext_init(ctx) < 0) {
- goto out_of_space;
- }
+ _Py_uop_abstractcontext_init(ctx);
_Py_UOpsAbstractFrame *frame = _Py_uop_frame_new(ctx, co, ctx->n_consumed, 0, curr_stacklen);
if (frame == NULL) {
return -1;
}
ctx->curr_frame_depth++;
ctx->frame = frame;
+ ctx->done = false;
+ ctx->out_of_space = false;
+ ctx->contradiction = false;
_PyUOpInstruction *this_instr = NULL;
- for (int i = 0; i < trace_len; i++) {
+ for (int i = 0; !ctx->done; i++) {
+ assert(i < trace_len);
this_instr = &trace[i];
int oparg = this_instr->oparg;
@@ -447,32 +435,22 @@ optimize_uops(
ctx->frame->stack_pointer = stack_pointer;
assert(STACK_LEVEL() >= 0);
}
- Py_UNREACHABLE();
-
-out_of_space:
- DPRINTF(3, "\n");
- DPRINTF(1, "Out of space in abstract interpreter\n");
- goto done;
-error:
- DPRINTF(3, "\n");
- DPRINTF(1, "Encountered error in abstract interpreter\n");
- if (opcode <= MAX_UOP_ID) {
- OPT_ERROR_IN_OPCODE(opcode);
+ if (ctx->out_of_space) {
+ DPRINTF(3, "\n");
+ DPRINTF(1, "Out of space in abstract interpreter\n");
+ }
+ if (ctx->contradiction) {
+ // Attempted to push a "bottom" (contradiction) 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 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;
}
- _Py_uop_abstractcontext_fini(ctx);
- 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 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:
/* Either reached the end or cannot optimize further, but there
* would be no benefit in retrying later */
_Py_uop_abstractcontext_fini(ctx);
@@ -485,6 +463,16 @@ done:
first_valid_check_stack->operand = max_space;
}
return trace_len;
+
+error:
+ DPRINTF(3, "\n");
+ DPRINTF(1, "Encountered error in abstract interpreter\n");
+ if (opcode <= MAX_UOP_ID) {
+ OPT_ERROR_IN_OPCODE(opcode);
+ }
+ _Py_uop_abstractcontext_fini(ctx);
+ return -1;
+
}