https://gcc.gnu.org/g:ff732017653dfe283a8cda54cbea0a44cb76d314
commit r16-4649-gff732017653dfe283a8cda54cbea0a44cb76d314 Author: Richard Biener <[email protected]> Date: Mon Oct 27 11:15:17 2025 +0100 tree-optimization/122435 - missed redundant store removal The following removes a noop store that just performs a type sign change. PR tree-optimization/122435 * tree-ssa-sccvn.cc (eliminate_dom_walker::eliminate_stmt): Also match noop conversions when detecting redundant stores. * gcc.dg/tree-ssa/ssa-fre-111.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-111.c | 11 +++++++++++ gcc/tree-ssa-sccvn.cc | 14 ++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-111.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-111.c new file mode 100644 index 000000000000..7b96a83d1432 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-111.c @@ -0,0 +1,11 @@ +/* PR122435 */ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre1-details" } */ + +void foo (unsigned *p) +{ + int i = *p; + *(int *)p = i; +} + +/* { dg-final { scan-tree-dump "Deleted redundant store" "fre1" } } */ diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index 246fa082561e..09f92b2efc1e 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -7356,13 +7356,14 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi) else lookup_lhs = NULL_TREE; } - tree val = NULL_TREE; + tree val = NULL_TREE, tem; if (lookup_lhs) val = vn_reference_lookup (lookup_lhs, gimple_vuse (stmt), VN_WALKREWRITE, &vnresult, false, NULL, NULL_TREE, true); if (TREE_CODE (rhs) == SSA_NAME) rhs = VN_INFO (rhs)->valnum; + gassign *ass; if (val && (operand_equal_p (val, rhs, 0) /* Due to the bitfield lookups above we can get bit @@ -7370,9 +7371,14 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi) are redundant as well. */ || (TREE_CODE (val) == SSA_NAME && gimple_assign_single_p (SSA_NAME_DEF_STMT (val)) - && (val = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (val))) - && TREE_CODE (val) == VIEW_CONVERT_EXPR - && TREE_OPERAND (val, 0) == rhs))) + && (tem = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (val))) + && TREE_CODE (tem) == VIEW_CONVERT_EXPR + && TREE_OPERAND (tem, 0) == rhs) + || (TREE_CODE (rhs) == SSA_NAME + && (ass = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (rhs))) + && gimple_assign_rhs1 (ass) == val + && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (ass)) + && tree_nop_conversion_p (TREE_TYPE (rhs), TREE_TYPE (val))))) { /* We can only remove the later store if the former aliases at least all accesses the later one does or if the store
