+ if (optimize
+ && (((fcode == BUILT_IN_FLOORL
+ || fcode == BUILT_IN_CEILL
+ || fcode == BUILT_IN_ROUND
+ || fcode == BUILT_IN_TRUNC
+ || fcode == BUILT_IN_NEARBYINT)
+ && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
+ || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
+ || ((fcode == BUILT_IN_FLOOR
+ || fcode == BUILT_IN_CEIL
+ || fcode == BUILT_IN_ROUND
+ || fcode == BUILT_IN_TRUNC
+ || fcode == BUILT_IN_NEARBYINT)
+ && (TYPE_MODE (type) == TYPE_MODE (float_type_node)))))
+ {
+ tree fn = mathfn_built_in (type, fcode);
+
+ if (fn)
+ {
+ tree arg0 = strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr,
+ 1)));
+ tree arglist = build_tree_list (NULL_TREE,
+ fold (convert_to_real (type, arg0)));
+
+ return build_function_call_expr (fn, arglist);
+ }
+ }