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:
parent
f99098233b
commit
2c2f70e1f2
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
39
gcc/testsuite/gcc.dg/builtins-65.c
Normal file
39
gcc/testsuite/gcc.dg/builtins-65.c
Normal 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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user