Enable EBX for x86 in 32bits PIC code
Vladimir Makarov
vmakarov@redhat.com
Wed Aug 27 20:19:00 GMT 2014
On 2014-08-26 5:42 PM, Ilya Enkovich wrote:
> Hi,
>
> Here is a patch I tried. I apply it over revision 214215. Unfortunately I do not have a small reproducer but the problem can be easily reproduced on SPEC2000 benchmark 175.vpr. The problem is in read_arch.c:701 where float value is compared with float constant 1.0. It is inlined into read_arch function and can be easily found in RTL dump of function read_arch as a float comparison with 1.0 after the first call to strtod function.
>
> Here is a compilation string I use:
>
> gcc -m32 -mno-movbe -g3 -fdump-rtl-all-details -O2 -ffast-math -mfpmath=sse -m32 -march=slm -fPIE -pie -c -o read_arch.o -DSPEC_CPU2000 read_arch.c
>
> In my final assembler comparison with 1.0 looks like:
>
> comiss .LC11@GOTOFF(%ebp), %xmm0 # 1101 *cmpisf_sse [length = 7]
>
> and %ebp here doesn't have a proper value.
>
> I'll try to make a smaller reproducer if these instructions don't help.
I've managed to reproduce it. Although it would be better to send the
patch as an attachment.
The problem is actually in IRA not LRA. IRA splits pseudo used for PIC.
Then in a region when a *new* pseudo used as PIC we rematerialize a
constant which transformed in memory addressed through *original* PIC
pseudo.
To solve the problem we should prevent such splitting and guarantee that
PIC pseudo allocnos in different region gets the same hard reg.
The following patch should solve the problem.
-------------- next part --------------
Index: ira-color.c
===================================================================
--- ira-color.c (revision 214576)
+++ ira-color.c (working copy)
@@ -3239,9 +3239,10 @@
ira_assert (ALLOCNO_CLASS (subloop_allocno) == rclass);
ira_assert (bitmap_bit_p (subloop_node->all_allocnos,
ALLOCNO_NUM (subloop_allocno)));
- if ((flag_ira_region == IRA_REGION_MIXED)
- && (loop_tree_node->reg_pressure[pclass]
- <= ira_class_hard_regs_num[pclass]))
+ if ((flag_ira_region == IRA_REGION_MIXED
+ && (loop_tree_node->reg_pressure[pclass]
+ <= ira_class_hard_regs_num[pclass]))
+ || regno == (int) REGNO (pic_offset_table_rtx))
{
if (! ALLOCNO_ASSIGNED_P (subloop_allocno))
{
Index: ira-emit.c
===================================================================
--- ira-emit.c (revision 214576)
+++ ira-emit.c (working copy)
@@ -620,7 +620,8 @@
/* don't create copies because reload can spill an
allocno set by copy although the allocno will not
get memory slot. */
- || ira_equiv_no_lvalue_p (regno)))
+ || ira_equiv_no_lvalue_p (regno)
+ || ALLOCNO_REGNO (allocno) == REGNO (pic_offset_table_rtx)))
continue;
original_reg = allocno_emit_reg (allocno);
if (parent_allocno == NULL
More information about the Gcc
mailing list