diff options
Diffstat (limited to 'gcc/config/avr/avr.c')
-rw-r--r-- | gcc/config/avr/avr.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 26d6fdb..5099805 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -5125,6 +5125,12 @@ avr_hard_regno_mode_ok (int regno, enum machine_mode mode) if (regno == REG_Y + 1) return 0; + /* Reload can use r28:r29 for reload register and for frame pointer + in one insn. It's wrong. We must disable it. */ + if (mode != Pmode && reload_in_progress && frame_pointer_required_p () + && regno <= REG_Y && (regno + GET_MODE_SIZE (mode)) >= (REG_Y + 1)) + return 0; + if (mode == QImode) return 1; /* if (regno < 24 && !AVR_ENHANCED) |