diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2020-11-02 12:26:15 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2020-11-02 12:26:15 +0000 |
commit | 76ef7500813a7a13b3e75ac9fd6893635aeb9ba9 (patch) | |
tree | ef37fb0042bb91ab9f59b6a0deff799a9243da34 | |
parent | 2c6605389c1f76973d92b69b85d40d94b8f1092c (diff) |
Revert "tcg: Do not kill globals at conditional branches"
This reverts commit b4cb76e6208cf6b5bb39404c6d44a6514eb6842a.
-rw-r--r-- | include/tcg/tcg-opc.h | 7 | ||||
-rw-r--r-- | include/tcg/tcg.h | 4 | ||||
-rw-r--r-- | tcg/tcg.c | 55 |
3 files changed, 6 insertions, 60 deletions
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h index 67092e82c6..e3929b80d2 100644 --- a/include/tcg/tcg-opc.h +++ b/include/tcg/tcg-opc.h @@ -81,7 +81,7 @@ DEF(extract_i32, 1, 1, 2, IMPL(TCG_TARGET_HAS_extract_i32)) DEF(sextract_i32, 1, 1, 2, IMPL(TCG_TARGET_HAS_sextract_i32)) DEF(extract2_i32, 1, 2, 1, IMPL(TCG_TARGET_HAS_extract2_i32)) -DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH) +DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END) DEF(add2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_add2_i32)) DEF(sub2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_sub2_i32)) @@ -89,8 +89,7 @@ DEF(mulu2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_mulu2_i32)) DEF(muls2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_muls2_i32)) DEF(muluh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_muluh_i32)) DEF(mulsh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_mulsh_i32)) -DEF(brcond2_i32, 0, 4, 2, - TCG_OPF_BB_END | TCG_OPF_COND_BRANCH | IMPL(TCG_TARGET_REG_BITS == 32)) +DEF(brcond2_i32, 0, 4, 2, TCG_OPF_BB_END | IMPL(TCG_TARGET_REG_BITS == 32)) DEF(setcond2_i32, 1, 4, 1, IMPL(TCG_TARGET_REG_BITS == 32)) DEF(ext8s_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext8s_i32)) @@ -160,7 +159,7 @@ DEF(extrh_i64_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_extrh_i64_i32) | (TCG_TARGET_REG_BITS == 32 ? TCG_OPF_NOT_PRESENT : 0)) -DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH | IMPL64) +DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | IMPL64) DEF(ext8s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8s_i64)) DEF(ext16s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16s_i64)) DEF(ext32s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32s_i64)) diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h index 8ff9dad4ef..8804a8c4a2 100644 --- a/include/tcg/tcg.h +++ b/include/tcg/tcg.h @@ -990,7 +990,7 @@ typedef struct TCGArgConstraint { #define TCG_MAX_OP_ARGS 16 -/* Bits for TCGOpDef->flags, 8 bits available, all used. */ +/* Bits for TCGOpDef->flags, 8 bits available. */ enum { /* Instruction exits the translation block. */ TCG_OPF_BB_EXIT = 0x01, @@ -1008,8 +1008,6 @@ enum { TCG_OPF_NOT_PRESENT = 0x20, /* Instruction operands are vectors. */ TCG_OPF_VECTOR = 0x40, - /* Instruction is a conditional branch. */ - TCG_OPF_COND_BRANCH = 0x80 }; typedef struct TCGOpDef { @@ -2519,28 +2519,6 @@ static void la_global_sync(TCGContext *s, int ng) } } -/* - * liveness analysis: conditional branch: all temps are dead, - * globals and local temps should be synced. - */ -static void la_bb_sync(TCGContext *s, int ng, int nt) -{ - la_global_sync(s, ng); - - for (int i = ng; i < nt; ++i) { - if (s->temps[i].temp_local) { - int state = s->temps[i].state; - s->temps[i].state = state | TS_MEM; - if (state != TS_DEAD) { - continue; - } - } else { - s->temps[i].state = TS_DEAD; - } - la_reset_pref(&s->temps[i]); - } -} - /* liveness analysis: sync globals back to memory and kill. */ static void la_global_kill(TCGContext *s, int ng) { @@ -2817,8 +2795,6 @@ static void liveness_pass_1(TCGContext *s) /* If end of basic block, update. */ if (def->flags & TCG_OPF_BB_EXIT) { la_func_end(s, nb_globals, nb_temps); - } else if (def->flags & TCG_OPF_COND_BRANCH) { - la_bb_sync(s, nb_globals, nb_temps); } else if (def->flags & TCG_OPF_BB_END) { la_bb_end(s, nb_globals, nb_temps); } else if (def->flags & TCG_OPF_SIDE_EFFECTS) { @@ -2931,10 +2907,7 @@ static bool liveness_pass_2(TCGContext *s) nb_oargs = def->nb_oargs; /* Set flags similar to how calls require. */ - if (def->flags & TCG_OPF_COND_BRANCH) { - /* Like reading globals: sync_globals */ - call_flags = TCG_CALL_NO_WRITE_GLOBALS; - } else if (def->flags & TCG_OPF_BB_END) { + if (def->flags & TCG_OPF_BB_END) { /* Like writing globals: save_globals */ call_flags = 0; } else if (def->flags & TCG_OPF_SIDE_EFFECTS) { @@ -3407,28 +3380,6 @@ static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs) } /* - * At a conditional branch, we assume all temporaries are dead and - * all globals and local temps are synced to their location. - */ -static void tcg_reg_alloc_cbranch(TCGContext *s, TCGRegSet allocated_regs) -{ - sync_globals(s, allocated_regs); - - for (int i = s->nb_globals; i < s->nb_temps; i++) { - TCGTemp *ts = &s->temps[i]; - /* - * The liveness analysis already ensures that temps are dead. - * Keep tcg_debug_asserts for safety. - */ - if (ts->temp_local) { - tcg_debug_assert(ts->val_type != TEMP_VAL_REG || ts->mem_coherent); - } else { - tcg_debug_assert(ts->val_type == TEMP_VAL_DEAD); - } - } -} - -/* * Specialized code generation for INDEX_op_movi_*. */ static void tcg_reg_alloc_do_movi(TCGContext *s, TCGTemp *ots, @@ -3779,9 +3730,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op) } } - if (def->flags & TCG_OPF_COND_BRANCH) { - tcg_reg_alloc_cbranch(s, i_allocated_regs); - } else if (def->flags & TCG_OPF_BB_END) { + if (def->flags & TCG_OPF_BB_END) { tcg_reg_alloc_bb_end(s, i_allocated_regs); } else { if (def->flags & TCG_OPF_CALL_CLOBBER) { |