From 777e69760d2e68900b2b9460124c2327e651cca2 Mon Sep 17 00:00:00 2001 From: Ian Bolton Date: Thu, 28 Mar 2013 20:33:15 +0000 Subject: [PATCH] [AArch64] Only maintain frame record when required or desired From-SVN: r197215 --- gcc/ChangeLog | 5 ++ gcc/config/aarch64/aarch64.c | 15 ++++-- gcc/testsuite/ChangeLog | 13 +++++ .../gcc.target/aarch64/asm-adder-clobber-lr.c | 48 +++++++++++++++++++ .../aarch64/asm-adder-no-clobber-lr.c | 48 +++++++++++++++++++ .../gcc.target/aarch64/test-framepointer-1.c | 30 ++++++++++++ .../gcc.target/aarch64/test-framepointer-2.c | 30 ++++++++++++ .../gcc.target/aarch64/test-framepointer-3.c | 30 ++++++++++++ .../gcc.target/aarch64/test-framepointer-4.c | 32 +++++++++++++ .../gcc.target/aarch64/test-framepointer-5.c | 30 ++++++++++++ .../gcc.target/aarch64/test-framepointer-6.c | 30 ++++++++++++ .../gcc.target/aarch64/test-framepointer-7.c | 30 ++++++++++++ .../gcc.target/aarch64/test-framepointer-8.c | 32 +++++++++++++ 13 files changed, 369 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/asm-adder-clobber-lr.c create mode 100644 gcc/testsuite/gcc.target/aarch64/asm-adder-no-clobber-lr.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-7.c create mode 100644 gcc/testsuite/gcc.target/aarch64/test-framepointer-8.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73b5c9f5c23..858d96ebd98 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-03-28 Ian Bolton + + * config/aarch64/aarch64.md (aarch64_can_eliminate): Keep frame + record only when desired or required. + 2013-03-28 Uros Bizjak * config/i386/i386.md (*vec_extract2vdi_1): Merge with diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index d51b8d04bb0..6a024d09044 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -3879,14 +3879,21 @@ aarch64_can_eliminate (const int from, const int to) } else { - /* If we decided that we didn't need a frame pointer but then used - LR in the function, then we do need a frame pointer after all, so - prevent this elimination to ensure a frame pointer is used. */ + /* If we decided that we didn't need a leaf frame pointer but then used + LR in the function, then we'll want a frame pointer after all, so + prevent this elimination to ensure a frame pointer is used. + NOTE: the original value of flag_omit_frame_pointer gets trashed + IFF flag_omit_leaf_frame_pointer is true, so we check the value + of faked_omit_frame_pointer here (which is true when we always + wish to keep non-leaf frame pointers but only wish to keep leaf frame + pointers when LR is clobbered). */ if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM - && df_regs_ever_live_p (LR_REGNUM)) + && df_regs_ever_live_p (LR_REGNUM) + && faked_omit_frame_pointer) return false; } + return true; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c5f0c2796b7..c1f0392b0bc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2013-03-28 Ian Bolton + + * gcc.target/aarch64/inc/asm-adder-clobber-lr.c: New test. + * gcc.target/aarch64/inc/asm-adder-no-clobber-lr.c: Likewise. + * gcc.target/aarch64/test-framepointer-1.c: Likewise. + * gcc.target/aarch64/test-framepointer-2.c: Likewise. + * gcc.target/aarch64/test-framepointer-3.c: Likewise. + * gcc.target/aarch64/test-framepointer-4.c: Likewise. + * gcc.target/aarch64/test-framepointer-5.c: Likewise. + * gcc.target/aarch64/test-framepointer-6.c: Likewise. + * gcc.target/aarch64/test-framepointer-7.c: Likewise. + * gcc.target/aarch64/test-framepointer-8.c: Likewise. + 2013-03-28 Paolo Carlini PR c++/56725 diff --git a/gcc/testsuite/gcc.target/aarch64/asm-adder-clobber-lr.c b/gcc/testsuite/gcc.target/aarch64/asm-adder-clobber-lr.c new file mode 100644 index 00000000000..8a02abc0726 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/asm-adder-clobber-lr.c @@ -0,0 +1,48 @@ +extern void abort (void); + +int +adder (int a, int b) +{ + int result; + __asm__ ("add %w0,%w1,%w2" : "=r"(result) : "r"(a), "r"(b) : "x30"); + return result; +} + +int +main (int argc, char** argv) +{ + int i; + int total = argc; + for (i = 0; i < 20; i++) + total = adder (total, i); + + if (total != (190 + argc)) + abort (); + + return 0; +} + +extern void abort (void); + +int +adder (int a, int b) +{ + int result; + __asm__ ("add %w0,%w1,%w2" : "=r"(result) : "r"(a), "r"(b) : "x30"); + return result; +} + +int +main (int argc, char** argv) +{ + int i; + int total = argc; + for (i = 0; i < 20; i++) + total = adder (total, i); + + if (total != (190 + argc)) + abort (); + + return 0; +} + diff --git a/gcc/testsuite/gcc.target/aarch64/asm-adder-no-clobber-lr.c b/gcc/testsuite/gcc.target/aarch64/asm-adder-no-clobber-lr.c new file mode 100644 index 00000000000..f60cfd3ed64 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/asm-adder-no-clobber-lr.c @@ -0,0 +1,48 @@ +extern void abort (void); + +int +adder (int a, int b) +{ + int result; + __asm__ ("add %w0,%w1,%w2" : "=r"(result) : "r"(a), "r"(b) : ); + return result; +} + +int +main (int argc, char** argv) +{ + int i; + int total = argc; + for (i = 0; i < 20; i++) + total = adder (total, i); + + if (total != (190 + argc)) + abort (); + + return 0; +} + +extern void abort (void); + +int +adder (int a, int b) +{ + int result; + __asm__ ("add %w0,%w1,%w2" : "=r"(result) : "r"(a), "r"(b) : ); + return result; +} + +int +main (int argc, char** argv) +{ + int i; + int total = argc; + for (i = 0; i < 20; i++) + total = adder (total, i); + + if (total != (190 + argc)) + abort (); + + return 0; +} + diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-1.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-1.c new file mode 100644 index 00000000000..ae109591744 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-1.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is FALSE. + LR is not being clobbered in the leaf. + + With no frame pointer omissions, we expect a frame record + for main and the leaf. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 2 } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is FALSE. + LR is not being clobbered in the leaf. + + With no frame pointer omissions, we expect a frame record + for main and the leaf. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 2 } } */ + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-2.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-2.c new file mode 100644 index 00000000000..71bc58da84f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-2.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is false, but irrelevant due to omit-frame-pointer. + LR is not being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is false, but irrelevant due to omit-frame-pointer. + LR is not being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-3.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-3.c new file mode 100644 index 00000000000..de1b32c18c3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-3.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is true, but irrelevant due to omit-frame-pointer. + LR is not being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is true, but irrelevant due to omit-frame-pointer. + LR is not being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-4.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-4.c new file mode 100644 index 00000000000..d339263c4c3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-4.c @@ -0,0 +1,32 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is TRUE. + LR is not being clobbered in the leaf. + + Unless we are removing all frame records, it's OK to remove the frame + record for a leaf where LR is not clobbered. Therefore, we expect a + frame record only in main. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 1 } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-no-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is TRUE. + LR is not being clobbered in the leaf. + + Unless we are removing all frame records, it's OK to remove the frame + record for a leaf where LR is not clobbered. Therefore, we expect a + frame record only in main. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 1 } } */ + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-5.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-5.c new file mode 100644 index 00000000000..4be297a5e4a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-5.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is FALSE. + LR is being clobbered in the leaf. + + With no frame pointer omissions, we expect a frame record for main + and the leaf. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 2 } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is FALSE. + LR is being clobbered in the leaf. + + With no frame pointer omissions, we expect a frame record for main + and the leaf. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 2 } } */ + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-6.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-6.c new file mode 100644 index 00000000000..bf53962608a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-6.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is false, but irrelevant due to omit-frame-pointer. + LR is being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -mno-omit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is false, but irrelevant due to omit-frame-pointer. + LR is being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-7.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-7.c new file mode 100644 index 00000000000..9e88ae3bd6a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-7.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is true, but irrelevant due to omit-frame-pointer. + LR is being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is TRUE. + omit-leaf-frame-pointer is true, but irrelevant due to omit-frame-pointer. + LR is being clobbered in the leaf. + + Since we asked to have no frame pointers anywhere, we expect no frame + record in main or the leaf. */ + +/* { dg-final { scan-assembler-not "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" } } */ + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/test-framepointer-8.c b/gcc/testsuite/gcc.target/aarch64/test-framepointer-8.c new file mode 100644 index 00000000000..08d7667ea77 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/test-framepointer-8.c @@ -0,0 +1,32 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is TRUE. + LR is being clobbered in the leaf. + + Unless we are removing all frame records (which we aren't), it's + not OK to remove the frame record for a leaf where LR is clobbered. + Therefore, we expect a frame record in main and leaf. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 2 } } */ + +/* { dg-final { cleanup-saved-temps } } */ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-omit-frame-pointer -momit-leaf-frame-pointer -fno-inline --save-temps" } */ + +#include "asm-adder-clobber-lr.c" + +/* omit-frame-pointer is FALSE. + omit-leaf-frame-pointer is TRUE. + LR is being clobbered in the leaf. + + Unless we are removing all frame records (which we aren't), it's + not OK to remove the frame record for a leaf where LR is clobbered. + Therefore, we expect a frame record in main and leaf. */ + +/* { dg-final { scan-assembler-times "stp\tx29, x30, \\\[sp, -\[0-9\]+\\\]!" 2 } } */ + +/* { dg-final { cleanup-saved-temps } } */