[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 07/31] tcg: Add liveness_pass_0
From: |
Richard Henderson |
Subject: |
[PATCH v4 07/31] tcg: Add liveness_pass_0 |
Date: |
Sun, 26 Feb 2023 19:36:37 -1000 |
Attempt to reduce the lifetime of TEMP_TB.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/tcg.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 7ee935701a..6646770268 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -2858,6 +2858,75 @@ 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 __attribute__((noinline))
+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. */
@@ -4873,6 +4942,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 v4 00/31] tcg: Simplify temporary usage, Richard Henderson, 2023/02/27
- [PATCH v4 01/31] tcg: Adjust TCGContext.temps_in_use check, Richard Henderson, 2023/02/27
- [PATCH v4 02/31] accel/tcg: Pass max_insn to gen_intermediate_code by pointer, Richard Henderson, 2023/02/27
- [PATCH v4 03/31] accel/tcg: Use more accurate max_insns for tb_overflow, Richard Henderson, 2023/02/27
- [PATCH v4 04/31] tcg: Remove branch-to-next regardless of reference count, Richard Henderson, 2023/02/27
- [PATCH v4 05/31] tcg: Rename TEMP_LOCAL to TEMP_TB, Richard Henderson, 2023/02/27
- [PATCH v4 06/31] tcg: Use noinline for major tcg_gen_code subroutines, Richard Henderson, 2023/02/27
- [PATCH v4 07/31] tcg: Add liveness_pass_0,
Richard Henderson <=
- [PATCH v4 08/31] tcg: Remove TEMP_NORMAL, Richard Henderson, 2023/02/27
- [PATCH v4 09/31] tcg: Pass TCGTempKind to tcg_temp_new_internal, Richard Henderson, 2023/02/27
- [PATCH v4 11/31] tcg: Add tcg_gen_movi_ptr, Richard Henderson, 2023/02/27
- [PATCH v4 10/31] tcg: Use tcg_constant_i32 in tcg_gen_io_start, Richard Henderson, 2023/02/27
- [PATCH v4 12/31] tcg: Add tcg_temp_ebb_new_{i32,i64,ptr}, Richard Henderson, 2023/02/27
- [PATCH v4 15/31] accel/tcg/plugin: Use tcg_temp_ebb_*, Richard Henderson, 2023/02/27
- [PATCH v4 14/31] tcg: Use tcg_constant_ptr in do_dup, Richard Henderson, 2023/02/27
- [PATCH v4 16/31] accel/tcg/plugin: Tidy plugin_gen_disable_mem_helpers, Richard Henderson, 2023/02/27
- [PATCH v4 13/31] tcg: Use tcg_temp_ebb_new_* in tcg/, Richard Henderson, 2023/02/27