On 25 October 2017 at 18:29, Jeff Law <l...@redhat.com> wrote: > On 10/23/2017 05:17 AM, Richard Sandiford wrote: >> This patch adds a vec_duplicate_p helper that tests for constant >> or non-constant vector duplicates. Together with the existing >> const_vec_duplicate_p, this complements the gen_vec_duplicate >> and gen_const_vec_duplicate added by a previous patch. >> >> The patch uses the new routines to add more rtx simplifications >> involving vector duplicates. These mirror simplifications that >> we already do for CONST_VECTOR broadcasts and are needed for >> variable-length SVE, which uses: >> >> (const:M (vec_duplicate:M X)) >> >> to represent constant broadcasts instead. The simplifications do >> trigger on the testsuite for variable duplicates too, and in each >> case I saw the change was an improvement. E.g.: >> > [ snip ] > >> >> The best way of testing the new simplifications seemed to be >> via selftests. The patch cribs part of David's patch here: >> https://gcc.gnu.org/ml/gcc-patches/2016-07/msg00270.html . > Cool. I really wish I had more time to promote David's work by adding > selftests to various things. There's certainly cases where it's the > most direct and useful way to test certain bits of lower level > infrastructure we have. Glad to see you found it useful here. > > > >> >> >> 2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> >> David Malcolm <dmalc...@redhat.com> >> Alan Hayward <alan.hayw...@arm.com> >> David Sherwood <david.sherw...@arm.com> >> >> gcc/ >> * rtl.h (vec_duplicate_p): New function. >> * selftest-rtl.c (assert_rtx_eq_at): New function. >> * selftest-rtl.h (ASSERT_RTX_EQ): New macro. >> (assert_rtx_eq_at): Declare. >> * selftest.h (selftest::simplify_rtx_c_tests): Declare. >> * selftest-run-tests.c (selftest::run_tests): Call it. >> * simplify-rtx.c: Include selftest.h and selftest-rtl.h. >> (simplify_unary_operation_1): Recursively handle vector duplicates. >> (simplify_binary_operation_1): Likewise. Handle VEC_SELECTs of >> vector duplicates. >> (simplify_subreg): Handle subregs of vector duplicates. >> (make_test_reg, test_vector_ops_duplicate, test_vector_ops) >> (selftest::simplify_rtx_c_tests): New functions.
Hi Richard, I've noticed that this patch (r254294) causes FAIL: gcc.dg/vect/vect-126.c (internal compiler error) FAIL: gcc.dg/vect/vect-126.c -flto -ffat-lto-objects (internal compiler error) on arm* targets. Sorry if this has been reported before, I've restarted validations only recently, so the process is still catching up. gcc.log has this: spawn -ignore SIGHUP /aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-linux-gnueabihf/gcc3/gcc/xgcc -B/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-linux-gnueabihf/gcc3/gcc/ /gcc/testsuite/gcc.dg/vect/vect-126.c -fno-diagnostics-show-caret -fdiagnostics-color=never -ffast-math -ftree-vectorize -fno-vect-cost-model -fno-common -O2 -fdump-tree-vect-details -S -o vect-126.s during RTL pass: combine /gcc/testsuite/gcc.dg/vect/vect-126.c: In function 'f5': /gcc/testsuite/gcc.dg/vect/vect-126.c:53:1: internal compiler error: in neon_valid_immediate, at config/arm/arm.c:11850 0xf3e6c8 neon_valid_immediate /gcc/config/arm/arm.c:11850 0xf3ea9a neon_immediate_valid_for_move(rtx_def*, machine_mode, rtx_def**, int*) /gcc/config/arm/arm.c:11968 0xf40a20 arm_rtx_costs_internal /gcc/config/arm/arm.c:10695 0xf40a20 arm_rtx_costs /gcc/config/arm/arm.c:10946 0xb113ef rtx_cost(rtx_def*, machine_mode, rtx_code, int, bool) /gcc/rtlanal.c:4187 0xb1169f set_src_cost /gcc/rtl.h:2700 0xb1169f pattern_cost(rtx_def*, bool) /gcc/rtlanal.c:5315 0x128bb3b combine_validate_cost /gcc/combine.c:893 0x128bb3b try_combine /gcc/combine.c:4113 0x12923d5 combine_instructions /gcc/combine.c:1452 0x12926ed rest_of_handle_combine /gcc/combine.c:14795 0x12926ed execute /gcc/combine.c:14840 Please submit a full bug report, Thanks, Christophe > Thanks for the examples of how this affects various targets. Seems like > it ought to be a consistent win when they trigger. > > jeff