From e751b45aeaa7feff24c8c0868b29fa64383d3c37 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 3 Mar 2021 21:35:20 -0500 Subject: [PATCH] tcg/optimize: Improve find_better_copy Prefer TEMP_CONST over anything else. Backports 4c868ce6454872d395b29de8d82387b2ad14aeeb --- qemu/tcg/optimize.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/qemu/tcg/optimize.c b/qemu/tcg/optimize.c index 0bb649e8..d6cf8488 100644 --- a/qemu/tcg/optimize.c +++ b/qemu/tcg/optimize.c @@ -126,31 +126,28 @@ static void init_arg_info(TCGContext *s, TCGArg arg) static TCGTemp *find_better_copy(TCGTemp *ts) { - TCGTemp *i; + TCGTemp *i, *g, *l; - /* If this is already a global, we can't do better. */ - if (ts->kind >= TEMP_GLOBAL) { + /* If this is already readonly, we can't do better. */ + if (temp_readonly(ts)) { return ts; } - /* Search for a global first. */ + g = l = NULL; for (i = ts_info(ts)->next_copy; i != ts; i = ts_info(i)->next_copy) { - if (i->kind >= TEMP_GLOBAL) { + if (temp_readonly(i)) { return i; - } - } - - /* If it is a temp, search for a temp local. */ - if (ts->kind == TEMP_NORMAL) { - for (i = ts_info(ts)->next_copy; i != ts; i = ts_info(i)->next_copy) { - if (i->kind >= TEMP_LOCAL) { - return i; + } else if (i->kind > ts->kind) { + if (i->kind == TEMP_GLOBAL) { + g = i; + } else if (i->kind == TEMP_LOCAL) { + l = i; } } } - /* Failure to find a better representation, return the same temp. */ - return ts; + /* If we didn't find a better representation, return the same temp. */ + return g ? g : l ? l : ts; } static bool ts_are_copies(TCGTemp *ts1, TCGTemp *ts2)