re PR target/16176 (Miscompilation of unaligned data in MIPS backend (SB1 flavor))
PR target/16176 * config/mips/mips.c (mips_expand_unaligned_load): Use a temporary register for the destination of the lwl or ldl. From-SVN: r83668
This commit is contained in:
parent
2fbe90f224
commit
f1526aaae7
4 changed files with 36 additions and 7 deletions
|
@ -1,3 +1,9 @@
|
|||
2004-06-25 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
PR target/16176
|
||||
* config/mips/mips.c (mips_expand_unaligned_load): Use a temporary
|
||||
register for the destination of the lwl or ldl.
|
||||
|
||||
2004-06-25 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
* tree-cfg.c (verify_expr): Add macro CHECK_OK.
|
||||
|
|
|
@ -4434,7 +4434,7 @@ mips_get_unaligned_mem (rtx *op, unsigned int width, int bitpos,
|
|||
bool
|
||||
mips_expand_unaligned_load (rtx dest, rtx src, unsigned int width, int bitpos)
|
||||
{
|
||||
rtx left, right;
|
||||
rtx left, right, temp;
|
||||
|
||||
/* If TARGET_64BIT, the destination of a 32-bit load will be a
|
||||
paradoxical word_mode subreg. This is the only case in which
|
||||
|
@ -4453,17 +4453,16 @@ mips_expand_unaligned_load (rtx dest, rtx src, unsigned int width, int bitpos)
|
|||
if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
|
||||
return false;
|
||||
|
||||
temp = gen_reg_rtx (GET_MODE (dest));
|
||||
if (GET_MODE (dest) == DImode)
|
||||
{
|
||||
emit_insn (gen_mov_ldl (dest, src, left));
|
||||
emit_insn (gen_mov_ldr (copy_rtx (dest), copy_rtx (src),
|
||||
right, copy_rtx (dest)));
|
||||
emit_insn (gen_mov_ldl (temp, src, left));
|
||||
emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
|
||||
}
|
||||
else
|
||||
{
|
||||
emit_insn (gen_mov_lwl (dest, src, left));
|
||||
emit_insn (gen_mov_lwr (copy_rtx (dest), copy_rtx (src),
|
||||
right, copy_rtx (dest)));
|
||||
emit_insn (gen_mov_lwl (temp, src, left));
|
||||
emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2004-06-25 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
* gcc.c-torture/execute/20040625-1.c: New test.
|
||||
|
||||
2004-06-25 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* gfortran.fortran-torture/execute/der_init_3.f90: Fix syntax error.
|
||||
|
|
20
gcc/testsuite/gcc.c-torture/execute/20040625-1.c
Normal file
20
gcc/testsuite/gcc.c-torture/execute/20040625-1.c
Normal file
|
@ -0,0 +1,20 @@
|
|||
/* From PR target/16176 */
|
||||
struct __attribute__ ((packed)) s { struct s *next; };
|
||||
|
||||
struct s * __attribute__ ((noinline))
|
||||
maybe_next (struct s *s, int t)
|
||||
{
|
||||
if (t)
|
||||
s = s->next;
|
||||
return s;
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
struct s s1, s2;
|
||||
|
||||
s1.next = &s2;
|
||||
if (maybe_next (&s1, 1) != &s2)
|
||||
abort ();
|
||||
exit (0);
|
||||
}
|
Loading…
Add table
Reference in a new issue