i386.c (legitimate_address_p): Accept other bases than pic_offset_table_rtx for GOTOFF constructs.

* i386.c (legitimate_address_p): Accept other bases than
	pic_offset_table_rtx for GOTOFF constructs.

From-SVN: r35424
This commit is contained in:
Jan Hubicka 2000-08-02 14:28:14 +00:00 committed by Jan Hubicka
parent ca4ae08d95
commit 4e9efe546e
2 changed files with 26 additions and 8 deletions

View File

@ -1,3 +1,8 @@
Wed Aug 2 16:26:15 MET DST 2000 Jan Hubicka <jh@suse.cz>
* i386.c (legitimate_address_p): Accept other bases than
pic_offset_table_rtx for GOTOFF constructs.
Wed Aug 2 15:59:34 MET DST 2000 Jan Hubicka <jh@suse.cz>
* i386.md (shift to lea splitter): Use const_int_operand.

View File

@ -2506,14 +2506,27 @@ legitimate_address_p (mode, addr, strict)
goto error;
}
/* Verify that a symbolic pic displacement includes
the pic_offset_table_rtx register. */
if (base != pic_offset_table_rtx
&& (index != pic_offset_table_rtx || scale != 1))
/* This code used to verify that a symbolic pic displacement
includes the pic_offset_table_rtx register.
While this is good idea, unfortunately these constructs may
be created by "adds using lea" optimization for incorrect
code like:
int a;
int foo(int i)
{
reason = "pic displacement against invalid base";
goto error;
return *(&a+i);
}
This code nonsential, but results in addressing
GOT table with pic_offset_table_rtx base. We can't
just refuse it easilly, since it gets matched by
"addsi3" pattern, that later gets split to lea in the
case output register differs from input. While this
can be handled by separate addsi pattern for this case
that never results in lea, this seems to be easier and
correct fix for crash to disable this test. */
}
else if (HALF_PIC_P ())
{