PR54814 causes spill fails because reload.c:find_valid_class_1 tests only one hard register instead of all hard registers of regno:mode in rclass:
http://gcc.gnu.org/PR54814 The patch was originally worked out by Bernd Schmidt and fixed a problem introduced in http://gcc.gnu.org/r190252 The patch is bootstrapped and tested on x86_64-linux and also fixes the spill fails that originally occured on avr-unknown-one. Ok to apply? PR other/54814 * reload.c (find_valid_class_1): Use in_hard_reg_set_p instead of TEST_HARD_REG_BIT.
Index: gcc/reload.c =================================================================== --- gcc/reload.c (revision 194553) +++ gcc/reload.c (working copy) @@ -709,7 +709,7 @@ find_valid_class (enum machine_mode oute } /* We are trying to reload a subreg of something that is not a register. - Find the largest class which has at least one register valid in + Find the largest class which contains only registers valid in mode MODE. OUTER is the mode of the subreg, DEST_CLASS the class in which we would eventually like to obtain the object. */ @@ -729,10 +729,12 @@ find_valid_class_1 (enum machine_mode ou { int bad = 0; for (regno = 0; regno < FIRST_PSEUDO_REGISTER && !bad; regno++) - if (TEST_HARD_REG_BIT (reg_class_contents[rclass], regno) - && !HARD_REGNO_MODE_OK (regno, mode)) - bad = 1; - + { + if (in_hard_reg_set_p (reg_class_contents[rclass], mode, regno) + && !HARD_REGNO_MODE_OK (regno, mode)) + bad = 1; + } + if (bad) continue;