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>
--- /dev/null
+/* { 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;
+}
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);
}