OSDN Git Service

2009-12-10 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 10 Dec 2009 16:00:57 +0000 (16:00 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 10 Dec 2009 16:00:57 +0000 (16:00 +0000)
PR tree-optimization/42337
* tree-ssa-pre.c (seen_during_translate): Remove.
(phi_translate_1): Collapse into ...
(phi_translate): ... this.  Remove seen parameter and
adjust recursive calls.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155131 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-ssa-pre.c

index d1fd939..b90eb2b 100644 (file)
@@ -1,4 +1,12 @@
 2009-12-10  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/42337
+       * tree-ssa-pre.c (seen_during_translate): Remove.
+       (phi_translate_1): Collapse into ...
+       (phi_translate): ... this.  Remove seen parameter and
+       adjust recursive calls.
+
+2009-12-10  Richard Guenther  <rguenther@suse.de>
        Allan Sandfeld Jensen  <linux@carewolf.com>
 
        * tree-vectorizer.c (vectorize_loops): Properly guard
index b8e999c..52e973f 100644 (file)
@@ -458,9 +458,6 @@ static tree prephitemp;
    cleaned up.  */
 static bitmap need_eh_cleanup;
 
-/* Which expressions have been seen during a given phi translation.  */
-static bitmap seen_during_translate;
-
 /* The phi_translate_table caches phi translations for a given
    expression and predecessor.  */
 
@@ -1435,14 +1432,12 @@ get_representative_for (const pre_expr e)
 
 
 /* Translate EXPR using phis in PHIBLOCK, so that it has the values of
-   the phis in PRED.  SEEN is a bitmap saying which expression we have
-   translated since we started translation of the toplevel expression.
-   Return NULL if we can't find a leader for each part of the
-   translated expression.  */
+   the phis in PRED.  Return NULL if we can't find a leader for each part
+   of the translated expression.  */
 
 static pre_expr
-phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
-                basic_block pred, basic_block phiblock, bitmap seen)
+phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
+              basic_block pred, basic_block phiblock)
 {
   pre_expr oldexpr = expr;
   pre_expr phitrans;
@@ -1457,16 +1452,6 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
   if (phitrans)
     return phitrans;
 
-  /* Prevent cycles when we have recursively dependent leaders.  This
-     can only happen when phi translating the maximal set.  */
-  if (seen)
-    {
-      unsigned int expr_id = get_expression_id (expr);
-      if (bitmap_bit_p (seen, expr_id))
-       return NULL;
-      bitmap_set_bit (seen, expr_id);
-    }
-
   switch (expr->kind)
     {
       /* Constants contain no values that need translation.  */
@@ -1491,16 +1476,9 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
            else
              {
                 pre_expr leader, result;
-                bitmap temp = BITMAP_ALLOC (&grand_bitmap_obstack);
                unsigned int op_val_id = VN_INFO (newnary.op[i])->value_id;
-
-                bitmap_copy (temp, seen);
                leader = find_leader_in_sets (op_val_id, set1, set2);
-                result = phi_translate_1 (leader, set1, set2,
-                                                  pred, phiblock, seen);
-                bitmap_copy (seen, temp);
-                BITMAP_FREE (temp);
-
+                result = phi_translate (leader, set1, set2, pred, phiblock);
                if (result && result != leader)
                  {
                    tree name = get_representative_for (result);
@@ -1602,8 +1580,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
              {
                unsigned int op_val_id = VN_INFO (op0)->value_id;
                leader = find_leader_in_sets (op_val_id, set1, set2);
-               opresult = phi_translate_1 (leader, set1, set2,
-                                           pred, phiblock, seen);
+               opresult = phi_translate (leader, set1, set2, pred, phiblock);
                if (opresult && opresult != leader)
                  {
                    tree name = get_representative_for (opresult);
@@ -1620,8 +1597,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
              {
                unsigned int op_val_id = VN_INFO (op1)->value_id;
                leader = find_leader_in_sets (op_val_id, set1, set2);
-               opresult = phi_translate_1 (leader, set1, set2,
-                                           pred, phiblock, seen);
+               opresult = phi_translate (leader, set1, set2, pred, phiblock);
                if (opresult && opresult != leader)
                  {
                    tree name = get_representative_for (opresult);
@@ -1640,8 +1616,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
              {
                unsigned int op_val_id = VN_INFO (op2)->value_id;
                leader = find_leader_in_sets (op_val_id, set1, set2);
-               opresult = phi_translate_1 (leader, set1, set2,
-                                           pred, phiblock, seen);
+               opresult = phi_translate (leader, set1, set2, pred, phiblock);
                if (opresult && opresult != leader)
                  {
                    tree name = get_representative_for (opresult);
@@ -1797,20 +1772,6 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
     }
 }
 
-/* Translate EXPR using phis in PHIBLOCK, so that it has the values of
-   the phis in PRED.
-   Return NULL if we can't find a leader for each part of the
-   translated expression.  */
-
-static pre_expr
-phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
-              basic_block pred, basic_block phiblock)
-{
-  bitmap_clear (seen_during_translate);
-  return phi_translate_1 (expr, set1, set2, pred, phiblock,
-                         seen_during_translate);
-}
-
 /* For each expression in SET, translate the values through phi nodes
    in PHIBLOCK using edge PHIBLOCK->PRED, and store the resulting
    expressions in DEST.  */
@@ -4520,7 +4481,6 @@ init_pre (bool do_fre)
   expression_to_id = htab_create (num_ssa_names * 3,
                                  pre_expr_hash,
                                  pre_expr_eq, NULL);
-  seen_during_translate = BITMAP_ALLOC (&grand_bitmap_obstack);
   bitmap_set_pool = create_alloc_pool ("Bitmap sets",
                                       sizeof (struct bitmap_set), 30);
   pre_expr_pool = create_alloc_pool ("pre_expr nodes",