[AArch64] Only maintain frame record when required or desired
From-SVN: r197215
This commit is contained in:
parent
2b24855e1e
commit
777e69760d
|
@ -1,3 +1,8 @@
|
||||||
|
2013-03-28 Ian Bolton <ian.bolton@arm.com>
|
||||||
|
|
||||||
|
* config/aarch64/aarch64.md (aarch64_can_eliminate): Keep frame
|
||||||
|
record only when desired or required.
|
||||||
|
|
||||||
2013-03-28 Uros Bizjak <ubizjak@gmail.com>
|
2013-03-28 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
* config/i386/i386.md (*vec_extract2vdi_1): Merge with
|
* config/i386/i386.md (*vec_extract2vdi_1): Merge with
|
||||||
|
|
|
@ -3879,14 +3879,21 @@ aarch64_can_eliminate (const int from, const int to)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* If we decided that we didn't need a frame pointer but then used
|
/* If we decided that we didn't need a leaf frame pointer but then used
|
||||||
LR in the function, then we do need a frame pointer after all, so
|
LR in the function, then we'll want a frame pointer after all, so
|
||||||
prevent this elimination to ensure a frame pointer is used. */
|
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
|
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 false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
2013-03-28 Ian Bolton <ian.bolton@arm.com>
|
||||||
|
|
||||||
|
* 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 <paolo.carlini@oracle.com>
|
2013-03-28 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/56725
|
PR c++/56725
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 } } */
|
|
@ -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 } } */
|
|
@ -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 } } */
|
|
@ -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 } } */
|
|
@ -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 } } */
|
|
@ -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 } } */
|
|
@ -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 } } */
|
|
@ -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 } } */
|
Loading…
Reference in New Issue