Richard Biener <richard.guent...@gmail.com> writes:
> On Mon, Nov 9, 2015 at 5:21 PM, Richard Sandiford
> <richard.sandif...@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))

Yeah, I wondered that too, although I think it's more likely to be dead
because of sincos.  In the end it just seemed like a rabiit hole too far
though.

> Anyway, patch is ok.

Thanks,
Richard

Reply via email to