On Thu, Dec 01, 2016 at 09:00:11PM -0500, David Malcolm wrote: > This patch adds more selftests for class function_reader, where > the dumps to be read contain aarch64-specific features. > > In an earlier version of the patch kit, these were handled using > #ifndef GCC_AARCH64_H to conditionalize running them. > This version instead runs them via a target hook for running > target-specific selftests, thus putting them within aarch64.c.
I'm probably missing something obvious here. This looks OK, but can we have a comment somewhere near the code as to what this test is actually testing? Is it just that x0 is correctly identfied as the return register? Thanks, James > > gcc/ChangeLog: > * config/aarch64/aarch64.c: Include selftest.h and > selftest-rtl.h. > (selftest::aarch64_test_loading_full_dump): New function. > (selftest::aarch64_run_selftests): New function. > (TARGET_RUN_TARGET_SELFTESTS): Wire it up to > selftest::aarch64_run_selftests. > > gcc/testsuite/ChangeLog: > * selftests/aarch64: New subdirectory. > * selftests/aarch64/times-two.rtl: New file. > --- > gcc/config/aarch64/aarch64.c | 49 > +++++++++++++++++++++++++++ > gcc/testsuite/selftests/aarch64/times-two.rtl | 36 ++++++++++++++++++++ > 2 files changed, 85 insertions(+) > create mode 100644 gcc/testsuite/selftests/aarch64/times-two.rtl > > diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c > index bd97c5b..d19bee3 100644 > --- a/gcc/config/aarch64/aarch64.c > +++ b/gcc/config/aarch64/aarch64.c > @@ -64,6 +64,8 @@ > #include "sched-int.h" > #include "target-globals.h" > #include "common/common-target.h" > +#include "selftest.h" > +#include "selftest-rtl.h" > > /* This file should be included last. */ > #include "target-def.h" > @@ -14168,6 +14170,48 @@ aarch64_optab_supported_p (int op, machine_mode > mode1, machine_mode, > } > } > > +/* Target-specific selftests. */ > + > +#if CHECKING_P > + > +namespace selftest { > + > +/* Selftest for the RTL loader. This test is target-specific and thus > + here since the dump contains target-specific hard reg names. > + Verify that the RTL loader copes with a dump from print_rtx_function. */ > + > +static void > +aarch64_test_loading_full_dump () > +{ > + rtl_dump_test t (SELFTEST_LOCATION, locate_file ("aarch64/times-two.rtl")); > + > + ASSERT_STREQ ("times_two", IDENTIFIER_POINTER (DECL_NAME (cfun->decl))); > + > + rtx_insn *insn_1 = get_insn_by_uid (1); > + ASSERT_EQ (NOTE, GET_CODE (insn_1)); > + > + rtx_insn *insn_15 = get_insn_by_uid (15); > + ASSERT_EQ (INSN, GET_CODE (insn_15)); > + ASSERT_EQ (USE, GET_CODE (PATTERN (insn_15))); > + > + /* Verify crtl->return_rtx. */ > + ASSERT_EQ (REG, GET_CODE (crtl->return_rtx)); > + ASSERT_EQ (0, REGNO (crtl->return_rtx)); > + ASSERT_EQ (SImode, GET_MODE (crtl->return_rtx)); > +} > + > +/* Run all target-specific selftests. */ > + > +static void > +aarch64_run_selftests (void) > +{ > + aarch64_test_loading_full_dump (); > +} > + > +} // namespace selftest > + > +#endif /* #if CHECKING_P */ > + > #undef TARGET_ADDRESS_COST > #define TARGET_ADDRESS_COST aarch64_address_cost > > @@ -14502,6 +14546,11 @@ aarch64_optab_supported_p (int op, machine_mode > mode1, machine_mode, > #undef TARGET_OMIT_STRUCT_RETURN_REG > #define TARGET_OMIT_STRUCT_RETURN_REG true > > +#if CHECKING_P > +#undef TARGET_RUN_TARGET_SELFTESTS > +#define TARGET_RUN_TARGET_SELFTESTS selftest::aarch64_run_selftests > +#endif /* #if CHECKING_P */ > + > struct gcc_target targetm = TARGET_INITIALIZER; > > #include "gt-aarch64.h" > diff --git a/gcc/testsuite/selftests/aarch64/times-two.rtl > b/gcc/testsuite/selftests/aarch64/times-two.rtl > new file mode 100644 > index 0000000..dbce67e > --- /dev/null > +++ b/gcc/testsuite/selftests/aarch64/times-two.rtl > @@ -0,0 +1,36 @@ > +(function "times_two" > + (insn-chain > + (cnote 1 NOTE_INSN_DELETED) > + (block 2 > + (edge-from entry (flags "FALLTHRU")) > + (cnote 4 [bb 2] NOTE_INSN_BASIC_BLOCK) > + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) > + (const_int -4)) [1 i+0 S4 A32]) > + (reg:SI x0 [ i ])) "../../src/times-two.c":2 > + (nil)) > + (cnote 3 NOTE_INSN_FUNCTION_BEG) > + (cinsn 6 (set (reg:SI %2) > + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) > + (const_int -4)) [1 i+0 S4 A32])) > "../../src/times-two.c":3 > + (nil)) > + (cinsn 7 (set (reg:SI %0 [ _2 ]) > + (ashift:SI (reg:SI %2) > + (const_int 1))) "../../src/times-two.c":3 > + (nil)) > + (cinsn 10 (set (reg:SI %1 [ <retval> ]) > + (reg:SI %0 [ _2 ])) "../../src/times-two.c":3 > + (nil)) > + (cinsn 14 (set (reg/i:SI x0) > + (reg:SI %1 [ <retval> ])) "../../src/times-two.c":4 > + (nil)) > + (cinsn 15 (use (reg/i:SI x0)) "../../src/times-two.c":4 > + (nil)) > + (edge-to exit (flags "FALLTHRU")) > + ) ;; block 2 > + ) ;; insn-chain > + (crtl > + (return_rtx > + (reg/i:SI x0) > + ) ;; return_rtx > + ) ;; crtl > +) ;; function "times_two" > -- > 1.8.5.3 >