This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][10/10] -fuse-caller-save - Add test-case
- From: Tom de Vries <tom at codesourcery dot com>
- To: Richard Sandiford <rdsandiford at googlemail dot com>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 30 Mar 2013 10:12:15 -0700
- Subject: [PATCH][10/10] -fuse-caller-save - Add test-case
Richard,
This patch series adds analysis of register usage of functions for usage by IRA.
The original post is here
( http://gcc.gnu.org/ml/gcc-patches/2013-01/msg01234.html ).
This patch adds a test-case for -fuse-caller-save. Since the test-case has
different output for mips16 and micromips, new effective targets are introduced.
Build and reg-tested on mips.
OK for trunk?
Thanks,
-Tom
2013-03-30 Radovan Obradovic <robradovic@mips.com>
Tom de Vries <tom@codesourcery.com>
* lib/target-supports.exp (check_effective_target_mips16)
(check_effective_target_micromips): New proc.
* gcc.target/mips/mips.exp: Add use-caller-save to -ffoo/-fno-foo
options. Add -save-temps to mips_option_groups.
* gcc.target/mips/aru-1.c: New test.
diff --git a/gcc/testsuite/gcc.target/mips/aru-1.c b/gcc/testsuite/gcc.target/mips/aru-1.c
new file mode 100644
index 0000000..71515a9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/aru-1.c
@@ -0,0 +1,38 @@
+/* { dg-do run } */
+/* { dg-options "-fuse-caller-save -save-temps" } */
+/* { dg-skip-if "" { *-*-* } { "*" } { "-Os" } } */
+/* Testing -fuse-caller-save optimization option. */
+
+static int __attribute__((noinline))
+bar (int x)
+{
+ return x + 3;
+}
+
+int __attribute__((noinline))
+foo (int y)
+{
+ return y + bar (y);
+}
+
+int
+main (void)
+{
+ return !(foo (5) == 13);
+}
+
+/* Check that there are only 2 stack-saves: r31 in main and foo. */
+
+/* Variant not mips16. Check that there only 2 sw/sd. */
+/* { dg-final { scan-assembler-times "(?n)s\[wd\]\t\\\$.*,.*\\(\\\$sp\\)" 2 { target { ! mips16 } } } } */
+
+/* Variant not mips16, Subvariant micromips. Additionally check there's no
+ swm. */
+/* { dg-final { scan-assembler-times "(?n)swm\t\\\$.*,.*\\(\\\$sp\\)" 0 {target micromips } } } */
+
+/* Variant mips16. The save can save 1 or more registers, check that only 1 is
+ saved, twice in total. */
+/* { dg-final { scan-assembler-times "(?n)save\t\[0-9\]*,\\\$\[^,\]*\$" 2 { target mips16 } } } */
+
+/* Check that the first caller-save register is unused. */
+/* { dg-final { scan-assembler-not "(\\\$16)" } } */
diff --git a/gcc/testsuite/gcc.target/mips/mips.exp b/gcc/testsuite/gcc.target/mips/mips.exp
index 15b1386..63570bd 100644
--- a/gcc/testsuite/gcc.target/mips/mips.exp
+++ b/gcc/testsuite/gcc.target/mips/mips.exp
@@ -246,6 +246,7 @@ set mips_option_groups {
small-data "-G[0-9]+"
warnings "-w"
dump "-fdump-.*"
+ save_temps "-save-temps"
}
# Add -mfoo/-mno-foo options to mips_option_groups.
@@ -302,6 +303,7 @@ foreach option {
tree-vectorize
unroll-all-loops
unroll-loops
+ use-caller-save
} {
lappend mips_option_groups $option "-f(no-|)$option"
}
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index a146f17..dbd0037 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -918,6 +918,26 @@ proc check_effective_target_mips16_attribute { } {
} [add_options_for_mips16_attribute ""]]
}
+# Return 1 if the target generates mips16 code by default.
+
+proc check_effective_target_mips16 { } {
+ return [check_no_compiler_messages mips16 assembly {
+ #if !(defined __mips16)
+ #error FOO
+ #endif
+ } ""]
+}
+
+# Return 1 if the target generates micromips code by default.
+
+proc check_effective_target_micromips { } {
+ return [check_no_compiler_messages micromips assembly {
+ #if !(defined __mips_micromips)
+ #error FOO
+ #endif
+ } ""]
+}
+
# Return 1 if the target supports long double larger than double when
# using the new ABI, 0 otherwise.