This is an obvious fix for PR120856.
The ICE is relatively recent, and I don't see it in v15.
As it occurs when building libgcc with -mno-lra I went ahead
and installed a fix.
Johann
--
AVR: target/120856 - Deny R24:DI in avr_hard_regno_mode_ok with Reload.
This fixes an ICE with -mno-lra when split2 tries to split the following
zero_extendsidi2 insn:
(set (reg:DI 24)
(zero_extend:DI (reg:SI **)))
The ICE is because avr_hard_regno_mode_ok allows R24:DI but disallows
R28:SI when Reload is used. R28:SI is a result of zero_extendsidi2.
This ICE only occurs with Reload (which will die before very long),
but it occurs when building libgcc.
gcc/
PR target/120856
* config/avr/avr.cc (avr_hard_regno_mode_ok) [-mno-lra]: Deny
hard regs >= 4 bytes that overlap Y.
diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index f651692536b..c469297d6d0 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -14148,7 +14148,7 @@ avr_hard_regno_mode_ok (unsigned int regno,
machine_mode mode)
address registers is extreme stress test for reload. */
if (GET_MODE_SIZE (mode) >= 4
- && regno >= REG_X
+ && regno + GET_MODE_SIZE (mode) >= REG_30
// This problem only concerned the old reload.
&& ! avropt_lra_p)
return false;
j