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)