aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr63581.C
blob: c8caf0765841803e92c7bdee6dcc23ea196a933e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// { dg-require-effective-target freorder }
/* { dg-options "-O2 -g -fno-peel-loops" } */

struct page {
  int i;
} global;

__attribute__((noinline)) static struct page* find_page1 (int i)
{
  if ( i< 150)
      return 0;
  global.i = i;
  return &global;
}

__attribute__((noinline)) static struct page* find_page2 (int i)
{
  global.i = i;
  return &global;
}

volatile int ii;
__attribute__((noinline)) static int zero (void)
{
  return ii;
}

static inline int uptodate (struct page* p)
{
  return (p->i < 709);
}

static struct page* bar(int i)
{
  struct page *page;

repeat:
  page = find_page1 (i);
  if (!page) {
    page = find_page2 (i);
    if (!page)
      return 0;
    if (zero () ) {
      zero ();
      goto repeat;
    }
  }
  return page;
}

__attribute__((noinline)) int foo (int n)
{
  struct page *page;

retry:
  page = bar (n);
  if (page == 0)
    return 0;
  if (uptodate (page))
    goto out;

   zero ();
   if (page->i < 0) {
     zero ();
     goto retry;
   }
out:
   return 1;
}

__attribute__((noinline)) int hot (void)
{
  int i;
  int sum = 0;

  for (i = 0; i < 433038; i++)
    sum+=i;

  return sum;
}

int main(void)
{
  int i;

  global.i = hot ();
  for (i = 0; i < 858; i++)
    foo (i);

  return 0;
}