[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 06/28] tcg: Add liveness_pass_0
From: |
Richard Henderson |
Subject: |
[PATCH v2 06/28] tcg: Add liveness_pass_0 |
Date: |
Wed, 22 Feb 2023 13:26:53 -1000 |
Attempt to reduce the lifetime of TEMP_TB.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/tcg.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index bf2af8b0fe..8d4ce7bd1e 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -2857,6 +2857,74 @@ static void la_cross_call(TCGContext *s, int nt)
}
}
+/*
+ * Liveness analysis: Verify the lifetime of TEMP_TB, and reduce
+ * to TEMP_EBB, if possible.
+ */
+static void liveness_pass_0(TCGContext *s)
+{
+ void * const multiple_ebb = (void *)(uintptr_t)-1;
+ int nb_temps = s->nb_temps;
+ TCGOp *op, *ebb;
+
+ for (int i = s->nb_globals; i < nb_temps; ++i) {
+ s->temps[i].state_ptr = NULL;
+ }
+
+ /*
+ * Represent each EBB by the op at which it begins. In the case of
+ * the first EBB, this is the first op, otherwise it is a label.
+ * Collect the uses of each TEMP_TB: NULL for unused, EBB for use
+ * within a single EBB, else MULTIPLE_EBB.
+ */
+ ebb = QTAILQ_FIRST(&s->ops);
+ QTAILQ_FOREACH(op, &s->ops, link) {
+ const TCGOpDef *def;
+ int nb_oargs, nb_iargs;
+
+ switch (op->opc) {
+ case INDEX_op_set_label:
+ ebb = op;
+ continue;
+ case INDEX_op_discard:
+ continue;
+ case INDEX_op_call:
+ nb_oargs = TCGOP_CALLO(op);
+ nb_iargs = TCGOP_CALLI(op);
+ break;
+ default:
+ def = &tcg_op_defs[op->opc];
+ nb_oargs = def->nb_oargs;
+ nb_iargs = def->nb_iargs;
+ break;
+ }
+
+ for (int i = 0; i < nb_oargs + nb_iargs; ++i) {
+ TCGTemp *ts = arg_temp(op->args[i]);
+
+ if (ts->kind != TEMP_TB) {
+ continue;
+ }
+ if (ts->state_ptr == NULL) {
+ ts->state_ptr = ebb;
+ } else if (ts->state_ptr != ebb) {
+ ts->state_ptr = multiple_ebb;
+ }
+ }
+ }
+
+ /*
+ * For TEMP_TB that turned out not to be used beyond one EBB,
+ * reduce the liveness to TEMP_EBB.
+ */
+ for (int i = s->nb_globals; i < nb_temps; ++i) {
+ TCGTemp *ts = &s->temps[i];
+ if (ts->kind == TEMP_TB && ts->state_ptr != multiple_ebb) {
+ ts->kind = TEMP_EBB;
+ }
+ }
+}
+
/* Liveness analysis : update the opc_arg_life array to tell if a
given input arguments is dead. Instructions updating dead
temporaries are removed. */
@@ -4870,6 +4938,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb,
target_ulong pc_start)
#endif
reachable_code_pass(s);
+ liveness_pass_0(s);
liveness_pass_1(s);
if (s->nb_indirects > 0) {
--
2.34.1
- [PATCH v2 00/28] tcg: Simplify temporary usage, Richard Henderson, 2023/02/22
- [PATCH v2 01/28] tcg: Adjust TCGContext.temps_in_use check, Richard Henderson, 2023/02/22
- [PATCH v2 02/28] accel/tcg: Pass max_insn to gen_intermediate_code by pointer, Richard Henderson, 2023/02/22
- [PATCH v2 03/28] accel/tcg: Use more accurate max_insns for tb_overflow, Richard Henderson, 2023/02/22
- [PATCH v2 04/28] tcg: Remove branch-to-next regardless of reference count, Richard Henderson, 2023/02/22
- [PATCH v2 05/28] tcg: Rename TEMP_LOCAL to TEMP_TB, Richard Henderson, 2023/02/22
- [PATCH v2 06/28] tcg: Add liveness_pass_0,
Richard Henderson <=
- [PATCH v2 07/28] tcg: Remove TEMP_NORMAL, Richard Henderson, 2023/02/22
- [PATCH v2 08/28] tcg: Pass TCGTempKind to tcg_temp_new_internal, Richard Henderson, 2023/02/22
- [PATCH v2 09/28] tcg: Add tcg_temp_ebb_new_{i32,i64,ptr}, Richard Henderson, 2023/02/22
- [PATCH v2 10/28] tcg: Add tcg_gen_movi_ptr, Richard Henderson, 2023/02/22
- [PATCH v2 12/28] accel/tcg/plugin: Use tcg_temp_ebb_*, Richard Henderson, 2023/02/22
- [PATCH v2 13/28] accel/tcg/plugin: Tidy plugin_gen_disable_mem_helpers, Richard Henderson, 2023/02/22
- [PATCH v2 11/28] tcg: Use tcg_temp_ebb_new_* in tcg/, Richard Henderson, 2023/02/22
- [PATCH v2 14/28] tcg: Don't re-use TEMP_TB temporaries, Richard Henderson, 2023/02/22
- [PATCH v2 15/28] tcg: Change default temp lifetime to TEMP_TB, Richard Henderson, 2023/02/22
- [PATCH v2 16/28] target/arm: Drop copies in gen_sve_{ldr,str}, Richard Henderson, 2023/02/22