re PR middle-end/49465 (Revision 175114 miscompiled 403.gcc in SPEC CPU 2006)
authorJeff Law <law@redhat.com>
Thu, 23 Jun 2011 20:26:07 +0000 (14:26 -0600)
committerJeff Law <law@gcc.gnu.org>
Thu, 23 Jun 2011 20:26:07 +0000 (14:26 -0600)
PR middle-end/49465
* tree-ssa-threadupate.c (fix_duplicate_block_edges): Fix condition
to detect threading through joiner block.  If there was already
an edge to the new target, then do not change the PHI nodes.

*************** fix_duplicate_block_edges (struct redire

From-SVN: r175351

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

index fad096696688c80be5ddbb5d434a518f4174c083..d5c6ee59b79dd77a6f4f42f9c497914fec2dc5d5 100644 (file)
@@ -1,3 +1,10 @@
+2011-06-16  Jeff Law  <law@redhat.com>
+
+       PR middle-end/49465
+       * tree-ssa-threadupate.c (fix_duplicate_block_edges): Fix condition
+       to detect threading through joiner block.  If there was already
+       an edge to the new target, then do not change the PHI nodes.
+
 2011-06-23  Jakub Jelinek  <jakub@redhat.com>
 
        * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Use
index e0335dc8c106481924c7613206b8a3759f46f2c5..0cdf8466ddb0be9d8bcb5c4523a8dbcb759b76ab 100644 (file)
@@ -385,7 +385,7 @@ fix_duplicate_block_edges (struct redirection_data *rd,
      to keep its control statement and redirect an outgoing edge.
      Else we want to remove the control statement & edges, then create
      a new outgoing edge.  In both cases we may need to update PHIs.  */
-  if (THREAD_TARGET2 (rd->incoming_edges->e) == rd->outgoing_edge)
+  if (THREAD_TARGET2 (rd->incoming_edges->e))
     {
       edge victim;
       edge e2;
@@ -400,8 +400,11 @@ fix_duplicate_block_edges (struct redirection_data *rd,
       victim = find_edge (rd->dup_block, THREAD_TARGET (e)->dest);
       e2 = redirect_edge_and_branch (victim, THREAD_TARGET2 (e)->dest);
 
-      /* This updates the PHI at the target of the threaded edge.  */
-      copy_phi_args (e2->dest, THREAD_TARGET2 (e), e2);
+      /* If we redirected the edge, then we need to copy PHI arguments
+        at the target.  If the edge already existed (e2 != victim case),
+        then the PHIs in the target already have the correct arguments.  */
+      if (e2 == victim)
+       copy_phi_args (e2->dest, THREAD_TARGET2 (e), e2);
     }
   else
     {