00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "system.h"
00023 #include "coretypes.h"
00024 #include "tm.h"
00025 #include "tree.h"
00026 #include "varray.h"
00027 #include "ggc.h"
00028 #include "tree-flow.h"
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 varray_type ssa_names;
00063
00064
00065 static bitmap ssa_names_to_rewrite;
00066
00067
00068
00069 static GTY (()) tree free_ssanames;
00070
00071
00072
00073 #define UNUSED_NAME_VERSION 0
00074
00075 #ifdef GATHER_STATISTICS
00076 unsigned int ssa_name_nodes_reused;
00077 unsigned int ssa_name_nodes_created;
00078 #endif
00079
00080
00081
00082 bool
00083 marked_for_rewrite_p (tree var)
00084 {
00085 return bitmap_bit_p (ssa_names_to_rewrite, SSA_NAME_VERSION (var));
00086 }
00087
00088
00089
00090 bool
00091 any_marked_for_rewrite_p (void)
00092 {
00093 if (!ssa_names_to_rewrite)
00094 return false;
00095
00096 return !bitmap_empty_p (ssa_names_to_rewrite);
00097 }
00098
00099
00100
00101 void
00102 mark_for_rewrite (tree var)
00103 {
00104 bitmap_set_bit (ssa_names_to_rewrite, SSA_NAME_VERSION (var));
00105 }
00106
00107
00108
00109 void
00110 unmark_all_for_rewrite (void)
00111 {
00112 bitmap_clear (ssa_names_to_rewrite);
00113 }
00114
00115
00116
00117
00118 bitmap
00119 marked_ssa_names (void)
00120 {
00121 bitmap ret = BITMAP_ALLOC (NULL);
00122
00123 bitmap_copy (ret, ssa_names_to_rewrite);
00124
00125 return ret;
00126 }
00127
00128
00129
00130 void
00131 init_ssanames (void)
00132 {
00133 VARRAY_TREE_INIT (ssa_names, 50, "ssa_names table");
00134
00135
00136
00137
00138
00139 VARRAY_PUSH_TREE (ssa_names, NULL_TREE);
00140 free_ssanames = NULL;
00141 ssa_names_to_rewrite = BITMAP_ALLOC (NULL);
00142 }
00143
00144
00145
00146 void
00147 fini_ssanames (void)
00148 {
00149 BITMAP_FREE (ssa_names_to_rewrite);
00150 ggc_free (ssa_names);
00151 ssa_names = NULL;
00152 free_ssanames = NULL;
00153 }
00154
00155
00156
00157 #ifdef GATHER_STATISTICS
00158 void
00159 ssanames_print_statistics (void)
00160 {
00161 fprintf (stderr, "SSA_NAME nodes allocated: %u\n", ssa_name_nodes_created);
00162 fprintf (stderr, "SSA_NAME nodes reused: %u\n", ssa_name_nodes_reused);
00163 }
00164 #endif
00165
00166
00167
00168
00169
00170
00171 tree
00172 make_ssa_name (tree var, tree stmt)
00173 {
00174 tree t;
00175
00176 gcc_assert (DECL_P (var)
00177 || TREE_CODE (var) == INDIRECT_REF);
00178
00179 gcc_assert (!stmt || EXPR_P (stmt) || TREE_CODE (stmt) == PHI_NODE);
00180
00181
00182 if (free_ssanames)
00183 {
00184 t = free_ssanames;
00185 free_ssanames = TREE_CHAIN (free_ssanames);
00186 #ifdef GATHER_STATISTICS
00187 ssa_name_nodes_reused++;
00188 #endif
00189
00190
00191
00192 gcc_assert (ssa_name (SSA_NAME_VERSION (t)) == NULL);
00193 VARRAY_TREE (ssa_names, SSA_NAME_VERSION (t)) = t;
00194 }
00195 else
00196 {
00197 t = make_node (SSA_NAME);
00198 SSA_NAME_VERSION (t) = num_ssa_names;
00199 VARRAY_PUSH_TREE (ssa_names, t);
00200 #ifdef GATHER_STATISTICS
00201 ssa_name_nodes_created++;
00202 #endif
00203 }
00204
00205 TREE_TYPE (t) = TREE_TYPE (var);
00206 SSA_NAME_VAR (t) = var;
00207 SSA_NAME_DEF_STMT (t) = stmt;
00208 SSA_NAME_PTR_INFO (t) = NULL;
00209 SSA_NAME_IN_FREE_LIST (t) = 0;
00210
00211 return t;
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 void
00224 release_ssa_name (tree var)
00225 {
00226 if (!var)
00227 return;
00228
00229
00230
00231 if (var == var_ann (SSA_NAME_VAR (var))->default_def)
00232 return;
00233
00234
00235
00236
00237 if (marked_for_rewrite_p (var))
00238 return;
00239
00240
00241
00242
00243
00244
00245
00246
00247 if (! SSA_NAME_IN_FREE_LIST (var))
00248 {
00249 tree saved_ssa_name_var = SSA_NAME_VAR (var);
00250 int saved_ssa_name_version = SSA_NAME_VERSION (var);
00251
00252 VARRAY_TREE (ssa_names, SSA_NAME_VERSION (var)) = NULL;
00253 memset (var, 0, tree_size (var));
00254
00255
00256
00257 TREE_SET_CODE (var, SSA_NAME);
00258
00259
00260 SSA_NAME_VERSION (var) = saved_ssa_name_version;
00261
00262
00263
00264 SSA_NAME_VAR (var) = saved_ssa_name_var;
00265
00266
00267 SSA_NAME_IN_FREE_LIST (var) = 1;
00268
00269
00270 TREE_CHAIN (var) = free_ssanames;
00271 free_ssanames = var;
00272 }
00273 }
00274
00275
00276
00277 tree
00278 duplicate_ssa_name (tree name, tree stmt)
00279 {
00280 tree new_name = make_ssa_name (SSA_NAME_VAR (name), stmt);
00281 struct ptr_info_def *old_ptr_info = SSA_NAME_PTR_INFO (name);
00282 struct ptr_info_def *new_ptr_info;
00283
00284 if (!old_ptr_info)
00285 return new_name;
00286
00287 new_ptr_info = ggc_alloc (sizeof (struct ptr_info_def));
00288 *new_ptr_info = *old_ptr_info;
00289
00290 if (old_ptr_info->pt_vars)
00291 {
00292 new_ptr_info->pt_vars = BITMAP_GGC_ALLOC ();
00293 bitmap_copy (new_ptr_info->pt_vars, old_ptr_info->pt_vars);
00294 }
00295
00296 SSA_NAME_PTR_INFO (new_name) = new_ptr_info;
00297 return new_name;
00298 }
00299
00300
00301
00302
00303 void
00304 release_defs (tree stmt)
00305 {
00306 tree def;
00307 ssa_op_iter iter;
00308
00309 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
00310 if (TREE_CODE (def) == SSA_NAME)
00311 release_ssa_name (def);
00312 }
00313
00314
00315
00316
00317 void
00318 replace_ssa_name_symbol (tree ssa_name, tree sym)
00319 {
00320 SSA_NAME_VAR (ssa_name) = sym;
00321 TREE_TYPE (ssa_name) = TREE_TYPE (sym);
00322 }
00323
00324 #include "gt-tree-ssanames.h"