[AArch64] Enable shrink wrapping.
authorRenlin Li <renlin.li@arm.com>
Tue, 23 Sep 2014 12:38:37 +0000 (12:38 +0000)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Tue, 23 Sep 2014 12:38:37 +0000 (12:38 +0000)
From-SVN: r215508

gcc/ChangeLog
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c
gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-2.c
gcc/testsuite/gcc.dg/pr10474.c

index c10f7f3a5e4e61e92581ed6fc51aa2ef2db38b58..576835f75b2550b8260348f87073af482d1034e5 100644 (file)
@@ -1,3 +1,10 @@
+2014-09-23  Renlin Li  <renlin.li@arm.com>
+
+       * config/aarch64/aarch64.md (return): New.
+       (simple_return): Likewise.
+       * config/aarch64/aarch64.c (aarch64_use_return_insn_p): New.
+       * config/aarch64/aarch64-protos.h (aarch64_use_return_insn_p): New.
+
 2014-09-23  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * common/config/aarch64/aarch64-common.c:
index 367253b0d78df7a5b82e61800a603740b3e1b2f9..e32ef645b68d4f367cc92f3953967c5a8ff81a25 100644 (file)
@@ -213,6 +213,7 @@ bool aarch64_simd_valid_immediate (rtx, enum machine_mode, bool,
                                   struct simd_immediate_info *);
 bool aarch64_symbolic_address_p (rtx);
 bool aarch64_uimm12_shift (HOST_WIDE_INT);
+bool aarch64_use_return_insn_p (void);
 const char *aarch64_output_casesi (rtx *);
 const char *aarch64_rewrite_selected_cpu (const char *name);
 
index 15c7be697d35b5e03424911141667ecd2aeb9653..348308109a98b0b0f9e2e70375b273f7d28fd0ee 100644 (file)
@@ -2340,6 +2340,26 @@ aarch64_expand_prologue (void)
     }
 }
 
+/* Return TRUE if we can use a simple_return insn.
+
+   This function checks whether the callee saved stack is empty, which
+   means no restore actions are need. The pro_and_epilogue will use
+   this to check whether shrink-wrapping opt is feasible.  */
+
+bool
+aarch64_use_return_insn_p (void)
+{
+  if (!reload_completed)
+    return false;
+
+  if (crtl->profile)
+    return false;
+
+  aarch64_layout_frame ();
+
+  return cfun->machine->frame.frame_size == 0;
+}
+
 /* Generate the epilogue instructions for returning from a function.  */
 void
 aarch64_expand_epilogue (bool for_sibcall)
index f15a516bb0559c86bea7512f91d60dc179ec9149..74b554ec4df78a963de6572c0175d0304d2bdf15 100644 (file)
   [(set_attr "type" "branch")]
 )
 
+(define_expand "return"
+  [(simple_return)]
+  "aarch64_use_return_insn_p ()"
+  ""
+)
+
+(define_insn "simple_return"
+  [(simple_return)]
+  ""
+  "ret"
+  [(set_attr "type" "branch")]
+)
+
 (define_insn "eh_return"
   [(unspec_volatile [(match_operand:DI 0 "register_operand" "r")]
     UNSPECV_EH_RETURN)]
index a3bd1eb23061105511425660c0cef9086da48af4..c354a42d4753d76c84d7e2efbbcca7b8d82409a3 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-24  Renlin Li  <renlin.li@arm.com>
+
+       * gcc.dg/ira-shrinkwrap-prep-1.c: Enable aarch64.
+       * gcc.dg/ira-shrinkwrap-prep-2.c: Likewise.
+       * gcc.dg/pr10474.c: Likewise.
+
 2014-09-20  Mark Wielaard  <mjw@redhat.com>
 
        * gcc.dg/guality/const-volatile.c (i): Mark as used.
index 5360844f4a47f0bc1985959d10ebdf3915018741..615f0329a4b1cf22b6bd04c18ad438b080557660 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { { x86_64-*-* && lp64 } || { { powerpc*-*-* && lp64 } || arm_nothumb } } } } */
+/* { dg-do compile { target { { x86_64-*-* && lp64 } || { { powerpc*-*-* && lp64 } || { arm_nothumb || { aarch64*-*-* && lp64 } } } } } } */
 /* { dg-options "-O3 -fdump-rtl-ira -fdump-rtl-pro_and_epilogue -fno-use-caller-save"  } */
 
 long __attribute__((noinline, noclone))
index d242cac8435749e61fcd1fb1fb2b60075f5dac2b..5f55937380208c8cf8b9d08a13be16a908b35d65 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { { x86_64-*-* && lp64 } || { { powerpc*-*-* && lp64 } || arm_nothumb } } } } */
+/* { dg-do compile { target { { x86_64-*-* && lp64 } || { { powerpc*-*-* && lp64 } || { arm_nothumb || { aarch64*-*-* && lp64 } } } } } } */
 /* { dg-options "-O3 -fdump-rtl-ira -fdump-rtl-pro_and_epilogue -fno-use-caller-save"  } */
 
 long __attribute__((noinline, noclone))
index 803fa108506bb6909897f7de6371839fd01b5329..e8dbd3c10b0877401552dee7221150b3ffb4d3ba 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { { x86_64-*-* && lp64 } || { { powerpc*-*-* && lp64 } || arm_nothumb } } } } */
+/* { dg-do compile { target { { x86_64-*-* && lp64 } || { { powerpc*-*-* && lp64 } || { arm_nothumb || { aarch64*-*-* && lp64 } } } } } } */
 /* { dg-options "-O3 -fdump-rtl-pro_and_epilogue"  } */
 
 void f(int *i)