Mercurial > hg > CbC > CbC_gcc
comparison gcc/tree-ssa-pre.c @ 48:9907f3135723
update CbC on GCC from 4.4.2 to 4.4.3.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 07 Feb 2010 17:48:31 +0900 |
parents | 3bfb6c00c1e0 |
children | 77e2b8dfacca |
comparison
equal
deleted
inserted
replaced
45:d645ac0f55d6 | 48:9907f3135723 |
---|---|
450 static tree prephitemp; | 450 static tree prephitemp; |
451 | 451 |
452 /* Set of blocks with statements that have had its EH information | 452 /* Set of blocks with statements that have had its EH information |
453 cleaned up. */ | 453 cleaned up. */ |
454 static bitmap need_eh_cleanup; | 454 static bitmap need_eh_cleanup; |
455 | |
456 /* Which expressions have been seen during a given phi translation. */ | |
457 static bitmap seen_during_translate; | |
458 | 455 |
459 /* The phi_translate_table caches phi translations for a given | 456 /* The phi_translate_table caches phi translations for a given |
460 expression and predecessor. */ | 457 expression and predecessor. */ |
461 | 458 |
462 static htab_t phi_translate_table; | 459 static htab_t phi_translate_table; |
1398 | 1395 |
1399 | 1396 |
1400 | 1397 |
1401 | 1398 |
1402 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of | 1399 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of |
1403 the phis in PRED. SEEN is a bitmap saying which expression we have | 1400 the phis in PRED. Return NULL if we can't find a leader for each part |
1404 translated since we started translation of the toplevel expression. | 1401 of the translated expression. */ |
1405 Return NULL if we can't find a leader for each part of the | |
1406 translated expression. */ | |
1407 | 1402 |
1408 static pre_expr | 1403 static pre_expr |
1409 phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, | 1404 phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, |
1410 basic_block pred, basic_block phiblock, bitmap seen) | 1405 basic_block pred, basic_block phiblock) |
1411 { | 1406 { |
1412 pre_expr oldexpr = expr; | 1407 pre_expr oldexpr = expr; |
1413 pre_expr phitrans; | 1408 pre_expr phitrans; |
1414 | 1409 |
1415 if (!expr) | 1410 if (!expr) |
1419 return expr; | 1414 return expr; |
1420 | 1415 |
1421 phitrans = phi_trans_lookup (expr, pred); | 1416 phitrans = phi_trans_lookup (expr, pred); |
1422 if (phitrans) | 1417 if (phitrans) |
1423 return phitrans; | 1418 return phitrans; |
1424 | |
1425 /* Prevent cycles when we have recursively dependent leaders. This | |
1426 can only happen when phi translating the maximal set. */ | |
1427 if (seen) | |
1428 { | |
1429 unsigned int expr_id = get_expression_id (expr); | |
1430 if (bitmap_bit_p (seen, expr_id)) | |
1431 return NULL; | |
1432 bitmap_set_bit (seen, expr_id); | |
1433 } | |
1434 | 1419 |
1435 switch (expr->kind) | 1420 switch (expr->kind) |
1436 { | 1421 { |
1437 /* Constants contain no values that need translation. */ | 1422 /* Constants contain no values that need translation. */ |
1438 case CONSTANT: | 1423 case CONSTANT: |
1453 { | 1438 { |
1454 if (TREE_CODE (newnary.op[i]) != SSA_NAME) | 1439 if (TREE_CODE (newnary.op[i]) != SSA_NAME) |
1455 continue; | 1440 continue; |
1456 else | 1441 else |
1457 { | 1442 { |
1443 pre_expr leader, result; | |
1458 unsigned int op_val_id = VN_INFO (newnary.op[i])->value_id; | 1444 unsigned int op_val_id = VN_INFO (newnary.op[i])->value_id; |
1459 pre_expr leader = find_leader_in_sets (op_val_id, set1, set2); | 1445 leader = find_leader_in_sets (op_val_id, set1, set2); |
1460 pre_expr result = phi_translate_1 (leader, set1, set2, | 1446 result = phi_translate (leader, set1, set2, pred, phiblock); |
1461 pred, phiblock, seen); | |
1462 if (result && result != leader) | 1447 if (result && result != leader) |
1463 { | 1448 { |
1464 tree name = get_representative_for (result); | 1449 tree name = get_representative_for (result); |
1465 if (!name) | 1450 if (!name) |
1466 return NULL; | 1451 return NULL; |
1557 | 1542 |
1558 if (op0 && TREE_CODE (op0) == SSA_NAME) | 1543 if (op0 && TREE_CODE (op0) == SSA_NAME) |
1559 { | 1544 { |
1560 unsigned int op_val_id = VN_INFO (op0)->value_id; | 1545 unsigned int op_val_id = VN_INFO (op0)->value_id; |
1561 leader = find_leader_in_sets (op_val_id, set1, set2); | 1546 leader = find_leader_in_sets (op_val_id, set1, set2); |
1562 opresult = phi_translate_1 (leader, set1, set2, | 1547 opresult = phi_translate (leader, set1, set2, pred, phiblock); |
1563 pred, phiblock, seen); | |
1564 if (opresult && opresult != leader) | 1548 if (opresult && opresult != leader) |
1565 { | 1549 { |
1566 tree name = get_representative_for (opresult); | 1550 tree name = get_representative_for (opresult); |
1567 if (!name) | 1551 if (!name) |
1568 break; | 1552 break; |
1575 | 1559 |
1576 if (op1 && TREE_CODE (op1) == SSA_NAME) | 1560 if (op1 && TREE_CODE (op1) == SSA_NAME) |
1577 { | 1561 { |
1578 unsigned int op_val_id = VN_INFO (op1)->value_id; | 1562 unsigned int op_val_id = VN_INFO (op1)->value_id; |
1579 leader = find_leader_in_sets (op_val_id, set1, set2); | 1563 leader = find_leader_in_sets (op_val_id, set1, set2); |
1580 opresult = phi_translate_1 (leader, set1, set2, | 1564 opresult = phi_translate (leader, set1, set2, pred, phiblock); |
1581 pred, phiblock, seen); | |
1582 if (opresult && opresult != leader) | 1565 if (opresult && opresult != leader) |
1583 { | 1566 { |
1584 tree name = get_representative_for (opresult); | 1567 tree name = get_representative_for (opresult); |
1585 if (!name) | 1568 if (!name) |
1586 break; | 1569 break; |
1592 changed |= op1 != oldop1; | 1575 changed |= op1 != oldop1; |
1593 if (op2 && TREE_CODE (op2) == SSA_NAME) | 1576 if (op2 && TREE_CODE (op2) == SSA_NAME) |
1594 { | 1577 { |
1595 unsigned int op_val_id = VN_INFO (op2)->value_id; | 1578 unsigned int op_val_id = VN_INFO (op2)->value_id; |
1596 leader = find_leader_in_sets (op_val_id, set1, set2); | 1579 leader = find_leader_in_sets (op_val_id, set1, set2); |
1597 opresult = phi_translate_1 (leader, set1, set2, | 1580 opresult = phi_translate (leader, set1, set2, pred, phiblock); |
1598 pred, phiblock, seen); | |
1599 if (opresult && opresult != leader) | 1581 if (opresult && opresult != leader) |
1600 { | 1582 { |
1601 tree name = get_representative_for (opresult); | 1583 tree name = get_representative_for (opresult); |
1602 if (!name) | 1584 if (!name) |
1603 break; | 1585 break; |
1722 default: | 1704 default: |
1723 gcc_unreachable (); | 1705 gcc_unreachable (); |
1724 } | 1706 } |
1725 } | 1707 } |
1726 | 1708 |
1727 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of | |
1728 the phis in PRED. | |
1729 Return NULL if we can't find a leader for each part of the | |
1730 translated expression. */ | |
1731 | |
1732 static pre_expr | |
1733 phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, | |
1734 basic_block pred, basic_block phiblock) | |
1735 { | |
1736 bitmap_clear (seen_during_translate); | |
1737 return phi_translate_1 (expr, set1, set2, pred, phiblock, | |
1738 seen_during_translate); | |
1739 } | |
1740 | |
1741 /* For each expression in SET, translate the values through phi nodes | 1709 /* For each expression in SET, translate the values through phi nodes |
1742 in PHIBLOCK using edge PHIBLOCK->PRED, and store the resulting | 1710 in PHIBLOCK using edge PHIBLOCK->PRED, and store the resulting |
1743 expressions in DEST. */ | 1711 expressions in DEST. */ |
1744 | 1712 |
1745 static void | 1713 static void |
1748 { | 1716 { |
1749 VEC (pre_expr, heap) *exprs; | 1717 VEC (pre_expr, heap) *exprs; |
1750 pre_expr expr; | 1718 pre_expr expr; |
1751 int i; | 1719 int i; |
1752 | 1720 |
1753 if (!phi_nodes (phiblock)) | 1721 if (gimple_seq_empty_p (phi_nodes (phiblock))) |
1754 { | 1722 { |
1755 bitmap_set_copy (dest, set); | 1723 bitmap_set_copy (dest, set); |
1756 return; | 1724 return; |
1757 } | 1725 } |
1758 | 1726 |
2130 changed = true; | 2098 changed = true; |
2131 VEC_free (basic_block, heap, worklist); | 2099 VEC_free (basic_block, heap, worklist); |
2132 goto maybe_dump_sets; | 2100 goto maybe_dump_sets; |
2133 } | 2101 } |
2134 | 2102 |
2135 if (phi_nodes (first)) | 2103 if (!gimple_seq_empty_p (phi_nodes (first))) |
2136 phi_translate_set (ANTIC_OUT, ANTIC_IN (first), block, first); | 2104 phi_translate_set (ANTIC_OUT, ANTIC_IN (first), block, first); |
2137 else | 2105 else |
2138 bitmap_set_copy (ANTIC_OUT, ANTIC_IN (first)); | 2106 bitmap_set_copy (ANTIC_OUT, ANTIC_IN (first)); |
2139 | 2107 |
2140 for (i = 0; VEC_iterate (basic_block, worklist, i, bprime); i++) | 2108 for (i = 0; VEC_iterate (basic_block, worklist, i, bprime); i++) |
2141 { | 2109 { |
2142 if (phi_nodes (bprime)) | 2110 if (!gimple_seq_empty_p (phi_nodes (bprime))) |
2143 { | 2111 { |
2144 bitmap_set_t tmp = bitmap_set_new (); | 2112 bitmap_set_t tmp = bitmap_set_new (); |
2145 phi_translate_set (tmp, ANTIC_IN (bprime), block, bprime); | 2113 phi_translate_set (tmp, ANTIC_IN (bprime), block, bprime); |
2146 bitmap_set_and (ANTIC_OUT, tmp); | 2114 bitmap_set_and (ANTIC_OUT, tmp); |
2147 bitmap_set_free (tmp); | 2115 bitmap_set_free (tmp); |
2287 bitmap_iterator bi; | 2255 bitmap_iterator bi; |
2288 | 2256 |
2289 FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (bprime), i, bi) | 2257 FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (bprime), i, bi) |
2290 bitmap_value_insert_into_set (PA_OUT, | 2258 bitmap_value_insert_into_set (PA_OUT, |
2291 expression_for_id (i)); | 2259 expression_for_id (i)); |
2292 if (phi_nodes (bprime)) | 2260 if (!gimple_seq_empty_p (phi_nodes (bprime))) |
2293 { | 2261 { |
2294 bitmap_set_t pa_in = bitmap_set_new (); | 2262 bitmap_set_t pa_in = bitmap_set_new (); |
2295 phi_translate_set (pa_in, PA_IN (bprime), block, bprime); | 2263 phi_translate_set (pa_in, PA_IN (bprime), block, bprime); |
2296 FOR_EACH_EXPR_ID_IN_SET (pa_in, i, bi) | 2264 FOR_EACH_EXPR_ID_IN_SET (pa_in, i, bi) |
2297 bitmap_value_insert_into_set (PA_OUT, | 2265 bitmap_value_insert_into_set (PA_OUT, |
4144 phi_translate_table = htab_create (5110, expr_pred_trans_hash, | 4112 phi_translate_table = htab_create (5110, expr_pred_trans_hash, |
4145 expr_pred_trans_eq, free); | 4113 expr_pred_trans_eq, free); |
4146 expression_to_id = htab_create (num_ssa_names * 3, | 4114 expression_to_id = htab_create (num_ssa_names * 3, |
4147 pre_expr_hash, | 4115 pre_expr_hash, |
4148 pre_expr_eq, NULL); | 4116 pre_expr_eq, NULL); |
4149 seen_during_translate = BITMAP_ALLOC (&grand_bitmap_obstack); | |
4150 bitmap_set_pool = create_alloc_pool ("Bitmap sets", | 4117 bitmap_set_pool = create_alloc_pool ("Bitmap sets", |
4151 sizeof (struct bitmap_set), 30); | 4118 sizeof (struct bitmap_set), 30); |
4152 pre_expr_pool = create_alloc_pool ("pre_expr nodes", | 4119 pre_expr_pool = create_alloc_pool ("pre_expr nodes", |
4153 sizeof (struct pre_expr_d), 30); | 4120 sizeof (struct pre_expr_d), 30); |
4154 FOR_ALL_BB (bb) | 4121 FOR_ALL_BB (bb) |