1 1.1 mrg /* Routines for performing Temporary Expression Replacement (TER) in SSA trees. 2 1.1 mrg Copyright (C) 2003-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Andrew MacLeod <amacleod (at) redhat.com> 4 1.1 mrg 5 1.1 mrg This file is part of GCC. 6 1.1 mrg 7 1.1 mrg GCC is free software; you can redistribute it and/or modify 8 1.1 mrg it under the terms of the GNU General Public License as published by 9 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 10 1.1 mrg any later version. 11 1.1 mrg 12 1.1 mrg GCC is distributed in the hope that it will be useful, 13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 mrg GNU General Public License for more details. 16 1.1 mrg 17 1.1 mrg You should have received a copy of the GNU General Public License 18 1.1 mrg along with GCC; see the file COPYING3. If not see 19 1.1 mrg <http://www.gnu.org/licenses/>. */ 20 1.1 mrg 21 1.1 mrg 22 1.1 mrg #include "config.h" 23 1.1 mrg #include "system.h" 24 1.1 mrg #include "coretypes.h" 25 1.1 mrg #include "backend.h" 26 1.1 mrg #include "tree.h" 27 1.1 mrg #include "gimple.h" 28 1.1 mrg #include "ssa.h" 29 1.1 mrg #include "gimple-pretty-print.h" 30 1.1 mrg #include "gimple-iterator.h" 31 1.1 mrg #include "dumpfile.h" 32 1.1 mrg #include "tree-ssa-live.h" 33 1.1 mrg #include "tree-ssa-ter.h" 34 1.1 mrg #include "tree-outof-ssa.h" 35 1.1 mrg #include "gimple-walk.h" 36 1.1 mrg 37 1.1 mrg 38 1.1 mrg /* Temporary Expression Replacement (TER) 39 1.1 mrg 40 1.1 mrg Replace SSA version variables during out-of-ssa with their defining 41 1.1 mrg expression if there is only one use of the variable. 42 1.1 mrg 43 1.1 mrg This pass is required in order for the RTL expansion pass to see larger 44 1.1 mrg chunks of code. This allows it to make better choices on RTL pattern 45 1.1 mrg selection. When expand is rewritten and merged with out-of-ssa, and 46 1.1 mrg understands SSA, this should be eliminated. 47 1.1 mrg 48 1.1 mrg A pass is made through the function, one block at a time. No cross block 49 1.1 mrg information is tracked. 50 1.1 mrg 51 1.1 mrg Variables which only have one use, and whose defining stmt is considered 52 1.1 mrg a replaceable expression (see ssa_is_replaceable_p) are tracked to see whether 53 1.1 mrg they can be replaced at their use location. 54 1.1 mrg 55 1.1 mrg n_12 = C * 10 56 1.1 mrg a_2 = b_5 + 6 57 1.1 mrg v_9 = a_2 * n_12 58 1.1 mrg 59 1.1 mrg if there are the only use of n_12 and a_2, TER will substitute in their 60 1.1 mrg expressions in v_9, and end up with: 61 1.1 mrg 62 1.1 mrg v_9 = (b_5 + 6) * (C * 10) 63 1.1 mrg 64 1.1 mrg which will then have the ssa_name assigned to regular variables, and the 65 1.1 mrg resulting code which will be passed to the expander looks something like: 66 1.1 mrg 67 1.1 mrg v = (b + 6) * (C * 10) 68 1.1 mrg 69 1.1 mrg 70 1.1 mrg This requires ensuring that none of the variables used by the expression 71 1.1 mrg change between the def point and where it is used. Furthermore, if any 72 1.1 mrg of the ssa_names used in this expression are themselves replaceable, we 73 1.1 mrg have to ensure none of that expressions' arguments change either. 74 1.1 mrg Although SSA_NAMES themselves don't change, this pass is performed after 75 1.1 mrg coalescing has coalesced different SSA_NAMES together, so there could be a 76 1.1 mrg definition of an SSA_NAME which is coalesced with a use that causes a 77 1.1 mrg problem, i.e., 78 1.1 mrg 79 1.1 mrg PHI b_5 = <b_8(2), b_14(1)> 80 1.1 mrg <...> 81 1.1 mrg a_2 = b_5 + 6 82 1.1 mrg b_8 = c_4 + 4 83 1.1 mrg v_9 = a_2 * n_12 84 1.1 mrg <...> 85 1.1 mrg 86 1.1 mrg If b_5, b_8 and b_14 are all coalesced together... 87 1.1 mrg The expression b_5 + 6 CANNOT replace the use in the statement defining v_9 88 1.1 mrg because b_8 is in fact killing the value of b_5 since they share a partition 89 1.1 mrg and will be assigned the same memory or register location. 90 1.1 mrg 91 1.1 mrg TER implements this but stepping through the instructions in a block and 92 1.1 mrg tracking potential expressions for replacement, and the partitions they are 93 1.1 mrg dependent on. Expressions are represented by the SSA_NAME_VERSION of the 94 1.1 mrg DEF on the LHS of a GIMPLE_ASSIGN and the expression is the RHS. 95 1.1 mrg 96 1.1 mrg When a stmt is determined to be a possible replacement expression, the 97 1.1 mrg following steps are taken: 98 1.1 mrg 99 1.1 mrg EXPR_DECL_UID bitmap is allocated and set to the base variable UID of the 100 1.1 mrg def and any uses in the expression. non-NULL means the expression is being 101 1.1 mrg tracked. The UID's themselves are used to prevent TER substitution into 102 1.1 mrg accumulating sequences, i.e., 103 1.1 mrg 104 1.1 mrg x = x + y 105 1.1 mrg x = x + z 106 1.1 mrg x = x + w 107 1.1 mrg etc. 108 1.1 mrg this can result in very large expressions which don't accomplish anything 109 1.1 mrg see PR tree-optimization/17549. 110 1.1 mrg 111 1.1 mrg PARTITION_DEPENDENCIES is another bitmap array, and it has a bit set for any 112 1.1 mrg partition which is used in the expression. This is primarily used to remove 113 1.1 mrg an expression from the partition kill lists when a decision is made whether 114 1.1 mrg to replace it or not. This is indexed by ssa version number as well, and 115 1.1 mrg indicates a partition number. virtual operands are not tracked individually, 116 1.1 mrg but they are summarized by an artificial partition called VIRTUAL_PARTITION. 117 1.1 mrg This means a MAY or MUST def will kill *ALL* expressions that are dependent 118 1.1 mrg on a virtual operand. 119 1.1 mrg Note that the EXPR_DECL_UID and this bitmap represent very similar 120 1.1 mrg information, but the info in one is not easy to obtain from the other. 121 1.1 mrg 122 1.1 mrg KILL_LIST is yet another bitmap array, this time it is indexed by partition 123 1.1 mrg number, and represents a list of active expressions which will no 124 1.1 mrg longer be valid if a definition into this partition takes place. 125 1.1 mrg 126 1.1 mrg PARTITION_IN_USE is simply a bitmap which is used to track which partitions 127 1.1 mrg currently have something in their kill list. This is used at the end of 128 1.1 mrg a block to clear out the KILL_LIST bitmaps at the end of each block. 129 1.1 mrg 130 1.1 mrg NEW_REPLACEABLE_DEPENDENCIES is used as a temporary place to store 131 1.1 mrg dependencies which will be reused by the current definition. All the uses 132 1.1 mrg on an expression are processed before anything else is done. If a use is 133 1.1 mrg determined to be a replaceable expression AND the current stmt is also going 134 1.1 mrg to be replaceable, all the dependencies of this replaceable use will be 135 1.1 mrg picked up by the current stmt's expression. Rather than recreate them, they 136 1.1 mrg are simply copied here and then copied into the new expression when it is 137 1.1 mrg processed. 138 1.1 mrg 139 1.1 mrg a_2 = b_5 + 6 140 1.1 mrg v_8 = a_2 + c_4 141 1.1 mrg 142 1.1 mrg a_2's expression 'b_5 + 6' is determined to be replaceable at the use 143 1.1 mrg location. It is dependent on the partition 'b_5' is in. This is cached into 144 1.1 mrg the NEW_REPLACEABLE_DEPENDENCIES bitmap, and when v_8 is examined for 145 1.1 mrg replaceability, it is a candidate, and it is dependent on the partition 146 1.1 mrg b_5 is in *NOT* a_2, as well as c_4's partition. 147 1.1 mrg 148 1.1 mrg if v_8 is also replaceable: 149 1.1 mrg 150 1.1 mrg x_9 = v_8 * 5 151 1.1 mrg 152 1.1 mrg x_9 is dependent on partitions b_5, and c_4 153 1.1 mrg 154 1.1 mrg if a statement is found which has either of those partitions written to 155 1.1 mrg before x_9 is used, then x_9 itself is NOT replaceable. */ 156 1.1 mrg 157 1.1 mrg 158 1.1 mrg /* Temporary Expression Replacement (TER) table information. */ 159 1.1 mrg 160 1.1 mrg struct temp_expr_table 161 1.1 mrg { 162 1.1 mrg var_map map; 163 1.1 mrg bitmap *partition_dependencies; /* Partitions expr is dependent on. */ 164 1.1 mrg bitmap replaceable_expressions; /* Replacement expression table. */ 165 1.1 mrg bitmap *expr_decl_uids; /* Base uids of exprs. */ 166 1.1 mrg bitmap *kill_list; /* Expr's killed by a partition. */ 167 1.1 mrg int virtual_partition; /* Pseudo partition for virtual ops. */ 168 1.1 mrg bitmap partition_in_use; /* Partitions with kill entries. */ 169 1.1 mrg bitmap new_replaceable_dependencies; /* Holding place for pending dep's. */ 170 1.1 mrg int *num_in_part; /* # of ssa_names in a partition. */ 171 1.1 mrg int *call_cnt; /* Call count at definition. */ 172 1.1 mrg int *reg_vars_cnt; /* Number of register variable 173 1.1 mrg definitions encountered. */ 174 1.1 mrg }; 175 1.1 mrg 176 1.1 mrg /* Used to indicate a dependency on VDEFs. */ 177 1.1 mrg #define VIRTUAL_PARTITION(table) (table->virtual_partition) 178 1.1 mrg 179 1.1 mrg /* A place for the many, many bitmaps we create. */ 180 1.1 mrg static bitmap_obstack ter_bitmap_obstack; 181 1.1 mrg 182 1.1 mrg extern void debug_ter (FILE *, temp_expr_table *); 183 1.1 mrg 184 1.1 mrg 185 1.1 mrg /* Create a new TER table for MAP. */ 186 1.1 mrg 187 1.1 mrg static temp_expr_table * 188 1.1 mrg new_temp_expr_table (var_map map) 189 1.1 mrg { 190 1.1 mrg temp_expr_table *t = XNEW (struct temp_expr_table); 191 1.1 mrg t->map = map; 192 1.1 mrg 193 1.1 mrg t->partition_dependencies = XCNEWVEC (bitmap, num_ssa_names + 1); 194 1.1 mrg t->expr_decl_uids = XCNEWVEC (bitmap, num_ssa_names + 1); 195 1.1 mrg t->kill_list = XCNEWVEC (bitmap, num_var_partitions (map) + 1); 196 1.1 mrg 197 1.1 mrg t->partition_in_use = BITMAP_ALLOC (&ter_bitmap_obstack); 198 1.1 mrg 199 1.1 mrg t->virtual_partition = num_var_partitions (map); 200 1.1 mrg t->new_replaceable_dependencies = BITMAP_ALLOC (&ter_bitmap_obstack); 201 1.1 mrg 202 1.1 mrg t->replaceable_expressions = NULL; 203 1.1 mrg t->num_in_part = XCNEWVEC (int, num_var_partitions (map)); 204 1.1 mrg 205 1.1 mrg unsigned x; 206 1.1 mrg tree name; 207 1.1 mrg 208 1.1 mrg FOR_EACH_SSA_NAME (x, name, cfun) 209 1.1 mrg { 210 1.1 mrg int p; 211 1.1 mrg p = var_to_partition (map, name); 212 1.1 mrg if (p != NO_PARTITION) 213 1.1 mrg t->num_in_part[p]++; 214 1.1 mrg } 215 1.1 mrg t->call_cnt = XCNEWVEC (int, num_ssa_names + 1); 216 1.1 mrg t->reg_vars_cnt = XCNEWVEC (int, num_ssa_names + 1); 217 1.1 mrg 218 1.1 mrg return t; 219 1.1 mrg } 220 1.1 mrg 221 1.1 mrg 222 1.1 mrg /* Free TER table T. If there are valid replacements, return the expression 223 1.1 mrg vector. */ 224 1.1 mrg 225 1.1 mrg static bitmap 226 1.1 mrg free_temp_expr_table (temp_expr_table *t) 227 1.1 mrg { 228 1.1 mrg bitmap ret = NULL; 229 1.1 mrg 230 1.1 mrg if (flag_checking) 231 1.1 mrg { 232 1.1 mrg for (unsigned x = 0; x <= num_var_partitions (t->map); x++) 233 1.1 mrg gcc_assert (!t->kill_list[x]); 234 1.1 mrg for (unsigned x = 0; x < num_ssa_names; x++) 235 1.1 mrg { 236 1.1 mrg gcc_assert (t->expr_decl_uids[x] == NULL); 237 1.1 mrg gcc_assert (t->partition_dependencies[x] == NULL); 238 1.1 mrg } 239 1.1 mrg } 240 1.1 mrg 241 1.1 mrg BITMAP_FREE (t->partition_in_use); 242 1.1 mrg BITMAP_FREE (t->new_replaceable_dependencies); 243 1.1 mrg 244 1.1 mrg free (t->expr_decl_uids); 245 1.1 mrg free (t->kill_list); 246 1.1 mrg free (t->partition_dependencies); 247 1.1 mrg free (t->num_in_part); 248 1.1 mrg free (t->call_cnt); 249 1.1 mrg free (t->reg_vars_cnt); 250 1.1 mrg 251 1.1 mrg if (t->replaceable_expressions) 252 1.1 mrg ret = t->replaceable_expressions; 253 1.1 mrg 254 1.1 mrg free (t); 255 1.1 mrg return ret; 256 1.1 mrg } 257 1.1 mrg 258 1.1 mrg 259 1.1 mrg /* Return TRUE if VERSION is to be replaced by an expression in TAB. */ 260 1.1 mrg 261 1.1 mrg static inline bool 262 1.1 mrg version_to_be_replaced_p (temp_expr_table *tab, int version) 263 1.1 mrg { 264 1.1 mrg if (!tab->replaceable_expressions) 265 1.1 mrg return false; 266 1.1 mrg return bitmap_bit_p (tab->replaceable_expressions, version); 267 1.1 mrg } 268 1.1 mrg 269 1.1 mrg 270 1.1 mrg /* Add partition P to the list if partitions VERSION is dependent on. TAB is 271 1.1 mrg the expression table */ 272 1.1 mrg 273 1.1 mrg static inline void 274 1.1 mrg make_dependent_on_partition (temp_expr_table *tab, int version, int p) 275 1.1 mrg { 276 1.1 mrg if (!tab->partition_dependencies[version]) 277 1.1 mrg tab->partition_dependencies[version] = BITMAP_ALLOC (&ter_bitmap_obstack); 278 1.1 mrg 279 1.1 mrg bitmap_set_bit (tab->partition_dependencies[version], p); 280 1.1 mrg } 281 1.1 mrg 282 1.1 mrg 283 1.1 mrg /* Add VER to the kill list for P. TAB is the expression table */ 284 1.1 mrg 285 1.1 mrg static inline void 286 1.1 mrg add_to_partition_kill_list (temp_expr_table *tab, int p, int ver) 287 1.1 mrg { 288 1.1 mrg if (!tab->kill_list[p]) 289 1.1 mrg { 290 1.1 mrg tab->kill_list[p] = BITMAP_ALLOC (&ter_bitmap_obstack); 291 1.1 mrg bitmap_set_bit (tab->partition_in_use, p); 292 1.1 mrg } 293 1.1 mrg bitmap_set_bit (tab->kill_list[p], ver); 294 1.1 mrg } 295 1.1 mrg 296 1.1 mrg 297 1.1 mrg /* Remove VER from the partition kill list for P. TAB is the expression 298 1.1 mrg table. */ 299 1.1 mrg 300 1.1 mrg static inline void 301 1.1 mrg remove_from_partition_kill_list (temp_expr_table *tab, int p, int version) 302 1.1 mrg { 303 1.1 mrg gcc_checking_assert (tab->kill_list[p]); 304 1.1 mrg bitmap_clear_bit (tab->kill_list[p], version); 305 1.1 mrg if (bitmap_empty_p (tab->kill_list[p])) 306 1.1 mrg { 307 1.1 mrg bitmap_clear_bit (tab->partition_in_use, p); 308 1.1 mrg BITMAP_FREE (tab->kill_list[p]); 309 1.1 mrg } 310 1.1 mrg } 311 1.1 mrg 312 1.1 mrg 313 1.1 mrg /* Add a dependency between the def of ssa VERSION and VAR. If VAR is 314 1.1 mrg replaceable by an expression, add a dependence each of the elements of the 315 1.1 mrg expression. These are contained in the new_replaceable list. TAB is the 316 1.1 mrg expression table. */ 317 1.1 mrg 318 1.1 mrg static void 319 1.1 mrg add_dependence (temp_expr_table *tab, int version, tree var) 320 1.1 mrg { 321 1.1 mrg int i; 322 1.1 mrg bitmap_iterator bi; 323 1.1 mrg unsigned x; 324 1.1 mrg 325 1.1 mrg i = SSA_NAME_VERSION (var); 326 1.1 mrg if (version_to_be_replaced_p (tab, i)) 327 1.1 mrg { 328 1.1 mrg if (!bitmap_empty_p (tab->new_replaceable_dependencies)) 329 1.1 mrg { 330 1.1 mrg /* Version will now be killed by a write to any partition the 331 1.1 mrg substituted expression would have been killed by. */ 332 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (tab->new_replaceable_dependencies, 0, x, bi) 333 1.1 mrg add_to_partition_kill_list (tab, x, version); 334 1.1 mrg 335 1.1 mrg /* Rather than set partition_dependencies and in_use lists bit by 336 1.1 mrg bit, simply OR in the new_replaceable_dependencies bits. */ 337 1.1 mrg if (!tab->partition_dependencies[version]) 338 1.1 mrg tab->partition_dependencies[version] = 339 1.1 mrg BITMAP_ALLOC (&ter_bitmap_obstack); 340 1.1 mrg bitmap_ior_into (tab->partition_dependencies[version], 341 1.1 mrg tab->new_replaceable_dependencies); 342 1.1 mrg bitmap_ior_into (tab->partition_in_use, 343 1.1 mrg tab->new_replaceable_dependencies); 344 1.1 mrg /* It is only necessary to add these once. */ 345 1.1 mrg bitmap_clear (tab->new_replaceable_dependencies); 346 1.1 mrg } 347 1.1 mrg } 348 1.1 mrg else 349 1.1 mrg { 350 1.1 mrg i = var_to_partition (tab->map, var); 351 1.1 mrg gcc_checking_assert (i != NO_PARTITION); 352 1.1 mrg gcc_checking_assert (tab->num_in_part[i] != 0); 353 1.1 mrg /* Only dependencies on ssa_names which are coalesced with something need 354 1.1 mrg to be tracked. Partitions with containing only a single SSA_NAME 355 1.1 mrg *cannot* have their value changed. */ 356 1.1 mrg if (tab->num_in_part[i] > 1) 357 1.1 mrg { 358 1.1 mrg add_to_partition_kill_list (tab, i, version); 359 1.1 mrg make_dependent_on_partition (tab, version, i); 360 1.1 mrg } 361 1.1 mrg } 362 1.1 mrg } 363 1.1 mrg 364 1.1 mrg 365 1.1 mrg /* This function will remove the expression for VERSION from replacement 366 1.1 mrg consideration in table TAB. If FREE_EXPR is true, then remove the 367 1.1 mrg expression from consideration as well by freeing the decl uid bitmap. */ 368 1.1 mrg 369 1.1 mrg static void 370 1.1 mrg finished_with_expr (temp_expr_table *tab, int version, bool free_expr) 371 1.1 mrg { 372 1.1 mrg unsigned i; 373 1.1 mrg bitmap_iterator bi; 374 1.1 mrg 375 1.1 mrg /* Remove this expression from its dependent lists. The partition dependence 376 1.1 mrg list is retained and transferred later to whomever uses this version. */ 377 1.1 mrg if (tab->partition_dependencies[version]) 378 1.1 mrg { 379 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (tab->partition_dependencies[version], 0, i, bi) 380 1.1 mrg remove_from_partition_kill_list (tab, i, version); 381 1.1 mrg BITMAP_FREE (tab->partition_dependencies[version]); 382 1.1 mrg } 383 1.1 mrg if (free_expr) 384 1.1 mrg BITMAP_FREE (tab->expr_decl_uids[version]); 385 1.1 mrg } 386 1.1 mrg 387 1.1 mrg 388 1.1 mrg /* Return TRUE if expression STMT is suitable for replacement. 389 1.1 mrg In addition to ssa_is_replaceable_p, require the same bb, and for -O0 390 1.1 mrg same locus and same BLOCK), Considers memory loads as replaceable if aliasing 391 1.1 mrg is available. */ 392 1.1 mrg 393 1.1 mrg static inline bool 394 1.1 mrg ter_is_replaceable_p (gimple *stmt) 395 1.1 mrg { 396 1.1 mrg 397 1.1 mrg if (ssa_is_replaceable_p (stmt)) 398 1.1 mrg { 399 1.1 mrg use_operand_p use_p; 400 1.1 mrg tree def; 401 1.1 mrg gimple *use_stmt; 402 1.1 mrg location_t locus1, locus2; 403 1.1 mrg tree block1, block2; 404 1.1 mrg 405 1.1 mrg /* Only consider definitions which have a single use. ssa_is_replaceable_p 406 1.1 mrg already performed this check, but the use stmt pointer is required for 407 1.1 mrg further checks. */ 408 1.1 mrg def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF); 409 1.1 mrg if (!single_imm_use (def, &use_p, &use_stmt)) 410 1.1 mrg return false; 411 1.1 mrg 412 1.1 mrg /* If the use isn't in this block, it wont be replaced either. */ 413 1.1 mrg if (gimple_bb (use_stmt) != gimple_bb (stmt)) 414 1.1 mrg return false; 415 1.1 mrg 416 1.1 mrg locus1 = gimple_location (stmt); 417 1.1 mrg block1 = LOCATION_BLOCK (locus1); 418 1.1 mrg locus1 = LOCATION_LOCUS (locus1); 419 1.1 mrg 420 1.1 mrg if (gphi *phi = dyn_cast <gphi *> (use_stmt)) 421 1.1 mrg locus2 = gimple_phi_arg_location (phi, 422 1.1 mrg PHI_ARG_INDEX_FROM_USE (use_p)); 423 1.1 mrg else 424 1.1 mrg locus2 = gimple_location (use_stmt); 425 1.1 mrg block2 = LOCATION_BLOCK (locus2); 426 1.1 mrg locus2 = LOCATION_LOCUS (locus2); 427 1.1 mrg 428 1.1 mrg if ((!optimize || optimize_debug) 429 1.1 mrg && ((locus1 != UNKNOWN_LOCATION && locus1 != locus2) 430 1.1 mrg || (block1 != NULL_TREE && block1 != block2))) 431 1.1 mrg return false; 432 1.1 mrg 433 1.1 mrg return true; 434 1.1 mrg } 435 1.1 mrg return false; 436 1.1 mrg } 437 1.1 mrg 438 1.1 mrg 439 1.1 mrg /* Create an expression entry for a replaceable expression. */ 440 1.1 mrg 441 1.1 mrg static void 442 1.1 mrg process_replaceable (temp_expr_table *tab, gimple *stmt, int call_cnt, 443 1.1 mrg int reg_vars_cnt) 444 1.1 mrg { 445 1.1 mrg tree var, def, basevar; 446 1.1 mrg int version; 447 1.1 mrg ssa_op_iter iter; 448 1.1 mrg bitmap def_vars, use_vars; 449 1.1 mrg 450 1.1 mrg gcc_checking_assert (ter_is_replaceable_p (stmt)); 451 1.1 mrg 452 1.1 mrg def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF); 453 1.1 mrg version = SSA_NAME_VERSION (def); 454 1.1 mrg def_vars = BITMAP_ALLOC (&ter_bitmap_obstack); 455 1.1 mrg 456 1.1 mrg basevar = SSA_NAME_VAR (def); 457 1.1 mrg if (basevar) 458 1.1 mrg bitmap_set_bit (def_vars, DECL_UID (basevar)); 459 1.1 mrg 460 1.1 mrg /* Add this expression to the dependency list for each use partition. */ 461 1.1 mrg FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE) 462 1.1 mrg { 463 1.1 mrg int var_version = SSA_NAME_VERSION (var); 464 1.1 mrg 465 1.1 mrg use_vars = tab->expr_decl_uids[var_version]; 466 1.1 mrg add_dependence (tab, version, var); 467 1.1 mrg if (use_vars) 468 1.1 mrg { 469 1.1 mrg bitmap_ior_into (def_vars, use_vars); 470 1.1 mrg BITMAP_FREE (tab->expr_decl_uids[var_version]); 471 1.1 mrg } 472 1.1 mrg else if (SSA_NAME_VAR (var)) 473 1.1 mrg bitmap_set_bit (def_vars, DECL_UID (SSA_NAME_VAR (var))); 474 1.1 mrg } 475 1.1 mrg tab->expr_decl_uids[version] = def_vars; 476 1.1 mrg 477 1.1 mrg /* If there are VUSES, add a dependence on virtual defs. */ 478 1.1 mrg if (gimple_vuse (stmt)) 479 1.1 mrg { 480 1.1 mrg make_dependent_on_partition (tab, version, VIRTUAL_PARTITION (tab)); 481 1.1 mrg add_to_partition_kill_list (tab, VIRTUAL_PARTITION (tab), version); 482 1.1 mrg } 483 1.1 mrg 484 1.1 mrg tab->call_cnt[version] = call_cnt; 485 1.1 mrg tab->reg_vars_cnt[version] = reg_vars_cnt; 486 1.1 mrg } 487 1.1 mrg 488 1.1 mrg 489 1.1 mrg /* This function removes any expression in TAB which is dependent on PARTITION 490 1.1 mrg from consideration, making it not replaceable. */ 491 1.1 mrg 492 1.1 mrg static inline void 493 1.1 mrg kill_expr (temp_expr_table *tab, int partition) 494 1.1 mrg { 495 1.1 mrg unsigned version; 496 1.1 mrg 497 1.1 mrg /* Mark every active expr dependent on this var as not replaceable. 498 1.1 mrg finished_with_expr can modify the bitmap, so we can't execute over it. */ 499 1.1 mrg while (tab->kill_list[partition]) 500 1.1 mrg { 501 1.1 mrg version = bitmap_first_set_bit (tab->kill_list[partition]); 502 1.1 mrg finished_with_expr (tab, version, true); 503 1.1 mrg } 504 1.1 mrg 505 1.1 mrg gcc_checking_assert (!tab->kill_list[partition]); 506 1.1 mrg } 507 1.1 mrg 508 1.1 mrg 509 1.1 mrg /* This function kills all expressions in TAB which are dependent on virtual 510 1.1 mrg partitions. */ 511 1.1 mrg 512 1.1 mrg static inline void 513 1.1 mrg kill_virtual_exprs (temp_expr_table *tab) 514 1.1 mrg { 515 1.1 mrg kill_expr (tab, VIRTUAL_PARTITION (tab)); 516 1.1 mrg } 517 1.1 mrg 518 1.1 mrg 519 1.1 mrg /* Mark the expression associated with VAR as replaceable, and enter 520 1.1 mrg the defining stmt into the partition_dependencies table TAB. If 521 1.1 mrg MORE_REPLACING is true, accumulate the pending partition dependencies. */ 522 1.1 mrg 523 1.1 mrg static void 524 1.1 mrg mark_replaceable (temp_expr_table *tab, tree var, bool more_replacing) 525 1.1 mrg { 526 1.1 mrg int version = SSA_NAME_VERSION (var); 527 1.1 mrg 528 1.1 mrg /* Move the dependence list to the pending listpending. */ 529 1.1 mrg if (more_replacing && tab->partition_dependencies[version]) 530 1.1 mrg bitmap_ior_into (tab->new_replaceable_dependencies, 531 1.1 mrg tab->partition_dependencies[version]); 532 1.1 mrg 533 1.1 mrg finished_with_expr (tab, version, !more_replacing); 534 1.1 mrg 535 1.1 mrg /* Set the replaceable expression. 536 1.1 mrg The bitmap for this "escapes" from this file so it's allocated 537 1.1 mrg on the default obstack. */ 538 1.1 mrg if (!tab->replaceable_expressions) 539 1.1 mrg tab->replaceable_expressions = BITMAP_ALLOC (NULL); 540 1.1 mrg bitmap_set_bit (tab->replaceable_expressions, version); 541 1.1 mrg } 542 1.1 mrg 543 1.1 mrg 544 1.1 mrg /* Helper function for find_ssaname_in_stores. Called via walk_tree to 545 1.1 mrg find a SSA_NAME DATA somewhere in *TP. */ 546 1.1 mrg 547 1.1 mrg static tree 548 1.1 mrg find_ssaname (tree *tp, int *walk_subtrees, void *data) 549 1.1 mrg { 550 1.1 mrg tree var = (tree) data; 551 1.1 mrg if (*tp == var) 552 1.1 mrg return var; 553 1.1 mrg else if (IS_TYPE_OR_DECL_P (*tp)) 554 1.1 mrg *walk_subtrees = 0; 555 1.1 mrg return NULL_TREE; 556 1.1 mrg } 557 1.1 mrg 558 1.1 mrg /* Helper function for find_replaceable_in_bb. Return true if SSA_NAME DATA 559 1.1 mrg is used somewhere in T, which is a store in the statement. Called via 560 1.1 mrg walk_stmt_load_store_addr_ops. */ 561 1.1 mrg 562 1.1 mrg static bool 563 1.1 mrg find_ssaname_in_store (gimple *, tree, tree t, void *data) 564 1.1 mrg { 565 1.1 mrg return walk_tree (&t, find_ssaname, data, NULL) != NULL_TREE; 566 1.1 mrg } 567 1.1 mrg 568 1.1 mrg /* This function processes basic block BB, and looks for variables which can 569 1.1 mrg be replaced by their expressions. Results are stored in the table TAB. */ 570 1.1 mrg 571 1.1 mrg static void 572 1.1 mrg find_replaceable_in_bb (temp_expr_table *tab, basic_block bb) 573 1.1 mrg { 574 1.1 mrg gimple_stmt_iterator bsi; 575 1.1 mrg gimple *stmt; 576 1.1 mrg tree def, use, fndecl; 577 1.1 mrg int partition; 578 1.1 mrg var_map map = tab->map; 579 1.1 mrg ssa_op_iter iter; 580 1.1 mrg bool stmt_replaceable; 581 1.1 mrg int cur_call_cnt = 0; 582 1.1 mrg int cur_reg_vars_cnt = 0; 583 1.1 mrg 584 1.1 mrg for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) 585 1.1 mrg { 586 1.1 mrg stmt = gsi_stmt (bsi); 587 1.1 mrg 588 1.1 mrg if (is_gimple_debug (stmt)) 589 1.1 mrg continue; 590 1.1 mrg 591 1.1 mrg stmt_replaceable = ter_is_replaceable_p (stmt); 592 1.1 mrg 593 1.1 mrg /* Determine if this stmt finishes an existing expression. */ 594 1.1 mrg FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE) 595 1.1 mrg { 596 1.1 mrg unsigned ver = SSA_NAME_VERSION (use); 597 1.1 mrg 598 1.1 mrg /* If this use is a potential replacement variable, process it. */ 599 1.1 mrg if (tab->expr_decl_uids[ver]) 600 1.1 mrg { 601 1.1 mrg bool same_root_var = false; 602 1.1 mrg ssa_op_iter iter2; 603 1.1 mrg bitmap vars = tab->expr_decl_uids[ver]; 604 1.1 mrg 605 1.1 mrg /* See if the root variables are the same. If they are, we 606 1.1 mrg do not want to do the replacement to avoid problems with 607 1.1 mrg code size, see PR tree-optimization/17549. */ 608 1.1 mrg if (!bitmap_empty_p (vars)) 609 1.1 mrg FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter2, SSA_OP_DEF) 610 1.1 mrg { 611 1.1 mrg if (SSA_NAME_VAR (def) 612 1.1 mrg && bitmap_bit_p (vars, DECL_UID (SSA_NAME_VAR (def)))) 613 1.1 mrg { 614 1.1 mrg same_root_var = true; 615 1.1 mrg break; 616 1.1 mrg } 617 1.1 mrg } 618 1.1 mrg 619 1.1 mrg /* If the stmt does a memory store and the replacement 620 1.1 mrg is a load aliasing it avoid creating overlapping 621 1.1 mrg assignments which we cannot expand correctly. */ 622 1.1 mrg if (gimple_vdef (stmt)) 623 1.1 mrg { 624 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (use); 625 1.1 mrg while (is_gimple_assign (def_stmt) 626 1.1 mrg && gimple_assign_rhs_code (def_stmt) == SSA_NAME) 627 1.1 mrg def_stmt 628 1.1 mrg = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (def_stmt)); 629 1.1 mrg if (gimple_vuse (def_stmt) 630 1.1 mrg && gimple_assign_single_p (def_stmt) 631 1.1 mrg && stmt_may_clobber_ref_p (stmt, 632 1.1 mrg gimple_assign_rhs1 (def_stmt))) 633 1.1 mrg { 634 1.1 mrg /* For calls, it is not a problem if USE is among 635 1.1 mrg call's arguments or say OBJ_TYPE_REF argument, 636 1.1 mrg all those necessarily need to be evaluated before 637 1.1 mrg the call that may clobber the memory. But if 638 1.1 mrg LHS of the call refers to USE, expansion might 639 1.1 mrg evaluate it after the call, prevent TER in that 640 1.1 mrg case. 641 1.1 mrg For inline asm, allow TER of loads into input 642 1.1 mrg arguments, but disallow TER for USEs that occur 643 1.1 mrg somewhere in outputs. */ 644 1.1 mrg if (is_gimple_call (stmt) 645 1.1 mrg || gimple_code (stmt) == GIMPLE_ASM) 646 1.1 mrg { 647 1.1 mrg if (walk_stmt_load_store_ops (stmt, use, NULL, 648 1.1 mrg find_ssaname_in_store)) 649 1.1 mrg same_root_var = true; 650 1.1 mrg } 651 1.1 mrg else 652 1.1 mrg same_root_var = true; 653 1.1 mrg } 654 1.1 mrg } 655 1.1 mrg 656 1.1 mrg /* Mark expression as replaceable unless stmt is volatile, or the 657 1.1 mrg def variable has the same root variable as something in the 658 1.1 mrg substitution list, or the def and use span a call such that 659 1.1 mrg we'll expand lifetimes across a call. We also don't want to 660 1.1 mrg replace across these expressions that may call libcalls that 661 1.1 mrg clobber the register involved. See PR 70184. Neither 662 1.1 mrg do we want to move possibly trapping expressions across 663 1.1 mrg a call. See PRs 102129 and 33593. */ 664 1.1 mrg if (gimple_has_volatile_ops (stmt) || same_root_var 665 1.1 mrg || (tab->call_cnt[ver] != cur_call_cnt 666 1.1 mrg && (SINGLE_SSA_USE_OPERAND (SSA_NAME_DEF_STMT (use), 667 1.1 mrg SSA_OP_USE) 668 1.1 mrg == NULL_USE_OPERAND_P 669 1.1 mrg || gimple_could_trap_p (SSA_NAME_DEF_STMT (use)))) 670 1.1 mrg || tab->reg_vars_cnt[ver] != cur_reg_vars_cnt) 671 1.1 mrg finished_with_expr (tab, ver, true); 672 1.1 mrg else 673 1.1 mrg mark_replaceable (tab, use, stmt_replaceable); 674 1.1 mrg } 675 1.1 mrg } 676 1.1 mrg 677 1.1 mrg /* Next, see if this stmt kills off an active expression. */ 678 1.1 mrg FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) 679 1.1 mrg { 680 1.1 mrg partition = var_to_partition (map, def); 681 1.1 mrg if (partition != NO_PARTITION && tab->kill_list[partition]) 682 1.1 mrg kill_expr (tab, partition); 683 1.1 mrg } 684 1.1 mrg 685 1.1 mrg /* Increment counter if this is a non BUILT_IN call. We allow 686 1.1 mrg replacement over BUILT_IN calls since many will expand to inline 687 1.1 mrg insns instead of a true call. */ 688 1.1 mrg if (is_gimple_call (stmt) 689 1.1 mrg && !((fndecl = gimple_call_fndecl (stmt)) 690 1.1 mrg && fndecl_built_in_p (fndecl))) 691 1.1 mrg cur_call_cnt++; 692 1.1 mrg 693 1.1 mrg /* Increment counter if this statement sets a local 694 1.1 mrg register variable. */ 695 1.1 mrg if (gimple_assign_single_p (stmt) 696 1.1 mrg && (TREE_CODE (gimple_assign_lhs (stmt)) == VAR_DECL 697 1.1 mrg && DECL_HARD_REGISTER (gimple_assign_lhs (stmt)))) 698 1.1 mrg cur_reg_vars_cnt++; 699 1.1 mrg 700 1.1 mrg /* Now see if we are creating a new expression or not. */ 701 1.1 mrg if (stmt_replaceable) 702 1.1 mrg process_replaceable (tab, stmt, cur_call_cnt, cur_reg_vars_cnt); 703 1.1 mrg 704 1.1 mrg /* Free any unused dependency lists. */ 705 1.1 mrg bitmap_clear (tab->new_replaceable_dependencies); 706 1.1 mrg 707 1.1 mrg /* A V_{MAY,MUST}_DEF kills any expression using a virtual operand, 708 1.1 mrg including the current stmt. */ 709 1.1 mrg if (gimple_vdef (stmt)) 710 1.1 mrg kill_virtual_exprs (tab); 711 1.1 mrg } 712 1.1 mrg } 713 1.1 mrg 714 1.1 mrg 715 1.1 mrg /* This function is the driver routine for replacement of temporary expressions 716 1.1 mrg in the SSA->normal phase, operating on MAP. If there are replaceable 717 1.1 mrg expressions, a table is returned which maps SSA versions to the 718 1.1 mrg expressions they should be replaced with. A NULL_TREE indicates no 719 1.1 mrg replacement should take place. If there are no replacements at all, 720 1.1 mrg NULL is returned by the function, otherwise an expression vector indexed 721 1.1 mrg by SSA_NAME version numbers. */ 722 1.1 mrg 723 1.1 mrg bitmap 724 1.1 mrg find_replaceable_exprs (var_map map) 725 1.1 mrg { 726 1.1 mrg basic_block bb; 727 1.1 mrg temp_expr_table *table; 728 1.1 mrg bitmap ret; 729 1.1 mrg 730 1.1 mrg bitmap_obstack_initialize (&ter_bitmap_obstack); 731 1.1 mrg table = new_temp_expr_table (map); 732 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 733 1.1 mrg { 734 1.1 mrg find_replaceable_in_bb (table, bb); 735 1.1 mrg gcc_checking_assert (bitmap_empty_p (table->partition_in_use)); 736 1.1 mrg } 737 1.1 mrg ret = free_temp_expr_table (table); 738 1.1 mrg bitmap_obstack_release (&ter_bitmap_obstack); 739 1.1 mrg return ret; 740 1.1 mrg } 741 1.1 mrg 742 1.1 mrg /* Dump TER expression table EXPR to file F. */ 743 1.1 mrg 744 1.1 mrg void 745 1.1 mrg dump_replaceable_exprs (FILE *f, bitmap expr) 746 1.1 mrg { 747 1.1 mrg tree var; 748 1.1 mrg unsigned x; 749 1.1 mrg 750 1.1 mrg fprintf (f, "\nReplacing Expressions\n"); 751 1.1 mrg for (x = 0; x < num_ssa_names; x++) 752 1.1 mrg if (bitmap_bit_p (expr, x)) 753 1.1 mrg { 754 1.1 mrg var = ssa_name (x); 755 1.1 mrg print_generic_expr (f, var, TDF_SLIM); 756 1.1 mrg fprintf (f, " replace with --> "); 757 1.1 mrg print_gimple_stmt (f, SSA_NAME_DEF_STMT (var), 0, TDF_SLIM); 758 1.1 mrg fprintf (f, "\n"); 759 1.1 mrg } 760 1.1 mrg fprintf (f, "\n"); 761 1.1 mrg } 762 1.1 mrg 763 1.1 mrg 764 1.1 mrg /* Dump the status of the various tables in the expression table. This is used 765 1.1 mrg exclusively to debug TER. F is the place to send debug info and T is the 766 1.1 mrg table being debugged. */ 767 1.1 mrg 768 1.1 mrg DEBUG_FUNCTION void 769 1.1 mrg debug_ter (FILE *f, temp_expr_table *t) 770 1.1 mrg { 771 1.1 mrg unsigned x, y; 772 1.1 mrg bitmap_iterator bi; 773 1.1 mrg 774 1.1 mrg fprintf (f, "\nDumping current state of TER\n virtual partition = %d\n", 775 1.1 mrg VIRTUAL_PARTITION (t)); 776 1.1 mrg if (t->replaceable_expressions) 777 1.1 mrg dump_replaceable_exprs (f, t->replaceable_expressions); 778 1.1 mrg fprintf (f, "Currently tracking the following expressions:\n"); 779 1.1 mrg 780 1.1 mrg for (x = 1; x < num_ssa_names; x++) 781 1.1 mrg if (t->expr_decl_uids[x]) 782 1.1 mrg { 783 1.1 mrg print_generic_expr (f, ssa_name (x), TDF_SLIM); 784 1.1 mrg fprintf (f, " dep-parts : "); 785 1.1 mrg if (t->partition_dependencies[x] 786 1.1 mrg && !bitmap_empty_p (t->partition_dependencies[x])) 787 1.1 mrg { 788 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (t->partition_dependencies[x], 0, y, bi) 789 1.1 mrg fprintf (f, "P%d ",y); 790 1.1 mrg } 791 1.1 mrg fprintf (f, " basedecls: "); 792 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (t->expr_decl_uids[x], 0, y, bi) 793 1.1 mrg fprintf (f, "%d ",y); 794 1.1 mrg fprintf (f, " call_cnt : %d",t->call_cnt[x]); 795 1.1 mrg fprintf (f, "\n"); 796 1.1 mrg } 797 1.1 mrg 798 1.1 mrg bitmap_print (f, t->partition_in_use, "Partitions in use ", 799 1.1 mrg "\npartition KILL lists:\n"); 800 1.1 mrg 801 1.1 mrg for (x = 0; x <= num_var_partitions (t->map); x++) 802 1.1 mrg if (t->kill_list[x]) 803 1.1 mrg { 804 1.1 mrg fprintf (f, "Partition %d : ", x); 805 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (t->kill_list[x], 0, y, bi) 806 1.1 mrg fprintf (f, "_%d ",y); 807 1.1 mrg } 808 1.1 mrg 809 1.1 mrg fprintf (f, "\n----------\n"); 810 1.1 mrg } 811