From 8f911f374a47c411ae0e884e432db97807535421 Mon Sep 17 00:00:00 2001 From: hjl Date: Wed, 4 Feb 2015 20:02:21 +0000 Subject: [PATCH] Actually check in the fix git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220416 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/lra-eliminations.c | 2 ++ gcc/testsuite/gcc.target/i386/pr64905.c | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr64905.c diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c index fe05a1f2527..64eec4a003c 100644 --- a/gcc/lra-eliminations.c +++ b/gcc/lra-eliminations.c @@ -182,6 +182,8 @@ setup_can_eliminate (struct lra_elim_table *ep, bool value) if (! value && ep->from == FRAME_POINTER_REGNUM && ep->to == STACK_POINTER_REGNUM) frame_pointer_needed = 1; + if (!frame_pointer_needed) + REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = 0; } /* Map: eliminable "from" register -> its current elimination, diff --git a/gcc/testsuite/gcc.target/i386/pr64905.c b/gcc/testsuite/gcc.target/i386/pr64905.c new file mode 100644 index 00000000000..bc87d854928 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr64905.c @@ -0,0 +1,22 @@ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-options "-Os -ffixed-rax -ffixed-rbx -ffixed-rcx -ffixed-rdx -ffixed-rdi -ffixed-rsi -ffixed-r8 -ffixed-r9 -ffixed-r10 -ffixed-r11 -ffixed-r12 -ffixed-r13 -ffixed-r14 -ffixed-r15" } */ +/* { dg-final { scan-assembler-not "movl\[ \t\]0\\(%.*\\), %.*" } } */ + +typedef unsigned short uint16_t; +uint16_t a_global; + +void __attribute__ ((noinline)) +function (uint16_t **a_p) +{ + // unaligned access by address in %rbp: mov 0x0(%rbp),%ebp + a_global = **a_p; +} + +int main(int argc, char **argv) +{ + uint16_t array [4] = { 1, 2, 3, 4 }; + uint16_t *array_elem_p = &array [3]; + + function (&array_elem_p); + return 0; +} -- 2.11.4.GIT