+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
+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.
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. */
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