diff options
author | guojiufu <guojiufu@linux.ibm.com> | 2020-11-17 19:49:03 +0800 |
---|---|---|
committer | guojiufu <guojiufu@linux.ibm.com> | 2020-11-18 13:29:14 +0800 |
commit | d87ee7f1c9cd2ffa6302cdfd0686d72e5bb7463b (patch) | |
tree | c4f1dda5d267c73b2a7a7e1cceffc5b13bdbe7ab /gcc/loop-init.c | |
parent | 397654d66a4f84d4439e046cd330d9968af3b62b (diff) | |
download | gcc-d87ee7f1c9cd2ffa6302cdfd0686d72e5bb7463b.zip gcc-d87ee7f1c9cd2ffa6302cdfd0686d72e5bb7463b.tar.gz gcc-d87ee7f1c9cd2ffa6302cdfd0686d72e5bb7463b.tar.bz2 |
Clean up loop-closed PHIs after loop finalize
This patch propagates loop-closed PHIs them out at
loop_optimizer_finalize. For some cases, to clean up loop-closed PHIs
would save efforts of optimization passes after loopdone.
Thanks,
Jiufu Guo.
gcc/ChangeLog:
2020-10-18 Jiufu Guo <guojiufu@linux.ibm.com>
* cfgloop.h (loop_optimizer_finalize): Add flag argument.
* loop-init.c (loop_optimizer_finalize): Call clean_up_loop_closed_phi.
* tree-cfgcleanup.h (clean_up_loop_closed_phi): New declare.
* tree-ssa-loop.c (tree_ssa_loop_done): Call loop_optimizer_finalize
with flag argument.
* tree-ssa-propagate.c (clean_up_loop_closed_phi): New function.
gcc/testsuite/ChangeLog:
2020-10-18 Jiufu Guo <guojiufu@linux.ibm.com>
* gcc.dg/tree-ssa/loopclosedphi.c: New test.
Diffstat (limited to 'gcc/loop-init.c')
-rw-r--r-- | gcc/loop-init.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/loop-init.c b/gcc/loop-init.c index 401e528..ac87daf 100644 --- a/gcc/loop-init.c +++ b/gcc/loop-init.c @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa-loop-niter.h" #include "loop-unroll.h" #include "tree-scalar-evolution.h" +#include "tree-cfgcleanup.h" /* Apply FLAGS to the loop state. */ @@ -133,13 +134,19 @@ loop_optimizer_init (unsigned flags) /* Finalize loop structures. */ void -loop_optimizer_finalize (struct function *fn) +loop_optimizer_finalize (struct function *fn, bool clean_loop_closed_phi) { class loop *loop; basic_block bb; timevar_push (TV_LOOP_FINI); + if (clean_loop_closed_phi && loops_state_satisfies_p (fn, LOOP_CLOSED_SSA)) + { + clean_up_loop_closed_phi (fn); + loops_state_clear (fn, LOOP_CLOSED_SSA); + } + if (loops_state_satisfies_p (fn, LOOPS_HAVE_RECORDED_EXITS)) release_recorded_exits (fn); |