https://gcc.gnu.org/g:b2e40fc16eb174ff8d97295367806dd93a0b189e

commit r16-5320-gb2e40fc16eb174ff8d97295367806dd93a0b189e
Author: Andrew Pinski <[email protected]>
Date:   Sat Nov 15 14:51:32 2025 -0800

    cfglceanup: Fix check for preheaders
    
    I had messed up the check in r16-5258-g1d8e2d51e5c5cb for preheaders
    where return to remvoe the forwarder preheader block even if 
LOOPS_HAVE_PREHEADERS
    was set. I am not sure how often this happens because most of the time the 
pre-header
    will have an incoming phi block anyways but it is safer not to remove it in 
this case.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
    gcc/ChangeLog:
    
            * tree-cfgcleanup.cc (tree_forwarder_block_p): Restore check on
            LOOPS_HAVE_PREHEADERS.
    
    Signed-off-by: Andrew Pinski <[email protected]>

Diff:
---
 gcc/tree-cfgcleanup.cc | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
index ac1394ac1d48..a78b711d82c3 100644
--- a/gcc/tree-cfgcleanup.cc
+++ b/gcc/tree-cfgcleanup.cc
@@ -519,11 +519,14 @@ tree_forwarder_block_p (basic_block bb)
            }
          /* cleanup_tree_cfg_noloop just created the loop preheader, don't
             remove it if it has phis.  */
-         else if (bb->loop_father == loop_outer (dest->loop_father))
-           return gimple_seq_empty_p (phi_nodes (bb));
-         /* Always preserve other edges into loop headers that are
-            not simple latches or preheaders.  */
-         return false;
+         else if (bb->loop_father == loop_outer (dest->loop_father)
+                  && gimple_seq_empty_p (phi_nodes (bb))
+                  && !loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS))
+           ;
+         else
+           /* Always preserve other edges into loop headers that are
+              not simple latches or preheaders.  */
+           return false;
        }
     }

Reply via email to