> -----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? As mentioned earlier, the issue is still reproducible in GCC v4.8 branch [r223205] but not in GCC v4.9 branch. Regards, Rohit