From: Andrew Pinski Date: Tue, 25 Nov 2025 22:19:18 +0000 (-0800) Subject: phiprop: Make sure types of the load match the inserted phi [PR122847] X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e75a9e33b97cfdcc76b6bfea3e7ca6184be5d5c0;p=thirdparty%2Fgcc.git phiprop: Make sure types of the load match the inserted phi [PR122847] 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 --- 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); }