OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.misc-tests/] [bprob-1.c] - Blame information for rev 774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 690 jeremybenn
/* Check that various C constructs are handled correctly by profile-directed
2
   block ordering.
3
 
4
   This test is the same as gcov-4.c.  The "count" comments are left in to
5
   make comparisons easier; they are ignored for this test. */
6
 
7
extern void abort (void);
8
 
9
int do_something (int i)
10
{
11
  return i;
12
}
13
 
14
/* Check static inline functions. */
15
 
16
int unref_val;
17
 
18
static inline int
19
unreferenced (int i, int j)
20
{
21
  return i - j;
22
}
23
 
24
static inline int
25
uncalled (int i, int j)
26
{
27
  return i * j;
28
}
29
 
30
static inline int
31
called (int i, int j)
32
{
33
    return i + j;                       /* count(1) */
34
}
35
 
36
void
37
call_unref ()
38
{
39
  if (unref_val)                        /* count(1) */
40
    unref_val = uncalled (1, 2);
41
  unref_val = called (unref_val, 4);    /* count(1) */
42
}
43
 
44
 
45
/* Check for loops. */
46
 
47
int for_val1;
48
int for_val2;
49
int for_temp;
50
 
51
int
52
test_for1 (int n)
53
{
54
  int i;
55
  for_temp = 1;                         /* count(3) */
56
  for (i = 0; i < n; i++)
57
    for_temp++;                         /* count(9) */
58
  return for_temp;                      /* count(3) */
59
}
60
 
61
int
62
test_for2 (int m, int n, int o)
63
{
64
  int i, j, k;
65
  for_temp = 1;                         /* count(6) */
66
  for (i = 0; i < n; i++)
67
    for (j = 0; j < m; j++)
68
      for (k = 0; k < o; k++)
69
        for_temp++;                     /* count(81) */
70
  return for_temp;                      /* count(6) */
71
}
72
 
73
void
74
call_for ()
75
{
76
  for_val1 += test_for1 (0);
77
  for_val1 += test_for1 (2);
78
  for_val1 += test_for1 (7);
79
 
80
  for_val2 += test_for2 (0, 0, 0);
81
  for_val2 += test_for2 (1, 0, 0);
82
  for_val2 += test_for2 (1, 3, 0);
83
  for_val2 += test_for2 (1, 3, 1);
84
  for_val2 += test_for2 (3, 1, 5);
85
  for_val2 += test_for2 (3, 7, 3);
86
}
87
 
88
/* Check the use of goto. */
89
 
90
int goto_val;
91
 
92
int
93
test_goto1 (int f)
94
{
95
  if (f)                                /* count(2) */
96
    goto lab1;                          /* count(1) */
97
  return 1;                             /* count(1) */
98
lab1:
99
  return 2;                             /* count(1) */
100
}
101
 
102
int
103
test_goto2 (int f)
104
{
105
  int i;
106
  for (i = 0; i < 10; i++)               /* count(15) */
107
    if (i == f) goto lab2;              /* count(14) */
108
  return 4;                             /* count(1) */
109
lab2:
110
  return 8;                             /* count(1) */
111
}
112
 
113
void
114
call_goto ()
115
{
116
  goto_val += test_goto1 (0);
117
  goto_val += test_goto1 (1);
118
  goto_val += test_goto2 (3);
119
  goto_val += test_goto2 (30);
120
}
121
 
122
/* Check nested if-then-else statements. */
123
 
124
int ifelse_val1;
125
int ifelse_val2;
126
int ifelse_val3;
127
 
128
int
129
test_ifelse1 (int i, int j)
130
{
131
  int result = 0;
132
  if (i)                                /* count(5) */
133
    if (j)                              /* count(3) */
134
      result = do_something (4);        /* count(3) */
135
    else
136
      result = do_something (1024);
137
  else
138
    if (j)                              /* count(2) */
139
      result = do_something (1);        /* count(1) */
140
    else
141
      result = do_something (2);        /* count(1) */
142
  if (i > j)                            /* count(5) */
143
    result = do_something (result*2);   /* count(1) */
144
  if (i > 10)                           /* count(5) */
145
    if (j > 10)                         /* count(1) */
146
      result = do_something (result*4); /* count(1) */
147
  return result;                        /* count(5) */
148
}
149
 
150
int
151
test_ifelse2 (int i)
152
{
153
  int result = 0;
154
  if (!i)                               /* count(6) */
155
    result = do_something (1);          /* count(1) */
156
  if (i == 1)                           /* count(6) */
157
    result = do_something (1024);
158
  if (i == 2)                           /* count(6) */
159
    result = do_something (2);          /* count(3) */
160
  if (i == 3)                           /* count(6) */
161
    return do_something (8);            /* count(2) */
162
  if (i == 4)                           /* count(4) */
163
    return do_something (2048);
164
  return result;                        /* count(4) */
165
}
166
 
167
int
168
test_ifelse3 (int i, int j)
169
{
170
  int result = 1;
171
  if (i > 10 && j > i && j < 20)        /* count(11) */
172
    result = do_something (16);         /* count(1) */
173
  if (i > 20)                           /* count(11) */
174
    if (j > i)                          /* count(5) */
175
      if (j < 30)                       /* count(2) */
176
        result = do_something (32);     /* count(1) */
177
  if (i == 3 || j == 47 || i == j)      /* count(11) */
178
    result = do_something (64);         /* count(3) */
179
  return result;                        /* count(11) */
180
}
181
 
182
void
183
call_ifelse ()
184
{
185
  ifelse_val1 += test_ifelse1 (0, 2);
186
  ifelse_val1 += test_ifelse1 (0, 0);
187
  ifelse_val1 += test_ifelse1 (1, 2);
188
  ifelse_val1 += test_ifelse1 (10, 2);
189
  ifelse_val1 += test_ifelse1 (11, 11);
190
 
191
  ifelse_val2 += test_ifelse2 (0);
192
  ifelse_val2 += test_ifelse2 (2);
193
  ifelse_val2 += test_ifelse2 (2);
194
  ifelse_val2 += test_ifelse2 (2);
195
  ifelse_val2 += test_ifelse2 (3);
196
  ifelse_val2 += test_ifelse2 (3);
197
 
198
  ifelse_val3 += test_ifelse3 (11, 19);
199
  ifelse_val3 += test_ifelse3 (25, 27);
200
  ifelse_val3 += test_ifelse3 (11, 22);
201
  ifelse_val3 += test_ifelse3 (11, 10);
202
  ifelse_val3 += test_ifelse3 (21, 32);
203
  ifelse_val3 += test_ifelse3 (21, 20);
204
  ifelse_val3 += test_ifelse3 (1, 2);
205
  ifelse_val3 += test_ifelse3 (32, 31);
206
  ifelse_val3 += test_ifelse3 (3, 0);
207
  ifelse_val3 += test_ifelse3 (0, 47);
208
  ifelse_val3 += test_ifelse3 (65, 65);
209
}
210
 
211
/* Check switch statements. */
212
 
213
int switch_val, switch_m;
214
 
215
int
216
test_switch (int i, int j)
217
{
218
  int result = 0;                        /* count(5) */
219
 
220
  switch (i)                            /* count(5) */
221
    {
222
      case 1:
223
        result = do_something (2);      /* count(1) */
224
        break;
225
      case 2:
226
        result = do_something (1024);
227
        break;
228
      case 3:
229
      case 4:
230
        if (j == 2)                     /* count(3) */
231
          return do_something (4);      /* count(1) */
232
        result = do_something (8);      /* count(2) */
233
        break;
234
      default:
235
        result = do_something (32);     /* count(1) */
236
        switch_m++;                     /* count(1) */
237
        break;
238
    }
239
  return result;                        /* count(4) */
240
}
241
 
242
void
243
call_switch ()
244
{
245
  switch_val += test_switch (1, 0);
246
  switch_val += test_switch (3, 0);
247
  switch_val += test_switch (3, 2);
248
  switch_val += test_switch (4, 0);
249
  switch_val += test_switch (16, 0);
250
  switch_val += switch_m;
251
}
252
 
253
int
254
main()
255
{
256
  call_for ();
257
  call_goto ();
258
  call_ifelse ();
259
  call_switch ();
260
  call_unref ();
261
  if ((for_val1 != 12)
262
      || (for_val2 != 87)
263
      || (goto_val != 15)
264
      || (ifelse_val1 != 31)
265
      || (ifelse_val2 != 23)
266
      || (ifelse_val3 != 246)
267
      || (switch_val != 55)
268
      || (unref_val != 4))
269
    abort ();
270
  return 0;
271
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.