On 05/15/2015 04:37 AM, Dharmakan Rohit Arul Raj wrote:

-----Original Message-----
From: Jeff Law [mailto:l...@redhat.com]
Sent: Friday, May 15, 2015 10:30 AM
Just to summarize: By default in GCC v4.7.x, all the constants are put
into '.rodata.str1.4' section. In GCC v4.8.x from r192719 onwards, one
of the move instruction of the string constant ".LC0" is getting
spilled. The reload pass, for any constants that aren't allowed and
can't be reloaded in to registers tries to change them into memory
references. Then while emitting that string constant to asm code
(A:varasm.c: output_constant_pool_1), it explicitly passes the
alignment as 1 which prevents the generation of fix-up table entries
in  'B: rs6000.c:rs6000_assemble_integer' because the data is
considered unaligned now.

The bug seems to have gone latent with an unrelated trunk commit
r204695 [* tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Refactor
the code. Handle type conversion.]. This commit chooses different
spill candidates hence all the string constants are being put in to
'.rodata.str1.4´section.

The check I had in the test case is that if there is a
'.data.rel.ro.local', then there should be '.fixup' section generated.

Please let me know if you need any other details.
Thanks.  Even though I wasn't able to trigger the bug with the testcase from
65018, I went ahead and committed this patch to the trunk.  It can't hurt and
it's the right thing to do.

Thanks for your patience,


Jeff, Thanks for checking-in the changes.
Can we apply the patch to GCC v4.8 and GCC v4.9 branch as well?
That's up to the branch maintainers. I'd think it's safe, but it's ultimately their call.

jeff

Reply via email to