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

gcc/ChangeLog
gcc/tree-vrp.c

index 75ce9f8b1bf6a9de7f7098175aed7640e2a4ea14..012a7f939a36d7ff1da7fa8d432364e4d22bf7fd 100644 (file)
@@ -1,3 +1,9 @@
+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
index 5d085b42d458878eed6deffc982cd3ee52f87011..e67048e904599747aaaae1b07f95fb94f953f8a9 100644 (file)
@@ -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);