[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 48/62] tcg: Don't re-use TEMP_TB temporaries
From: |
Richard Henderson |
Subject: |
[PULL 48/62] tcg: Don't re-use TEMP_TB temporaries |
Date: |
Tue, 28 Feb 2023 16:56:29 -1000 |
Reusing TEMP_TB interferes with detecting whether the
temp can be adjusted to TEMP_EBB.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/tcg/tcg.h | 2 +-
tcg/tcg.c | 101 ++++++++++++++++++++++++----------------------
2 files changed, 53 insertions(+), 50 deletions(-)
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
index 0c2041bcf7..6cc6758cd6 100644
--- a/include/tcg/tcg.h
+++ b/include/tcg/tcg.h
@@ -612,7 +612,7 @@ struct TCGContext {
#endif
GHashTable *const_table[TCG_TYPE_COUNT];
- TCGTempSet free_temps[TCG_TYPE_COUNT * 2];
+ TCGTempSet free_temps[TCG_TYPE_COUNT];
TCGTemp temps[TCG_MAX_TEMPS]; /* globals first, temps after */
QTAILQ_HEAD(, TCGOp) ops, free_ops;
diff --git a/tcg/tcg.c b/tcg/tcg.c
index a54f93c858..7f4d2f1920 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1257,63 +1257,66 @@ TCGTemp *tcg_global_mem_new_internal(TCGType type,
TCGv_ptr base,
TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind)
{
TCGContext *s = tcg_ctx;
- bool temp_local = kind == TEMP_TB;
TCGTemp *ts;
- int idx, k;
+ int n;
- k = type + (temp_local ? TCG_TYPE_COUNT : 0);
- idx = find_first_bit(s->free_temps[k].l, TCG_MAX_TEMPS);
- if (idx < TCG_MAX_TEMPS) {
- /* There is already an available temp with the right type. */
- clear_bit(idx, s->free_temps[k].l);
+ if (kind == TEMP_EBB) {
+ int idx = find_first_bit(s->free_temps[type].l, TCG_MAX_TEMPS);
- ts = &s->temps[idx];
- ts->temp_allocated = 1;
- tcg_debug_assert(ts->base_type == type);
- tcg_debug_assert(ts->kind == kind);
- } else {
- int i, n;
+ if (idx < TCG_MAX_TEMPS) {
+ /* There is already an available temp with the right type. */
+ clear_bit(idx, s->free_temps[type].l);
- switch (type) {
- case TCG_TYPE_I32:
- case TCG_TYPE_V64:
- case TCG_TYPE_V128:
- case TCG_TYPE_V256:
- n = 1;
- break;
- case TCG_TYPE_I64:
- n = 64 / TCG_TARGET_REG_BITS;
- break;
- case TCG_TYPE_I128:
- n = 128 / TCG_TARGET_REG_BITS;
- break;
- default:
- g_assert_not_reached();
+ ts = &s->temps[idx];
+ ts->temp_allocated = 1;
+ tcg_debug_assert(ts->base_type == type);
+ tcg_debug_assert(ts->kind == kind);
+ goto done;
}
+ } else {
+ tcg_debug_assert(kind == TEMP_TB);
+ }
- ts = tcg_temp_alloc(s);
- ts->base_type = type;
- ts->temp_allocated = 1;
- ts->kind = kind;
+ switch (type) {
+ case TCG_TYPE_I32:
+ case TCG_TYPE_V64:
+ case TCG_TYPE_V128:
+ case TCG_TYPE_V256:
+ n = 1;
+ break;
+ case TCG_TYPE_I64:
+ n = 64 / TCG_TARGET_REG_BITS;
+ break;
+ case TCG_TYPE_I128:
+ n = 128 / TCG_TARGET_REG_BITS;
+ break;
+ default:
+ g_assert_not_reached();
+ }
- if (n == 1) {
- ts->type = type;
- } else {
- ts->type = TCG_TYPE_REG;
+ ts = tcg_temp_alloc(s);
+ ts->base_type = type;
+ ts->temp_allocated = 1;
+ ts->kind = kind;
- for (i = 1; i < n; ++i) {
- TCGTemp *ts2 = tcg_temp_alloc(s);
+ if (n == 1) {
+ ts->type = type;
+ } else {
+ ts->type = TCG_TYPE_REG;
- tcg_debug_assert(ts2 == ts + i);
- ts2->base_type = type;
- ts2->type = TCG_TYPE_REG;
- ts2->temp_allocated = 1;
- ts2->temp_subindex = i;
- ts2->kind = kind;
- }
+ for (int i = 1; i < n; ++i) {
+ TCGTemp *ts2 = tcg_temp_alloc(s);
+
+ tcg_debug_assert(ts2 == ts + i);
+ ts2->base_type = type;
+ ts2->type = TCG_TYPE_REG;
+ ts2->temp_allocated = 1;
+ ts2->temp_subindex = i;
+ ts2->kind = kind;
}
}
+ done:
#if defined(CONFIG_DEBUG_TCG)
s->temps_in_use++;
#endif
@@ -1358,7 +1361,6 @@ TCGv_vec tcg_temp_new_vec_matching(TCGv_vec match)
void tcg_temp_free_internal(TCGTemp *ts)
{
TCGContext *s = tcg_ctx;
- int k, idx;
switch (ts->kind) {
case TEMP_CONST:
@@ -1382,9 +1384,10 @@ void tcg_temp_free_internal(TCGTemp *ts)
s->temps_in_use--;
#endif
- idx = temp_idx(ts);
- k = ts->base_type + (ts->kind == TEMP_EBB ? 0 : TCG_TYPE_COUNT);
- set_bit(idx, s->free_temps[k].l);
+ if (ts->kind == TEMP_EBB) {
+ int idx = temp_idx(ts);
+ set_bit(idx, s->free_temps[ts->base_type].l);
+ }
}
TCGTemp *tcg_constant_internal(TCGType type, int64_t val)
--
2.34.1
- [PULL 39/62] tcg: Remove TEMP_NORMAL, (continued)
- [PULL 39/62] tcg: Remove TEMP_NORMAL, Richard Henderson, 2023/02/28
- [PULL 47/62] accel/tcg/plugin: Tidy plugin_gen_disable_mem_helpers, Richard Henderson, 2023/02/28
- [PULL 58/62] target/ppc: Don't use tcg_temp_local_new, Richard Henderson, 2023/02/28
- [PULL 46/62] accel/tcg/plugin: Use tcg_temp_ebb_*, Richard Henderson, 2023/02/28
- [PULL 55/62] target/hppa: Don't use tcg_temp_local_new, Richard Henderson, 2023/02/28
- [PULL 43/62] tcg: Add tcg_temp_ebb_new_{i32,i64,ptr}, Richard Henderson, 2023/02/28
- [PULL 44/62] tcg: Use tcg_temp_ebb_new_* in tcg/, Richard Henderson, 2023/02/28
- [PULL 60/62] exec/gen-icount: Don't use tcg_temp_local_new_i32, Richard Henderson, 2023/02/28
- [PULL 56/62] target/i386: Don't use tcg_temp_local_new, Richard Henderson, 2023/02/28
- [PULL 50/62] target/arm: Drop copies in gen_sve_{ldr,str}, Richard Henderson, 2023/02/28
- [PULL 48/62] tcg: Don't re-use TEMP_TB temporaries,
Richard Henderson <=
- [PULL 40/62] tcg: Pass TCGTempKind to tcg_temp_new_internal, Richard Henderson, 2023/02/28
- [PULL 49/62] tcg: Change default temp lifetime to TEMP_TB, Richard Henderson, 2023/02/28
- [PULL 59/62] target/xtensa: Don't use tcg_temp_local_new_*, Richard Henderson, 2023/02/28
- [PULL 42/62] tcg: Add tcg_gen_movi_ptr, Richard Henderson, 2023/02/28
- [PULL 45/62] tcg: Use tcg_constant_ptr in do_dup, Richard Henderson, 2023/02/28
- [PULL 53/62] target/hexagon: Don't use tcg_temp_local_new_*, Richard Henderson, 2023/02/28
- [PULL 57/62] target/mips: Don't use tcg_temp_local_new, Richard Henderson, 2023/02/28
- [PULL 54/62] target/hexagon/idef-parser: Drop gen_tmp_local, Richard Henderson, 2023/02/28
- [PULL 61/62] tcg: Remove tcg_temp_local_new_*, tcg_const_local_*, Richard Henderson, 2023/02/28
- [PULL 41/62] tcg: Use tcg_constant_i32 in tcg_gen_io_start, Richard Henderson, 2023/02/28