* gimple-ssa-backprop.c (optimize_phi): Do not replace an argument
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Feb 2016 17:21:57 +0000 (17:21 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Feb 2016 17:21:57 +0000 (17:21 +0000)
corresponding to an abnormal edge.

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

gcc/ChangeLog
gcc/gimple-ssa-backprop.c

index c4ee0a0..9149642 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gimple-ssa-backprop.c (optimize_phi): Do not replace an argument
+       corresponding to an abnormal edge.
+
 2016-02-09  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/69599
index 3e64a70..d96bcca 100644 (file)
@@ -831,15 +831,21 @@ backprop::optimize_assign (gassign *assign, tree lhs, const usage_info *info)
 void
 backprop::optimize_phi (gphi *phi, tree var, const usage_info *info)
 {
-  /* If the sign of the result doesn't matter, strip sign operations
-     from all arguments.  */
+  /* If the sign of the result doesn't matter, try to strip sign operations
+     from arguments.  */
   if (info->flags.ignore_sign)
     {
+      basic_block bb = gimple_bb (phi);
       use_operand_p use;
       ssa_op_iter oi;
       bool replaced = false;
       FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
        {
+         /* Propagating along abnormal edges is delicate, punt for now.  */
+         const int index = PHI_ARG_INDEX_FROM_USE (use);
+         if (EDGE_PRED (bb, index)->flags & EDGE_ABNORMAL)
+           continue;
+
          tree new_arg = strip_sign_op (USE_FROM_PTR (use));
          if (new_arg)
            {