111
|
1 /* { dg-do run } */
|
|
2 /* { dg-require-effective-target c99_runtime } */
|
|
3 /* { dg-options "-O2 -fmath-errno -fdump-tree-cdce-details -lm" } */
|
|
4 /* { dg-additional-options "-DLARGE_LONG_DOUBLE" { target large_long_double } } */
|
|
5 /* { dg-additional-options "-DGNU_EXTENSION" { target pow10 } } */
|
|
6 /* { dg-add-options ieee } */
|
131
|
7 /* { dg-final { scan-tree-dump "cdce3.C:91: .* function call is shrink-wrapped into error conditions\." "cdce" { target pow10 } } } */
|
|
8 /* { dg-final { scan-tree-dump "cdce3.C:92: .* function call is shrink-wrapped into error conditions\." "cdce" { target pow10 } } } */
|
|
9 /* { dg-final { scan-tree-dump "cdce3.C:94: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
10 /* { dg-final { scan-tree-dump "cdce3.C:95: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
11 /* { dg-final { scan-tree-dump "cdce3.C:96: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
12 /* { dg-final { scan-tree-dump "cdce3.C:97: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
13 /* { dg-final { scan-tree-dump "cdce3.C:98: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
14 /* { dg-final { scan-tree-dump "cdce3.C:99: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
15 /* { dg-final { scan-tree-dump "cdce3.C:100: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
16 /* { dg-final { scan-tree-dump "cdce3.C:101: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
17 /* { dg-final { scan-tree-dump "cdce3.C:102: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
18 /* { dg-final { scan-tree-dump "cdce3.C:103: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
19 /* { dg-final { scan-tree-dump "cdce3.C:104: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
20 /* { dg-final { scan-tree-dump "cdce3.C:105: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
21 /* { dg-final { scan-tree-dump "cdce3.C:106: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
|
22 /* { dg-final { scan-tree-dump "cdce3.C:107: .* function call is shrink-wrapped into error conditions\." "cdce" } } */
|
111
|
23
|
|
24 #include <stdlib.h>
|
|
25 #include <math.h>
|
|
26 #ifdef DEBUG
|
|
27 #include <stdio.h>
|
|
28 #endif
|
|
29 #include <errno.h>
|
|
30 typedef void (*FP) (int xp);
|
|
31 #define NI __attribute__((noinline))
|
|
32
|
|
33 #if defined(LARGE_LONG_DOUBLE)
|
|
34 typedef long double ldouble;
|
|
35 ldouble result;
|
|
36
|
|
37 #define DEF_MATH_FUNC(prefix, name) NI void prefix##name##f (int x) \
|
|
38 { \
|
|
39 float yy = name##f ((float) x); \
|
|
40 STORE_RESULT; \
|
|
41 } \
|
|
42 NI void prefix##name (int x) \
|
|
43 { \
|
|
44 double yy = name ((double)x); \
|
|
45 STORE_RESULT; \
|
|
46 } \
|
|
47 NI void prefix##name##l (int x) \
|
|
48 { \
|
|
49 ldouble yy = name##l ((ldouble)x); \
|
|
50 STORE_RESULT; \
|
|
51 }
|
|
52 #else
|
|
53 double result;
|
|
54
|
|
55 #define DEF_MATH_FUNC(prefix, name) NI void prefix##name##f (int x) \
|
|
56 { \
|
|
57 float yy = name##f ((float) x); \
|
|
58 STORE_RESULT; \
|
|
59 } \
|
|
60 NI void prefix##name (int x) \
|
|
61 { \
|
|
62 double yy = name ((double)x); \
|
|
63 STORE_RESULT; \
|
|
64 }
|
|
65 #endif
|
|
66
|
|
67 #undef STORE_RESULT
|
|
68 #define STORE_RESULT result = yy
|
|
69 #if defined(GNU_EXTENSION)
|
|
70 DEF_MATH_FUNC (m,pow10)
|
|
71 DEF_MATH_FUNC (m,exp10)
|
|
72 #endif
|
|
73 DEF_MATH_FUNC (m,exp2)
|
|
74 DEF_MATH_FUNC (m,exp)
|
|
75 DEF_MATH_FUNC (m,expm1)
|
|
76 DEF_MATH_FUNC (m,cosh)
|
|
77 DEF_MATH_FUNC (m,sinh)
|
|
78 DEF_MATH_FUNC (m,acos)
|
|
79 DEF_MATH_FUNC (m,asin)
|
|
80 DEF_MATH_FUNC (m,acosh)
|
|
81 DEF_MATH_FUNC (m,atanh)
|
|
82 DEF_MATH_FUNC (m,log)
|
|
83 DEF_MATH_FUNC (m,log2)
|
|
84 DEF_MATH_FUNC (m,log10)
|
|
85 DEF_MATH_FUNC (m,log1p)
|
|
86 DEF_MATH_FUNC (m,sqrt)
|
|
87
|
|
88 #undef STORE_RESULT
|
|
89 #define STORE_RESULT
|
|
90 #if defined(GNU_EXTENSION)
|
|
91 DEF_MATH_FUNC (o,pow10)
|
|
92 DEF_MATH_FUNC (o,exp10)
|
|
93 #endif
|
|
94 DEF_MATH_FUNC (o,exp2)
|
|
95 DEF_MATH_FUNC (o,exp)
|
|
96 DEF_MATH_FUNC (o,expm1)
|
|
97 DEF_MATH_FUNC (o,cosh)
|
|
98 DEF_MATH_FUNC (o,sinh)
|
|
99 DEF_MATH_FUNC (o,acos)
|
|
100 DEF_MATH_FUNC (o,asin)
|
|
101 DEF_MATH_FUNC (o,acosh)
|
|
102 DEF_MATH_FUNC (o,atanh)
|
|
103 DEF_MATH_FUNC (o,log)
|
|
104 DEF_MATH_FUNC (o,log2)
|
|
105 DEF_MATH_FUNC (o,log10)
|
|
106 DEF_MATH_FUNC (o,log1p)
|
|
107 DEF_MATH_FUNC (o,sqrt)
|
|
108
|
|
109 #if defined(LARGE_LONG_DOUBLE)
|
|
110 #define INIT_MATH_FUNC(prefix, name, lb, ub) { prefix##name##f, #name "f", 0, 0, lb, ub }, \
|
|
111 { prefix##name, #name, 0, 0, lb, ub }, \
|
|
112 { prefix##name##l, #name "l" , 0, 0, lb, ub },
|
|
113 #else
|
|
114 #define INIT_MATH_FUNC(prefix, name, lb, ub) { prefix##name##f, #name "f", 0, 0, lb, ub }, \
|
|
115 { prefix##name, #name, 0, 0, lb, ub },
|
|
116 #endif
|
|
117
|
|
118 struct MathFuncInfo
|
|
119 {
|
|
120 FP math_func;
|
|
121 const char* name;
|
|
122 int lb;
|
|
123 int ub;
|
|
124 bool has_lb;
|
|
125 bool has_ub;
|
|
126 } math_func_arr[] = {
|
|
127 #if defined(GNU_EXTENSION)
|
|
128 INIT_MATH_FUNC (m,pow10, false, true)
|
|
129 INIT_MATH_FUNC (m,exp10, false, true)
|
|
130 #endif
|
|
131 INIT_MATH_FUNC (m,exp2, false, true)
|
|
132 INIT_MATH_FUNC (m,expm1, false, true)
|
|
133 INIT_MATH_FUNC (m,exp, false, true)
|
|
134 INIT_MATH_FUNC (m,cosh, true, true)
|
|
135 INIT_MATH_FUNC (m,sinh, true, true)
|
|
136 INIT_MATH_FUNC (m,acos, true, true)
|
|
137 INIT_MATH_FUNC (m,asin, true, true)
|
|
138 INIT_MATH_FUNC (m,acosh, true, false)
|
|
139 INIT_MATH_FUNC (m,atanh, true, true)
|
|
140 INIT_MATH_FUNC (m,log10, true, false)
|
|
141 INIT_MATH_FUNC (m,log, true, false)
|
|
142 INIT_MATH_FUNC (m,log2, true, false)
|
|
143 INIT_MATH_FUNC (m,log1p, true, false)
|
|
144 INIT_MATH_FUNC (m,sqrt, true, false)
|
|
145 { 0, 0, 0, 0, 0, 0} };
|
|
146
|
|
147 MathFuncInfo opt_math_func_arr[] =
|
|
148 {
|
|
149 #if defined(GNU_EXTENSION)
|
|
150 INIT_MATH_FUNC (o,pow10, false, true)
|
|
151 INIT_MATH_FUNC (o,exp10, false, true)
|
|
152 #endif
|
|
153 INIT_MATH_FUNC (o,exp2, false, true)
|
|
154 INIT_MATH_FUNC (o,expm1, false, true)
|
|
155 INIT_MATH_FUNC (o,exp, false, true)
|
|
156 INIT_MATH_FUNC (o,cosh, true, true)
|
|
157 INIT_MATH_FUNC (o,sinh, true, true)
|
|
158 INIT_MATH_FUNC (o,acos, true, true)
|
|
159 INIT_MATH_FUNC (o,asin, true, true)
|
|
160 INIT_MATH_FUNC (o,acosh, true, false)
|
|
161 INIT_MATH_FUNC (o,atanh, true, true)
|
|
162 INIT_MATH_FUNC (o,log10, true, false)
|
|
163 INIT_MATH_FUNC (o,log, true, false)
|
|
164 INIT_MATH_FUNC (o,log2, true, false)
|
|
165 INIT_MATH_FUNC (o,log1p, true, false)
|
|
166 INIT_MATH_FUNC (o,sqrt, true, false)
|
|
167 { 0, 0, 0, 0, 0, 0} };
|
|
168
|
|
169 int test (MathFuncInfo* math_func_infos)
|
|
170 {
|
|
171 int i = 0;
|
|
172 int te = 0;
|
|
173
|
|
174 for (i = 0; math_func_infos[i].math_func; i++)
|
|
175 {
|
|
176 MathFuncInfo& info = math_func_infos[i];
|
|
177 int j;
|
|
178 if (info.has_lb)
|
|
179 {
|
|
180 for (j = 0; j > -500000; j--)
|
|
181 {
|
|
182
|
|
183 errno = 0;
|
|
184 info.math_func (j);
|
|
185 if (errno != 0)
|
|
186 {
|
|
187 te++;
|
|
188 info.lb = j ;
|
|
189 break;
|
|
190 }
|
|
191 }
|
|
192 }
|
|
193 if (info.has_ub)
|
|
194 {
|
|
195 for (j = 0; j < 500000; j++)
|
|
196 {
|
|
197 errno = 0;
|
|
198 info.math_func (j);
|
|
199 if (errno != 0)
|
|
200 {
|
|
201 te++;
|
|
202 info.ub = j ;
|
|
203 break;
|
|
204 }
|
|
205 }
|
|
206 }
|
|
207 }
|
|
208 return te;
|
|
209 }
|
|
210
|
|
211 int main()
|
|
212 {
|
|
213 int te1, te2;
|
|
214
|
|
215 te1 = test (&math_func_arr[0]);
|
|
216 te2 = test (&opt_math_func_arr[0]);
|
|
217
|
|
218 // Now examine the result
|
|
219 int i = 0;
|
|
220 int errcnt = 0;
|
|
221 for (i = 0; math_func_arr[i].math_func; i++)
|
|
222 {
|
|
223 MathFuncInfo& info = math_func_arr[i];
|
|
224 MathFuncInfo& opt_info = opt_math_func_arr[i];
|
|
225 #ifdef DEBUG
|
|
226 fprintf (stderr," %s: lb = %d, ub = %d: lb_opt = %d, ub_opt = %d\n",
|
|
227 info.name, info.lb, info.ub, opt_info.lb, opt_info.ub);
|
|
228 #endif
|
|
229 if (info.lb != opt_info.lb) errcnt ++;
|
|
230 if (info.ub != opt_info.ub) errcnt ++;
|
|
231 }
|
|
232 if (errcnt) abort();
|
|
233 return 0;
|
|
234 }
|