diff options
author | Richard Biener <rguenther@suse.de> | 2017-03-30 07:15:39 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-03-30 07:15:39 +0000 |
commit | 28c024077899ff4bad1fbce2d38fa8b5709272ef (patch) | |
tree | 38df20abe28191bb91f3ec3d687054afe48af750 /gcc/tree-ssa-pre.c | |
parent | e0aa80e05e24176051ef644856dd25784344308a (diff) | |
download | gcc-28c024077899ff4bad1fbce2d38fa8b5709272ef.zip gcc-28c024077899ff4bad1fbce2d38fa8b5709272ef.tar.gz gcc-28c024077899ff4bad1fbce2d38fa8b5709272ef.tar.bz2 |
re PR tree-optimization/77498 (Performance drop after r239414 on spec2000/172mgrid)
2017-03-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/77498
* tree-ssa-pre.c (phi_translate_1): Do not allow simplifications
to non-constants over backedges.
* gfortran.dg/pr77498.f: New testcase.
From-SVN: r246583
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index ff59d53..c6aa587 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1468,10 +1468,20 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, 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; |