]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
phiprop: Make sure types of the load match the inserted phi [PR122847]
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Tue, 25 Nov 2025 22:19:18 +0000 (14:19 -0800)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Wed, 26 Nov 2025 02:34:22 +0000 (18:34 -0800)
This was introduced with r16-5556-ge94e91d6f3775, but the type
check for the delay was not happen because the type at the point
of delaying was set to NULL. It is only until a non-delayed load
when the phi is created, the type is set.

This adds the type check to the replacement for the delayed statements.

Pushed as obvious.

PR tree-optimization/122847

gcc/ChangeLog:

* tree-ssa-phiprop.cc (propagate_with_phi): Add type
check for reuse of the phi for the delayed statements.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
gcc/testsuite/gcc.dg/torture/pr122847-1.c [new file with mode: 0644]
gcc/tree-ssa-phiprop.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr122847-1.c b/gcc/testsuite/gcc.dg/torture/pr122847-1.c
new file mode 100644 (file)
index 0000000..9ec4360
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* PR tree-optimization/122847 */      
+
+struct {
+  char x[6];
+} *a, b;
+
+int c;
+
+int d() {
+  /* `a->x` might trap. */
+  char *p = a ? a->x : b.x;
+  char e = *p;
+  if (c)
+    return *(short *)p & e;
+  return 0;
+}
index d24613d5893821324320c38877777054728da2cb..04aa138f521c2f9416a1a091916ddc5e2bade2ac 100644 (file)
@@ -506,6 +506,9 @@ next:;
   if (phi_inserted)
     for (auto use_stmt : delayed_uses)
       {
+       /* The types must match of the inserted phi.  */
+       if (!types_compatible_p (type, TREE_TYPE (gimple_assign_lhs (use_stmt))))
+         continue;
        gimple_assign_set_rhs1 (use_stmt, res);
        update_stmt (use_stmt);
       }