convert.c (convert_to_integer): Convert (int)logb() into ilogb().

* convert.c (convert_to_integer): Convert (int)logb() into ilogb().

testsuite/ChangeLog:

	* gcc.dg/builtins-65.c: New test.

From-SVN: r148653
This commit is contained in:
Uros Bizjak 2009-06-18 13:35:38 +02:00 committed by Uros Bizjak
parent f99098233b
commit 2c2f70e1f2
4 changed files with 78 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2009-06-18 Uros Bizjak <ubizjak@gmail.com>
* convert.c (convert_to_integer): Convert (int)logb() into ilogb().
2009-06-17 Olivier Hainque <hainque@adacore.com>
* collect2.c (main): Use CONST_CAST2 to perform char ** to

View File

@ -482,6 +482,37 @@ convert_to_integer (tree type, tree expr)
}
}
/* Convert (int)logb(d) -> ilogb(d). */
if (optimize
&& flag_unsafe_math_optimizations
&& !flag_trapping_math && !flag_errno_math && flag_finite_math_only
&& integer_type_node
&& (outprec > TYPE_PRECISION (integer_type_node)
|| (outprec == TYPE_PRECISION (integer_type_node)
&& !TYPE_UNSIGNED (type))))
{
tree s_expr = strip_float_extensions (expr);
tree s_intype = TREE_TYPE (s_expr);
const enum built_in_function fcode = builtin_mathfn_code (s_expr);
tree fn = 0;
switch (fcode)
{
CASE_FLT_FN (BUILT_IN_LOGB):
fn = mathfn_built_in (s_intype, BUILT_IN_ILOGB);
break;
default:
break;
}
if (fn)
{
tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
return convert_to_integer (type, newexpr);
}
}
switch (TREE_CODE (intype))
{
case POINTER_TYPE:

View File

@ -1,3 +1,7 @@
2009-06-18 Uros Bizjak <ubizjak@gmail.com>
* gcc.dg/builtins-65.c: New test.
2009-06-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/40451

View File

@ -0,0 +1,39 @@
/* { dg-do link } */
/* { dg-options "-O2 -ffast-math" } */
extern int ilogbf (float);
extern float logbf (float);
extern int ilogb (double);
extern double logb (double);
extern int ilogbl (long double);
extern long double logbl (long double);
extern void link_error(void);
void testf(float x)
{
if ((int) logbf (x) != ilogbf (x))
link_error ();
}
void test(double x)
{
if ((int) logb (x) != ilogb (x))
link_error ();
}
void testl(long double x)
{
if ((int) logbl (x) != ilogbl (x))
link_error ();
}
int main()
{
testf (2.0f);
test (2.0);
testl (2.0l);
return 0;
}