alias-access-path-6.c: New testcase.
authorJan Hubicka <jh@suse.cz>
Sat, 22 Jun 2019 15:32:51 +0000 (17:32 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 22 Jun 2019 15:32:51 +0000 (15:32 +0000)
* gcc.dg/tree-ssa/alias-access-path-6.c: New testcase.
* tree-ssa-alias.c (nonoverlapping_component_refs_p): Do not
give up on bitfields; continue searching for different refs
appearing later.

From-SVN: r272587

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-6.c [new file with mode: 0644]
gcc/tree-ssa-alias.c

index 5cab32825d13fce71c03b9057d1ba763e3e19b0e..03e174883241d2e1a5fd773f42580a876976a635 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-22  Jan Hubicka  <jh@suse.cz>
+
+       * tree-ssa-alias.c (nonoverlapping_component_refs_p): Do not
+       give up on bitfields; continue searching for different refs
+       appearing later.
+
 2019-06-21  Jakub Jelinek  <jakub@redhat.com>
 
        * tree-vect-data-refs.c (vect_find_stmt_data_reference): Handle
index e38abbf7be3f42bf8d0be04f9c2227a12c1ba9d5..0b122c6075de6c349a4b633a335da6ca18646efa 100644 (file)
@@ -1,3 +1,7 @@
+2019-06-22  Jan Hubicka  <jh@suse.cz>
+
+       * gcc.dg/tree-ssa/alias-access-path-6.c: New testcase.
+
 2019-06-22  Marek Polacek  <polacek@redhat.com>
 
        PR c++/86476 - noexcept-specifier is a complete-class context.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-6.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-6.c
new file mode 100644 (file)
index 0000000..c0de453
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+/* This tests that nonoveralpping_component_refs does not give up
+   on field delcs and continues looking to find mismatch between
+   a1 and a2.  */
+struct a {
+       int a:3;
+       int b:3;
+};
+struct b {struct a a1,a2;};
+struct c {struct b b[10];} *cptr;
+struct d {struct c c;} *dptr;
+int
+test(int i,int j)
+{
+  cptr->b[i].a1.a=0;
+  dptr->c.b[j].a2.b=1;
+  return cptr->b[i].a1.a;
+}
+int
+test2(int i,int j)
+{
+  cptr->b[i].a1.a=1;
+  dptr->c.b[j].a1.a=0;
+  return cptr->b[i].a1.a;
+}
+/* { dg-final { scan-tree-dump-times "return 0" 1 "optimized"} } */
+/* { dg-final { scan-tree-dump-not "return 1" "optimized"} } */
index 111f375bb4a66bc46c11d36743cdcce351ad1485..32583156350b88561b3f489dc6b949d0e5de339d 100644 (file)
@@ -1350,19 +1350,16 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y)
                 same.  */
              if (DECL_BIT_FIELD_REPRESENTATIVE (fieldx) == fieldy
                  || DECL_BIT_FIELD_REPRESENTATIVE (fieldy) == fieldx)
-               {
-                  ++alias_stats.nonoverlapping_component_refs_p_may_alias;
-                  return false;
-               }
+               ;
              /* Different fields of the same record type cannot overlap.
                 ??? Bitfields can overlap at RTL level so punt on them.  */
-             if (DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy))
+             else if (DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy))
+               ;
+             else
                {
-                  ++alias_stats.nonoverlapping_component_refs_p_may_alias;
-                  return false;
+                 ++alias_stats.nonoverlapping_component_refs_p_no_alias;
+                 return true;
                }
-             ++alias_stats.nonoverlapping_component_refs_p_no_alias;
-             return true;
            }
        }
       if (TYPE_UID (typex) < TYPE_UID (typey))