+2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
+
+ * builtins.c (fold_builtin_load_exponent): Rename to...
+ (fold_const_builtin_load_exponent): ...this and only handle
+ constant arguments.
+ (fold_builtin_2): Update accordingly.
+ * match.pd: Add rules previously handled by fold_builtin_load_exponent.
+
2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* builtins.c (fold_builtin_logb): Rename to...
check the mode of the TYPE parameter in certain cases. */
static tree
-fold_builtin_load_exponent (location_t loc, tree arg0, tree arg1,
- tree type, bool ldexp)
+fold_const_builtin_load_exponent (tree arg0, tree arg1,
+ tree type, bool ldexp)
{
if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, INTEGER_TYPE))
{
- STRIP_NOPS (arg0);
- STRIP_NOPS (arg1);
-
- /* If arg0 is 0, Inf or NaN, or if arg1 is 0, then return arg0. */
- if (real_zerop (arg0) || integer_zerop (arg1)
- || (TREE_CODE (arg0) == REAL_CST
- && !real_isfinite (&TREE_REAL_CST (arg0))))
- return omit_one_operand_loc (loc, type, arg0, arg1);
-
/* If both arguments are constant, then try to evaluate it. */
if ((ldexp || REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2)
&& TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
break;
CASE_FLT_FN (BUILT_IN_LDEXP):
- return fold_builtin_load_exponent (loc, arg0, arg1, type, /*ldexp=*/true);
+ return fold_const_builtin_load_exponent (arg0, arg1, type,
+ /*ldexp=*/true);
CASE_FLT_FN (BUILT_IN_SCALBN):
CASE_FLT_FN (BUILT_IN_SCALBLN):
- return fold_builtin_load_exponent (loc, arg0, arg1,
- type, /*ldexp=*/false);
+ return fold_const_builtin_load_exponent (arg0, arg1, type,
+ /*ldexp=*/false);
CASE_FLT_FN (BUILT_IN_FREXP):
return fold_builtin_frexp (loc, arg0, arg1, type);
DEFINE_MATH_FN (SIGNBIT)
DEFINE_MATH_FN (FMIN)
DEFINE_MATH_FN (FMAX)
+DEFINE_MATH_FN (LDEXP)
+DEFINE_MATH_FN (SCALBN)
+DEFINE_MATH_FN (SCALBLN)
DEFINE_INT_AND_FLOAT_ROUND_FN (FLOOR)
DEFINE_INT_AND_FLOAT_ROUND_FN (CEIL)
(COPYSIGN @0 tree_expr_nonnegative_p@1)
(abs @0))
+(for scale (LDEXP SCALBN SCALBLN)
+ /* ldexp(0, x) -> 0. */
+ (simplify
+ (scale real_zerop@0 @1)
+ @0)
+ /* ldexp(x, 0) -> x. */
+ (simplify
+ (scale @0 integer_zerop@1)
+ @0)
+ /* ldexp(x, y) -> x if x is +-Inf or NaN. */
+ (simplify
+ (scale REAL_CST@0 @1)
+ (if (!real_isfinite (TREE_REAL_CST_PTR (@0)))
+ @0)))
+
/* Canonicalization of sequences of math builtins. These rules represent
IL simplifications but are not necessarily optimizations.