]>
Commit | Line | Data |
---|---|---|
0352604e MT |
1 | 2007-11-06 Jakub Jelinek <jakub@redhat.com> |
2 | ||
3 | PR tree-optimization/33763 | |
4 | * gcc.dg/pr33763.c: New test. | |
5 | * g++.dg/opt/inline13.C: New test. | |
6 | ||
7 | 2007-11-06 Jan Hubicka <jh@suse.cz> | |
8 | ||
9 | PR tree-optimization/33763 | |
10 | * tree-inline.c (expand_call_inline): Silently ignore always_inline | |
11 | attribute for redefined extern inline functions. | |
12 | ||
3c926509 MT |
13 | --- gcc/tree-inline.c.jj 2007-11-06 09:29:04.000000000 +0100 |
14 | +++ gcc/tree-inline.c 2007-11-06 16:19:12.000000000 +0100 | |
0352604e MT |
15 | @@ -3157,6 +3157,12 @@ expand_call_inline (basic_block bb, gimp |
16 | goto egress; | |
17 | ||
18 | if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) | |
19 | + /* For extern inline functions that get redefined we always | |
20 | + silently ignored alway_inline flag. Better behaviour would | |
21 | + be to be able to keep both bodies and use extern inline body | |
22 | + for inlining, but we can't do that because frontends overwrite | |
23 | + the body. */ | |
24 | + && !cg_edge->callee->local.redefined_extern_inline | |
25 | /* Avoid warnings during early inline pass. */ | |
26 | && cgraph_global_info_ready) | |
27 | { | |
3c926509 MT |
28 | --- gcc/testsuite/gcc.dg/pr33763.c.jj 2007-11-06 16:19:12.000000000 +0100 |
29 | +++ gcc/testsuite/gcc.dg/pr33763.c 2007-11-06 16:19:12.000000000 +0100 | |
0352604e MT |
30 | @@ -0,0 +1,60 @@ |
31 | +/* PR tree-optimization/33763 */ | |
32 | +/* { dg-do compile } */ | |
33 | +/* { dg-options "-O2" } */ | |
34 | + | |
35 | +typedef struct | |
36 | +{ | |
37 | + void *a; | |
38 | + void *b; | |
39 | +} T; | |
40 | +extern void *foo (const char *, const char *); | |
41 | +extern void *bar (void *, const char *, T); | |
42 | +extern int baz (const char *, int); | |
43 | + | |
44 | +extern inline __attribute__ ((always_inline, gnu_inline)) int | |
45 | +baz (const char *x, int y) | |
46 | +{ | |
47 | + return 2; | |
48 | +} | |
49 | + | |
50 | +int | |
51 | +baz (const char *x, int y) | |
52 | +{ | |
53 | + return 1; | |
54 | +} | |
55 | + | |
56 | +int xa, xb; | |
57 | + | |
58 | +static void * | |
59 | +inl (const char *x, const char *y) | |
60 | +{ | |
61 | + T t = { &xa, &xb }; | |
62 | + int *f = (int *) __builtin_malloc (sizeof (int)); | |
63 | + const char *z; | |
64 | + int o = 0; | |
65 | + void *r = 0; | |
66 | + | |
67 | + for (z = y; *z; z++) | |
68 | + { | |
69 | + if (*z == 'r') | |
70 | + o |= 1; | |
71 | + if (*z == 'w') | |
72 | + o |= 2; | |
73 | + } | |
74 | + if (o == 1) | |
75 | + *f = baz (x, 0); | |
76 | + if (o == 2) | |
77 | + *f = baz (x, 1); | |
78 | + if (o == 3) | |
79 | + *f = baz (x, 2); | |
80 | + | |
81 | + if (o && *f > 0) | |
82 | + r = bar (f, "w", t); | |
83 | + return r; | |
84 | +} | |
85 | + | |
86 | +void * | |
87 | +foo (const char *x, const char *y) | |
88 | +{ | |
89 | + return inl (x, y); | |
90 | +} | |
3c926509 MT |
91 | --- gcc/testsuite/g++.dg/opt/inline13.C.jj 2007-11-06 16:20:20.000000000 +0100 |
92 | +++ gcc/testsuite/g++.dg/opt/inline13.C 2007-11-06 16:21:30.000000000 +0100 | |
0352604e MT |
93 | @@ -0,0 +1,60 @@ |
94 | +// PR tree-optimization/33763 | |
95 | +// { dg-do compile } | |
96 | +// { dg-options "-O2" } | |
97 | + | |
98 | +typedef struct | |
99 | +{ | |
100 | + void *a; | |
101 | + void *b; | |
102 | +} T; | |
103 | +extern void *foo (const char *, const char *); | |
104 | +extern void *bar (void *, const char *, T); | |
105 | +extern int baz (const char *, int); | |
106 | + | |
107 | +extern inline __attribute__ ((always_inline, gnu_inline)) int | |
108 | +baz (const char *x, int y) | |
109 | +{ | |
110 | + return 2; | |
111 | +} | |
112 | + | |
113 | +int | |
114 | +baz (const char *x, int y) | |
115 | +{ | |
116 | + return 1; | |
117 | +} | |
118 | + | |
119 | +int xa, xb; | |
120 | + | |
121 | +static void * | |
122 | +inl (const char *x, const char *y) | |
123 | +{ | |
124 | + T t = { &xa, &xb }; | |
125 | + int *f = (int *) __builtin_malloc (sizeof (int)); | |
126 | + const char *z; | |
127 | + int o = 0; | |
128 | + void *r = 0; | |
129 | + | |
130 | + for (z = y; *z; z++) | |
131 | + { | |
132 | + if (*z == 'r') | |
133 | + o |= 1; | |
134 | + if (*z == 'w') | |
135 | + o |= 2; | |
136 | + } | |
137 | + if (o == 1) | |
138 | + *f = baz (x, 0); | |
139 | + if (o == 2) | |
140 | + *f = baz (x, 1); | |
141 | + if (o == 3) | |
142 | + *f = baz (x, 2); | |
143 | + | |
144 | + if (o && *f > 0) | |
145 | + r = bar (f, "w", t); | |
146 | + return r; | |
147 | +} | |
148 | + | |
149 | +void * | |
150 | +foo (const char *x, const char *y) | |
151 | +{ | |
152 | + return inl (x, y); | |
153 | +} |