From ea28bb0b9da3f70832bb599b298f2ae019b83a15 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Thu, 25 Apr 2013 15:51:57 +0000 Subject: re PR tree-optimization/57066 (std::logb(-inf) returns wrong value) PR tree-optimization/57066 * builtins.c (fold_builtin_logb): Return +Inf for -Inf. * gcc.dg/torture/builtin-logb-1.c: Adjust testcase. From-SVN: r198308 --- gcc/builtins.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'gcc/builtins.c') diff --git a/gcc/builtins.c b/gcc/builtins.c index efab82e..1fbd2f3 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -9698,7 +9698,16 @@ fold_builtin_logb (location_t loc, tree arg, tree rettype) case rvc_inf: /* If arg is Inf or NaN and we're logb, return it. */ if (TREE_CODE (rettype) == REAL_TYPE) - return fold_convert_loc (loc, rettype, arg); + { + /* For logb(-Inf) we have to return +Inf. */ + if (real_isinf (value) && real_isneg (value)) + { + REAL_VALUE_TYPE tem; + real_inf (&tem); + return build_real (rettype, tem); + } + return fold_convert_loc (loc, rettype, arg); + } /* Fall through... */ case rvc_zero: /* Zero may set errno and/or raise an exception for logb, also -- cgit v1.1