gimple-ssa-backprop.c (optimize_phi): Do not replace an argument corresponding to...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 9 Feb 2016 17:21:57 +0000 (17:21 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 9 Feb 2016 17:21:57 +0000 (17:21 +0000)
* gimple-ssa-backprop.c (optimize_phi): Do not replace an argument
corresponding to an abnormal edge.

From-SVN: r233248

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

index c4ee0a04f9d8b16808d326f3572d75e2dbb42eaa..9149642baa69656fea28ca4473f0f0c835d88a7f 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 3e64a7010c6efafe44e081a10e7e2eb77b96dce8..d96bccac555f5fedfc5ceb08b1a7e8e672ccd1b6 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)
            {