]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/torture/builtin-attr-1.c
1 /* Copyright (C) 2003 Free Software Foundation.
3 Verify that the `const' function attribute is applied to various
4 builtins and that these functions are optimized away by the
5 compiler under the appropriate circumstances.
7 Written by Kaveh Ghazi, 2003-08-04. */
10 /* { dg-options "-ffast-math" } */
12 /* These are helper macros to test combinations of functions. We test
13 foo() != foo() with the same arguments, and expect the compiler to
14 optimize away these tests of const functions. */
16 /* Just test the __builtin_ functions. */
17 #define BUILTIN_TEST1(FN, TYPE) \
18 extern void link_failure_builtin_##FN(void); \
19 void test_builtin_##FN(TYPE x) \
20 { if (__builtin_##FN(x) != __builtin_##FN(x)) link_failure_builtin_##FN(); }
22 /* Just test the __builtin_ functions. */
23 #define BUILTIN_TEST2(FN, TYPE) \
24 extern void link_failure_builtin_##FN(void); \
25 void test_builtin_##FN(TYPE x, TYPE y) \
26 { if (__builtin_##FN(x,y) != __builtin_##FN(x,y)) link_failure_builtin_##FN(); }
28 /* Also test the regular (non-__builtin_) function. */
29 #define TEST1(FN, TYPE) \
30 BUILTIN_TEST1(FN, TYPE) \
31 extern void link_failure_##FN(void); \
32 void test_##FN(TYPE x) { if (FN(x) != FN(x)) link_failure_##FN(); }
34 /* Test the __builtin_ functions taking void arguments (with the "f"
36 #define BUILTIN_FPTEST0(FN) \
37 extern void link_failure_builtin_##FN(void); \
38 extern void link_failure_builtin_##FN##f(void); \
39 extern void link_failure_builtin_##FN##l(void); \
40 void test_builtin_##FN(void) \
41 { if (__builtin_##FN() != __builtin_##FN()) link_failure_builtin_##FN(); } \
42 void test_builtin_##FN##f(void) \
43 { if (__builtin_##FN##f() != __builtin_##FN##f()) link_failure_builtin_##FN##f(); } \
44 void test_builtin_##FN##l(void) \
45 { if (__builtin_##FN##l() != __builtin_##FN##l()) link_failure_builtin_##FN##l(); }
47 /* Test the __builtin_ functions taking one FP argument (with the "f"
49 #define BUILTIN_FPTEST1(FN) \
50 extern void link_failure_builtin_##FN(void); \
51 extern void link_failure_builtin_##FN##f(void); \
52 extern void link_failure_builtin_##FN##l(void); \
53 void test_builtin_##FN(double d) \
54 { if (__builtin_##FN(d) != __builtin_##FN(d)) link_failure_builtin_##FN(); } \
55 void test_builtin_##FN##f(float f) \
56 { if (__builtin_##FN##f(f) != __builtin_##FN##f(f)) link_failure_builtin_##FN##f(); } \
57 void test_builtin_##FN##l(long double ld) \
58 { if (__builtin_##FN##l(ld) != __builtin_##FN##l(ld)) link_failure_builtin_##FN##l(); }
60 /* Test the __builtin_ functions taking one argument of supplied type
61 (with the "f" and "l" variants). */
62 #define BUILTIN_FPTEST1ARG(FN, TYPE) \
63 extern void link_failure_builtin_##FN(void); \
64 extern void link_failure_builtin_##FN##f(void); \
65 extern void link_failure_builtin_##FN##l(void); \
66 void test_builtin_##FN(TYPE x) \
67 { if (__builtin_##FN(x) != __builtin_##FN(x)) link_failure_builtin_##FN(); } \
68 void test_builtin_##FN##f(TYPE x) \
69 { if (__builtin_##FN##f(x) != __builtin_##FN##f(x)) link_failure_builtin_##FN##f(); } \
70 void test_builtin_##FN##l(TYPE x) \
71 { if (__builtin_##FN##l(x) != __builtin_##FN##l(x)) link_failure_builtin_##FN##l(); }
73 /* Test the __builtin_ functions taking two FP arguments (with the "f"
75 #define BUILTIN_FPTEST2(FN) \
76 extern void link_failure_builtin_##FN(void); \
77 extern void link_failure_builtin_##FN##f(void); \
78 extern void link_failure_builtin_##FN##l(void); \
79 void test_builtin_##FN(double d1, double d2) \
80 { if (__builtin_##FN(d1,d2) != __builtin_##FN(d1,d2)) link_failure_builtin_##FN(); } \
81 void test_builtin_##FN##f(float f1, float f2) \
82 { if (__builtin_##FN##f(f1,f2) != __builtin_##FN##f(f1,f2)) link_failure_builtin_##FN##f(); } \
83 void test_builtin_##FN##l(long double ld1, long double ld2) \
84 { if (__builtin_##FN##l(ld1,ld2) != __builtin_##FN##l(ld1,ld2)) link_failure_builtin_##FN##l(); }
86 /* Test the __builtin_ functions taking two arguments, one FP and one
87 supplied type (with the "f" and "l" variants). */
88 #define BUILTIN_FPTEST2ARG(FN, TYPE) \
89 extern void link_failure_builtin_##FN(void); \
90 extern void link_failure_builtin_##FN##f(void); \
91 extern void link_failure_builtin_##FN##l(void); \
92 void test_builtin_##FN(double d, TYPE x) \
93 { if (__builtin_##FN(d,x) != __builtin_##FN(d,x)) link_failure_builtin_##FN(); } \
94 void test_builtin_##FN##f(float f, TYPE x) \
95 { if (__builtin_##FN##f(f,x) != __builtin_##FN##f(f,x)) link_failure_builtin_##FN##f(); } \
96 void test_builtin_##FN##l(long double ld, TYPE x) \
97 { if (__builtin_##FN##l(ld,x) != __builtin_##FN##l(ld,x)) link_failure_builtin_##FN##l(); }
99 /* Test the __builtin_ functions taking three FP arguments (with the
100 "f" and "l" variants). */
101 #define BUILTIN_FPTEST3(FN) \
102 extern void link_failure_builtin_##FN(void); \
103 extern void link_failure_builtin_##FN##f(void); \
104 extern void link_failure_builtin_##FN##l(void); \
105 void test_builtin_##FN(double d1, double d2, double d3) \
106 { if (__builtin_##FN(d1,d2,d3) != __builtin_##FN(d1,d2,d3)) link_failure_builtin_##FN(); } \
107 void test_builtin_##FN##f(float f1, float f2, float f3) \
108 { if (__builtin_##FN##f(f1,f2,f3) != __builtin_##FN##f(f1,f2,f3)) link_failure_builtin_##FN##f(); } \
109 void test_builtin_##FN##l(long double ld1, long double ld2, long double ld3) \
110 { if (__builtin_##FN##l(ld1,ld2,ld3) != __builtin_##FN##l(ld1,ld2,ld3)) link_failure_builtin_##FN##l(); }
112 /* These macros additionally test the non-__builtin_ functions. */
114 /* Test the functions taking one FP argument (with the "f" and "l"
116 #define FPTEST1(FN) \
117 BUILTIN_FPTEST1(FN) \
118 extern void link_failure_##FN(void); \
119 extern void link_failure_##FN##f(void); \
120 extern void link_failure_##FN##l(void); \
121 void test_##FN(double d) \
122 { if (FN(d) != FN(d)) link_failure_##FN(); } \
123 void test_##FN##f(float f) \
124 { if (FN##f(f) != FN##f(f)) link_failure_##FN##f(); } \
125 void test_##FN##l(long double ld) \
126 { if (FN##l(ld) != FN##l(ld)) link_failure_##FN##l(); }
128 /* Test the functions taking two FP arguments (with the "f" and "l"
130 #define FPTEST2(FN) \
131 BUILTIN_FPTEST2(FN) \
132 extern void link_failure_##FN(void); \
133 extern void link_failure_##FN##f(void); \
134 extern void link_failure_##FN##l(void); \
135 void test_##FN(double d1, double d2) \
136 { if (FN(d1,d2) != FN(d1,d2)) link_failure_##FN(); } \
137 void test_##FN##f(float f1, float f2) \
138 { if (FN##f(f1,f2) != FN##f(f1,f2)) link_failure_##FN##f(); } \
139 void test_##FN##l(long double ld1, long double ld2) \
140 { if (FN##l(ld1,ld2) != FN##l(ld1,ld2)) link_failure_##FN##l(); }
142 /* Test the functions taking two arguments, one FP and one of supplied
143 type (with the "f" and "l" variants). */
144 #define FPTEST2ARG(FN, TYPE) \
145 BUILTIN_FPTEST2ARG(FN, TYPE) \
146 extern void link_failure_##FN(void); \
147 extern void link_failure_##FN##f(void); \
148 extern void link_failure_##FN##l(void); \
149 void test_##FN(double d, TYPE x) \
150 { if (FN(d,x) != FN(d,x)) link_failure_##FN(); } \
151 void test_##FN##f(float f, TYPE x) \
152 { if (FN##f(f,x) != FN##f(f,x)) link_failure_##FN##f(); } \
153 void test_##FN##l(long double ld, TYPE x) \
154 { if (FN##l(ld,x) != FN##l(ld,x)) link_failure_##FN##l(); }
156 /* Test the functions taking three FP arguments (with the "f" and "l"
158 #define FPTEST3(FN) \
159 BUILTIN_FPTEST3(FN) \
160 extern void link_failure_##FN(void); \
161 extern void link_failure_##FN##f(void); \
162 extern void link_failure_##FN##l(void); \
163 void test_##FN(double d1, double d2, double d3) \
164 { if (FN(d1,d2,d3) != FN(d1,d2,d3)) link_failure_##FN(); } \
165 void test_##FN##f(float f1, float f2, float f3) \
166 { if (FN##f(f1,f2,f3) != FN##f(f1,f2,f3)) link_failure_##FN##f(); } \
167 void test_##FN##l(long double ld1, long double ld2, long double ld3) \
168 { if (FN##l(ld1,ld2,ld3) != FN##l(ld1,ld2,ld3)) link_failure_##FN##l(); }
171 /* Test the math builtins. */
196 BUILTIN_FPTEST0 (huge_val
)
199 BUILTIN_FPTEST0 (inf
)
200 FPTEST2ARG (ldexp
, int)
210 BUILTIN_FPTEST1ARG (nan
, char *)
211 BUILTIN_FPTEST1ARG (nans
, char *)
221 FPTEST2ARG (scalbln
, int)
222 FPTEST2ARG (scalbn
, int)
230 /* Various other const builtins. */
232 BUILTIN_TEST1 (clz
, int)
233 BUILTIN_TEST1 (clzl
, long)
234 BUILTIN_TEST1 (clzll
, long long)
235 BUILTIN_TEST1 (ctz
, int)
236 BUILTIN_TEST1 (ctzl
, long)
237 BUILTIN_TEST1 (ctzll
, long long)
240 TEST1 (ffsll
, long long)
243 TEST1 (llabs
, long long)
244 BUILTIN_TEST1 (parity
, int)
245 BUILTIN_TEST1 (parityl
, long)
246 BUILTIN_TEST1 (parityll
, long long)
247 BUILTIN_TEST1 (popcount
, int)
248 BUILTIN_TEST1 (popcountl
, long)
249 BUILTIN_TEST1 (popcountll
, long long)