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