[Bug target/48678] [4.6/4.7 Regression] unable to find a register to spill in class ‘GENERAL_REGS’
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 19 07:58:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48678
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ubizjak at gmail dot com
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-04-19 07:57:37 UTC ---
Having (strict_low_part (subreg:HI (reg:V2DI ...) 0)) on the LHS doesn't sound
like a good idea to me (and this is created already during expansion). Maybe
reload should be supposed to handle that (it could copy the V2DI reg into a
general reg, then do the movstrict on the general reg and then copy it back),
but IMHO it is never going to lead to efficient code. The following patch
fixes the ICE for me, but dunno if that is how we want to fix it.
Before the r161655 change arbitrary VCEs (in form of MEM_EXPR) weren't allowed
on
the LHS, so this wasn't a problem.
--- gcc/config/i386/i386.md.jj 2011-04-08 13:40:40.000000000 +0200
+++ gcc/config/i386/i386.md 2011-04-19 09:43:39.000000000 +0200
@@ -2408,6 +2408,9 @@ (define_expand "movstrict<mode>"
{
if (TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun))
FAIL;
+ if (GET_CODE (operands[0]) == SUBREG
+ && GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[0]))) != MODE_INT)
+ FAIL;
/* Don't generate memory->memory moves, go through a register */
if (MEM_P (operands[0]) && MEM_P (operands[1]))
operands[1] = force_reg (<MODE>mode, operands[1]);
More information about the Gcc-bugs
mailing list