typeck.c (convert_ieee_real_to_integer): Call fold on the range checking trees as they're being built.

2004-08-04  Roger Sayle  <roger@eyesopen.com>
            Andrew Haley  <aph@redhat.com>

        * typeck.c (convert_ieee_real_to_integer): Call fold on the range
        checking trees as they're being built.
        (convert): Call convert_ieee_real_to_integer if we're
        converting a constant, even if we're writing a class file.

Co-Authored-By: Andrew Haley <aph@redhat.com>

From-SVN: r85553
This commit is contained in:
Roger Sayle 2004-08-04 11:13:07 +00:00 committed by Andrew Haley
parent da96112d34
commit 545eacdb41
2 changed files with 29 additions and 18 deletions

View file

@ -1,3 +1,11 @@
2004-08-04 Roger Sayle <roger@eyesopen.com>
Andrew Haley <aph@redhat.com>
* typeck.c (convert_ieee_real_to_integer): Call fold on the range
checking trees as they're being built.
(convert): Call convert_ieee_real_to_integer if we're
converting a constant, even if we're writing a class file.
2004-08-02 Bryce McKinlay <mckinlay@redhat.com>
PR java/16701

View file

@ -83,22 +83,24 @@ convert_ieee_real_to_integer (tree type, tree expr)
tree result;
expr = save_expr (expr);
result = build3 (COND_EXPR, type,
build2 (NE_EXPR, boolean_type_node, expr, expr),
convert (type, integer_zero_node),
convert_to_integer (type, expr));
result = build3 (COND_EXPR, type,
build2 (LE_EXPR, boolean_type_node, expr,
convert (TREE_TYPE (expr), TYPE_MIN_VALUE (type))),
TYPE_MIN_VALUE (type),
result);
result = build3 (COND_EXPR, type,
build2 (GE_EXPR, boolean_type_node, expr,
convert (TREE_TYPE (expr), TYPE_MAX_VALUE (type))),
TYPE_MAX_VALUE (type),
result);
result = fold (build3 (COND_EXPR, type,
fold (build2 (NE_EXPR, boolean_type_node, expr, expr)),
convert (type, integer_zero_node),
convert_to_integer (type, expr)));
result = fold (build3 (COND_EXPR, type,
fold (build2 (LE_EXPR, boolean_type_node, expr,
convert (TREE_TYPE (expr),
TYPE_MIN_VALUE (type)))),
TYPE_MIN_VALUE (type),
result));
result = fold (build3 (COND_EXPR, type,
fold (build2 (GE_EXPR, boolean_type_node, expr,
convert (TREE_TYPE (expr),
TYPE_MAX_VALUE (type)))),
TYPE_MAX_VALUE (type),
result));
return result;
}
@ -131,8 +133,9 @@ convert (tree type, tree expr)
return fold (convert_to_boolean (type, expr));
if (code == INTEGER_TYPE)
{
if (! flag_unsafe_math_optimizations
&& ! flag_emit_class_files
if ((really_constant_p (expr)
|| (! flag_unsafe_math_optimizations
&& ! flag_emit_class_files))
&& TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE
&& TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
return fold (convert_ieee_real_to_integer (type, expr));