aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/varasm.c28
3 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7348684..92501fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,12 @@
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
* config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p) Rename
get_pool_size to get_pool_size_upper_bound.
(rs6000_stack_info): Likewise.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 143687d..9970806 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/varasm.c b/gcc/varasm.c
index f8af0c1..f3cd70a 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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