Commit e5097dc8e3beb5cc94d132681db7a2433bdce5a7

Authored by bellard
1 parent 839bca84

fixed dead global variable update

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4512 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 18 additions and 20 deletions
tcg/tcg.c
@@ -1293,10 +1293,9 @@ static int tcg_reg_alloc(TCGContext *s, TCGRegSet reg1, TCGRegSet reg2) @@ -1293,10 +1293,9 @@ static int tcg_reg_alloc(TCGContext *s, TCGRegSet reg1, TCGRegSet reg2)
1293 tcg_abort(); 1293 tcg_abort();
1294 } 1294 }
1295 1295
1296 -/* at the end of a basic block, we assume all temporaries are dead and  
1297 - all globals are stored at their canonical location */  
1298 -/* XXX: optimize by handling constants in another array ? */  
1299 -void tcg_reg_alloc_bb_end(TCGContext *s) 1296 +/* save globals to their cannonical location and assume they can be
  1297 + modified be the following code. */
  1298 +static void save_globals(TCGContext *s)
1300 { 1299 {
1301 TCGTemp *ts; 1300 TCGTemp *ts;
1302 int i; 1301 int i;
@@ -1306,9 +1305,22 @@ void tcg_reg_alloc_bb_end(TCGContext *s) @@ -1306,9 +1305,22 @@ void tcg_reg_alloc_bb_end(TCGContext *s)
1306 if (!ts->fixed_reg) { 1305 if (!ts->fixed_reg) {
1307 if (ts->val_type == TEMP_VAL_REG) { 1306 if (ts->val_type == TEMP_VAL_REG) {
1308 tcg_reg_free(s, ts->reg); 1307 tcg_reg_free(s, ts->reg);
  1308 + } else if (ts->val_type == TEMP_VAL_DEAD) {
  1309 + ts->val_type = TEMP_VAL_MEM;
1309 } 1310 }
1310 } 1311 }
1311 } 1312 }
  1313 +}
  1314 +
  1315 +/* at the end of a basic block, we assume all temporaries are dead and
  1316 + all globals are stored at their canonical location */
  1317 +/* XXX: optimize by handling constants in another array ? */
  1318 +void tcg_reg_alloc_bb_end(TCGContext *s)
  1319 +{
  1320 + TCGTemp *ts;
  1321 + int i;
  1322 +
  1323 + save_globals(s);
1312 1324
1313 for(i = s->nb_globals; i < s->nb_temps; i++) { 1325 for(i = s->nb_globals; i < s->nb_temps; i++) {
1314 ts = &s->temps[i]; 1326 ts = &s->temps[i];
@@ -1481,14 +1493,7 @@ static void tcg_reg_alloc_op(TCGContext *s, @@ -1481,14 +1493,7 @@ static void tcg_reg_alloc_op(TCGContext *s,
1481 1493
1482 /* store globals and free associated registers (we assume the insn 1494 /* store globals and free associated registers (we assume the insn
1483 can modify any global. */ 1495 can modify any global. */
1484 - for(i = 0; i < s->nb_globals; i++) {  
1485 - ts = &s->temps[i];  
1486 - if (!ts->fixed_reg) {  
1487 - if (ts->val_type == TEMP_VAL_REG) {  
1488 - tcg_reg_free(s, ts->reg);  
1489 - }  
1490 - }  
1491 - } 1496 + save_globals(s);
1492 } 1497 }
1493 1498
1494 /* satisfy the output constraints */ 1499 /* satisfy the output constraints */
@@ -1680,14 +1685,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, @@ -1680,14 +1685,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
1680 1685
1681 /* store globals and free associated registers (we assume the call 1686 /* store globals and free associated registers (we assume the call
1682 can modify any global. */ 1687 can modify any global. */
1683 - for(i = 0; i < s->nb_globals; i++) {  
1684 - ts = &s->temps[i];  
1685 - if (!ts->fixed_reg) {  
1686 - if (ts->val_type == TEMP_VAL_REG) {  
1687 - tcg_reg_free(s, ts->reg);  
1688 - }  
1689 - }  
1690 - } 1688 + save_globals(s);
1691 1689
1692 tcg_out_op(s, opc, &func_arg, &const_func_arg); 1690 tcg_out_op(s, opc, &func_arg, &const_func_arg);
1693 1691