diff mbox

PR rtl-optimization/64905: Clear hard frame pointer alignment if not needed

Message ID CAMe9rOo9X2CzzU2pYqf-bPGfhSCUEaiq-9zF-Y85WK-_F2HJKw@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu Feb. 4, 2015, 7:36 p.m. UTC
On Wed, Feb 4, 2015 at 11:20 AM, Vladimir Makarov <vmakarov@redhat.com> wrote:
>
> On 2015-02-04 11:16 AM, H.J. Lu wrote:
>>
>> When hard frame pointer isn't needed, the register for hard frame pointer
>> may be reused.  This patch clears alignment on hard frame pointer if hard
>> frame pointer isn't needed.  OK for trunk after bootstrap and test on
>> Linux/x86-64?
>
> LRA can set up frame_pointer_needed in some complicated cases (in
> lra-eliminations.c::setup_can_eliminate).  So I'd reset REGNO_POINTER_ALIGN
> in setup_can_eleminate for any case even although without the change the
> patch is safe.
>
> So, H.J., if you add resetting REGNO_POINTER_ALIGN in setup_can_eliminate,
> the patch is automatically approved.

This is what I checked in.

Thanks.
diff mbox

Patch

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;
+}