]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
IFCVT: Fix factor_out_operators correctly for more than 1 phi [PR121295]
authorAndrew Pinski <quic_apinski@quicinc.com>
Tue, 29 Jul 2025 15:46:01 +0000 (08:46 -0700)
committerAndrew Pinski <quic_apinski@quicinc.com>
Wed, 30 Jul 2025 15:19:07 +0000 (08:19 -0700)
r16-2590-ga51bf9e10182cf was not the correct fix for this in the end.
Instead a much simplier and localized fix is needed, just change the phi
that is being worked on with the new result and arguments that is from the
factored out operator.
This solves the issue of not having result in the IR and causing issues that way.

Bootstrapped and tested on x86_64-linux-gnu.
Note this depends on reverting r16-2590-ga51bf9e10182cf.

PR tree-optimization/121236
PR tree-optimization/121295

gcc/ChangeLog:

* tree-if-conv.cc (factor_out_operators): Change the phi node
to the new result and args.

gcc/testsuite/ChangeLog:

* gcc.dg/torture/pr121236-1.c: New test.
* gcc.dg/torture/pr121295-1.c: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
gcc/testsuite/gcc.dg/torture/pr121236-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr121295-1.c [new file with mode: 0644]
gcc/tree-if-conv.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr121236-1.c b/gcc/testsuite/gcc.dg/torture/pr121236-1.c
new file mode 100644 (file)
index 0000000..2b397e3
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* PR tree-optimization/121236 */
+
+
+unsigned func_26(short *p_27, int gg, int p) {
+  unsigned l_184 = 0;
+  unsigned m = 0;
+  for (int g_59 = 0; g_59 < 10; g_59++)
+    {
+      if (gg)
+       l_184--;
+      else
+       {
+         m |= l_184 |= p;
+         (l_184)--;
+       }
+    }
+ return m;
+}
+
diff --git a/gcc/testsuite/gcc.dg/torture/pr121295-1.c b/gcc/testsuite/gcc.dg/torture/pr121295-1.c
new file mode 100644 (file)
index 0000000..7825c6e
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-additional-options " -fno-tree-copy-prop -fno-tree-pre -fno-code-hoisting" */
+
+/* PR tree-optimization/121295 */
+
+
+int a, b, c;
+int main() {
+  int *d = &a;
+  while (b)
+    b = (*d &= 10) <= 0 || (*d = c);
+  return 0;
+}
index ba25c19c50ce876e036fe3af1630f4463ae20ad9..b7ce0720b15009f5b5503d39b47b084234c36759 100644 (file)
@@ -2291,6 +2291,13 @@ again:
   *arg0 = new_arg0;
   *arg1 = new_arg1;
   *res = new_res;
+
+  /* Update the phi node too. */
+  gimple_phi_set_result (phi, new_res);
+  gimple_phi_arg (phi, 0)->def = new_arg0;
+  gimple_phi_arg (phi, 0)->def = new_arg1;
+  update_stmt (phi);
+
   repeated = true;
   goto again;
 }