aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-propagate.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-07-29 09:59:01 +0200
committerRichard Biener <rguenther@suse.de>2020-07-29 12:34:29 +0200
commit8e8792a347c87dbb82b4cf75ec3452bc5cd1d3db (patch)
treedbdb0c30128a41f48623c05e8b7dbc42641df2d8 /gcc/tree-ssa-propagate.c
parent6de5600a8bd1ef0ad3d57670efdcc68bb3484276 (diff)
downloadgcc-8e8792a347c87dbb82b4cf75ec3452bc5cd1d3db.zip
gcc-8e8792a347c87dbb82b4cf75ec3452bc5cd1d3db.tar.gz
gcc-8e8792a347c87dbb82b4cf75ec3452bc5cd1d3db.tar.bz2
tree-optimization/95679 - properly signal changes from propagate_into_phi_args
This restores a lost setting of something_changed with the recent refactoring of the substitute and fold engine. The reported ICE in the PR was meanwhile mitigated in other ways but the issue can still result in missed optimizations via failed runs of CFG cleanup. 2020-07-29 Richard Biener <rguenther@suse.de> PR tree-optimization/95679 * tree-ssa-propagate.h (substitute_and_fold_engine::propagate_into_phi_args): Return whether anything changed. * tree-ssa-propagate.c (substitute_and_fold_engine::propagate_into_phi_args): Likewise. (substitute_and_fold_dom_walker::before_dom_children): Update something_changed.
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r--gcc/tree-ssa-propagate.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index 01ee7fd..1e05728 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -1017,11 +1017,13 @@ substitute_and_fold_dom_walker::foreach_new_stmt_in_bb
}
}
-void
+bool
substitute_and_fold_engine::propagate_into_phi_args (basic_block bb)
{
edge e;
edge_iterator ei;
+ bool propagated = false;
+
/* Visit BB successor PHI nodes and replace PHI args. */
FOR_EACH_EDGE (e, ei, bb->succs)
{
@@ -1035,11 +1037,16 @@ substitute_and_fold_engine::propagate_into_phi_args (basic_block bb)
|| virtual_operand_p (arg))
continue;
tree val = get_value (arg, phi);
- if (val && is_gimple_min_invariant (val)
+ if (val
+ && is_gimple_min_invariant (val)
&& may_propagate_copy (arg, val))
- propagate_value (use_p, val);
+ {
+ propagate_value (use_p, val);
+ propagated = true;
+ }
}
}
+ return propagated;
}
edge
@@ -1229,7 +1236,7 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb)
}
}
- substitute_and_fold_engine->propagate_into_phi_args (bb);
+ something_changed |= substitute_and_fold_engine->propagate_into_phi_args (bb);
return NULL;
}