From: Richard Sandiford Date: Tue, 17 Nov 2015 18:44:22 +0000 (+0000) Subject: Use combined_fn in tree-vrp.c X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9c0a9e1277571a16e711d5a60ed11713d9109b98;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 75ce9f8b1bf..012a7f939a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-11-17 Richard Sandiford + + * 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 * fold-const.h (negate_mathfn_p): Take a combined_fn rather diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 5d085b42d45..e67048e9045 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -57,6 +57,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa-threadedge.h" #include "omp-low.h" #include "target.h" +#include "case-cfn-macros.h" /* Range of values that can be associated with an SSA_NAME after VRP has executed. */ @@ -3791,14 +3792,16 @@ extract_range_basic (value_range *vr, gimple *stmt) bool sop = false; 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; + 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 function parameter resolve it to false. This avoids bogus array bound warnings. @@ -3814,8 +3817,8 @@ extract_range_basic (value_range *vr, gimple *stmt) break; /* Both __builtin_ffs* and __builtin_popcount return [0, prec]. */ - CASE_INT_FN (BUILT_IN_FFS): - CASE_INT_FN (BUILT_IN_POPCOUNT): + CASE_CFN_FFS: + CASE_CFN_POPCOUNT: arg = gimple_call_arg (stmt, 0); prec = TYPE_PRECISION (TREE_TYPE (arg)); mini = 0; @@ -3843,7 +3846,7 @@ extract_range_basic (value_range *vr, gimple *stmt) } goto bitop_builtin; /* __builtin_parity* returns [0, 1]. */ - CASE_INT_FN (BUILT_IN_PARITY): + CASE_CFN_PARITY: mini = 0; maxi = 1; goto bitop_builtin; @@ -3852,7 +3855,7 @@ extract_range_basic (value_range *vr, gimple *stmt) On many targets where the CLZ RTL or optab value is defined for 0 the value is prec, so include that in the range by default. */ - CASE_INT_FN (BUILT_IN_CLZ): + CASE_CFN_CLZ: arg = gimple_call_arg (stmt, 0); prec = TYPE_PRECISION (TREE_TYPE (arg)); mini = 0; @@ -3907,7 +3910,7 @@ extract_range_basic (value_range *vr, gimple *stmt) If there is a ctz optab for this mode and CTZ_DEFINED_VALUE_AT_ZERO, include that in the range, otherwise just assume 0 won't be seen. */ - CASE_INT_FN (BUILT_IN_CTZ): + CASE_CFN_CTZ: arg = gimple_call_arg (stmt, 0); prec = TYPE_PRECISION (TREE_TYPE (arg)); mini = 0; @@ -3956,7 +3959,7 @@ extract_range_basic (value_range *vr, gimple *stmt) break; goto bitop_builtin; /* __builtin_clrsb* returns [0, prec-1]. */ - CASE_INT_FN (BUILT_IN_CLRSB): + CASE_CFN_CLRSB: arg = gimple_call_arg (stmt, 0); prec = TYPE_PRECISION (TREE_TYPE (arg)); mini = 0; @@ -3966,33 +3969,22 @@ extract_range_basic (value_range *vr, gimple *stmt) set_value_range (vr, VR_RANGE, build_int_cst (type, mini), build_int_cst (type, maxi), NULL); return; - default: - 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: + case CFN_UBSAN_CHECK_ADD: subcode = PLUS_EXPR; break; - case IFN_UBSAN_CHECK_SUB: + case CFN_UBSAN_CHECK_SUB: subcode = MINUS_EXPR; break; - case IFN_UBSAN_CHECK_MUL: + case CFN_UBSAN_CHECK_MUL: subcode = MULT_EXPR; break; - case IFN_GOACC_DIM_SIZE: - case IFN_GOACC_DIM_POS: + case CFN_GOACC_DIM_SIZE: + case CFN_GOACC_DIM_POS: /* Optimizing these two internal functions helps the loop optimizer eliminate outer comparisons. Size is [1,N] 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 size = get_oacc_fn_dim_size (current_function_decl, axis);