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