From: Andrew Pinski Date: Fri, 9 Jan 2026 10:02:01 +0000 (-0800) Subject: cfgcleanup: Protect latches always [PR123417] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ebe697f32197ec4a429fbf8dd9cce3155c0c9ba;p=thirdparty%2Fgcc.git cfgcleanup: Protect latches always [PR123417] So it turns out LOOPS_MAY_HAVE_MULTIPLE_LATCHES is set in places along compiling. Setting it only means there might be multiple latches currently. It does not mean let's go in an delete them all; which is what remove_forwarder_block does currently. This was happening before my set of patches too but since it was only happening in merge_phi pass, latches were not cleared away al of the time and then recreated. This solves the problem by protecting latches all of the time instead of depedent on LOOPS_MAY_HAVE_MULTIPLE_LATCHES not being set. vect-uncounted_7.c needs to be xfailed here because we no longer vectorize the code. Note the IR between GCC 15 and after this patch is the same so I think this was just a case were the testcase was added after the remove forwarder changes and should not have vectorized (or vectorize differently). Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/123417 gcc/ChangeLog: * tree-cfgcleanup.cc (maybe_remove_forwarder_block): Always protect latches. gcc/testsuite/ChangeLog: * gcc.dg/vect/vect-uncounted_7.c: xfail vect test. Signed-off-by: Andrew Pinski --- diff --git a/gcc/testsuite/gcc.dg/vect/vect-uncounted_7.c b/gcc/testsuite/gcc.dg/vect/vect-uncounted_7.c index 83aa3085ce7..d299c7fa433 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-uncounted_7.c +++ b/gcc/testsuite/gcc.dg/vect/vect-uncounted_7.c @@ -20,5 +20,5 @@ void foo(int i, char *p, char *q) } } -/* { dg-final { scan-tree-dump "Loop being analyzed as uncounted." "vect" } } */ -/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ +/* { dg-final { scan-tree-dump "Loop being analyzed as uncounted." "vect" } } */ +/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { xfail *-*-* } } } */ diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc index 929990cef2e..4cf754f5e56 100644 --- a/gcc/tree-cfgcleanup.cc +++ b/gcc/tree-cfgcleanup.cc @@ -629,10 +629,8 @@ maybe_remove_forwarder_block (basic_block bb, bool can_split = false) return false; /* If bb doesn't have a single predecessor we'd make this loop have multiple latches. Don't do that if that - would in turn require disambiguating them. */ - if (!single_pred_p (bb) - && !loops_state_satisfies_p - (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)) + would in turn require disambiguating them over again. */ + if (!single_pred_p (bb)) return false; } /* cleanup_tree_cfg_noloop just created the loop preheader, don't