lto-streamer-out.c (class DFS): Adjust hash_scc method.
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 30 Jun 2015 21:05:02 +0000 (21:05 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 30 Jun 2015 21:05:02 +0000 (21:05 +0000)
* lto-streamer-out.c (class DFS): Adjust hash_scc method.
(DFS::DFS): Pass this_ref_p and ref_p to hash_scc.
(hash_scc): Add this_ref_p and ref_p parameters and pass them
to the inner DFS walk.

From-SVN: r225212

gcc/ChangeLog
gcc/lto-streamer-out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/lto17.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto17.ads [new file with mode: 0644]

index 91e7e4a51af47ecf769afa899e379b666ca1115f..fc23abd6c2de883a63be86e8a35c9c2226c38be9 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-30  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * lto-streamer-out.c (class DFS): Adjust hash_scc method.
+       (DFS::DFS): Pass this_ref_p and ref_p to hash_scc.
+       (hash_scc): Add this_ref_p and ref_p parameters and pass them
+       to the inner DFS walk.
+
 2015-06-30  Richard Sandiford  <richard.sandiford@arm.com>
 
        * target-insns.def (jump): New targetm instruction pattern.
index 15f5933d34f165d92440cc8a179a137bc8c83d18..254d7ba50b71f9681ac6ffcdc9cdef764844c120 100644 (file)
@@ -411,9 +411,9 @@ lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
   streamer_write_zero (ob);
 }
 
-/* Emit the physical representation of tree node EXPR to output block
-   OB.  If THIS_REF_P is true, the leaves of EXPR are emitted as references
-   via lto_output_tree_ref.  REF_P is used for streaming siblings of EXPR.  */
+/* Emit the physical representation of tree node EXPR to output block OB,
+   If THIS_REF_P is true, the leaves of EXPR are emitted as references via
+   lto_output_tree_ref.  REF_P is used for streaming siblings of EXPR.  */
 
 static void
 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
@@ -490,13 +490,20 @@ private:
                       tree expr, bool ref_p, bool this_ref_p);
 
   hashval_t
-  hash_scc (struct output_block *ob, unsigned first, unsigned size);
+  hash_scc (struct output_block *ob, unsigned first, unsigned size,
+           bool ref_p, bool this_ref_p);
 
   hash_map<tree, sccs *> sccstate;
   vec<worklist> worklist_vec;
   struct obstack sccstate_obstack;
 };
 
+/* Emit the physical representation of tree node EXPR to output block OB,
+   using depth-first search on the subgraph.  If THIS_REF_P is true, the
+   leaves of EXPR are emitted as references via lto_output_tree_ref.
+   REF_P is used for streaming siblings of EXPR.  If SINGLE_P is true,
+   this is for a rewalk of a single leaf SCC.  */
+
 DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
          bool single_p)
 {
@@ -564,7 +571,7 @@ DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
          unsigned first, size;
          tree x;
 
-         /* If we are re-walking a single leaf-SCC just pop it,
+         /* If we are re-walking a single leaf SCC just pop it,
             let earlier worklist item access the sccstack.  */
          if (single_p)
            {
@@ -587,7 +594,7 @@ DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
          unsigned scc_entry_len = 0;
          if (!flag_wpa)
            {
-             scc_hash = hash_scc (ob, first, size);
+             scc_hash = hash_scc (ob, first, size, ref_p, this_ref_p);
 
              /* Put the entries with the least number of collisions first.  */
              unsigned entry_start = 0;
@@ -1362,10 +1369,12 @@ DFS::scc_entry_compare (const void *p1_, const void *p2_)
   return 0;
 }
 
-/* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.  */
+/* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.
+   THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST.  */
 
 hashval_t
-DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size)
+DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size,
+              bool ref_p, bool this_ref_p)
 {
   unsigned int last_classes = 0, iterations = 0;
 
@@ -1441,7 +1450,8 @@ DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size)
              for (unsigned i = 0; i < size; ++i)
                map.put (sccstack[first+i].t, sccstack[first+i].hash);
 
-             DFS again (ob, sccstack[first+firstunique].t, false, false, true);
+             DFS again (ob, sccstack[first+firstunique].t, ref_p, this_ref_p,
+                        true);
              gcc_assert (again.sccstack.length () == size);
 
              memcpy (sccstack.address () + first,
@@ -1539,9 +1549,9 @@ DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
 }
 
 
-/* Emit the physical representation of tree node EXPR to output block
-   OB.  If THIS_REF_P is true, the leaves of EXPR are emitted as references
-   via lto_output_tree_ref.  REF_P is used for streaming siblings of EXPR.  */
+/* Emit the physical representation of tree node EXPR to output block OB.
+   If THIS_REF_P is true, the leaves of EXPR are emitted as references via
+   lto_output_tree_ref.  REF_P is used for streaming siblings of EXPR.  */
 
 void
 lto_output_tree (struct output_block *ob, tree expr,
index 80be58e6e58dcd4577c93a83e26ba52bec4673dc..8fc634abefdf060ad8db7a1dc6bca536c364af53 100644 (file)
@@ -1,3 +1,7 @@
+2015-06-30  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/lto17.ad[sb]: New test.
+
 2015-06-30  David Malcolm  <dmalcolm@redhat.com>
 
        * jit.dg/all-non-failing-tests.h: Add test-switch.c.
diff --git a/gcc/testsuite/gnat.dg/lto17.adb b/gcc/testsuite/gnat.dg/lto17.adb
new file mode 100644 (file)
index 0000000..af42e8d
--- /dev/null
@@ -0,0 +1,12 @@
+-- { dg-do compile }
+-- { dg-options "-flto" }
+-- { dg-require-effective-target lto }
+
+package body Lto17 is
+
+   function To_Chunk_List(C : Chunk) return Chunk_List is
+   begin
+      return new Chunk_List_Element'(C.Size, C, null);
+   end;
+
+end Lto17;
diff --git a/gcc/testsuite/gnat.dg/lto17.ads b/gcc/testsuite/gnat.dg/lto17.ads
new file mode 100644 (file)
index 0000000..19b8a9c
--- /dev/null
@@ -0,0 +1,20 @@
+package Lto17 is
+
+   type Chunk_List_Element;
+   type Chunk_List is access Chunk_List_Element;
+
+   type Arr is array (Natural range <>) of Integer;
+
+   type Chunk(Size : Natural) is record
+      Data  : Arr(1 .. Size);
+      Where : Natural;
+   end record;
+
+   type Chunk_List_Element(Size : Natural) is record
+      Chnk : Chunk(Size);
+      Link : Chunk_List;
+   end record;
+
+   function To_Chunk_List(C : Chunk) return Chunk_List;
+
+end Lto17;