Commit 525e67c1 by Richard Henderson Committed by Richard Henderson

re PR target/24178 (generates code that produces unaligned access exceptions)

        PR target/24178
        * config/alpha/alpha.c (get_aligned_mem): Honor alignment given
        by MEM_ALIGN.

From-SVN: r106388
parent f85f1ca7
2005-11-02 Richard Henderson <rth@redhat.com>
PR target/24178
* config/alpha/alpha.c (get_aligned_mem): Honor alignment given
by MEM_ALIGN.
2005-11-01 Richard Henderson <rth@redhat.com> 2005-11-01 Richard Henderson <rth@redhat.com>
PR 21518 PR 21518
......
...@@ -1487,7 +1487,7 @@ void ...@@ -1487,7 +1487,7 @@ void
get_aligned_mem (rtx ref, rtx *paligned_mem, rtx *pbitnum) get_aligned_mem (rtx ref, rtx *paligned_mem, rtx *pbitnum)
{ {
rtx base; rtx base;
HOST_WIDE_INT offset = 0; HOST_WIDE_INT disp, offset;
gcc_assert (GET_CODE (ref) == MEM); gcc_assert (GET_CODE (ref) == MEM);
...@@ -1495,23 +1495,34 @@ get_aligned_mem (rtx ref, rtx *paligned_mem, rtx *pbitnum) ...@@ -1495,23 +1495,34 @@ get_aligned_mem (rtx ref, rtx *paligned_mem, rtx *pbitnum)
&& ! memory_address_p (GET_MODE (ref), XEXP (ref, 0))) && ! memory_address_p (GET_MODE (ref), XEXP (ref, 0)))
{ {
base = find_replacement (&XEXP (ref, 0)); base = find_replacement (&XEXP (ref, 0));
gcc_assert (memory_address_p (GET_MODE (ref), base)); gcc_assert (memory_address_p (GET_MODE (ref), base));
} }
else else
base = XEXP (ref, 0); base = XEXP (ref, 0);
if (GET_CODE (base) == PLUS) if (GET_CODE (base) == PLUS)
offset += INTVAL (XEXP (base, 1)), base = XEXP (base, 0); disp = INTVAL (XEXP (base, 1)), base = XEXP (base, 0);
else
disp = 0;
/* Find the byte offset within an aligned word. If the memory itself is
claimed to be aligned, believe it. Otherwise, aligned_memory_operand
will have examined the base register and determined it is aligned, and
thus displacements from it are naturally alignable. */
if (MEM_ALIGN (ref) >= 32)
offset = 0;
else
offset = disp & 3;
*paligned_mem /* Access the entire aligned word. */
= widen_memory_access (ref, SImode, (offset & ~3) - offset); *paligned_mem = widen_memory_access (ref, SImode, -offset);
/* Convert the byte offset within the word to a bit offset. */
if (WORDS_BIG_ENDIAN) if (WORDS_BIG_ENDIAN)
*pbitnum = GEN_INT (32 - (GET_MODE_BITSIZE (GET_MODE (ref)) offset = 32 - (GET_MODE_BITSIZE (GET_MODE (ref)) + offset * 8);
+ (offset & 3) * 8));
else else
*pbitnum = GEN_INT ((offset & 3) * 8); offset *= 8;
*pbitnum = GEN_INT (offset);
} }
/* Similar, but just get the address. Handle the two reload cases. /* Similar, but just get the address. Handle the two reload cases.
......
/* { dg-do compile } */
/* { dg-options "-O2 -mcpu=ev4" } */
struct S {
long l;
unsigned char c;
};
unsigned long f(unsigned char *p10) {
struct S *p = (struct S *) (p10 + 10);
return p->c;
}
/* { dg-final { scan-assembler "ldl.*,18\\(" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment