[Patch 2/2 PR78561] Recalculate constant pool size before emitting it
authorJames Greenhalgh <james.greenhalgh@arm.com>
Fri, 2 Dec 2016 14:31:10 +0000 (14:31 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Fri, 2 Dec 2016 14:31:10 +0000 (14:31 +0000)
gcc/

PR rtl-optimization/78561
* varasm.c (recompute_pool_offsets): New.
(output_constant_pool): Call it.

gcc/testsuite/

PR rtl-optimization/78561
* gcc.target/aarch64/pr78561.c: New.

From-SVN: r243183

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/varasm.c

index 734868404df48d47528993bf7878f0e6806a74e5..92501fc213cc314ca05a8c1f425ff6ae901aa687 100644 (file)
@@ -1,3 +1,9 @@
+2016-12-02  James Greenhalgh  <james.greenhalgh@arm.com>
+
+       PR rtl-optimization/78561
+       * varasm.c (recompute_pool_offsets): New.
+       (output_constant_pool): Call it.
+
 2016-12-02  James Greenhalgh  <james.greenhalgh@arm.com>
 
        PR rtl-optimization/78561
index 143687de60d4643cce58cd42da85eece6bf2f5cb..99708060b38ff6981b1e7cd09ba73e2e460a63cb 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-02  James Greenhalgh  <james.greenhalgh@arm.com>
+
+       PR rtl-optimization/78561
+       * gcc.target/aarch64/pr78561.c: New.
+
 2016-12-02  Bin Cheng  <bin.cheng@arm.com>
 
        * gcc.dg/fold-bopcond-1.c: New test.
index f8af0c1a69353b7e2fe660496e8bb90b381b11fd..f3cd70aecca4a3026a0f8f76a681f8856e4255d2 100644 (file)
@@ -3942,6 +3942,29 @@ output_constant_pool_1 (struct constant_descriptor_rtx *desc,
   return;
 }
 
+/* Recompute the offsets of entries in POOL, and the overall size of
+   POOL.  Do this after calling mark_constant_pool to ensure that we
+   are computing the offset values for the pool which we will actually
+   emit.  */
+
+static void
+recompute_pool_offsets (struct rtx_constant_pool *pool)
+{
+  struct constant_descriptor_rtx *desc;
+  pool->offset = 0;
+
+  for (desc = pool->first; desc ; desc = desc->next)
+    if (desc->mark)
+      {
+         /* Recalculate offset.  */
+       unsigned int align = desc->align;
+       pool->offset += (align / BITS_PER_UNIT) - 1;
+       pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
+       desc->offset = pool->offset;
+       pool->offset += GET_MODE_SIZE (desc->mode);
+      }
+}
+
 /* Mark all constants that are referenced by SYMBOL_REFs in X.
    Emit referenced deferred strings.  */
 
@@ -4060,6 +4083,11 @@ output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
      case we do not need to output the constant.  */
   mark_constant_pool ();
 
+  /* Having marked the constant pool entries we'll actually emit, we
+     now need to rebuild the offset information, which may have become
+     stale.  */
+  recompute_pool_offsets (pool);
+
 #ifdef ASM_OUTPUT_POOL_PROLOGUE
   ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
 #endif