This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 1/6] Use IFN_SQRT in tree-vect-patterns.c


On Mon, Nov 9, 2015 at 5:21 PM, Richard Sandiford
<richard.sandiford@arm.com> wrote:
> In practice all targets that can vectorise sqrt define the appropriate
> sqrt<mode>2 optab.  The only case where this isn't immediately obvious
> is the libmass support in rs6000.c, but Mike Meissner said that it shouldn't
> be exercised for sqrt.
>
> This patch therefore uses the internal function interface instead of
> going via the target hook.
>
>
> gcc/
>         * tree-vect-patterns.c: Include internal-fn.h.
>         (vect_recog_pow_pattern): Use IFN_SQRT instead of BUILT_IN_SQRT*.
>
> diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
> index bab9a4f..a803e8c 100644
> --- a/gcc/tree-vect-patterns.c
> +++ b/gcc/tree-vect-patterns.c
> @@ -39,6 +39,7 @@ along with GCC; see the file COPYING3.  If not see
>  #include "tree-vectorizer.h"
>  #include "dumpfile.h"
>  #include "builtins.h"
> +#include "internal-fn.h"
>  #include "case-cfn-macros.h"
>
>  /* Pattern recognition functions  */
> @@ -1052,18 +1053,13 @@ vect_recog_pow_pattern (vec<gimple *> *stmts, tree *type_in,
>    if (TREE_CODE (exp) == REAL_CST
>        && real_equal (&TREE_REAL_CST (exp), &dconsthalf))
>      {
> -      tree newfn = mathfn_built_in (TREE_TYPE (base), BUILT_IN_SQRT);
>        *type_in = get_vectype_for_scalar_type (TREE_TYPE (base));
> -      if (*type_in)
> +      if (*type_in && direct_internal_fn_supported_p (IFN_SQRT, *type_in))
>         {
> -         gcall *stmt = gimple_build_call (newfn, 1, base);
> -         if (vectorizable_function (stmt, *type_in, *type_in)
> -             != NULL_TREE)
> -           {
> -             var = vect_recog_temp_ssa_var (TREE_TYPE (base), stmt);
> -             gimple_call_set_lhs (stmt, var);
> -             return stmt;
> -           }
> +         gcall *stmt = gimple_build_call_internal (IFN_SQRT, 1, base);
> +         var = vect_recog_temp_ssa_var (TREE_TYPE (base), stmt);
> +         gimple_call_set_lhs (stmt, var);
> +         return stmt;

Looks ok but I wonder if this is dead code with

(for pows (POW)
     sqrts (SQRT)
     cbrts (CBRT)
 (simplify
  (pows @0 REAL_CST@1)
  (with {
    const REAL_VALUE_TYPE *value = TREE_REAL_CST_PTR (@1);
    REAL_VALUE_TYPE tmp;
   }
   (switch
...
    /* pow(x,0.5) -> sqrt(x).  */
    (if (flag_unsafe_math_optimizations
         && canonicalize_math_p ()
         && real_equal (value, &dconsthalf))
     (sqrts @0))

also wondering here about canonicalize_math_p (), I'd expected the
reverse transform as canonicalization.  Also wondering about
flag_unsafe_math_optimizations (missing from the vectorizer pattern).

Anyway, patch is ok.

Thanks,
Richard.

>         }
>      }
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]