summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/ipa/pr91088.c
blob: cc146a88134e335de4b3d9fe3ac5c466a104f961 (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-ipa-cp-details -fno-inline" } */

int foo();

#define large_code \
do { \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
  foo (); \
} while (1)


struct A
{
  char  f1;
  short f2 : 5;
  int   f3;
};

int callee1 (struct A a)
{
  if ((a.f2 + 7) & 17)
    foo ();

  if ((1300 / (short)a.f3) == 19)
    large_code;

  return 1;
}

int callee2 (short *p)
{
  if ((*p ^ 1)  <  8)
    large_code;      

  return 2;
}

int callee3 (int v)
{
  if ((27 % ((1 - (v & 0xff)) * 3)) < 6)
    {
      large_code;
      return v + 2;
    }
  else
    return v + 1;
}

int caller ()
{
  struct A a;
  short b;

  a.f2 = -7;
  a.f3 = 68;
  if (callee1 (a))
    foo ();

  a.f2 = 3;
  a.f3 = 10;
  if (callee1 (a))
    foo ();

  b = 9;
  if (callee2 (&b))
    foo ();

  b = 2;
  if (callee2 (&b))
    foo ();

  return callee3 (-5) +
	 callee3 (0); 
}

/* { dg-final { scan-ipa-dump-times "Creating a specialized node of callee1" 1 "cp" } } */
/* { dg-final { scan-ipa-dump-times "Creating a specialized node of callee2" 1 "cp" } } */
/* { dg-final { scan-ipa-dump-times "Creating a specialized node of callee3" 1 "cp" } } */
/* { dg-final { scan-ipa-dump "op0\\\[offset: 32],\\(\\(short int\\) #\\),\\(\\(int\\) #\\),\\(1300 / #\\) == 19" "cp" } } */
/* { dg-final { scan-ipa-dump "op0\\\[ref offset: 0],\\(# \\^ 1\\) <" "cp" } } */
/* { dg-final { scan-ipa-dump "op0,\\(# & 255\\),\\(1 - #\\),\\(# \\* 3\\),\\(27 % #\\) <" "cp" } } */