tree-ssa-loop-manip.c (split_loop_exit_edge): Handle non-ssaname arguments of the...
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Sun, 12 Sep 2004 20:20:58 +0000 (22:20 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sun, 12 Sep 2004 20:20:58 +0000 (20:20 +0000)
* tree-ssa-loop-manip.c (split_loop_exit_edge): Handle non-ssaname
arguments of the phi nodes correctly.

From-SVN: r87405

gcc/ChangeLog
gcc/tree-ssa-loop-manip.c

index cea290af667ce269e48e59daf61b10901443e622..59d386e5318d51e9821ab989160f9c7902d9fbe0 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-12  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       * tree-ssa-loop-manip.c (split_loop_exit_edge): Handle non-ssaname
+       arguments of the phi nodes correctly.
+
 2004-09-12  Jan Hubicka  <jh@suse.cz>
 
        * ggc-common.c (cmp_statistics): Fix sorting.
index cde3ce8fb4d80e4ca8d017f4943ebb57c2b9c7df..e6ff8a80559628d5d5dfb617b5565c8e2b7dfbcb 100644 (file)
@@ -395,17 +395,26 @@ split_loop_exit_edge (edge exit)
 {
   basic_block dest = exit->dest;
   basic_block bb = loop_split_edge_with (exit, NULL);
-  tree phi, new_phi, new_name;
+  tree phi, new_phi, new_name, name;
   use_operand_p op_p;
 
   for (phi = phi_nodes (dest); phi; phi = TREE_CHAIN (phi))
     {
       op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, bb->succ);
 
-      new_name = duplicate_ssa_name (USE_FROM_PTR (op_p), NULL);
+      name = USE_FROM_PTR (op_p);
+
+      /* If the argument of the phi node is a constant, we do not need
+        to keep it inside loop.  */
+      if (TREE_CODE (name) != SSA_NAME)
+       continue;
+
+      /* Otherwise create an auxiliary phi node that will copy the value
+        of the ssa name out of the loop.  */
+      new_name = duplicate_ssa_name (name, NULL);
       new_phi = create_phi_node (new_name, bb);
       SSA_NAME_DEF_STMT (new_name) = new_phi;
-      add_phi_arg (&new_phi, USE_FROM_PTR (op_p), exit);
+      add_phi_arg (&new_phi, name, exit);
       SET_USE (op_p, new_name);
     }
 }