On Tue, Feb 3, 2015 at 7:16 PM, Alan Modra <amo...@gmail.com> wrote: > On Tue, Feb 03, 2015 at 11:14:49AM -0500, David Edelsohn wrote: >> On Tue, Feb 3, 2015 at 8:57 AM, Alan Modra <amo...@gmail.com> wrote: >> > PR target/64876 >> > * config/rs6000/rs6000.c (chain_already_loaded): New function. >> > (rs6000_call_aix): Use it. >> >> Okay with Jakub's suggested change. > > No, Jakub's change doesn't work, even if I add the looping in > chain_already_loaded that would need. We really do want to look at > just (the last insn in) the previous sequence. > > The trouble is that the current sequence, ie. the one emitted for > gen_call or gen_call_value, might be empty, *and* the previous > sequence, the one emitted by calls.c:emit_call_1, might be empty at > this point. (I found that fact out when my first implementation of > chain_already_loaded lacked the "last != NULL" test.) In that case > get_last_insn_anywhere() will give you rtl insns that aren't part of a > call sequence, and r11 is a general register that might be used for > anything. So a test for setting r11 is no longer a test for setting > the static chain.
What is the proposal? Testing only crtl->emit.sequence_stack->last does not seem to be sufficient. It seems like it really needs to test for more of the CALL sequence. Thanks, David