]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/69776 (Wrong optimization with aliasing)
authorRichard Biener <rguenther@suse.de>
Tue, 16 Feb 2016 15:00:45 +0000 (15:00 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 16 Feb 2016 15:00:45 +0000 (15:00 +0000)
2016-02-16  Richard Biener  <rguenther@suse.de>

PR tree-optimization/69776
* tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Get alias
sets from caller.
(indirect_refs_may_alias_p): Likewise.
(refs_may_alias_p_1): Pass alias sets as from ao_ref.
* tree-ssa-sccvn.c (vn_reference_lookup): Also adjust vr alias-set
according to tbaa_p.
* tree-ssa-dom.c (lookup_avail_expr): Add tbaa_p flag.
(optimize_stmt): For redundant store discovery do not allow tbaa.

* gcc.dg/torture/pr69776-2.c: New testcase.

From-SVN: r233453

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

index 741fbd095c60e70a1dde620eb74acd5503d4d4af..7fd48ec3ab0e0015932ddec99c34554941f661d3 100644 (file)
@@ -1,3 +1,15 @@
+2016-02-16  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69776
+       * tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Get alias
+       sets from caller.
+       (indirect_refs_may_alias_p): Likewise.
+       (refs_may_alias_p_1): Pass alias sets as from ao_ref.
+       * tree-ssa-sccvn.c (vn_reference_lookup): Also adjust vr alias-set
+       according to tbaa_p.
+       * tree-ssa-dom.c (lookup_avail_expr): Add tbaa_p flag.
+       (optimize_stmt): For redundant store discovery do not allow tbaa.
+
 2016-02-16  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR tree-optimization/69714
index 38751605e80af9bda9afa869b0c06246af1034f1..d05cdd11059edc9823e67232fde08caa16157a6e 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-16  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69776
+       * gcc.dg/torture/pr69776-2.c: New testcase.
+
 2016-02-16  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR tree-optimization/69714
diff --git a/gcc/testsuite/gcc.dg/torture/pr69776-2.c b/gcc/testsuite/gcc.dg/torture/pr69776-2.c
new file mode 100644 (file)
index 0000000..e5bb28d
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fstrict-aliasing" } */
+
+extern void *malloc (__SIZE_TYPE__);
+extern void abort (void);
+
+__attribute__((noinline,noclone))
+void f(int *qi, double *qd)
+{
+  int i = *qi;
+  *qd = 0;
+  *qi = i;
+}
+
+int main()
+{
+  int *p = malloc(sizeof(double));
+
+  *p = 1;
+  f(p, (double *)p);
+  if (*p != 1)
+    abort();
+  return 0;
+}
+
index c9c09c8dc7725f7d7c09dd19023631e3d22516ae..08f10e5248b568f7252d4b54868bd22ab7767d12 100644 (file)
@@ -1067,12 +1067,8 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
   ptrtype1 = TREE_TYPE (TREE_OPERAND (base1, 1));
 
   /* If the alias set for a pointer access is zero all bets are off.  */
-  if (base1_alias_set == -1)
-    base1_alias_set = get_deref_alias_set (ptrtype1);
   if (base1_alias_set == 0)
     return true;
-  if (base2_alias_set == -1)
-    base2_alias_set = get_alias_set (base2);
 
   /* When we are trying to disambiguate an access with a pointer dereference
      as base versus one with a decl as base we can use both the size
@@ -1239,13 +1235,8 @@ indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
   ptrtype2 = TREE_TYPE (TREE_OPERAND (base2, 1));
 
   /* If the alias set for a pointer access is zero all bets are off.  */
-  if (base1_alias_set == -1)
-    base1_alias_set = get_deref_alias_set (ptrtype1);
-  if (base1_alias_set == 0)
-    return true;
-  if (base2_alias_set == -1)
-    base2_alias_set = get_deref_alias_set (ptrtype2);
-  if (base2_alias_set == 0)
+  if (base1_alias_set == 0
+      || base2_alias_set == 0)
     return true;
 
   /* If both references are through the same type, they do not alias
@@ -1417,7 +1408,8 @@ refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p)
   if (var1_p && ind2_p)
     return indirect_ref_may_alias_decl_p (ref2->ref, base2,
                                          offset2, max_size2,
-                                         ao_ref_alias_set (ref2), -1,
+                                         ao_ref_alias_set (ref2),
+                                         ao_ref_base_alias_set (ref2),
                                          ref1->ref, base1,
                                          offset1, max_size1,
                                          ao_ref_alias_set (ref1),
@@ -1426,10 +1418,12 @@ refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p)
   else if (ind1_p && ind2_p)
     return indirect_refs_may_alias_p (ref1->ref, base1,
                                      offset1, max_size1,
-                                     ao_ref_alias_set (ref1), -1,
+                                     ao_ref_alias_set (ref1),
+                                     ao_ref_base_alias_set (ref1),
                                      ref2->ref, base2,
                                      offset2, max_size2,
-                                     ao_ref_alias_set (ref2), -1,
+                                     ao_ref_alias_set (ref2),
+                                     ao_ref_base_alias_set (ref2),
                                      tbaa_p);
 
   gcc_unreachable ();
index f44ac135d792cc10e73dc3e78389c8f01555fc88..9aaa3724ab91832a95927a1df67677b4a2d54c5c 100644 (file)
@@ -103,7 +103,8 @@ static struct opt_stats_d opt_stats;
 static edge optimize_stmt (basic_block, gimple_stmt_iterator,
                           class const_and_copies *,
                           class avail_exprs_stack *);
-static tree lookup_avail_expr (gimple *, bool, class avail_exprs_stack *);
+static tree lookup_avail_expr (gimple *, bool, class avail_exprs_stack *,
+                              bool = true);
 static void record_cond (cond_equivalence *, class avail_exprs_stack *);
 static void record_equality (tree, tree, class const_and_copies *);
 static void record_equivalences_from_phis (basic_block);
@@ -1893,7 +1894,8 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si,
          else
            new_stmt = gimple_build_assign (rhs, lhs);
          gimple_set_vuse (new_stmt, gimple_vuse (stmt));
-         cached_lhs = lookup_avail_expr (new_stmt, false, avail_exprs_stack);
+         cached_lhs = lookup_avail_expr (new_stmt, false, avail_exprs_stack,
+                                         false);
          if (cached_lhs
              && rhs == cached_lhs)
            {
@@ -1997,7 +1999,7 @@ vuse_eq (ao_ref *, tree vuse1, unsigned int cnt, void *data)
 
 static tree
 lookup_avail_expr (gimple *stmt, bool insert,
-                  class avail_exprs_stack *avail_exprs_stack)
+                  class avail_exprs_stack *avail_exprs_stack, bool tbaa_p)
 {
   expr_hash_elt **slot;
   tree lhs;
@@ -2054,7 +2056,8 @@ lookup_avail_expr (gimple *stmt, bool insert,
       if (!(vuse1 && vuse2
            && gimple_assign_single_p (stmt)
            && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
-           && (ao_ref_init (&ref, gimple_assign_rhs1 (stmt)), true)
+           && (ao_ref_init (&ref, gimple_assign_rhs1 (stmt)),
+               ref.base_alias_set = ref.ref_alias_set = tbaa_p ? -1 : 0, true)
            && walk_non_aliased_vuses (&ref, vuse2,
                                       vuse_eq, NULL, NULL, vuse1) != NULL))
        {
index 5b78ba4a7505c65fc056eadaec3aeeaf9b58df63..1c237a4ec4bae92dac30345b4abc9847d80934d5 100644 (file)
@@ -2249,7 +2249,7 @@ vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind,
   vr1.operands = operands
     = valueize_shared_reference_ops_from_ref (op, &valuezied_anything);
   vr1.type = TREE_TYPE (op);
-  vr1.set = get_alias_set (op);
+  vr1.set = tbaa_p ? get_alias_set (op) : 0;
   vr1.hashcode = vn_reference_compute_hash (&vr1);
   if ((cst = fully_constant_vn_reference_p (&vr1)))
     return cst;