tree-optimization/92328 fix value-number with bogus type
authorRichard Biener <rguenther@suse.de>
Tue, 21 Jan 2020 09:37:18 +0000 (10:37 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 21 Jan 2020 11:54:08 +0000 (12:54 +0100)
We were actually value-numbering two entities with different type
the same rather than just having the same representation in the
hashtable.  The following fixes that by wrapping the value in a
to be inserted VIEW_CONVERT_EXPR.

2020-01-21  Richard Biener  <rguenther@suse.de>

PR tree-optimization/92328
* tree-ssa-sccvn.c (vn_reference_lookup_3): Preserve
type when value-numbering same-sized store by inserting a
VIEW_CONVERT_EXPR.
(eliminate_dom_walker::eliminate_stmt): When eliminating
a redundant store handle bit-reinterpretation of the same value.

* gcc.dg/torture/pr92328.c: New testcase.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr92328.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 262f0d6506f6cf2e03350343ebb7447ebfccd3be..073fc2e388dfe524c9cc756436b7f6abd1160baf 100644 (file)
@@ -1,3 +1,12 @@
+2020-01-21  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92328
+       * tree-ssa-sccvn.c (vn_reference_lookup_3): Preserve
+       type when value-numbering same-sized store by inserting a
+       VIEW_CONVERT_EXPR.
+       (eliminate_dom_walker::eliminate_stmt): When eliminating
+       a redundant store handle bit-reinterpretation of the same value.
+
 2020-01-21  Andrew Pinski  <apinski@marvel.com>
 
        PR tree-opt/93321
index b5945f4cd1cac19e185322351ee2d8afa91a0367..6332af819aa7489c20c835894bf508cd19f9d2dd 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-21  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92328
+       * gcc.dg/torture/pr92328.c: New testcase.
+
 2020-01-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/93073
diff --git a/gcc/testsuite/gcc.dg/torture/pr92328.c b/gcc/testsuite/gcc.dg/torture/pr92328.c
new file mode 100644 (file)
index 0000000..7898b9e
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-ftree-pre -Wno-div-by-zero" } */
+
+int nt;
+
+void
+ja (int os)
+{
+  int *ku = &os, *id = &os;
+  unsigned int qr = 0;
+
+  for (;;)
+    {
+      if (os == *ku)
+        {
+          *id = 0;
+          qr += os != *ku;
+          id = &qr;
+        }
+
+      *id &= qr;
+
+      if (os != 0)
+        {
+          nt /= 0;
+          ku = &qr;
+        }
+    }
+}
index 4d1301593d7edcf14689b71403453cd05402151a..0b8ee586139362fb76a630bb9322dc05ab36bf13 100644 (file)
@@ -2712,26 +2712,30 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
                  || known_eq (ref->size, TYPE_PRECISION (vr->type)))
              && multiple_p (ref->size, BITS_PER_UNIT))
            {
-             if (known_eq (ref->size, size2))
-               return vn_reference_lookup_or_insert_for_pieces
-                   (vuse, get_alias_set (lhs), vr->type, vr->operands,
-                    SSA_VAL (def_rhs));
-             else if (! INTEGRAL_TYPE_P (TREE_TYPE (def_rhs))
-                      || type_has_mode_precision_p (TREE_TYPE (def_rhs)))
+             tree val = NULL_TREE;
+             if (! INTEGRAL_TYPE_P (TREE_TYPE (def_rhs))
+                 || type_has_mode_precision_p (TREE_TYPE (def_rhs)))
                {
                  gimple_match_op op (gimple_match_cond::UNCOND,
                                      BIT_FIELD_REF, vr->type,
                                      SSA_VAL (def_rhs),
                                      bitsize_int (ref->size),
                                      bitsize_int (offset - offset2));
-                 tree val = vn_nary_build_or_lookup (&op);
-                 if (val
-                     && (TREE_CODE (val) != SSA_NAME
-                         || ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val)))
-                   return vn_reference_lookup_or_insert_for_pieces
-                       (vuse, get_alias_set (lhs), vr->type,
-                        vr->operands, val);
+                 val = vn_nary_build_or_lookup (&op);
                }
+             else if (known_eq (ref->size, size2))
+               {
+                 gimple_match_op op (gimple_match_cond::UNCOND,
+                                     VIEW_CONVERT_EXPR, vr->type,
+                                     SSA_VAL (def_rhs));
+                 val = vn_nary_build_or_lookup (&op);
+               }
+             if (val
+                 && (TREE_CODE (val) != SSA_NAME
+                     || ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val)))
+               return vn_reference_lookup_or_insert_for_pieces
+                           (vuse, get_alias_set (lhs), vr->type,
+                            vr->operands, val);
            }
          else if (maxsize.is_constant (&maxsizei)
                   && maxsizei % BITS_PER_UNIT == 0
@@ -5599,7 +5603,6 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
       && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
          || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
     {
-      tree val;
       tree rhs = gimple_assign_rhs1 (stmt);
       vn_reference_t vnresult;
       /* ???  gcc.dg/torture/pr91445.c shows that we lookup a boolean
@@ -5640,14 +5643,22 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
          else
            lookup_lhs = NULL_TREE;
        }
-      val = NULL_TREE;
+      tree val = NULL_TREE;
       if (lookup_lhs)
        val = vn_reference_lookup (lookup_lhs, gimple_vuse (stmt), VN_WALK,
                                   &vnresult, false);
       if (TREE_CODE (rhs) == SSA_NAME)
        rhs = VN_INFO (rhs)->valnum;
       if (val
-         && operand_equal_p (val, rhs, 0))
+         && (operand_equal_p (val, rhs, 0)
+             /* Due to the bitfield lookups above we can get bit
+                interpretations of the same RHS as values here.  Those
+                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)))
        {
          /* We can only remove the later store if the former aliases
             at least all accesses the later one does or if the store