diff options
author | Richard Biener <rguenther@suse.de> | 2016-11-25 10:22:57 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-11-25 10:22:57 +0000 |
commit | 59ec925b1199f9777d0d10be46251516f774b214 (patch) | |
tree | 55f77a216d9ec3e9a34f6aafdd73a26855b05273 /gcc | |
parent | 4741b062d65c4af37eba4b1ba5bba11bc95256e1 (diff) | |
download | gcc-59ec925b1199f9777d0d10be46251516f774b214.zip gcc-59ec925b1199f9777d0d10be46251516f774b214.tar.gz gcc-59ec925b1199f9777d0d10be46251516f774b214.tar.bz2 |
re PR tree-optimization/78343 (Loop is not eliminated)
2016-11-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/78343
* passes.def: Add CD-DCE pass after loop splitting.
* tree-ssa-dce.c (find_obviously_necessary_stmts): Move
SCEV init/finalize ...
(perform_tree_ssa_dce): ... here. Deal with being
executed inside the loop pipeline in aggressive mode.
* gcc.dg/tree-ssa/sccp-2.c: New testcase.
* gcc.dg/autopar/uns-outer-6.c: Adjust.
* gcc.dg/tree-ssa/20030808-1.c: Likewise.
* gcc.dg/tree-ssa/20040305-1.c: Likewise.
* gcc.dg/vect/pr38529.c: Likewise.
From-SVN: r242872
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/passes.def | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/autopar/uns-outer-6.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr38529.c | 4 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 21 |
9 files changed, 53 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9e2c4ff..9681566 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-11-24 Richard Biener <rguenther@suse.de> + + PR tree-optimization/78343 + * passes.def: Add CD-DCE pass after loop splitting. + * tree-ssa-dce.c (find_obviously_necessary_stmts): Move + SCEV init/finalize ... + (perform_tree_ssa_dce): ... here. Deal with being + executed inside the loop pipeline in aggressive mode. + 2016-11-25 Thomas Preud'homme <thomas.preudhomme@arm.com> * tree-ssa-math-opts.c (struct symbolic_number): Improve comment. diff --git a/gcc/passes.def b/gcc/passes.def index b730009..1117b8b 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -272,6 +272,9 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_tree_unswitch); NEXT_PASS (pass_scev_cprop); NEXT_PASS (pass_loop_split); + /* All unswitching, final value replacement and splitting can expose + empty loops. Remove them now. */ + NEXT_PASS (pass_cd_dce); NEXT_PASS (pass_record_bounds); NEXT_PASS (pass_loop_distribution); NEXT_PASS (pass_copy_prop); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e1aace..7072950 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2016-11-24 Richard Biener <rguenther@suse.de> + + PR tree-optimization/78343 + * gcc.dg/tree-ssa/sccp-2.c: New testcase. + * gcc.dg/autopar/uns-outer-6.c: Adjust. + * gcc.dg/tree-ssa/20030808-1.c: Likewise. + * gcc.dg/tree-ssa/20040305-1.c: Likewise. + * gcc.dg/vect/pr38529.c: Likewise. + 2016-11-25 Thomas Preud'homme <thomas.preudhomme@arm.com> PR tree-optimization/77673 diff --git a/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c b/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c index dc2870b..12bd397 100644 --- a/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c +++ b/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c @@ -25,7 +25,7 @@ parloop (int N) for (i = 0; i < N; i++) { for (j = 0; j < N; j++) - y[i]=x[i][j]; + y[i] += x[i][j]; sum += y[i]; } g_sum = sum; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c index 7cc5404..cda86a7 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c @@ -33,8 +33,8 @@ delete_dead_jumptables () /* There should be no loads of ->code. If any exist, then we failed to optimize away all the IF statements and the statements feeding their conditions. */ -/* { dg-final { scan-tree-dump-times "->code" 0 "cddce2"} } */ +/* { dg-final { scan-tree-dump-times "->code" 0 "cddce3"} } */ /* There should be no IF statements. */ -/* { dg-final { scan-tree-dump-times "if " 0 "cddce2"} } */ +/* { dg-final { scan-tree-dump-times "if " 0 "cddce3"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c index 501e28c..d1a9af8 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c @@ -27,4 +27,4 @@ void foo(int edx, int eax) /* After cddce we should have two IF statements remaining as the other two tests can be threaded. */ -/* { dg-final { scan-tree-dump-times "if " 2 "cddce2"} } */ +/* { dg-final { scan-tree-dump-times "if " 2 "cddce3"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c b/gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c new file mode 100644 index 0000000..099b281 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +unsigned int +test(unsigned int quant) +{ + unsigned int sum = 0; + for (unsigned int i = 0; i < quant; ++i) + sum += quant; + return sum; +} + +/* A single basic-block should remain (computing and + returning quant * quant). */ +/* { dg-final { scan-tree-dump-times "bb" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/pr38529.c b/gcc/testsuite/gcc.dg/vect/pr38529.c index 171adeb..9b5919d 100644 --- a/gcc/testsuite/gcc.dg/vect/pr38529.c +++ b/gcc/testsuite/gcc.dg/vect/pr38529.c @@ -11,7 +11,3 @@ void foo() for (j = 0; j < 17; ++j) a[i] = 0; } - -/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" } } */ - - diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 7b9814e..50b5eef 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -400,7 +400,6 @@ find_obviously_necessary_stmts (bool aggressive) if (aggressive) { struct loop *loop; - scev_initialize (); if (mark_irreducible_loops ()) FOR_EACH_BB_FN (bb, cfun) { @@ -423,7 +422,6 @@ find_obviously_necessary_stmts (bool aggressive) fprintf (dump_file, "can not prove finiteness of loop %i\n", loop->num); mark_control_dependent_edges_necessary (loop->latch, false); } - scev_finalize (); } } @@ -1567,9 +1565,13 @@ perform_tree_ssa_dce (bool aggressive) /* Preheaders are needed for SCEV to work. Simple lateches and recorded exits improve chances that loop will proved to be finite in testcases such as in loop-15.c and loop-24.c */ - if (aggressive) - loop_optimizer_init (LOOPS_NORMAL - | LOOPS_HAVE_RECORDED_EXITS); + bool in_loop_pipeline = scev_initialized_p (); + if (aggressive && ! in_loop_pipeline) + { + scev_initialize (); + loop_optimizer_init (LOOPS_NORMAL + | LOOPS_HAVE_RECORDED_EXITS); + } tree_dce_init (aggressive); @@ -1588,8 +1590,11 @@ perform_tree_ssa_dce (bool aggressive) find_obviously_necessary_stmts (aggressive); - if (aggressive) - loop_optimizer_finalize (); + if (aggressive && ! in_loop_pipeline) + { + loop_optimizer_finalize (); + scev_finalize (); + } longest_chain = 0; total_chain = 0; @@ -1623,7 +1628,7 @@ perform_tree_ssa_dce (bool aggressive) if (something_changed) { free_numbers_of_iterations_estimates (cfun); - if (scev_initialized_p ()) + if (in_loop_pipeline) scev_reset (); return TODO_update_ssa | TODO_cleanup_cfg; } |