Commit 9c0a9e12 by Richard Sandiford Committed by Richard Sandiford

Use combined_fn in tree-vrp.c

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

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

gcc/
	* tree-vrp.c: Include case-cfn-macros.h.
	(extract_range_basic): Switch on combined_fn rather than handling
	built-in functions and internal functions separately.

From-SVN: r230479
parent 1d9da71f
2015-11-17 Richard Sandiford <richard.sandiford@arm.com> 2015-11-17 Richard Sandiford <richard.sandiford@arm.com>
* tree-vrp.c: Include case-cfn-macros.h.
(extract_range_basic): Switch on combined_fn rather than handling
built-in functions and internal functions separately.
2015-11-17 Richard Sandiford <richard.sandiford@arm.com>
* fold-const.h (negate_mathfn_p): Take a combined_fn rather * fold-const.h (negate_mathfn_p): Take a combined_fn rather
than a built_in_function. than a built_in_function.
(tree_call_nonnegative_warnv_p): Take a combined_fn rather than (tree_call_nonnegative_warnv_p): Take a combined_fn rather than
...@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa-threadedge.h" #include "tree-ssa-threadedge.h"
#include "omp-low.h" #include "omp-low.h"
#include "target.h" #include "target.h"
#include "case-cfn-macros.h"
/* Range of values that can be associated with an SSA_NAME after VRP /* Range of values that can be associated with an SSA_NAME after VRP
has executed. */ has executed. */
...@@ -3791,14 +3792,16 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -3791,14 +3792,16 @@ extract_range_basic (value_range *vr, gimple *stmt)
bool sop = false; bool sop = false;
tree type = gimple_expr_type (stmt); tree type = gimple_expr_type (stmt);
if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) if (is_gimple_call (stmt))
{ {
tree fndecl = gimple_call_fndecl (stmt), arg; tree arg;
int mini, maxi, zerov = 0, prec; int mini, maxi, zerov = 0, prec;
enum tree_code subcode = ERROR_MARK;
combined_fn cfn = gimple_call_combined_fn (stmt);
switch (DECL_FUNCTION_CODE (fndecl)) switch (cfn)
{ {
case BUILT_IN_CONSTANT_P: case CFN_BUILT_IN_CONSTANT_P:
/* If the call is __builtin_constant_p and the argument is a /* If the call is __builtin_constant_p and the argument is a
function parameter resolve it to false. This avoids bogus function parameter resolve it to false. This avoids bogus
array bound warnings. array bound warnings.
...@@ -3814,8 +3817,8 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -3814,8 +3817,8 @@ extract_range_basic (value_range *vr, gimple *stmt)
break; break;
/* Both __builtin_ffs* and __builtin_popcount return /* Both __builtin_ffs* and __builtin_popcount return
[0, prec]. */ [0, prec]. */
CASE_INT_FN (BUILT_IN_FFS): CASE_CFN_FFS:
CASE_INT_FN (BUILT_IN_POPCOUNT): CASE_CFN_POPCOUNT:
arg = gimple_call_arg (stmt, 0); arg = gimple_call_arg (stmt, 0);
prec = TYPE_PRECISION (TREE_TYPE (arg)); prec = TYPE_PRECISION (TREE_TYPE (arg));
mini = 0; mini = 0;
...@@ -3843,7 +3846,7 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -3843,7 +3846,7 @@ extract_range_basic (value_range *vr, gimple *stmt)
} }
goto bitop_builtin; goto bitop_builtin;
/* __builtin_parity* returns [0, 1]. */ /* __builtin_parity* returns [0, 1]. */
CASE_INT_FN (BUILT_IN_PARITY): CASE_CFN_PARITY:
mini = 0; mini = 0;
maxi = 1; maxi = 1;
goto bitop_builtin; goto bitop_builtin;
...@@ -3852,7 +3855,7 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -3852,7 +3855,7 @@ extract_range_basic (value_range *vr, gimple *stmt)
On many targets where the CLZ RTL or optab value is defined On many targets where the CLZ RTL or optab value is defined
for 0 the value is prec, so include that in the range for 0 the value is prec, so include that in the range
by default. */ by default. */
CASE_INT_FN (BUILT_IN_CLZ): CASE_CFN_CLZ:
arg = gimple_call_arg (stmt, 0); arg = gimple_call_arg (stmt, 0);
prec = TYPE_PRECISION (TREE_TYPE (arg)); prec = TYPE_PRECISION (TREE_TYPE (arg));
mini = 0; mini = 0;
...@@ -3907,7 +3910,7 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -3907,7 +3910,7 @@ extract_range_basic (value_range *vr, gimple *stmt)
If there is a ctz optab for this mode and If there is a ctz optab for this mode and
CTZ_DEFINED_VALUE_AT_ZERO, include that in the range, CTZ_DEFINED_VALUE_AT_ZERO, include that in the range,
otherwise just assume 0 won't be seen. */ otherwise just assume 0 won't be seen. */
CASE_INT_FN (BUILT_IN_CTZ): CASE_CFN_CTZ:
arg = gimple_call_arg (stmt, 0); arg = gimple_call_arg (stmt, 0);
prec = TYPE_PRECISION (TREE_TYPE (arg)); prec = TYPE_PRECISION (TREE_TYPE (arg));
mini = 0; mini = 0;
...@@ -3956,7 +3959,7 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -3956,7 +3959,7 @@ extract_range_basic (value_range *vr, gimple *stmt)
break; break;
goto bitop_builtin; goto bitop_builtin;
/* __builtin_clrsb* returns [0, prec-1]. */ /* __builtin_clrsb* returns [0, prec-1]. */
CASE_INT_FN (BUILT_IN_CLRSB): CASE_CFN_CLRSB:
arg = gimple_call_arg (stmt, 0); arg = gimple_call_arg (stmt, 0);
prec = TYPE_PRECISION (TREE_TYPE (arg)); prec = TYPE_PRECISION (TREE_TYPE (arg));
mini = 0; mini = 0;
...@@ -3966,33 +3969,22 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -3966,33 +3969,22 @@ extract_range_basic (value_range *vr, gimple *stmt)
set_value_range (vr, VR_RANGE, build_int_cst (type, mini), set_value_range (vr, VR_RANGE, build_int_cst (type, mini),
build_int_cst (type, maxi), NULL); build_int_cst (type, maxi), NULL);
return; return;
default: case CFN_UBSAN_CHECK_ADD:
break;
}
}
else if (is_gimple_call (stmt) && gimple_call_internal_p (stmt))
{
enum tree_code subcode = ERROR_MARK;
unsigned ifn_code = gimple_call_internal_fn (stmt);
switch (ifn_code)
{
case IFN_UBSAN_CHECK_ADD:
subcode = PLUS_EXPR; subcode = PLUS_EXPR;
break; break;
case IFN_UBSAN_CHECK_SUB: case CFN_UBSAN_CHECK_SUB:
subcode = MINUS_EXPR; subcode = MINUS_EXPR;
break; break;
case IFN_UBSAN_CHECK_MUL: case CFN_UBSAN_CHECK_MUL:
subcode = MULT_EXPR; subcode = MULT_EXPR;
break; break;
case IFN_GOACC_DIM_SIZE: case CFN_GOACC_DIM_SIZE:
case IFN_GOACC_DIM_POS: case CFN_GOACC_DIM_POS:
/* Optimizing these two internal functions helps the loop /* Optimizing these two internal functions helps the loop
optimizer eliminate outer comparisons. Size is [1,N] optimizer eliminate outer comparisons. Size is [1,N]
and pos is [0,N-1]. */ and pos is [0,N-1]. */
{ {
bool is_pos = ifn_code == IFN_GOACC_DIM_POS; bool is_pos = cfn == CFN_GOACC_DIM_POS;
int axis = get_oacc_ifn_dim_arg (stmt); int axis = get_oacc_ifn_dim_arg (stmt);
int size = get_oacc_fn_dim_size (current_function_decl, axis); int size = get_oacc_fn_dim_size (current_function_decl, axis);
......
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