]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
AVR: target/120856 - Deny R24:DI in avr_hard_regno_mode_ok with Reload.
authorGeorg-Johann Lay <avr@gjlay.de>
Sat, 28 Jun 2025 14:22:50 +0000 (16:22 +0200)
committerGeorg-Johann Lay <avr@gjlay.de>
Sat, 28 Jun 2025 14:40:18 +0000 (16:40 +0200)
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.

gcc/config/avr/avr.cc

index f651692536b1274ac6c801102eb2225fbe9a7a75..c469297d6d098ee94e1b5ce5c4b88c6bceea5243 100644 (file)
@@ -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;