https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116780

--- Comment #4 from denisc at gcc dot gnu.org ---
After IRA we have:
---------------------------------------
;; bb 2 artificial_defs: { }
;; bb 2 artificial_uses: { u-1(28){ }u-1(32){ }u-1(34){ }}
;; lr  in  28 [r28] 29 [r29] 32 [__SP_L__] 34 [argL]
;; lr  use 28 [r28] 29 [r29] 32 [__SP_L__] 34 [argL]
;; lr  def
(note 3 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
(insn 5 2 0 2 (set (mem/v:QI (plus:HI (reg/f:HI 28 r28)
                (const_int 1 [0x1])) [0 c[0]+0 S1 A8])
        (const_int 0 [0])) "a.c":5:8 86 {movqi_insn_split}
     (expr_list:REG_DEAD (reg:QI 29 r29)
        (nil)))
;;  succ:       EXIT [always]  count:1073741824 (estimated locally, freq
1.0000) (FALLTHRU) a.c:6:1
;; lr  out 28 [r28] 32 [__SP_L__] 34 [argL]
---------------------------------------

We have only one executable insn in test function `a' after IRA:
(insn 5 2 0 2 (set (mem/v:QI (plus:HI (reg/f:HI 28 r28)
                (const_int 1 [0x1])) [0 c[0]+0 S1 A8])
        (const_int 0 [0])) "a.c":5:8 86 {movqi_insn_split}
     (expr_list:REG_DEAD (reg:QI 29 r29)
        (nil)))

(reg:HI 28) is a frame pointer register Y or R28,r29 
LRA tries to eliminate frame pointer to stack pointer and uses
TARGET_FRAME_POINTER_REQUIRED hook.

The hook:
static bool
avr_frame_pointer_required_p (void) 
{
  return (cfun->calls_alloca
  || cfun->calls_setjmp
  || cfun->has_nonlocal_label
  || crtl->args.info.has_stack_args
  || get_frame_size () > 0);
}

The hook return `true' because frame size is 0.

After LRA we have:
---------------------------------------
;; bb 2 artificial_defs: { }
;; bb 2 artificial_uses: { u-1(32){ }}
;; lr  in  32 [__SP_L__] 33 [__SP_H__]
;; lr  use 32 [__SP_L__] 33 [__SP_H__]
;; lr  def
(note 3 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
(insn 5 2 8 2 (set (mem/v:QI (plus:HI (reg/f:HI 32 __SP_L__)
                (const_int 1 [0x1])) [0 c[0]+0 S1 A8])
        (const_int 0 [0])) "a.c":5:8 86 {movqi_insn_split}
     (nil))
;;  succ:       EXIT [always]  count:1073741824 (estimated locally, freq
1.0000) (FALLTHRU) a.c:6:1
;; lr  out 32 [__SP_L__]
---------------------------------------

insn 5 has a wrong address. AVR can't use (reg/f:HI 32 __SP_L__) as an address
register.

Probably we have two bugs:
1. AVR port assumes that LRA (or reload) can eliminate frame pointer to stack
pointer (if no args and frame size = 0). It's wrong for this testcase;
2. LRA made a wrong elimination (may be because of AVR port have a wrong insn
definition or something else)

Reply via email to