From: Richard Sandiford Date: Mon, 5 Jul 2004 06:37:10 +0000 (+0000) Subject: re PR target/16357 (ICE copying 7 bytes between extern char[]s) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e0ec4c3b6bd191bc92fdab60bd4636480d68f870;p=gcc.git re PR target/16357 (ICE copying 7 bytes between extern char[]s) PR target/16357 * config/mips/mips.c (mips_block_move_straight): Pass BLKmode memrefs to mips_expand_unaligned_load, mips_expand_unaligned_store, and move_by_pieces. From-SVN: r84108 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2db8938a7ed..5d77ac0fc1e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-07-05 Richard Sandiford + + PR target/16357 + * config/mips/mips.c (mips_block_move_straight): Pass BLKmode memrefs + to mips_expand_unaligned_load, mips_expand_unaligned_store, and + move_by_pieces. + 2004-07-05 Josef Zlomek * var-tracking.c: Fix some comments. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index c2f7ce97f2f..8382b026818 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -3402,33 +3402,33 @@ mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length) the source has enough alignment, otherwise use left/right pairs. */ for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++) { - rtx part; - regs[i] = gen_reg_rtx (mode); - part = adjust_address (src, mode, offset); - if (MEM_ALIGN (part) >= bits) - emit_move_insn (regs[i], part); - else if (!mips_expand_unaligned_load (regs[i], part, bits, 0)) - abort (); + if (MEM_ALIGN (src) >= bits) + emit_move_insn (regs[i], adjust_address (src, mode, offset)); + else + { + rtx part = adjust_address (src, BLKmode, offset); + if (!mips_expand_unaligned_load (regs[i], part, bits, 0)) + abort (); + } } /* Copy the chunks to the destination. */ for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++) - { - rtx part; - - part = adjust_address (dest, mode, offset); - if (MEM_ALIGN (part) >= bits) - emit_move_insn (part, regs[i]); - else if (!mips_expand_unaligned_store (part, regs[i], bits, 0)) - abort (); - } + if (MEM_ALIGN (dest) >= bits) + emit_move_insn (adjust_address (dest, mode, offset), regs[i]); + else + { + rtx part = adjust_address (dest, BLKmode, offset); + if (!mips_expand_unaligned_store (part, regs[i], bits, 0)) + abort (); + } /* Mop up any left-over bytes. */ if (offset < length) { - src = adjust_address (src, mode, offset); - dest = adjust_address (dest, mode, offset); + src = adjust_address (src, BLKmode, offset); + dest = adjust_address (dest, BLKmode, offset); move_by_pieces (dest, src, length - offset, MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b90f61d17ac..82c559d4341 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-07-05 Richard Sandiford + + * gcc.c-torture/compile/20040705-1.c: New test. + 2004-07-04 Bud Davis * gfortran.fortran-torture/execute/seq_io.f90: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/20040705-1.c b/gcc/testsuite/gcc.c-torture/compile/20040705-1.c new file mode 100644 index 00000000000..1e45ee289bf --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20040705-1.c @@ -0,0 +1,2 @@ +extern char foo[], bar[]; +void f (void) { memcpy (foo, bar, 7); }