------- Comment #6 from davek at gcc dot gnu dot org 2010-09-12 23:45 ------- This is also present on i686-pc-cygwin:
> FAIL: gcc.target/i386/pr38240.c (internal compiler error) ICE happens here: (gdb) bt #0 0x006065e0 in convert_move (to=0x7fcc26c0, from=0x7fcc26d0, unsignedp=0) at /gnu/gcc/gcc-unpatched/gcc/expr.c:2944 #1 0x00609d2f in store_expr (exp=0x7fde2c10, target=0x7fcc26c0, call_param_p=0, nontemporal=0 '\0') at /gnu/gcc/gcc-unpatched/gcc/expr.c:2944 #2 0x0060f638 in expand_assignment (to=0x7fe20050, from=0x7fde2c10, nontemporal=0 '\0') at /gnu/gcc/gcc-unpatched/gcc/expr.c:2944 (...yes, the line number info is wrong, don't know why but it's unrelated.) The patch in r162918 tightens up the condition on calling emit_block_move: --- trunk/gcc/expr.c 2010/08/05 15:39:54 162917 +++ trunk/gcc/expr.c 2010/08/05 16:37:38 162918 @@ -4752,11 +4752,14 @@ { int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); if (GET_MODE (target) == BLKmode - || GET_MODE (temp) == BLKmode) + && GET_MODE (temp) == BLKmode) emit_block_move (target, temp, expr_size (exp), (call_param_p ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); + else if (GET_MODE (target) == BLKmode) + store_bit_field (target, INTVAL (expr_size (exp)) * BITS_PER_UNIT, + 0, GET_MODE (temp), temp); else convert_move (target, temp, unsignedp); } so that when temp is BLKmode and target is not, as in this case: (gdb) call debug_rtx (to) # aka target (mem/c/i:V4SF (reg/f:SI 58 [ D.1753 ]) [0 <retval>+0 S16 A128]) (gdb) call debug_rtx (from) # aka temp (mem/c/i:BLK (plus:SI (reg/f:SI 54 virtual-stack-vars) (const_int -16 [0xfffffff0])) [0 D.1747+0 S16 A128]) ... it falls through into the final else clause, and calls convert_move. However convert_move is unable to handle any BLKmode data at all: it has these asserts near the beginning, gcc_assert (to_mode != BLKmode); gcc_assert (from_mode != BLKmode); .. and the second one fires. -- davek at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |davek at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45325