https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77498
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- Ok, so given we can't have PRE do as good as predcom and a "cost model" for PRE is out of the question for GCC 7 the following dumbs down PRE again. It does so in the very much simplest way rather than trying to block this only during elimination / insertion. This should be definitely revisited for GCC 8. Index: gcc/tree-ssa-pre.c =================================================================== --- gcc/tree-ssa-pre.c (revision 246026) +++ gcc/tree-ssa-pre.c (working copy) @@ -1468,10 +1468,20 @@ phi_translate_1 (pre_expr expr, bitmap_s leader for it. */ if (constant->kind != CONSTANT) { - unsigned value_id = get_expr_value_id (constant); - constant = find_leader_in_sets (value_id, set1, set2); - if (constant) - return constant; + /* Do not allow simplifications to non-constants over + backedges as this will likely result in a loop PHI node + to be inserted and increased register pressure. + See PR77498 - this avoids doing predcoms work in + a less efficient way. */ + if (find_edge (pred, phiblock)->flags & EDGE_DFS_BACK) + ; + else + { + unsigned value_id = get_expr_value_id (constant); + constant = find_leader_in_sets (value_id, set1, set2); + if (constant) + return constant; + } } else return constant;