Commit c97d1c9d by Richard Sandiford Committed by Richard Sandiford

Use combined_fn in tree-ssa-math-opts.c

Another patch to extend uses of built_in_function to combined_fn, this time
in tree-ssa-math-opts.c.

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

gcc/
	* tree-ssa-math-opts.c: Include case-cfn-macros.h.
	(execute_cse_sincos_1): Use combined_fn instead of built-in codes.
	(pass_cse_sincos::execute): Likewise.

From-SVN: r230481
parent 314709cd
2015-11-17 Richard Sandiford <richard.sandiford@arm.com> 2015-11-17 Richard Sandiford <richard.sandiford@arm.com>
* tree-ssa-math-opts.c: Include case-cfn-macros.h.
(execute_cse_sincos_1): Use combined_fn instead of built-in codes.
(pass_cse_sincos::execute): Likewise.
2015-11-17 Richard Sandiford <richard.sandiford@arm.com>
* tree-ssa-reassoc.c: Include case-cfn-macros.h. * tree-ssa-reassoc.c: Include case-cfn-macros.h.
(stmt_is_power_of_op): Use combined_fn instead of built-in codes. (stmt_is_power_of_op): Use combined_fn instead of built-in codes.
(decrement_power, acceptable_pow_call): Likewise. (decrement_power, acceptable_pow_call): Likewise.
...@@ -110,6 +110,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -110,6 +110,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa.h" #include "tree-ssa.h"
#include "builtins.h" #include "builtins.h"
#include "params.h" #include "params.h"
#include "case-cfn-macros.h"
/* This structure represents one basic block that either computes a /* This structure represents one basic block that either computes a
division, or is a common dominator for basic block that compute a division, or is a common dominator for basic block that compute a
...@@ -725,22 +726,20 @@ execute_cse_sincos_1 (tree name) ...@@ -725,22 +726,20 @@ execute_cse_sincos_1 (tree name)
FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, name) FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, name)
{ {
if (gimple_code (use_stmt) != GIMPLE_CALL if (gimple_code (use_stmt) != GIMPLE_CALL
|| !gimple_call_lhs (use_stmt) || !gimple_call_lhs (use_stmt))
|| !(fndecl = gimple_call_fndecl (use_stmt))
|| DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
continue; continue;
switch (DECL_FUNCTION_CODE (fndecl)) switch (gimple_call_combined_fn (use_stmt))
{ {
CASE_FLT_FN (BUILT_IN_COS): CASE_CFN_COS:
seen_cos |= maybe_record_sincos (&stmts, &top_bb, use_stmt) ? 1 : 0; seen_cos |= maybe_record_sincos (&stmts, &top_bb, use_stmt) ? 1 : 0;
break; break;
CASE_FLT_FN (BUILT_IN_SIN): CASE_CFN_SIN:
seen_sin |= maybe_record_sincos (&stmts, &top_bb, use_stmt) ? 1 : 0; seen_sin |= maybe_record_sincos (&stmts, &top_bb, use_stmt) ? 1 : 0;
break; break;
CASE_FLT_FN (BUILT_IN_CEXPI): CASE_CFN_CEXPI:
seen_cexpi |= maybe_record_sincos (&stmts, &top_bb, use_stmt) ? 1 : 0; seen_cexpi |= maybe_record_sincos (&stmts, &top_bb, use_stmt) ? 1 : 0;
break; break;
...@@ -779,19 +778,18 @@ execute_cse_sincos_1 (tree name) ...@@ -779,19 +778,18 @@ execute_cse_sincos_1 (tree name)
for (i = 0; stmts.iterate (i, &use_stmt); ++i) for (i = 0; stmts.iterate (i, &use_stmt); ++i)
{ {
tree rhs = NULL; tree rhs = NULL;
fndecl = gimple_call_fndecl (use_stmt);
switch (DECL_FUNCTION_CODE (fndecl)) switch (gimple_call_combined_fn (use_stmt))
{ {
CASE_FLT_FN (BUILT_IN_COS): CASE_CFN_COS:
rhs = fold_build1 (REALPART_EXPR, type, res); rhs = fold_build1 (REALPART_EXPR, type, res);
break; break;
CASE_FLT_FN (BUILT_IN_SIN): CASE_CFN_SIN:
rhs = fold_build1 (IMAGPART_EXPR, type, res); rhs = fold_build1 (IMAGPART_EXPR, type, res);
break; break;
CASE_FLT_FN (BUILT_IN_CEXPI): CASE_CFN_CEXPI:
rhs = res; rhs = res;
break; break;
...@@ -1727,26 +1725,24 @@ pass_cse_sincos::execute (function *fun) ...@@ -1727,26 +1725,24 @@ pass_cse_sincos::execute (function *fun)
for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi)) for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{ {
gimple *stmt = gsi_stmt (gsi); gimple *stmt = gsi_stmt (gsi);
tree fndecl;
/* Only the last stmt in a bb could throw, no need to call /* Only the last stmt in a bb could throw, no need to call
gimple_purge_dead_eh_edges if we change something in the middle gimple_purge_dead_eh_edges if we change something in the middle
of a basic block. */ of a basic block. */
cleanup_eh = false; cleanup_eh = false;
if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL) if (is_gimple_call (stmt)
&& gimple_call_lhs (stmt)) && gimple_call_lhs (stmt))
{ {
tree arg, arg0, arg1, result; tree arg, arg0, arg1, result;
HOST_WIDE_INT n; HOST_WIDE_INT n;
location_t loc; location_t loc;
fndecl = gimple_call_fndecl (stmt); switch (gimple_call_combined_fn (stmt))
switch (DECL_FUNCTION_CODE (fndecl))
{ {
CASE_FLT_FN (BUILT_IN_COS): CASE_CFN_COS:
CASE_FLT_FN (BUILT_IN_SIN): CASE_CFN_SIN:
CASE_FLT_FN (BUILT_IN_CEXPI): CASE_CFN_CEXPI:
/* Make sure we have either sincos or cexp. */ /* Make sure we have either sincos or cexp. */
if (!targetm.libc_has_function (function_c99_math_complex) if (!targetm.libc_has_function (function_c99_math_complex)
&& !targetm.libc_has_function (function_sincos)) && !targetm.libc_has_function (function_sincos))
...@@ -1757,7 +1753,7 @@ pass_cse_sincos::execute (function *fun) ...@@ -1757,7 +1753,7 @@ pass_cse_sincos::execute (function *fun)
cfg_changed |= execute_cse_sincos_1 (arg); cfg_changed |= execute_cse_sincos_1 (arg);
break; break;
CASE_FLT_FN (BUILT_IN_POW): CASE_CFN_POW:
arg0 = gimple_call_arg (stmt, 0); arg0 = gimple_call_arg (stmt, 0);
arg1 = gimple_call_arg (stmt, 1); arg1 = gimple_call_arg (stmt, 1);
...@@ -1777,7 +1773,7 @@ pass_cse_sincos::execute (function *fun) ...@@ -1777,7 +1773,7 @@ pass_cse_sincos::execute (function *fun)
} }
break; break;
CASE_FLT_FN (BUILT_IN_POWI): CASE_CFN_POWI:
arg0 = gimple_call_arg (stmt, 0); arg0 = gimple_call_arg (stmt, 0);
arg1 = gimple_call_arg (stmt, 1); arg1 = gimple_call_arg (stmt, 1);
loc = gimple_location (stmt); loc = gimple_location (stmt);
...@@ -1826,7 +1822,7 @@ pass_cse_sincos::execute (function *fun) ...@@ -1826,7 +1822,7 @@ pass_cse_sincos::execute (function *fun)
} }
break; break;
CASE_FLT_FN (BUILT_IN_CABS): CASE_CFN_CABS:
arg0 = gimple_call_arg (stmt, 0); arg0 = gimple_call_arg (stmt, 0);
loc = gimple_location (stmt); loc = gimple_location (stmt);
result = gimple_expand_builtin_cabs (&gsi, loc, arg0); result = gimple_expand_builtin_cabs (&gsi, loc, arg0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment