From 2556a032cc18bb71c85988967fed074528fb5030 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 7 Nov 2015 10:05:51 +0000 Subject: [PATCH] Handle constant fp classifications in fold-const-call.c Move the constant "is finite", "is infinite" and "is nan" queries to fold-const-call.c. Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi. gcc/ * builtins.c (fold_builtin_classify): Move constant cases to... * fold-const-call.c (fold_const_call_ss): ...here. From-SVN: r229920 --- gcc/ChangeLog | 5 +++++ gcc/builtins.c | 23 ----------------------- gcc/fold-const-call.c | 25 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab06aab2204..518c2163fbe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-11-07 Richard Sandiford + + * builtins.c (fold_builtin_classify): Move constant cases to... + * fold-const-call.c (fold_const_call_ss): ...here. + 2015-11-07 Richard Sandiford * builtins.h (c_getstr): Move to... diff --git a/gcc/builtins.c b/gcc/builtins.c index 69c56e75cd5..6eefd5409ca 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -8018,7 +8018,6 @@ static tree fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index) { tree type = TREE_TYPE (TREE_TYPE (fndecl)); - REAL_VALUE_TYPE r; if (!validate_arg (arg, REAL_TYPE)) return NULL_TREE; @@ -8029,16 +8028,6 @@ fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index) if (!HONOR_INFINITIES (arg)) return omit_one_operand_loc (loc, type, integer_zero_node, arg); - if (TREE_CODE (arg) == REAL_CST) - { - r = TREE_REAL_CST (arg); - if (real_isinf (&r)) - return real_compare (GT_EXPR, &r, &dconst0) - ? integer_one_node : integer_minus_one_node; - else - return integer_zero_node; - } - return NULL_TREE; case BUILT_IN_ISINF_SIGN: @@ -8078,24 +8067,12 @@ fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index) && !HONOR_INFINITIES (arg)) return omit_one_operand_loc (loc, type, integer_one_node, arg); - if (TREE_CODE (arg) == REAL_CST) - { - r = TREE_REAL_CST (arg); - return real_isfinite (&r) ? integer_one_node : integer_zero_node; - } - return NULL_TREE; case BUILT_IN_ISNAN: if (!HONOR_NANS (arg)) return omit_one_operand_loc (loc, type, integer_zero_node, arg); - if (TREE_CODE (arg) == REAL_CST) - { - r = TREE_REAL_CST (arg); - return real_isnan (&r) ? integer_one_node : integer_zero_node; - } - arg = builtin_save_expr (arg); return fold_build2_loc (loc, UNORDERED_EXPR, type, arg, arg); diff --git a/gcc/fold-const-call.c b/gcc/fold-const-call.c index 5af2c635313..c277d2b98fc 100644 --- a/gcc/fold-const-call.c +++ b/gcc/fold-const-call.c @@ -736,6 +736,31 @@ fold_const_call_ss (wide_int *result, built_in_function fn, /* Not yet folded to a constant. */ return false; + CASE_FLT_FN (BUILT_IN_FINITE): + case BUILT_IN_FINITED32: + case BUILT_IN_FINITED64: + case BUILT_IN_FINITED128: + case BUILT_IN_ISFINITE: + *result = wi::shwi (real_isfinite (arg) ? 1 : 0, precision); + return true; + + CASE_FLT_FN (BUILT_IN_ISINF): + case BUILT_IN_ISINFD32: + case BUILT_IN_ISINFD64: + case BUILT_IN_ISINFD128: + if (real_isinf (arg)) + *result = wi::shwi (arg->sign ? -1 : 1, precision); + else + *result = wi::shwi (0, precision); + return true; + + CASE_FLT_FN (BUILT_IN_ISNAN): + case BUILT_IN_ISNAND32: + case BUILT_IN_ISNAND64: + case BUILT_IN_ISNAND128: + *result = wi::shwi (real_isnan (arg) ? 1 : 0, precision); + return true; + default: return false; } -- 2.30.2