aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/avr/avr.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/avr/avr.c')
-rw-r--r--gcc/config/avr/avr.c6
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)