diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90f51cc506e..503f008dc61 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Aug 2 16:26:15 MET DST 2000 Jan Hubicka + + * 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 * i386.md (shift to lea splitter): Use const_int_operand. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c5289ab836f..68a78e93314 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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)) - { - reason = "pic displacement against invalid base"; - goto error; - } + /* 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) + { + 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 ()) {