summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authormshawcroft <mshawcroft@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-23 12:38:37 +0000
committermshawcroft <mshawcroft@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-23 12:38:37 +0000
commita45f86dfc0d8b05d32b7fb323f41019609dbe6c9 (patch)
treec7bf6e14f4e2ff61a272c74cfad6cdad819769da /gcc
parentb0e7ddf0629ceecd2b7b3f99883117732c16b9bc (diff)
downloadgcc-a45f86dfc0d8b05d32b7fb323f41019609dbe6c9.tar.gz
[AArch64] Enable shrink wrapping.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215508 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/aarch64/aarch64-protos.h1
-rw-r--r--gcc/config/aarch64/aarch64.c20
-rw-r--r--gcc/config/aarch64/aarch64.md13
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr10474.c2
8 files changed, 50 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c10f7f3a5e4..576835f75b2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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:
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index 367253b0d78..e32ef645b68 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -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);
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 15c7be697d3..348308109a9 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -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)
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index f15a516bb05..74b554ec4df 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -360,6 +360,19 @@
[(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)]
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a3bd1eb2306..c354a42d475 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c b/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c
index 5360844f4a4..615f0329a4b 100644
--- a/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c
+++ b/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c
@@ -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))
diff --git a/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-2.c b/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-2.c
index d242cac8435..5f559373802 100644
--- a/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-2.c
+++ b/gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-2.c
@@ -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))
diff --git a/gcc/testsuite/gcc.dg/pr10474.c b/gcc/testsuite/gcc.dg/pr10474.c
index 803fa108506..e8dbd3c10b0 100644
--- a/gcc/testsuite/gcc.dg/pr10474.c
+++ b/gcc/testsuite/gcc.dg/pr10474.c
@@ -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)