1 /* Copyright (C) 2006 Free Software Foundation.
3 Test things that should block GCC from optimizing compile-time
4 constants passed to a builtin transcendental function.
6 Origin: Kaveh R. Ghazi, October 22, 2006. */
8 /* { dg-do compile } */
9 /* { dg-options "-fdump-tree-original" } */
11 extern void foof (float);
12 extern void foo (double);
13 extern void fool (long double);
17 /* An argument of NaN is not evaluated at compile-time. */
18 foof (__builtin_exp2f (__builtin_nanf("")));
19 foo (__builtin_exp2 (__builtin_nan("")));
20 fool (__builtin_exp2l (__builtin_nanl("")));
22 /* An argument of Inf/-Inf is not evaluated at compile-time. */
23 foof (__builtin_exp2f (__builtin_inff()));
24 foo (__builtin_exp2 (__builtin_inf()));
25 fool (__builtin_exp2l (__builtin_infl()));
26 foof (__builtin_exp2f (-__builtin_inff()));
27 foo (__builtin_exp2 (-__builtin_inf()));
28 fool (__builtin_exp2l (-__builtin_infl()));
30 /* Result overflows MPFR, which in version 2.2.x has 30 exponent bits. */
31 foof (__builtin_exp2f (0x1p50F));
32 foo (__builtin_exp2 (0x1p50));
33 fool (__builtin_exp2l (0x1p50L));
34 /* Result underflows MPFR, which in version 2.2.x has 30 exponent bits. */
35 foof (__builtin_exp2f (-0x1p50F));
36 foo (__builtin_exp2 (-0x1p50));
37 fool (__builtin_exp2l (-0x1p50L));
39 /* Result overflows GCC's REAL_VALUE_TYPE, which has 26 exponent bits. */
40 foof (__builtin_exp2f (0x1p28F));
41 foo (__builtin_exp2 (0x1p28));
42 fool (__builtin_exp2l (0x1p28L));
43 /* Result underflows GCC's REAL_VALUE_TYPE, which has 26 exponent bits. */
44 foof (__builtin_exp2f (-0x1p28F));
45 foo (__builtin_exp2 (-0x1p28));
46 fool (__builtin_exp2l (-0x1p28L));
48 /* Result overflows (even an extended) C double's mode. */
49 foof (__builtin_exp2f (0x1p24F));
50 foo (__builtin_exp2 (0x1p24));
51 fool (__builtin_exp2l (0x1p24L));
52 /* Result underflows (even an extended) C double's mode. */
53 foof (__builtin_exp2f (-0x1p24F));
54 foo (__builtin_exp2 (-0x1p24));
55 fool (__builtin_exp2l (-0x1p24L));
57 /* Ensure that normal arguments/results are folded. */
58 foof (__builtin_exp2f (1.5F));
59 foo (__builtin_exp2 (1.5));
60 fool (__builtin_exp2l (1.5L));
61 foof (__builtin_exp2f (-1.5F));
62 foo (__builtin_exp2 (-1.5));
63 fool (__builtin_exp2l (-1.5L));
65 /* The asin arg must be [-1 ... 1] inclusive. */
66 foof (__builtin_asinf (-1.5F));
67 foof (__builtin_asinf (1.5F));
68 foo (__builtin_asin (-1.5));
69 foo (__builtin_asin (1.5));
70 fool (__builtin_asinl (-1.5L));
71 fool (__builtin_asinl (1.5L));
73 /* The acos arg must be [-1 ... 1] inclusive. */
74 foof (__builtin_acosf (-1.5F));
75 foof (__builtin_acosf (1.5F));
76 foo (__builtin_acos (-1.5));
77 foo (__builtin_acos (1.5));
78 fool (__builtin_acosl (-1.5L));
79 fool (__builtin_acosl (1.5L));
81 /* The acosh arg must be [1 ... Inf] inclusive. */
82 foof (__builtin_acoshf (0.5F));
83 foo (__builtin_acosh (0.5));
84 fool (__builtin_acoshl (0.5L));
86 /* The atanh arg must be [-1 ... 1] exclusive. */
87 foof (__builtin_atanhf (-1.0F));
88 foof (__builtin_atanhf (1.0F));
89 foo (__builtin_atanh (-1.0));
90 foo (__builtin_atanh (1.0));
91 fool (__builtin_atanhl (-1.0L));
92 fool (__builtin_atanhl (1.0L));
95 /* { dg-final { scan-tree-dump-times "exp2 " 9 "original" } } */
96 /* { dg-final { scan-tree-dump-times "exp2f" 9 "original" } } */
97 /* { dg-final { scan-tree-dump-times "exp2l" 9 "original" } } */
98 /* { dg-final { scan-tree-dump-times "asin " 2 "original" } } */
99 /* { dg-final { scan-tree-dump-times "asinf" 2 "original" } } */
100 /* { dg-final { scan-tree-dump-times "asinl" 2 "original" } } */
101 /* { dg-final { scan-tree-dump-times "acos " 2 "original" } } */
102 /* { dg-final { scan-tree-dump-times "acosf" 2 "original" } } */
103 /* { dg-final { scan-tree-dump-times "acosl" 2 "original" } } */
104 /* { dg-final { scan-tree-dump-times "acosh " 1 "original" } } */
105 /* { dg-final { scan-tree-dump-times "acoshf" 1 "original" } } */
106 /* { dg-final { scan-tree-dump-times "acoshl" 1 "original" } } */
107 /* { dg-final { scan-tree-dump-times "atanh " 2 "original" } } */
108 /* { dg-final { scan-tree-dump-times "atanhf" 2 "original" } } */
109 /* { dg-final { scan-tree-dump-times "atanhl" 2 "original" } } */
110 /* { dg-final { cleanup-tree-dump "original" } } */