From e5097dc8e3beb5cc94d132681db7a2433bdce5a7 Mon Sep 17 00:00:00 2001 From: bellard Date: Wed, 21 May 2008 16:24:20 +0000 Subject: [PATCH] fixed dead global variable update git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4512 c046a42c-6fe2-441c-8c8c-71466251a162 --- tcg/tcg.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/tcg/tcg.c b/tcg/tcg.c index b1d040283..c5b659438 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -1293,10 +1293,9 @@ static int tcg_reg_alloc(TCGContext *s, TCGRegSet reg1, TCGRegSet reg2) tcg_abort(); } -/* at the end of a basic block, we assume all temporaries are dead and - all globals are stored at their canonical location */ -/* XXX: optimize by handling constants in another array ? */ -void tcg_reg_alloc_bb_end(TCGContext *s) +/* save globals to their cannonical location and assume they can be + modified be the following code. */ +static void save_globals(TCGContext *s) { TCGTemp *ts; int i; @@ -1306,9 +1305,22 @@ void tcg_reg_alloc_bb_end(TCGContext *s) if (!ts->fixed_reg) { if (ts->val_type == TEMP_VAL_REG) { tcg_reg_free(s, ts->reg); + } else if (ts->val_type == TEMP_VAL_DEAD) { + ts->val_type = TEMP_VAL_MEM; } } } +} + +/* at the end of a basic block, we assume all temporaries are dead and + all globals are stored at their canonical location */ +/* XXX: optimize by handling constants in another array ? */ +void tcg_reg_alloc_bb_end(TCGContext *s) +{ + TCGTemp *ts; + int i; + + save_globals(s); for(i = s->nb_globals; i < s->nb_temps; i++) { ts = &s->temps[i]; @@ -1481,14 +1493,7 @@ static void tcg_reg_alloc_op(TCGContext *s, /* store globals and free associated registers (we assume the insn can modify any global. */ - for(i = 0; i < s->nb_globals; i++) { - ts = &s->temps[i]; - if (!ts->fixed_reg) { - if (ts->val_type == TEMP_VAL_REG) { - tcg_reg_free(s, ts->reg); - } - } - } + save_globals(s); } /* satisfy the output constraints */ @@ -1680,14 +1685,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, /* store globals and free associated registers (we assume the call can modify any global. */ - for(i = 0; i < s->nb_globals; i++) { - ts = &s->temps[i]; - if (!ts->fixed_reg) { - if (ts->val_type == TEMP_VAL_REG) { - tcg_reg_free(s, ts->reg); - } - } - } + save_globals(s); tcg_out_op(s, opc, &func_arg, &const_func_arg);