1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fdump-ipa-icf" } */
3
4 #include <stdlib.h>
5 #include <stdio.h>
6
7 int gcd(int x, int y) __attribute__ ((pure));
8
9 __attribute__ ((noinline))
gcd(int x,int y)10 int gcd(int x, int y)
11 {
12 int swap;
13
14 if(x <= 0 || y <= 0)
15 return 0;
16
17 if(x < y)
18 {
19 swap = x;
20 x = y;
21 y = swap;
22 }
23
24 while(x != y)
25 {
26 x = x - y;
27
28 if(y > x)
29 {
30 swap = x;
31 x = y;
32 y = swap;
33 }
34 }
35
36 return x;
37 }
38
39 int nsd(int x, int y) __attribute__ ((pure));
40
41 __attribute__ ((noinline))
nsd(int x,int y)42 int nsd(int x, int y)
43 {
44 int swap;
45
46 if(x <= 0 || y <= 0)
47 return 0;
48
49 if(x < y)
50 {
51 swap = x;
52 x = y;
53 y = swap;
54 }
55
56 while(x != y)
57 {
58 x = x - y;
59
60 if(y > x)
61 {
62 swap = x;
63 x = y;
64 y = swap;
65 }
66 }
67
68 return x;
69 }
70
71 int nsd_different_result(int x, int y) __attribute__ ((pure));
72
73 __attribute__ ((noinline))
nsd_different_result(int x,int y)74 int nsd_different_result(int x, int y)
75 {
76 int pes;
77
78 if(x <= 0 || y <= 0)
79 return 1;
80
81 if(x < 10)
82 y = 12;
83 else if(x == 44)
84 y = 124;
85 else
86 y = 1111;
87
88 if(x < y)
89 {
90 pes = x;
91 x = y;
92 y = pes;
93 }
94
95 while(x != y)
96 {
97 x = x - y;
98
99 if(y > x)
100 {
101 pes = x;
102 x = y;
103 y = pes;
104 }
105 }
106
107 return x;
108 }
109
110 int nsd_different_result2(int x, int y) __attribute__ ((pure));
111
112 __attribute__ ((noinline))
nsd_different_result2(int x,int y)113 int nsd_different_result2(int x, int y)
114 {
115 int pes;
116
117 if(x <= 0 || y <= 0)
118 return 1;
119
120 if(x < 10)
121 y = 12;
122 else if(x == 44)
123 y = 124;
124 else
125 y = 1111;
126
127 if(x < y)
128 {
129 pes = x;
130 x = y;
131 y = pes;
132 }
133
134 while(x != y)
135 {
136 x = x - y;
137
138 if(y > x)
139 {
140 pes = x;
141 x = y;
142 y = pes;
143 }
144 }
145
146 return x;
147 }
148
149 __attribute__ ((noinline))
s1(int x)150 int s1(int x)
151 {
152 switch (x)
153 {
154 case 10:
155 case 11:
156 return 2;
157 case 12:
158 return 123;
159 default:
160 return x + 2;
161 }
162 }
163
164 __attribute__ ((noinline))
s2(int x)165 int s2(int x)
166 {
167 switch (x)
168 {
169 case 10:
170 case 11:
171 return 2;
172 case 12:
173 return 123;
174 default:
175 return x + 2;
176 }
177 }
main(int argc,char ** argv)178 int main(int argc, char **argv)
179 {
180 if(argc < 3)
181 return 1;
182
183 int a = atoi(argv[1]);
184 int b = atoi(argv[2]);
185
186 printf("Test1: %d, %d, gdc: %d\n", a, b, gcd(a, b));
187 printf("Test2: %d, %d, gdc: %d\n", a, b, nsd(a, b));
188 }
189
190 /* { dg-final { scan-ipa-dump "Semantic equality hit:s1->s2" "icf" } } */
191 /* { dg-final { scan-ipa-dump "Semantic equality hit:nsd_different_result->nsd_different_result2" "icf" } } */
192 /* { dg-final { scan-ipa-dump "Semantic equality hit:gcd->nsd" "icf" } } */
193 /* { dg-final { scan-ipa-dump "Equal symbols: 3" "icf" } } */
194