summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-06-17 23:06:24 +1000
committerDamien George <damien@micropython.org>2022-06-20 22:28:18 +1000
commite85a096302e8b186b82c74e7da4e1a29ef62d9c6 (patch)
treeba0c03f2dd7b57b9d22c4cb28912e9f4585ec6ef /py
parent0db046b67b8ed171f4898e851c3da39aab297ce9 (diff)
py/emit: Remove logic to detect last-emit-was-return-value.
This optimisation to remove dead code is not as good as it could be. Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py')
-rw-r--r--py/compile.c24
-rw-r--r--py/emit.h2
-rw-r--r--py/emitbc.c9
-rw-r--r--py/emitnative.c15
4 files changed, 7 insertions, 43 deletions
diff --git a/py/compile.c b/py/compile.c
index 9cca5df40..ff3e5ffc6 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1330,12 +1330,8 @@ STATIC void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
goto done;
}
- if (
- // optimisation: don't jump over non-existent elif/else blocks
- !(MP_PARSE_NODE_IS_NULL(pns->nodes[2]) && MP_PARSE_NODE_IS_NULL(pns->nodes[3]))
- // optimisation: don't jump if last instruction was return
- && !EMIT(last_emit_was_return_value)
- ) {
+ // optimisation: don't jump over non-existent elif/else blocks
+ if (!(MP_PARSE_NODE_IS_NULL(pns->nodes[2]) && MP_PARSE_NODE_IS_NULL(pns->nodes[3]))) {
// jump over elif/else blocks
EMIT_ARG(jump, l_end);
}
@@ -1362,10 +1358,7 @@ STATIC void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
goto done;
}
- // optimisation: don't jump if last instruction was return
- if (!EMIT(last_emit_was_return_value)) {
- EMIT_ARG(jump, l_end);
- }
+ EMIT_ARG(jump, l_end);
EMIT_ARG(label_assign, l_fail);
}
}
@@ -1580,9 +1573,7 @@ STATIC void compile_for_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
EMIT_ARG(for_iter, pop_label);
c_assign(comp, pns->nodes[0], ASSIGN_STORE); // variable
compile_node(comp, pns->nodes[2]); // body
- if (!EMIT(last_emit_was_return_value)) {
- EMIT_ARG(jump, continue_label);
- }
+ EMIT_ARG(jump, continue_label);
EMIT_ARG(label_assign, pop_label);
EMIT(for_iter_end);
@@ -3048,11 +3039,8 @@ STATIC bool compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
}
compile_node(comp, pns->nodes[3]); // 3 is function body
- // emit return if it wasn't the last opcode
- if (!EMIT(last_emit_was_return_value)) {
- EMIT_ARG(load_const_tok, MP_TOKEN_KW_NONE);
- EMIT(return_value);
- }
+ EMIT_ARG(load_const_tok, MP_TOKEN_KW_NONE);
+ EMIT(return_value);
} else if (scope->kind == SCOPE_LAMBDA) {
assert(MP_PARSE_NODE_IS_STRUCT(scope->pn));
mp_parse_node_struct_t *pns = (mp_parse_node_struct_t *)scope->pn;
diff --git a/py/emit.h b/py/emit.h
index 608734552..4e8a55e77 100644
--- a/py/emit.h
+++ b/py/emit.h
@@ -115,7 +115,6 @@ typedef struct _emit_method_table_t {
void (*start_pass)(emit_t *emit, pass_kind_t pass, scope_t *scope);
bool (*end_pass)(emit_t *emit);
- bool (*last_emit_was_return_value)(emit_t *emit);
void (*adjust_stack_size)(emit_t *emit, mp_int_t delta);
void (*set_source_line)(emit_t *emit, mp_uint_t line);
@@ -227,7 +226,6 @@ void emit_native_xtensawin_free(emit_t *emit);
void mp_emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope);
bool mp_emit_bc_end_pass(emit_t *emit);
-bool mp_emit_bc_last_emit_was_return_value(emit_t *emit);
void mp_emit_bc_adjust_stack_size(emit_t *emit, mp_int_t delta);
void mp_emit_bc_set_source_line(emit_t *emit, mp_uint_t line);
diff --git a/py/emitbc.c b/py/emitbc.c
index 2007975c5..9c0d78d79 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -47,7 +47,6 @@ struct _emit_t {
byte dummy_data[DUMMY_DATA_SIZE];
pass_kind_t pass : 8;
- mp_uint_t last_emit_was_return_value : 8;
int stack_size;
@@ -272,7 +271,6 @@ STATIC void emit_write_bytecode_byte_label(emit_t *emit, int stack_adj, byte b1,
void mp_emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) {
emit->pass = pass;
emit->stack_size = 0;
- emit->last_emit_was_return_value = false;
emit->scope = scope;
emit->last_source_line_offset = 0;
emit->last_source_line = 1;
@@ -397,10 +395,6 @@ bool mp_emit_bc_end_pass(emit_t *emit) {
return true;
}
-bool mp_emit_bc_last_emit_was_return_value(emit_t *emit) {
- return emit->last_emit_was_return_value;
-}
-
void mp_emit_bc_adjust_stack_size(emit_t *emit, mp_int_t delta) {
if (emit->pass == MP_PASS_SCOPE) {
return;
@@ -410,7 +404,6 @@ void mp_emit_bc_adjust_stack_size(emit_t *emit, mp_int_t delta) {
if (emit->stack_size > emit->scope->stack_size) {
emit->scope->stack_size = emit->stack_size;
}
- emit->last_emit_was_return_value = false;
}
void mp_emit_bc_set_source_line(emit_t *emit, mp_uint_t source_line) {
@@ -773,7 +766,6 @@ void mp_emit_bc_call_method(emit_t *emit, mp_uint_t n_positional, mp_uint_t n_ke
void mp_emit_bc_return_value(emit_t *emit) {
emit_write_bytecode_byte(emit, -1, MP_BC_RETURN_VALUE);
- emit->last_emit_was_return_value = true;
}
void mp_emit_bc_raise_varargs(emit_t *emit, mp_uint_t n_args) {
@@ -806,7 +798,6 @@ const emit_method_table_t emit_bc_method_table = {
mp_emit_bc_start_pass,
mp_emit_bc_end_pass,
- mp_emit_bc_last_emit_was_return_value,
mp_emit_bc_adjust_stack_size,
mp_emit_bc_set_source_line,
diff --git a/py/emitnative.c b/py/emitnative.c
index 6683ea420..5b695a22a 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -276,8 +276,6 @@ struct _emit_t {
uint16_t n_info;
uint16_t n_cell;
- bool last_emit_was_return_value;
-
scope_t *scope;
ASM_T *as;
@@ -370,7 +368,6 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
emit->pass = pass;
emit->do_viper_types = scope->emit_options == MP_EMIT_OPT_VIPER;
emit->stack_size = 0;
- emit->last_emit_was_return_value = false;
emit->scope = scope;
// allocate memory for keeping track of the types of locals
@@ -733,10 +730,6 @@ STATIC bool emit_native_end_pass(emit_t *emit) {
return true;
}
-STATIC bool emit_native_last_emit_was_return_value(emit_t *emit) {
- return emit->last_emit_was_return_value;
-}
-
STATIC void ensure_extra_stack(emit_t *emit, size_t delta) {
if (emit->stack_size + delta > emit->stack_info_alloc) {
size_t new_alloc = (emit->stack_size + delta + 8) & ~3;
@@ -793,7 +786,7 @@ STATIC void emit_native_set_source_line(emit_t *emit, mp_uint_t source_line) {
// this must be called at start of emit functions
STATIC void emit_native_pre(emit_t *emit) {
- emit->last_emit_was_return_value = false;
+ (void)emit;
}
// depth==0 is top, depth==1 is before top, etc
@@ -917,7 +910,6 @@ STATIC void emit_fold_stack_top(emit_t *emit, int reg_dest) {
// If stacked value is in a register and the register is not r1 or r2, then
// *reg_dest is set to that register. Otherwise the value is put in *reg_dest.
STATIC void emit_pre_pop_reg_flexible(emit_t *emit, vtype_kind_t *vtype, int *reg_dest, int not_r1, int not_r2) {
- emit->last_emit_was_return_value = false;
stack_info_t *si = peek_stack(emit, 0);
if (si->kind == STACK_REG && si->data.u_reg != not_r1 && si->data.u_reg != not_r2) {
*vtype = si->vtype;
@@ -930,12 +922,10 @@ STATIC void emit_pre_pop_reg_flexible(emit_t *emit, vtype_kind_t *vtype, int *re
}
STATIC void emit_pre_pop_discard(emit_t *emit) {
- emit->last_emit_was_return_value = false;
adjust_stack(emit, -1);
}
STATIC void emit_pre_pop_reg(emit_t *emit, vtype_kind_t *vtype, int reg_dest) {
- emit->last_emit_was_return_value = false;
emit_access_stack(emit, 1, vtype, reg_dest);
adjust_stack(emit, -1);
}
@@ -2771,7 +2761,6 @@ STATIC void emit_native_return_value(emit_t *emit) {
// Do the unwinding jump to get to the return handler
emit_native_unwind_jump(emit, emit->exit_label, emit->exc_stack_size);
- emit->last_emit_was_return_value = true;
return;
}
@@ -2809,7 +2798,6 @@ STATIC void emit_native_return_value(emit_t *emit) {
ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_RET_VAL(emit), REG_PARENT_RET);
}
emit_native_unwind_jump(emit, emit->exit_label, emit->exc_stack_size);
- emit->last_emit_was_return_value = true;
}
STATIC void emit_native_raise_varargs(emit_t *emit, mp_uint_t n_args) {
@@ -2928,7 +2916,6 @@ const emit_method_table_t EXPORT_FUN(method_table) = {
emit_native_start_pass,
emit_native_end_pass,
- emit_native_last_emit_was_return_value,
emit_native_adjust_stack_size,
emit_native_set_source_line,