diff mbox series

Abstract PHI and forwarder block checks in jump threader.

Message ID 20210903135608.735535-2-aldyh@redhat.com
State New
Headers show
Series Abstract PHI and forwarder block checks in jump threader. | expand

Commit Message

Aldy Hernandez Sept. 3, 2021, 1:56 p.m. UTC
This patch abstracts out a couple common idioms in the forward
threader that I found useful while navigating the code base.

Tested on x86-64 Linux.

OK?

gcc/ChangeLog:

	* tree-ssa-threadedge.c (has_phis_p): New.
	(forwarder_block_p): New.
	(potentially_threadable_block): Call forwarder_block_p.
	(jump_threader::thread_around_empty_blocks): Call has_phis_p.
	(jump_threader::thread_through_normal_block): Call
	forwarder_block_p.
---
 gcc/tree-ssa-threadedge.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

Comments

Jeff Law Sept. 3, 2021, 3 p.m. UTC | #1
On 9/3/2021 7:56 AM, Aldy Hernandez wrote:
> This patch abstracts out a couple common idioms in the forward
> threader that I found useful while navigating the code base.
>
> Tested on x86-64 Linux.
>
> OK?
>
> gcc/ChangeLog:
>
> 	* tree-ssa-threadedge.c (has_phis_p): New.
> 	(forwarder_block_p): New.
> 	(potentially_threadable_block): Call forwarder_block_p.
> 	(jump_threader::thread_around_empty_blocks): Call has_phis_p.
> 	(jump_threader::thread_through_normal_block): Call
> 	forwarder_block_p.
OK
jeff
diff mbox series

Patch

diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index e57f6d3e39c..3db54a199fd 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -95,6 +95,21 @@  jump_threader::thread_through_all_blocks (bool may_peel_loop_headers)
   return m_registry->thread_through_all_blocks (may_peel_loop_headers);
 }
 
+static inline bool
+has_phis_p (basic_block bb)
+{
+  return !gsi_end_p (gsi_start_phis (bb));
+}
+
+/* Return TRUE for a forwarder block which is defined as having PHIs
+   but no instructions.  */
+
+static bool
+forwarder_block_p (basic_block bb)
+{
+  return gsi_end_p (gsi_start_nondebug_bb (bb)) && has_phis_p (bb);
+}
+
 /* Return TRUE if we may be able to thread an incoming edge into
    BB to an outgoing edge from BB.  Return FALSE otherwise.  */
 
@@ -107,9 +122,8 @@  potentially_threadable_block (basic_block bb)
      not optimized away because they forward from outside a loop
      to the loop header.   We want to thread through them as we can
      sometimes thread to the loop exit, which is obviously profitable.
-     the interesting case here is when the block has PHIs.  */
-  if (gsi_end_p (gsi_start_nondebug_bb (bb))
-      && !gsi_end_p (gsi_start_phis (bb)))
+     The interesting case here is when the block has PHIs.  */
+  if (forwarder_block_p (bb))
     return true;
 
   /* If BB has a single successor or a single predecessor, then
@@ -854,7 +868,7 @@  jump_threader::thread_around_empty_blocks (vec<jump_thread_edge *> *path,
   /* The key property of these blocks is that they need not be duplicated
      when threading.  Thus they cannot have visible side effects such
      as PHI nodes.  */
-  if (!gsi_end_p (gsi_start_phis (bb)))
+  if (has_phis_p (bb))
     return false;
 
   /* Skip over DEBUG statements at the start of the block.  */
@@ -994,8 +1008,7 @@  jump_threader::thread_through_normal_block (vec<jump_thread_edge *> *path,
     {
       /* First case.  The statement simply doesn't have any instructions, but
 	 does have PHIs.  */
-      if (gsi_end_p (gsi_start_nondebug_bb (e->dest))
-	  && !gsi_end_p (gsi_start_phis (e->dest)))
+      if (forwarder_block_p (e->dest))
 	return 0;
 
       /* Second case.  */