https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84061
Bug ID: 84061 Summary: [8 Regression] gcc.dg/tree-ssa/loop-15.c XFAIL Product: gcc Version: 8.0 Status: UNCONFIRMED Keywords: missed-optimization, xfail Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org Target Milestone: --- After r257077 we fail to fold (int) ((unsigned int) n_5 + 4294967295) * n_5 + n_5 to n_5 * n_5. Before the rev. we managed to fold to (int)((unsigned)n_5 * (unsigned)n_5) via fold_plusminus_mult_expr. The rev. contains everything necessary to fold this during late VRP to n_5 * n_5 but the substitute-and-fold engine doesn't fold all stmts. The following fixes this regression: Index: gcc/tree-ssa-propagate.c =================================================================== --- gcc/tree-ssa-propagate.c (revision 257048) +++ gcc/tree-ssa-propagate.c (working copy) @@ -1056,13 +1056,17 @@ substitute_and_fold_dom_walker::before_d && gimple_call_noreturn_p (stmt)); /* Replace real uses in the statement. */ - did_replace |= substitute_and_fold_engine->replace_uses_in (stmt); + if (substitute_and_fold_engine->replace_uses_in (stmt)) + { + did_replace = true; + gimple_set_modified (stmt, true); + } - /* If we made a replacement, fold the statement. */ - if (did_replace) + /* Fold the statement. */ + if (fold_stmt (&i, follow_single_use_edges)) { - fold_stmt (&i, follow_single_use_edges); stmt = gsi_stmt (i); + did_replace = true; gimple_set_modified (stmt, true); } queued for GCC 9.