summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/ipa/ipa-sra-17.c
blob: 9cb6367b37478f895d9c7f62cb3f1a369b7f4a79 (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
92
93
94
95
96
97
98
99
100
101
102
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-ipa-sra -fdump-tree-optimized"  } */

#define DOIT
#define DONT


extern int extern_leaf (int);

/* ----- 1 ----- */
#ifdef DOIT
static int __attribute__((noinline))
whee_1 (int i, int j)
{
  return extern_leaf (i * j) + 1;
}

static int foo_1 (int i, int j);

static int __attribute__((noinline))
baz_1 (int i, int j)
{
  int a = 5;
  if (j)
    a = foo_1 (i, j - 1);
  return whee_1 (i, j) + a + 1;
}

static int __attribute__((noinline))
bar_1 (int i, int j)
{
  return baz_1 (i, j) + 1;
}

static int __attribute__((noinline))
foo_1 (int i, int j)
{
  return bar_1 (i, j) + 1;
}

static int __attribute__((noinline))
inter_1 (int i, int j)
{
  return foo_1 (i, j) + 1;
}
#endif

/* ----- 2 ----- */
#ifdef DONT
static int __attribute__((noinline))
whee_2 (int i, int j)
{
  return extern_leaf (i * j) + 2;
}

static int foo_2 (int i, int j);

static int __attribute__((noinline))
baz_2 (int i, int j)
{
  int a = 6;
  if (j)
    a = foo_2 (i, j - 1);
  return whee_2 (i, j) + a + 2;
}

static int __attribute__((noinline))
bar_2 (int i, int j)
{
  return baz_2 (i, j) + 2;
}

static int __attribute__((noinline))
foo_2 (int i, int j)
{
  return bar_2 (i, j) + 2;
}
#endif

/* ----- entries ----- */
#ifdef DOIT
int
entry_1 (int i, int j)
{
  inter_1 (i, j);
  return i + j + 1;
}
#endif

#ifdef DONT
int
entry_2 (int i, int j)
{
#ifdef DOIT
  inter_1 (i, j);
#endif
  return i + j + bar_2 (i, j);
}
#endif

/* { dg-final { scan-ipa-dump-times "Will remove return value" 5 "sra" } } */
/* { dg-final { scan-tree-dump-times "return;" 5 "optimized"} } */