diff options
author | Renlin Li <renlin.li@arm.com> | 2014-09-23 12:38:37 +0000 |
---|---|---|
committer | Marcus Shawcroft <mshawcroft@gcc.gnu.org> | 2014-09-23 12:38:37 +0000 |
commit | 4f9427792ea37fd06a9ca0dc965acaf04a33bbb2 (patch) | |
tree | c7bf6e14f4e2ff61a272c74cfad6cdad819769da | |
parent | de72c50f4ca7c11f92daf50c88da4a725ada029a (diff) | |
download | gcc-4f9427792ea37fd06a9ca0dc965acaf04a33bbb2.zip gcc-4f9427792ea37fd06a9ca0dc965acaf04a33bbb2.tar.gz gcc-4f9427792ea37fd06a9ca0dc965acaf04a33bbb2.tar.bz2 |
[AArch64] Enable shrink wrapping.
From-SVN: r215508
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 20 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.md | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-1.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ira-shrinkwrap-prep-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr10474.c | 2 |
8 files changed, 50 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c10f7f3..576835f 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 367253b..e32ef64 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 15c7be6..3483081 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 f15a516..74b554e 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 a3bd1eb..c354a42 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 5360844..615f032 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 d242cac..5f55937 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 803fa10..e8dbd3c 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) |