+2018-09-19 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/87349
+ PR tree-optimization/87342
+ * gcc.dg/torture/pr87349-1.c: New testcase.
+ * gcc.dg/torture/pr87349-2.c: Likewise.
+ * gcc.dg/torture/pr87342.c: Likewise.
+
2018-09-18 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/29550
vn_valueize = rpo_vn_valueize;
/* Initialize the unwind state and edge/BB executable state. */
+ bool need_max_rpo_iterate = false;
for (int i = 0; i < n; ++i)
{
basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
if (e->flags & EDGE_DFS_BACK)
has_backedges = true;
e->flags &= ~EDGE_EXECUTABLE;
- if (e == entry)
+ if (iterate || e == entry)
continue;
if (bb_to_rpo[e->src->index] > i)
- rpo_state[i].max_rpo = MAX (rpo_state[i].max_rpo,
- bb_to_rpo[e->src->index]);
+ {
+ rpo_state[i].max_rpo = MAX (rpo_state[i].max_rpo,
+ bb_to_rpo[e->src->index]);
+ need_max_rpo_iterate = true;
+ }
else
rpo_state[i].max_rpo
= MAX (rpo_state[i].max_rpo,
entry->flags |= EDGE_EXECUTABLE;
entry->dest->flags |= BB_EXECUTABLE;
+ /* When there are irreducible regions the simplistic max_rpo computation
+ above for the case of backedges doesn't work and we need to iterate
+ until there are no more changes. */
+ unsigned nit = 0;
+ while (need_max_rpo_iterate)
+ {
+ nit++;
+ need_max_rpo_iterate = false;
+ for (int i = 0; i < n; ++i)
+ {
+ basic_block bb = BASIC_BLOCK_FOR_FN (fn, rpo[i]);
+ edge e;
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ {
+ if (e == entry)
+ continue;
+ int max_rpo = MAX (rpo_state[i].max_rpo,
+ rpo_state[bb_to_rpo[e->src->index]].max_rpo);
+ if (rpo_state[i].max_rpo != max_rpo)
+ {
+ rpo_state[i].max_rpo = max_rpo;
+ need_max_rpo_iterate = true;
+ }
+ }
+ }
+ }
+ statistics_histogram_event (cfun, "RPO max_rpo iterations", nit);
+
/* As heuristic to improve compile-time we handle only the N innermost
loops and the outermost one optimistically. */
if (iterate)