Use IFN_SQRT in tree-vect-patterns.c
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 17 Nov 2015 18:54:36 +0000 (18:54 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 17 Nov 2015 18:54:36 +0000 (18:54 +0000)
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.

Tested on x86_64-linux-gnu, aarch64-linux-gnu, arm-linux-gnueabi and
powerpc64-linux-gnu.

gcc/
* tree-vect-patterns.c: Include internal-fn.h.
(vect_recog_pow_pattern): Use IFN_SQRT instead of BUILT_IN_SQRT*.

From-SVN: r230490

gcc/ChangeLog
gcc/tree-vect-patterns.c

index e1be75f3391f2942786f9bbfd50b6baec617c827..c6ddc5a46ff29e3fe3fc66f7a8ade3dcef8b332a 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-17  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vect-patterns.c: Include internal-fn.h.
+       (vect_recog_pow_pattern): Use IFN_SQRT instead of BUILT_IN_SQRT*.
+
 2015-11-17  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree.h (BUILTIN_EXP10_P, BUILTIN_EXPONENT_P, BUILTIN_SQRT_P)
index a8d4a82461129f721f4b2eb87c2e3dd5b0fff893..5bab1f57a18f14724b90608c64a915696fbcbbc9 100644 (file)
@@ -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  */
@@ -1054,18 +1055,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;
        }
     }