On Fri, 2020-05-01 at 09:42 -0700, Carl Love via Gcc-patches wrote: > GCC maintainers: >
Hi, subject: Re: [PATCH] rs6000, fix vec_first_match_index for nulls ^ See if you can include the pr94833 string in the subject somewhere. > The following patch fixes PR94833, vec_first_match_index does not > function as described in its description. > > The builtin does not handle vector elements which are zero > correctly. > The following patch fixes the issue and adds additional test cases to > verify the vec_first_match_index builtin and related builtins work > correctly with zero elements. I wonder if referring to those as zero-valued elements would be better. Depends if there is any possible confusion with number of elements in a vector. dunno. :-) > > The patch has been compiled and tested on > > powerpc64le-unknown-linux-gnu (Power 9 LE) > > with no regression errors. > > Please let me know if the patch is acceptable for mainline and for > backporting as needed. > > Thanks. > > Carl Love > -------------------------------------------------------------- > > gcc/ChangeLog > > 2020-04-30 Carl Love <c...@us.ibm.com> > > PR target/94833 > * config/rs6000/vsx.md (define_expand): Fix instruction > generation for > first_match_index_<mode>. Probably want ("first_match_index_<mode>") instead of (define_expand). Then "Fix instruction generation." is probably sufficient. > * testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c (main): > Add > additional test cases with zero vector elements. ok > --- > gcc/config/rs6000/vsx.md | 4 +- > .../powerpc/builtins-8-p9-runnable.c | 118 ++++++++++++++++++ > 2 files changed, 120 insertions(+), 2 deletions(-) > > diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md > index 1fcc1b03096..12a0d5e668c 100644 > --- a/gcc/config/rs6000/vsx.md > +++ b/gcc/config/rs6000/vsx.md > @@ -4803,8 +4803,8 @@ > rtx cmp_result = gen_reg_rtx (<MODE>mode); > rtx not_result = gen_reg_rtx (<MODE>mode); > > - emit_insn (gen_vcmpnez<VSX_EXTRACT_WIDTH> (cmp_result, operands[1], > - operands[2])); > + emit_insn (gen_vcmpne<VSX_EXTRACT_WIDTH> (cmp_result, operands[1], > + operands[2])); > emit_insn (gen_one_cmpl<mode>2 (not_result, cmp_result)); > > sh = GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) / 2; ok > diff --git a/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c > b/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c > index b2f7dc855e8..19457eebfc4 100644 > --- a/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c > +++ b/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c <snip> > > @@ -1065,6 +1161,28 @@ int main() { > The element index in BE order is returned for the first mismatch > or the number of elements if there is no match. */ > /* char */ > + char_src1 = (vector signed char) {1, 2, 0, 4, -5, 6, 7, 8, > + 9, 10, 11, 12, 13, 14, 15, 16}; > + char_src2 = (vector signed char) {1, 2, 0, 20, -5, 6, 7, 8, > + 9, 10, 11, 12, 13, 14, 15, 16}; > + expected_result = 2; > + > + result = vec_first_mismatch_or_eos_index (char_src1, char_src2); > + > +#ifdef DEBUG2 > + print_signed_char("src1", char_src1); > + print_signed_char("src2", char_src2); > + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); > +#endif > + > + if (result != expected_result) > +#ifdef DEBUG > + printf("Error: char first mismatch or EOS result (%d) does not match > expected result (%d)\n", > + result, expected_result); Line is a bit long, but i think thats ok for testcases. Aside from subject/intro/changelog cosmetic bits, patch lgtm. thanks -Will > +#else > + abort(); > +#endif > + > char_src1 = (vector signed char) {-1, 2, 3, 4, -5, 6, 7, 8, > 9, 10, 11, 12, 13, 14, 15, 16}; > char_src2 = (vector signed char) {-1, 2, 3, 20, -5, 6, 7, 8,