aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2016-02-09 17:21:57 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2016-02-09 17:21:57 +0000
commita864ad5ba2501dd2157fd2512ebf00b3d529f921 (patch)
tree3d14d10508e1d4a7e5509b5718d3106975df3043
parentf10208b8e92668673de666c863b3db1834f62f09 (diff)
downloadgcc-a864ad5ba2501dd2157fd2512ebf00b3d529f921.zip
gcc-a864ad5ba2501dd2157fd2512ebf00b3d529f921.tar.gz
gcc-a864ad5ba2501dd2157fd2512ebf00b3d529f921.tar.bz2
gimple-ssa-backprop.c (optimize_phi): Do not replace an argument corresponding to an abnormal edge.
* gimple-ssa-backprop.c (optimize_phi): Do not replace an argument corresponding to an abnormal edge. From-SVN: r233248
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gimple-ssa-backprop.c10
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c4ee0a0..9149642 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/gimple-ssa-backprop.c b/gcc/gimple-ssa-backprop.c
index 3e64a70..d96bcca 100644
--- a/gcc/gimple-ssa-backprop.c
+++ b/gcc/gimple-ssa-backprop.c
@@ -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)
{