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

Reply via email to