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 <[email protected]>
---
 gcc/testsuite/gcc.dg/torture/pr122847-1.c | 17 +++++++++++++++++
 gcc/tree-ssa-phiprop.cc                   |  3 +++
 2 files changed, 20 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr122847-1.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr122847-1.c 
b/gcc/testsuite/gcc.dg/torture/pr122847-1.c
new file mode 100644
index 00000000000..9ec4360e329
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr122847-1.c
@@ -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;
+}
diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
index d24613d5893..04aa138f521 100644
--- a/gcc/tree-ssa-phiprop.cc
+++ b/gcc/tree-ssa-phiprop.cc
@@ -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);
       }
-- 
2.43.0

Reply via email to