1 /* { dg-do run } */
2 /* { dg-options "-O2 -fmath-errno -fdump-tree-cdce-details -lm" } */
3 /* { dg-final { scan-tree-dump "cdce1.c:16: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
4 /* { dg-final { cleanup-tree-dump "cdce" } } */
5 /* { dg-require-effective-target large_double } */
6
7 #include <stdlib.h>
8 #include <math.h>
9 #include <errno.h>
10 int total_err_count = 0;
11 double foo_opt (int x, double y) __attribute__((noinline));
foo_opt(int x,double y)12 double foo_opt (int x, double y)
13 {
14 double yy = 0;
15 errno = 0;
16 yy = pow (x, y * y);
17 return 0;
18 }
19
20 double foo (int x, double y) __attribute__((noinline));
foo(int x,double y)21 double foo (int x, double y)
22 {
23 double yy = 0;
24 errno = 0;
25 yy = pow (x, y * y);
26 return yy;
27 }
28
test(double (* fp)(int x,double y))29 int test (double (*fp)(int x, double y))
30 {
31 int i,x;
32
33 x = 127;
34 for (i = 30; i < 300; i++)
35 {
36 fp (x, i);
37 if (errno)
38 total_err_count ++;
39 }
40
41 x = -300;
42 for (i = 100; i < 300; i++)
43 {
44 fp (x, i);
45 if (errno)
46 total_err_count ++;
47 }
48
49 x = 65577;
50 for (i = 60; i < 200; i++)
51 {
52 fp (x, i);
53 if (errno)
54 total_err_count ++;
55 }
56
57 x = 65577 * 127;
58 for (i = 1; i < 100; i++)
59 {
60 fp (x, i);
61 if (errno)
62 total_err_count ++;
63 }
64
65 return total_err_count;
66 }
67
main()68 int main ()
69 {
70 int en1, en2;
71 total_err_count = 0;
72 en1 = test (foo_opt);
73 total_err_count = 0;
74 en2 = test (foo);
75
76 if (en1 != en2)
77 abort ();
78
79 return 0;
80 }
81