https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85694

--- Comment #6 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
Author: rsandifo
Date: Tue Jul  3 10:03:44 2018
New Revision: 262335

URL: https://gcc.gnu.org/viewcvs?rev=262335&root=gcc&view=rev
Log:
[16/n] PR85694: Add detection of averaging operations

This patch adds detection of average instructions:

       a = (((wide) b + (wide) c) >> 1);
   --> a = (wide) .AVG_FLOOR (b, c);

       a = (((wide) b + (wide) c + 1) >> 1);
   --> a = (wide) .AVG_CEIL (b, c);

in cases where users of "a" need only the low half of the result,
making the cast to (wide) redundant.  The heavy lifting was done by
earlier patches.

This showed up another problem in vectorizable_call: if the call is a
pattern definition statement rather than the main pattern statement,
the type of vectorised call might be different from the type of the
original statement.

2018-07-03  Richard Sandiford  <richard.sandif...@arm.com>

gcc/
        PR tree-optimization/85694
        * doc/md.texi (avgM3_floor, uavgM3_floor, avgM3_ceil)
        (uavgM3_ceil): Document new optabs.
        * doc/sourcebuild.texi (vect_avg_qi): Document new target selector.
        * internal-fn.def (IFN_AVG_FLOOR, IFN_AVG_CEIL): New internal
        functions.
        * optabs.def (savg_floor_optab, uavg_floor_optab, savg_ceil_optab)
        (savg_ceil_optab): New optabs.
        * tree-vect-patterns.c (vect_recog_average_pattern): New function.
        (vect_vect_recog_func_ptrs): Add it.
        * tree-vect-stmts.c (vectorizable_call): Get the type of the zero
        constant directly from the associated lhs.

gcc/testsuite/
        PR tree-optimization/85694
        * lib/target-supports.exp (check_effective_target_vect_avg_qi): New
        proc.
        * gcc.dg/vect/vect-avg-1.c: New test.
        * gcc.dg/vect/vect-avg-2.c: Likewise.
        * gcc.dg/vect/vect-avg-3.c: Likewise.
        * gcc.dg/vect/vect-avg-4.c: Likewise.
        * gcc.dg/vect/vect-avg-5.c: Likewise.
        * gcc.dg/vect/vect-avg-6.c: Likewise.
        * gcc.dg/vect/vect-avg-7.c: Likewise.
        * gcc.dg/vect/vect-avg-8.c: Likewise.
        * gcc.dg/vect/vect-avg-9.c: Likewise.
        * gcc.dg/vect/vect-avg-10.c: Likewise.
        * gcc.dg/vect/vect-avg-11.c: Likewise.
        * gcc.dg/vect/vect-avg-12.c: Likewise.
        * gcc.dg/vect/vect-avg-13.c: Likewise.
        * gcc.dg/vect/vect-avg-14.c: Likewise.

Added:
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-1.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-10.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-11.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-12.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-13.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-14.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-2.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-3.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-4.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-5.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-6.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-7.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-8.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-avg-9.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/doc/md.texi
    trunk/gcc/doc/sourcebuild.texi
    trunk/gcc/internal-fn.def
    trunk/gcc/optabs.def
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/lib/target-supports.exp
    trunk/gcc/tree-vect-patterns.c
    trunk/gcc/tree-vect-stmts.c

Reply via email to