On Fri, Nov 9, 2012 at 1:36 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Fri, Nov 09, 2012 at 01:29:18PM +0100, Uros Bizjak wrote:
>> On Fri, Nov 9, 2012 at 1:18 PM, Vladimir Yakovlev <vbyakov...@gmail.com> 
>> wrote:
>> >> These assert should tell you what is wrong with the control flow.
>> >> Please look at control_flow_insn_p, which condition returns true.
>> >
>> > There is a note after call insn.
>> >
>> > (call_insn:TI 908 35558 50534 1681 (call (mem:QI (symbol_ref:DI
>> > ("_gfortran_stop_string") [flags 0x41] <function_decl 0x7ffff7eb6200
>> > _gfortran_stop_string>) [0 _gfortran_stop_string S1 A8])
>> >         (const_int 0 [0])) huygens.fppized.f90:190 616 {*call}
>> >      (expr_list:REG_DEAD (reg:DI 5 di)
>> >         (expr_list:REG_DEAD (reg:SI 4 si)
>> >             (expr_list:REG_NORETURN (const_int 0 [0])
>> >                 (nil))))
>> >     (expr_list:REG_FRAME_RELATED_EXPR (use (reg:DI 5 di))
>> >         (expr_list:REG_BR_PRED (use (reg:SI 4 si))
>> >             (nil))))
>> > (note 50534 908 909 1681 (expr_list:REG_DEP_TRUE (concat:DI (reg:DI 5 di)
>> >         (const_int 0 [0]))
>> >     (expr_list:REG_DEP_TRUE (concat:SI (reg:SI 4 si)
>> >             (const_int 0 [0]))
>> >         (nil))) NOTE_INSN_CALL_ARG_LOCATION)
>> >
>>
>> Huh, this RTX is ignored:
>
> NOTE_INSN_CALL_ARG_LOCATION is fine, even after a REG_NORETURN call.
> It is just a way how to pass call argument details to dwarf2out.
> If you have a pass after var-tracking, you need to skip over it.

Yes, but postreload mode switching should come before pro_and_epilogue
anyway, otherwise create_pre_exit won't work:

--mode-switching.c (222)--
        /* If this function returns a value at the end, we have to
           insert the final mode switch before the return value copy
           to its hard register.  */
        if (EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 1
            && NONJUMP_INSN_P ((last_insn = BB_END (src_bb)))
            && GET_CODE (PATTERN (last_insn)) == USE
            && GET_CODE ((ret_reg = XEXP (PATTERN (last_insn), 0))) == REG)
--mode-switching.2 (228)--

I believe that this will work OK if the pass is inserted before
prologue generation pass.

Uros.

Reply via email to