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