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
> 

Reply via email to