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]);