The following removes a noop store that just performs a type sign
change.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
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.
---
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-111.c | 11 +++++++++++
gcc/tree-ssa-sccvn.cc | 14 ++++++++++----
2 files changed, 21 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-111.c
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 00000000000..7b96a83d143
--- /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 246fa082561..09f92b2efc1 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
--
2.51.0