[PUSHED 3/3] cselim: Fix cond_store_replacement_limited for clobbers [PR126569]

Andrea Pinski <[email protected]> Sat, 1 Aug 2026 22:36:02 -0700
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
cond_store_replacement_limited mistaken a clobber for a store, meaning
that it would use {CLOBBER(eos)} as a phi argument.

So this fixes that issue by rejecting that case.

Pushed as obvious after bootstrap/test on x86_64-linux-gnu.

	PR tree-optimization/126569

gcc/ChangeLog:

	* tree-ssa-phiopt.cc (cond_store_replacement_limited): A
	clobber is not a store.

gcc/testsuite/ChangeLog:

	* gcc.dg/pr126569-1.c: New test.

Signed-off-by: Andrea Pinski <[email protected]>
---
 gcc/testsuite/gcc.dg/pr126569-1.c | 20 ++++++++++++++++++++
 gcc/tree-ssa-phiopt.cc            |  2 ++
 2 files changed, 22 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/pr126569-1.c

diff --git a/gcc/testsuite/gcc.dg/pr126569-1.c b/gcc/testsuite/gcc.dg/pr126569-1.c
new file mode 100644
index 00000000000..5e2348c2ff1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr126569-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2  -fno-tree-dce -fno-tree-dse" } */
+/* PR tree-optimization/126569 */
+
+int wx, qi, gw, ak;
+
+void
+f (void)
+{
+  while (wx)
+    {
+      int k2 = ak;
+    ja:
+      *(int **) &k2 = &gw;
+      while (qi)
+        ++qi;
+    }
+  gw = 1;
+  goto ja;
+}
diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
index 2ff26bfab73..d63a47cc615 100644
--- a/gcc/tree-ssa-phiopt.cc
+++ b/gcc/tree-ssa-phiopt.cc
@@ -3683,6 +3683,8 @@ cond_store_replacement_limited (basic_block middle_bb, basic_block join_bb,
       tree beforelhs = gimple_assign_lhs (vdef_before);
       /* Only allow the store to be right before the condition.  */
       if (gimple_bb (vdef_before) == cond_bb
+	  /* This can't be a clobber */
+	  && !gimple_clobber_p (vdef_before)
 	  /* An exact match is only supported.
 	     FIXME: Allow for clique/base mismatch?  */
 	  && operand_equal_p (lhs, beforelhs))
-- 
2.43.0