aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-init.c
diff options
context:
space:
mode:
authorguojiufu <guojiufu@linux.ibm.com>2020-11-17 19:49:03 +0800
committerguojiufu <guojiufu@linux.ibm.com>2020-11-18 13:29:14 +0800
commitd87ee7f1c9cd2ffa6302cdfd0686d72e5bb7463b (patch)
treec4f1dda5d267c73b2a7a7e1cceffc5b13bdbe7ab /gcc/loop-init.c
parent397654d66a4f84d4439e046cd330d9968af3b62b (diff)
downloadgcc-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.c9
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);