aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl@gcc.gnu.org>2015-02-04 12:02:21 -0800
committerH.J. Lu <hjl@gcc.gnu.org>2015-02-04 12:02:21 -0800
commitd303ff9764d326120bfd05eb75e82e66fd12ade3 (patch)
treec06ea3aa98c46eede58a656ea99558d44917aae4
parent7489140d7d894778c5776cf7277af35b28d19d1a (diff)
downloadgcc-d303ff9764d326120bfd05eb75e82e66fd12ade3.zip
gcc-d303ff9764d326120bfd05eb75e82e66fd12ade3.tar.gz
gcc-d303ff9764d326120bfd05eb75e82e66fd12ade3.tar.bz2
Actually check in the fix
From-SVN: r220416
-rw-r--r--gcc/lra-eliminations.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/pr64905.c22
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c
index fe05a1f..64eec4a 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 0000000..bc87d85
--- /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;
+}