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 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 1300 TCGTemp *ts;
1302 1301 int i;
... ... @@ -1306,9 +1305,22 @@ void tcg_reg_alloc_bb_end(TCGContext *s)
1306 1305 if (!ts->fixed_reg) {
1307 1306 if (ts->val_type == TEMP_VAL_REG) {
1308 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 1325 for(i = s->nb_globals; i < s->nb_temps; i++) {
1314 1326 ts = &s->temps[i];
... ... @@ -1481,14 +1493,7 @@ static void tcg_reg_alloc_op(TCGContext *s,
1481 1493  
1482 1494 /* store globals and free associated registers (we assume the insn
1483 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 1499 /* satisfy the output constraints */
... ... @@ -1680,14 +1685,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
1680 1685  
1681 1686 /* store globals and free associated registers (we assume the call
1682 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 1690 tcg_out_op(s, opc, &func_arg, &const_func_arg);
1693 1691  
... ...