On Tue, Sep 06, 2011 at 01:11:26AM +0930, Alan Modra wrote:
> Consequently, Mike's change to split rtl for
> indirect calls sometimes sees the scheduler moving the r2 load in the
> indirect call sequence before a toc reference.

Actually, this isn't correct.  Mike's change adding rs6000.c
rs6000_call_indirect_aix just made it more likely.  Even before this
post-reload scheduling could move the r2 load around, since rs6000.md
call_indirect_aix patterns were (and still are) split post-reload.

Here's an example I was shown today of such damage (qemu compiled
with gcc-4.6-redhat).

.LVL57151:
        ld 0,0(31)                      # load opd+0, function addr
        addis 4,2,.LC4758@toc@ha
        ld 11,16(31)
        mr 7,3
        std 2,40(1)                     # save r2
        mr 5,25
        addi 4,4,.LC4758@toc@l
        mtctr 0                         #
        mr 6,26
        ld 2,8(31)                      # load opd+8, new toc ptr in r2
        mr 3,28
.LBB255670:
.LBB255668:
        .loc 8 98 0
        addis 27,2,.LC4761@toc@ha       # oops, should be using old r2
.LVL57152:
        addi 27,27,.LC4761@toc@l
.LBE255668:
.LBE255670:
        .loc 3 9212 0
        addis 25,2,.LC4762@toc@ha       # oops again
        .loc 3 9198 0
        bctrl                           # make the call
        ld 2,40(1)                      # restore r2

r27 and r25 set up here for later use now contain bogus values.
The blame rests on my 2011-06-20 change.

-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to