Fix PR tree-optimization/15979 Fix PR tree-optimization/15981
authorDaniel Berlin <dberlin@dberlin.org>
Mon, 14 Jun 2004 01:27:57 +0000 (01:27 +0000)
committerDaniel Berlin <dberlin@gcc.gnu.org>
Mon, 14 Jun 2004 01:27:57 +0000 (01:27 +0000)
2004-06-13  Daniel Berlin  <dberlin@dberlin.org>

Fix PR tree-optimization/15979
Fix PR tree-optimization/15981
* tree-ssa-pre.c (insert_aux): Fix faulty logic so that we don't
try to insert values undefined along some path.

From-SVN: r83076

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

index 54fe05f4f02e6b62030edee61f6387a4bbd1fae7..a548afb6f30e119219213bb244448108177d9643 100644 (file)
@@ -1,3 +1,10 @@
+2004-06-13  Daniel Berlin  <dberlin@dberlin.org>
+
+       Fix PR tree-optimization/15979
+       Fix PR tree-optimization/15981
+       * tree-ssa-pre.c (insert_aux): Fix faulty logic so that we don't
+       try to insert values undefined along some path.
+
 2004-06-13  Daniel Berlin  <dberlin@dberlin.org>
 
        * tree-ssa-pre.c (add_to_value): is_gimple_min_invariant things
index b0d42ff05f30d5d89a01eff110da6f2a92f80d32..c2853296cf5ad38de630155ea5173d2270b4a6ba 100644 (file)
@@ -1279,6 +1279,8 @@ insert_aux (basic_block block)
                      edge pred;
                      basic_block bprime;
                      tree eprime;
+                     bool cant_insert = false;
+
                      val = get_value_handle (node->expr);
                      if (set_contains_value (PHI_GEN (block), val))
                        continue; 
@@ -1288,9 +1290,8 @@ insert_aux (basic_block block)
                            fprintf (dump_file, "Found fully redundant value\n");
                          continue;
                        }
-                   
-                   
-                      avail = xcalloc (last_basic_block, sizeof (tree));
+                                   
+                     avail = xcalloc (last_basic_block, sizeof (tree));
                      for (pred = block->pred;
                           pred;
                           pred = pred->pred_next)
@@ -1301,8 +1302,21 @@ insert_aux (basic_block block)
                          eprime = phi_translate (node->expr,
                                                  ANTIC_IN (block),
                                                  bprime, block);
+
+                         /* eprime will generally only be NULL if the
+                            value of the expression, translated
+                            through the PHI for this predecessor, is
+                            undefined.  If that is the case, we can't
+                            make the expression fully redundant,
+                            because its value is undefined along a
+                            predecessor path.  We can thus break out
+                            early because it doesn't matter what the
+                            rest of the results are.  */
                          if (eprime == NULL)
-                           continue;
+                           {
+                             cant_insert = true;
+                             break;
+                           }
 
                          vprime = get_value_handle (eprime);
                          if (!vprime)
@@ -1328,7 +1342,7 @@ insert_aux (basic_block block)
                            }
                        }
 
-                     if (!all_same && by_some)
+                     if (!cant_insert && !all_same && by_some)
                        {
                          tree temp;
                          tree type = TREE_TYPE (avail[block->pred->src->index]);