]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-sra.c (struct access): New field grp_hint.
authorMartin Jambor <mjambor@suse.cz>
Wed, 2 Sep 2009 17:52:18 +0000 (19:52 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Wed, 2 Sep 2009 17:52:18 +0000 (19:52 +0200)
2009-09-02  Martin Jambor  <mjambor@suse.cz>

* tree-sra.c (struct access): New field grp_hint.
(dump_access): Dump grp_hint.
(sort_and_splice_var_accesses): Set grp_hint if a group is read
multiple times.
(analyze_access_subtree): Only scalarize accesses with grp_hint set or
those which have been specifically read and somehow written to.
(propagate_subacesses_accross_link): Set grp_hint of right child and
also possibly of the left child.

* testsuite/gcc.dg/tree-ssa/sra-8.c: New testcase.
* testsuite/gcc.dg/memcpy-1.c: Add . to match pattern.
* testsuite/gcc.dg/uninit-I.c: XFAIL warning test.
* testsuite/g++.dg/warn/unit-1.C: XFAIL warning test.

From-SVN: r151345

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/unit-1.C
gcc/testsuite/gcc.dg/memcpy-1.c
gcc/testsuite/gcc.dg/tree-ssa/sra-8.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/uninit-I.c
gcc/tree-sra.c

index f623607af837fe0880aa9f7c203ea03fe348eff7..6cb7e9c7c334c78be399e3ce2062b29b886f4876 100644 (file)
@@ -1,3 +1,14 @@
+2009-09-02  Martin Jambor  <mjambor@suse.cz>
+
+       * tree-sra.c (struct access): New field grp_hint.
+       (dump_access): Dump grp_hint.
+       (sort_and_splice_var_accesses): Set grp_hint if a group is read
+       multiple times.
+       (analyze_access_subtree): Only scalarize accesses with grp_hint set or
+       those which have been specifically read and somehow written to.
+       (propagate_subacesses_accross_link): Set grp_hint of right child and
+       also possibly of the left child.
+
 2009-09-02  Jakub Jelinek  <jakub@redhat.com>
 
        * tree-object-size.c (addr_object_size): Always use object_size_type
index 67c54c3efb66443cf5522a4b29fb2ea0ce8dde4f..de4a9665194a179c0db69f25f508bab1d009b5f9 100644 (file)
@@ -1,3 +1,10 @@
+2009-09-02  Martin Jambor  <mjambor@suse.cz>
+
+       * gcc.dg/tree-ssa/sra-8.c: New testcase.
+       * gcc.dg/memcpy-1.c: Add . to match pattern.
+       * gcc.dg/uninit-I.c: XFAIL warning test.
+       * g++.dg/warn/unit-1.C: XFAIL warning test.
+       
 2009-09-02  Ian Lance Taylor  <iant@google.com>
 
        * gcc.dg/20090902-1.c: New test.
index 1bfe75b2f6cd8d2bbc6aaf4e53094698df5e0ccd..9c09d3f53cb4e526c04536acb95a7513f1db2333 100644 (file)
@@ -4,7 +4,7 @@
 struct a { int mode; };
 int sys_msgctl (void)
 {
-  struct a setbuf;  /* { dg-warning "'setbuf\.a::mode' is used" } */
+  struct a setbuf;  /* { dg-warning "'setbuf\.a::mode' is used" "" { xfail *-*-* } } */
   return setbuf.mode;
 }
 
index 2b11098b286d8468f9c4288e0877a53de3284e9d..0952a261ad0c0265d278b454766aad2ec0d1472f 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fdump-tree-optimized" } */
 /* PR36598 AVR fail maybe due to cost metrics */
-/* { dg-final { scan-tree-dump-times "nasty_local" 0 "optimized" { xfail { "avr-*-*" } } } } */
+/* { dg-final { scan-tree-dump-times "nasty_local\\." 0 "optimized" { xfail { "avr-*-*" } } } } */
 /* { dg-final { cleanup-tree-dump "optimized" } } */
 struct a {int a,b,c;} a;
 int test(struct a a)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-8.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-8.c
new file mode 100644 (file)
index 0000000..d43bbe0
--- /dev/null
@@ -0,0 +1,35 @@
+/* A testcase for PR 40744.  We do not want to create replacements for object
+   that are dead or have only a single use, whenever it can be avoided
+   simply. */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-esra-details" } */
+
+struct X { int i; int j; };
+
+void foo(void)
+{
+  struct X x;
+  x.i = 1;
+  x.j = 2;
+}
+
+
+int bar(struct X x)
+{
+  return x.i;
+}
+
+
+extern void do_something (struct X);
+
+void bar2(int i, int j)
+{
+  struct X x;
+
+  x.i = i;
+  x.j = j;
+  do_something (x);
+}
+
+/* { dg-final { scan-tree-dump-times "Created a replacement" 0 "esra"} } */
+/* { dg-final { cleanup-tree-dump "esra" } } */
index 7be60d786b8e98f632062e7abc4515d8689db7ce..064e42d55d08fe3ea5bb23a70f06539eef6cbff4 100644 (file)
@@ -3,6 +3,6 @@
 
 int sys_msgctl (void)
 {
-  struct { int mode; } setbuf;  /* { dg-warning "'setbuf\.mode' is used" } */
+  struct { int mode; } setbuf;  /* { dg-warning "'setbuf\.mode' is used" "" { xfail *-*-* } } */
   return setbuf.mode;
 }
index 33be0f6aaca6606a340dfc6e93cb90b58b1ec2ad..8d4dc90d1799ba306b432520e40a1e70e9bcee12 100644 (file)
@@ -165,6 +165,10 @@ struct access
   /* Does this group contain a read access?  This flag is propagated down the
      access tree.  */
   unsigned grp_read : 1;
+  /* Other passes of the analysis use this bit to make function
+     analyze_access_subtree create scalar replacements for this group if
+     possible.  */
+  unsigned grp_hint : 1;
   /* Is the subtree rooted in this access fully covered by scalar
      replacements?  */
   unsigned grp_covered : 1;
@@ -261,12 +265,14 @@ dump_access (FILE *f, struct access *access, bool grp)
   fprintf (f, ", type = ");
   print_generic_expr (f, access->type, 0);
   if (grp)
-    fprintf (f, ", grp_write = %d, grp_read = %d, grp_covered = %d, "
-            "grp_unscalarizable_region = %d, grp_unscalarized_data = %d, "
-            "grp_partial_lhs = %d, grp_to_be_replaced = %d\n",
-            access->grp_write, access->grp_read, access->grp_covered,
-            access->grp_unscalarizable_region, access->grp_unscalarized_data,
-            access->grp_partial_lhs, access->grp_to_be_replaced);
+    fprintf (f, ", grp_write = %d, grp_read = %d, grp_hint = %d, "
+            "grp_covered = %d, grp_unscalarizable_region = %d, "
+            "grp_unscalarized_data = %d, grp_partial_lhs = %d, "
+            "grp_to_be_replaced = %d\n",
+            access->grp_write, access->grp_read, access->grp_hint,
+            access->grp_covered, access->grp_unscalarizable_region,
+            access->grp_unscalarized_data, access->grp_partial_lhs,
+            access->grp_to_be_replaced);
   else
     fprintf (f, ", write = %d, grp_partial_lhs = %d\n", access->write,
             access->grp_partial_lhs);
@@ -1203,8 +1209,9 @@ sort_and_splice_var_accesses (tree var)
   while (i < access_count)
     {
       struct access *access = VEC_index (access_p, access_vec, i);
-      bool modification = access->write;
+      bool grp_write = access->write;
       bool grp_read = !access->write;
+      bool multiple_reads = false;
       bool grp_partial_lhs = access->grp_partial_lhs;
       bool first_scalar = is_gimple_reg_type (access->type);
       bool unscalarizable_region = access->grp_unscalarizable_region;
@@ -1227,8 +1234,15 @@ sort_and_splice_var_accesses (tree var)
          struct access *ac2 = VEC_index (access_p, access_vec, j);
          if (ac2->offset != access->offset || ac2->size != access->size)
            break;
-         modification |= ac2->write;
-         grp_read |= !ac2->write;
+         if (ac2->write)
+           grp_write = true;
+         else
+           {
+             if (grp_read)
+               multiple_reads = true;
+             else
+               grp_read = true;
+           }
          grp_partial_lhs |= ac2->grp_partial_lhs;
          unscalarizable_region |= ac2->grp_unscalarizable_region;
          relink_to_new_repr (access, ac2);
@@ -1244,8 +1258,9 @@ sort_and_splice_var_accesses (tree var)
       i = j;
 
       access->group_representative = access;
-      access->grp_write = modification;
+      access->grp_write = grp_write;
       access->grp_read = grp_read;
+      access->grp_hint = multiple_reads;
       access->grp_partial_lhs = grp_partial_lhs;
       access->grp_unscalarizable_region = unscalarizable_region;
       if (access->first_link)
@@ -1377,6 +1392,7 @@ analyze_access_subtree (struct access *root, bool allow_replacements,
   HOST_WIDE_INT covered_to = root->offset;
   bool scalar = is_gimple_reg_type (root->type);
   bool hole = false, sth_created = false;
+  bool direct_read = root->grp_read;
 
   if (mark_read)
     root->grp_read = true;
@@ -1405,7 +1421,9 @@ analyze_access_subtree (struct access *root, bool allow_replacements,
       hole |= !child->grp_covered;
     }
 
-  if (allow_replacements && scalar && !root->first_child)
+  if (allow_replacements && scalar && !root->first_child
+      && (root->grp_hint
+         || (direct_read && root->grp_write)))
     {
       if (dump_file && (dump_flags & TDF_DETAILS))
        {
@@ -1543,7 +1561,6 @@ propagate_subacesses_accross_link (struct access *lacc, struct access *racc)
 {
   struct access *rchild;
   HOST_WIDE_INT norm_delta = lacc->offset - racc->offset;
-
   bool ret = false;
 
   if (is_gimple_reg_type (lacc->type)
@@ -1570,8 +1587,13 @@ propagate_subacesses_accross_link (struct access *lacc, struct access *racc)
       if (child_would_conflict_in_lacc (lacc, norm_offset, rchild->size,
                                        &new_acc))
        {
-         if (new_acc && rchild->first_child)
-           ret |= propagate_subacesses_accross_link (new_acc, rchild);
+         if (new_acc)
+           {
+             rchild->grp_hint = 1;
+             new_acc->grp_hint |= new_acc->grp_read;
+             if (rchild->first_child)
+               ret |= propagate_subacesses_accross_link (new_acc, rchild);
+           }
          continue;
        }
 
@@ -1582,6 +1604,7 @@ propagate_subacesses_accross_link (struct access *lacc, struct access *racc)
                                 rchild->type, false))
        continue;
 
+      rchild->grp_hint = 1;
       new_acc = create_artificial_child_access (lacc, rchild, norm_offset);
       if (racc->first_child)
        propagate_subacesses_accross_link (new_acc, rchild);