1 /* Register renaming for the GNU compiler. 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 3 2010 Free Software Foundation, Inc. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it 8 under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3, or (at your option) 10 any later version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15 License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 #include "config.h" 22 #include "system.h" 23 #include "coretypes.h" 24 #include "tm.h" 25 #include "rtl.h" 26 #include "tm_p.h" 27 #include "insn-config.h" 28 #include "regs.h" 29 #include "addresses.h" 30 #include "hard-reg-set.h" 31 #include "basic-block.h" 32 #include "reload.h" 33 #include "output.h" 34 #include "function.h" 35 #include "recog.h" 36 #include "flags.h" 37 #include "toplev.h" 38 #include "obstack.h" 39 #include "timevar.h" 40 #include "tree-pass.h" 41 #include "df.h" 42 43 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS 44 #error "Use a different bitmap implementation for untracked_operands." 45 #endif 46 47 /* We keep linked lists of DU_HEAD structures, each of which describes 48 a chain of occurrences of a reg. */ 49 struct du_head 50 { 51 /* The next chain. */ 52 struct du_head *next_chain; 53 /* The first and last elements of this chain. */ 54 struct du_chain *first, *last; 55 /* Describes the register being tracked. */ 56 unsigned regno, nregs; 57 58 /* A unique id to be used as an index into the conflicts bitmaps. */ 59 unsigned id; 60 /* A bitmap to record conflicts with other chains. */ 61 bitmap_head conflicts; 62 /* Conflicts with untracked hard registers. */ 63 HARD_REG_SET hard_conflicts; 64 65 /* Nonzero if the chain is finished; zero if it is still open. */ 66 unsigned int terminated:1; 67 /* Nonzero if the chain crosses a call. */ 68 unsigned int need_caller_save_reg:1; 69 /* Nonzero if the register is used in a way that prevents renaming, 70 such as the SET_DEST of a CALL_INSN or an asm operand that used 71 to be a hard register. */ 72 unsigned int cannot_rename:1; 73 }; 74 75 /* This struct describes a single occurrence of a register. */ 76 struct du_chain 77 { 78 /* Links to the next occurrence of the register. */ 79 struct du_chain *next_use; 80 81 /* The insn where the register appears. */ 82 rtx insn; 83 /* The location inside the insn. */ 84 rtx *loc; 85 /* The register class required by the insn at this location. */ 86 ENUM_BITFIELD(reg_class) cl : 16; 87 }; 88 89 enum scan_actions 90 { 91 terminate_write, 92 terminate_dead, 93 mark_all_read, 94 mark_read, 95 mark_write, 96 /* mark_access is for marking the destination regs in 97 REG_FRAME_RELATED_EXPR notes (as if they were read) so that the 98 note is updated properly. */ 99 mark_access 100 }; 101 102 static const char * const scan_actions_name[] = 103 { 104 "terminate_write", 105 "terminate_dead", 106 "mark_all_read", 107 "mark_read", 108 "mark_write", 109 "mark_access" 110 }; 111 112 static struct obstack rename_obstack; 113 114 static void do_replace (struct du_head *, int); 115 static void scan_rtx_reg (rtx, rtx *, enum reg_class, 116 enum scan_actions, enum op_type); 117 static void scan_rtx_address (rtx, rtx *, enum reg_class, 118 enum scan_actions, enum machine_mode); 119 static void scan_rtx (rtx, rtx *, enum reg_class, enum scan_actions, 120 enum op_type); 121 static struct du_head *build_def_use (basic_block); 122 static void dump_def_use_chain (struct du_head *); 123 124 typedef struct du_head *du_head_p; 125 DEF_VEC_P (du_head_p); 126 DEF_VEC_ALLOC_P (du_head_p, heap); 127 static VEC(du_head_p, heap) *id_to_chain; 128 129 static void 130 free_chain_data (void) 131 { 132 int i; 133 du_head_p ptr; 134 for (i = 0; VEC_iterate(du_head_p, id_to_chain, i, ptr); i++) 135 bitmap_clear (&ptr->conflicts); 136 137 VEC_free (du_head_p, heap, id_to_chain); 138 } 139 140 /* For a def-use chain HEAD, find which registers overlap its lifetime and 141 set the corresponding bits in *PSET. */ 142 143 static void 144 merge_overlapping_regs (HARD_REG_SET *pset, struct du_head *head) 145 { 146 bitmap_iterator bi; 147 unsigned i; 148 IOR_HARD_REG_SET (*pset, head->hard_conflicts); 149 EXECUTE_IF_SET_IN_BITMAP (&head->conflicts, 0, i, bi) 150 { 151 du_head_p other = VEC_index (du_head_p, id_to_chain, i); 152 unsigned j = other->nregs; 153 while (j-- > 0) 154 SET_HARD_REG_BIT (*pset, other->regno + j); 155 } 156 } 157 158 /* Perform register renaming on the current function. */ 159 160 static unsigned int 161 regrename_optimize (void) 162 { 163 int tick[FIRST_PSEUDO_REGISTER]; 164 int this_tick = 0; 165 basic_block bb; 166 char *first_obj; 167 168 df_set_flags (DF_LR_RUN_DCE); 169 df_note_add_problem (); 170 df_analyze (); 171 df_set_flags (DF_DEFER_INSN_RESCAN); 172 173 memset (tick, 0, sizeof tick); 174 175 gcc_obstack_init (&rename_obstack); 176 first_obj = XOBNEWVAR (&rename_obstack, char, 0); 177 178 FOR_EACH_BB (bb) 179 { 180 struct du_head *all_chains = 0; 181 HARD_REG_SET unavailable; 182 #if 0 183 HARD_REG_SET regs_seen; 184 CLEAR_HARD_REG_SET (regs_seen); 185 #endif 186 187 id_to_chain = VEC_alloc (du_head_p, heap, 0); 188 189 CLEAR_HARD_REG_SET (unavailable); 190 191 if (dump_file) 192 fprintf (dump_file, "\nBasic block %d:\n", bb->index); 193 194 all_chains = build_def_use (bb); 195 196 if (dump_file) 197 dump_def_use_chain (all_chains); 198 199 CLEAR_HARD_REG_SET (unavailable); 200 /* Don't clobber traceback for noreturn functions. */ 201 if (frame_pointer_needed) 202 { 203 add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM); 204 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 205 add_to_hard_reg_set (&unavailable, Pmode, HARD_FRAME_POINTER_REGNUM); 206 #endif 207 } 208 209 while (all_chains) 210 { 211 int new_reg, best_new_reg, best_nregs; 212 int n_uses; 213 struct du_head *this_head = all_chains; 214 struct du_chain *tmp; 215 HARD_REG_SET this_unavailable; 216 int reg = this_head->regno; 217 int i; 218 219 all_chains = this_head->next_chain; 220 221 if (this_head->cannot_rename) 222 continue; 223 224 best_new_reg = reg; 225 best_nregs = this_head->nregs; 226 227 #if 0 /* This just disables optimization opportunities. */ 228 /* Only rename once we've seen the reg more than once. */ 229 if (! TEST_HARD_REG_BIT (regs_seen, reg)) 230 { 231 SET_HARD_REG_BIT (regs_seen, reg); 232 continue; 233 } 234 #endif 235 236 if (fixed_regs[reg] || global_regs[reg] 237 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 238 || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM) 239 #else 240 || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM) 241 #endif 242 ) 243 continue; 244 245 COPY_HARD_REG_SET (this_unavailable, unavailable); 246 247 /* Count number of uses, and narrow the set of registers we can 248 use for renaming. */ 249 n_uses = 0; 250 for (tmp = this_head->first; tmp; tmp = tmp->next_use) 251 { 252 if (DEBUG_INSN_P (tmp->insn)) 253 continue; 254 n_uses++; 255 IOR_COMPL_HARD_REG_SET (this_unavailable, 256 reg_class_contents[tmp->cl]); 257 } 258 259 if (n_uses < 2) 260 continue; 261 262 if (this_head->need_caller_save_reg) 263 IOR_HARD_REG_SET (this_unavailable, call_used_reg_set); 264 265 merge_overlapping_regs (&this_unavailable, this_head); 266 267 /* Now potential_regs is a reasonable approximation, let's 268 have a closer look at each register still in there. */ 269 for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++) 270 { 271 enum machine_mode mode = GET_MODE (*this_head->first->loc); 272 int nregs = hard_regno_nregs[new_reg][mode]; 273 274 for (i = nregs - 1; i >= 0; --i) 275 if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i) 276 || fixed_regs[new_reg + i] 277 || global_regs[new_reg + i] 278 /* Can't use regs which aren't saved by the prologue. */ 279 || (! df_regs_ever_live_p (new_reg + i) 280 && ! call_used_regs[new_reg + i]) 281 #ifdef LEAF_REGISTERS 282 /* We can't use a non-leaf register if we're in a 283 leaf function. */ 284 || (current_function_is_leaf 285 && !LEAF_REGISTERS[new_reg + i]) 286 #endif 287 #ifdef HARD_REGNO_RENAME_OK 288 || ! HARD_REGNO_RENAME_OK (reg + i, new_reg + i) 289 #endif 290 ) 291 break; 292 if (i >= 0) 293 continue; 294 295 /* See whether it accepts all modes that occur in 296 definition and uses. */ 297 for (tmp = this_head->first; tmp; tmp = tmp->next_use) 298 if ((! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc)) 299 && ! DEBUG_INSN_P (tmp->insn)) 300 || (this_head->need_caller_save_reg 301 && ! (HARD_REGNO_CALL_PART_CLOBBERED 302 (reg, GET_MODE (*tmp->loc))) 303 && (HARD_REGNO_CALL_PART_CLOBBERED 304 (new_reg, GET_MODE (*tmp->loc))))) 305 break; 306 if (! tmp) 307 { 308 if (tick[best_new_reg] > tick[new_reg]) 309 { 310 best_new_reg = new_reg; 311 best_nregs = nregs; 312 } 313 } 314 } 315 316 if (dump_file) 317 { 318 fprintf (dump_file, "Register %s in insn %d", 319 reg_names[reg], INSN_UID (this_head->first->insn)); 320 if (this_head->need_caller_save_reg) 321 fprintf (dump_file, " crosses a call"); 322 } 323 324 if (best_new_reg == reg) 325 { 326 tick[reg] = ++this_tick; 327 if (dump_file) 328 fprintf (dump_file, "; no available better choice\n"); 329 continue; 330 } 331 332 if (dump_file) 333 fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]); 334 335 do_replace (this_head, best_new_reg); 336 this_head->regno = best_new_reg; 337 this_head->nregs = best_nregs; 338 tick[best_new_reg] = ++this_tick; 339 df_set_regs_ever_live (best_new_reg, true); 340 } 341 342 free_chain_data (); 343 obstack_free (&rename_obstack, first_obj); 344 } 345 346 obstack_free (&rename_obstack, NULL); 347 348 if (dump_file) 349 fputc ('\n', dump_file); 350 351 return 0; 352 } 353 354 static void 355 do_replace (struct du_head *head, int reg) 356 { 357 struct du_chain *chain; 358 unsigned int base_regno = head->regno; 359 bool found_note = false; 360 361 gcc_assert (! DEBUG_INSN_P (head->first->insn)); 362 363 for (chain = head->first; chain; chain = chain->next_use) 364 { 365 unsigned int regno = ORIGINAL_REGNO (*chain->loc); 366 struct reg_attrs *attr = REG_ATTRS (*chain->loc); 367 int reg_ptr = REG_POINTER (*chain->loc); 368 369 if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno) 370 INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC (); 371 else 372 { 373 rtx note; 374 375 *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg); 376 if (regno >= FIRST_PSEUDO_REGISTER) 377 ORIGINAL_REGNO (*chain->loc) = regno; 378 REG_ATTRS (*chain->loc) = attr; 379 REG_POINTER (*chain->loc) = reg_ptr; 380 381 for (note = REG_NOTES (chain->insn); note; note = XEXP (note, 1)) 382 { 383 enum reg_note kind = REG_NOTE_KIND (note); 384 if (kind == REG_DEAD || kind == REG_UNUSED) 385 { 386 rtx reg = XEXP (note, 0); 387 gcc_assert (HARD_REGISTER_P (reg)); 388 389 if (REGNO (reg) == base_regno) 390 { 391 found_note = true; 392 if (kind == REG_DEAD 393 && reg_set_p (*chain->loc, chain->insn)) 394 remove_note (chain->insn, note); 395 else 396 XEXP (note, 0) = *chain->loc; 397 break; 398 } 399 } 400 } 401 } 402 403 df_insn_rescan (chain->insn); 404 } 405 if (!found_note) 406 { 407 /* If the chain's first insn is the same as the last, we should have 408 found a REG_UNUSED note. */ 409 gcc_assert (head->first->insn != head->last->insn); 410 if (!reg_set_p (*head->last->loc, head->last->insn)) 411 add_reg_note (head->last->insn, REG_DEAD, *head->last->loc); 412 } 413 } 414 415 416 /* Walk all chains starting with CHAINS and record that they conflict with 417 another chain whose id is ID. */ 418 419 static void 420 mark_conflict (struct du_head *chains, unsigned id) 421 { 422 while (chains) 423 { 424 bitmap_set_bit (&chains->conflicts, id); 425 chains = chains->next_chain; 426 } 427 } 428 429 /* True if we found a register with a size mismatch, which means that we 430 can't track its lifetime accurately. If so, we abort the current block 431 without renaming. */ 432 static bool fail_current_block; 433 434 /* The id to be given to the next opened chain. */ 435 static unsigned current_id; 436 437 /* List of currently open chains, and closed chains that can be renamed. */ 438 static struct du_head *open_chains; 439 static struct du_head *closed_chains; 440 441 /* Bitmap of open chains. The bits set always match the list found in 442 open_chains. */ 443 static bitmap_head open_chains_set; 444 445 /* Record the registers being tracked in open_chains. */ 446 static HARD_REG_SET live_in_chains; 447 448 /* Record the registers that are live but not tracked. The intersection 449 between this and live_in_chains is empty. */ 450 static HARD_REG_SET live_hard_regs; 451 452 /* Return true if OP is a reg for which all bits are set in PSET, false 453 if all bits are clear. 454 In other cases, set fail_current_block and return false. */ 455 456 static bool 457 verify_reg_in_set (rtx op, HARD_REG_SET *pset) 458 { 459 unsigned regno, nregs; 460 bool all_live, all_dead; 461 if (!REG_P (op)) 462 return false; 463 464 regno = REGNO (op); 465 nregs = hard_regno_nregs[regno][GET_MODE (op)]; 466 all_live = all_dead = true; 467 while (nregs-- > 0) 468 if (TEST_HARD_REG_BIT (*pset, regno + nregs)) 469 all_dead = false; 470 else 471 all_live = false; 472 if (!all_dead && !all_live) 473 { 474 fail_current_block = true; 475 return false; 476 } 477 return all_live; 478 } 479 480 /* Return true if OP is a reg that is being tracked already in some form. 481 May set fail_current_block if it sees an unhandled case of overlap. */ 482 483 static bool 484 verify_reg_tracked (rtx op) 485 { 486 return (verify_reg_in_set (op, &live_hard_regs) 487 || verify_reg_in_set (op, &live_in_chains)); 488 } 489 490 /* Called through note_stores. DATA points to a rtx_code, either SET or 491 CLOBBER, which tells us which kind of rtx to look at. If we have a 492 match, record the set register in live_hard_regs and in the hard_conflicts 493 bitmap of open chains. */ 494 495 static void 496 note_sets_clobbers (rtx x, const_rtx set, void *data) 497 { 498 enum rtx_code code = *(enum rtx_code *)data; 499 struct du_head *chain; 500 501 if (GET_CODE (x) == SUBREG) 502 x = SUBREG_REG (x); 503 if (!REG_P (x) || GET_CODE (set) != code) 504 return; 505 /* There must not be pseudos at this point. */ 506 gcc_assert (HARD_REGISTER_P (x)); 507 add_to_hard_reg_set (&live_hard_regs, GET_MODE (x), REGNO (x)); 508 for (chain = open_chains; chain; chain = chain->next_chain) 509 add_to_hard_reg_set (&chain->hard_conflicts, GET_MODE (x), REGNO (x)); 510 } 511 512 /* Create a new chain for THIS_NREGS registers starting at THIS_REGNO, 513 and record its occurrence in *LOC, which is being written to in INSN. 514 This access requires a register of class CL. */ 515 516 static void 517 create_new_chain (unsigned this_regno, unsigned this_nregs, rtx *loc, 518 rtx insn, enum reg_class cl) 519 { 520 struct du_head *head = XOBNEW (&rename_obstack, struct du_head); 521 struct du_chain *this_du; 522 int nregs; 523 524 head->next_chain = open_chains; 525 open_chains = head; 526 head->regno = this_regno; 527 head->nregs = this_nregs; 528 head->need_caller_save_reg = 0; 529 head->cannot_rename = 0; 530 head->terminated = 0; 531 532 VEC_safe_push (du_head_p, heap, id_to_chain, head); 533 head->id = current_id++; 534 535 bitmap_initialize (&head->conflicts, &bitmap_default_obstack); 536 bitmap_copy (&head->conflicts, &open_chains_set); 537 mark_conflict (open_chains, head->id); 538 539 /* Since we're tracking this as a chain now, remove it from the 540 list of conflicting live hard registers and track it in 541 live_in_chains instead. */ 542 nregs = head->nregs; 543 while (nregs-- > 0) 544 { 545 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs); 546 CLEAR_HARD_REG_BIT (live_hard_regs, head->regno + nregs); 547 } 548 549 COPY_HARD_REG_SET (head->hard_conflicts, live_hard_regs); 550 bitmap_set_bit (&open_chains_set, head->id); 551 552 open_chains = head; 553 554 if (dump_file) 555 { 556 fprintf (dump_file, "Creating chain %s (%d)", 557 reg_names[head->regno], head->id); 558 if (insn != NULL_RTX) 559 fprintf (dump_file, " at insn %d", INSN_UID (insn)); 560 fprintf (dump_file, "\n"); 561 } 562 563 if (insn == NULL_RTX) 564 { 565 head->first = head->last = NULL; 566 return; 567 } 568 569 this_du = XOBNEW (&rename_obstack, struct du_chain); 570 head->first = head->last = this_du; 571 572 this_du->next_use = 0; 573 this_du->loc = loc; 574 this_du->insn = insn; 575 this_du->cl = cl; 576 } 577 578 static void 579 scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action, 580 enum op_type type) 581 { 582 struct du_head **p; 583 rtx x = *loc; 584 enum machine_mode mode = GET_MODE (x); 585 unsigned this_regno = REGNO (x); 586 unsigned this_nregs = hard_regno_nregs[this_regno][mode]; 587 588 if (action == mark_write) 589 { 590 if (type == OP_OUT) 591 create_new_chain (this_regno, this_nregs, loc, insn, cl); 592 return; 593 } 594 595 if ((type == OP_OUT) != (action == terminate_write || action == mark_access)) 596 return; 597 598 for (p = &open_chains; *p;) 599 { 600 struct du_head *head = *p; 601 struct du_head *next = head->next_chain; 602 int exact_match = (head->regno == this_regno 603 && head->nregs == this_nregs); 604 int superset = (this_regno <= head->regno 605 && this_regno + this_nregs >= head->regno + head->nregs); 606 int subset = (this_regno >= head->regno 607 && this_regno + this_nregs <= head->regno + head->nregs); 608 609 if (head->terminated 610 || head->regno + head->nregs <= this_regno 611 || this_regno + this_nregs <= head->regno) 612 { 613 p = &head->next_chain; 614 continue; 615 } 616 617 if (action == mark_read || action == mark_access) 618 { 619 /* ??? Class NO_REGS can happen if the md file makes use of 620 EXTRA_CONSTRAINTS to match registers. Which is arguably 621 wrong, but there we are. */ 622 623 if (cl == NO_REGS || (!exact_match && !DEBUG_INSN_P (insn))) 624 { 625 if (dump_file) 626 fprintf (dump_file, 627 "Cannot rename chain %s (%d) at insn %d (%s)\n", 628 reg_names[head->regno], head->id, INSN_UID (insn), 629 scan_actions_name[(int) action]); 630 head->cannot_rename = 1; 631 if (superset) 632 { 633 unsigned nregs = this_nregs; 634 head->regno = this_regno; 635 head->nregs = this_nregs; 636 while (nregs-- > 0) 637 SET_HARD_REG_BIT (live_in_chains, head->regno + nregs); 638 if (dump_file) 639 fprintf (dump_file, 640 "Widening register in chain %s (%d) at insn %d\n", 641 reg_names[head->regno], head->id, INSN_UID (insn)); 642 } 643 else if (!subset) 644 { 645 fail_current_block = true; 646 if (dump_file) 647 fprintf (dump_file, 648 "Failing basic block due to unhandled overlap\n"); 649 } 650 } 651 else 652 { 653 struct du_chain *this_du; 654 this_du = XOBNEW (&rename_obstack, struct du_chain); 655 this_du->next_use = 0; 656 this_du->loc = loc; 657 this_du->insn = insn; 658 this_du->cl = cl; 659 if (head->first == NULL) 660 head->first = this_du; 661 else 662 head->last->next_use = this_du; 663 head->last = this_du; 664 665 } 666 /* Avoid adding the same location in a DEBUG_INSN multiple times, 667 which could happen with non-exact overlap. */ 668 if (DEBUG_INSN_P (insn)) 669 return; 670 /* Otherwise, find any other chains that do not match exactly; 671 ensure they all get marked unrenamable. */ 672 p = &head->next_chain; 673 continue; 674 } 675 676 /* Whether the terminated chain can be used for renaming 677 depends on the action and this being an exact match. 678 In either case, we remove this element from open_chains. */ 679 680 if ((action == terminate_dead || action == terminate_write) 681 && superset) 682 { 683 unsigned nregs; 684 685 head->terminated = 1; 686 head->next_chain = closed_chains; 687 closed_chains = head; 688 bitmap_clear_bit (&open_chains_set, head->id); 689 690 nregs = head->nregs; 691 while (nregs-- > 0) 692 CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs); 693 694 *p = next; 695 if (dump_file) 696 fprintf (dump_file, 697 "Closing chain %s (%d) at insn %d (%s)\n", 698 reg_names[head->regno], head->id, INSN_UID (insn), 699 scan_actions_name[(int) action]); 700 } 701 else if (action == terminate_dead || action == terminate_write) 702 { 703 /* In this case, tracking liveness gets too hard. Fail the 704 entire basic block. */ 705 if (dump_file) 706 fprintf (dump_file, 707 "Failing basic block due to unhandled overlap\n"); 708 fail_current_block = true; 709 return; 710 } 711 else 712 { 713 head->cannot_rename = 1; 714 if (dump_file) 715 fprintf (dump_file, 716 "Cannot rename chain %s (%d) at insn %d (%s)\n", 717 reg_names[head->regno], head->id, INSN_UID (insn), 718 scan_actions_name[(int) action]); 719 p = &head->next_chain; 720 } 721 } 722 } 723 724 /* Adapted from find_reloads_address_1. CL is INDEX_REG_CLASS or 725 BASE_REG_CLASS depending on how the register is being considered. */ 726 727 static void 728 scan_rtx_address (rtx insn, rtx *loc, enum reg_class cl, 729 enum scan_actions action, enum machine_mode mode) 730 { 731 rtx x = *loc; 732 RTX_CODE code = GET_CODE (x); 733 const char *fmt; 734 int i, j; 735 736 if (action == mark_write || action == mark_access) 737 return; 738 739 switch (code) 740 { 741 case PLUS: 742 { 743 rtx orig_op0 = XEXP (x, 0); 744 rtx orig_op1 = XEXP (x, 1); 745 RTX_CODE code0 = GET_CODE (orig_op0); 746 RTX_CODE code1 = GET_CODE (orig_op1); 747 rtx op0 = orig_op0; 748 rtx op1 = orig_op1; 749 rtx *locI = NULL; 750 rtx *locB = NULL; 751 enum rtx_code index_code = SCRATCH; 752 753 if (GET_CODE (op0) == SUBREG) 754 { 755 op0 = SUBREG_REG (op0); 756 code0 = GET_CODE (op0); 757 } 758 759 if (GET_CODE (op1) == SUBREG) 760 { 761 op1 = SUBREG_REG (op1); 762 code1 = GET_CODE (op1); 763 } 764 765 if (code0 == MULT || code0 == SIGN_EXTEND || code0 == TRUNCATE 766 || code0 == ZERO_EXTEND || code1 == MEM) 767 { 768 locI = &XEXP (x, 0); 769 locB = &XEXP (x, 1); 770 index_code = GET_CODE (*locI); 771 } 772 else if (code1 == MULT || code1 == SIGN_EXTEND || code1 == TRUNCATE 773 || code1 == ZERO_EXTEND || code0 == MEM) 774 { 775 locI = &XEXP (x, 1); 776 locB = &XEXP (x, 0); 777 index_code = GET_CODE (*locI); 778 } 779 else if (code0 == CONST_INT || code0 == CONST 780 || code0 == SYMBOL_REF || code0 == LABEL_REF) 781 { 782 locB = &XEXP (x, 1); 783 index_code = GET_CODE (XEXP (x, 0)); 784 } 785 else if (code1 == CONST_INT || code1 == CONST 786 || code1 == SYMBOL_REF || code1 == LABEL_REF) 787 { 788 locB = &XEXP (x, 0); 789 index_code = GET_CODE (XEXP (x, 1)); 790 } 791 else if (code0 == REG && code1 == REG) 792 { 793 int index_op; 794 unsigned regno0 = REGNO (op0), regno1 = REGNO (op1); 795 796 if (REGNO_OK_FOR_INDEX_P (regno1) 797 && regno_ok_for_base_p (regno0, mode, PLUS, REG)) 798 index_op = 1; 799 else if (REGNO_OK_FOR_INDEX_P (regno0) 800 && regno_ok_for_base_p (regno1, mode, PLUS, REG)) 801 index_op = 0; 802 else if (regno_ok_for_base_p (regno0, mode, PLUS, REG) 803 || REGNO_OK_FOR_INDEX_P (regno1)) 804 index_op = 1; 805 else if (regno_ok_for_base_p (regno1, mode, PLUS, REG)) 806 index_op = 0; 807 else 808 index_op = 1; 809 810 locI = &XEXP (x, index_op); 811 locB = &XEXP (x, !index_op); 812 index_code = GET_CODE (*locI); 813 } 814 else if (code0 == REG) 815 { 816 locI = &XEXP (x, 0); 817 locB = &XEXP (x, 1); 818 index_code = GET_CODE (*locI); 819 } 820 else if (code1 == REG) 821 { 822 locI = &XEXP (x, 1); 823 locB = &XEXP (x, 0); 824 index_code = GET_CODE (*locI); 825 } 826 827 if (locI) 828 scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode); 829 if (locB) 830 scan_rtx_address (insn, locB, base_reg_class (mode, PLUS, index_code), 831 action, mode); 832 833 return; 834 } 835 836 case POST_INC: 837 case POST_DEC: 838 case POST_MODIFY: 839 case PRE_INC: 840 case PRE_DEC: 841 case PRE_MODIFY: 842 #ifndef AUTO_INC_DEC 843 /* If the target doesn't claim to handle autoinc, this must be 844 something special, like a stack push. Kill this chain. */ 845 action = mark_all_read; 846 #endif 847 break; 848 849 case MEM: 850 scan_rtx_address (insn, &XEXP (x, 0), 851 base_reg_class (GET_MODE (x), MEM, SCRATCH), action, 852 GET_MODE (x)); 853 return; 854 855 case REG: 856 scan_rtx_reg (insn, loc, cl, action, OP_IN); 857 return; 858 859 default: 860 break; 861 } 862 863 fmt = GET_RTX_FORMAT (code); 864 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 865 { 866 if (fmt[i] == 'e') 867 scan_rtx_address (insn, &XEXP (x, i), cl, action, mode); 868 else if (fmt[i] == 'E') 869 for (j = XVECLEN (x, i) - 1; j >= 0; j--) 870 scan_rtx_address (insn, &XVECEXP (x, i, j), cl, action, mode); 871 } 872 } 873 874 static void 875 scan_rtx (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action, 876 enum op_type type) 877 { 878 const char *fmt; 879 rtx x = *loc; 880 enum rtx_code code = GET_CODE (x); 881 int i, j; 882 883 code = GET_CODE (x); 884 switch (code) 885 { 886 case CONST: 887 case CONST_INT: 888 case CONST_DOUBLE: 889 case CONST_FIXED: 890 case CONST_VECTOR: 891 case SYMBOL_REF: 892 case LABEL_REF: 893 case CC0: 894 case PC: 895 return; 896 897 case REG: 898 scan_rtx_reg (insn, loc, cl, action, type); 899 return; 900 901 case MEM: 902 scan_rtx_address (insn, &XEXP (x, 0), 903 base_reg_class (GET_MODE (x), MEM, SCRATCH), action, 904 GET_MODE (x)); 905 return; 906 907 case SET: 908 scan_rtx (insn, &SET_SRC (x), cl, action, OP_IN); 909 scan_rtx (insn, &SET_DEST (x), cl, action, 910 (GET_CODE (PATTERN (insn)) == COND_EXEC 911 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT); 912 return; 913 914 case STRICT_LOW_PART: 915 scan_rtx (insn, &XEXP (x, 0), cl, action, 916 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT); 917 return; 918 919 case ZERO_EXTRACT: 920 case SIGN_EXTRACT: 921 scan_rtx (insn, &XEXP (x, 0), cl, action, 922 (type == OP_IN ? OP_IN : 923 verify_reg_tracked (XEXP (x, 0)) ? OP_INOUT : OP_OUT)); 924 scan_rtx (insn, &XEXP (x, 1), cl, action, OP_IN); 925 scan_rtx (insn, &XEXP (x, 2), cl, action, OP_IN); 926 return; 927 928 case POST_INC: 929 case PRE_INC: 930 case POST_DEC: 931 case PRE_DEC: 932 case POST_MODIFY: 933 case PRE_MODIFY: 934 /* Should only happen inside MEM. */ 935 gcc_unreachable (); 936 937 case CLOBBER: 938 scan_rtx (insn, &SET_DEST (x), cl, action, 939 (GET_CODE (PATTERN (insn)) == COND_EXEC 940 && verify_reg_tracked (SET_DEST (x))) ? OP_INOUT : OP_OUT); 941 return; 942 943 case EXPR_LIST: 944 scan_rtx (insn, &XEXP (x, 0), cl, action, type); 945 if (XEXP (x, 1)) 946 scan_rtx (insn, &XEXP (x, 1), cl, action, type); 947 return; 948 949 default: 950 break; 951 } 952 953 fmt = GET_RTX_FORMAT (code); 954 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 955 { 956 if (fmt[i] == 'e') 957 scan_rtx (insn, &XEXP (x, i), cl, action, type); 958 else if (fmt[i] == 'E') 959 for (j = XVECLEN (x, i) - 1; j >= 0; j--) 960 scan_rtx (insn, &XVECEXP (x, i, j), cl, action, type); 961 } 962 } 963 964 /* Hide operands of the current insn (of which there are N_OPS) by 965 substituting cc0 for them. 966 Previous values are stored in the OLD_OPERANDS and OLD_DUPS. 967 For every bit set in DO_NOT_HIDE, we leave the operand alone. 968 If INOUT_AND_EC_ONLY is set, we only do this for OP_INOUT type operands 969 and earlyclobbers. */ 970 971 static void 972 hide_operands (int n_ops, rtx *old_operands, rtx *old_dups, 973 unsigned HOST_WIDE_INT do_not_hide, bool inout_and_ec_only) 974 { 975 int i; 976 int alt = which_alternative; 977 for (i = 0; i < n_ops; i++) 978 { 979 old_operands[i] = recog_data.operand[i]; 980 /* Don't squash match_operator or match_parallel here, since 981 we don't know that all of the contained registers are 982 reachable by proper operands. */ 983 if (recog_data.constraints[i][0] == '\0') 984 continue; 985 if (do_not_hide & (1 << i)) 986 continue; 987 if (!inout_and_ec_only || recog_data.operand_type[i] == OP_INOUT 988 || recog_op_alt[i][alt].earlyclobber) 989 *recog_data.operand_loc[i] = cc0_rtx; 990 } 991 for (i = 0; i < recog_data.n_dups; i++) 992 { 993 int opn = recog_data.dup_num[i]; 994 old_dups[i] = *recog_data.dup_loc[i]; 995 if (do_not_hide & (1 << opn)) 996 continue; 997 if (!inout_and_ec_only || recog_data.operand_type[opn] == OP_INOUT 998 || recog_op_alt[opn][alt].earlyclobber) 999 *recog_data.dup_loc[i] = cc0_rtx; 1000 } 1001 } 1002 1003 /* Undo the substitution performed by hide_operands. INSN is the insn we 1004 are processing; the arguments are the same as in hide_operands. */ 1005 1006 static void 1007 restore_operands (rtx insn, int n_ops, rtx *old_operands, rtx *old_dups) 1008 { 1009 int i; 1010 for (i = 0; i < recog_data.n_dups; i++) 1011 *recog_data.dup_loc[i] = old_dups[i]; 1012 for (i = 0; i < n_ops; i++) 1013 *recog_data.operand_loc[i] = old_operands[i]; 1014 if (recog_data.n_dups) 1015 df_insn_rescan (insn); 1016 } 1017 1018 /* For each output operand of INSN, call scan_rtx to create a new 1019 open chain. Do this only for normal or earlyclobber outputs, 1020 depending on EARLYCLOBBER. */ 1021 1022 static void 1023 record_out_operands (rtx insn, bool earlyclobber) 1024 { 1025 int n_ops = recog_data.n_operands; 1026 int alt = which_alternative; 1027 1028 int i; 1029 1030 for (i = 0; i < n_ops + recog_data.n_dups; i++) 1031 { 1032 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops]; 1033 rtx *loc = (i < n_ops 1034 ? recog_data.operand_loc[opn] 1035 : recog_data.dup_loc[i - n_ops]); 1036 rtx op = *loc; 1037 enum reg_class cl = recog_op_alt[opn][alt].cl; 1038 1039 struct du_head *prev_open; 1040 1041 if (recog_data.operand_type[opn] != OP_OUT 1042 || recog_op_alt[opn][alt].earlyclobber != earlyclobber) 1043 continue; 1044 1045 prev_open = open_chains; 1046 scan_rtx (insn, loc, cl, mark_write, OP_OUT); 1047 1048 /* ??? Many targets have output constraints on the SET_DEST 1049 of a call insn, which is stupid, since these are certainly 1050 ABI defined hard registers. For these, and for asm operands 1051 that originally referenced hard registers, we must record that 1052 the chain cannot be renamed. */ 1053 if (CALL_P (insn) 1054 || (asm_noperands (PATTERN (insn)) > 0 1055 && REG_P (op) 1056 && REGNO (op) == ORIGINAL_REGNO (op))) 1057 { 1058 if (prev_open != open_chains) 1059 open_chains->cannot_rename = 1; 1060 } 1061 } 1062 } 1063 1064 /* Build def/use chain. */ 1065 1066 static struct du_head * 1067 build_def_use (basic_block bb) 1068 { 1069 rtx insn; 1070 df_ref *def_rec; 1071 unsigned HOST_WIDE_INT untracked_operands; 1072 1073 open_chains = closed_chains = NULL; 1074 1075 fail_current_block = false; 1076 1077 current_id = 0; 1078 bitmap_initialize (&open_chains_set, &bitmap_default_obstack); 1079 CLEAR_HARD_REG_SET (live_in_chains); 1080 REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_in (bb)); 1081 for (def_rec = df_get_artificial_defs (bb->index); *def_rec; def_rec++) 1082 { 1083 df_ref def = *def_rec; 1084 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP) 1085 SET_HARD_REG_BIT (live_hard_regs, DF_REF_REGNO (def)); 1086 } 1087 1088 for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn)) 1089 { 1090 if (NONDEBUG_INSN_P (insn)) 1091 { 1092 int n_ops; 1093 rtx note; 1094 rtx old_operands[MAX_RECOG_OPERANDS]; 1095 rtx old_dups[MAX_DUP_OPERANDS]; 1096 int i; 1097 int alt; 1098 int predicated; 1099 enum rtx_code set_code = SET; 1100 enum rtx_code clobber_code = CLOBBER; 1101 1102 /* Process the insn, determining its effect on the def-use 1103 chains and live hard registers. We perform the following 1104 steps with the register references in the insn, simulating 1105 its effect: 1106 (1) Deal with earlyclobber operands and CLOBBERs of non-operands 1107 by creating chains and marking hard regs live. 1108 (2) Any read outside an operand causes any chain it overlaps 1109 with to be marked unrenamable. 1110 (3) Any read inside an operand is added if there's already 1111 an open chain for it. 1112 (4) For any REG_DEAD note we find, close open chains that 1113 overlap it. 1114 (5) For any non-earlyclobber write we find, close open chains 1115 that overlap it. 1116 (6) For any non-earlyclobber write we find in an operand, make 1117 a new chain or mark the hard register as live. 1118 (7) For any REG_UNUSED, close any chains we just opened. 1119 1120 We cannot deal with situations where we track a reg in one mode 1121 and see a reference in another mode; these will cause the chain 1122 to be marked unrenamable or even cause us to abort the entire 1123 basic block. */ 1124 1125 extract_insn (insn); 1126 if (! constrain_operands (1)) 1127 fatal_insn_not_found (insn); 1128 preprocess_constraints (); 1129 alt = which_alternative; 1130 n_ops = recog_data.n_operands; 1131 untracked_operands = 0; 1132 1133 /* Simplify the code below by rewriting things to reflect 1134 matching constraints. Also promote OP_OUT to OP_INOUT in 1135 predicated instructions, but only for register operands 1136 that are already tracked, so that we can create a chain 1137 when the first SET makes a register live. */ 1138 1139 predicated = GET_CODE (PATTERN (insn)) == COND_EXEC; 1140 for (i = 0; i < n_ops; ++i) 1141 { 1142 rtx op = recog_data.operand[i]; 1143 int matches = recog_op_alt[i][alt].matches; 1144 if (matches >= 0) 1145 recog_op_alt[i][alt].cl = recog_op_alt[matches][alt].cl; 1146 if (matches >= 0 || recog_op_alt[i][alt].matched >= 0 1147 || (predicated && recog_data.operand_type[i] == OP_OUT)) 1148 { 1149 recog_data.operand_type[i] = OP_INOUT; 1150 /* A special case to deal with instruction patterns that 1151 have matching operands with different modes. If we're 1152 not already tracking such a reg, we won't start here, 1153 and we must instead make sure to make the operand visible 1154 to the machinery that tracks hard registers. */ 1155 if (matches >= 0 1156 && (GET_MODE_SIZE (recog_data.operand_mode[i]) 1157 != GET_MODE_SIZE (recog_data.operand_mode[matches])) 1158 && !verify_reg_in_set (op, &live_in_chains)) 1159 { 1160 untracked_operands |= 1 << i; 1161 untracked_operands |= 1 << matches; 1162 } 1163 } 1164 /* If there's an in-out operand with a register that is not 1165 being tracked at all yet, open a chain. */ 1166 if (recog_data.operand_type[i] == OP_INOUT 1167 && !(untracked_operands & (1 << i)) 1168 && REG_P (op) 1169 && !verify_reg_tracked (op)) 1170 { 1171 enum machine_mode mode = GET_MODE (op); 1172 unsigned this_regno = REGNO (op); 1173 unsigned this_nregs = hard_regno_nregs[this_regno][mode]; 1174 create_new_chain (this_regno, this_nregs, NULL, NULL_RTX, 1175 NO_REGS); 1176 } 1177 } 1178 1179 if (fail_current_block) 1180 break; 1181 1182 /* Step 1a: Mark hard registers that are clobbered in this insn, 1183 outside an operand, as live. */ 1184 hide_operands (n_ops, old_operands, old_dups, untracked_operands, 1185 false); 1186 note_stores (PATTERN (insn), note_sets_clobbers, &clobber_code); 1187 restore_operands (insn, n_ops, old_operands, old_dups); 1188 1189 /* Step 1b: Begin new chains for earlyclobbered writes inside 1190 operands. */ 1191 record_out_operands (insn, true); 1192 1193 /* Step 2: Mark chains for which we have reads outside operands 1194 as unrenamable. 1195 We do this by munging all operands into CC0, and closing 1196 everything remaining. */ 1197 1198 hide_operands (n_ops, old_operands, old_dups, untracked_operands, 1199 false); 1200 scan_rtx (insn, &PATTERN (insn), NO_REGS, mark_all_read, OP_IN); 1201 restore_operands (insn, n_ops, old_operands, old_dups); 1202 1203 /* Step 2B: Can't rename function call argument registers. */ 1204 if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn)) 1205 scan_rtx (insn, &CALL_INSN_FUNCTION_USAGE (insn), 1206 NO_REGS, mark_all_read, OP_IN); 1207 1208 /* Step 2C: Can't rename asm operands that were originally 1209 hard registers. */ 1210 if (asm_noperands (PATTERN (insn)) > 0) 1211 for (i = 0; i < n_ops; i++) 1212 { 1213 rtx *loc = recog_data.operand_loc[i]; 1214 rtx op = *loc; 1215 1216 if (REG_P (op) 1217 && REGNO (op) == ORIGINAL_REGNO (op) 1218 && (recog_data.operand_type[i] == OP_IN 1219 || recog_data.operand_type[i] == OP_INOUT)) 1220 scan_rtx (insn, loc, NO_REGS, mark_all_read, OP_IN); 1221 } 1222 1223 /* Step 3: Append to chains for reads inside operands. */ 1224 for (i = 0; i < n_ops + recog_data.n_dups; i++) 1225 { 1226 int opn = i < n_ops ? i : recog_data.dup_num[i - n_ops]; 1227 rtx *loc = (i < n_ops 1228 ? recog_data.operand_loc[opn] 1229 : recog_data.dup_loc[i - n_ops]); 1230 enum reg_class cl = recog_op_alt[opn][alt].cl; 1231 enum op_type type = recog_data.operand_type[opn]; 1232 1233 /* Don't scan match_operand here, since we've no reg class 1234 information to pass down. Any operands that we could 1235 substitute in will be represented elsewhere. */ 1236 if (recog_data.constraints[opn][0] == '\0' 1237 || untracked_operands & (1 << opn)) 1238 continue; 1239 1240 if (recog_op_alt[opn][alt].is_address) 1241 scan_rtx_address (insn, loc, cl, mark_read, VOIDmode); 1242 else 1243 scan_rtx (insn, loc, cl, mark_read, type); 1244 } 1245 1246 /* Step 3B: Record updates for regs in REG_INC notes, and 1247 source regs in REG_FRAME_RELATED_EXPR notes. */ 1248 for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) 1249 if (REG_NOTE_KIND (note) == REG_INC 1250 || REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR) 1251 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_read, 1252 OP_INOUT); 1253 1254 /* Step 4: Close chains for registers that die here. */ 1255 for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) 1256 if (REG_NOTE_KIND (note) == REG_DEAD) 1257 { 1258 remove_from_hard_reg_set (&live_hard_regs, 1259 GET_MODE (XEXP (note, 0)), 1260 REGNO (XEXP (note, 0))); 1261 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead, 1262 OP_IN); 1263 } 1264 1265 /* Step 4B: If this is a call, any chain live at this point 1266 requires a caller-saved reg. */ 1267 if (CALL_P (insn)) 1268 { 1269 struct du_head *p; 1270 for (p = open_chains; p; p = p->next_chain) 1271 p->need_caller_save_reg = 1; 1272 } 1273 1274 /* Step 5: Close open chains that overlap writes. Similar to 1275 step 2, we hide in-out operands, since we do not want to 1276 close these chains. We also hide earlyclobber operands, 1277 since we've opened chains for them in step 1, and earlier 1278 chains they would overlap with must have been closed at 1279 the previous insn at the latest, as such operands cannot 1280 possibly overlap with any input operands. */ 1281 1282 hide_operands (n_ops, old_operands, old_dups, untracked_operands, 1283 true); 1284 scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_write, OP_IN); 1285 restore_operands (insn, n_ops, old_operands, old_dups); 1286 1287 /* Step 6a: Mark hard registers that are set in this insn, 1288 outside an operand, as live. */ 1289 hide_operands (n_ops, old_operands, old_dups, untracked_operands, 1290 false); 1291 note_stores (PATTERN (insn), note_sets_clobbers, &set_code); 1292 restore_operands (insn, n_ops, old_operands, old_dups); 1293 1294 /* Step 6b: Begin new chains for writes inside operands. */ 1295 record_out_operands (insn, false); 1296 1297 /* Step 6c: Record destination regs in REG_FRAME_RELATED_EXPR 1298 notes for update. */ 1299 for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) 1300 if (REG_NOTE_KIND (note) == REG_FRAME_RELATED_EXPR) 1301 scan_rtx (insn, &XEXP (note, 0), ALL_REGS, mark_access, 1302 OP_INOUT); 1303 1304 /* Step 7: Close chains for registers that were never 1305 really used here. */ 1306 for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) 1307 if (REG_NOTE_KIND (note) == REG_UNUSED) 1308 { 1309 remove_from_hard_reg_set (&live_hard_regs, 1310 GET_MODE (XEXP (note, 0)), 1311 REGNO (XEXP (note, 0))); 1312 scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead, 1313 OP_IN); 1314 } 1315 } 1316 else if (DEBUG_INSN_P (insn) 1317 && !VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn))) 1318 { 1319 scan_rtx (insn, &INSN_VAR_LOCATION_LOC (insn), 1320 ALL_REGS, mark_read, OP_IN); 1321 } 1322 if (insn == BB_END (bb)) 1323 break; 1324 } 1325 1326 bitmap_clear (&open_chains_set); 1327 1328 if (fail_current_block) 1329 return NULL; 1330 1331 /* Since we close every chain when we find a REG_DEAD note, anything that 1332 is still open lives past the basic block, so it can't be renamed. */ 1333 return closed_chains; 1334 } 1335 1336 /* Dump all def/use chains in CHAINS to DUMP_FILE. They are 1337 printed in reverse order as that's how we build them. */ 1338 1339 static void 1340 dump_def_use_chain (struct du_head *head) 1341 { 1342 while (head) 1343 { 1344 struct du_chain *this_du = head->first; 1345 fprintf (dump_file, "Register %s (%d):", 1346 reg_names[head->regno], head->nregs); 1347 while (this_du) 1348 { 1349 fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn), 1350 reg_class_names[this_du->cl]); 1351 this_du = this_du->next_use; 1352 } 1353 fprintf (dump_file, "\n"); 1354 head = head->next_chain; 1355 } 1356 } 1357 1358 1359 static bool 1360 gate_handle_regrename (void) 1361 { 1362 return (optimize > 0 && (flag_rename_registers)); 1363 } 1364 1365 struct rtl_opt_pass pass_regrename = 1366 { 1367 { 1368 RTL_PASS, 1369 "rnreg", /* name */ 1370 gate_handle_regrename, /* gate */ 1371 regrename_optimize, /* execute */ 1372 NULL, /* sub */ 1373 NULL, /* next */ 1374 0, /* static_pass_number */ 1375 TV_RENAME_REGISTERS, /* tv_id */ 1376 0, /* properties_required */ 1377 0, /* properties_provided */ 1378 0, /* properties_destroyed */ 1379 0, /* todo_flags_start */ 1380 TODO_df_finish | TODO_verify_rtl_sharing | 1381 TODO_dump_func /* todo_flags_finish */ 1382 } 1383 }; 1384 1385