------- 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

Reply via email to