re PR c/35526 (ICE on memcpy)
authorUros Bizjak <uros@gcc.gnu.org>
Tue, 11 Mar 2008 12:47:29 +0000 (13:47 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 11 Mar 2008 12:47:29 +0000 (13:47 +0100)
PR middle-end/35526
* expr.c (store_expr): Call emit_block_move if the mode
of "temp" RTX is BLKmode.

testsuite/ChangeLog:

PR middle-end/35526
* g++.dg/torture/pr35526.C: New test.

From-SVN: r133106

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr35526.C [new file with mode: 0644]

index 3dae5cd52d8d7d51160c1255de2b99d6e1ebe384..a2e4e20450dc846078726afcb282d464142a36cf 100644 (file)
@@ -1,5 +1,11 @@
+2008-03-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR middle-end/35526
+       * expr.c (store_expr): Call emit_block_move if the mode
+       of "temp" RTX is BLKmode.
+
 2008-03-11  Andrew Pinski  <andrew_pinski@playstation.sony.com>
-       Richard Guenther  <rguenther@suse.de>
+           Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/31358
        * tree-ssa-loop-manip.c (create_iv): Call force_gimple_operand for
@@ -63,7 +69,7 @@
        to avoid conflicts.
 
 2008-03-10  Paul Brook  <paul@codesourcery.com>
-       Mark Shinwell  <shinwell@codesourcery.com>
+           Mark Shinwell  <shinwell@codesourcery.com>
 
        * config/arm/cortex-r4.md: New.
        * config/arm/thumb2.md (divsi3, udivsi3): Annotate with
        __absvsi2, __absvDI2): Use unsigned arithmetic.
 
 2008-03-02  Andi Kleen  <ak@suse.de>
-       Richard Guenther  <rguenther@suse.de>
+           Richard Guenther  <rguenther@suse.de>
 
        * struct-equiv.c: Remove file.
        * cfg_cleanup.c (condjump_equiv_p): Remove.
index 2cd6e627843e983e9f0f0afe768e5db28a17d284..300b63d88165a6a8b2a8c07b703682556a6259ac 100644 (file)
@@ -4654,7 +4654,8 @@ store_expr (tree exp, rtx target, int call_param_p, bool nontemporal)
              temp = convert_to_mode (GET_MODE (target), temp, unsignedp);
              emit_move_insn (target, temp);
            }
-         else if (GET_MODE (target) == BLKmode)
+         else if (GET_MODE (target) == BLKmode
+                  || GET_MODE (temp) == BLKmode)
            emit_block_move (target, temp, expr_size (exp),
                             (call_param_p
                              ? BLOCK_OP_CALL_PARM
index ad3523e5ecf4611c0f3e4951f1033d4d43bfce75..9d17b5b5569b66bebebca6de8a1c731899d2ea5a 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR middle-end/35526
+       * g++.dg/torture/pr35526.C: New test.
+
 2008-03-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/35328
diff --git a/gcc/testsuite/g++.dg/torture/pr35526.C b/gcc/testsuite/g++.dg/torture/pr35526.C
new file mode 100644 (file)
index 0000000..d0a8e6d
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+extern void *memcpy (void *__dest, __const void *__src, __SIZE_TYPE__  __n);
+
+char internal_crash_read_ip[] = { 0xb8 };
+
+struct u_internal_crash_read_t
+{
+  char ip[sizeof (internal_crash_read_ip)];
+}
+u_internal_crash_read;
+
+void
+gSignalHandler (int psignalNr, int pinfo, int pctx)
+{
+  memcpy (u_internal_crash_read.ip, internal_crash_read_ip,
+         sizeof (internal_crash_read_ip));
+}