diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/varasm.c | 28 |
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 |