diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2016-02-09 17:21:57 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2016-02-09 17:21:57 +0000 |
commit | a864ad5ba2501dd2157fd2512ebf00b3d529f921 (patch) | |
tree | 3d14d10508e1d4a7e5509b5718d3106975df3043 | |
parent | f10208b8e92668673de666c863b3db1834f62f09 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/gimple-ssa-backprop.c | 10 |
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) { |