/* Only convert in ISO C99 mode. */
if (!TARGET_C99_FUNCTIONS)
break;
- if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
- fn = mathfn_built_in (s_intype, BUILT_IN_LLCEIL);
- else
+ if (outprec < TYPE_PRECISION (long_integer_type_node)
+ || (outprec == TYPE_PRECISION (long_integer_type_node)
+ && !TYPE_UNSIGNED (type)))
fn = mathfn_built_in (s_intype, BUILT_IN_LCEIL);
+ else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
+ && !TYPE_UNSIGNED (type))
+ fn = mathfn_built_in (s_intype, BUILT_IN_LLCEIL);
break;
CASE_FLT_FN (BUILT_IN_FLOOR):
/* Only convert in ISO C99 mode. */
if (!TARGET_C99_FUNCTIONS)
break;
- if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
- fn = mathfn_built_in (s_intype, BUILT_IN_LLFLOOR);
- else
+ if (outprec < TYPE_PRECISION (long_integer_type_node)
+ || (outprec == TYPE_PRECISION (long_integer_type_node)
+ && !TYPE_UNSIGNED (type)))
fn = mathfn_built_in (s_intype, BUILT_IN_LFLOOR);
+ else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
+ && !TYPE_UNSIGNED (type))
+ fn = mathfn_built_in (s_intype, BUILT_IN_LLFLOOR);
break;
CASE_FLT_FN (BUILT_IN_ROUND):
- if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
- fn = mathfn_built_in (s_intype, BUILT_IN_LLROUND);
- else
+ if (outprec < TYPE_PRECISION (long_integer_type_node)
+ || (outprec == TYPE_PRECISION (long_integer_type_node)
+ && !TYPE_UNSIGNED (type)))
fn = mathfn_built_in (s_intype, BUILT_IN_LROUND);
+ else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
+ && !TYPE_UNSIGNED (type))
+ fn = mathfn_built_in (s_intype, BUILT_IN_LLROUND);
break;
CASE_FLT_FN (BUILT_IN_RINT):
break;
/* ... Fall through ... */
CASE_FLT_FN (BUILT_IN_NEARBYINT):
- if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
- fn = mathfn_built_in (s_intype, BUILT_IN_LLRINT);
- else
- fn = mathfn_built_in (s_intype, BUILT_IN_LRINT);
+ if (outprec < TYPE_PRECISION (long_integer_type_node)
+ || (outprec == TYPE_PRECISION (long_integer_type_node)
+ && !TYPE_UNSIGNED (type)))
+ fn = mathfn_built_in (s_intype, BUILT_IN_LRINT);
+ else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
+ && !TYPE_UNSIGNED (type))
+ fn = mathfn_built_in (s_intype, BUILT_IN_LLRINT);
break;
CASE_FLT_FN (BUILT_IN_TRUNC):
--- /dev/null
+/* PR middle-end/28473. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+extern double round(double);
+extern double floor(double);
+extern double ceil(double);
+
+unsigned long long test1(double x)
+{
+ return (unsigned long long) round(x);
+}
+
+unsigned long long test2(double x)
+{
+ return (unsigned long long) floor(x);
+}
+unsigned long long test3(double x)
+{
+ return (unsigned long long) ceil(x);
+}
+
+/* { dg-final { scan-tree-dump-times "__builtin_lround" 0 "original" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_llround" 0 "original" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_lfloor" 0 "original" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_llfloor" 0 "original" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_lceil" 0 "original" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_llceil" 0 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
+