[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for-7.1 v6 01/51] tcg: Fix indirect lowering vs TCG_OPF_COND_BRAN
From: |
Richard Henderson |
Subject: |
[PATCH for-7.1 v6 01/51] tcg: Fix indirect lowering vs TCG_OPF_COND_BRANCH |
Date: |
Wed, 16 Mar 2022 22:04:48 -0700 |
With TCG_OPF_COND_BRANCH, we extended the lifetimes of
globals across extended basic blocks. This means that
the liveness computed in pass 1 does not kill globals
in the same way as normal temps.
Introduce TYPE_EBB to match this lifetime, so that we
get correct register allocation for the temps that we
introduce during the indirect lowering pass.
Fixes: b4cb76e6208 ("tcg: Do not kill globals at conditional branches")
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/tcg/tcg.h | 2 ++
tcg/tcg.c | 10 ++++++++++
2 files changed, 12 insertions(+)
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
index 73869fd9d0..27de13fae0 100644
--- a/include/tcg/tcg.h
+++ b/include/tcg/tcg.h
@@ -433,6 +433,8 @@ typedef enum TCGTempVal {
typedef enum TCGTempKind {
/* Temp is dead at the end of all basic blocks. */
TEMP_NORMAL,
+ /* Temp is live across conditional branch, but dead otherwise. */
+ TEMP_EBB,
/* Temp is saved across basic blocks but dead at the end of TBs. */
TEMP_LOCAL,
/* Temp is saved across both basic blocks and translation blocks. */
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 33a97eabdb..45030e88fd 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1674,6 +1674,7 @@ static void tcg_reg_alloc_start(TCGContext *s)
case TEMP_GLOBAL:
break;
case TEMP_NORMAL:
+ case TEMP_EBB:
val = TEMP_VAL_DEAD;
/* fall through */
case TEMP_LOCAL:
@@ -1701,6 +1702,9 @@ static char *tcg_get_arg_str_ptr(TCGContext *s, char
*buf, int buf_size,
case TEMP_LOCAL:
snprintf(buf, buf_size, "loc%d", idx - s->nb_globals);
break;
+ case TEMP_EBB:
+ snprintf(buf, buf_size, "ebb%d", idx - s->nb_globals);
+ break;
case TEMP_NORMAL:
snprintf(buf, buf_size, "tmp%d", idx - s->nb_globals);
break;
@@ -2378,6 +2382,7 @@ static void la_bb_end(TCGContext *s, int ng, int nt)
state = TS_DEAD | TS_MEM;
break;
case TEMP_NORMAL:
+ case TEMP_EBB:
case TEMP_CONST:
state = TS_DEAD;
break;
@@ -2427,6 +2432,7 @@ static void la_bb_sync(TCGContext *s, int ng, int nt)
case TEMP_NORMAL:
s->temps[i].state = TS_DEAD;
break;
+ case TEMP_EBB:
case TEMP_CONST:
continue;
default:
@@ -2797,6 +2803,7 @@ static bool liveness_pass_2(TCGContext *s)
TCGTemp *dts = tcg_temp_alloc(s);
dts->type = its->type;
dts->base_type = its->base_type;
+ dts->kind = TEMP_EBB;
its->state_ptr = dts;
} else {
its->state_ptr = NULL;
@@ -3107,6 +3114,7 @@ static void temp_free_or_dead(TCGContext *s, TCGTemp *ts,
int free_or_dead)
new_type = TEMP_VAL_MEM;
break;
case TEMP_NORMAL:
+ case TEMP_EBB:
new_type = free_or_dead < 0 ? TEMP_VAL_MEM : TEMP_VAL_DEAD;
break;
case TEMP_CONST:
@@ -3353,6 +3361,7 @@ static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet
allocated_regs)
temp_save(s, ts, allocated_regs);
break;
case TEMP_NORMAL:
+ case TEMP_EBB:
/* The liveness analysis already ensures that temps are dead.
Keep an tcg_debug_assert for safety. */
tcg_debug_assert(ts->val_type == TEMP_VAL_DEAD);
@@ -3390,6 +3399,7 @@ static void tcg_reg_alloc_cbranch(TCGContext *s,
TCGRegSet allocated_regs)
case TEMP_NORMAL:
tcg_debug_assert(ts->val_type == TEMP_VAL_DEAD);
break;
+ case TEMP_EBB:
case TEMP_CONST:
break;
default:
--
2.25.1
- [PATCH for-7.1 v6 00/51] target/nios2: Shadow register set, EIC and VIC, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 01/51] tcg: Fix indirect lowering vs TCG_OPF_COND_BRANCH,
Richard Henderson <=
- [PATCH for-7.1 v6 03/51] target/nios2: Stop generating code if gen_check_supervisor fails, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 02/51] target/nios2: Check supervisor on eret, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 04/51] target/nios2: Add NUM_GP_REGS and NUM_CP_REGS, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 06/51] target/nios2: Split out helper for eret instruction, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 05/51] target/nios2: Split PC out of env->regs[], Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 07/51] target/nios2: Fix BRET instruction, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 08/51] target/nios2: Do not create TCGv for control registers, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 10/51] target/nios2: Remove cpu_interrupts_enabled, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 09/51] linux-user/nios2: Only initialize SP and PC in target_cpu_copy_regs, Richard Henderson, 2022/03/17