annotate gcc/tree-dfa.c @ 132:d34655255c78

update gcc-8.2
author mir3636
date Thu, 25 Oct 2018 10:21:07 +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 /* Data flow functions for trees.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2001-2018 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 Contributed by Diego Novillo <dnovillo@redhat.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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 any later 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,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 GNU General Public License 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 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "coretypes.h"
111
kono
parents: 67
diff changeset
24 #include "backend.h"
kono
parents: 67
diff changeset
25 #include "rtl.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #include "tree.h"
111
kono
parents: 67
diff changeset
27 #include "gimple.h"
kono
parents: 67
diff changeset
28 #include "tree-pass.h"
kono
parents: 67
diff changeset
29 #include "ssa.h"
kono
parents: 67
diff changeset
30 #include "tree-pretty-print.h"
kono
parents: 67
diff changeset
31 #include "fold-const.h"
kono
parents: 67
diff changeset
32 #include "stor-layout.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 #include "langhooks.h"
111
kono
parents: 67
diff changeset
34 #include "gimple-iterator.h"
kono
parents: 67
diff changeset
35 #include "gimple-walk.h"
kono
parents: 67
diff changeset
36 #include "tree-dfa.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 /* Build and maintain data flow information for trees. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 /* Counters used to display DFA and SSA statistics. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 struct dfa_stats_d
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 long num_defs;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 long num_uses;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 long num_phis;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 long num_phi_args;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 size_t max_num_phi_args;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 long num_vdefs;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 long num_vuses;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 /* Local functions. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 static void collect_dfa_stats (struct dfa_stats_d *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 /*---------------------------------------------------------------------------
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 Dataflow analysis (DFA) routines
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 ---------------------------------------------------------------------------*/
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 /* Renumber all of the gimple stmt uids. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 renumber_gimple_stmt_uids (void)
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 basic_block bb;
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 set_gimple_stmt_max_uid (cfun, 0);
111
kono
parents: 67
diff changeset
69 FOR_ALL_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 gimple_stmt_iterator bsi;
111
kono
parents: 67
diff changeset
72 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
kono
parents: 67
diff changeset
73 {
kono
parents: 67
diff changeset
74 gimple *stmt = gsi_stmt (bsi);
kono
parents: 67
diff changeset
75 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
kono
parents: 67
diff changeset
76 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 {
111
kono
parents: 67
diff changeset
79 gimple *stmt = gsi_stmt (bsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
85 /* Like renumber_gimple_stmt_uids, but only do work on the basic blocks
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
86 in BLOCKS, of which there are N_BLOCKS. Also renumbers PHIs. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
88 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
89 renumber_gimple_stmt_uids_in_blocks (basic_block *blocks, int n_blocks)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
91 int i;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
93 set_gimple_stmt_max_uid (cfun, 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
94 for (i = 0; i < n_blocks; i++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
95 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
96 basic_block bb = blocks[i];
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97 gimple_stmt_iterator bsi;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
98 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
99 {
111
kono
parents: 67
diff changeset
100 gimple *stmt = gsi_stmt (bsi);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
101 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
102 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
103 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
104 {
111
kono
parents: 67
diff changeset
105 gimple *stmt = gsi_stmt (bsi);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
106 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
107 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
108 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 /*---------------------------------------------------------------------------
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 Debugging functions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 ---------------------------------------------------------------------------*/
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 /* Dump variable VAR and its may-aliases to FILE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 dump_variable (FILE *file, tree var)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 if (TREE_CODE (var) == SSA_NAME)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 if (POINTER_TYPE_P (TREE_TYPE (var)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 dump_points_to_info_for (file, var);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 var = SSA_NAME_VAR (var);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 if (var == NULL_TREE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 fprintf (file, "<nil>");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 print_generic_expr (file, var, dump_flags);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 fprintf (file, ", UID D.%u", (unsigned) DECL_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
138 if (DECL_PT_UID (var) != DECL_UID (var))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
139 fprintf (file, ", PT-UID D.%u", (unsigned) DECL_PT_UID (var));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 fprintf (file, ", ");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 print_generic_expr (file, TREE_TYPE (var), dump_flags);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 if (TREE_ADDRESSABLE (var))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 fprintf (file, ", is addressable");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
146
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 if (is_global_var (var))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 fprintf (file, ", is global");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 if (TREE_THIS_VOLATILE (var))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 fprintf (file, ", is volatile");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
111
kono
parents: 67
diff changeset
153 if (cfun && ssa_default_def (cfun, var))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 fprintf (file, ", default def: ");
111
kono
parents: 67
diff changeset
156 print_generic_expr (file, ssa_default_def (cfun, var), dump_flags);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
159 if (DECL_INITIAL (var))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
161 fprintf (file, ", initial: ");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
162 print_generic_expr (file, DECL_INITIAL (var), dump_flags);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 fprintf (file, "\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 /* Dump variable VAR and its may-aliases to stderr. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
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
171 DEBUG_FUNCTION void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 debug_variable (tree var)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 dump_variable (stderr, var);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 /* Dump various DFA statistics to FILE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 dump_dfa_stats (FILE *file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 struct dfa_stats_d dfa_stats;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 unsigned long size, total = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 const char * const fmt_str = "%-30s%-13s%12s\n";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 const char * const fmt_str_3 = "%-43s%11lu%c\n";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 const char *funcname
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 = lang_hooks.decl_printable_name (current_function_decl, 2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 collect_dfa_stats (&dfa_stats);
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 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
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 fprintf (file, "---------------------------------------------------------\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 fprintf (file, fmt_str, "", " Number of ", "Memory");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 fprintf (file, fmt_str, "", " instances ", "used ");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 fprintf (file, "---------------------------------------------------------\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 size = dfa_stats.num_uses * sizeof (tree *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 total += size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 SCALE (size), LABEL (size));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 size = dfa_stats.num_defs * sizeof (tree *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 total += size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 SCALE (size), LABEL (size));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 size = dfa_stats.num_vuses * sizeof (tree *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 total += size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 SCALE (size), LABEL (size));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 size = dfa_stats.num_vdefs * sizeof (tree *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 total += size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 SCALE (size), LABEL (size));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220
111
kono
parents: 67
diff changeset
221 size = dfa_stats.num_phis * sizeof (struct gphi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 total += size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 SCALE (size), LABEL (size));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 total += size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 SCALE (size), LABEL (size));
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 fprintf (file, "---------------------------------------------------------\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 LABEL (total));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 fprintf (file, "---------------------------------------------------------\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 fprintf (file, "\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 if (dfa_stats.num_phis)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 (long) dfa_stats.max_num_phi_args);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 fprintf (file, "\n");
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 /* Dump DFA statistics on stderr. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247
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
248 DEBUG_FUNCTION void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 debug_dfa_stats (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 dump_dfa_stats (stderr);
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 /* Collect DFA statistics and store them in the structure pointed to by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 DFA_STATS_P. */
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 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 basic_block bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 gcc_assert (dfa_stats_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 /* Walk all the statements in the function counting references. */
111
kono
parents: 67
diff changeset
268 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 {
111
kono
parents: 67
diff changeset
270 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
kono
parents: 67
diff changeset
271 gsi_next (&si))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 {
111
kono
parents: 67
diff changeset
273 gphi *phi = si.phi ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 dfa_stats_p->num_phis++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 dfa_stats_p->num_phi_args += gimple_phi_num_args (phi);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 if (gimple_phi_num_args (phi) > dfa_stats_p->max_num_phi_args)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 dfa_stats_p->max_num_phi_args = gimple_phi_num_args (phi);
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 for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
kono
parents: 67
diff changeset
281 gsi_next (&si))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 {
111
kono
parents: 67
diff changeset
283 gimple *stmt = gsi_stmt (si);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 dfa_stats_p->num_defs += NUM_SSA_OPERANDS (stmt, SSA_OP_DEF);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 dfa_stats_p->num_uses += NUM_SSA_OPERANDS (stmt, SSA_OP_USE);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
286 dfa_stats_p->num_vdefs += gimple_vdef (stmt) ? 1 : 0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
287 dfa_stats_p->num_vuses += gimple_vuse (stmt) ? 1 : 0;
0
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 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291
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 /*---------------------------------------------------------------------------
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 Miscellaneous helpers
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 ---------------------------------------------------------------------------*/
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 /* Lookup VAR UID in the default_defs hashtable and return the associated
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 variable. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
300 tree
111
kono
parents: 67
diff changeset
301 ssa_default_def (struct function *fn, tree var)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 struct tree_decl_minimal ind;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 struct tree_ssa_name in;
111
kono
parents: 67
diff changeset
305 gcc_assert (VAR_P (var)
kono
parents: 67
diff changeset
306 || TREE_CODE (var) == PARM_DECL
kono
parents: 67
diff changeset
307 || TREE_CODE (var) == RESULT_DECL);
kono
parents: 67
diff changeset
308
kono
parents: 67
diff changeset
309 /* Always NULL_TREE for rtl function dumps. */
kono
parents: 67
diff changeset
310 if (!fn->gimple_df)
kono
parents: 67
diff changeset
311 return NULL_TREE;
kono
parents: 67
diff changeset
312
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 in.var = (tree)&ind;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 ind.uid = DECL_UID (var);
111
kono
parents: 67
diff changeset
315 return DEFAULT_DEFS (fn)->find_with_hash ((tree)&in, DECL_UID (var));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317
111
kono
parents: 67
diff changeset
318 /* Insert the pair VAR's UID, DEF into the default_defs hashtable
kono
parents: 67
diff changeset
319 of function FN. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 void
111
kono
parents: 67
diff changeset
322 set_ssa_default_def (struct function *fn, tree var, tree def)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
323 {
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 struct tree_decl_minimal ind;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 struct tree_ssa_name in;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326
111
kono
parents: 67
diff changeset
327 gcc_assert (VAR_P (var)
kono
parents: 67
diff changeset
328 || TREE_CODE (var) == PARM_DECL
kono
parents: 67
diff changeset
329 || TREE_CODE (var) == RESULT_DECL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 in.var = (tree)&ind;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 ind.uid = DECL_UID (var);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 if (!def)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 {
111
kono
parents: 67
diff changeset
334 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
kono
parents: 67
diff changeset
335 DECL_UID (var),
kono
parents: 67
diff changeset
336 NO_INSERT);
kono
parents: 67
diff changeset
337 if (loc)
kono
parents: 67
diff changeset
338 {
kono
parents: 67
diff changeset
339 SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
kono
parents: 67
diff changeset
340 DEFAULT_DEFS (fn)->clear_slot (loc);
kono
parents: 67
diff changeset
341 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
111
kono
parents: 67
diff changeset
345 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
kono
parents: 67
diff changeset
346 DECL_UID (var), INSERT);
0
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 /* Default definition might be changed by tail call optimization. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 if (*loc)
111
kono
parents: 67
diff changeset
350 SSA_NAME_IS_DEFAULT_DEF (*loc) = false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 /* Mark DEF as the default definition for VAR. */
111
kono
parents: 67
diff changeset
353 *loc = def;
kono
parents: 67
diff changeset
354 SSA_NAME_IS_DEFAULT_DEF (def) = true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
111
kono
parents: 67
diff changeset
357 /* Retrieve or create a default definition for VAR. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
358
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 tree
111
kono
parents: 67
diff changeset
360 get_or_create_ssa_default_def (struct function *fn, tree var)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 {
111
kono
parents: 67
diff changeset
362 tree ddef = ssa_default_def (fn, var);
kono
parents: 67
diff changeset
363 if (ddef == NULL_TREE)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 {
111
kono
parents: 67
diff changeset
365 ddef = make_ssa_name_fn (fn, var, gimple_build_nop ());
kono
parents: 67
diff changeset
366 set_ssa_default_def (fn, var, ddef);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
367 }
111
kono
parents: 67
diff changeset
368 return ddef;
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
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 EXP is a handled component reference for a structure, return the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 base variable. The access range is delimited by bit positions *POFFSET and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
111
kono
parents: 67
diff changeset
376 and *PMAX_SIZE are equal, the access is non-variable. If *PREVERSE is
kono
parents: 67
diff changeset
377 true, the storage order of the reference is reversed. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
378
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 tree
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
380 get_ref_base_and_extent (tree exp, poly_int64_pod *poffset,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
381 poly_int64_pod *psize,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
382 poly_int64_pod *pmax_size,
111
kono
parents: 67
diff changeset
383 bool *preverse)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
385 poly_offset_int bitsize = -1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
386 poly_offset_int maxsize;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 tree size_tree = NULL_TREE;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
388 poly_offset_int bit_offset = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 bool seen_variable_array_ref = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
390
111
kono
parents: 67
diff changeset
391 /* First get the final access size and the storage order from just the
kono
parents: 67
diff changeset
392 outermost expression. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 if (TREE_CODE (exp) == COMPONENT_REF)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 else if (TREE_CODE (exp) == BIT_FIELD_REF)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 size_tree = TREE_OPERAND (exp, 1);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
397 else if (!VOID_TYPE_P (TREE_TYPE (exp)))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 {
111
kono
parents: 67
diff changeset
399 machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 if (mode == BLKmode)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 size_tree = TYPE_SIZE (TREE_TYPE (exp));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
403 bitsize = GET_MODE_BITSIZE (mode);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 }
111
kono
parents: 67
diff changeset
405 if (size_tree != NULL_TREE
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
406 && poly_int_tree_p (size_tree))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
407 bitsize = wi::to_poly_offset (size_tree);
111
kono
parents: 67
diff changeset
408
kono
parents: 67
diff changeset
409 *preverse = reverse_storage_order_for_component_p (exp);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 /* Initially, maxsize is the same as the accessed element size.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 In the following it will only grow (or become -1). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 maxsize = bitsize;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
414
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 /* Compute cumulative bit-offset for nested component-refs and array-refs,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 and find the ultimate containing object. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 while (1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 switch (TREE_CODE (exp))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 case BIT_FIELD_REF:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
422 bit_offset += wi::to_poly_offset (TREE_OPERAND (exp, 2));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 case COMPONENT_REF:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 tree field = TREE_OPERAND (exp, 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 tree this_offset = component_ref_field_offset (exp);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
429
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 if (this_offset && poly_int_tree_p (this_offset))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
432 poly_offset_int woffset = (wi::to_poly_offset (this_offset)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
433 << LOG2_BITS_PER_UNIT);
111
kono
parents: 67
diff changeset
434 woffset += wi::to_offset (DECL_FIELD_BIT_OFFSET (field));
kono
parents: 67
diff changeset
435 bit_offset += woffset;
0
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 /* If we had seen a variable array ref already and we just
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
438 referenced the last field of a struct or a union member
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
439 then we have to adjust maxsize by the padding at the end
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
440 of our field. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
441 if (seen_variable_array_ref)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
442 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
443 tree stype = TREE_TYPE (TREE_OPERAND (exp, 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
444 tree next = DECL_CHAIN (field);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
445 while (next && TREE_CODE (next) != FIELD_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
446 next = DECL_CHAIN (next);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
447 if (!next
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
448 || TREE_CODE (stype) != RECORD_TYPE)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
449 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
450 tree fsize = DECL_SIZE_UNIT (field);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
451 tree ssize = TYPE_SIZE_UNIT (stype);
111
kono
parents: 67
diff changeset
452 if (fsize == NULL
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
453 || !poly_int_tree_p (fsize)
111
kono
parents: 67
diff changeset
454 || ssize == NULL
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
455 || !poly_int_tree_p (ssize))
111
kono
parents: 67
diff changeset
456 maxsize = -1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
457 else if (known_size_p (maxsize))
111
kono
parents: 67
diff changeset
458 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
459 poly_offset_int tem
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
460 = (wi::to_poly_offset (ssize)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
461 - wi::to_poly_offset (fsize));
111
kono
parents: 67
diff changeset
462 tem <<= LOG2_BITS_PER_UNIT;
kono
parents: 67
diff changeset
463 tem -= woffset;
kono
parents: 67
diff changeset
464 maxsize += tem;
kono
parents: 67
diff changeset
465 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
466 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
467 /* An component ref with an adjacent field up in the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
468 structure hierarchy constrains the size of any variable
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
469 array ref lower in the access hierarchy. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
470 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
471 seen_variable_array_ref = false;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
472 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
473 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
474 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 /* We need to adjust maxsize to the whole structure bitsize.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 But we can subtract any constant offset seen so far,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 because that would get us out of the structure otherwise. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
480 if (known_size_p (maxsize)
111
kono
parents: 67
diff changeset
481 && csize
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
482 && poly_int_tree_p (csize))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
483 maxsize = wi::to_poly_offset (csize) - bit_offset;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 maxsize = -1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
489
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
490 case ARRAY_REF:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 case ARRAY_RANGE_REF:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 tree index = TREE_OPERAND (exp, 1);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
494 tree low_bound, unit_size;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
495
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
496 /* If the resulting bit-offset is constant, track it. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
497 if (poly_int_tree_p (index)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
498 && (low_bound = array_ref_low_bound (exp),
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
499 poly_int_tree_p (low_bound))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
500 && (unit_size = array_ref_element_size (exp),
111
kono
parents: 67
diff changeset
501 TREE_CODE (unit_size) == INTEGER_CST))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
503 poly_offset_int woffset
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
504 = wi::sext (wi::to_poly_offset (index)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
505 - wi::to_poly_offset (low_bound),
111
kono
parents: 67
diff changeset
506 TYPE_PRECISION (TREE_TYPE (index)));
kono
parents: 67
diff changeset
507 woffset *= wi::to_offset (unit_size);
kono
parents: 67
diff changeset
508 woffset <<= LOG2_BITS_PER_UNIT;
kono
parents: 67
diff changeset
509 bit_offset += woffset;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 /* An array ref with a constant index up in the structure
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 hierarchy will constrain the size of any variable array ref
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
513 lower in the access hierarchy. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 seen_variable_array_ref = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
518 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 /* We need to adjust maxsize to the whole array bitsize.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 But we can subtract any constant offset seen so far,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 because that would get us outside of the array otherwise. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
522 if (known_size_p (maxsize)
111
kono
parents: 67
diff changeset
523 && asize
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
524 && poly_int_tree_p (asize))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
525 maxsize = wi::to_poly_offset (asize) - bit_offset;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 maxsize = -1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
528
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
529 /* Remember that we have seen an array ref with a variable
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 index. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 seen_variable_array_ref = true;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
532
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
533 wide_int min, max;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
534 if (TREE_CODE (index) == SSA_NAME
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
535 && (low_bound = array_ref_low_bound (exp),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536 poly_int_tree_p (low_bound))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
537 && (unit_size = array_ref_element_size (exp),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
538 TREE_CODE (unit_size) == INTEGER_CST)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
539 && get_range_info (index, &min, &max) == VR_RANGE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
540 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
541 poly_offset_int lbound = wi::to_poly_offset (low_bound);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
542 /* Try to constrain maxsize with range information. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
543 offset_int omax
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
544 = offset_int::from (max, TYPE_SIGN (TREE_TYPE (index)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
545 if (known_lt (lbound, omax))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
546 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
547 poly_offset_int rmaxsize;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
548 rmaxsize = (omax - lbound + 1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
549 * wi::to_offset (unit_size) << LOG2_BITS_PER_UNIT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
550 if (!known_size_p (maxsize)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
551 || known_lt (rmaxsize, maxsize))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
552 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
553 /* If we know an upper bound below the declared
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
554 one this is no longer variable. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
555 if (known_size_p (maxsize))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556 seen_variable_array_ref = false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 maxsize = rmaxsize;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
558 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
559 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
560 /* Try to adjust bit_offset with range information. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
561 offset_int omin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
562 = offset_int::from (min, TYPE_SIGN (TREE_TYPE (index)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
563 if (known_le (lbound, omin))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
564 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
565 poly_offset_int woffset
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
566 = wi::sext (omin - lbound,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
567 TYPE_PRECISION (TREE_TYPE (index)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
568 woffset *= wi::to_offset (unit_size);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
569 woffset <<= LOG2_BITS_PER_UNIT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
570 bit_offset += woffset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
571 if (known_size_p (maxsize))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
572 maxsize -= woffset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
573 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
574 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
575 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 break;
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 case REALPART_EXPR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 case IMAGPART_EXPR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 bit_offset += bitsize;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
585
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 case VIEW_CONVERT_EXPR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
587 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
588
111
kono
parents: 67
diff changeset
589 case TARGET_MEM_REF:
kono
parents: 67
diff changeset
590 /* Via the variable index or index2 we can reach the
kono
parents: 67
diff changeset
591 whole object. Still hand back the decl here. */
kono
parents: 67
diff changeset
592 if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
kono
parents: 67
diff changeset
593 && (TMR_INDEX (exp) || TMR_INDEX2 (exp)))
kono
parents: 67
diff changeset
594 {
kono
parents: 67
diff changeset
595 exp = TREE_OPERAND (TMR_BASE (exp), 0);
kono
parents: 67
diff changeset
596 bit_offset = 0;
kono
parents: 67
diff changeset
597 maxsize = -1;
kono
parents: 67
diff changeset
598 goto done;
kono
parents: 67
diff changeset
599 }
kono
parents: 67
diff changeset
600 /* Fallthru. */
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
601 case MEM_REF:
111
kono
parents: 67
diff changeset
602 /* We need to deal with variable arrays ending structures such as
kono
parents: 67
diff changeset
603 struct { int length; int a[1]; } x; x.a[d]
kono
parents: 67
diff changeset
604 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
kono
parents: 67
diff changeset
605 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
kono
parents: 67
diff changeset
606 struct { int len; union { int a[1]; struct X x; } u; } x; x.u.a[d]
kono
parents: 67
diff changeset
607 where we do not know maxsize for variable index accesses to
kono
parents: 67
diff changeset
608 the array. The simplest way to conservatively deal with this
kono
parents: 67
diff changeset
609 is to punt in the case that offset + maxsize reaches the
kono
parents: 67
diff changeset
610 base type boundary. This needs to include possible trailing
kono
parents: 67
diff changeset
611 padding that is there for alignment purposes. */
kono
parents: 67
diff changeset
612 if (seen_variable_array_ref
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
613 && known_size_p (maxsize)
111
kono
parents: 67
diff changeset
614 && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
615 || !poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
616 || (maybe_eq
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
617 (bit_offset + maxsize,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
618 wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp)))))))
111
kono
parents: 67
diff changeset
619 maxsize = -1;
kono
parents: 67
diff changeset
620
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
621 /* Hand back the decl for MEM[&decl, off]. */
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 if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
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
623 {
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
624 if (integer_zerop (TREE_OPERAND (exp, 1)))
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
625 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
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
626 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
627 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
628 poly_offset_int off = mem_ref_offset (exp);
111
kono
parents: 67
diff changeset
629 off <<= LOG2_BITS_PER_UNIT;
kono
parents: 67
diff changeset
630 off += bit_offset;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
631 poly_int64 off_hwi;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632 if (off.to_shwi (&off_hwi))
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
633 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
634 bit_offset = off_hwi;
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
635 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
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
636 }
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
637 }
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
638 }
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
639 goto done;
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
640
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
641 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
642 goto done;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
643 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
644
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
645 exp = TREE_OPERAND (exp, 0);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 }
111
kono
parents: 67
diff changeset
647
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
648 done:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
649 if (!bitsize.to_shwi (psize) || maybe_lt (*psize, 0))
111
kono
parents: 67
diff changeset
650 {
kono
parents: 67
diff changeset
651 *poffset = 0;
kono
parents: 67
diff changeset
652 *psize = -1;
kono
parents: 67
diff changeset
653 *pmax_size = -1;
kono
parents: 67
diff changeset
654
kono
parents: 67
diff changeset
655 return exp;
kono
parents: 67
diff changeset
656 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
657
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 /* ??? Due to negative offsets in ARRAY_REF we can end up with
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 negative bit_offset here. We might want to store a zero offset
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 in this case. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661 if (!bit_offset.to_shwi (poffset))
111
kono
parents: 67
diff changeset
662 {
kono
parents: 67
diff changeset
663 *poffset = 0;
kono
parents: 67
diff changeset
664 *pmax_size = -1;
kono
parents: 67
diff changeset
665
kono
parents: 67
diff changeset
666 return exp;
kono
parents: 67
diff changeset
667 }
kono
parents: 67
diff changeset
668
kono
parents: 67
diff changeset
669 /* In case of a decl or constant base object we can do better. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
670
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
671 if (DECL_P (exp))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
672 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
673 if (VAR_P (exp)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
674 && ((flag_unconstrained_commons && DECL_COMMON (exp))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
675 || (DECL_EXTERNAL (exp) && seen_variable_array_ref)))
111
kono
parents: 67
diff changeset
676 {
kono
parents: 67
diff changeset
677 tree sz_tree = TYPE_SIZE (TREE_TYPE (exp));
kono
parents: 67
diff changeset
678 /* If size is unknown, or we have read to the end, assume there
kono
parents: 67
diff changeset
679 may be more to the structure than we are told. */
kono
parents: 67
diff changeset
680 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
kono
parents: 67
diff changeset
681 || (seen_variable_array_ref
kono
parents: 67
diff changeset
682 && (sz_tree == NULL_TREE
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
683 || !poly_int_tree_p (sz_tree)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
684 || maybe_eq (bit_offset + maxsize,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
685 wi::to_poly_offset (sz_tree)))))
111
kono
parents: 67
diff changeset
686 maxsize = -1;
kono
parents: 67
diff changeset
687 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
688 /* If maxsize is unknown adjust it according to the size of the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
689 base decl. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
690 else if (!known_size_p (maxsize)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
691 && DECL_SIZE (exp)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
692 && poly_int_tree_p (DECL_SIZE (exp)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
693 maxsize = wi::to_poly_offset (DECL_SIZE (exp)) - bit_offset;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
694 }
111
kono
parents: 67
diff changeset
695 else if (CONSTANT_CLASS_P (exp))
kono
parents: 67
diff changeset
696 {
kono
parents: 67
diff changeset
697 /* If maxsize is unknown adjust it according to the size of the
kono
parents: 67
diff changeset
698 base type constant. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
699 if (!known_size_p (maxsize)
111
kono
parents: 67
diff changeset
700 && TYPE_SIZE (TREE_TYPE (exp))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
701 && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
702 maxsize = (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp)))
111
kono
parents: 67
diff changeset
703 - bit_offset);
kono
parents: 67
diff changeset
704 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
705
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
706 if (!maxsize.to_shwi (pmax_size)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
707 || maybe_lt (*pmax_size, 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
708 || !endpoint_representable_p (*poffset, *pmax_size))
111
kono
parents: 67
diff changeset
709 *pmax_size = -1;
kono
parents: 67
diff changeset
710
kono
parents: 67
diff changeset
711 /* Punt if *POFFSET + *PSIZE overflows in HOST_WIDE_INT, the callers don't
kono
parents: 67
diff changeset
712 check for such overflows individually and assume it works. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
713 if (!endpoint_representable_p (*poffset, *psize))
111
kono
parents: 67
diff changeset
714 {
kono
parents: 67
diff changeset
715 *poffset = 0;
kono
parents: 67
diff changeset
716 *psize = -1;
kono
parents: 67
diff changeset
717 *pmax_size = -1;
kono
parents: 67
diff changeset
718
kono
parents: 67
diff changeset
719 return exp;
kono
parents: 67
diff changeset
720 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
721
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
722 return exp;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
724
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 /* Like get_ref_base_and_extent, but for cases in which we only care
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 about constant-width accesses at constant offsets. Return null
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727 if the access is anything else. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729 tree
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
730 get_ref_base_and_extent_hwi (tree exp, HOST_WIDE_INT *poffset,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731 HOST_WIDE_INT *psize, bool *preverse)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
732 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
733 poly_int64 offset, size, max_size;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
734 HOST_WIDE_INT const_offset, const_size;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
735 bool reverse;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
736 tree decl = get_ref_base_and_extent (exp, &offset, &size, &max_size,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
737 &reverse);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
738 if (!offset.is_constant (&const_offset)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
739 || !size.is_constant (&const_size)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
740 || const_offset < 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
741 || !known_size_p (max_size)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
742 || maybe_ne (max_size, const_size))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
743 return NULL_TREE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
744
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
745 *poffset = const_offset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
746 *psize = const_size;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
747 *preverse = reverse;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
748 return decl;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
749 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
750
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
751 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
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
752 denotes the starting address of the memory access EXP.
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
753 Returns NULL_TREE if the offset is not constant or any component
111
kono
parents: 67
diff changeset
754 is not BITS_PER_UNIT-aligned.
kono
parents: 67
diff changeset
755 VALUEIZE if non-NULL is used to valueize SSA names. It should return
kono
parents: 67
diff changeset
756 its argument or a constant if the argument is known to be constant. */
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
757
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
758 tree
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
759 get_addr_base_and_unit_offset_1 (tree exp, poly_int64_pod *poffset,
111
kono
parents: 67
diff changeset
760 tree (*valueize) (tree))
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
761 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
762 poly_int64 byte_offset = 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
763
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
764 /* Compute cumulative byte-offset for nested component-refs and array-refs,
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
765 and find the ultimate containing object. */
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
766 while (1)
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
767 {
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
768 switch (TREE_CODE (exp))
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
769 {
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
770 case BIT_FIELD_REF:
111
kono
parents: 67
diff changeset
771 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
772 poly_int64 this_byte_offset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
773 poly_uint64 this_bit_offset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774 if (!poly_int_tree_p (TREE_OPERAND (exp, 2), &this_bit_offset)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
775 || !multiple_p (this_bit_offset, BITS_PER_UNIT,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
776 &this_byte_offset))
111
kono
parents: 67
diff changeset
777 return NULL_TREE;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
778 byte_offset += this_byte_offset;
111
kono
parents: 67
diff changeset
779 }
kono
parents: 67
diff changeset
780 break;
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
781
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
782 case COMPONENT_REF:
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
783 {
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
784 tree field = TREE_OPERAND (exp, 1);
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
785 tree this_offset = component_ref_field_offset (exp);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 poly_int64 hthis_offset;
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
787
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
788 if (!this_offset
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
789 || !poly_int_tree_p (this_offset, &hthis_offset)
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
790 || (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
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
791 % BITS_PER_UNIT))
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
792 return NULL_TREE;
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
793
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
794 hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
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
795 / BITS_PER_UNIT);
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
796 byte_offset += hthis_offset;
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
797 }
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
798 break;
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
799
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
800 case ARRAY_REF:
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
801 case ARRAY_RANGE_REF:
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
802 {
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
803 tree index = TREE_OPERAND (exp, 1);
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
804 tree low_bound, unit_size;
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
805
111
kono
parents: 67
diff changeset
806 if (valueize
kono
parents: 67
diff changeset
807 && TREE_CODE (index) == SSA_NAME)
kono
parents: 67
diff changeset
808 index = (*valueize) (index);
kono
parents: 67
diff changeset
809
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
810 /* If the resulting bit-offset is constant, track it. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
811 if (poly_int_tree_p (index)
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
812 && (low_bound = array_ref_low_bound (exp),
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
813 poly_int_tree_p (low_bound))
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
814 && (unit_size = array_ref_element_size (exp),
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
815 TREE_CODE (unit_size) == INTEGER_CST))
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
816 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
817 poly_offset_int woffset
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
818 = wi::sext (wi::to_poly_offset (index)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
819 - wi::to_poly_offset (low_bound),
111
kono
parents: 67
diff changeset
820 TYPE_PRECISION (TREE_TYPE (index)));
kono
parents: 67
diff changeset
821 woffset *= wi::to_offset (unit_size);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
822 byte_offset += woffset.force_shwi ();
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
823 }
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
824 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
825 return NULL_TREE;
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
826 }
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
827 break;
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
828
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
829 case REALPART_EXPR:
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
830 break;
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
831
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
832 case IMAGPART_EXPR:
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
833 byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
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
834 break;
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
835
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
836 case VIEW_CONVERT_EXPR:
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
837 break;
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
838
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
839 case MEM_REF:
111
kono
parents: 67
diff changeset
840 {
kono
parents: 67
diff changeset
841 tree base = TREE_OPERAND (exp, 0);
kono
parents: 67
diff changeset
842 if (valueize
kono
parents: 67
diff changeset
843 && TREE_CODE (base) == SSA_NAME)
kono
parents: 67
diff changeset
844 base = (*valueize) (base);
kono
parents: 67
diff changeset
845
kono
parents: 67
diff changeset
846 /* Hand back the decl for MEM[&decl, off]. */
kono
parents: 67
diff changeset
847 if (TREE_CODE (base) == ADDR_EXPR)
kono
parents: 67
diff changeset
848 {
kono
parents: 67
diff changeset
849 if (!integer_zerop (TREE_OPERAND (exp, 1)))
kono
parents: 67
diff changeset
850 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
851 poly_offset_int off = mem_ref_offset (exp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
852 byte_offset += off.force_shwi ();
111
kono
parents: 67
diff changeset
853 }
kono
parents: 67
diff changeset
854 exp = TREE_OPERAND (base, 0);
kono
parents: 67
diff changeset
855 }
kono
parents: 67
diff changeset
856 goto done;
kono
parents: 67
diff changeset
857 }
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
858
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 case TARGET_MEM_REF:
111
kono
parents: 67
diff changeset
860 {
kono
parents: 67
diff changeset
861 tree base = TREE_OPERAND (exp, 0);
kono
parents: 67
diff changeset
862 if (valueize
kono
parents: 67
diff changeset
863 && TREE_CODE (base) == SSA_NAME)
kono
parents: 67
diff changeset
864 base = (*valueize) (base);
kono
parents: 67
diff changeset
865
kono
parents: 67
diff changeset
866 /* Hand back the decl for MEM[&decl, off]. */
kono
parents: 67
diff changeset
867 if (TREE_CODE (base) == ADDR_EXPR)
kono
parents: 67
diff changeset
868 {
kono
parents: 67
diff changeset
869 if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
kono
parents: 67
diff changeset
870 return NULL_TREE;
kono
parents: 67
diff changeset
871 if (!integer_zerop (TMR_OFFSET (exp)))
kono
parents: 67
diff changeset
872 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
873 poly_offset_int off = mem_ref_offset (exp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
874 byte_offset += off.force_shwi ();
111
kono
parents: 67
diff changeset
875 }
kono
parents: 67
diff changeset
876 exp = TREE_OPERAND (base, 0);
kono
parents: 67
diff changeset
877 }
kono
parents: 67
diff changeset
878 goto done;
kono
parents: 67
diff changeset
879 }
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
880
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
881 default:
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
882 goto done;
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
883 }
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
884
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
885 exp = TREE_OPERAND (exp, 0);
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
886 }
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
887 done:
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
888
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
889 *poffset = byte_offset;
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
890 return exp;
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
891 }
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
892
111
kono
parents: 67
diff changeset
893 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
kono
parents: 67
diff changeset
894 denotes the starting address of the memory access EXP.
kono
parents: 67
diff changeset
895 Returns NULL_TREE if the offset is not constant or any component
kono
parents: 67
diff changeset
896 is not BITS_PER_UNIT-aligned. */
kono
parents: 67
diff changeset
897
kono
parents: 67
diff changeset
898 tree
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
899 get_addr_base_and_unit_offset (tree exp, poly_int64_pod *poffset)
111
kono
parents: 67
diff changeset
900 {
kono
parents: 67
diff changeset
901 return get_addr_base_and_unit_offset_1 (exp, poffset, NULL);
kono
parents: 67
diff changeset
902 }
kono
parents: 67
diff changeset
903
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
904 /* Returns true if STMT references an SSA_NAME that has
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
905 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
906
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
907 bool
111
kono
parents: 67
diff changeset
908 stmt_references_abnormal_ssa_name (gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
909 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
910 ssa_op_iter oi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
911 use_operand_p use_p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
912
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
913 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
914 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
915 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
916 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
918
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
919 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
920 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
921
111
kono
parents: 67
diff changeset
922 /* If STMT takes any abnormal PHI values as input, replace them with
kono
parents: 67
diff changeset
923 local copies. */
kono
parents: 67
diff changeset
924
kono
parents: 67
diff changeset
925 void
kono
parents: 67
diff changeset
926 replace_abnormal_ssa_names (gimple *stmt)
kono
parents: 67
diff changeset
927 {
kono
parents: 67
diff changeset
928 ssa_op_iter oi;
kono
parents: 67
diff changeset
929 use_operand_p use_p;
kono
parents: 67
diff changeset
930
kono
parents: 67
diff changeset
931 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
kono
parents: 67
diff changeset
932 {
kono
parents: 67
diff changeset
933 tree op = USE_FROM_PTR (use_p);
kono
parents: 67
diff changeset
934 if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
kono
parents: 67
diff changeset
935 {
kono
parents: 67
diff changeset
936 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
kono
parents: 67
diff changeset
937 tree new_name = make_ssa_name (TREE_TYPE (op));
kono
parents: 67
diff changeset
938 gassign *assign = gimple_build_assign (new_name, op);
kono
parents: 67
diff changeset
939 gsi_insert_before (&gsi, assign, GSI_SAME_STMT);
kono
parents: 67
diff changeset
940 SET_USE (use_p, new_name);
kono
parents: 67
diff changeset
941 }
kono
parents: 67
diff changeset
942 }
kono
parents: 67
diff changeset
943 }
kono
parents: 67
diff changeset
944
kono
parents: 67
diff changeset
945 /* Pair of tree and a sorting index, for dump_enumerated_decls. */
kono
parents: 67
diff changeset
946 struct GTY(()) numbered_tree
kono
parents: 67
diff changeset
947 {
kono
parents: 67
diff changeset
948 tree t;
kono
parents: 67
diff changeset
949 int num;
kono
parents: 67
diff changeset
950 };
kono
parents: 67
diff changeset
951
kono
parents: 67
diff changeset
952
kono
parents: 67
diff changeset
953 /* Compare two declarations references by their DECL_UID / sequence number.
kono
parents: 67
diff changeset
954 Called via qsort. */
kono
parents: 67
diff changeset
955
kono
parents: 67
diff changeset
956 static int
kono
parents: 67
diff changeset
957 compare_decls_by_uid (const void *pa, const void *pb)
kono
parents: 67
diff changeset
958 {
kono
parents: 67
diff changeset
959 const numbered_tree *nt_a = ((const numbered_tree *)pa);
kono
parents: 67
diff changeset
960 const numbered_tree *nt_b = ((const numbered_tree *)pb);
kono
parents: 67
diff changeset
961
kono
parents: 67
diff changeset
962 if (DECL_UID (nt_a->t) != DECL_UID (nt_b->t))
kono
parents: 67
diff changeset
963 return DECL_UID (nt_a->t) - DECL_UID (nt_b->t);
kono
parents: 67
diff changeset
964 return nt_a->num - nt_b->num;
kono
parents: 67
diff changeset
965 }
kono
parents: 67
diff changeset
966
kono
parents: 67
diff changeset
967 /* Called via walk_gimple_stmt / walk_gimple_op by dump_enumerated_decls. */
kono
parents: 67
diff changeset
968 static tree
kono
parents: 67
diff changeset
969 dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
kono
parents: 67
diff changeset
970 {
kono
parents: 67
diff changeset
971 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
kono
parents: 67
diff changeset
972 vec<numbered_tree> *list = (vec<numbered_tree> *) wi->info;
kono
parents: 67
diff changeset
973 numbered_tree nt;
kono
parents: 67
diff changeset
974
kono
parents: 67
diff changeset
975 if (!DECL_P (*tp))
kono
parents: 67
diff changeset
976 return NULL_TREE;
kono
parents: 67
diff changeset
977 nt.t = *tp;
kono
parents: 67
diff changeset
978 nt.num = list->length ();
kono
parents: 67
diff changeset
979 list->safe_push (nt);
kono
parents: 67
diff changeset
980 *walk_subtrees = 0;
kono
parents: 67
diff changeset
981 return NULL_TREE;
kono
parents: 67
diff changeset
982 }
kono
parents: 67
diff changeset
983
kono
parents: 67
diff changeset
984 /* Find all the declarations used by the current function, sort them by uid,
kono
parents: 67
diff changeset
985 and emit the sorted list. Each declaration is tagged with a sequence
kono
parents: 67
diff changeset
986 number indicating when it was found during statement / tree walking,
kono
parents: 67
diff changeset
987 so that TDF_NOUID comparisons of anonymous declarations are still
kono
parents: 67
diff changeset
988 meaningful. Where a declaration was encountered more than once, we
kono
parents: 67
diff changeset
989 emit only the sequence number of the first encounter.
kono
parents: 67
diff changeset
990 FILE is the dump file where to output the list and FLAGS is as in
kono
parents: 67
diff changeset
991 print_generic_expr. */
kono
parents: 67
diff changeset
992 void
kono
parents: 67
diff changeset
993 dump_enumerated_decls (FILE *file, dump_flags_t flags)
kono
parents: 67
diff changeset
994 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
995 if (!cfun->cfg)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997
111
kono
parents: 67
diff changeset
998 basic_block bb;
kono
parents: 67
diff changeset
999 struct walk_stmt_info wi;
kono
parents: 67
diff changeset
1000 auto_vec<numbered_tree, 40> decl_list;
kono
parents: 67
diff changeset
1001
kono
parents: 67
diff changeset
1002 memset (&wi, '\0', sizeof (wi));
kono
parents: 67
diff changeset
1003 wi.info = (void *) &decl_list;
kono
parents: 67
diff changeset
1004 FOR_EACH_BB_FN (bb, cfun)
kono
parents: 67
diff changeset
1005 {
kono
parents: 67
diff changeset
1006 gimple_stmt_iterator gsi;
kono
parents: 67
diff changeset
1007
kono
parents: 67
diff changeset
1008 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
kono
parents: 67
diff changeset
1009 if (!is_gimple_debug (gsi_stmt (gsi)))
kono
parents: 67
diff changeset
1010 walk_gimple_stmt (&gsi, NULL, dump_enumerated_decls_push, &wi);
kono
parents: 67
diff changeset
1011 }
kono
parents: 67
diff changeset
1012 decl_list.qsort (compare_decls_by_uid);
kono
parents: 67
diff changeset
1013 if (decl_list.length ())
kono
parents: 67
diff changeset
1014 {
kono
parents: 67
diff changeset
1015 unsigned ix;
kono
parents: 67
diff changeset
1016 numbered_tree *ntp;
kono
parents: 67
diff changeset
1017 tree last = NULL_TREE;
kono
parents: 67
diff changeset
1018
kono
parents: 67
diff changeset
1019 fprintf (file, "Declarations used by %s, sorted by DECL_UID:\n",
kono
parents: 67
diff changeset
1020 current_function_name ());
kono
parents: 67
diff changeset
1021 FOR_EACH_VEC_ELT (decl_list, ix, ntp)
kono
parents: 67
diff changeset
1022 {
kono
parents: 67
diff changeset
1023 if (ntp->t == last)
kono
parents: 67
diff changeset
1024 continue;
kono
parents: 67
diff changeset
1025 fprintf (file, "%d: ", ntp->num);
kono
parents: 67
diff changeset
1026 print_generic_decl (file, ntp->t, flags);
kono
parents: 67
diff changeset
1027 fprintf (file, "\n");
kono
parents: 67
diff changeset
1028 last = ntp->t;
kono
parents: 67
diff changeset
1029 }
kono
parents: 67
diff changeset
1030 }
kono
parents: 67
diff changeset
1031 }