annotate gcc/ipa-reference.c @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Callgraph based analysis of static variables.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2004-2018 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 /* This file gathers information about how variables whose scope is
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
22 confined to the compilation unit are used.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
24 The transitive call site specific clobber effects are computed
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 for the variables whose scope is contained within this compilation
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 unit.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 First each function and static variable initialization is analyzed
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 to determine which local static variables are either read, written,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 or have their address taken. Any local static that has its address
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 taken is removed from consideration. Once the local read and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 writes are determined, a transitive closure of this information is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 performed over the call graph to determine the worst case set of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 side effects of each call. In later parts of the compiler, these
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 local and global sets are examined to make the call clobbering less
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 traumatic, promote some statics to registers, and improve aliasing
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
37 information. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 #include "coretypes.h"
111
kono
parents: 67
diff changeset
42 #include "backend.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 #include "tree.h"
111
kono
parents: 67
diff changeset
44 #include "gimple.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 #include "tree-pass.h"
111
kono
parents: 67
diff changeset
46 #include "cgraph.h"
kono
parents: 67
diff changeset
47 #include "data-streamer.h"
kono
parents: 67
diff changeset
48 #include "calls.h"
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
49 #include "splay-tree.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 #include "ipa-utils.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 #include "ipa-reference.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
52 #include "symbol-summary.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 /* The static variables defined within the compilation unit that are
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
55 loaded or stored directly by function that owns this structure. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
57 struct ipa_reference_local_vars_info_d
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 bitmap statics_read;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 bitmap statics_written;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 /* Statics that are read and written by some set of functions. The
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 local ones are based on the loads and stores local to the function.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 The global ones are based on the local info as well as the
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
66 transitive closure of the functions that are called. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 struct ipa_reference_global_vars_info_d
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 bitmap statics_read;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 bitmap statics_written;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
72 };
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
73
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
74 /* Information we save about every function after ipa-reference is completed. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
75
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
76 struct ipa_reference_optimization_summary_d
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
77 {
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 bitmap statics_not_read;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 bitmap statics_not_written;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 typedef ipa_reference_local_vars_info_d *ipa_reference_local_vars_info_t;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 typedef ipa_reference_global_vars_info_d *ipa_reference_global_vars_info_t;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 typedef ipa_reference_optimization_summary_d *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 ipa_reference_optimization_summary_t;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
86
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
87 struct ipa_reference_vars_info_d
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
89 struct ipa_reference_local_vars_info_d local;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
90 struct ipa_reference_global_vars_info_d global;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 typedef struct ipa_reference_vars_info_d *ipa_reference_vars_info_t;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 /* This splay tree contains all of the static variables that are
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
96 being considered by the compilation level alias analysis. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
97 static splay_tree reference_vars_to_consider;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
111
kono
parents: 67
diff changeset
99 /* Set of all interesting module statics. A bit is set for every module
kono
parents: 67
diff changeset
100 static we are considering. This is added to the local info when asm
kono
parents: 67
diff changeset
101 code is found that clobbers all memory. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 static bitmap all_module_statics;
111
kono
parents: 67
diff changeset
103 /* Set of all statics that should be ignored because they are touched by
kono
parents: 67
diff changeset
104 -fno-ipa-reference code. */
kono
parents: 67
diff changeset
105 static bitmap ignore_module_statics;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 /* Obstack holding bitmaps of local analysis (live from analysis to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 propagation) */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 static bitmap_obstack local_info_obstack;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 /* Obstack holding global analysis live forever. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
111 static bitmap_obstack optimization_summary_obstack;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
113 class ipa_ref_var_info_summary_t: public function_summary
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 <ipa_reference_vars_info_d *>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 ipa_ref_var_info_summary_t (symbol_table *symtab):
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118 function_summary <ipa_reference_vars_info_d *> (symtab) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 static ipa_ref_var_info_summary_t *ipa_ref_var_info_summaries = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 class ipa_ref_opt_summary_t: public function_summary
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 <ipa_reference_optimization_summary_d *>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 ipa_ref_opt_summary_t (symbol_table *symtab):
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128 function_summary <ipa_reference_optimization_summary_d *> (symtab) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129
111
kono
parents: 67
diff changeset
130
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 virtual void remove (cgraph_node *src_node,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 ipa_reference_optimization_summary_d *data);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 virtual void duplicate (cgraph_node *src_node, cgraph_node *dst_node,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 ipa_reference_optimization_summary_d *src_data,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 ipa_reference_optimization_summary_d *dst_data);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 static ipa_ref_opt_summary_t *ipa_ref_opt_sum_summaries = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 /* Return the ipa_reference_vars structure starting from the cgraph NODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 static inline ipa_reference_vars_info_t
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 get_reference_vars_info (struct cgraph_node *node)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 if (ipa_ref_var_info_summaries == NULL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 return NULL;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147 ipa_reference_vars_info_t v = ipa_ref_var_info_summaries->get (node);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 return v == NULL ? NULL : v;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
149 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
150
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
151 /* Return the ipa_reference_vars structure starting from the cgraph NODE. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
152 static inline ipa_reference_optimization_summary_t
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
153 get_reference_optimization_summary (struct cgraph_node *node)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
154 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
155 if (ipa_ref_opt_sum_summaries == NULL)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
156 return NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
158 ipa_reference_optimization_summary_t v
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
159 = ipa_ref_opt_sum_summaries->get (node);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 return v == NULL ? NULL : v;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
111
kono
parents: 67
diff changeset
164 /* Return a bitmap indexed by ipa_reference_var_uid for the static variables
kono
parents: 67
diff changeset
165 that are *not* read during the execution of the function FN. Returns
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 NULL if no data is available. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
168 bitmap
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
169 ipa_reference_get_not_read_global (struct cgraph_node *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 {
111
kono
parents: 67
diff changeset
171 if (!opt_for_fn (current_function_decl, flag_ipa_reference))
kono
parents: 67
diff changeset
172 return NULL;
kono
parents: 67
diff changeset
173
kono
parents: 67
diff changeset
174 enum availability avail;
kono
parents: 67
diff changeset
175 struct cgraph_node *fn2 = fn->function_symbol (&avail);
kono
parents: 67
diff changeset
176 ipa_reference_optimization_summary_t info =
kono
parents: 67
diff changeset
177 get_reference_optimization_summary (fn2);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
178
111
kono
parents: 67
diff changeset
179 if (info
kono
parents: 67
diff changeset
180 && (avail >= AVAIL_AVAILABLE
kono
parents: 67
diff changeset
181 || (avail == AVAIL_INTERPOSABLE
kono
parents: 67
diff changeset
182 && flags_from_decl_or_type (fn->decl) & ECF_LEAF))
kono
parents: 67
diff changeset
183 && opt_for_fn (fn2->decl, flag_ipa_reference))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
184 return info->statics_not_read;
111
kono
parents: 67
diff changeset
185 else if (avail == AVAIL_NOT_AVAILABLE
kono
parents: 67
diff changeset
186 && flags_from_decl_or_type (fn->decl) & ECF_LEAF)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
187 return all_module_statics;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
111
kono
parents: 67
diff changeset
192 /* Return a bitmap indexed by ipa_reference_var_uid for the static variables
kono
parents: 67
diff changeset
193 that are *not* written during the execution of the function FN. Note
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 that variables written may or may not be read during the function
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 call. Returns NULL if no data is available. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
197 bitmap
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
198 ipa_reference_get_not_written_global (struct cgraph_node *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 {
111
kono
parents: 67
diff changeset
200 if (!opt_for_fn (current_function_decl, flag_ipa_reference))
kono
parents: 67
diff changeset
201 return NULL;
kono
parents: 67
diff changeset
202
kono
parents: 67
diff changeset
203 enum availability avail;
kono
parents: 67
diff changeset
204 struct cgraph_node *fn2 = fn->function_symbol (&avail);
kono
parents: 67
diff changeset
205 ipa_reference_optimization_summary_t info =
kono
parents: 67
diff changeset
206 get_reference_optimization_summary (fn2);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
207
111
kono
parents: 67
diff changeset
208 if (info
kono
parents: 67
diff changeset
209 && (avail >= AVAIL_AVAILABLE
kono
parents: 67
diff changeset
210 || (avail == AVAIL_INTERPOSABLE
kono
parents: 67
diff changeset
211 && flags_from_decl_or_type (fn->decl) & ECF_LEAF))
kono
parents: 67
diff changeset
212 && opt_for_fn (fn2->decl, flag_ipa_reference))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
213 return info->statics_not_written;
111
kono
parents: 67
diff changeset
214 else if (avail == AVAIL_NOT_AVAILABLE
kono
parents: 67
diff changeset
215 && flags_from_decl_or_type (fn->decl) & ECF_LEAF)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
216 return all_module_statics;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
111
kono
parents: 67
diff changeset
222 /* Hepler for is_proper_for_analysis. */
kono
parents: 67
diff changeset
223 static bool
kono
parents: 67
diff changeset
224 is_improper (symtab_node *n, void *v ATTRIBUTE_UNUSED)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 {
111
kono
parents: 67
diff changeset
226 tree t = n->decl;
kono
parents: 67
diff changeset
227 /* If the variable has the "used" attribute, treat it as if it had a
kono
parents: 67
diff changeset
228 been touched by the devil. */
kono
parents: 67
diff changeset
229 if (DECL_PRESERVE_P (t))
kono
parents: 67
diff changeset
230 return true;
kono
parents: 67
diff changeset
231
kono
parents: 67
diff changeset
232 /* Do not want to do anything with volatile except mark any
kono
parents: 67
diff changeset
233 function that uses one to be not const or pure. */
kono
parents: 67
diff changeset
234 if (TREE_THIS_VOLATILE (t))
kono
parents: 67
diff changeset
235 return true;
kono
parents: 67
diff changeset
236
kono
parents: 67
diff changeset
237 /* We do not need to analyze readonly vars, we already know they do not
kono
parents: 67
diff changeset
238 alias. */
kono
parents: 67
diff changeset
239 if (TREE_READONLY (t))
kono
parents: 67
diff changeset
240 return true;
kono
parents: 67
diff changeset
241
kono
parents: 67
diff changeset
242 /* We can not track variables with address taken. */
kono
parents: 67
diff changeset
243 if (TREE_ADDRESSABLE (t))
kono
parents: 67
diff changeset
244 return true;
kono
parents: 67
diff changeset
245
kono
parents: 67
diff changeset
246 /* TODO: We could track public variables that are not addressable, but
kono
parents: 67
diff changeset
247 currently frontends don't give us those. */
kono
parents: 67
diff changeset
248 if (TREE_PUBLIC (t))
kono
parents: 67
diff changeset
249 return true;
kono
parents: 67
diff changeset
250
kono
parents: 67
diff changeset
251 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 /* Return true if the variable T is the right kind of static variable to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 perform compilation unit scope escape analysis. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
257 static inline bool
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
258 is_proper_for_analysis (tree t)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 {
111
kono
parents: 67
diff changeset
260 if (bitmap_bit_p (ignore_module_statics, ipa_reference_var_uid (t)))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262
111
kono
parents: 67
diff changeset
263 if (symtab_node::get (t)
kono
parents: 67
diff changeset
264 ->call_for_symbol_and_aliases (is_improper, NULL, true))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
265 return false;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
266
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 /* Lookup the tree node for the static variable that has UID and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 convert the name to a string for debugging. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 static const char *
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 get_static_name (int index)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
276 splay_tree_node stn =
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 splay_tree_lookup (reference_vars_to_consider, index);
111
kono
parents: 67
diff changeset
278 return fndecl_name ((tree)(stn->value));
kono
parents: 67
diff changeset
279 }
kono
parents: 67
diff changeset
280
kono
parents: 67
diff changeset
281 /* Dump a set of static vars to FILE. */
kono
parents: 67
diff changeset
282 static void
kono
parents: 67
diff changeset
283 dump_static_vars_set_to_file (FILE *f, bitmap set)
kono
parents: 67
diff changeset
284 {
kono
parents: 67
diff changeset
285 unsigned int index;
kono
parents: 67
diff changeset
286 bitmap_iterator bi;
kono
parents: 67
diff changeset
287 if (set == NULL)
kono
parents: 67
diff changeset
288 return;
kono
parents: 67
diff changeset
289 else if (set == all_module_statics)
kono
parents: 67
diff changeset
290 fprintf (f, "ALL");
kono
parents: 67
diff changeset
291 else
kono
parents: 67
diff changeset
292 EXECUTE_IF_SET_IN_BITMAP (set, 0, index, bi)
kono
parents: 67
diff changeset
293 {
kono
parents: 67
diff changeset
294 fprintf (f, "%s ", get_static_name (index));
kono
parents: 67
diff changeset
295 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
297
111
kono
parents: 67
diff changeset
298 /* Compute X |= Y, taking into account the possibility that
kono
parents: 67
diff changeset
299 either X or Y is already the maximum set.
kono
parents: 67
diff changeset
300 Return true if X is the maximum set after taking the union with Y. */
kono
parents: 67
diff changeset
301
kono
parents: 67
diff changeset
302 static bool
kono
parents: 67
diff changeset
303 union_static_var_sets (bitmap &x, bitmap y)
kono
parents: 67
diff changeset
304 {
kono
parents: 67
diff changeset
305 if (x != all_module_statics)
kono
parents: 67
diff changeset
306 {
kono
parents: 67
diff changeset
307 if (y == all_module_statics)
kono
parents: 67
diff changeset
308 {
kono
parents: 67
diff changeset
309 BITMAP_FREE (x);
kono
parents: 67
diff changeset
310 x = all_module_statics;
kono
parents: 67
diff changeset
311 }
kono
parents: 67
diff changeset
312 else if (bitmap_ior_into (x, y))
kono
parents: 67
diff changeset
313 {
kono
parents: 67
diff changeset
314 /* The union may have reduced X to the maximum set.
kono
parents: 67
diff changeset
315 In that case, we want to make that visible explicitly.
kono
parents: 67
diff changeset
316 Even though bitmap_equal_p can be very expensive, it
kono
parents: 67
diff changeset
317 turns out to be an overall win to check this here for
kono
parents: 67
diff changeset
318 an LTO bootstrap of GCC itself. Liberally extrapoliate
kono
parents: 67
diff changeset
319 that result to be applicable to all cases. */
kono
parents: 67
diff changeset
320 if (bitmap_equal_p (x, all_module_statics))
kono
parents: 67
diff changeset
321 {
kono
parents: 67
diff changeset
322 BITMAP_FREE (x);
kono
parents: 67
diff changeset
323 x = all_module_statics;
kono
parents: 67
diff changeset
324 }
kono
parents: 67
diff changeset
325 }
kono
parents: 67
diff changeset
326 }
kono
parents: 67
diff changeset
327 return x == all_module_statics;
kono
parents: 67
diff changeset
328 }
kono
parents: 67
diff changeset
329
kono
parents: 67
diff changeset
330 /* Return a copy of SET on the bitmap obstack containing SET.
kono
parents: 67
diff changeset
331 But if SET is NULL or the maximum set, return that instead. */
kono
parents: 67
diff changeset
332
kono
parents: 67
diff changeset
333 static bitmap
kono
parents: 67
diff changeset
334 copy_static_var_set (bitmap set)
kono
parents: 67
diff changeset
335 {
kono
parents: 67
diff changeset
336 if (set == NULL || set == all_module_statics)
kono
parents: 67
diff changeset
337 return set;
kono
parents: 67
diff changeset
338 bitmap_obstack *o = set->obstack;
kono
parents: 67
diff changeset
339 gcc_checking_assert (o);
kono
parents: 67
diff changeset
340 bitmap copy = BITMAP_ALLOC (o);
kono
parents: 67
diff changeset
341 bitmap_copy (copy, set);
kono
parents: 67
diff changeset
342 return copy;
kono
parents: 67
diff changeset
343 }
kono
parents: 67
diff changeset
344
kono
parents: 67
diff changeset
345 /* Compute the union all of the statics read and written by every callee of X
kono
parents: 67
diff changeset
346 into X_GLOBAL->statics_read and X_GLOBAL->statics_written. X_GLOBAL is
kono
parents: 67
diff changeset
347 actually the set representing the cycle containing X. If the read and
kono
parents: 67
diff changeset
348 written sets of X_GLOBAL has been reduced to the maximum set, we don't
kono
parents: 67
diff changeset
349 have to look at the remaining callees. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 propagate_bits (ipa_reference_global_vars_info_t x_global, struct cgraph_node *x)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 struct cgraph_edge *e;
111
kono
parents: 67
diff changeset
355 bool read_all = x_global->statics_read == all_module_statics;
kono
parents: 67
diff changeset
356 bool write_all = x_global->statics_written == all_module_statics;
kono
parents: 67
diff changeset
357 for (e = x->callees;
kono
parents: 67
diff changeset
358 e && !(read_all && write_all);
kono
parents: 67
diff changeset
359 e = e->next_callee)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
361 enum availability avail;
111
kono
parents: 67
diff changeset
362 struct cgraph_node *y = e->callee->function_symbol (&avail);
kono
parents: 67
diff changeset
363 if (!y)
kono
parents: 67
diff changeset
364 continue;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
365
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
366 /* Only look into nodes we can propagate something. */
111
kono
parents: 67
diff changeset
367 int flags = flags_from_decl_or_type (y->decl);
kono
parents: 67
diff changeset
368 if (opt_for_fn (y->decl, flag_ipa_reference)
kono
parents: 67
diff changeset
369 && (avail > AVAIL_INTERPOSABLE
kono
parents: 67
diff changeset
370 || (avail == AVAIL_INTERPOSABLE && (flags & ECF_LEAF))))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 if (get_reference_vars_info (y))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 {
111
kono
parents: 67
diff changeset
374 ipa_reference_vars_info_t y_info = get_reference_vars_info (y);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
375 ipa_reference_global_vars_info_t y_global = &y_info->global;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376
111
kono
parents: 67
diff changeset
377 /* Calls in the current cycle do not have their global set
kono
parents: 67
diff changeset
378 computed yet (but everything else does because we're
kono
parents: 67
diff changeset
379 visiting nodes in topological order). */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
380 if (!y_global->statics_read)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 continue;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
382
111
kono
parents: 67
diff changeset
383 /* If the function is const, it reads no memory even if it
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
384 seems so to local analysis. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
385 if (flags & ECF_CONST)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
386 continue;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
387
111
kono
parents: 67
diff changeset
388 union_static_var_sets (x_global->statics_read,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 y_global->statics_read);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
390
111
kono
parents: 67
diff changeset
391 /* If the function is pure, it has no stores even if it
kono
parents: 67
diff changeset
392 seems so to local analysis. If we cannot return from
kono
parents: 67
diff changeset
393 the function, we can safely ignore the call. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
394 if ((flags & ECF_PURE)
111
kono
parents: 67
diff changeset
395 || e->cannot_lead_to_return_p ())
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
396 continue;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
397
111
kono
parents: 67
diff changeset
398 union_static_var_sets (x_global->statics_written,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 y_global->statics_written);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
401 else
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 gcc_unreachable ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
406
111
kono
parents: 67
diff changeset
407 static bool ipa_init_p = false;
kono
parents: 67
diff changeset
408
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 /* The init routine for analyzing global static variable usage. See
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 comments at top for description. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
411 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
412 ipa_init (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 {
111
kono
parents: 67
diff changeset
414 if (ipa_init_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
415 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
416
111
kono
parents: 67
diff changeset
417 ipa_init_p = true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
418
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
419 if (dump_file)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
420 reference_vars_to_consider = splay_tree_new (splay_tree_compare_ints, 0, 0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
421
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 bitmap_obstack_initialize (&local_info_obstack);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
423 bitmap_obstack_initialize (&optimization_summary_obstack);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
424 all_module_statics = BITMAP_ALLOC (&optimization_summary_obstack);
111
kono
parents: 67
diff changeset
425 ignore_module_statics = BITMAP_ALLOC (&optimization_summary_obstack);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
426
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 if (ipa_ref_var_info_summaries == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
428 ipa_ref_var_info_summaries = new ipa_ref_var_info_summary_t (symtab);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
429
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 if (ipa_ref_opt_sum_summaries != NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
431 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
432 delete ipa_ref_opt_sum_summaries;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
433 ipa_ref_opt_sum_summaries = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
434 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
436
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
437
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 /* Set up the persistent info for FN. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
439
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 static ipa_reference_local_vars_info_t
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 init_function_info (struct cgraph_node *fn)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
443 ipa_reference_vars_info_t info
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
444 = ipa_ref_var_info_summaries->get_create (fn);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
445
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
446 info->local.statics_read = BITMAP_ALLOC (&local_info_obstack);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
447 info->local.statics_written = BITMAP_ALLOC (&local_info_obstack);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
449 return &info->local;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
451
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
452
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 /* This is the main routine for finding the reference patterns for
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 global variables within a function FN. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
455
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 analyze_function (struct cgraph_node *fn)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
459 ipa_reference_local_vars_info_t local;
111
kono
parents: 67
diff changeset
460 struct ipa_ref *ref = NULL;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
461 int i;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
462 tree var;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
463
111
kono
parents: 67
diff changeset
464 if (!opt_for_fn (fn->decl, flag_ipa_reference))
kono
parents: 67
diff changeset
465 return;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
466 local = init_function_info (fn);
111
kono
parents: 67
diff changeset
467 for (i = 0; fn->iterate_reference (i, ref); i++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 {
111
kono
parents: 67
diff changeset
469 if (!is_a <varpool_node *> (ref->referred))
kono
parents: 67
diff changeset
470 continue;
kono
parents: 67
diff changeset
471 var = ref->referred->decl;
kono
parents: 67
diff changeset
472 if (!is_proper_for_analysis (var))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
473 continue;
111
kono
parents: 67
diff changeset
474 /* This is a variable we care about. Check if we have seen it
kono
parents: 67
diff changeset
475 before, and if not add it the set of variables we care about. */
kono
parents: 67
diff changeset
476 if (all_module_statics
kono
parents: 67
diff changeset
477 && bitmap_set_bit (all_module_statics, ipa_reference_var_uid (var)))
kono
parents: 67
diff changeset
478 {
kono
parents: 67
diff changeset
479 if (dump_file)
kono
parents: 67
diff changeset
480 splay_tree_insert (reference_vars_to_consider,
kono
parents: 67
diff changeset
481 ipa_reference_var_uid (var),
kono
parents: 67
diff changeset
482 (splay_tree_value)var);
kono
parents: 67
diff changeset
483 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
484 switch (ref->use)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
486 case IPA_REF_LOAD:
111
kono
parents: 67
diff changeset
487 bitmap_set_bit (local->statics_read, ipa_reference_var_uid (var));
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
488 break;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
489 case IPA_REF_STORE:
111
kono
parents: 67
diff changeset
490 if (ref->cannot_lead_to_return ())
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
491 break;
111
kono
parents: 67
diff changeset
492 bitmap_set_bit (local->statics_written, ipa_reference_var_uid (var));
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
493 break;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
494 case IPA_REF_ADDR:
111
kono
parents: 67
diff changeset
495 break;
kono
parents: 67
diff changeset
496 default:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
497 gcc_unreachable ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
499 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
500
111
kono
parents: 67
diff changeset
501 if (fn->cannot_return_p ())
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
502 bitmap_clear (local->statics_written);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
505
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 /* Called when new clone is inserted to callgraph late. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
508 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
509 ipa_ref_opt_summary_t::duplicate (cgraph_node *, cgraph_node *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
510 ipa_reference_optimization_summary_d *ginfo,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
511 ipa_reference_optimization_summary_d
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
512 *dst_ginfo)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
513 {
111
kono
parents: 67
diff changeset
514 dst_ginfo->statics_not_read =
kono
parents: 67
diff changeset
515 copy_static_var_set (ginfo->statics_not_read);
kono
parents: 67
diff changeset
516 dst_ginfo->statics_not_written =
kono
parents: 67
diff changeset
517 copy_static_var_set (ginfo->statics_not_written);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
518 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
519
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 /* Called when node is removed. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
521
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
522 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
523 ipa_ref_opt_summary_t::remove (cgraph_node *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
524 ipa_reference_optimization_summary_d *ginfo)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
526 if (ginfo->statics_not_read
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
527 && ginfo->statics_not_read != all_module_statics)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
528 BITMAP_FREE (ginfo->statics_not_read);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
529
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
530 if (ginfo->statics_not_written
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
531 && ginfo->statics_not_written != all_module_statics)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
532 BITMAP_FREE (ginfo->statics_not_written);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
534
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
535 /* Analyze each function in the cgraph to see which global or statics
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
536 are read or written. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
537
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
538 static void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
539 generate_summary (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
540 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 struct cgraph_node *node;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 unsigned int index;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 bitmap_iterator bi;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
544
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 ipa_init ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
546
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
547 /* Process all of the functions next. */
111
kono
parents: 67
diff changeset
548 FOR_EACH_DEFINED_FUNCTION (node)
kono
parents: 67
diff changeset
549 if (!node->alias && !opt_for_fn (node->decl, flag_ipa_reference))
kono
parents: 67
diff changeset
550 {
kono
parents: 67
diff changeset
551 struct ipa_ref *ref = NULL;
kono
parents: 67
diff changeset
552 int i;
kono
parents: 67
diff changeset
553 tree var;
kono
parents: 67
diff changeset
554 for (i = 0; node->iterate_reference (i, ref); i++)
kono
parents: 67
diff changeset
555 {
kono
parents: 67
diff changeset
556 if (!is_a <varpool_node *> (ref->referred))
kono
parents: 67
diff changeset
557 continue;
kono
parents: 67
diff changeset
558 var = ref->referred->decl;
kono
parents: 67
diff changeset
559 if (!is_proper_for_analysis (var))
kono
parents: 67
diff changeset
560 continue;
kono
parents: 67
diff changeset
561 bitmap_set_bit (ignore_module_statics, ipa_reference_var_uid (var));
kono
parents: 67
diff changeset
562 }
kono
parents: 67
diff changeset
563 }
kono
parents: 67
diff changeset
564 FOR_EACH_DEFINED_FUNCTION (node)
kono
parents: 67
diff changeset
565 analyze_function (node);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
566
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 if (dump_file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 EXECUTE_IF_SET_IN_BITMAP (all_module_statics, 0, index, bi)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 {
111
kono
parents: 67
diff changeset
570 fprintf (dump_file, "\nPromotable global:%s (uid=%u)\n",
kono
parents: 67
diff changeset
571 get_static_name (index), index);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
573
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
574 if (dump_file)
111
kono
parents: 67
diff changeset
575 FOR_EACH_DEFINED_FUNCTION (node)
kono
parents: 67
diff changeset
576 if (node->get_availability () >= AVAIL_INTERPOSABLE
kono
parents: 67
diff changeset
577 && opt_for_fn (node->decl, flag_ipa_reference))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
578 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 ipa_reference_local_vars_info_t l;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 unsigned int index;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 bitmap_iterator bi;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
582
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
583 l = &get_reference_vars_info (node)->local;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
584 fprintf (dump_file,
111
kono
parents: 67
diff changeset
585 "\nFunction name:%s:", node->dump_name ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 fprintf (dump_file, "\n locals read: ");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
587 if (l->statics_read)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
588 EXECUTE_IF_SET_IN_BITMAP (l->statics_read,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
589 0, index, bi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
590 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
591 fprintf (dump_file, "%s ",
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
592 get_static_name (index));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
593 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594 fprintf (dump_file, "\n locals written: ");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
595 if (l->statics_written)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
596 EXECUTE_IF_SET_IN_BITMAP (l->statics_written,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
597 0, index, bi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
598 {
111
kono
parents: 67
diff changeset
599 fprintf (dump_file, "%s ", get_static_name (index));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
600 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
601 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
604 /* Set READ_ALL/WRITE_ALL based on decl flags of NODE. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
605
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
606 static void
111
kono
parents: 67
diff changeset
607 read_write_all_from_decl (struct cgraph_node *node,
kono
parents: 67
diff changeset
608 bool &read_all, bool &write_all)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
609 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
610 tree decl = node->decl;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
611 int flags = flags_from_decl_or_type (decl);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
612 if ((flags & ECF_LEAF)
111
kono
parents: 67
diff changeset
613 && node->get_availability () < AVAIL_INTERPOSABLE)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
614 ;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
615 else if (flags & ECF_CONST)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
616 ;
111
kono
parents: 67
diff changeset
617 else if ((flags & ECF_PURE) || node->cannot_return_p ())
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
618 {
111
kono
parents: 67
diff changeset
619 read_all = true;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
620 if (dump_file && (dump_flags & TDF_DETAILS))
111
kono
parents: 67
diff changeset
621 fprintf (dump_file, " %s -> read all\n", node->dump_name ());
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
622 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
623 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
624 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
625 /* TODO: To be able to produce sane results, we should also handle
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
626 common builtins, in particular throw. */
111
kono
parents: 67
diff changeset
627 read_all = true;
kono
parents: 67
diff changeset
628 write_all = true;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
629 if (dump_file && (dump_flags & TDF_DETAILS))
111
kono
parents: 67
diff changeset
630 fprintf (dump_file, " %s -> read all, write all\n",
kono
parents: 67
diff changeset
631 node->dump_name ());
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
632 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
633 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
634
111
kono
parents: 67
diff changeset
635 /* Set READ_ALL/WRITE_ALL based on decl flags of NODE or any member
kono
parents: 67
diff changeset
636 in the cycle of NODE. */
kono
parents: 67
diff changeset
637
kono
parents: 67
diff changeset
638 static void
kono
parents: 67
diff changeset
639 get_read_write_all_from_node (struct cgraph_node *node,
kono
parents: 67
diff changeset
640 bool &read_all, bool &write_all)
kono
parents: 67
diff changeset
641 {
kono
parents: 67
diff changeset
642 struct cgraph_edge *e, *ie;
kono
parents: 67
diff changeset
643
kono
parents: 67
diff changeset
644 /* When function is overwritable, we can not assume anything. */
kono
parents: 67
diff changeset
645 if (node->get_availability () <= AVAIL_INTERPOSABLE
kono
parents: 67
diff changeset
646 || (node->analyzed && !opt_for_fn (node->decl, flag_ipa_reference)))
kono
parents: 67
diff changeset
647 read_write_all_from_decl (node, read_all, write_all);
kono
parents: 67
diff changeset
648
kono
parents: 67
diff changeset
649 for (e = node->callees;
kono
parents: 67
diff changeset
650 e && !(read_all && write_all);
kono
parents: 67
diff changeset
651 e = e->next_callee)
kono
parents: 67
diff changeset
652 {
kono
parents: 67
diff changeset
653 enum availability avail;
kono
parents: 67
diff changeset
654 struct cgraph_node *callee = e->callee->function_symbol (&avail);
kono
parents: 67
diff changeset
655 gcc_checking_assert (callee);
kono
parents: 67
diff changeset
656 if (avail <= AVAIL_INTERPOSABLE
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657 || (callee->analyzed && !opt_for_fn (callee->decl,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 flag_ipa_reference)))
111
kono
parents: 67
diff changeset
659 read_write_all_from_decl (callee, read_all, write_all);
kono
parents: 67
diff changeset
660 }
kono
parents: 67
diff changeset
661
kono
parents: 67
diff changeset
662 for (ie = node->indirect_calls;
kono
parents: 67
diff changeset
663 ie && !(read_all && write_all);
kono
parents: 67
diff changeset
664 ie = ie->next_callee)
kono
parents: 67
diff changeset
665 if (!(ie->indirect_info->ecf_flags & ECF_CONST))
kono
parents: 67
diff changeset
666 {
kono
parents: 67
diff changeset
667 read_all = true;
kono
parents: 67
diff changeset
668 if (dump_file && (dump_flags & TDF_DETAILS))
kono
parents: 67
diff changeset
669 fprintf (dump_file, " indirect call -> read all\n");
kono
parents: 67
diff changeset
670 if (!ie->cannot_lead_to_return_p ()
kono
parents: 67
diff changeset
671 && !(ie->indirect_info->ecf_flags & ECF_PURE))
kono
parents: 67
diff changeset
672 {
kono
parents: 67
diff changeset
673 if (dump_file && (dump_flags & TDF_DETAILS))
kono
parents: 67
diff changeset
674 fprintf (dump_file, " indirect call -> write all\n");
kono
parents: 67
diff changeset
675 write_all = true;
kono
parents: 67
diff changeset
676 }
kono
parents: 67
diff changeset
677 }
kono
parents: 67
diff changeset
678 }
kono
parents: 67
diff changeset
679
kono
parents: 67
diff changeset
680 /* Skip edges from and to nodes without ipa_reference enables. This leave
kono
parents: 67
diff changeset
681 them out of strongy connected coponents and makes them easyto skip in the
kono
parents: 67
diff changeset
682 propagation loop bellow. */
kono
parents: 67
diff changeset
683
kono
parents: 67
diff changeset
684 static bool
kono
parents: 67
diff changeset
685 ignore_edge_p (cgraph_edge *e)
kono
parents: 67
diff changeset
686 {
kono
parents: 67
diff changeset
687 return (!opt_for_fn (e->caller->decl, flag_ipa_reference)
kono
parents: 67
diff changeset
688 || !opt_for_fn (e->callee->function_symbol ()->decl,
kono
parents: 67
diff changeset
689 flag_ipa_reference));
kono
parents: 67
diff changeset
690 }
kono
parents: 67
diff changeset
691
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
692 /* Produce the global information by preforming a transitive closure
111
kono
parents: 67
diff changeset
693 on the local information that was produced by ipa_analyze_function. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
694
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
695 static unsigned int
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
696 propagate (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
697 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
698 struct cgraph_node *node;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
699 struct cgraph_node **order =
111
kono
parents: 67
diff changeset
700 XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
kono
parents: 67
diff changeset
701 int order_pos;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
702 int i;
111
kono
parents: 67
diff changeset
703 bool remove_p;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
704
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
705 if (dump_file)
111
kono
parents: 67
diff changeset
706 cgraph_node::dump_cgraph (dump_file);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
707
111
kono
parents: 67
diff changeset
708 remove_p = ipa_discover_readonly_nonaddressable_vars ();
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
709 generate_summary ();
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
710
111
kono
parents: 67
diff changeset
711 /* Propagate the local information through the call graph to produce
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
712 the global information. All the nodes within a cycle will have
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
713 the same info so we collapse cycles first. Then we can do the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
714 propagation in one pass from the leaves to the roots. */
111
kono
parents: 67
diff changeset
715 order_pos = ipa_reduced_postorder (order, true, true, ignore_edge_p);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
716 if (dump_file)
111
kono
parents: 67
diff changeset
717 ipa_print_order (dump_file, "reduced", order, order_pos);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
718
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
719 for (i = 0; i < order_pos; i++ )
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
720 {
111
kono
parents: 67
diff changeset
721 unsigned x;
kono
parents: 67
diff changeset
722 struct cgraph_node *w;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 ipa_reference_vars_info_t node_info;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
724 ipa_reference_global_vars_info_t node_g;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 ipa_reference_local_vars_info_t node_l;
111
kono
parents: 67
diff changeset
726 bool read_all = false;
kono
parents: 67
diff changeset
727 bool write_all = false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
728
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
729 node = order[i];
111
kono
parents: 67
diff changeset
730 if (node->alias || !opt_for_fn (node->decl, flag_ipa_reference))
kono
parents: 67
diff changeset
731 continue;
kono
parents: 67
diff changeset
732
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733 node_info = get_reference_vars_info (node);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
734 gcc_assert (node_info);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
735 node_l = &node_info->local;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
736 node_g = &node_info->global;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
737
111
kono
parents: 67
diff changeset
738 if (dump_file && (dump_flags & TDF_DETAILS))
kono
parents: 67
diff changeset
739 fprintf (dump_file, "Starting cycle with %s\n", node->dump_name ());
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
740
111
kono
parents: 67
diff changeset
741 vec<cgraph_node *> cycle_nodes = ipa_get_nodes_in_cycle (node);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
742
111
kono
parents: 67
diff changeset
743 /* If any node in a cycle is read_all or write_all, they all are. */
kono
parents: 67
diff changeset
744 FOR_EACH_VEC_ELT (cycle_nodes, x, w)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
746 if (dump_file && (dump_flags & TDF_DETAILS))
111
kono
parents: 67
diff changeset
747 fprintf (dump_file, " Visiting %s\n", w->dump_asm_name ());
kono
parents: 67
diff changeset
748 get_read_write_all_from_node (w, read_all, write_all);
kono
parents: 67
diff changeset
749 if (read_all && write_all)
kono
parents: 67
diff changeset
750 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
751 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
752
111
kono
parents: 67
diff changeset
753 /* Initialized the bitmaps global sets for the reduced node. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
754 if (read_all)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 node_g->statics_read = all_module_statics;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
756 else
111
kono
parents: 67
diff changeset
757 node_g->statics_read = copy_static_var_set (node_l->statics_read);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
758 if (write_all)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759 node_g->statics_written = all_module_statics;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
760 else
111
kono
parents: 67
diff changeset
761 node_g->statics_written = copy_static_var_set (node_l->statics_written);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762
111
kono
parents: 67
diff changeset
763 /* Merge the sets of this cycle with all sets of callees reached
kono
parents: 67
diff changeset
764 from this cycle. */
kono
parents: 67
diff changeset
765 FOR_EACH_VEC_ELT (cycle_nodes, x, w)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
766 {
111
kono
parents: 67
diff changeset
767 if (read_all && write_all)
kono
parents: 67
diff changeset
768 break;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
769
111
kono
parents: 67
diff changeset
770 if (w != node)
kono
parents: 67
diff changeset
771 {
kono
parents: 67
diff changeset
772 ipa_reference_vars_info_t w_ri = get_reference_vars_info (w);
kono
parents: 67
diff changeset
773 ipa_reference_local_vars_info_t w_l = &w_ri->local;
kono
parents: 67
diff changeset
774 int flags = flags_from_decl_or_type (w->decl);
kono
parents: 67
diff changeset
775
kono
parents: 67
diff changeset
776 if (!(flags & ECF_CONST))
kono
parents: 67
diff changeset
777 read_all = union_static_var_sets (node_g->statics_read,
kono
parents: 67
diff changeset
778 w_l->statics_read);
kono
parents: 67
diff changeset
779 if (!(flags & ECF_PURE)
kono
parents: 67
diff changeset
780 && !w->cannot_return_p ())
kono
parents: 67
diff changeset
781 write_all = union_static_var_sets (node_g->statics_written,
kono
parents: 67
diff changeset
782 w_l->statics_written);
kono
parents: 67
diff changeset
783 }
kono
parents: 67
diff changeset
784
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
785 propagate_bits (node_g, w);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
786 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
787
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
788 /* All nodes within a cycle have the same global info bitmaps. */
111
kono
parents: 67
diff changeset
789 FOR_EACH_VEC_ELT (cycle_nodes, x, w)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
790 {
111
kono
parents: 67
diff changeset
791 ipa_reference_vars_info_t w_ri = get_reference_vars_info (w);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
792 w_ri->global = *node_g;
111
kono
parents: 67
diff changeset
793 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
794
111
kono
parents: 67
diff changeset
795 cycle_nodes.release ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
796 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
797
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
798 if (dump_file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
799 {
111
kono
parents: 67
diff changeset
800 for (i = 0; i < order_pos; i++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
801 {
111
kono
parents: 67
diff changeset
802 unsigned x;
kono
parents: 67
diff changeset
803 struct cgraph_node *w;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
804
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
805 node = order[i];
111
kono
parents: 67
diff changeset
806 if (node->alias || !opt_for_fn (node->decl, flag_ipa_reference))
kono
parents: 67
diff changeset
807 continue;
kono
parents: 67
diff changeset
808
kono
parents: 67
diff changeset
809 fprintf (dump_file, "\nFunction name:%s:", node->dump_asm_name ());
kono
parents: 67
diff changeset
810
kono
parents: 67
diff changeset
811 ipa_reference_vars_info_t node_info = get_reference_vars_info (node);
kono
parents: 67
diff changeset
812 ipa_reference_global_vars_info_t node_g = &node_info->global;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
813
111
kono
parents: 67
diff changeset
814 vec<cgraph_node *> cycle_nodes = ipa_get_nodes_in_cycle (node);
kono
parents: 67
diff changeset
815 FOR_EACH_VEC_ELT (cycle_nodes, x, w)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
816 {
111
kono
parents: 67
diff changeset
817 ipa_reference_vars_info_t w_ri = get_reference_vars_info (w);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
818 ipa_reference_local_vars_info_t w_l = &w_ri->local;
111
kono
parents: 67
diff changeset
819 if (w != node)
kono
parents: 67
diff changeset
820 fprintf (dump_file, "\n next cycle: %s ", w->dump_asm_name ());
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
821 fprintf (dump_file, "\n locals read: ");
111
kono
parents: 67
diff changeset
822 dump_static_vars_set_to_file (dump_file, w_l->statics_read);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
823 fprintf (dump_file, "\n locals written: ");
111
kono
parents: 67
diff changeset
824 dump_static_vars_set_to_file (dump_file, w_l->statics_written);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
825 }
111
kono
parents: 67
diff changeset
826 cycle_nodes.release ();
kono
parents: 67
diff changeset
827
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
828 fprintf (dump_file, "\n globals read: ");
111
kono
parents: 67
diff changeset
829 dump_static_vars_set_to_file (dump_file, node_g->statics_read);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
830 fprintf (dump_file, "\n globals written: ");
111
kono
parents: 67
diff changeset
831 dump_static_vars_set_to_file (dump_file, node_g->statics_written);
kono
parents: 67
diff changeset
832 fprintf (dump_file, "\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
833 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
834 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
835
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
836 if (ipa_ref_opt_sum_summaries == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
837 ipa_ref_opt_sum_summaries = new ipa_ref_opt_summary_t (symtab);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
838
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
839 /* Cleanup. */
111
kono
parents: 67
diff changeset
840 FOR_EACH_DEFINED_FUNCTION (node)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
841 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
842 ipa_reference_vars_info_t node_info;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
843 ipa_reference_global_vars_info_t node_g;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
844
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
845 node_info = get_reference_vars_info (node);
111
kono
parents: 67
diff changeset
846 if (!node->alias && opt_for_fn (node->decl, flag_ipa_reference)
kono
parents: 67
diff changeset
847 && (node->get_availability () > AVAIL_INTERPOSABLE
kono
parents: 67
diff changeset
848 || (flags_from_decl_or_type (node->decl) & ECF_LEAF)))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
849 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
850 node_g = &node_info->global;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
852 ipa_reference_optimization_summary_d *opt
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
853 = ipa_ref_opt_sum_summaries->get_create (node);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
854
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
855 /* Create the complimentary sets. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
856
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
857 if (bitmap_empty_p (node_g->statics_read))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
858 opt->statics_not_read = all_module_statics;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
859 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
860 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
861 opt->statics_not_read
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
862 = BITMAP_ALLOC (&optimization_summary_obstack);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
863 if (node_g->statics_read != all_module_statics)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
864 bitmap_and_compl (opt->statics_not_read,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
865 all_module_statics,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
866 node_g->statics_read);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
867 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
868
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
869 if (bitmap_empty_p (node_g->statics_written))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
870 opt->statics_not_written = all_module_statics;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
871 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
872 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
873 opt->statics_not_written
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
874 = BITMAP_ALLOC (&optimization_summary_obstack);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
875 if (node_g->statics_written != all_module_statics)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
876 bitmap_and_compl (opt->statics_not_written,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
877 all_module_statics,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
878 node_g->statics_written);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
879 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
880 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
881 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
882
111
kono
parents: 67
diff changeset
883 ipa_free_postorder_info ();
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
884 free (order);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
885
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
886 bitmap_obstack_release (&local_info_obstack);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
887
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
888 if (ipa_ref_var_info_summaries == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
889 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
890 delete ipa_ref_var_info_summaries;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
891 ipa_ref_var_info_summaries = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
892 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
893
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
894 ipa_ref_var_info_summaries = NULL;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
895 if (dump_file)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
896 splay_tree_delete (reference_vars_to_consider);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
897 reference_vars_to_consider = NULL;
111
kono
parents: 67
diff changeset
898 return remove_p ? TODO_remove_functions : 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
899 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
900
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
901 /* Return true if we need to write summary of NODE. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
902
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
903 static bool
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
904 write_node_summary_p (struct cgraph_node *node,
111
kono
parents: 67
diff changeset
905 lto_symtab_encoder_t encoder,
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
906 bitmap ltrans_statics)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
907 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
908 ipa_reference_optimization_summary_t info;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
909
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
910 /* See if we have (non-empty) info. */
111
kono
parents: 67
diff changeset
911 if (!node->definition || node->global.inlined_to)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
912 return false;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
913 info = get_reference_optimization_summary (node);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
914 if (!info
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
915 || (bitmap_empty_p (info->statics_not_read)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
916 && bitmap_empty_p (info->statics_not_written)))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
917 return false;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
918
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
919 /* See if we want to encode it.
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
920 Encode also referenced functions since constant folding might turn it into
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
921 a direct call.
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
922
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
923 In future we might also want to include summaries of functions references
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
924 by initializers of constant variables references in current unit. */
111
kono
parents: 67
diff changeset
925 if (!reachable_from_this_partition_p (node, encoder)
kono
parents: 67
diff changeset
926 && !referenced_from_this_partition_p (node, encoder))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
927 return false;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
928
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
929 /* See if the info has non-empty intersections with vars we want to encode. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
930 if (!bitmap_intersect_p (info->statics_not_read, ltrans_statics)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
931 && !bitmap_intersect_p (info->statics_not_written, ltrans_statics))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
932 return false;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
933 return true;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
934 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
935
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
936 /* Stream out BITS&LTRANS_STATICS as list of decls to OB.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
937 LTRANS_STATICS_BITCOUNT specify number of bits in LTRANS_STATICS
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
938 or -1. When it is positive, just output -1 when
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
939 BITS&LTRANS_STATICS == BITS&LTRANS_STATICS. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
940
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
941 static void
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
942 stream_out_bitmap (struct lto_simple_output_block *ob,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
943 bitmap bits, bitmap ltrans_statics,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
944 int ltrans_statics_bitcount)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
945 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
946 int count = 0;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
947 unsigned int index;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
948 bitmap_iterator bi;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
949 if (bits == all_module_statics)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
950 {
111
kono
parents: 67
diff changeset
951 streamer_write_hwi_stream (ob->main_stream, -1);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
952 return;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
953 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
954 EXECUTE_IF_AND_IN_BITMAP (bits, ltrans_statics, 0, index, bi)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
955 count ++;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
956 if (count == ltrans_statics_bitcount)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
957 {
111
kono
parents: 67
diff changeset
958 streamer_write_hwi_stream (ob->main_stream, -1);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
959 return;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
960 }
111
kono
parents: 67
diff changeset
961 streamer_write_hwi_stream (ob->main_stream, count);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
962 if (!count)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
963 return;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
964 EXECUTE_IF_AND_IN_BITMAP (bits, ltrans_statics, 0, index, bi)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
965 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
966 tree decl = (tree)splay_tree_lookup (reference_vars_to_consider,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
967 index)->value;
111
kono
parents: 67
diff changeset
968 lto_output_var_decl_index (ob->decl_state, ob->main_stream, decl);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
969 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
970 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
971
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
972 /* Serialize the ipa info for lto. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
973
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
974 static void
111
kono
parents: 67
diff changeset
975 ipa_reference_write_optimization_summary (void)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
976 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
977 struct lto_simple_output_block *ob
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
978 = lto_create_simple_output_block (LTO_section_ipa_reference);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
979 unsigned int count = 0;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
980 int ltrans_statics_bitcount = 0;
111
kono
parents: 67
diff changeset
981 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
kono
parents: 67
diff changeset
982 auto_bitmap ltrans_statics;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
983 int i;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
984
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
985 reference_vars_to_consider = splay_tree_new (splay_tree_compare_ints, 0, 0);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
986
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
987 /* See what variables we are interested in. */
111
kono
parents: 67
diff changeset
988 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
989 {
111
kono
parents: 67
diff changeset
990 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
kono
parents: 67
diff changeset
991 varpool_node *vnode = dyn_cast <varpool_node *> (snode);
kono
parents: 67
diff changeset
992 if (vnode
kono
parents: 67
diff changeset
993 && bitmap_bit_p (all_module_statics,
kono
parents: 67
diff changeset
994 ipa_reference_var_uid (vnode->decl))
kono
parents: 67
diff changeset
995 && referenced_from_this_partition_p (vnode, encoder))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
996 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
997 tree decl = vnode->decl;
111
kono
parents: 67
diff changeset
998 bitmap_set_bit (ltrans_statics, ipa_reference_var_uid (decl));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
999 splay_tree_insert (reference_vars_to_consider,
111
kono
parents: 67
diff changeset
1000 ipa_reference_var_uid (decl),
kono
parents: 67
diff changeset
1001 (splay_tree_value)decl);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1002 ltrans_statics_bitcount ++;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1003 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1004 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1005
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1006
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1007 if (ltrans_statics_bitcount)
111
kono
parents: 67
diff changeset
1008 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
kono
parents: 67
diff changeset
1009 {
kono
parents: 67
diff changeset
1010 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
kono
parents: 67
diff changeset
1011 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
kono
parents: 67
diff changeset
1012 if (cnode && write_node_summary_p (cnode, encoder, ltrans_statics))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1013 count++;
111
kono
parents: 67
diff changeset
1014 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1015
111
kono
parents: 67
diff changeset
1016 streamer_write_uhwi_stream (ob->main_stream, count);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1017 if (count)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1018 stream_out_bitmap (ob, ltrans_statics, ltrans_statics,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1019 -1);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1020
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1021 /* Process all of the functions. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1022 if (ltrans_statics_bitcount)
111
kono
parents: 67
diff changeset
1023 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1024 {
111
kono
parents: 67
diff changeset
1025 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
kono
parents: 67
diff changeset
1026 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
kono
parents: 67
diff changeset
1027 if (cnode && write_node_summary_p (cnode, encoder, ltrans_statics))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1028 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1029 ipa_reference_optimization_summary_t info;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1030 int node_ref;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1031
111
kono
parents: 67
diff changeset
1032 info = get_reference_optimization_summary (cnode);
kono
parents: 67
diff changeset
1033 node_ref = lto_symtab_encoder_encode (encoder, snode);
kono
parents: 67
diff changeset
1034 streamer_write_uhwi_stream (ob->main_stream, node_ref);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1035
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1036 stream_out_bitmap (ob, info->statics_not_read, ltrans_statics,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1037 ltrans_statics_bitcount);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1038 stream_out_bitmap (ob, info->statics_not_written, ltrans_statics,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1039 ltrans_statics_bitcount);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1040 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1041 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1042 lto_destroy_simple_output_block (ob);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1043 splay_tree_delete (reference_vars_to_consider);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1044 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1045
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1046 /* Deserialize the ipa info for lto. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1047
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1048 static void
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1049 ipa_reference_read_optimization_summary (void)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1050 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1051 struct lto_file_decl_data ** file_data_vec
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1052 = lto_get_file_decl_data ();
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1053 struct lto_file_decl_data * file_data;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1054 unsigned int j = 0;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1055 bitmap_obstack_initialize (&optimization_summary_obstack);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1056
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1057 if (ipa_ref_opt_sum_summaries == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1058 ipa_ref_opt_sum_summaries = new ipa_ref_opt_summary_t (symtab);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1059
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1060 all_module_statics = BITMAP_ALLOC (&optimization_summary_obstack);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1061
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1062 while ((file_data = file_data_vec[j++]))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1063 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1064 const char *data;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1065 size_t len;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1066 struct lto_input_block *ib
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1067 = lto_create_simple_input_block (file_data,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1068 LTO_section_ipa_reference,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1069 &data, &len);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1070 if (ib)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1071 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1072 unsigned int i;
111
kono
parents: 67
diff changeset
1073 unsigned int f_count = streamer_read_uhwi (ib);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1074 int b_count;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1075 if (!f_count)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1076 continue;
111
kono
parents: 67
diff changeset
1077 b_count = streamer_read_hwi (ib);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1078 if (dump_file)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1079 fprintf (dump_file, "all module statics:");
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1080 for (i = 0; i < (unsigned int)b_count; i++)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1081 {
111
kono
parents: 67
diff changeset
1082 unsigned int var_index = streamer_read_uhwi (ib);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1083 tree v_decl = lto_file_decl_data_get_var_decl (file_data,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1084 var_index);
111
kono
parents: 67
diff changeset
1085 bitmap_set_bit (all_module_statics,
kono
parents: 67
diff changeset
1086 ipa_reference_var_uid (v_decl));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1087 if (dump_file)
111
kono
parents: 67
diff changeset
1088 fprintf (dump_file, " %s", fndecl_name (v_decl));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1089 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1090
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1091 for (i = 0; i < f_count; i++)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1092 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1093 unsigned int j, index;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1094 struct cgraph_node *node;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1095 int v_count;
111
kono
parents: 67
diff changeset
1096 lto_symtab_encoder_t encoder;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1097
111
kono
parents: 67
diff changeset
1098 index = streamer_read_uhwi (ib);
kono
parents: 67
diff changeset
1099 encoder = file_data->symtab_node_encoder;
kono
parents: 67
diff changeset
1100 node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref
kono
parents: 67
diff changeset
1101 (encoder, index));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1102
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1103 ipa_reference_optimization_summary_d *info
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104 = ipa_ref_opt_sum_summaries->get_create (node);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1105
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1106 info->statics_not_read = BITMAP_ALLOC
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1107 (&optimization_summary_obstack);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1108 info->statics_not_written = BITMAP_ALLOC
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1109 (&optimization_summary_obstack);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1110 if (dump_file)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1111 fprintf (dump_file,
111
kono
parents: 67
diff changeset
1112 "\nFunction name:%s:\n static not read:",
kono
parents: 67
diff changeset
1113 node->dump_asm_name ());
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1114
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1115 /* Set the statics not read. */
111
kono
parents: 67
diff changeset
1116 v_count = streamer_read_hwi (ib);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1117 if (v_count == -1)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1118 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1119 info->statics_not_read = all_module_statics;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1120 if (dump_file)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1121 fprintf (dump_file, " all module statics");
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1122 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1123 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1124 for (j = 0; j < (unsigned int)v_count; j++)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1125 {
111
kono
parents: 67
diff changeset
1126 unsigned int var_index = streamer_read_uhwi (ib);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1127 tree v_decl = lto_file_decl_data_get_var_decl (file_data,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1128 var_index);
111
kono
parents: 67
diff changeset
1129 bitmap_set_bit (info->statics_not_read,
kono
parents: 67
diff changeset
1130 ipa_reference_var_uid (v_decl));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1131 if (dump_file)
111
kono
parents: 67
diff changeset
1132 fprintf (dump_file, " %s", fndecl_name (v_decl));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1133 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1134
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1135 if (dump_file)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1136 fprintf (dump_file,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1137 "\n static not written:");
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1138 /* Set the statics not written. */
111
kono
parents: 67
diff changeset
1139 v_count = streamer_read_hwi (ib);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1140 if (v_count == -1)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1141 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1142 info->statics_not_written = all_module_statics;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1143 if (dump_file)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1144 fprintf (dump_file, " all module statics");
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1145 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1146 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1147 for (j = 0; j < (unsigned int)v_count; j++)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1148 {
111
kono
parents: 67
diff changeset
1149 unsigned int var_index = streamer_read_uhwi (ib);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1150 tree v_decl = lto_file_decl_data_get_var_decl (file_data,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1151 var_index);
111
kono
parents: 67
diff changeset
1152 bitmap_set_bit (info->statics_not_written,
kono
parents: 67
diff changeset
1153 ipa_reference_var_uid (v_decl));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1154 if (dump_file)
111
kono
parents: 67
diff changeset
1155 fprintf (dump_file, " %s", fndecl_name (v_decl));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1156 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1157 if (dump_file)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1158 fprintf (dump_file, "\n");
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1159 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1160
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1161 lto_destroy_simple_input_block (file_data,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1162 LTO_section_ipa_reference,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1163 ib, data, len);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1164 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1165 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1166 /* Fatal error here. We do not want to support compiling ltrans units
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1167 with different version of compiler or different flags than
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1168 the WPA unit, so this should never happen. */
111
kono
parents: 67
diff changeset
1169 fatal_error (input_location,
kono
parents: 67
diff changeset
1170 "ipa reference summary is missing in ltrans unit");
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1171 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1172 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1173
111
kono
parents: 67
diff changeset
1174 namespace {
kono
parents: 67
diff changeset
1175
kono
parents: 67
diff changeset
1176 const pass_data pass_data_ipa_reference =
kono
parents: 67
diff changeset
1177 {
kono
parents: 67
diff changeset
1178 IPA_PASS, /* type */
kono
parents: 67
diff changeset
1179 "static-var", /* name */
kono
parents: 67
diff changeset
1180 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
1181 TV_IPA_REFERENCE, /* tv_id */
kono
parents: 67
diff changeset
1182 0, /* properties_required */
kono
parents: 67
diff changeset
1183 0, /* properties_provided */
kono
parents: 67
diff changeset
1184 0, /* properties_destroyed */
kono
parents: 67
diff changeset
1185 0, /* todo_flags_start */
kono
parents: 67
diff changeset
1186 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
1187 };
kono
parents: 67
diff changeset
1188
kono
parents: 67
diff changeset
1189 class pass_ipa_reference : public ipa_opt_pass_d
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1190 {
111
kono
parents: 67
diff changeset
1191 public:
kono
parents: 67
diff changeset
1192 pass_ipa_reference (gcc::context *ctxt)
kono
parents: 67
diff changeset
1193 : ipa_opt_pass_d (pass_data_ipa_reference, ctxt,
kono
parents: 67
diff changeset
1194 NULL, /* generate_summary */
kono
parents: 67
diff changeset
1195 NULL, /* write_summary */
kono
parents: 67
diff changeset
1196 NULL, /* read_summary */
kono
parents: 67
diff changeset
1197 ipa_reference_write_optimization_summary, /*
kono
parents: 67
diff changeset
1198 write_optimization_summary */
kono
parents: 67
diff changeset
1199 ipa_reference_read_optimization_summary, /*
kono
parents: 67
diff changeset
1200 read_optimization_summary */
kono
parents: 67
diff changeset
1201 NULL, /* stmt_fixup */
kono
parents: 67
diff changeset
1202 0, /* function_transform_todo_flags_start */
kono
parents: 67
diff changeset
1203 NULL, /* function_transform */
kono
parents: 67
diff changeset
1204 NULL) /* variable_transform */
kono
parents: 67
diff changeset
1205 {}
kono
parents: 67
diff changeset
1206
kono
parents: 67
diff changeset
1207 /* opt_pass methods: */
kono
parents: 67
diff changeset
1208 virtual bool gate (function *)
kono
parents: 67
diff changeset
1209 {
kono
parents: 67
diff changeset
1210 return ((in_lto_p || flag_ipa_reference)
kono
parents: 67
diff changeset
1211 /* Don't bother doing anything if the program has errors. */
kono
parents: 67
diff changeset
1212 && !seen_error ());
kono
parents: 67
diff changeset
1213 }
kono
parents: 67
diff changeset
1214
kono
parents: 67
diff changeset
1215 virtual unsigned int execute (function *) { return propagate (); }
kono
parents: 67
diff changeset
1216
kono
parents: 67
diff changeset
1217 }; // class pass_ipa_reference
kono
parents: 67
diff changeset
1218
kono
parents: 67
diff changeset
1219 } // anon namespace
kono
parents: 67
diff changeset
1220
kono
parents: 67
diff changeset
1221 ipa_opt_pass_d *
kono
parents: 67
diff changeset
1222 make_pass_ipa_reference (gcc::context *ctxt)
kono
parents: 67
diff changeset
1223 {
kono
parents: 67
diff changeset
1224 return new pass_ipa_reference (ctxt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1225 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1226
111
kono
parents: 67
diff changeset
1227 /* Reset all state within ipa-reference.c so that we can rerun the compiler
kono
parents: 67
diff changeset
1228 within the same process. For use by toplev::finalize. */
kono
parents: 67
diff changeset
1229
kono
parents: 67
diff changeset
1230 void
kono
parents: 67
diff changeset
1231 ipa_reference_c_finalize (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1232 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1233 if (ipa_ref_opt_sum_summaries != NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1234 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1235 delete ipa_ref_opt_sum_summaries;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1236 ipa_ref_opt_sum_summaries = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1237 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1238
111
kono
parents: 67
diff changeset
1239 if (ipa_init_p)
kono
parents: 67
diff changeset
1240 {
kono
parents: 67
diff changeset
1241 bitmap_obstack_release (&optimization_summary_obstack);
kono
parents: 67
diff changeset
1242 ipa_init_p = false;
kono
parents: 67
diff changeset
1243 }
kono
parents: 67
diff changeset
1244 }