http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55235



--- Comment #4 from Uros Bizjak <ubizjak at gmail dot com> 2012-11-07 20:17:45 
UTC ---

Please note that before your patch, emit_block_move was never called.



Following patch fixes testcase for me:



--cut here--

Index: expr.c

===================================================================

--- expr.c      (revision 193296)

+++ expr.c      (working copy)

@@ -5246,19 +5246,12 @@ store_expr (tree exp, rtx target, int call_param_p

        {

          if (GET_MODE (target) == BLKmode)

            {

-             if (REG_P (temp))

-               {

-                 if (TREE_CODE (exp) == CALL_EXPR)

-                   copy_blkmode_from_reg (target, temp, TREE_TYPE (exp));

-                 else

-                   store_bit_field (target,

-                                    INTVAL (expr_size (exp)) * BITS_PER_UNIT,

-                                    0, 0, 0, GET_MODE (temp), temp);

-               }

+             if (REG_P (temp) && TREE_CODE (exp) == CALL_EXPR)

+               copy_blkmode_from_reg (target, temp, TREE_TYPE (exp));

              else

-               emit_block_move (target, temp, expr_size (exp),

-                                (call_param_p

-                                 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));

+               store_bit_field (target,

+                                INTVAL (expr_size (exp)) * BITS_PER_UNIT,

+                                0, 0, 0, GET_MODE (temp), temp);

            }

          else

            convert_move (target, temp, TYPE_UNSIGNED (TREE_TYPE (exp)));

--cut here--



I am running bootstrap and regression test.

Reply via email to