------- Comment #1 from dave at hiauly1 dot hia dot nrc dot ca  2006-02-05 
20:11 -------
Subject: Re:  ICE: Segmentation fault (program cc1) compiling _muldi3.o in
stage1

>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>            Keywords|                            |wrong-code

The problem is with indirect calls.  For reasons that I don't understand,
the HP linker replaces the code sequence generated by GCC

        .CALL   ARGW0=GR
        b,l $$dyncall,%r2
        copy %r2,%r31

with

0x008d705c <htab_create_alloc+92>:      be,l 27d68(sr4,r0),%sr0,%r31
0x008d7060 <htab_create_alloc+96>:      copy rp,r31

r2 and rp are the same.  The "b,l" is a 22-bit pc-relative branch.
It can only use r2 as the link register.  The linker has gone and
substituted the "be,l" branch which uses r31 as the link.  As a
result, r2 isn't set by the call and the code returns a second time
to the return point of the previous call.

If I was certain that the linker was always going to do the substitution,
the the "copy" could be adjusted.  However, the linker can only do the
substitution when the offset is a 17-bit offset.  When I wrote, the code
to use the 22-bit branch, I am fairly certain that I checked that the
linker didn't do the "be,l" substitution when a "b,l" was used.

I guess this optimization has to be removed on hpux.

Dave


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26109

Reply via email to