annotate gcc/web.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
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 /* Web construction code for GNU compiler.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 Contributed by Jan Hubicka.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 Copyright (C) 2001-2020 Free Software Foundation, Inc.
0
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 /* Simple optimization pass that splits independent uses of each pseudo,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 increasing effectiveness of other optimizations. The optimization can
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 serve as an example of use for the dataflow module.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 TODO
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 - We may use profile information and ignore infrequent use for the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 purpose of web unifying, inserting the compensation code later to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 implement full induction variable expansion for loops (currently
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 we expand only if the induction variable is dead afterward, which
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 is often the case). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 #include "coretypes.h"
111
kono
parents: 67
diff changeset
35 #include "backend.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 #include "rtl.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 #include "df.h"
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
38 #include "insn-config.h"
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
39 #include "recog.h"
111
kono
parents: 67
diff changeset
40
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 #include "tree-pass.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 /* Find the root of unionfind tree (the representative of set). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
111
kono
parents: 67
diff changeset
46 web_entry_base *
kono
parents: 67
diff changeset
47 web_entry_base::unionfind_root ()
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 {
111
kono
parents: 67
diff changeset
49 web_entry_base *element = this, *element1 = this, *element2;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
111
kono
parents: 67
diff changeset
51 while (element->pred ())
kono
parents: 67
diff changeset
52 element = element->pred ();
kono
parents: 67
diff changeset
53 while (element1->pred ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 {
111
kono
parents: 67
diff changeset
55 element2 = element1->pred ();
kono
parents: 67
diff changeset
56 element1->set_pred (element);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 element1 = element2;
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 return element;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
62 /* Union sets.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 Return true if FIRST and SECOND points to the same web entry structure and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 nothing is done. Otherwise, return false. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 bool
111
kono
parents: 67
diff changeset
67 unionfind_union (web_entry_base *first, web_entry_base *second)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 {
111
kono
parents: 67
diff changeset
69 first = first->unionfind_root ();
kono
parents: 67
diff changeset
70 second = second->unionfind_root ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 if (first == second)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 return true;
111
kono
parents: 67
diff changeset
73 second->set_pred (first);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
77 struct web_entry : public web_entry_base
111
kono
parents: 67
diff changeset
78 {
kono
parents: 67
diff changeset
79 private:
kono
parents: 67
diff changeset
80 rtx reg_pvt;
kono
parents: 67
diff changeset
81
kono
parents: 67
diff changeset
82 public:
kono
parents: 67
diff changeset
83 rtx reg () { return reg_pvt; }
kono
parents: 67
diff changeset
84 void set_reg (rtx r) { reg_pvt = r; }
kono
parents: 67
diff changeset
85 };
kono
parents: 67
diff changeset
86
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
87 /* For INSN, union all defs and uses that are linked by match_dup.
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
88 FUN is the function that does the union. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
89
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
90 static void
111
kono
parents: 67
diff changeset
91 union_match_dups (rtx_insn *insn, web_entry *def_entry, web_entry *use_entry,
kono
parents: 67
diff changeset
92 bool (*fun) (web_entry_base *, web_entry_base *))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
93 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
94 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
111
kono
parents: 67
diff changeset
95 df_ref use_link = DF_INSN_INFO_USES (insn_info);
kono
parents: 67
diff changeset
96 df_ref def_link = DF_INSN_INFO_DEFS (insn_info);
kono
parents: 67
diff changeset
97 struct web_entry *dup_entry;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
98 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
99
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
100 extract_insn (insn);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
101
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
102 for (i = 0; i < recog_data.n_dups; i++)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
103 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
104 int op = recog_data.dup_num[i];
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
105 enum op_type type = recog_data.operand_type[op];
111
kono
parents: 67
diff changeset
106 df_ref ref, dupref;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
107 struct web_entry *entry;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
108
111
kono
parents: 67
diff changeset
109 dup_entry = use_entry;
kono
parents: 67
diff changeset
110 for (dupref = use_link; dupref; dupref = DF_REF_NEXT_LOC (dupref))
kono
parents: 67
diff changeset
111 if (DF_REF_LOC (dupref) == recog_data.dup_loc[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
112 break;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
113
111
kono
parents: 67
diff changeset
114 if (dupref == NULL && type == OP_INOUT)
kono
parents: 67
diff changeset
115 {
kono
parents: 67
diff changeset
116 dup_entry = def_entry;
kono
parents: 67
diff changeset
117 for (dupref = def_link; dupref; dupref = DF_REF_NEXT_LOC (dupref))
kono
parents: 67
diff changeset
118 if (DF_REF_LOC (dupref) == recog_data.dup_loc[i])
kono
parents: 67
diff changeset
119 break;
kono
parents: 67
diff changeset
120 }
kono
parents: 67
diff changeset
121 /* ??? *DUPREF can still be zero, because when an operand matches
kono
parents: 67
diff changeset
122 a memory, DF_REF_LOC (use_link[n]) points to the register part
kono
parents: 67
diff changeset
123 of the address, whereas recog_data.dup_loc[m] points to the
kono
parents: 67
diff changeset
124 entire memory ref, thus we fail to find the duplicate entry,
kono
parents: 67
diff changeset
125 even though it is there.
kono
parents: 67
diff changeset
126 Example: i686-pc-linux-gnu gcc.c-torture/compile/950607-1.c
kono
parents: 67
diff changeset
127 -O3 -fomit-frame-pointer -funroll-loops */
kono
parents: 67
diff changeset
128 if (dupref == NULL
kono
parents: 67
diff changeset
129 || DF_REF_REGNO (dupref) < FIRST_PSEUDO_REGISTER)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
130 continue;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
131
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
132 ref = type == OP_IN ? use_link : def_link;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
133 entry = type == OP_IN ? use_entry : def_entry;
111
kono
parents: 67
diff changeset
134 for (; ref; ref = DF_REF_NEXT_LOC (ref))
kono
parents: 67
diff changeset
135 {
kono
parents: 67
diff changeset
136 rtx *l = DF_REF_LOC (ref);
kono
parents: 67
diff changeset
137 if (l == recog_data.operand_loc[op])
kono
parents: 67
diff changeset
138 break;
kono
parents: 67
diff changeset
139 if (l && DF_REF_REAL_LOC (ref) == recog_data.operand_loc[op])
kono
parents: 67
diff changeset
140 break;
kono
parents: 67
diff changeset
141 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
142
111
kono
parents: 67
diff changeset
143 if (!ref && type == OP_INOUT)
kono
parents: 67
diff changeset
144 {
kono
parents: 67
diff changeset
145 entry = use_entry;
kono
parents: 67
diff changeset
146 for (ref = use_link; ref; ref = DF_REF_NEXT_LOC (ref))
kono
parents: 67
diff changeset
147 {
kono
parents: 67
diff changeset
148 rtx *l = DF_REF_LOC (ref);
kono
parents: 67
diff changeset
149 if (l == recog_data.operand_loc[op])
kono
parents: 67
diff changeset
150 break;
kono
parents: 67
diff changeset
151 if (l && DF_REF_REAL_LOC (ref) == recog_data.operand_loc[op])
kono
parents: 67
diff changeset
152 break;
kono
parents: 67
diff changeset
153 }
kono
parents: 67
diff changeset
154 }
kono
parents: 67
diff changeset
155
kono
parents: 67
diff changeset
156 gcc_assert (ref);
kono
parents: 67
diff changeset
157 (*fun) (dup_entry + DF_REF_ID (dupref), entry + DF_REF_ID (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
158 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
159 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
160
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 /* For each use, all possible defs reaching it must come in the same
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 register, union them.
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
163 FUN is the function that does the union.
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
164
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
165 In USED, we keep the DF_REF_ID of the first uninitialized uses of a
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
166 register, so that all uninitialized uses of the register can be
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
167 combined into a single web. We actually offset it by 2, because
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
168 the values 0 and 1 are reserved for use by entry_register. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 void
111
kono
parents: 67
diff changeset
171 union_defs (df_ref use, web_entry *def_entry,
kono
parents: 67
diff changeset
172 unsigned int *used, web_entry *use_entry,
kono
parents: 67
diff changeset
173 bool (*fun) (web_entry_base *, web_entry_base *))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 struct df_insn_info *insn_info = DF_REF_INSN_INFO (use);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 struct df_link *link = DF_REF_CHAIN (use);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 rtx set;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 if (insn_info)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 {
111
kono
parents: 67
diff changeset
181 df_ref eq_use;
kono
parents: 67
diff changeset
182
kono
parents: 67
diff changeset
183 set = single_set (insn_info->insn);
kono
parents: 67
diff changeset
184 FOR_EACH_INSN_INFO_EQ_USE (eq_use, insn_info)
kono
parents: 67
diff changeset
185 if (use != eq_use
kono
parents: 67
diff changeset
186 && DF_REF_REAL_REG (use) == DF_REF_REAL_REG (eq_use))
kono
parents: 67
diff changeset
187 (*fun) (use_entry + DF_REF_ID (use), use_entry + DF_REF_ID (eq_use));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 else
111
kono
parents: 67
diff changeset
190 set = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
192 /* Union all occurrences of the same register in reg notes. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 /* Recognize trivial noop moves and attempt to keep them as noop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 if (set
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 && SET_SRC (set) == DF_REF_REG (use)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 && SET_SRC (set) == SET_DEST (set))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 {
111
kono
parents: 67
diff changeset
200 df_ref def;
kono
parents: 67
diff changeset
201
kono
parents: 67
diff changeset
202 FOR_EACH_INSN_INFO_DEF (def, insn_info)
kono
parents: 67
diff changeset
203 if (DF_REF_REAL_REG (use) == DF_REF_REAL_REG (def))
kono
parents: 67
diff changeset
204 (*fun) (use_entry + DF_REF_ID (use), def_entry + DF_REF_ID (def));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
206
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
207 /* UD chains of uninitialized REGs are empty. Keeping all uses of
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
208 the same uninitialized REG in a single web is not necessary for
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
209 correctness, since the uses are undefined, but it's wasteful to
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
210 allocate one register or slot for each reference. Furthermore,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
211 creating new pseudos for uninitialized references in debug insns
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
212 (see PR 42631) causes -fcompare-debug failures. We record the
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
213 number of the first uninitialized reference we found, and merge
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
214 with it any other uninitialized references to the same
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
215 register. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
216 if (!link)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
217 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
218 int regno = REGNO (DF_REF_REAL_REG (use));
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
219 if (used[regno])
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
220 (*fun) (use_entry + DF_REF_ID (use), use_entry + used[regno] - 2);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
221 else
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
222 used[regno] = DF_REF_ID (use) + 2;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
223 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
224
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 while (link)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 (*fun) (use_entry + DF_REF_ID (use),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 def_entry + DF_REF_ID (link->ref));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 link = link->next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 /* A READ_WRITE use requires the corresponding def to be in the same
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 register. Find it and union. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
111
kono
parents: 67
diff changeset
235 if (insn_info)
kono
parents: 67
diff changeset
236 {
kono
parents: 67
diff changeset
237 df_ref def;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238
111
kono
parents: 67
diff changeset
239 FOR_EACH_INSN_INFO_DEF (def, insn_info)
kono
parents: 67
diff changeset
240 if (DF_REF_REAL_REG (use) == DF_REF_REAL_REG (def))
kono
parents: 67
diff changeset
241 (*fun) (use_entry + DF_REF_ID (use), def_entry + DF_REF_ID (def));
kono
parents: 67
diff changeset
242 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 /* Find the corresponding register for the given entry. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 static rtx
111
kono
parents: 67
diff changeset
248 entry_register (web_entry *entry, df_ref ref, unsigned int *used)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 {
111
kono
parents: 67
diff changeset
250 web_entry *root;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 rtx reg, newreg;
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 /* Find the corresponding web and see if it has been visited. */
111
kono
parents: 67
diff changeset
254 root = (web_entry *)entry->unionfind_root ();
kono
parents: 67
diff changeset
255 if (root->reg ())
kono
parents: 67
diff changeset
256 return root->reg ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 /* We are seeing this web for the first time, do the assignment. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 reg = DF_REF_REAL_REG (ref);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
261 /* In case the original register is already assigned, generate new
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
262 one. Since we use USED to merge uninitialized refs into a single
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
263 web, we might found an element to be nonzero without our having
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
264 used it. Test for 1, because union_defs saves it for our use,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
265 and there won't be any use for the other values when we get to
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
266 this point. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
267 if (used[REGNO (reg)] != 1)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 newreg = reg, used[REGNO (reg)] = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 newreg = gen_reg_rtx (GET_MODE (reg));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 REG_USERVAR_P (newreg) = REG_USERVAR_P (reg);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 REG_POINTER (newreg) = REG_POINTER (reg);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 REG_ATTRS (newreg) = REG_ATTRS (reg);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 if (dump_file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 fprintf (dump_file, "Web oldreg=%i newreg=%i\n", REGNO (reg),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 REGNO (newreg));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279
111
kono
parents: 67
diff changeset
280 root->set_reg (newreg);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 return newreg;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 /* Replace the reference by REG. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
285
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 replace_ref (df_ref ref, rtx reg)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 rtx oldreg = DF_REF_REAL_REG (ref);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 rtx *loc = DF_REF_REAL_LOC (ref);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 unsigned int uid = DF_REF_INSN_UID (ref);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 if (oldreg == reg)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 if (dump_file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 fprintf (dump_file, "Updating insn %i (%i->%i)\n",
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
297 uid, REGNO (oldreg), REGNO (reg));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 *loc = reg;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 df_insn_rescan (DF_REF_INSN (ref));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302
111
kono
parents: 67
diff changeset
303 namespace {
kono
parents: 67
diff changeset
304
kono
parents: 67
diff changeset
305 const pass_data pass_data_web =
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 {
111
kono
parents: 67
diff changeset
307 RTL_PASS, /* type */
kono
parents: 67
diff changeset
308 "web", /* name */
kono
parents: 67
diff changeset
309 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
310 TV_WEB, /* tv_id */
kono
parents: 67
diff changeset
311 0, /* properties_required */
kono
parents: 67
diff changeset
312 0, /* properties_provided */
kono
parents: 67
diff changeset
313 0, /* properties_destroyed */
kono
parents: 67
diff changeset
314 0, /* todo_flags_start */
kono
parents: 67
diff changeset
315 TODO_df_finish, /* todo_flags_finish */
kono
parents: 67
diff changeset
316 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317
111
kono
parents: 67
diff changeset
318 class pass_web : public rtl_opt_pass
kono
parents: 67
diff changeset
319 {
kono
parents: 67
diff changeset
320 public:
kono
parents: 67
diff changeset
321 pass_web (gcc::context *ctxt)
kono
parents: 67
diff changeset
322 : rtl_opt_pass (pass_data_web, ctxt)
kono
parents: 67
diff changeset
323 {}
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324
111
kono
parents: 67
diff changeset
325 /* opt_pass methods: */
kono
parents: 67
diff changeset
326 virtual bool gate (function *) { return (optimize > 0 && flag_web); }
kono
parents: 67
diff changeset
327 virtual unsigned int execute (function *);
kono
parents: 67
diff changeset
328
kono
parents: 67
diff changeset
329 }; // class pass_web
kono
parents: 67
diff changeset
330
kono
parents: 67
diff changeset
331 unsigned int
kono
parents: 67
diff changeset
332 pass_web::execute (function *fun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 {
111
kono
parents: 67
diff changeset
334 web_entry *def_entry;
kono
parents: 67
diff changeset
335 web_entry *use_entry;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 unsigned int max = max_reg_num ();
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
337 unsigned int *used;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 basic_block bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 unsigned int uses_num = 0;
111
kono
parents: 67
diff changeset
340 rtx_insn *insn;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
341
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 df_set_flags (DF_NO_HARD_REGS + DF_EQ_NOTES);
111
kono
parents: 67
diff changeset
343 df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 df_chain_add_problem (DF_UD_CHAIN);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 df_analyze ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 df_set_flags (DF_DEFER_INSN_RESCAN);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 /* Assign ids to the uses. */
111
kono
parents: 67
diff changeset
349 FOR_ALL_BB_FN (bb, fun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 FOR_BB_INSNS (bb, insn)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
352 if (NONDEBUG_INSN_P (insn))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 {
111
kono
parents: 67
diff changeset
354 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
kono
parents: 67
diff changeset
355 df_ref use;
kono
parents: 67
diff changeset
356 FOR_EACH_INSN_INFO_USE (use, insn_info)
kono
parents: 67
diff changeset
357 if (DF_REF_REGNO (use) >= FIRST_PSEUDO_REGISTER)
kono
parents: 67
diff changeset
358 DF_REF_ID (use) = uses_num++;
kono
parents: 67
diff changeset
359 FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
kono
parents: 67
diff changeset
360 if (DF_REF_REGNO (use) >= FIRST_PSEUDO_REGISTER)
kono
parents: 67
diff changeset
361 DF_REF_ID (use) = uses_num++;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 /* Record the number of uses and defs at the beginning of the optimization. */
111
kono
parents: 67
diff changeset
366 def_entry = XCNEWVEC (web_entry, DF_DEFS_TABLE_SIZE ());
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
367 used = XCNEWVEC (unsigned, max);
111
kono
parents: 67
diff changeset
368 use_entry = XCNEWVEC (web_entry, uses_num);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 /* Produce the web. */
111
kono
parents: 67
diff changeset
371 FOR_ALL_BB_FN (bb, fun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 FOR_BB_INSNS (bb, insn)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
373 if (NONDEBUG_INSN_P (insn))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 {
111
kono
parents: 67
diff changeset
375 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
kono
parents: 67
diff changeset
376 df_ref use;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
377 union_match_dups (insn, def_entry, use_entry, unionfind_union);
111
kono
parents: 67
diff changeset
378 FOR_EACH_INSN_INFO_USE (use, insn_info)
kono
parents: 67
diff changeset
379 if (DF_REF_REGNO (use) >= FIRST_PSEUDO_REGISTER)
kono
parents: 67
diff changeset
380 union_defs (use, def_entry, used, use_entry, unionfind_union);
kono
parents: 67
diff changeset
381 FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
kono
parents: 67
diff changeset
382 if (DF_REF_REGNO (use) >= FIRST_PSEUDO_REGISTER)
kono
parents: 67
diff changeset
383 union_defs (use, def_entry, used, use_entry, unionfind_union);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
385
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 /* Update the instruction stream, allocating new registers for split pseudos
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 in progress. */
111
kono
parents: 67
diff changeset
388 FOR_ALL_BB_FN (bb, fun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 FOR_BB_INSNS (bb, insn)
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
390 if (NONDEBUG_INSN_P (insn)
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
391 /* Ignore naked clobber. For example, reg 134 in the second insn
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
392 of the following sequence will not be replaced.
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
393
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 (insn (clobber (reg:SI 134)))
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
395
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 (insn (set (reg:SI 0 r0) (reg:SI 134)))
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
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
398 Thus the later passes can optimize them away. */
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
399 && GET_CODE (PATTERN (insn)) != CLOBBER)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 {
111
kono
parents: 67
diff changeset
401 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
kono
parents: 67
diff changeset
402 df_ref def, use;
kono
parents: 67
diff changeset
403 FOR_EACH_INSN_INFO_USE (use, insn_info)
kono
parents: 67
diff changeset
404 if (DF_REF_REGNO (use) >= FIRST_PSEUDO_REGISTER)
kono
parents: 67
diff changeset
405 replace_ref (use, entry_register (use_entry + DF_REF_ID (use),
kono
parents: 67
diff changeset
406 use, used));
kono
parents: 67
diff changeset
407 FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
kono
parents: 67
diff changeset
408 if (DF_REF_REGNO (use) >= FIRST_PSEUDO_REGISTER)
kono
parents: 67
diff changeset
409 replace_ref (use, entry_register (use_entry + DF_REF_ID (use),
kono
parents: 67
diff changeset
410 use, used));
kono
parents: 67
diff changeset
411 FOR_EACH_INSN_INFO_DEF (def, insn_info)
kono
parents: 67
diff changeset
412 if (DF_REF_REGNO (def) >= FIRST_PSEUDO_REGISTER)
kono
parents: 67
diff changeset
413 replace_ref (def, entry_register (def_entry + DF_REF_ID (def),
kono
parents: 67
diff changeset
414 def, used));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 free (def_entry);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 free (use_entry);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 free (used);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 return 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
111
kono
parents: 67
diff changeset
423 } // anon namespace
kono
parents: 67
diff changeset
424
kono
parents: 67
diff changeset
425 rtl_opt_pass *
kono
parents: 67
diff changeset
426 make_pass_web (gcc::context *ctxt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 {
111
kono
parents: 67
diff changeset
428 return new pass_web (ctxt);
kono
parents: 67
diff changeset
429 }