This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Add unwind information to mips epilogues
On 09/08/11 16:08, Richard Sandiford wrote:
> I suppose I still don't get why this is OK but this:
>
>> @@ -10324,12 +10350,26 @@ mips_expand_epilogue (bool sibcall_p)
>> if (!TARGET_MIPS16)
>> target = stack_pointer_rtx;
>>
>> - emit_insn (gen_add3_insn (target, base, adjust));
>> + insn = emit_insn (gen_add3_insn (target, base, adjust));
>> + if (!frame_pointer_needed && target == stack_pointer_rtx)
>> + {
>> + RTX_FRAME_RELATED_P (insn) = 1;
>> + add_reg_note (insn, REG_CFA_DEF_CFA,
>> + plus_constant (stack_pointer_rtx, step2));
>> + }
>
> triggered ICEs without the !frame_pointer_required. I think I need
> to play around with it a bit before I understand enough to review.
> I'll try to find time this weekend.
I've rebuilt and tested it again (shrink-wrapping included, not sure if
it makes a difference). What seems to happen is that we have
(insn/f 60 59 61 2 (set (reg/f:SI 30 $fp) (reg/f:SI 29 $sp))
(note 61 60 8 2 NOTE_INSN_PROLOGUE_END)
(jump_insn 8 61 49 2 (set (pc)
(if_then_else (eq (reg/v:SI 4 $4 [orig:196 b ] [196])
(reg:SI 2 $2 [198]))
(label_ref:SI 29) (pc)))
[...]
(jump_insn 10 9 48 3 (set (pc)
(if_then_else (eq (reg/v:SI 4 $4 [orig:196 b ] [196])
(reg:SI 2 $2 [199]))
(label_ref:SI 29) (pc)))
(note 48 10 62 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
(note 62 48 63 4 NOTE_INSN_EPILOGUE_BEG)
(insn/f 63 62 64 4 (set (reg/f:SI 29 $sp) (reg/f:SI 30 $fp))
(REG_CFA_DEF_CFA (plus:SI (reg/f:SI 29 $sp) (const_int 8))
and reorg.c manages to hoist insn 63 into a delay slot for jump_insn 10.
Presumably it saw insn 60 somehow? In any case, we can now arrive at
label 29 with either FP or SP as CFA reg.
This is gcc.dg/pr49994-1.c.
Bernd