1 1.1 mrg /* Store motion via Lazy Code Motion on the reverse CFG. 2 1.1 mrg Copyright (C) 1997-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of GCC. 5 1.1 mrg 6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 7 1.1 mrg the terms of the GNU General Public License as published by the Free 8 1.1 mrg Software Foundation; either version 3, or (at your option) any later 9 1.1 mrg version. 10 1.1 mrg 11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 1.1 mrg for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU General Public License 17 1.1 mrg along with GCC; see the file COPYING3. If not see 18 1.1 mrg <http://www.gnu.org/licenses/>. */ 19 1.1 mrg 20 1.1 mrg #include "config.h" 21 1.1 mrg #include "system.h" 22 1.1 mrg #include "coretypes.h" 23 1.1 mrg #include "backend.h" 24 1.1 mrg #include "rtl.h" 25 1.1 mrg #include "tree.h" 26 1.1 mrg #include "predict.h" 27 1.1 mrg #include "df.h" 28 1.1 mrg #include "toplev.h" 29 1.1 mrg 30 1.1 mrg #include "cfgrtl.h" 31 1.1 mrg #include "cfganal.h" 32 1.1 mrg #include "lcm.h" 33 1.1 mrg #include "cfgcleanup.h" 34 1.1 mrg #include "expr.h" 35 1.1 mrg #include "tree-pass.h" 36 1.1 mrg #include "dbgcnt.h" 37 1.1 mrg #include "rtl-iter.h" 38 1.1 mrg #include "print-rtl.h" 39 1.1 mrg 40 1.1 mrg /* This pass implements downward store motion. 41 1.1 mrg As of May 1, 2009, the pass is not enabled by default on any target, 42 1.1 mrg but bootstrap completes on ia64 and x86_64 with the pass enabled. */ 43 1.1 mrg 44 1.1 mrg /* TODO: 45 1.1 mrg - remove_reachable_equiv_notes is an incomprehensible pile of goo and 46 1.1 mrg a compile time hog that needs a rewrite (maybe cache st_exprs to 47 1.1 mrg invalidate REG_EQUAL/REG_EQUIV notes for?). 48 1.1 mrg - pattern_regs in st_expr should be a regset (on its own obstack). 49 1.1 mrg - store_motion_mems should be a vec instead of a list. 50 1.1 mrg - there should be an alloc pool for struct st_expr objects. 51 1.1 mrg - investigate whether it is helpful to make the address of an st_expr 52 1.1 mrg a cselib VALUE. 53 1.1 mrg - when GIMPLE alias information is exported, the effectiveness of this 54 1.1 mrg pass should be re-evaluated. 55 1.1 mrg */ 56 1.1 mrg 57 1.1 mrg /* This is a list of store expressions (MEMs). The structure is used 58 1.1 mrg as an expression table to track stores which look interesting, and 59 1.1 mrg might be moveable towards the exit block. */ 60 1.1 mrg 61 1.1 mrg struct st_expr 62 1.1 mrg { 63 1.1 mrg /* Pattern of this mem. */ 64 1.1 mrg rtx pattern; 65 1.1 mrg /* List of registers mentioned by the mem. */ 66 1.1 mrg vec<rtx> pattern_regs; 67 1.1 mrg /* INSN list of stores that are locally anticipatable. */ 68 1.1 mrg vec<rtx_insn *> antic_stores; 69 1.1 mrg /* INSN list of stores that are locally available. */ 70 1.1 mrg vec<rtx_insn *> avail_stores; 71 1.1 mrg /* Next in the list. */ 72 1.1 mrg struct st_expr * next; 73 1.1 mrg /* Store ID in the dataflow bitmaps. */ 74 1.1 mrg int index; 75 1.1 mrg /* Hash value for the hash table. */ 76 1.1 mrg unsigned int hash_index; 77 1.1 mrg /* Register holding the stored expression when a store is moved. 78 1.1 mrg This field is also used as a cache in find_moveable_store, see 79 1.1 mrg LAST_AVAIL_CHECK_FAILURE below. */ 80 1.1 mrg rtx reaching_reg; 81 1.1 mrg }; 82 1.1 mrg 83 1.1 mrg /* Head of the list of load/store memory refs. */ 84 1.1 mrg static struct st_expr * store_motion_mems = NULL; 85 1.1 mrg 86 1.1 mrg /* These bitmaps will hold the local dataflow properties per basic block. */ 87 1.1 mrg static sbitmap *st_kill, *st_avloc, *st_antloc, *st_transp; 88 1.1 mrg 89 1.1 mrg /* Nonzero for expressions which should be inserted on a specific edge. */ 90 1.1 mrg static sbitmap *st_insert_map; 91 1.1 mrg 92 1.1 mrg /* Nonzero for expressions which should be deleted in a specific block. */ 93 1.1 mrg static sbitmap *st_delete_map; 94 1.1 mrg 95 1.1 mrg /* Global holding the number of store expressions we are dealing with. */ 96 1.1 mrg static int num_stores; 97 1.1 mrg 98 1.1 mrg /* Contains the edge_list returned by pre_edge_lcm. */ 99 1.1 mrg static struct edge_list *edge_list; 100 1.1 mrg 101 1.1 mrg /* Hashtable helpers. */ 102 1.1 mrg 103 1.1 mrg struct st_expr_hasher : nofree_ptr_hash <st_expr> 104 1.1 mrg { 105 1.1 mrg static inline hashval_t hash (const st_expr *); 106 1.1 mrg static inline bool equal (const st_expr *, const st_expr *); 107 1.1 mrg }; 108 1.1 mrg 109 1.1 mrg inline hashval_t 110 1.1 mrg st_expr_hasher::hash (const st_expr *x) 111 1.1 mrg { 112 1.1 mrg int do_not_record_p = 0; 113 1.1 mrg return hash_rtx (x->pattern, GET_MODE (x->pattern), &do_not_record_p, NULL, false); 114 1.1 mrg } 115 1.1 mrg 116 1.1 mrg inline bool 117 1.1 mrg st_expr_hasher::equal (const st_expr *ptr1, const st_expr *ptr2) 118 1.1 mrg { 119 1.1 mrg return exp_equiv_p (ptr1->pattern, ptr2->pattern, 0, true); 120 1.1 mrg } 121 1.1 mrg 122 1.1 mrg /* Hashtable for the load/store memory refs. */ 123 1.1 mrg static hash_table<st_expr_hasher> *store_motion_mems_table; 124 1.1 mrg 125 1.1 mrg /* This will search the st_expr list for a matching expression. If it 126 1.1 mrg doesn't find one, we create one and initialize it. */ 127 1.1 mrg 128 1.1 mrg static struct st_expr * 129 1.1 mrg st_expr_entry (rtx x) 130 1.1 mrg { 131 1.1 mrg int do_not_record_p = 0; 132 1.1 mrg struct st_expr * ptr; 133 1.1 mrg unsigned int hash; 134 1.1 mrg st_expr **slot; 135 1.1 mrg struct st_expr e; 136 1.1 mrg 137 1.1 mrg hash = hash_rtx (x, GET_MODE (x), &do_not_record_p, 138 1.1 mrg NULL, /*have_reg_qty=*/false); 139 1.1 mrg 140 1.1 mrg e.pattern = x; 141 1.1 mrg slot = store_motion_mems_table->find_slot_with_hash (&e, hash, INSERT); 142 1.1 mrg if (*slot) 143 1.1 mrg return *slot; 144 1.1 mrg 145 1.1 mrg ptr = XNEW (struct st_expr); 146 1.1 mrg 147 1.1 mrg ptr->next = store_motion_mems; 148 1.1 mrg ptr->pattern = x; 149 1.1 mrg ptr->pattern_regs.create (0); 150 1.1 mrg ptr->antic_stores.create (0); 151 1.1 mrg ptr->avail_stores.create (0); 152 1.1 mrg ptr->reaching_reg = NULL_RTX; 153 1.1 mrg ptr->index = 0; 154 1.1 mrg ptr->hash_index = hash; 155 1.1 mrg store_motion_mems = ptr; 156 1.1 mrg *slot = ptr; 157 1.1 mrg 158 1.1 mrg return ptr; 159 1.1 mrg } 160 1.1 mrg 161 1.1 mrg /* Free up an individual st_expr entry. */ 162 1.1 mrg 163 1.1 mrg static void 164 1.1 mrg free_st_expr_entry (struct st_expr * ptr) 165 1.1 mrg { 166 1.1 mrg ptr->antic_stores.release (); 167 1.1 mrg ptr->avail_stores.release (); 168 1.1 mrg ptr->pattern_regs.release (); 169 1.1 mrg 170 1.1 mrg free (ptr); 171 1.1 mrg } 172 1.1 mrg 173 1.1 mrg /* Free up all memory associated with the st_expr list. */ 174 1.1 mrg 175 1.1 mrg static void 176 1.1 mrg free_store_motion_mems (void) 177 1.1 mrg { 178 1.1 mrg delete store_motion_mems_table; 179 1.1 mrg store_motion_mems_table = NULL; 180 1.1 mrg 181 1.1 mrg while (store_motion_mems) 182 1.1 mrg { 183 1.1 mrg struct st_expr * tmp = store_motion_mems; 184 1.1 mrg store_motion_mems = store_motion_mems->next; 185 1.1 mrg free_st_expr_entry (tmp); 186 1.1 mrg } 187 1.1 mrg store_motion_mems = NULL; 188 1.1 mrg } 189 1.1 mrg 190 1.1 mrg /* Assign each element of the list of mems a monotonically increasing value. */ 191 1.1 mrg 192 1.1 mrg static int 193 1.1 mrg enumerate_store_motion_mems (void) 194 1.1 mrg { 195 1.1 mrg struct st_expr * ptr; 196 1.1 mrg int n = 0; 197 1.1 mrg 198 1.1 mrg for (ptr = store_motion_mems; ptr != NULL; ptr = ptr->next) 199 1.1 mrg ptr->index = n++; 200 1.1 mrg 201 1.1 mrg return n; 202 1.1 mrg } 203 1.1 mrg 204 1.1 mrg /* Return first item in the list. */ 205 1.1 mrg 206 1.1 mrg static inline struct st_expr * 207 1.1 mrg first_st_expr (void) 208 1.1 mrg { 209 1.1 mrg return store_motion_mems; 210 1.1 mrg } 211 1.1 mrg 212 1.1 mrg /* Return the next item in the list after the specified one. */ 213 1.1 mrg 214 1.1 mrg static inline struct st_expr * 215 1.1 mrg next_st_expr (struct st_expr * ptr) 216 1.1 mrg { 217 1.1 mrg return ptr->next; 218 1.1 mrg } 219 1.1 mrg 220 1.1 mrg /* Dump debugging info about the store_motion_mems list. */ 221 1.1 mrg 222 1.1 mrg static void 223 1.1 mrg print_store_motion_mems (FILE * file) 224 1.1 mrg { 225 1.1 mrg struct st_expr * ptr; 226 1.1 mrg 227 1.1 mrg fprintf (dump_file, "STORE_MOTION list of MEM exprs considered:\n"); 228 1.1 mrg 229 1.1 mrg for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr)) 230 1.1 mrg { 231 1.1 mrg fprintf (file, " Pattern (%3d): ", ptr->index); 232 1.1 mrg 233 1.1 mrg print_rtl (file, ptr->pattern); 234 1.1 mrg 235 1.1 mrg fprintf (file, "\n ANTIC stores : "); 236 1.1 mrg print_rtx_insn_vec (file, ptr->antic_stores); 237 1.1 mrg 238 1.1 mrg fprintf (file, "\n AVAIL stores : "); 239 1.1 mrg 240 1.1 mrg print_rtx_insn_vec (file, ptr->avail_stores); 241 1.1 mrg 242 1.1 mrg fprintf (file, "\n\n"); 243 1.1 mrg } 244 1.1 mrg 245 1.1 mrg fprintf (file, "\n"); 246 1.1 mrg } 247 1.1 mrg 248 1.1 mrg /* Return zero if some of the registers in list X are killed 250 1.1 mrg due to set of registers in bitmap REGS_SET. */ 251 1.1 mrg 252 1.1 mrg static bool 253 1.1 mrg store_ops_ok (const vec<rtx> &x, int *regs_set) 254 1.1 mrg { 255 1.1 mrg for (rtx temp : x) 256 1.1 mrg if (regs_set[REGNO (temp)]) 257 1.1 mrg return false; 258 1.1 mrg 259 1.1 mrg return true; 260 1.1 mrg } 261 1.1 mrg 262 1.1 mrg /* Returns a list of registers mentioned in X. 263 1.1 mrg FIXME: A regset would be prettier and less expensive. */ 264 1.1 mrg 265 1.1 mrg static void 266 1.1 mrg extract_mentioned_regs (rtx x, vec<rtx> *mentioned_regs) 267 1.1 mrg { 268 1.1 mrg subrtx_var_iterator::array_type array; 269 1.1 mrg FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST) 270 1.1 mrg { 271 1.1 mrg rtx x = *iter; 272 1.1 mrg if (REG_P (x)) 273 1.1 mrg mentioned_regs->safe_push (x); 274 1.1 mrg } 275 1.1 mrg } 276 1.1 mrg 277 1.1 mrg /* Check to see if the load X is aliased with STORE_PATTERN. 278 1.1 mrg AFTER is true if we are checking the case when STORE_PATTERN occurs 279 1.1 mrg after the X. */ 280 1.1 mrg 281 1.1 mrg static bool 282 1.1 mrg load_kills_store (const_rtx x, const_rtx store_pattern, int after) 283 1.1 mrg { 284 1.1 mrg if (after) 285 1.1 mrg return anti_dependence (x, store_pattern); 286 1.1 mrg else 287 1.1 mrg return true_dependence (store_pattern, GET_MODE (store_pattern), x); 288 1.1 mrg } 289 1.1 mrg 290 1.1 mrg /* Go through the entire rtx X, looking for any loads which might alias 291 1.1 mrg STORE_PATTERN. Return true if found. 292 1.1 mrg AFTER is true if we are checking the case when STORE_PATTERN occurs 293 1.1 mrg after the insn X. */ 294 1.1 mrg 295 1.1 mrg static bool 296 1.1 mrg find_loads (const_rtx x, const_rtx store_pattern, int after) 297 1.1 mrg { 298 1.1 mrg const char * fmt; 299 1.1 mrg int i, j; 300 1.1 mrg int ret = false; 301 1.1 mrg 302 1.1 mrg if (!x) 303 1.1 mrg return false; 304 1.1 mrg 305 1.1 mrg if (GET_CODE (x) == SET) 306 1.1 mrg x = SET_SRC (x); 307 1.1 mrg 308 1.1 mrg if (MEM_P (x)) 309 1.1 mrg { 310 1.1 mrg if (load_kills_store (x, store_pattern, after)) 311 1.1 mrg return true; 312 1.1 mrg } 313 1.1 mrg 314 1.1 mrg /* Recursively process the insn. */ 315 1.1 mrg fmt = GET_RTX_FORMAT (GET_CODE (x)); 316 1.1 mrg 317 1.1 mrg for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0 && !ret; i--) 318 1.1 mrg { 319 1.1 mrg if (fmt[i] == 'e') 320 1.1 mrg ret |= find_loads (XEXP (x, i), store_pattern, after); 321 1.1 mrg else if (fmt[i] == 'E') 322 1.1 mrg for (j = XVECLEN (x, i) - 1; j >= 0; j--) 323 1.1 mrg ret |= find_loads (XVECEXP (x, i, j), store_pattern, after); 324 1.1 mrg } 325 1.1 mrg return ret; 326 1.1 mrg } 327 1.1 mrg 328 1.1 mrg /* Go through pattern PAT looking for any loads which might kill the 329 1.1 mrg store in X. Return true if found. 330 1.1 mrg AFTER is true if we are checking the case when loads kill X occurs 331 1.1 mrg after the insn for PAT. */ 332 1.1 mrg 333 1.1 mrg static inline bool 334 1.1 mrg store_killed_in_pat (const_rtx x, const_rtx pat, int after) 335 1.1 mrg { 336 1.1 mrg if (GET_CODE (pat) == SET) 337 1.1 mrg { 338 1.1 mrg rtx dest = SET_DEST (pat); 339 1.1 mrg 340 1.1 mrg if (GET_CODE (dest) == ZERO_EXTRACT) 341 1.1 mrg dest = XEXP (dest, 0); 342 1.1 mrg 343 1.1 mrg /* Check for memory stores to aliased objects. */ 344 1.1 mrg if (MEM_P (dest) 345 1.1 mrg && !exp_equiv_p (dest, x, 0, true)) 346 1.1 mrg { 347 1.1 mrg if (after) 348 1.1 mrg { 349 1.1 mrg if (output_dependence (dest, x)) 350 1.1 mrg return true; 351 1.1 mrg } 352 1.1 mrg else 353 1.1 mrg { 354 1.1 mrg if (output_dependence (x, dest)) 355 1.1 mrg return true; 356 1.1 mrg } 357 1.1 mrg } 358 1.1 mrg } 359 1.1 mrg 360 1.1 mrg if (find_loads (pat, x, after)) 361 1.1 mrg return true; 362 1.1 mrg 363 1.1 mrg return false; 364 1.1 mrg } 365 1.1 mrg 366 1.1 mrg /* Check if INSN kills the store pattern X (is aliased with it). 367 1.1 mrg AFTER is true if we are checking the case when store X occurs 368 1.1 mrg after the insn. Return true if it does. */ 369 1.1 mrg 370 1.1 mrg static bool 371 1.1 mrg store_killed_in_insn (const_rtx x, const vec<rtx> &x_regs, 372 1.1 mrg const rtx_insn *insn, int after) 373 1.1 mrg { 374 1.1 mrg const_rtx note, pat; 375 1.1 mrg 376 1.1 mrg if (! NONDEBUG_INSN_P (insn)) 377 1.1 mrg return false; 378 1.1 mrg 379 1.1 mrg if (CALL_P (insn)) 380 1.1 mrg { 381 1.1 mrg /* A normal or pure call might read from pattern, 382 1.1 mrg but a const call will not. */ 383 1.1 mrg if (!RTL_CONST_CALL_P (insn)) 384 1.1 mrg return true; 385 1.1 mrg 386 1.1 mrg /* But even a const call reads its parameters. Check whether the 387 1.1 mrg base of some of registers used in mem is stack pointer. */ 388 1.1 mrg for (rtx temp : x_regs) 389 1.1 mrg if (may_be_sp_based_p (temp)) 390 1.1 mrg return true; 391 1.1 mrg 392 1.1 mrg return false; 393 1.1 mrg } 394 1.1 mrg 395 1.1 mrg pat = PATTERN (insn); 396 1.1 mrg if (GET_CODE (pat) == SET) 397 1.1 mrg { 398 1.1 mrg if (store_killed_in_pat (x, pat, after)) 399 1.1 mrg return true; 400 1.1 mrg } 401 1.1 mrg else if (GET_CODE (pat) == PARALLEL) 402 1.1 mrg { 403 1.1 mrg int i; 404 1.1 mrg 405 1.1 mrg for (i = 0; i < XVECLEN (pat, 0); i++) 406 1.1 mrg if (store_killed_in_pat (x, XVECEXP (pat, 0, i), after)) 407 1.1 mrg return true; 408 1.1 mrg } 409 1.1 mrg else if (find_loads (PATTERN (insn), x, after)) 410 1.1 mrg return true; 411 1.1 mrg 412 1.1 mrg /* If this insn has a REG_EQUAL or REG_EQUIV note referencing a memory 413 1.1 mrg location aliased with X, then this insn kills X. */ 414 1.1 mrg note = find_reg_equal_equiv_note (insn); 415 1.1 mrg if (! note) 416 1.1 mrg return false; 417 1.1 mrg note = XEXP (note, 0); 418 1.1 mrg 419 1.1 mrg /* However, if the note represents a must alias rather than a may 420 1.1 mrg alias relationship, then it does not kill X. */ 421 1.1 mrg if (exp_equiv_p (note, x, 0, true)) 422 1.1 mrg return false; 423 1.1 mrg 424 1.1 mrg /* See if there are any aliased loads in the note. */ 425 1.1 mrg return find_loads (note, x, after); 426 1.1 mrg } 427 1.1 mrg 428 1.1 mrg /* Returns true if the expression X is loaded or clobbered on or after INSN 429 1.1 mrg within basic block BB. REGS_SET_AFTER is bitmap of registers set in 430 1.1 mrg or after the insn. X_REGS is list of registers mentioned in X. If the store 431 1.1 mrg is killed, return the last insn in that it occurs in FAIL_INSN. */ 432 1.1 mrg 433 1.1 mrg static bool 434 1.1 mrg store_killed_after (const_rtx x, const vec<rtx> &x_regs, 435 1.1 mrg const rtx_insn *insn, const_basic_block bb, 436 1.1 mrg int *regs_set_after, rtx *fail_insn) 437 1.1 mrg { 438 1.1 mrg rtx_insn *last = BB_END (bb), *act; 439 1.1 mrg 440 1.1 mrg if (!store_ops_ok (x_regs, regs_set_after)) 441 1.1 mrg { 442 1.1 mrg /* We do not know where it will happen. */ 443 1.1 mrg if (fail_insn) 444 1.1 mrg *fail_insn = NULL_RTX; 445 1.1 mrg return true; 446 1.1 mrg } 447 1.1 mrg 448 1.1 mrg /* Scan from the end, so that fail_insn is determined correctly. */ 449 1.1 mrg for (act = last; act != PREV_INSN (insn); act = PREV_INSN (act)) 450 1.1 mrg if (store_killed_in_insn (x, x_regs, act, false)) 451 1.1 mrg { 452 1.1 mrg if (fail_insn) 453 1.1 mrg *fail_insn = act; 454 1.1 mrg return true; 455 1.1 mrg } 456 1.1 mrg 457 1.1 mrg return false; 458 1.1 mrg } 459 1.1 mrg 460 1.1 mrg /* Returns true if the expression X is loaded or clobbered on or before INSN 461 1.1 mrg within basic block BB. X_REGS is list of registers mentioned in X. 462 1.1 mrg REGS_SET_BEFORE is bitmap of registers set before or in this insn. */ 463 1.1 mrg static bool 464 1.1 mrg store_killed_before (const_rtx x, const vec<rtx> &x_regs, 465 1.1 mrg const rtx_insn *insn, const_basic_block bb, 466 1.1 mrg int *regs_set_before) 467 1.1 mrg { 468 1.1 mrg rtx_insn *first = BB_HEAD (bb); 469 1.1 mrg 470 1.1 mrg if (!store_ops_ok (x_regs, regs_set_before)) 471 1.1 mrg return true; 472 1.1 mrg 473 1.1 mrg for ( ; insn != PREV_INSN (first); insn = PREV_INSN (insn)) 474 1.1 mrg if (store_killed_in_insn (x, x_regs, insn, true)) 475 1.1 mrg return true; 476 1.1 mrg 477 1.1 mrg return false; 478 1.1 mrg } 479 1.1 mrg 480 1.1 mrg /* The last insn in the basic block that compute_store_table is processing, 481 1.1 mrg where store_killed_after is true for X. 482 1.1 mrg Since we go through the basic block from BB_END to BB_HEAD, this is 483 1.1 mrg also the available store at the end of the basic block. Therefore 484 1.1 mrg this is in effect a cache, to avoid calling store_killed_after for 485 1.1 mrg equivalent aliasing store expressions. 486 1.1 mrg This value is only meaningful during the computation of the store 487 1.1 mrg table. We hi-jack the REACHING_REG field of struct st_expr to save 488 1.1 mrg a bit of memory. */ 489 1.1 mrg #define LAST_AVAIL_CHECK_FAILURE(x) ((x)->reaching_reg) 490 1.1 mrg 491 1.1 mrg /* Determine whether INSN is MEM store pattern that we will consider moving. 492 1.1 mrg REGS_SET_BEFORE is bitmap of registers set before (and including) the 493 1.1 mrg current insn, REGS_SET_AFTER is bitmap of registers set after (and 494 1.1 mrg including) the insn in this basic block. We must be passing through BB from 495 1.1 mrg head to end, as we are using this fact to speed things up. 496 1.1 mrg 497 1.1 mrg The results are stored this way: 498 1.1 mrg 499 1.1 mrg -- the first anticipatable expression is added into ANTIC_STORES 500 1.1 mrg -- if the processed expression is not anticipatable, NULL_RTX is added 501 1.1 mrg there instead, so that we can use it as indicator that no further 502 1.1 mrg expression of this type may be anticipatable 503 1.1 mrg -- if the expression is available, it is added as head of AVAIL_STORES; 504 1.1 mrg consequently, all of them but this head are dead and may be deleted. 505 1.1 mrg -- if the expression is not available, the insn due to that it fails to be 506 1.1 mrg available is stored in REACHING_REG (via LAST_AVAIL_CHECK_FAILURE). 507 1.1 mrg 508 1.1 mrg The things are complicated a bit by fact that there already may be stores 509 1.1 mrg to the same MEM from other blocks; also caller must take care of the 510 1.1 mrg necessary cleanup of the temporary markers after end of the basic block. 511 1.1 mrg */ 512 1.1 mrg 513 1.1 mrg static void 514 1.1 mrg find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after) 515 1.1 mrg { 516 1.1 mrg struct st_expr * ptr; 517 1.1 mrg rtx dest, set; 518 1.1 mrg int check_anticipatable, check_available; 519 1.1 mrg basic_block bb = BLOCK_FOR_INSN (insn); 520 1.1 mrg 521 1.1 mrg set = single_set (insn); 522 1.1 mrg if (!set) 523 1.1 mrg return; 524 1.1 mrg 525 1.1 mrg dest = SET_DEST (set); 526 1.1 mrg 527 1.1 mrg if (! MEM_P (dest) || MEM_VOLATILE_P (dest) 528 1.1 mrg || GET_MODE (dest) == BLKmode) 529 1.1 mrg return; 530 1.1 mrg 531 1.1 mrg if (side_effects_p (dest)) 532 1.1 mrg return; 533 1.1 mrg 534 1.1 mrg /* If we are handling exceptions, we must be careful with memory references 535 1.1 mrg that may trap. If we are not, the behavior is undefined, so we may just 536 1.1 mrg continue. */ 537 1.1 mrg if (cfun->can_throw_non_call_exceptions && may_trap_p (dest)) 538 1.1 mrg return; 539 1.1 mrg 540 1.1 mrg /* Even if the destination cannot trap, the source may. In this case we'd 541 1.1 mrg need to handle updating the REG_EH_REGION note. */ 542 1.1 mrg if (find_reg_note (insn, REG_EH_REGION, NULL_RTX)) 543 1.1 mrg return; 544 1.1 mrg 545 1.1 mrg /* Make sure that the SET_SRC of this store insns can be assigned to 546 1.1 mrg a register, or we will fail later on in replace_store_insn, which 547 1.1 mrg assumes that we can do this. But sometimes the target machine has 548 1.1 mrg oddities like MEM read-modify-write instruction. See for example 549 1.1 mrg PR24257. */ 550 1.1 mrg if (!can_assign_to_reg_without_clobbers_p (SET_SRC (set), 551 1.1 mrg GET_MODE (SET_SRC (set)))) 552 1.1 mrg return; 553 1.1 mrg 554 1.1 mrg ptr = st_expr_entry (dest); 555 1.1 mrg if (ptr->pattern_regs.is_empty ()) 556 1.1 mrg extract_mentioned_regs (dest, &ptr->pattern_regs); 557 1.1 mrg 558 1.1 mrg /* Do not check for anticipatability if we either found one anticipatable 559 1.1 mrg store already, or tested for one and found out that it was killed. */ 560 1.1 mrg check_anticipatable = 0; 561 1.1 mrg if (ptr->antic_stores.is_empty ()) 562 1.1 mrg check_anticipatable = 1; 563 1.1 mrg else 564 1.1 mrg { 565 1.1 mrg rtx_insn *tmp = ptr->antic_stores.last (); 566 1.1 mrg if (tmp != NULL_RTX 567 1.1 mrg && BLOCK_FOR_INSN (tmp) != bb) 568 1.1 mrg check_anticipatable = 1; 569 1.1 mrg } 570 1.1 mrg if (check_anticipatable) 571 1.1 mrg { 572 1.1 mrg rtx_insn *tmp; 573 1.1 mrg if (store_killed_before (dest, ptr->pattern_regs, insn, bb, regs_set_before)) 574 1.1 mrg tmp = NULL; 575 1.1 mrg else 576 1.1 mrg tmp = insn; 577 1.1 mrg ptr->antic_stores.safe_push (tmp); 578 1.1 mrg } 579 1.1 mrg 580 1.1 mrg /* It is not necessary to check whether store is available if we did 581 1.1 mrg it successfully before; if we failed before, do not bother to check 582 1.1 mrg until we reach the insn that caused us to fail. */ 583 1.1 mrg check_available = 0; 584 1.1 mrg if (ptr->avail_stores.is_empty ()) 585 1.1 mrg check_available = 1; 586 1.1 mrg else 587 1.1 mrg { 588 1.1 mrg rtx_insn *tmp = ptr->avail_stores.last (); 589 1.1 mrg if (BLOCK_FOR_INSN (tmp) != bb) 590 1.1 mrg check_available = 1; 591 1.1 mrg } 592 1.1 mrg if (check_available) 593 1.1 mrg { 594 1.1 mrg /* Check that we have already reached the insn at that the check 595 1.1 mrg failed last time. */ 596 1.1 mrg if (LAST_AVAIL_CHECK_FAILURE (ptr)) 597 1.1 mrg { 598 1.1 mrg rtx_insn *tmp; 599 1.1 mrg for (tmp = BB_END (bb); 600 1.1 mrg tmp != insn && tmp != LAST_AVAIL_CHECK_FAILURE (ptr); 601 1.1 mrg tmp = PREV_INSN (tmp)) 602 1.1 mrg continue; 603 1.1 mrg if (tmp == insn) 604 1.1 mrg check_available = 0; 605 1.1 mrg } 606 1.1 mrg else 607 1.1 mrg check_available = store_killed_after (dest, ptr->pattern_regs, insn, 608 1.1 mrg bb, regs_set_after, 609 1.1 mrg &LAST_AVAIL_CHECK_FAILURE (ptr)); 610 1.1 mrg } 611 1.1 mrg if (!check_available) 612 1.1 mrg ptr->avail_stores.safe_push (insn); 613 1.1 mrg } 614 1.1 mrg 615 1.1 mrg /* Find available and anticipatable stores. */ 616 1.1 mrg 617 1.1 mrg static int 618 1.1 mrg compute_store_table (void) 619 1.1 mrg { 620 1.1 mrg int ret; 621 1.1 mrg basic_block bb; 622 1.1 mrg rtx_insn *insn; 623 1.1 mrg rtx_insn *tmp; 624 1.1 mrg df_ref def; 625 1.1 mrg int *last_set_in, *already_set; 626 1.1 mrg struct st_expr * ptr, **prev_next_ptr_ptr; 627 1.1 mrg unsigned int max_gcse_regno = max_reg_num (); 628 1.1 mrg 629 1.1 mrg store_motion_mems = NULL; 630 1.1 mrg store_motion_mems_table = new hash_table<st_expr_hasher> (13); 631 1.1 mrg last_set_in = XCNEWVEC (int, max_gcse_regno); 632 1.1 mrg already_set = XNEWVEC (int, max_gcse_regno); 633 1.1 mrg 634 1.1 mrg /* Find all the stores we care about. */ 635 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 636 1.1 mrg { 637 1.1 mrg /* First compute the registers set in this block. */ 638 1.1 mrg FOR_BB_INSNS (bb, insn) 639 1.1 mrg { 640 1.1 mrg 641 1.1 mrg if (! NONDEBUG_INSN_P (insn)) 642 1.1 mrg continue; 643 1.1 mrg 644 1.1 mrg FOR_EACH_INSN_DEF (def, insn) 645 1.1 mrg last_set_in[DF_REF_REGNO (def)] = INSN_UID (insn); 646 1.1 mrg } 647 1.1 mrg 648 1.1 mrg /* Now find the stores. */ 649 1.1 mrg memset (already_set, 0, sizeof (int) * max_gcse_regno); 650 1.1 mrg FOR_BB_INSNS (bb, insn) 651 1.1 mrg { 652 1.1 mrg if (! NONDEBUG_INSN_P (insn)) 653 1.1 mrg continue; 654 1.1 mrg 655 1.1 mrg FOR_EACH_INSN_DEF (def, insn) 656 1.1 mrg already_set[DF_REF_REGNO (def)] = INSN_UID (insn); 657 1.1 mrg 658 1.1 mrg /* Now that we've marked regs, look for stores. */ 659 1.1 mrg find_moveable_store (insn, already_set, last_set_in); 660 1.1 mrg 661 1.1 mrg /* Unmark regs that are no longer set. */ 662 1.1 mrg FOR_EACH_INSN_DEF (def, insn) 663 1.1 mrg if (last_set_in[DF_REF_REGNO (def)] == INSN_UID (insn)) 664 1.1 mrg last_set_in[DF_REF_REGNO (def)] = 0; 665 1.1 mrg } 666 1.1 mrg 667 1.1 mrg if (flag_checking) 668 1.1 mrg { 669 1.1 mrg /* last_set_in should now be all-zero. */ 670 1.1 mrg for (unsigned regno = 0; regno < max_gcse_regno; regno++) 671 1.1 mrg gcc_assert (!last_set_in[regno]); 672 1.1 mrg } 673 1.1 mrg 674 1.1 mrg /* Clear temporary marks. */ 675 1.1 mrg for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr)) 676 1.1 mrg { 677 1.1 mrg LAST_AVAIL_CHECK_FAILURE (ptr) = NULL_RTX; 678 1.1 mrg if (!ptr->antic_stores.is_empty () 679 1.1 mrg && (tmp = ptr->antic_stores.last ()) == NULL) 680 1.1 mrg ptr->antic_stores.pop (); 681 1.1 mrg } 682 1.1 mrg } 683 1.1 mrg 684 1.1 mrg /* Remove the stores that are not available anywhere, as there will 685 1.1 mrg be no opportunity to optimize them. */ 686 1.1 mrg for (ptr = store_motion_mems, prev_next_ptr_ptr = &store_motion_mems; 687 1.1 mrg ptr != NULL; 688 1.1 mrg ptr = *prev_next_ptr_ptr) 689 1.1 mrg { 690 1.1 mrg if (ptr->avail_stores.is_empty ()) 691 1.1 mrg { 692 1.1 mrg *prev_next_ptr_ptr = ptr->next; 693 1.1 mrg store_motion_mems_table->remove_elt_with_hash (ptr, ptr->hash_index); 694 1.1 mrg free_st_expr_entry (ptr); 695 1.1 mrg } 696 1.1 mrg else 697 1.1 mrg prev_next_ptr_ptr = &ptr->next; 698 1.1 mrg } 699 1.1 mrg 700 1.1 mrg ret = enumerate_store_motion_mems (); 701 1.1 mrg 702 1.1 mrg if (dump_file) 703 1.1 mrg print_store_motion_mems (dump_file); 704 1.1 mrg 705 1.1 mrg free (last_set_in); 706 1.1 mrg free (already_set); 707 1.1 mrg return ret; 708 1.1 mrg } 709 1.1 mrg 710 1.1 mrg /* In all code following after this, REACHING_REG has its original 711 1.1 mrg meaning again. Avoid confusion, and undef the accessor macro for 712 1.1 mrg the temporary marks usage in compute_store_table. */ 713 1.1 mrg #undef LAST_AVAIL_CHECK_FAILURE 714 1.1 mrg 715 1.1 mrg /* Insert an instruction at the beginning of a basic block, and update 716 1.1 mrg the BB_HEAD if needed. */ 717 1.1 mrg 718 1.1 mrg static void 719 1.1 mrg insert_insn_start_basic_block (rtx_insn *insn, basic_block bb) 720 1.1 mrg { 721 1.1 mrg /* Insert at start of successor block. */ 722 1.1 mrg rtx_insn *prev = PREV_INSN (BB_HEAD (bb)); 723 1.1 mrg rtx_insn *before = BB_HEAD (bb); 724 1.1 mrg while (before != 0) 725 1.1 mrg { 726 1.1 mrg if (! LABEL_P (before) 727 1.1 mrg && !NOTE_INSN_BASIC_BLOCK_P (before)) 728 1.1 mrg break; 729 1.1 mrg prev = before; 730 1.1 mrg if (prev == BB_END (bb)) 731 1.1 mrg break; 732 1.1 mrg before = NEXT_INSN (before); 733 1.1 mrg } 734 1.1 mrg 735 1.1 mrg insn = emit_insn_after_noloc (insn, prev, bb); 736 1.1 mrg 737 1.1 mrg if (dump_file) 738 1.1 mrg { 739 1.1 mrg fprintf (dump_file, "STORE_MOTION insert store at start of BB %d:\n", 740 1.1 mrg bb->index); 741 1.1 mrg print_inline_rtx (dump_file, insn, 6); 742 1.1 mrg fprintf (dump_file, "\n"); 743 1.1 mrg } 744 1.1 mrg } 745 1.1 mrg 746 1.1 mrg /* This routine will insert a store on an edge. EXPR is the st_expr entry for 747 1.1 mrg the memory reference, and E is the edge to insert it on. Returns nonzero 748 1.1 mrg if an edge insertion was performed. */ 749 1.1 mrg 750 1.1 mrg static int 751 1.1 mrg insert_store (struct st_expr * expr, edge e) 752 1.1 mrg { 753 1.1 mrg rtx reg; 754 1.1 mrg rtx_insn *insn; 755 1.1 mrg basic_block bb; 756 1.1 mrg edge tmp; 757 1.1 mrg edge_iterator ei; 758 1.1 mrg 759 1.1 mrg /* We did all the deleted before this insert, so if we didn't delete a 760 1.1 mrg store, then we haven't set the reaching reg yet either. */ 761 1.1 mrg if (expr->reaching_reg == NULL_RTX) 762 1.1 mrg return 0; 763 1.1 mrg 764 1.1 mrg if (e->flags & EDGE_FAKE) 765 1.1 mrg return 0; 766 1.1 mrg 767 1.1 mrg reg = expr->reaching_reg; 768 1.1 mrg insn = gen_move_insn (copy_rtx (expr->pattern), reg); 769 1.1 mrg 770 1.1 mrg /* If we are inserting this expression on ALL predecessor edges of a BB, 771 1.1 mrg insert it at the start of the BB, and reset the insert bits on the other 772 1.1 mrg edges so we don't try to insert it on the other edges. */ 773 1.1 mrg bb = e->dest; 774 1.1 mrg FOR_EACH_EDGE (tmp, ei, e->dest->preds) 775 1.1 mrg if (!(tmp->flags & EDGE_FAKE)) 776 1.1 mrg { 777 1.1 mrg int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest); 778 1.1 mrg 779 1.1 mrg gcc_assert (index != EDGE_INDEX_NO_EDGE); 780 1.1 mrg if (! bitmap_bit_p (st_insert_map[index], expr->index)) 781 1.1 mrg break; 782 1.1 mrg } 783 1.1 mrg 784 1.1 mrg /* If tmp is NULL, we found an insertion on every edge, blank the 785 1.1 mrg insertion vector for these edges, and insert at the start of the BB. */ 786 1.1 mrg if (!tmp && bb != EXIT_BLOCK_PTR_FOR_FN (cfun)) 787 1.1 mrg { 788 1.1 mrg FOR_EACH_EDGE (tmp, ei, e->dest->preds) 789 1.1 mrg { 790 1.1 mrg int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest); 791 1.1 mrg bitmap_clear_bit (st_insert_map[index], expr->index); 792 1.1 mrg } 793 1.1 mrg insert_insn_start_basic_block (insn, bb); 794 1.1 mrg return 0; 795 1.1 mrg } 796 1.1 mrg 797 1.1 mrg /* We can't put stores in the front of blocks pointed to by abnormal 798 1.1 mrg edges since that may put a store where one didn't used to be. */ 799 1.1 mrg gcc_assert (!(e->flags & EDGE_ABNORMAL)); 800 1.1 mrg 801 1.1 mrg insert_insn_on_edge (insn, e); 802 1.1 mrg 803 1.1 mrg if (dump_file) 804 1.1 mrg { 805 1.1 mrg fprintf (dump_file, "STORE_MOTION insert insn on edge (%d, %d):\n", 806 1.1 mrg e->src->index, e->dest->index); 807 1.1 mrg print_inline_rtx (dump_file, insn, 6); 808 1.1 mrg fprintf (dump_file, "\n"); 809 1.1 mrg } 810 1.1 mrg 811 1.1 mrg return 1; 812 1.1 mrg } 813 1.1 mrg 814 1.1 mrg /* Remove any REG_EQUAL or REG_EQUIV notes containing a reference to the 815 1.1 mrg memory location in SMEXPR set in basic block BB. 816 1.1 mrg 817 1.1 mrg This could be rather expensive. */ 818 1.1 mrg 819 1.1 mrg static void 820 1.1 mrg remove_reachable_equiv_notes (basic_block bb, struct st_expr *smexpr) 821 1.1 mrg { 822 1.1 mrg edge_iterator *stack, ei; 823 1.1 mrg int sp; 824 1.1 mrg edge act; 825 1.1 mrg auto_sbitmap visited (last_basic_block_for_fn (cfun)); 826 1.1 mrg rtx note; 827 1.1 mrg rtx_insn *insn; 828 1.1 mrg rtx mem = smexpr->pattern; 829 1.1 mrg 830 1.1 mrg stack = XNEWVEC (edge_iterator, n_basic_blocks_for_fn (cfun)); 831 1.1 mrg sp = 0; 832 1.1 mrg ei = ei_start (bb->succs); 833 1.1 mrg 834 1.1 mrg bitmap_clear (visited); 835 1.1 mrg 836 1.1 mrg act = (EDGE_COUNT (ei_container (ei)) 837 1.1 mrg ? EDGE_I (ei_container (ei), 0) 838 1.1 mrg : NULL); 839 1.1 mrg for (;;) 840 1.1 mrg { 841 1.1 mrg if (!act) 842 1.1 mrg { 843 1.1 mrg if (!sp) 844 1.1 mrg { 845 1.1 mrg free (stack); 846 1.1 mrg return; 847 1.1 mrg } 848 1.1 mrg act = ei_edge (stack[--sp]); 849 1.1 mrg } 850 1.1 mrg bb = act->dest; 851 1.1 mrg 852 1.1 mrg if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) 853 1.1 mrg || bitmap_bit_p (visited, bb->index)) 854 1.1 mrg { 855 1.1 mrg if (!ei_end_p (ei)) 856 1.1 mrg ei_next (&ei); 857 1.1 mrg act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL; 858 1.1 mrg continue; 859 1.1 mrg } 860 1.1 mrg bitmap_set_bit (visited, bb->index); 861 1.1 mrg 862 1.1 mrg rtx_insn *last; 863 1.1 mrg if (bitmap_bit_p (st_antloc[bb->index], smexpr->index)) 864 1.1 mrg { 865 1.1 mrg unsigned int i; 866 1.1 mrg FOR_EACH_VEC_ELT_REVERSE (smexpr->antic_stores, i, last) 867 1.1 mrg if (BLOCK_FOR_INSN (last) == bb) 868 1.1 mrg break; 869 1.1 mrg } 870 1.1 mrg else 871 1.1 mrg last = NEXT_INSN (BB_END (bb)); 872 1.1 mrg 873 1.1 mrg for (insn = BB_HEAD (bb); insn != last; insn = NEXT_INSN (insn)) 874 1.1 mrg if (NONDEBUG_INSN_P (insn)) 875 1.1 mrg { 876 1.1 mrg note = find_reg_equal_equiv_note (insn); 877 1.1 mrg if (!note || !exp_equiv_p (XEXP (note, 0), mem, 0, true)) 878 1.1 mrg continue; 879 1.1 mrg 880 1.1 mrg if (dump_file) 881 1.1 mrg fprintf (dump_file, 882 1.1 mrg "STORE_MOTION drop REG_EQUAL note at insn %d:\n", 883 1.1 mrg INSN_UID (insn)); 884 1.1 mrg remove_note (insn, note); 885 1.1 mrg } 886 1.1 mrg 887 1.1 mrg if (!ei_end_p (ei)) 888 1.1 mrg ei_next (&ei); 889 1.1 mrg act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL; 890 1.1 mrg 891 1.1 mrg if (EDGE_COUNT (bb->succs) > 0) 892 1.1 mrg { 893 1.1 mrg if (act) 894 1.1 mrg stack[sp++] = ei; 895 1.1 mrg ei = ei_start (bb->succs); 896 1.1 mrg act = (EDGE_COUNT (ei_container (ei)) 897 1.1 mrg ? EDGE_I (ei_container (ei), 0) 898 1.1 mrg : NULL); 899 1.1 mrg } 900 1.1 mrg } 901 1.1 mrg } 902 1.1 mrg 903 1.1 mrg /* This routine will replace a store with a SET to a specified register. */ 904 1.1 mrg 905 1.1 mrg static void 906 1.1 mrg replace_store_insn (rtx reg, rtx_insn *del, basic_block bb, 907 1.1 mrg struct st_expr *smexpr) 908 1.1 mrg { 909 1.1 mrg rtx_insn *insn; 910 1.1 mrg rtx mem, note, set; 911 1.1 mrg 912 1.1 mrg insn = prepare_copy_insn (reg, SET_SRC (single_set (del))); 913 1.1 mrg 914 1.1 mrg unsigned int i; 915 1.1 mrg rtx_insn *temp; 916 1.1 mrg FOR_EACH_VEC_ELT_REVERSE (smexpr->antic_stores, i, temp) 917 1.1 mrg if (temp == del) 918 1.1 mrg { 919 1.1 mrg smexpr->antic_stores[i] = insn; 920 1.1 mrg break; 921 1.1 mrg } 922 1.1 mrg 923 1.1 mrg /* Move the notes from the deleted insn to its replacement. */ 924 1.1 mrg REG_NOTES (insn) = REG_NOTES (del); 925 1.1 mrg 926 1.1 mrg /* Emit the insn AFTER all the notes are transferred. 927 1.1 mrg This is cheaper since we avoid df rescanning for the note change. */ 928 1.1 mrg insn = emit_insn_after (insn, del); 929 1.1 mrg 930 1.1 mrg if (dump_file) 931 1.1 mrg { 932 1.1 mrg fprintf (dump_file, 933 1.1 mrg "STORE_MOTION delete insn in BB %d:\n ", bb->index); 934 1.1 mrg print_inline_rtx (dump_file, del, 6); 935 1.1 mrg fprintf (dump_file, "\nSTORE_MOTION replaced with insn:\n "); 936 1.1 mrg print_inline_rtx (dump_file, insn, 6); 937 1.1 mrg fprintf (dump_file, "\n"); 938 1.1 mrg } 939 1.1 mrg 940 1.1 mrg delete_insn (del); 941 1.1 mrg 942 1.1 mrg /* Now we must handle REG_EQUAL notes whose contents is equal to the mem; 943 1.1 mrg they are no longer accurate provided that they are reached by this 944 1.1 mrg definition, so drop them. */ 945 1.1 mrg mem = smexpr->pattern; 946 1.1 mrg for (; insn != NEXT_INSN (BB_END (bb)); insn = NEXT_INSN (insn)) 947 1.1 mrg if (NONDEBUG_INSN_P (insn)) 948 1.1 mrg { 949 1.1 mrg set = single_set (insn); 950 1.1 mrg if (!set) 951 1.1 mrg continue; 952 1.1 mrg if (exp_equiv_p (SET_DEST (set), mem, 0, true)) 953 1.1 mrg return; 954 1.1 mrg note = find_reg_equal_equiv_note (insn); 955 1.1 mrg if (!note || !exp_equiv_p (XEXP (note, 0), mem, 0, true)) 956 1.1 mrg continue; 957 1.1 mrg 958 1.1 mrg if (dump_file) 959 1.1 mrg fprintf (dump_file, "STORE_MOTION drop REG_EQUAL note at insn %d:\n", 960 1.1 mrg INSN_UID (insn)); 961 1.1 mrg remove_note (insn, note); 962 1.1 mrg } 963 1.1 mrg remove_reachable_equiv_notes (bb, smexpr); 964 1.1 mrg } 965 1.1 mrg 966 1.1 mrg 967 1.1 mrg /* Delete a store, but copy the value that would have been stored into 968 1.1 mrg the reaching_reg for later storing. */ 969 1.1 mrg 970 1.1 mrg static void 971 1.1 mrg delete_store (struct st_expr * expr, basic_block bb) 972 1.1 mrg { 973 1.1 mrg rtx reg; 974 1.1 mrg 975 1.1 mrg if (expr->reaching_reg == NULL_RTX) 976 1.1 mrg expr->reaching_reg = gen_reg_rtx_and_attrs (expr->pattern); 977 1.1 mrg 978 1.1 mrg reg = expr->reaching_reg; 979 1.1 mrg 980 1.1 mrg unsigned int len = expr->avail_stores.length (); 981 1.1 mrg for (unsigned int i = len - 1; i < len; i--) 982 1.1 mrg { 983 1.1 mrg rtx_insn *del = expr->avail_stores[i]; 984 1.1 mrg if (BLOCK_FOR_INSN (del) == bb) 985 1.1 mrg { 986 1.1 mrg /* We know there is only one since we deleted redundant 987 1.1 mrg ones during the available computation. */ 988 1.1 mrg replace_store_insn (reg, del, bb, expr); 989 1.1 mrg break; 990 1.1 mrg } 991 1.1 mrg } 992 1.1 mrg } 993 1.1 mrg 994 1.1 mrg /* Fill in available, anticipatable, transparent and kill vectors in 995 1.1 mrg STORE_DATA, based on lists of available and anticipatable stores. */ 996 1.1 mrg static void 997 1.1 mrg build_store_vectors (void) 998 1.1 mrg { 999 1.1 mrg basic_block bb; 1000 1.1 mrg int *regs_set_in_block; 1001 1.1 mrg rtx_insn *insn; 1002 1.1 mrg struct st_expr * ptr; 1003 1.1 mrg unsigned int max_gcse_regno = max_reg_num (); 1004 1.1 mrg 1005 1.1 mrg /* Build the gen_vector. This is any store in the table which is not killed 1006 1.1 mrg by aliasing later in its block. */ 1007 1.1 mrg st_avloc = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), 1008 1.1 mrg num_stores); 1009 1.1 mrg bitmap_vector_clear (st_avloc, last_basic_block_for_fn (cfun)); 1010 1.1 mrg 1011 1.1 mrg st_antloc = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), 1012 1.1 mrg num_stores); 1013 1.1 mrg bitmap_vector_clear (st_antloc, last_basic_block_for_fn (cfun)); 1014 1.1 mrg 1015 1.1 mrg for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr)) 1016 1.1 mrg { 1017 1.1 mrg unsigned int len = ptr->avail_stores.length (); 1018 1.1 mrg for (unsigned int i = len - 1; i < len; i--) 1019 1.1 mrg { 1020 1.1 mrg insn = ptr->avail_stores[i]; 1021 1.1 mrg bb = BLOCK_FOR_INSN (insn); 1022 1.1 mrg 1023 1.1 mrg /* If we've already seen an available expression in this block, 1024 1.1 mrg we can delete this one (It occurs earlier in the block). We'll 1025 1.1 mrg copy the SRC expression to an unused register in case there 1026 1.1 mrg are any side effects. */ 1027 1.1 mrg if (bitmap_bit_p (st_avloc[bb->index], ptr->index)) 1028 1.1 mrg { 1029 1.1 mrg rtx r = gen_reg_rtx_and_attrs (ptr->pattern); 1030 1.1 mrg if (dump_file) 1031 1.1 mrg fprintf (dump_file, "Removing redundant store:\n"); 1032 1.1 mrg replace_store_insn (r, insn, bb, ptr); 1033 1.1 mrg continue; 1034 1.1 mrg } 1035 1.1 mrg bitmap_set_bit (st_avloc[bb->index], ptr->index); 1036 1.1 mrg } 1037 1.1 mrg 1038 1.1 mrg unsigned int i; 1039 1.1 mrg FOR_EACH_VEC_ELT_REVERSE (ptr->antic_stores, i, insn) 1040 1.1 mrg { 1041 1.1 mrg bb = BLOCK_FOR_INSN (insn); 1042 1.1 mrg bitmap_set_bit (st_antloc[bb->index], ptr->index); 1043 1.1 mrg } 1044 1.1 mrg } 1045 1.1 mrg 1046 1.1 mrg st_kill = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), num_stores); 1047 1.1 mrg bitmap_vector_clear (st_kill, last_basic_block_for_fn (cfun)); 1048 1.1 mrg 1049 1.1 mrg st_transp = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), num_stores); 1050 1.1 mrg bitmap_vector_clear (st_transp, last_basic_block_for_fn (cfun)); 1051 1.1 mrg regs_set_in_block = XNEWVEC (int, max_gcse_regno); 1052 1.1 mrg 1053 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 1054 1.1 mrg { 1055 1.1 mrg memset (regs_set_in_block, 0, sizeof (int) * max_gcse_regno); 1056 1.1 mrg 1057 1.1 mrg FOR_BB_INSNS (bb, insn) 1058 1.1 mrg if (NONDEBUG_INSN_P (insn)) 1059 1.1 mrg { 1060 1.1 mrg df_ref def; 1061 1.1 mrg FOR_EACH_INSN_DEF (def, insn) 1062 1.1 mrg { 1063 1.1 mrg unsigned int ref_regno = DF_REF_REGNO (def); 1064 1.1 mrg if (ref_regno < max_gcse_regno) 1065 1.1 mrg regs_set_in_block[DF_REF_REGNO (def)] = 1; 1066 1.1 mrg } 1067 1.1 mrg } 1068 1.1 mrg 1069 1.1 mrg for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr)) 1070 1.1 mrg { 1071 1.1 mrg if (store_killed_after (ptr->pattern, ptr->pattern_regs, BB_HEAD (bb), 1072 1.1 mrg bb, regs_set_in_block, NULL)) 1073 1.1 mrg { 1074 1.1 mrg /* It should not be necessary to consider the expression 1075 1.1 mrg killed if it is both anticipatable and available. */ 1076 1.1 mrg if (!bitmap_bit_p (st_antloc[bb->index], ptr->index) 1077 1.1 mrg || !bitmap_bit_p (st_avloc[bb->index], ptr->index)) 1078 1.1 mrg bitmap_set_bit (st_kill[bb->index], ptr->index); 1079 1.1 mrg } 1080 1.1 mrg else 1081 1.1 mrg bitmap_set_bit (st_transp[bb->index], ptr->index); 1082 1.1 mrg } 1083 1.1 mrg } 1084 1.1 mrg 1085 1.1 mrg free (regs_set_in_block); 1086 1.1 mrg 1087 1.1 mrg if (dump_file) 1088 1.1 mrg { 1089 1.1 mrg dump_bitmap_vector (dump_file, "st_antloc", "", st_antloc, 1090 1.1 mrg last_basic_block_for_fn (cfun)); 1091 1.1 mrg dump_bitmap_vector (dump_file, "st_kill", "", st_kill, 1092 1.1 mrg last_basic_block_for_fn (cfun)); 1093 1.1 mrg dump_bitmap_vector (dump_file, "st_transp", "", st_transp, 1094 1.1 mrg last_basic_block_for_fn (cfun)); 1095 1.1 mrg dump_bitmap_vector (dump_file, "st_avloc", "", st_avloc, 1096 1.1 mrg last_basic_block_for_fn (cfun)); 1097 1.1 mrg } 1098 1.1 mrg } 1099 1.1 mrg 1100 1.1 mrg /* Free memory used by store motion. */ 1101 1.1 mrg 1102 1.1 mrg static void 1103 1.1 mrg free_store_memory (void) 1104 1.1 mrg { 1105 1.1 mrg free_store_motion_mems (); 1106 1.1 mrg 1107 1.1 mrg if (st_avloc) 1108 1.1 mrg sbitmap_vector_free (st_avloc); 1109 1.1 mrg if (st_kill) 1110 1.1 mrg sbitmap_vector_free (st_kill); 1111 1.1 mrg if (st_transp) 1112 1.1 mrg sbitmap_vector_free (st_transp); 1113 1.1 mrg if (st_antloc) 1114 1.1 mrg sbitmap_vector_free (st_antloc); 1115 1.1 mrg if (st_insert_map) 1116 1.1 mrg sbitmap_vector_free (st_insert_map); 1117 1.1 mrg if (st_delete_map) 1118 1.1 mrg sbitmap_vector_free (st_delete_map); 1119 1.1 mrg 1120 1.1 mrg st_avloc = st_kill = st_transp = st_antloc = NULL; 1121 1.1 mrg st_insert_map = st_delete_map = NULL; 1122 1.1 mrg } 1123 1.1 mrg 1124 1.1 mrg /* Perform store motion. Much like gcse, except we move expressions the 1125 1.1 mrg other way by looking at the flowgraph in reverse. 1126 1.1 mrg Return non-zero if transformations are performed by the pass. */ 1127 1.1 mrg 1128 1.1 mrg static int 1129 1.1 mrg one_store_motion_pass (void) 1130 1.1 mrg { 1131 1.1 mrg basic_block bb; 1132 1.1 mrg int x; 1133 1.1 mrg struct st_expr * ptr; 1134 1.1 mrg int did_edge_inserts = 0; 1135 1.1 mrg int n_stores_deleted = 0; 1136 1.1 mrg int n_stores_created = 0; 1137 1.1 mrg 1138 1.1 mrg init_alias_analysis (); 1139 1.1 mrg 1140 1.1 mrg /* Find all the available and anticipatable stores. */ 1141 1.1 mrg num_stores = compute_store_table (); 1142 1.1 mrg if (num_stores == 0) 1143 1.1 mrg { 1144 1.1 mrg delete store_motion_mems_table; 1145 1.1 mrg store_motion_mems_table = NULL; 1146 1.1 mrg end_alias_analysis (); 1147 1.1 mrg return 0; 1148 1.1 mrg } 1149 1.1 mrg 1150 1.1 mrg /* Now compute kill & transp vectors. */ 1151 1.1 mrg build_store_vectors (); 1152 1.1 mrg connect_infinite_loops_to_exit (); 1153 1.1 mrg 1154 1.1 mrg edge_list = pre_edge_rev_lcm (num_stores, st_transp, st_avloc, 1155 1.1 mrg st_antloc, st_kill, &st_insert_map, 1156 1.1 mrg &st_delete_map); 1157 1.1 mrg 1158 1.1 mrg /* Now we want to insert the new stores which are going to be needed. */ 1159 1.1 mrg for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr)) 1160 1.1 mrg { 1161 1.1 mrg /* If any of the edges we have above are abnormal, we can't move this 1162 1.1 mrg store. */ 1163 1.1 mrg for (x = NUM_EDGES (edge_list) - 1; x >= 0; x--) 1164 1.1 mrg if (bitmap_bit_p (st_insert_map[x], ptr->index) 1165 1.1 mrg && (INDEX_EDGE (edge_list, x)->flags & EDGE_ABNORMAL)) 1166 1.1 mrg break; 1167 1.1 mrg 1168 1.1 mrg if (x >= 0) 1169 1.1 mrg { 1170 1.1 mrg if (dump_file != NULL) 1171 1.1 mrg fprintf (dump_file, 1172 1.1 mrg "Can't replace store %d: abnormal edge from %d to %d\n", 1173 1.1 mrg ptr->index, INDEX_EDGE (edge_list, x)->src->index, 1174 1.1 mrg INDEX_EDGE (edge_list, x)->dest->index); 1175 1.1 mrg continue; 1176 1.1 mrg } 1177 1.1 mrg 1178 1.1 mrg /* Now we want to insert the new stores which are going to be needed. */ 1179 1.1 mrg 1180 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 1181 1.1 mrg if (bitmap_bit_p (st_delete_map[bb->index], ptr->index)) 1182 1.1 mrg { 1183 1.1 mrg delete_store (ptr, bb); 1184 1.1 mrg n_stores_deleted++; 1185 1.1 mrg } 1186 1.1 mrg 1187 1.1 mrg for (x = 0; x < NUM_EDGES (edge_list); x++) 1188 1.1 mrg if (bitmap_bit_p (st_insert_map[x], ptr->index)) 1189 1.1 mrg { 1190 1.1 mrg did_edge_inserts |= insert_store (ptr, INDEX_EDGE (edge_list, x)); 1191 1.1 mrg n_stores_created++; 1192 1.1 mrg } 1193 1.1 mrg } 1194 1.1 mrg 1195 1.1 mrg if (did_edge_inserts) 1196 1.1 mrg commit_edge_insertions (); 1197 1.1 mrg 1198 1.1 mrg free_store_memory (); 1199 1.1 mrg free_edge_list (edge_list); 1200 1.1 mrg remove_fake_exit_edges (); 1201 1.1 mrg end_alias_analysis (); 1202 1.1 mrg 1203 1.1 mrg if (dump_file) 1204 1.1 mrg { 1205 1.1 mrg fprintf (dump_file, "STORE_MOTION of %s, %d basic blocks, ", 1206 1.1 mrg current_function_name (), n_basic_blocks_for_fn (cfun)); 1207 1.1 mrg fprintf (dump_file, "%d insns deleted, %d insns created\n", 1208 1.1 mrg n_stores_deleted, n_stores_created); 1209 1.1 mrg } 1210 1.1 mrg 1211 1.1 mrg return (n_stores_deleted > 0 || n_stores_created > 0); 1212 1.1 mrg } 1213 1.1 mrg 1214 1.1 mrg 1215 1.1 mrg static unsigned int 1217 1.1 mrg execute_rtl_store_motion (void) 1218 1.1 mrg { 1219 1.1 mrg delete_unreachable_blocks (); 1220 1.1 mrg df_analyze (); 1221 1.1 mrg flag_rerun_cse_after_global_opts |= one_store_motion_pass (); 1222 1.1 mrg return 0; 1223 1.1 mrg } 1224 1.1 mrg 1225 1.1 mrg namespace { 1226 1.1 mrg 1227 1.1 mrg const pass_data pass_data_rtl_store_motion = 1228 1.1 mrg { 1229 1.1 mrg RTL_PASS, /* type */ 1230 1.1 mrg "store_motion", /* name */ 1231 1.1 mrg OPTGROUP_NONE, /* optinfo_flags */ 1232 1.1 mrg TV_LSM, /* tv_id */ 1233 1.1 mrg PROP_cfglayout, /* properties_required */ 1234 1.1 mrg 0, /* properties_provided */ 1235 1.1 mrg 0, /* properties_destroyed */ 1236 1.1 mrg 0, /* todo_flags_start */ 1237 1.1 mrg TODO_df_finish, /* todo_flags_finish */ 1238 1.1 mrg }; 1239 1.1 mrg 1240 1.1 mrg class pass_rtl_store_motion : public rtl_opt_pass 1241 1.1 mrg { 1242 1.1 mrg public: 1243 1.1 mrg pass_rtl_store_motion (gcc::context *ctxt) 1244 1.1 mrg : rtl_opt_pass (pass_data_rtl_store_motion, ctxt) 1245 1.1 mrg {} 1246 1.1 mrg 1247 1.1 mrg /* opt_pass methods: */ 1248 1.1 mrg virtual bool gate (function *); 1249 1.1 mrg virtual unsigned int execute (function *) 1250 1.1 mrg { 1251 1.1 mrg return execute_rtl_store_motion (); 1252 1.1 mrg } 1253 1.1 mrg 1254 1.1 mrg }; // class pass_rtl_store_motion 1255 1.1 mrg 1256 1.1 mrg bool 1257 1.1 mrg pass_rtl_store_motion::gate (function *fun) 1258 1.1 mrg { 1259 1.1 mrg return optimize > 0 && flag_gcse_sm 1260 1.1 mrg && !fun->calls_setjmp 1261 1.1 mrg && optimize_function_for_speed_p (fun) 1262 1.1 mrg && dbg_cnt (store_motion); 1263 1.1 mrg } 1264 1.1 mrg 1265 1.1 mrg } // anon namespace 1266 1.1 mrg 1267 1.1 mrg rtl_opt_pass * 1268 1.1 mrg make_pass_rtl_store_motion (gcc::context *ctxt) 1269 1.1 mrg { 1270 return new pass_rtl_store_motion (ctxt); 1271 } 1272