1/* Building internal representation for IRA. 2 Copyright (C) 2006-2015 Free Software Foundation, Inc. 3 Contributed by Vladimir Makarov <vmakarov@redhat.com>. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 3, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along 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 "target.h" 28#include "regs.h" 29#include "flags.h" 30#include "hard-reg-set.h" 31#include "predict.h" 32#include "vec.h" 33#include "hashtab.h" 34#include "hash-set.h" 35#include "machmode.h" 36#include "input.h" 37#include "function.h" 38#include "dominance.h" 39#include "cfg.h" 40#include "basic-block.h" 41#include "insn-config.h" 42#include "recog.h" 43#include "diagnostic-core.h" 44#include "params.h" 45#include "df.h" 46#include "reload.h" 47#include "sparseset.h" 48#include "ira-int.h" 49#include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */ 50 51static ira_copy_t find_allocno_copy (ira_allocno_t, ira_allocno_t, rtx_insn *, 52 ira_loop_tree_node_t); 53 54/* The root of the loop tree corresponding to the all function. */ 55ira_loop_tree_node_t ira_loop_tree_root; 56 57/* Height of the loop tree. */ 58int ira_loop_tree_height; 59 60/* All nodes representing basic blocks are referred through the 61 following array. We can not use basic block member `aux' for this 62 because it is used for insertion of insns on edges. */ 63ira_loop_tree_node_t ira_bb_nodes; 64 65/* All nodes representing loops are referred through the following 66 array. */ 67ira_loop_tree_node_t ira_loop_nodes; 68 69/* And size of the ira_loop_nodes array. */ 70unsigned int ira_loop_nodes_count; 71 72/* Map regno -> allocnos with given regno (see comments for 73 allocno member `next_regno_allocno'). */ 74ira_allocno_t *ira_regno_allocno_map; 75 76/* Array of references to all allocnos. The order number of the 77 allocno corresponds to the index in the array. Removed allocnos 78 have NULL element value. */ 79ira_allocno_t *ira_allocnos; 80 81/* Sizes of the previous array. */ 82int ira_allocnos_num; 83 84/* Count of conflict record structures we've created, used when creating 85 a new conflict id. */ 86int ira_objects_num; 87 88/* Map a conflict id to its conflict record. */ 89ira_object_t *ira_object_id_map; 90 91/* Array of references to all allocno preferences. The order number 92 of the preference corresponds to the index in the array. */ 93ira_pref_t *ira_prefs; 94 95/* Size of the previous array. */ 96int ira_prefs_num; 97 98/* Array of references to all copies. The order number of the copy 99 corresponds to the index in the array. Removed copies have NULL 100 element value. */ 101ira_copy_t *ira_copies; 102 103/* Size of the previous array. */ 104int ira_copies_num; 105 106 107 108/* LAST_BASIC_BLOCK before generating additional insns because of live 109 range splitting. Emitting insns on a critical edge creates a new 110 basic block. */ 111static int last_basic_block_before_change; 112 113/* Initialize some members in loop tree node NODE. Use LOOP_NUM for 114 the member loop_num. */ 115static void 116init_loop_tree_node (struct ira_loop_tree_node *node, int loop_num) 117{ 118 int max_regno = max_reg_num (); 119 120 node->regno_allocno_map 121 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) * max_regno); 122 memset (node->regno_allocno_map, 0, sizeof (ira_allocno_t) * max_regno); 123 memset (node->reg_pressure, 0, sizeof (node->reg_pressure)); 124 node->all_allocnos = ira_allocate_bitmap (); 125 node->modified_regnos = ira_allocate_bitmap (); 126 node->border_allocnos = ira_allocate_bitmap (); 127 node->local_copies = ira_allocate_bitmap (); 128 node->loop_num = loop_num; 129 node->children = NULL; 130 node->subloops = NULL; 131} 132 133 134/* The following function allocates the loop tree nodes. If 135 CURRENT_LOOPS is NULL, the nodes corresponding to the loops (except 136 the root which corresponds the all function) will be not allocated 137 but nodes will still be allocated for basic blocks. */ 138static void 139create_loop_tree_nodes (void) 140{ 141 unsigned int i, j; 142 bool skip_p; 143 edge_iterator ei; 144 edge e; 145 vec<edge> edges; 146 loop_p loop; 147 148 ira_bb_nodes 149 = ((struct ira_loop_tree_node *) 150 ira_allocate (sizeof (struct ira_loop_tree_node) 151 * last_basic_block_for_fn (cfun))); 152 last_basic_block_before_change = last_basic_block_for_fn (cfun); 153 for (i = 0; i < (unsigned int) last_basic_block_for_fn (cfun); i++) 154 { 155 ira_bb_nodes[i].regno_allocno_map = NULL; 156 memset (ira_bb_nodes[i].reg_pressure, 0, 157 sizeof (ira_bb_nodes[i].reg_pressure)); 158 ira_bb_nodes[i].all_allocnos = NULL; 159 ira_bb_nodes[i].modified_regnos = NULL; 160 ira_bb_nodes[i].border_allocnos = NULL; 161 ira_bb_nodes[i].local_copies = NULL; 162 } 163 if (current_loops == NULL) 164 { 165 ira_loop_nodes_count = 1; 166 ira_loop_nodes = ((struct ira_loop_tree_node *) 167 ira_allocate (sizeof (struct ira_loop_tree_node))); 168 init_loop_tree_node (ira_loop_nodes, 0); 169 return; 170 } 171 ira_loop_nodes_count = number_of_loops (cfun); 172 ira_loop_nodes = ((struct ira_loop_tree_node *) 173 ira_allocate (sizeof (struct ira_loop_tree_node) 174 * ira_loop_nodes_count)); 175 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop) 176 { 177 if (loop_outer (loop) != NULL) 178 { 179 ira_loop_nodes[i].regno_allocno_map = NULL; 180 skip_p = false; 181 FOR_EACH_EDGE (e, ei, loop->header->preds) 182 if (e->src != loop->latch 183 && (e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)) 184 { 185 skip_p = true; 186 break; 187 } 188 if (skip_p) 189 continue; 190 edges = get_loop_exit_edges (loop); 191 FOR_EACH_VEC_ELT (edges, j, e) 192 if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)) 193 { 194 skip_p = true; 195 break; 196 } 197 edges.release (); 198 if (skip_p) 199 continue; 200 } 201 init_loop_tree_node (&ira_loop_nodes[i], loop->num); 202 } 203} 204 205/* The function returns TRUE if there are more one allocation 206 region. */ 207static bool 208more_one_region_p (void) 209{ 210 unsigned int i; 211 loop_p loop; 212 213 if (current_loops != NULL) 214 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop) 215 if (ira_loop_nodes[i].regno_allocno_map != NULL 216 && ira_loop_tree_root != &ira_loop_nodes[i]) 217 return true; 218 return false; 219} 220 221/* Free the loop tree node of a loop. */ 222static void 223finish_loop_tree_node (ira_loop_tree_node_t loop) 224{ 225 if (loop->regno_allocno_map != NULL) 226 { 227 ira_assert (loop->bb == NULL); 228 ira_free_bitmap (loop->local_copies); 229 ira_free_bitmap (loop->border_allocnos); 230 ira_free_bitmap (loop->modified_regnos); 231 ira_free_bitmap (loop->all_allocnos); 232 ira_free (loop->regno_allocno_map); 233 loop->regno_allocno_map = NULL; 234 } 235} 236 237/* Free the loop tree nodes. */ 238static void 239finish_loop_tree_nodes (void) 240{ 241 unsigned int i; 242 243 for (i = 0; i < ira_loop_nodes_count; i++) 244 finish_loop_tree_node (&ira_loop_nodes[i]); 245 ira_free (ira_loop_nodes); 246 for (i = 0; i < (unsigned int) last_basic_block_before_change; i++) 247 { 248 if (ira_bb_nodes[i].local_copies != NULL) 249 ira_free_bitmap (ira_bb_nodes[i].local_copies); 250 if (ira_bb_nodes[i].border_allocnos != NULL) 251 ira_free_bitmap (ira_bb_nodes[i].border_allocnos); 252 if (ira_bb_nodes[i].modified_regnos != NULL) 253 ira_free_bitmap (ira_bb_nodes[i].modified_regnos); 254 if (ira_bb_nodes[i].all_allocnos != NULL) 255 ira_free_bitmap (ira_bb_nodes[i].all_allocnos); 256 if (ira_bb_nodes[i].regno_allocno_map != NULL) 257 ira_free (ira_bb_nodes[i].regno_allocno_map); 258 } 259 ira_free (ira_bb_nodes); 260} 261 262 263 264/* The following recursive function adds LOOP to the loop tree 265 hierarchy. LOOP is added only once. If LOOP is NULL we adding 266 loop designating the whole function when CFG loops are not 267 built. */ 268static void 269add_loop_to_tree (struct loop *loop) 270{ 271 int loop_num; 272 struct loop *parent; 273 ira_loop_tree_node_t loop_node, parent_node; 274 275 /* We can not use loop node access macros here because of potential 276 checking and because the nodes are not initialized enough 277 yet. */ 278 if (loop != NULL && loop_outer (loop) != NULL) 279 add_loop_to_tree (loop_outer (loop)); 280 loop_num = loop != NULL ? loop->num : 0; 281 if (ira_loop_nodes[loop_num].regno_allocno_map != NULL 282 && ira_loop_nodes[loop_num].children == NULL) 283 { 284 /* We have not added loop node to the tree yet. */ 285 loop_node = &ira_loop_nodes[loop_num]; 286 loop_node->loop = loop; 287 loop_node->bb = NULL; 288 if (loop == NULL) 289 parent = NULL; 290 else 291 { 292 for (parent = loop_outer (loop); 293 parent != NULL; 294 parent = loop_outer (parent)) 295 if (ira_loop_nodes[parent->num].regno_allocno_map != NULL) 296 break; 297 } 298 if (parent == NULL) 299 { 300 loop_node->next = NULL; 301 loop_node->subloop_next = NULL; 302 loop_node->parent = NULL; 303 } 304 else 305 { 306 parent_node = &ira_loop_nodes[parent->num]; 307 loop_node->next = parent_node->children; 308 parent_node->children = loop_node; 309 loop_node->subloop_next = parent_node->subloops; 310 parent_node->subloops = loop_node; 311 loop_node->parent = parent_node; 312 } 313 } 314} 315 316/* The following recursive function sets up levels of nodes of the 317 tree given its root LOOP_NODE. The enumeration starts with LEVEL. 318 The function returns maximal value of level in the tree + 1. */ 319static int 320setup_loop_tree_level (ira_loop_tree_node_t loop_node, int level) 321{ 322 int height, max_height; 323 ira_loop_tree_node_t subloop_node; 324 325 ira_assert (loop_node->bb == NULL); 326 loop_node->level = level; 327 max_height = level + 1; 328 for (subloop_node = loop_node->subloops; 329 subloop_node != NULL; 330 subloop_node = subloop_node->subloop_next) 331 { 332 ira_assert (subloop_node->bb == NULL); 333 height = setup_loop_tree_level (subloop_node, level + 1); 334 if (height > max_height) 335 max_height = height; 336 } 337 return max_height; 338} 339 340/* Create the loop tree. The algorithm is designed to provide correct 341 order of loops (they are ordered by their last loop BB) and basic 342 blocks in the chain formed by member next. */ 343static void 344form_loop_tree (void) 345{ 346 basic_block bb; 347 struct loop *parent; 348 ira_loop_tree_node_t bb_node, loop_node; 349 350 /* We can not use loop/bb node access macros because of potential 351 checking and because the nodes are not initialized enough 352 yet. */ 353 FOR_EACH_BB_FN (bb, cfun) 354 { 355 bb_node = &ira_bb_nodes[bb->index]; 356 bb_node->bb = bb; 357 bb_node->loop = NULL; 358 bb_node->subloops = NULL; 359 bb_node->children = NULL; 360 bb_node->subloop_next = NULL; 361 bb_node->next = NULL; 362 if (current_loops == NULL) 363 parent = NULL; 364 else 365 { 366 for (parent = bb->loop_father; 367 parent != NULL; 368 parent = loop_outer (parent)) 369 if (ira_loop_nodes[parent->num].regno_allocno_map != NULL) 370 break; 371 } 372 add_loop_to_tree (parent); 373 loop_node = &ira_loop_nodes[parent == NULL ? 0 : parent->num]; 374 bb_node->next = loop_node->children; 375 bb_node->parent = loop_node; 376 loop_node->children = bb_node; 377 } 378 ira_loop_tree_root = IRA_LOOP_NODE_BY_INDEX (0); 379 ira_loop_tree_height = setup_loop_tree_level (ira_loop_tree_root, 0); 380 ira_assert (ira_loop_tree_root->regno_allocno_map != NULL); 381} 382 383 384 385/* Rebuild IRA_REGNO_ALLOCNO_MAP and REGNO_ALLOCNO_MAPs of the loop 386 tree nodes. */ 387static void 388rebuild_regno_allocno_maps (void) 389{ 390 unsigned int l; 391 int max_regno, regno; 392 ira_allocno_t a; 393 ira_loop_tree_node_t loop_tree_node; 394 loop_p loop; 395 ira_allocno_iterator ai; 396 397 ira_assert (current_loops != NULL); 398 max_regno = max_reg_num (); 399 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), l, loop) 400 if (ira_loop_nodes[l].regno_allocno_map != NULL) 401 { 402 ira_free (ira_loop_nodes[l].regno_allocno_map); 403 ira_loop_nodes[l].regno_allocno_map 404 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) 405 * max_regno); 406 memset (ira_loop_nodes[l].regno_allocno_map, 0, 407 sizeof (ira_allocno_t) * max_regno); 408 } 409 ira_free (ira_regno_allocno_map); 410 ira_regno_allocno_map 411 = (ira_allocno_t *) ira_allocate (max_regno * sizeof (ira_allocno_t)); 412 memset (ira_regno_allocno_map, 0, max_regno * sizeof (ira_allocno_t)); 413 FOR_EACH_ALLOCNO (a, ai) 414 { 415 if (ALLOCNO_CAP_MEMBER (a) != NULL) 416 /* Caps are not in the regno allocno maps. */ 417 continue; 418 regno = ALLOCNO_REGNO (a); 419 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a); 420 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno]; 421 ira_regno_allocno_map[regno] = a; 422 if (loop_tree_node->regno_allocno_map[regno] == NULL) 423 /* Remember that we can create temporary allocnos to break 424 cycles in register shuffle. */ 425 loop_tree_node->regno_allocno_map[regno] = a; 426 } 427} 428 429 430/* Pools for allocnos, allocno live ranges and objects. */ 431static alloc_pool allocno_pool, live_range_pool, object_pool; 432 433/* Vec containing references to all created allocnos. It is a 434 container of array allocnos. */ 435static vec<ira_allocno_t> allocno_vec; 436 437/* Vec containing references to all created ira_objects. It is a 438 container of ira_object_id_map. */ 439static vec<ira_object_t> ira_object_id_map_vec; 440 441/* Initialize data concerning allocnos. */ 442static void 443initiate_allocnos (void) 444{ 445 live_range_pool 446 = create_alloc_pool ("live ranges", 447 sizeof (struct live_range), 100); 448 allocno_pool 449 = create_alloc_pool ("allocnos", sizeof (struct ira_allocno), 100); 450 object_pool 451 = create_alloc_pool ("objects", sizeof (struct ira_object), 100); 452 allocno_vec.create (max_reg_num () * 2); 453 ira_allocnos = NULL; 454 ira_allocnos_num = 0; 455 ira_objects_num = 0; 456 ira_object_id_map_vec.create (max_reg_num () * 2); 457 ira_object_id_map = NULL; 458 ira_regno_allocno_map 459 = (ira_allocno_t *) ira_allocate (max_reg_num () 460 * sizeof (ira_allocno_t)); 461 memset (ira_regno_allocno_map, 0, max_reg_num () * sizeof (ira_allocno_t)); 462} 463 464/* Create and return an object corresponding to a new allocno A. */ 465static ira_object_t 466ira_create_object (ira_allocno_t a, int subword) 467{ 468 enum reg_class aclass = ALLOCNO_CLASS (a); 469 ira_object_t obj = (ira_object_t) pool_alloc (object_pool); 470 471 OBJECT_ALLOCNO (obj) = a; 472 OBJECT_SUBWORD (obj) = subword; 473 OBJECT_CONFLICT_ID (obj) = ira_objects_num; 474 OBJECT_CONFLICT_VEC_P (obj) = false; 475 OBJECT_CONFLICT_ARRAY (obj) = NULL; 476 OBJECT_NUM_CONFLICTS (obj) = 0; 477 COPY_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj), ira_no_alloc_regs); 478 COPY_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), ira_no_alloc_regs); 479 IOR_COMPL_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj), 480 reg_class_contents[aclass]); 481 IOR_COMPL_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), 482 reg_class_contents[aclass]); 483 OBJECT_MIN (obj) = INT_MAX; 484 OBJECT_MAX (obj) = -1; 485 OBJECT_LIVE_RANGES (obj) = NULL; 486 487 ira_object_id_map_vec.safe_push (obj); 488 ira_object_id_map 489 = ira_object_id_map_vec.address (); 490 ira_objects_num = ira_object_id_map_vec.length (); 491 492 return obj; 493} 494 495/* Create and return the allocno corresponding to REGNO in 496 LOOP_TREE_NODE. Add the allocno to the list of allocnos with the 497 same regno if CAP_P is FALSE. */ 498ira_allocno_t 499ira_create_allocno (int regno, bool cap_p, 500 ira_loop_tree_node_t loop_tree_node) 501{ 502 ira_allocno_t a; 503 504 a = (ira_allocno_t) pool_alloc (allocno_pool); 505 ALLOCNO_REGNO (a) = regno; 506 ALLOCNO_LOOP_TREE_NODE (a) = loop_tree_node; 507 if (! cap_p) 508 { 509 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno]; 510 ira_regno_allocno_map[regno] = a; 511 if (loop_tree_node->regno_allocno_map[regno] == NULL) 512 /* Remember that we can create temporary allocnos to break 513 cycles in register shuffle on region borders (see 514 ira-emit.c). */ 515 loop_tree_node->regno_allocno_map[regno] = a; 516 } 517 ALLOCNO_CAP (a) = NULL; 518 ALLOCNO_CAP_MEMBER (a) = NULL; 519 ALLOCNO_NUM (a) = ira_allocnos_num; 520 bitmap_set_bit (loop_tree_node->all_allocnos, ALLOCNO_NUM (a)); 521 ALLOCNO_NREFS (a) = 0; 522 ALLOCNO_FREQ (a) = 0; 523 ALLOCNO_HARD_REGNO (a) = -1; 524 ALLOCNO_CALL_FREQ (a) = 0; 525 ALLOCNO_CALLS_CROSSED_NUM (a) = 0; 526 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a) = 0; 527 CLEAR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a)); 528#ifdef STACK_REGS 529 ALLOCNO_NO_STACK_REG_P (a) = false; 530 ALLOCNO_TOTAL_NO_STACK_REG_P (a) = false; 531#endif 532 ALLOCNO_DONT_REASSIGN_P (a) = false; 533 ALLOCNO_BAD_SPILL_P (a) = false; 534 ALLOCNO_ASSIGNED_P (a) = false; 535 ALLOCNO_MODE (a) = (regno < 0 ? VOIDmode : PSEUDO_REGNO_MODE (regno)); 536 ALLOCNO_WMODE (a) = ALLOCNO_MODE (a); 537 ALLOCNO_PREFS (a) = NULL; 538 ALLOCNO_COPIES (a) = NULL; 539 ALLOCNO_HARD_REG_COSTS (a) = NULL; 540 ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL; 541 ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL; 542 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL; 543 ALLOCNO_CLASS (a) = NO_REGS; 544 ALLOCNO_UPDATED_CLASS_COST (a) = 0; 545 ALLOCNO_CLASS_COST (a) = 0; 546 ALLOCNO_MEMORY_COST (a) = 0; 547 ALLOCNO_UPDATED_MEMORY_COST (a) = 0; 548 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) = 0; 549 ALLOCNO_NUM_OBJECTS (a) = 0; 550 551 ALLOCNO_ADD_DATA (a) = NULL; 552 allocno_vec.safe_push (a); 553 ira_allocnos = allocno_vec.address (); 554 ira_allocnos_num = allocno_vec.length (); 555 556 return a; 557} 558 559/* Set up register class for A and update its conflict hard 560 registers. */ 561void 562ira_set_allocno_class (ira_allocno_t a, enum reg_class aclass) 563{ 564 ira_allocno_object_iterator oi; 565 ira_object_t obj; 566 567 ALLOCNO_CLASS (a) = aclass; 568 FOR_EACH_ALLOCNO_OBJECT (a, obj, oi) 569 { 570 IOR_COMPL_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj), 571 reg_class_contents[aclass]); 572 IOR_COMPL_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), 573 reg_class_contents[aclass]); 574 } 575} 576 577/* Determine the number of objects we should associate with allocno A 578 and allocate them. */ 579void 580ira_create_allocno_objects (ira_allocno_t a) 581{ 582 machine_mode mode = ALLOCNO_MODE (a); 583 enum reg_class aclass = ALLOCNO_CLASS (a); 584 int n = ira_reg_class_max_nregs[aclass][mode]; 585 int i; 586 587 if (GET_MODE_SIZE (mode) != 2 * UNITS_PER_WORD || n != 2) 588 n = 1; 589 590 ALLOCNO_NUM_OBJECTS (a) = n; 591 for (i = 0; i < n; i++) 592 ALLOCNO_OBJECT (a, i) = ira_create_object (a, i); 593} 594 595/* For each allocno, set ALLOCNO_NUM_OBJECTS and create the 596 ALLOCNO_OBJECT structures. This must be called after the allocno 597 classes are known. */ 598static void 599create_allocno_objects (void) 600{ 601 ira_allocno_t a; 602 ira_allocno_iterator ai; 603 604 FOR_EACH_ALLOCNO (a, ai) 605 ira_create_allocno_objects (a); 606} 607 608/* Merge hard register conflict information for all objects associated with 609 allocno TO into the corresponding objects associated with FROM. 610 If TOTAL_ONLY is true, we only merge OBJECT_TOTAL_CONFLICT_HARD_REGS. */ 611static void 612merge_hard_reg_conflicts (ira_allocno_t from, ira_allocno_t to, 613 bool total_only) 614{ 615 int i; 616 gcc_assert (ALLOCNO_NUM_OBJECTS (to) == ALLOCNO_NUM_OBJECTS (from)); 617 for (i = 0; i < ALLOCNO_NUM_OBJECTS (to); i++) 618 { 619 ira_object_t from_obj = ALLOCNO_OBJECT (from, i); 620 ira_object_t to_obj = ALLOCNO_OBJECT (to, i); 621 622 if (!total_only) 623 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (to_obj), 624 OBJECT_CONFLICT_HARD_REGS (from_obj)); 625 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (to_obj), 626 OBJECT_TOTAL_CONFLICT_HARD_REGS (from_obj)); 627 } 628#ifdef STACK_REGS 629 if (!total_only && ALLOCNO_NO_STACK_REG_P (from)) 630 ALLOCNO_NO_STACK_REG_P (to) = true; 631 if (ALLOCNO_TOTAL_NO_STACK_REG_P (from)) 632 ALLOCNO_TOTAL_NO_STACK_REG_P (to) = true; 633#endif 634} 635 636/* Update hard register conflict information for all objects associated with 637 A to include the regs in SET. */ 638void 639ior_hard_reg_conflicts (ira_allocno_t a, HARD_REG_SET *set) 640{ 641 ira_allocno_object_iterator i; 642 ira_object_t obj; 643 644 FOR_EACH_ALLOCNO_OBJECT (a, obj, i) 645 { 646 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj), *set); 647 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), *set); 648 } 649} 650 651/* Return TRUE if a conflict vector with NUM elements is more 652 profitable than a conflict bit vector for OBJ. */ 653bool 654ira_conflict_vector_profitable_p (ira_object_t obj, int num) 655{ 656 int nw; 657 int max = OBJECT_MAX (obj); 658 int min = OBJECT_MIN (obj); 659 660 if (max < min) 661 /* We prefer a bit vector in such case because it does not result 662 in allocation. */ 663 return false; 664 665 nw = (max - min + IRA_INT_BITS) / IRA_INT_BITS; 666 return (2 * sizeof (ira_object_t) * (num + 1) 667 < 3 * nw * sizeof (IRA_INT_TYPE)); 668} 669 670/* Allocates and initialize the conflict vector of OBJ for NUM 671 conflicting objects. */ 672void 673ira_allocate_conflict_vec (ira_object_t obj, int num) 674{ 675 int size; 676 ira_object_t *vec; 677 678 ira_assert (OBJECT_CONFLICT_ARRAY (obj) == NULL); 679 num++; /* for NULL end marker */ 680 size = sizeof (ira_object_t) * num; 681 OBJECT_CONFLICT_ARRAY (obj) = ira_allocate (size); 682 vec = (ira_object_t *) OBJECT_CONFLICT_ARRAY (obj); 683 vec[0] = NULL; 684 OBJECT_NUM_CONFLICTS (obj) = 0; 685 OBJECT_CONFLICT_ARRAY_SIZE (obj) = size; 686 OBJECT_CONFLICT_VEC_P (obj) = true; 687} 688 689/* Allocate and initialize the conflict bit vector of OBJ. */ 690static void 691allocate_conflict_bit_vec (ira_object_t obj) 692{ 693 unsigned int size; 694 695 ira_assert (OBJECT_CONFLICT_ARRAY (obj) == NULL); 696 size = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS) 697 / IRA_INT_BITS * sizeof (IRA_INT_TYPE)); 698 OBJECT_CONFLICT_ARRAY (obj) = ira_allocate (size); 699 memset (OBJECT_CONFLICT_ARRAY (obj), 0, size); 700 OBJECT_CONFLICT_ARRAY_SIZE (obj) = size; 701 OBJECT_CONFLICT_VEC_P (obj) = false; 702} 703 704/* Allocate and initialize the conflict vector or conflict bit vector 705 of OBJ for NUM conflicting allocnos whatever is more profitable. */ 706void 707ira_allocate_object_conflicts (ira_object_t obj, int num) 708{ 709 if (ira_conflict_vector_profitable_p (obj, num)) 710 ira_allocate_conflict_vec (obj, num); 711 else 712 allocate_conflict_bit_vec (obj); 713} 714 715/* Add OBJ2 to the conflicts of OBJ1. */ 716static void 717add_to_conflicts (ira_object_t obj1, ira_object_t obj2) 718{ 719 int num; 720 unsigned int size; 721 722 if (OBJECT_CONFLICT_VEC_P (obj1)) 723 { 724 ira_object_t *vec = OBJECT_CONFLICT_VEC (obj1); 725 int curr_num = OBJECT_NUM_CONFLICTS (obj1); 726 num = curr_num + 2; 727 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) < num * sizeof (ira_object_t)) 728 { 729 ira_object_t *newvec; 730 size = (3 * num / 2 + 1) * sizeof (ira_allocno_t); 731 newvec = (ira_object_t *) ira_allocate (size); 732 memcpy (newvec, vec, curr_num * sizeof (ira_object_t)); 733 ira_free (vec); 734 vec = newvec; 735 OBJECT_CONFLICT_ARRAY (obj1) = vec; 736 OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size; 737 } 738 vec[num - 2] = obj2; 739 vec[num - 1] = NULL; 740 OBJECT_NUM_CONFLICTS (obj1)++; 741 } 742 else 743 { 744 int nw, added_head_nw, id; 745 IRA_INT_TYPE *vec = OBJECT_CONFLICT_BITVEC (obj1); 746 747 id = OBJECT_CONFLICT_ID (obj2); 748 if (OBJECT_MIN (obj1) > id) 749 { 750 /* Expand head of the bit vector. */ 751 added_head_nw = (OBJECT_MIN (obj1) - id - 1) / IRA_INT_BITS + 1; 752 nw = (OBJECT_MAX (obj1) - OBJECT_MIN (obj1)) / IRA_INT_BITS + 1; 753 size = (nw + added_head_nw) * sizeof (IRA_INT_TYPE); 754 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) >= size) 755 { 756 memmove ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE), 757 vec, nw * sizeof (IRA_INT_TYPE)); 758 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE)); 759 } 760 else 761 { 762 size 763 = (3 * (nw + added_head_nw) / 2 + 1) * sizeof (IRA_INT_TYPE); 764 vec = (IRA_INT_TYPE *) ira_allocate (size); 765 memcpy ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE), 766 OBJECT_CONFLICT_ARRAY (obj1), nw * sizeof (IRA_INT_TYPE)); 767 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE)); 768 memset ((char *) vec 769 + (nw + added_head_nw) * sizeof (IRA_INT_TYPE), 770 0, size - (nw + added_head_nw) * sizeof (IRA_INT_TYPE)); 771 ira_free (OBJECT_CONFLICT_ARRAY (obj1)); 772 OBJECT_CONFLICT_ARRAY (obj1) = vec; 773 OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size; 774 } 775 OBJECT_MIN (obj1) -= added_head_nw * IRA_INT_BITS; 776 } 777 else if (OBJECT_MAX (obj1) < id) 778 { 779 nw = (id - OBJECT_MIN (obj1)) / IRA_INT_BITS + 1; 780 size = nw * sizeof (IRA_INT_TYPE); 781 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) < size) 782 { 783 /* Expand tail of the bit vector. */ 784 size = (3 * nw / 2 + 1) * sizeof (IRA_INT_TYPE); 785 vec = (IRA_INT_TYPE *) ira_allocate (size); 786 memcpy (vec, OBJECT_CONFLICT_ARRAY (obj1), OBJECT_CONFLICT_ARRAY_SIZE (obj1)); 787 memset ((char *) vec + OBJECT_CONFLICT_ARRAY_SIZE (obj1), 788 0, size - OBJECT_CONFLICT_ARRAY_SIZE (obj1)); 789 ira_free (OBJECT_CONFLICT_ARRAY (obj1)); 790 OBJECT_CONFLICT_ARRAY (obj1) = vec; 791 OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size; 792 } 793 OBJECT_MAX (obj1) = id; 794 } 795 SET_MINMAX_SET_BIT (vec, id, OBJECT_MIN (obj1), OBJECT_MAX (obj1)); 796 } 797} 798 799/* Add OBJ1 to the conflicts of OBJ2 and vice versa. */ 800static void 801ira_add_conflict (ira_object_t obj1, ira_object_t obj2) 802{ 803 add_to_conflicts (obj1, obj2); 804 add_to_conflicts (obj2, obj1); 805} 806 807/* Clear all conflicts of OBJ. */ 808static void 809clear_conflicts (ira_object_t obj) 810{ 811 if (OBJECT_CONFLICT_VEC_P (obj)) 812 { 813 OBJECT_NUM_CONFLICTS (obj) = 0; 814 OBJECT_CONFLICT_VEC (obj)[0] = NULL; 815 } 816 else if (OBJECT_CONFLICT_ARRAY_SIZE (obj) != 0) 817 { 818 int nw; 819 820 nw = (OBJECT_MAX (obj) - OBJECT_MIN (obj)) / IRA_INT_BITS + 1; 821 memset (OBJECT_CONFLICT_BITVEC (obj), 0, nw * sizeof (IRA_INT_TYPE)); 822 } 823} 824 825/* The array used to find duplications in conflict vectors of 826 allocnos. */ 827static int *conflict_check; 828 829/* The value used to mark allocation presence in conflict vector of 830 the current allocno. */ 831static int curr_conflict_check_tick; 832 833/* Remove duplications in conflict vector of OBJ. */ 834static void 835compress_conflict_vec (ira_object_t obj) 836{ 837 ira_object_t *vec, conflict_obj; 838 int i, j; 839 840 ira_assert (OBJECT_CONFLICT_VEC_P (obj)); 841 vec = OBJECT_CONFLICT_VEC (obj); 842 curr_conflict_check_tick++; 843 for (i = j = 0; (conflict_obj = vec[i]) != NULL; i++) 844 { 845 int id = OBJECT_CONFLICT_ID (conflict_obj); 846 if (conflict_check[id] != curr_conflict_check_tick) 847 { 848 conflict_check[id] = curr_conflict_check_tick; 849 vec[j++] = conflict_obj; 850 } 851 } 852 OBJECT_NUM_CONFLICTS (obj) = j; 853 vec[j] = NULL; 854} 855 856/* Remove duplications in conflict vectors of all allocnos. */ 857static void 858compress_conflict_vecs (void) 859{ 860 ira_object_t obj; 861 ira_object_iterator oi; 862 863 conflict_check = (int *) ira_allocate (sizeof (int) * ira_objects_num); 864 memset (conflict_check, 0, sizeof (int) * ira_objects_num); 865 curr_conflict_check_tick = 0; 866 FOR_EACH_OBJECT (obj, oi) 867 { 868 if (OBJECT_CONFLICT_VEC_P (obj)) 869 compress_conflict_vec (obj); 870 } 871 ira_free (conflict_check); 872} 873 874/* This recursive function outputs allocno A and if it is a cap the 875 function outputs its members. */ 876void 877ira_print_expanded_allocno (ira_allocno_t a) 878{ 879 basic_block bb; 880 881 fprintf (ira_dump_file, " a%d(r%d", ALLOCNO_NUM (a), ALLOCNO_REGNO (a)); 882 if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL) 883 fprintf (ira_dump_file, ",b%d", bb->index); 884 else 885 fprintf (ira_dump_file, ",l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop_num); 886 if (ALLOCNO_CAP_MEMBER (a) != NULL) 887 { 888 fprintf (ira_dump_file, ":"); 889 ira_print_expanded_allocno (ALLOCNO_CAP_MEMBER (a)); 890 } 891 fprintf (ira_dump_file, ")"); 892} 893 894/* Create and return the cap representing allocno A in the 895 parent loop. */ 896static ira_allocno_t 897create_cap_allocno (ira_allocno_t a) 898{ 899 ira_allocno_t cap; 900 ira_loop_tree_node_t parent; 901 enum reg_class aclass; 902 903 parent = ALLOCNO_LOOP_TREE_NODE (a)->parent; 904 cap = ira_create_allocno (ALLOCNO_REGNO (a), true, parent); 905 ALLOCNO_MODE (cap) = ALLOCNO_MODE (a); 906 ALLOCNO_WMODE (cap) = ALLOCNO_WMODE (a); 907 aclass = ALLOCNO_CLASS (a); 908 ira_set_allocno_class (cap, aclass); 909 ira_create_allocno_objects (cap); 910 ALLOCNO_CAP_MEMBER (cap) = a; 911 ALLOCNO_CAP (a) = cap; 912 ALLOCNO_CLASS_COST (cap) = ALLOCNO_CLASS_COST (a); 913 ALLOCNO_MEMORY_COST (cap) = ALLOCNO_MEMORY_COST (a); 914 ira_allocate_and_copy_costs 915 (&ALLOCNO_HARD_REG_COSTS (cap), aclass, ALLOCNO_HARD_REG_COSTS (a)); 916 ira_allocate_and_copy_costs 917 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (cap), aclass, 918 ALLOCNO_CONFLICT_HARD_REG_COSTS (a)); 919 ALLOCNO_BAD_SPILL_P (cap) = ALLOCNO_BAD_SPILL_P (a); 920 ALLOCNO_NREFS (cap) = ALLOCNO_NREFS (a); 921 ALLOCNO_FREQ (cap) = ALLOCNO_FREQ (a); 922 ALLOCNO_CALL_FREQ (cap) = ALLOCNO_CALL_FREQ (a); 923 924 merge_hard_reg_conflicts (a, cap, false); 925 926 ALLOCNO_CALLS_CROSSED_NUM (cap) = ALLOCNO_CALLS_CROSSED_NUM (a); 927 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (cap) = ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a); 928 IOR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (cap), 929 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a)); 930 if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL) 931 { 932 fprintf (ira_dump_file, " Creating cap "); 933 ira_print_expanded_allocno (cap); 934 fprintf (ira_dump_file, "\n"); 935 } 936 return cap; 937} 938 939/* Create and return a live range for OBJECT with given attributes. */ 940live_range_t 941ira_create_live_range (ira_object_t obj, int start, int finish, 942 live_range_t next) 943{ 944 live_range_t p; 945 946 p = (live_range_t) pool_alloc (live_range_pool); 947 p->object = obj; 948 p->start = start; 949 p->finish = finish; 950 p->next = next; 951 return p; 952} 953 954/* Create a new live range for OBJECT and queue it at the head of its 955 live range list. */ 956void 957ira_add_live_range_to_object (ira_object_t object, int start, int finish) 958{ 959 live_range_t p; 960 p = ira_create_live_range (object, start, finish, 961 OBJECT_LIVE_RANGES (object)); 962 OBJECT_LIVE_RANGES (object) = p; 963} 964 965/* Copy allocno live range R and return the result. */ 966static live_range_t 967copy_live_range (live_range_t r) 968{ 969 live_range_t p; 970 971 p = (live_range_t) pool_alloc (live_range_pool); 972 *p = *r; 973 return p; 974} 975 976/* Copy allocno live range list given by its head R and return the 977 result. */ 978live_range_t 979ira_copy_live_range_list (live_range_t r) 980{ 981 live_range_t p, first, last; 982 983 if (r == NULL) 984 return NULL; 985 for (first = last = NULL; r != NULL; r = r->next) 986 { 987 p = copy_live_range (r); 988 if (first == NULL) 989 first = p; 990 else 991 last->next = p; 992 last = p; 993 } 994 return first; 995} 996 997/* Merge ranges R1 and R2 and returns the result. The function 998 maintains the order of ranges and tries to minimize number of the 999 result ranges. */ 1000live_range_t 1001ira_merge_live_ranges (live_range_t r1, live_range_t r2) 1002{ 1003 live_range_t first, last, temp; 1004 1005 if (r1 == NULL) 1006 return r2; 1007 if (r2 == NULL) 1008 return r1; 1009 for (first = last = NULL; r1 != NULL && r2 != NULL;) 1010 { 1011 if (r1->start < r2->start) 1012 { 1013 temp = r1; 1014 r1 = r2; 1015 r2 = temp; 1016 } 1017 if (r1->start <= r2->finish + 1) 1018 { 1019 /* Intersected ranges: merge r1 and r2 into r1. */ 1020 r1->start = r2->start; 1021 if (r1->finish < r2->finish) 1022 r1->finish = r2->finish; 1023 temp = r2; 1024 r2 = r2->next; 1025 ira_finish_live_range (temp); 1026 if (r2 == NULL) 1027 { 1028 /* To try to merge with subsequent ranges in r1. */ 1029 r2 = r1->next; 1030 r1->next = NULL; 1031 } 1032 } 1033 else 1034 { 1035 /* Add r1 to the result. */ 1036 if (first == NULL) 1037 first = last = r1; 1038 else 1039 { 1040 last->next = r1; 1041 last = r1; 1042 } 1043 r1 = r1->next; 1044 if (r1 == NULL) 1045 { 1046 /* To try to merge with subsequent ranges in r2. */ 1047 r1 = r2->next; 1048 r2->next = NULL; 1049 } 1050 } 1051 } 1052 if (r1 != NULL) 1053 { 1054 if (first == NULL) 1055 first = r1; 1056 else 1057 last->next = r1; 1058 ira_assert (r1->next == NULL); 1059 } 1060 else if (r2 != NULL) 1061 { 1062 if (first == NULL) 1063 first = r2; 1064 else 1065 last->next = r2; 1066 ira_assert (r2->next == NULL); 1067 } 1068 else 1069 { 1070 ira_assert (last->next == NULL); 1071 } 1072 return first; 1073} 1074 1075/* Return TRUE if live ranges R1 and R2 intersect. */ 1076bool 1077ira_live_ranges_intersect_p (live_range_t r1, live_range_t r2) 1078{ 1079 /* Remember the live ranges are always kept ordered. */ 1080 while (r1 != NULL && r2 != NULL) 1081 { 1082 if (r1->start > r2->finish) 1083 r1 = r1->next; 1084 else if (r2->start > r1->finish) 1085 r2 = r2->next; 1086 else 1087 return true; 1088 } 1089 return false; 1090} 1091 1092/* Free allocno live range R. */ 1093void 1094ira_finish_live_range (live_range_t r) 1095{ 1096 pool_free (live_range_pool, r); 1097} 1098 1099/* Free list of allocno live ranges starting with R. */ 1100void 1101ira_finish_live_range_list (live_range_t r) 1102{ 1103 live_range_t next_r; 1104 1105 for (; r != NULL; r = next_r) 1106 { 1107 next_r = r->next; 1108 ira_finish_live_range (r); 1109 } 1110} 1111 1112/* Free updated register costs of allocno A. */ 1113void 1114ira_free_allocno_updated_costs (ira_allocno_t a) 1115{ 1116 enum reg_class aclass; 1117 1118 aclass = ALLOCNO_CLASS (a); 1119 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL) 1120 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), aclass); 1121 ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL; 1122 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL) 1123 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a), 1124 aclass); 1125 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL; 1126} 1127 1128/* Free and nullify all cost vectors allocated earlier for allocno 1129 A. */ 1130static void 1131ira_free_allocno_costs (ira_allocno_t a) 1132{ 1133 enum reg_class aclass = ALLOCNO_CLASS (a); 1134 ira_object_t obj; 1135 ira_allocno_object_iterator oi; 1136 1137 FOR_EACH_ALLOCNO_OBJECT (a, obj, oi) 1138 { 1139 ira_finish_live_range_list (OBJECT_LIVE_RANGES (obj)); 1140 ira_object_id_map[OBJECT_CONFLICT_ID (obj)] = NULL; 1141 if (OBJECT_CONFLICT_ARRAY (obj) != NULL) 1142 ira_free (OBJECT_CONFLICT_ARRAY (obj)); 1143 pool_free (object_pool, obj); 1144 } 1145 1146 ira_allocnos[ALLOCNO_NUM (a)] = NULL; 1147 if (ALLOCNO_HARD_REG_COSTS (a) != NULL) 1148 ira_free_cost_vector (ALLOCNO_HARD_REG_COSTS (a), aclass); 1149 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL) 1150 ira_free_cost_vector (ALLOCNO_CONFLICT_HARD_REG_COSTS (a), aclass); 1151 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL) 1152 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), aclass); 1153 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL) 1154 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a), 1155 aclass); 1156 ALLOCNO_HARD_REG_COSTS (a) = NULL; 1157 ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL; 1158 ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL; 1159 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL; 1160} 1161 1162/* Free the memory allocated for allocno A. */ 1163static void 1164finish_allocno (ira_allocno_t a) 1165{ 1166 ira_free_allocno_costs (a); 1167 pool_free (allocno_pool, a); 1168} 1169 1170/* Free the memory allocated for all allocnos. */ 1171static void 1172finish_allocnos (void) 1173{ 1174 ira_allocno_t a; 1175 ira_allocno_iterator ai; 1176 1177 FOR_EACH_ALLOCNO (a, ai) 1178 finish_allocno (a); 1179 ira_free (ira_regno_allocno_map); 1180 ira_object_id_map_vec.release (); 1181 allocno_vec.release (); 1182 free_alloc_pool (allocno_pool); 1183 free_alloc_pool (object_pool); 1184 free_alloc_pool (live_range_pool); 1185} 1186 1187 1188 1189/* Pools for allocno preferences. */ 1190static alloc_pool pref_pool; 1191 1192/* Vec containing references to all created preferences. It is a 1193 container of array ira_prefs. */ 1194static vec<ira_pref_t> pref_vec; 1195 1196/* The function initializes data concerning allocno prefs. */ 1197static void 1198initiate_prefs (void) 1199{ 1200 pref_pool 1201 = create_alloc_pool ("prefs", sizeof (struct ira_allocno_pref), 100); 1202 pref_vec.create (get_max_uid ()); 1203 ira_prefs = NULL; 1204 ira_prefs_num = 0; 1205} 1206 1207/* Return pref for A and HARD_REGNO if any. */ 1208static ira_pref_t 1209find_allocno_pref (ira_allocno_t a, int hard_regno) 1210{ 1211 ira_pref_t pref; 1212 1213 for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = pref->next_pref) 1214 if (pref->allocno == a && pref->hard_regno == hard_regno) 1215 return pref; 1216 return NULL; 1217} 1218 1219/* Create and return pref with given attributes A, HARD_REGNO, and FREQ. */ 1220ira_pref_t 1221ira_create_pref (ira_allocno_t a, int hard_regno, int freq) 1222{ 1223 ira_pref_t pref; 1224 1225 pref = (ira_pref_t) pool_alloc (pref_pool); 1226 pref->num = ira_prefs_num; 1227 pref->allocno = a; 1228 pref->hard_regno = hard_regno; 1229 pref->freq = freq; 1230 pref_vec.safe_push (pref); 1231 ira_prefs = pref_vec.address (); 1232 ira_prefs_num = pref_vec.length (); 1233 return pref; 1234} 1235 1236/* Attach a pref PREF to the corresponding allocno. */ 1237static void 1238add_allocno_pref_to_list (ira_pref_t pref) 1239{ 1240 ira_allocno_t a = pref->allocno; 1241 1242 pref->next_pref = ALLOCNO_PREFS (a); 1243 ALLOCNO_PREFS (a) = pref; 1244} 1245 1246/* Create (or update frequency if the pref already exists) the pref of 1247 allocnos A preferring HARD_REGNO with frequency FREQ. */ 1248void 1249ira_add_allocno_pref (ira_allocno_t a, int hard_regno, int freq) 1250{ 1251 ira_pref_t pref; 1252 1253 if (freq <= 0) 1254 return; 1255 if ((pref = find_allocno_pref (a, hard_regno)) != NULL) 1256 { 1257 pref->freq += freq; 1258 return; 1259 } 1260 pref = ira_create_pref (a, hard_regno, freq); 1261 ira_assert (a != NULL); 1262 add_allocno_pref_to_list (pref); 1263} 1264 1265/* Print info about PREF into file F. */ 1266static void 1267print_pref (FILE *f, ira_pref_t pref) 1268{ 1269 fprintf (f, " pref%d:a%d(r%d)<-hr%d@%d\n", pref->num, 1270 ALLOCNO_NUM (pref->allocno), ALLOCNO_REGNO (pref->allocno), 1271 pref->hard_regno, pref->freq); 1272} 1273 1274/* Print info about PREF into stderr. */ 1275void 1276ira_debug_pref (ira_pref_t pref) 1277{ 1278 print_pref (stderr, pref); 1279} 1280 1281/* Print info about all prefs into file F. */ 1282static void 1283print_prefs (FILE *f) 1284{ 1285 ira_pref_t pref; 1286 ira_pref_iterator pi; 1287 1288 FOR_EACH_PREF (pref, pi) 1289 print_pref (f, pref); 1290} 1291 1292/* Print info about all prefs into stderr. */ 1293void 1294ira_debug_prefs (void) 1295{ 1296 print_prefs (stderr); 1297} 1298 1299/* Print info about prefs involving allocno A into file F. */ 1300static void 1301print_allocno_prefs (FILE *f, ira_allocno_t a) 1302{ 1303 ira_pref_t pref; 1304 1305 fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a)); 1306 for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = pref->next_pref) 1307 fprintf (f, " pref%d:hr%d@%d", pref->num, pref->hard_regno, pref->freq); 1308 fprintf (f, "\n"); 1309} 1310 1311/* Print info about prefs involving allocno A into stderr. */ 1312void 1313ira_debug_allocno_prefs (ira_allocno_t a) 1314{ 1315 print_allocno_prefs (stderr, a); 1316} 1317 1318/* The function frees memory allocated for PREF. */ 1319static void 1320finish_pref (ira_pref_t pref) 1321{ 1322 ira_prefs[pref->num] = NULL; 1323 pool_free (pref_pool, pref); 1324} 1325 1326/* Remove PREF from the list of allocno prefs and free memory for 1327 it. */ 1328void 1329ira_remove_pref (ira_pref_t pref) 1330{ 1331 ira_pref_t cpref, prev; 1332 1333 if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL) 1334 fprintf (ira_dump_file, " Removing pref%d:hr%d@%d\n", 1335 pref->num, pref->hard_regno, pref->freq); 1336 for (prev = NULL, cpref = ALLOCNO_PREFS (pref->allocno); 1337 cpref != NULL; 1338 prev = cpref, cpref = cpref->next_pref) 1339 if (cpref == pref) 1340 break; 1341 ira_assert (cpref != NULL); 1342 if (prev == NULL) 1343 ALLOCNO_PREFS (pref->allocno) = pref->next_pref; 1344 else 1345 prev->next_pref = pref->next_pref; 1346 finish_pref (pref); 1347} 1348 1349/* Remove all prefs of allocno A. */ 1350void 1351ira_remove_allocno_prefs (ira_allocno_t a) 1352{ 1353 ira_pref_t pref, next_pref; 1354 1355 for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = next_pref) 1356 { 1357 next_pref = pref->next_pref; 1358 finish_pref (pref); 1359 } 1360 ALLOCNO_PREFS (a) = NULL; 1361} 1362 1363/* Free memory allocated for all prefs. */ 1364static void 1365finish_prefs (void) 1366{ 1367 ira_pref_t pref; 1368 ira_pref_iterator pi; 1369 1370 FOR_EACH_PREF (pref, pi) 1371 finish_pref (pref); 1372 pref_vec.release (); 1373 free_alloc_pool (pref_pool); 1374} 1375 1376 1377 1378/* Pools for copies. */ 1379static alloc_pool copy_pool; 1380 1381/* Vec containing references to all created copies. It is a 1382 container of array ira_copies. */ 1383static vec<ira_copy_t> copy_vec; 1384 1385/* The function initializes data concerning allocno copies. */ 1386static void 1387initiate_copies (void) 1388{ 1389 copy_pool 1390 = create_alloc_pool ("copies", sizeof (struct ira_allocno_copy), 100); 1391 copy_vec.create (get_max_uid ()); 1392 ira_copies = NULL; 1393 ira_copies_num = 0; 1394} 1395 1396/* Return copy connecting A1 and A2 and originated from INSN of 1397 LOOP_TREE_NODE if any. */ 1398static ira_copy_t 1399find_allocno_copy (ira_allocno_t a1, ira_allocno_t a2, rtx_insn *insn, 1400 ira_loop_tree_node_t loop_tree_node) 1401{ 1402 ira_copy_t cp, next_cp; 1403 ira_allocno_t another_a; 1404 1405 for (cp = ALLOCNO_COPIES (a1); cp != NULL; cp = next_cp) 1406 { 1407 if (cp->first == a1) 1408 { 1409 next_cp = cp->next_first_allocno_copy; 1410 another_a = cp->second; 1411 } 1412 else if (cp->second == a1) 1413 { 1414 next_cp = cp->next_second_allocno_copy; 1415 another_a = cp->first; 1416 } 1417 else 1418 gcc_unreachable (); 1419 if (another_a == a2 && cp->insn == insn 1420 && cp->loop_tree_node == loop_tree_node) 1421 return cp; 1422 } 1423 return NULL; 1424} 1425 1426/* Create and return copy with given attributes LOOP_TREE_NODE, FIRST, 1427 SECOND, FREQ, CONSTRAINT_P, and INSN. */ 1428ira_copy_t 1429ira_create_copy (ira_allocno_t first, ira_allocno_t second, int freq, 1430 bool constraint_p, rtx_insn *insn, 1431 ira_loop_tree_node_t loop_tree_node) 1432{ 1433 ira_copy_t cp; 1434 1435 cp = (ira_copy_t) pool_alloc (copy_pool); 1436 cp->num = ira_copies_num; 1437 cp->first = first; 1438 cp->second = second; 1439 cp->freq = freq; 1440 cp->constraint_p = constraint_p; 1441 cp->insn = insn; 1442 cp->loop_tree_node = loop_tree_node; 1443 copy_vec.safe_push (cp); 1444 ira_copies = copy_vec.address (); 1445 ira_copies_num = copy_vec.length (); 1446 return cp; 1447} 1448 1449/* Attach a copy CP to allocnos involved into the copy. */ 1450static void 1451add_allocno_copy_to_list (ira_copy_t cp) 1452{ 1453 ira_allocno_t first = cp->first, second = cp->second; 1454 1455 cp->prev_first_allocno_copy = NULL; 1456 cp->prev_second_allocno_copy = NULL; 1457 cp->next_first_allocno_copy = ALLOCNO_COPIES (first); 1458 if (cp->next_first_allocno_copy != NULL) 1459 { 1460 if (cp->next_first_allocno_copy->first == first) 1461 cp->next_first_allocno_copy->prev_first_allocno_copy = cp; 1462 else 1463 cp->next_first_allocno_copy->prev_second_allocno_copy = cp; 1464 } 1465 cp->next_second_allocno_copy = ALLOCNO_COPIES (second); 1466 if (cp->next_second_allocno_copy != NULL) 1467 { 1468 if (cp->next_second_allocno_copy->second == second) 1469 cp->next_second_allocno_copy->prev_second_allocno_copy = cp; 1470 else 1471 cp->next_second_allocno_copy->prev_first_allocno_copy = cp; 1472 } 1473 ALLOCNO_COPIES (first) = cp; 1474 ALLOCNO_COPIES (second) = cp; 1475} 1476 1477/* Make a copy CP a canonical copy where number of the 1478 first allocno is less than the second one. */ 1479static void 1480swap_allocno_copy_ends_if_necessary (ira_copy_t cp) 1481{ 1482 ira_allocno_t temp; 1483 ira_copy_t temp_cp; 1484 1485 if (ALLOCNO_NUM (cp->first) <= ALLOCNO_NUM (cp->second)) 1486 return; 1487 1488 temp = cp->first; 1489 cp->first = cp->second; 1490 cp->second = temp; 1491 1492 temp_cp = cp->prev_first_allocno_copy; 1493 cp->prev_first_allocno_copy = cp->prev_second_allocno_copy; 1494 cp->prev_second_allocno_copy = temp_cp; 1495 1496 temp_cp = cp->next_first_allocno_copy; 1497 cp->next_first_allocno_copy = cp->next_second_allocno_copy; 1498 cp->next_second_allocno_copy = temp_cp; 1499} 1500 1501/* Create (or update frequency if the copy already exists) and return 1502 the copy of allocnos FIRST and SECOND with frequency FREQ 1503 corresponding to move insn INSN (if any) and originated from 1504 LOOP_TREE_NODE. */ 1505ira_copy_t 1506ira_add_allocno_copy (ira_allocno_t first, ira_allocno_t second, int freq, 1507 bool constraint_p, rtx_insn *insn, 1508 ira_loop_tree_node_t loop_tree_node) 1509{ 1510 ira_copy_t cp; 1511 1512 if ((cp = find_allocno_copy (first, second, insn, loop_tree_node)) != NULL) 1513 { 1514 cp->freq += freq; 1515 return cp; 1516 } 1517 cp = ira_create_copy (first, second, freq, constraint_p, insn, 1518 loop_tree_node); 1519 ira_assert (first != NULL && second != NULL); 1520 add_allocno_copy_to_list (cp); 1521 swap_allocno_copy_ends_if_necessary (cp); 1522 return cp; 1523} 1524 1525/* Print info about copy CP into file F. */ 1526static void 1527print_copy (FILE *f, ira_copy_t cp) 1528{ 1529 fprintf (f, " cp%d:a%d(r%d)<->a%d(r%d)@%d:%s\n", cp->num, 1530 ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first), 1531 ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second), cp->freq, 1532 cp->insn != NULL 1533 ? "move" : cp->constraint_p ? "constraint" : "shuffle"); 1534} 1535 1536DEBUG_FUNCTION void 1537debug (ira_allocno_copy &ref) 1538{ 1539 print_copy (stderr, &ref); 1540} 1541 1542DEBUG_FUNCTION void 1543debug (ira_allocno_copy *ptr) 1544{ 1545 if (ptr) 1546 debug (*ptr); 1547 else 1548 fprintf (stderr, "<nil>\n"); 1549} 1550 1551/* Print info about copy CP into stderr. */ 1552void 1553ira_debug_copy (ira_copy_t cp) 1554{ 1555 print_copy (stderr, cp); 1556} 1557 1558/* Print info about all copies into file F. */ 1559static void 1560print_copies (FILE *f) 1561{ 1562 ira_copy_t cp; 1563 ira_copy_iterator ci; 1564 1565 FOR_EACH_COPY (cp, ci) 1566 print_copy (f, cp); 1567} 1568 1569/* Print info about all copies into stderr. */ 1570void 1571ira_debug_copies (void) 1572{ 1573 print_copies (stderr); 1574} 1575 1576/* Print info about copies involving allocno A into file F. */ 1577static void 1578print_allocno_copies (FILE *f, ira_allocno_t a) 1579{ 1580 ira_allocno_t another_a; 1581 ira_copy_t cp, next_cp; 1582 1583 fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a)); 1584 for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp) 1585 { 1586 if (cp->first == a) 1587 { 1588 next_cp = cp->next_first_allocno_copy; 1589 another_a = cp->second; 1590 } 1591 else if (cp->second == a) 1592 { 1593 next_cp = cp->next_second_allocno_copy; 1594 another_a = cp->first; 1595 } 1596 else 1597 gcc_unreachable (); 1598 fprintf (f, " cp%d:a%d(r%d)@%d", cp->num, 1599 ALLOCNO_NUM (another_a), ALLOCNO_REGNO (another_a), cp->freq); 1600 } 1601 fprintf (f, "\n"); 1602} 1603 1604DEBUG_FUNCTION void 1605debug (ira_allocno &ref) 1606{ 1607 print_allocno_copies (stderr, &ref); 1608} 1609 1610DEBUG_FUNCTION void 1611debug (ira_allocno *ptr) 1612{ 1613 if (ptr) 1614 debug (*ptr); 1615 else 1616 fprintf (stderr, "<nil>\n"); 1617} 1618 1619 1620/* Print info about copies involving allocno A into stderr. */ 1621void 1622ira_debug_allocno_copies (ira_allocno_t a) 1623{ 1624 print_allocno_copies (stderr, a); 1625} 1626 1627/* The function frees memory allocated for copy CP. */ 1628static void 1629finish_copy (ira_copy_t cp) 1630{ 1631 pool_free (copy_pool, cp); 1632} 1633 1634 1635/* Free memory allocated for all copies. */ 1636static void 1637finish_copies (void) 1638{ 1639 ira_copy_t cp; 1640 ira_copy_iterator ci; 1641 1642 FOR_EACH_COPY (cp, ci) 1643 finish_copy (cp); 1644 copy_vec.release (); 1645 free_alloc_pool (copy_pool); 1646} 1647 1648 1649 1650/* Pools for cost vectors. It is defined only for allocno classes. */ 1651static alloc_pool cost_vector_pool[N_REG_CLASSES]; 1652 1653/* The function initiates work with hard register cost vectors. It 1654 creates allocation pool for each allocno class. */ 1655static void 1656initiate_cost_vectors (void) 1657{ 1658 int i; 1659 enum reg_class aclass; 1660 1661 for (i = 0; i < ira_allocno_classes_num; i++) 1662 { 1663 aclass = ira_allocno_classes[i]; 1664 cost_vector_pool[aclass] 1665 = create_alloc_pool ("cost vectors", 1666 sizeof (int) * ira_class_hard_regs_num[aclass], 1667 100); 1668 } 1669} 1670 1671/* Allocate and return a cost vector VEC for ACLASS. */ 1672int * 1673ira_allocate_cost_vector (reg_class_t aclass) 1674{ 1675 return (int *) pool_alloc (cost_vector_pool[(int) aclass]); 1676} 1677 1678/* Free a cost vector VEC for ACLASS. */ 1679void 1680ira_free_cost_vector (int *vec, reg_class_t aclass) 1681{ 1682 ira_assert (vec != NULL); 1683 pool_free (cost_vector_pool[(int) aclass], vec); 1684} 1685 1686/* Finish work with hard register cost vectors. Release allocation 1687 pool for each allocno class. */ 1688static void 1689finish_cost_vectors (void) 1690{ 1691 int i; 1692 enum reg_class aclass; 1693 1694 for (i = 0; i < ira_allocno_classes_num; i++) 1695 { 1696 aclass = ira_allocno_classes[i]; 1697 free_alloc_pool (cost_vector_pool[aclass]); 1698 } 1699} 1700 1701 1702 1703/* Compute a post-ordering of the reverse control flow of the loop body 1704 designated by the children nodes of LOOP_NODE, whose body nodes in 1705 pre-order are input as LOOP_PREORDER. Return a VEC with a post-order 1706 of the reverse loop body. 1707 1708 For the post-order of the reverse CFG, we visit the basic blocks in 1709 LOOP_PREORDER array in the reverse order of where they appear. 1710 This is important: We do not just want to compute a post-order of 1711 the reverse CFG, we want to make a best-guess for a visiting order that 1712 minimizes the number of chain elements per allocno live range. If the 1713 blocks would be visited in a different order, we would still compute a 1714 correct post-ordering but it would be less likely that two nodes 1715 connected by an edge in the CFG are neighbours in the topsort. */ 1716 1717static vec<ira_loop_tree_node_t> 1718ira_loop_tree_body_rev_postorder (ira_loop_tree_node_t loop_node ATTRIBUTE_UNUSED, 1719 vec<ira_loop_tree_node_t> loop_preorder) 1720{ 1721 vec<ira_loop_tree_node_t> topsort_nodes = vNULL; 1722 unsigned int n_loop_preorder; 1723 1724 n_loop_preorder = loop_preorder.length (); 1725 if (n_loop_preorder != 0) 1726 { 1727 ira_loop_tree_node_t subloop_node; 1728 unsigned int i; 1729 auto_vec<ira_loop_tree_node_t> dfs_stack; 1730 1731 /* This is a bit of strange abuse of the BB_VISITED flag: We use 1732 the flag to mark blocks we still have to visit to add them to 1733 our post-order. Define an alias to avoid confusion. */ 1734#define BB_TO_VISIT BB_VISITED 1735 1736 FOR_EACH_VEC_ELT (loop_preorder, i, subloop_node) 1737 { 1738 gcc_checking_assert (! (subloop_node->bb->flags & BB_TO_VISIT)); 1739 subloop_node->bb->flags |= BB_TO_VISIT; 1740 } 1741 1742 topsort_nodes.create (n_loop_preorder); 1743 dfs_stack.create (n_loop_preorder); 1744 1745 FOR_EACH_VEC_ELT_REVERSE (loop_preorder, i, subloop_node) 1746 { 1747 if (! (subloop_node->bb->flags & BB_TO_VISIT)) 1748 continue; 1749 1750 subloop_node->bb->flags &= ~BB_TO_VISIT; 1751 dfs_stack.quick_push (subloop_node); 1752 while (! dfs_stack.is_empty ()) 1753 { 1754 edge e; 1755 edge_iterator ei; 1756 1757 ira_loop_tree_node_t n = dfs_stack.last (); 1758 FOR_EACH_EDGE (e, ei, n->bb->preds) 1759 { 1760 ira_loop_tree_node_t pred_node; 1761 basic_block pred_bb = e->src; 1762 1763 if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun)) 1764 continue; 1765 1766 pred_node = IRA_BB_NODE_BY_INDEX (pred_bb->index); 1767 if (pred_node != n 1768 && (pred_node->bb->flags & BB_TO_VISIT)) 1769 { 1770 pred_node->bb->flags &= ~BB_TO_VISIT; 1771 dfs_stack.quick_push (pred_node); 1772 } 1773 } 1774 if (n == dfs_stack.last ()) 1775 { 1776 dfs_stack.pop (); 1777 topsort_nodes.quick_push (n); 1778 } 1779 } 1780 } 1781 1782#undef BB_TO_VISIT 1783 } 1784 1785 gcc_assert (topsort_nodes.length () == n_loop_preorder); 1786 return topsort_nodes; 1787} 1788 1789/* The current loop tree node and its regno allocno map. */ 1790ira_loop_tree_node_t ira_curr_loop_tree_node; 1791ira_allocno_t *ira_curr_regno_allocno_map; 1792 1793/* This recursive function traverses loop tree with root LOOP_NODE 1794 calling non-null functions PREORDER_FUNC and POSTORDER_FUNC 1795 correspondingly in preorder and postorder. The function sets up 1796 IRA_CURR_LOOP_TREE_NODE and IRA_CURR_REGNO_ALLOCNO_MAP. If BB_P, 1797 basic block nodes of LOOP_NODE is also processed (before its 1798 subloop nodes). 1799 1800 If BB_P is set and POSTORDER_FUNC is given, the basic blocks in 1801 the loop are passed in the *reverse* post-order of the *reverse* 1802 CFG. This is only used by ira_create_allocno_live_ranges, which 1803 wants to visit basic blocks in this order to minimize the number 1804 of elements per live range chain. 1805 Note that the loop tree nodes are still visited in the normal, 1806 forward post-order of the loop tree. */ 1807 1808void 1809ira_traverse_loop_tree (bool bb_p, ira_loop_tree_node_t loop_node, 1810 void (*preorder_func) (ira_loop_tree_node_t), 1811 void (*postorder_func) (ira_loop_tree_node_t)) 1812{ 1813 ira_loop_tree_node_t subloop_node; 1814 1815 ira_assert (loop_node->bb == NULL); 1816 ira_curr_loop_tree_node = loop_node; 1817 ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map; 1818 1819 if (preorder_func != NULL) 1820 (*preorder_func) (loop_node); 1821 1822 if (bb_p) 1823 { 1824 auto_vec<ira_loop_tree_node_t> loop_preorder; 1825 unsigned int i; 1826 1827 /* Add all nodes to the set of nodes to visit. The IRA loop tree 1828 is set up such that nodes in the loop body appear in a pre-order 1829 of their place in the CFG. */ 1830 for (subloop_node = loop_node->children; 1831 subloop_node != NULL; 1832 subloop_node = subloop_node->next) 1833 if (subloop_node->bb != NULL) 1834 loop_preorder.safe_push (subloop_node); 1835 1836 if (preorder_func != NULL) 1837 FOR_EACH_VEC_ELT (loop_preorder, i, subloop_node) 1838 (*preorder_func) (subloop_node); 1839 1840 if (postorder_func != NULL) 1841 { 1842 vec<ira_loop_tree_node_t> loop_rev_postorder = 1843 ira_loop_tree_body_rev_postorder (loop_node, loop_preorder); 1844 FOR_EACH_VEC_ELT_REVERSE (loop_rev_postorder, i, subloop_node) 1845 (*postorder_func) (subloop_node); 1846 loop_rev_postorder.release (); 1847 } 1848 } 1849 1850 for (subloop_node = loop_node->subloops; 1851 subloop_node != NULL; 1852 subloop_node = subloop_node->subloop_next) 1853 { 1854 ira_assert (subloop_node->bb == NULL); 1855 ira_traverse_loop_tree (bb_p, subloop_node, 1856 preorder_func, postorder_func); 1857 } 1858 1859 ira_curr_loop_tree_node = loop_node; 1860 ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map; 1861 1862 if (postorder_func != NULL) 1863 (*postorder_func) (loop_node); 1864} 1865 1866 1867 1868/* The basic block currently being processed. */ 1869static basic_block curr_bb; 1870 1871/* This recursive function creates allocnos corresponding to 1872 pseudo-registers containing in X. True OUTPUT_P means that X is 1873 an lvalue. PARENT corresponds to the parent expression of X. */ 1874static void 1875create_insn_allocnos (rtx x, rtx outer, bool output_p) 1876{ 1877 int i, j; 1878 const char *fmt; 1879 enum rtx_code code = GET_CODE (x); 1880 1881 if (code == REG) 1882 { 1883 int regno; 1884 1885 if ((regno = REGNO (x)) >= FIRST_PSEUDO_REGISTER) 1886 { 1887 ira_allocno_t a; 1888 1889 if ((a = ira_curr_regno_allocno_map[regno]) == NULL) 1890 { 1891 a = ira_create_allocno (regno, false, ira_curr_loop_tree_node); 1892 if (outer != NULL && GET_CODE (outer) == SUBREG) 1893 { 1894 machine_mode wmode = GET_MODE (outer); 1895 if (GET_MODE_SIZE (wmode) > GET_MODE_SIZE (ALLOCNO_WMODE (a))) 1896 ALLOCNO_WMODE (a) = wmode; 1897 } 1898 } 1899 1900 ALLOCNO_NREFS (a)++; 1901 ALLOCNO_FREQ (a) += REG_FREQ_FROM_BB (curr_bb); 1902 if (output_p) 1903 bitmap_set_bit (ira_curr_loop_tree_node->modified_regnos, regno); 1904 } 1905 return; 1906 } 1907 else if (code == SET) 1908 { 1909 create_insn_allocnos (SET_DEST (x), NULL, true); 1910 create_insn_allocnos (SET_SRC (x), NULL, false); 1911 return; 1912 } 1913 else if (code == CLOBBER) 1914 { 1915 create_insn_allocnos (XEXP (x, 0), NULL, true); 1916 return; 1917 } 1918 else if (code == MEM) 1919 { 1920 create_insn_allocnos (XEXP (x, 0), NULL, false); 1921 return; 1922 } 1923 else if (code == PRE_DEC || code == POST_DEC || code == PRE_INC || 1924 code == POST_INC || code == POST_MODIFY || code == PRE_MODIFY) 1925 { 1926 create_insn_allocnos (XEXP (x, 0), NULL, true); 1927 create_insn_allocnos (XEXP (x, 0), NULL, false); 1928 return; 1929 } 1930 1931 fmt = GET_RTX_FORMAT (code); 1932 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 1933 { 1934 if (fmt[i] == 'e') 1935 create_insn_allocnos (XEXP (x, i), x, output_p); 1936 else if (fmt[i] == 'E') 1937 for (j = 0; j < XVECLEN (x, i); j++) 1938 create_insn_allocnos (XVECEXP (x, i, j), x, output_p); 1939 } 1940} 1941 1942/* Create allocnos corresponding to pseudo-registers living in the 1943 basic block represented by the corresponding loop tree node 1944 BB_NODE. */ 1945static void 1946create_bb_allocnos (ira_loop_tree_node_t bb_node) 1947{ 1948 basic_block bb; 1949 rtx_insn *insn; 1950 unsigned int i; 1951 bitmap_iterator bi; 1952 1953 curr_bb = bb = bb_node->bb; 1954 ira_assert (bb != NULL); 1955 FOR_BB_INSNS_REVERSE (bb, insn) 1956 if (NONDEBUG_INSN_P (insn)) 1957 create_insn_allocnos (PATTERN (insn), NULL, false); 1958 /* It might be a allocno living through from one subloop to 1959 another. */ 1960 EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb), FIRST_PSEUDO_REGISTER, i, bi) 1961 if (ira_curr_regno_allocno_map[i] == NULL) 1962 ira_create_allocno (i, false, ira_curr_loop_tree_node); 1963} 1964 1965/* Create allocnos corresponding to pseudo-registers living on edge E 1966 (a loop entry or exit). Also mark the allocnos as living on the 1967 loop border. */ 1968static void 1969create_loop_allocnos (edge e) 1970{ 1971 unsigned int i; 1972 bitmap live_in_regs, border_allocnos; 1973 bitmap_iterator bi; 1974 ira_loop_tree_node_t parent; 1975 1976 live_in_regs = df_get_live_in (e->dest); 1977 border_allocnos = ira_curr_loop_tree_node->border_allocnos; 1978 EXECUTE_IF_SET_IN_REG_SET (df_get_live_out (e->src), 1979 FIRST_PSEUDO_REGISTER, i, bi) 1980 if (bitmap_bit_p (live_in_regs, i)) 1981 { 1982 if (ira_curr_regno_allocno_map[i] == NULL) 1983 { 1984 /* The order of creations is important for right 1985 ira_regno_allocno_map. */ 1986 if ((parent = ira_curr_loop_tree_node->parent) != NULL 1987 && parent->regno_allocno_map[i] == NULL) 1988 ira_create_allocno (i, false, parent); 1989 ira_create_allocno (i, false, ira_curr_loop_tree_node); 1990 } 1991 bitmap_set_bit (border_allocnos, 1992 ALLOCNO_NUM (ira_curr_regno_allocno_map[i])); 1993 } 1994} 1995 1996/* Create allocnos corresponding to pseudo-registers living in loop 1997 represented by the corresponding loop tree node LOOP_NODE. This 1998 function is called by ira_traverse_loop_tree. */ 1999static void 2000create_loop_tree_node_allocnos (ira_loop_tree_node_t loop_node) 2001{ 2002 if (loop_node->bb != NULL) 2003 create_bb_allocnos (loop_node); 2004 else if (loop_node != ira_loop_tree_root) 2005 { 2006 int i; 2007 edge_iterator ei; 2008 edge e; 2009 vec<edge> edges; 2010 2011 ira_assert (current_loops != NULL); 2012 FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds) 2013 if (e->src != loop_node->loop->latch) 2014 create_loop_allocnos (e); 2015 2016 edges = get_loop_exit_edges (loop_node->loop); 2017 FOR_EACH_VEC_ELT (edges, i, e) 2018 create_loop_allocnos (e); 2019 edges.release (); 2020 } 2021} 2022 2023/* Propagate information about allocnos modified inside the loop given 2024 by its LOOP_TREE_NODE to its parent. */ 2025static void 2026propagate_modified_regnos (ira_loop_tree_node_t loop_tree_node) 2027{ 2028 if (loop_tree_node == ira_loop_tree_root) 2029 return; 2030 ira_assert (loop_tree_node->bb == NULL); 2031 bitmap_ior_into (loop_tree_node->parent->modified_regnos, 2032 loop_tree_node->modified_regnos); 2033} 2034 2035/* Propagate new info about allocno A (see comments about accumulated 2036 info in allocno definition) to the corresponding allocno on upper 2037 loop tree level. So allocnos on upper levels accumulate 2038 information about the corresponding allocnos in nested regions. 2039 The new info means allocno info finally calculated in this 2040 file. */ 2041static void 2042propagate_allocno_info (void) 2043{ 2044 int i; 2045 ira_allocno_t a, parent_a; 2046 ira_loop_tree_node_t parent; 2047 enum reg_class aclass; 2048 2049 if (flag_ira_region != IRA_REGION_ALL 2050 && flag_ira_region != IRA_REGION_MIXED) 2051 return; 2052 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--) 2053 for (a = ira_regno_allocno_map[i]; 2054 a != NULL; 2055 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 2056 if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) != NULL 2057 && (parent_a = parent->regno_allocno_map[i]) != NULL 2058 /* There are no caps yet at this point. So use 2059 border_allocnos to find allocnos for the propagation. */ 2060 && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE (a)->border_allocnos, 2061 ALLOCNO_NUM (a))) 2062 { 2063 if (! ALLOCNO_BAD_SPILL_P (a)) 2064 ALLOCNO_BAD_SPILL_P (parent_a) = false; 2065 ALLOCNO_NREFS (parent_a) += ALLOCNO_NREFS (a); 2066 ALLOCNO_FREQ (parent_a) += ALLOCNO_FREQ (a); 2067 ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a); 2068 merge_hard_reg_conflicts (a, parent_a, true); 2069 ALLOCNO_CALLS_CROSSED_NUM (parent_a) 2070 += ALLOCNO_CALLS_CROSSED_NUM (a); 2071 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a) 2072 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a); 2073 IOR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a), 2074 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a)); 2075 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a) 2076 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a); 2077 aclass = ALLOCNO_CLASS (a); 2078 ira_assert (aclass == ALLOCNO_CLASS (parent_a)); 2079 ira_allocate_and_accumulate_costs 2080 (&ALLOCNO_HARD_REG_COSTS (parent_a), aclass, 2081 ALLOCNO_HARD_REG_COSTS (a)); 2082 ira_allocate_and_accumulate_costs 2083 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a), 2084 aclass, 2085 ALLOCNO_CONFLICT_HARD_REG_COSTS (a)); 2086 ALLOCNO_CLASS_COST (parent_a) 2087 += ALLOCNO_CLASS_COST (a); 2088 ALLOCNO_MEMORY_COST (parent_a) += ALLOCNO_MEMORY_COST (a); 2089 } 2090} 2091 2092/* Create allocnos corresponding to pseudo-registers in the current 2093 function. Traverse the loop tree for this. */ 2094static void 2095create_allocnos (void) 2096{ 2097 /* We need to process BB first to correctly link allocnos by member 2098 next_regno_allocno. */ 2099 ira_traverse_loop_tree (true, ira_loop_tree_root, 2100 create_loop_tree_node_allocnos, NULL); 2101 if (optimize) 2102 ira_traverse_loop_tree (false, ira_loop_tree_root, NULL, 2103 propagate_modified_regnos); 2104} 2105 2106 2107 2108/* The page contains function to remove some regions from a separate 2109 register allocation. We remove regions whose separate allocation 2110 will hardly improve the result. As a result we speed up regional 2111 register allocation. */ 2112 2113/* The function changes the object in range list given by R to OBJ. */ 2114static void 2115change_object_in_range_list (live_range_t r, ira_object_t obj) 2116{ 2117 for (; r != NULL; r = r->next) 2118 r->object = obj; 2119} 2120 2121/* Move all live ranges associated with allocno FROM to allocno TO. */ 2122static void 2123move_allocno_live_ranges (ira_allocno_t from, ira_allocno_t to) 2124{ 2125 int i; 2126 int n = ALLOCNO_NUM_OBJECTS (from); 2127 2128 gcc_assert (n == ALLOCNO_NUM_OBJECTS (to)); 2129 2130 for (i = 0; i < n; i++) 2131 { 2132 ira_object_t from_obj = ALLOCNO_OBJECT (from, i); 2133 ira_object_t to_obj = ALLOCNO_OBJECT (to, i); 2134 live_range_t lr = OBJECT_LIVE_RANGES (from_obj); 2135 2136 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 2137 { 2138 fprintf (ira_dump_file, 2139 " Moving ranges of a%dr%d to a%dr%d: ", 2140 ALLOCNO_NUM (from), ALLOCNO_REGNO (from), 2141 ALLOCNO_NUM (to), ALLOCNO_REGNO (to)); 2142 ira_print_live_range_list (ira_dump_file, lr); 2143 } 2144 change_object_in_range_list (lr, to_obj); 2145 OBJECT_LIVE_RANGES (to_obj) 2146 = ira_merge_live_ranges (lr, OBJECT_LIVE_RANGES (to_obj)); 2147 OBJECT_LIVE_RANGES (from_obj) = NULL; 2148 } 2149} 2150 2151static void 2152copy_allocno_live_ranges (ira_allocno_t from, ira_allocno_t to) 2153{ 2154 int i; 2155 int n = ALLOCNO_NUM_OBJECTS (from); 2156 2157 gcc_assert (n == ALLOCNO_NUM_OBJECTS (to)); 2158 2159 for (i = 0; i < n; i++) 2160 { 2161 ira_object_t from_obj = ALLOCNO_OBJECT (from, i); 2162 ira_object_t to_obj = ALLOCNO_OBJECT (to, i); 2163 live_range_t lr = OBJECT_LIVE_RANGES (from_obj); 2164 2165 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 2166 { 2167 fprintf (ira_dump_file, " Copying ranges of a%dr%d to a%dr%d: ", 2168 ALLOCNO_NUM (from), ALLOCNO_REGNO (from), 2169 ALLOCNO_NUM (to), ALLOCNO_REGNO (to)); 2170 ira_print_live_range_list (ira_dump_file, lr); 2171 } 2172 lr = ira_copy_live_range_list (lr); 2173 change_object_in_range_list (lr, to_obj); 2174 OBJECT_LIVE_RANGES (to_obj) 2175 = ira_merge_live_ranges (lr, OBJECT_LIVE_RANGES (to_obj)); 2176 } 2177} 2178 2179/* Return TRUE if NODE represents a loop with low register 2180 pressure. */ 2181static bool 2182low_pressure_loop_node_p (ira_loop_tree_node_t node) 2183{ 2184 int i; 2185 enum reg_class pclass; 2186 2187 if (node->bb != NULL) 2188 return false; 2189 2190 for (i = 0; i < ira_pressure_classes_num; i++) 2191 { 2192 pclass = ira_pressure_classes[i]; 2193 if (node->reg_pressure[pclass] > ira_class_hard_regs_num[pclass] 2194 && ira_class_hard_regs_num[pclass] > 1) 2195 return false; 2196 } 2197 return true; 2198} 2199 2200#ifdef STACK_REGS 2201/* Return TRUE if LOOP has a complex enter or exit edge. We don't 2202 form a region from such loop if the target use stack register 2203 because reg-stack.c can not deal with such edges. */ 2204static bool 2205loop_with_complex_edge_p (struct loop *loop) 2206{ 2207 int i; 2208 edge_iterator ei; 2209 edge e; 2210 vec<edge> edges; 2211 bool res; 2212 2213 FOR_EACH_EDGE (e, ei, loop->header->preds) 2214 if (e->flags & EDGE_EH) 2215 return true; 2216 edges = get_loop_exit_edges (loop); 2217 res = false; 2218 FOR_EACH_VEC_ELT (edges, i, e) 2219 if (e->flags & EDGE_COMPLEX) 2220 { 2221 res = true; 2222 break; 2223 } 2224 edges.release (); 2225 return res; 2226} 2227#endif 2228 2229/* Sort loops for marking them for removal. We put already marked 2230 loops first, then less frequent loops next, and then outer loops 2231 next. */ 2232static int 2233loop_compare_func (const void *v1p, const void *v2p) 2234{ 2235 int diff; 2236 ira_loop_tree_node_t l1 = *(const ira_loop_tree_node_t *) v1p; 2237 ira_loop_tree_node_t l2 = *(const ira_loop_tree_node_t *) v2p; 2238 2239 ira_assert (l1->parent != NULL && l2->parent != NULL); 2240 if (l1->to_remove_p && ! l2->to_remove_p) 2241 return -1; 2242 if (! l1->to_remove_p && l2->to_remove_p) 2243 return 1; 2244 if ((diff = l1->loop->header->frequency - l2->loop->header->frequency) != 0) 2245 return diff; 2246 if ((diff = (int) loop_depth (l1->loop) - (int) loop_depth (l2->loop)) != 0) 2247 return diff; 2248 /* Make sorting stable. */ 2249 return l1->loop_num - l2->loop_num; 2250} 2251 2252/* Mark loops which should be removed from regional allocation. We 2253 remove a loop with low register pressure inside another loop with 2254 register pressure. In this case a separate allocation of the loop 2255 hardly helps (for irregular register file architecture it could 2256 help by choosing a better hard register in the loop but we prefer 2257 faster allocation even in this case). We also remove cheap loops 2258 if there are more than IRA_MAX_LOOPS_NUM of them. Loop with EH 2259 exit or enter edges are removed too because the allocation might 2260 require put pseudo moves on the EH edges (we could still do this 2261 for pseudos with caller saved hard registers in some cases but it 2262 is impossible to say here or during top-down allocation pass what 2263 hard register the pseudos get finally). */ 2264static void 2265mark_loops_for_removal (void) 2266{ 2267 int i, n; 2268 ira_loop_tree_node_t *sorted_loops; 2269 loop_p loop; 2270 2271 ira_assert (current_loops != NULL); 2272 sorted_loops 2273 = (ira_loop_tree_node_t *) ira_allocate (sizeof (ira_loop_tree_node_t) 2274 * number_of_loops (cfun)); 2275 for (n = i = 0; vec_safe_iterate (get_loops (cfun), i, &loop); i++) 2276 if (ira_loop_nodes[i].regno_allocno_map != NULL) 2277 { 2278 if (ira_loop_nodes[i].parent == NULL) 2279 { 2280 /* Don't remove the root. */ 2281 ira_loop_nodes[i].to_remove_p = false; 2282 continue; 2283 } 2284 sorted_loops[n++] = &ira_loop_nodes[i]; 2285 ira_loop_nodes[i].to_remove_p 2286 = ((low_pressure_loop_node_p (ira_loop_nodes[i].parent) 2287 && low_pressure_loop_node_p (&ira_loop_nodes[i])) 2288#ifdef STACK_REGS 2289 || loop_with_complex_edge_p (ira_loop_nodes[i].loop) 2290#endif 2291 ); 2292 } 2293 qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func); 2294 for (i = 0; n - i + 1 > IRA_MAX_LOOPS_NUM; i++) 2295 { 2296 sorted_loops[i]->to_remove_p = true; 2297 if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL) 2298 fprintf 2299 (ira_dump_file, 2300 " Mark loop %d (header %d, freq %d, depth %d) for removal (%s)\n", 2301 sorted_loops[i]->loop_num, sorted_loops[i]->loop->header->index, 2302 sorted_loops[i]->loop->header->frequency, 2303 loop_depth (sorted_loops[i]->loop), 2304 low_pressure_loop_node_p (sorted_loops[i]->parent) 2305 && low_pressure_loop_node_p (sorted_loops[i]) 2306 ? "low pressure" : "cheap loop"); 2307 } 2308 ira_free (sorted_loops); 2309} 2310 2311/* Mark all loops but root for removing. */ 2312static void 2313mark_all_loops_for_removal (void) 2314{ 2315 int i; 2316 loop_p loop; 2317 2318 ira_assert (current_loops != NULL); 2319 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop) 2320 if (ira_loop_nodes[i].regno_allocno_map != NULL) 2321 { 2322 if (ira_loop_nodes[i].parent == NULL) 2323 { 2324 /* Don't remove the root. */ 2325 ira_loop_nodes[i].to_remove_p = false; 2326 continue; 2327 } 2328 ira_loop_nodes[i].to_remove_p = true; 2329 if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL) 2330 fprintf 2331 (ira_dump_file, 2332 " Mark loop %d (header %d, freq %d, depth %d) for removal\n", 2333 ira_loop_nodes[i].loop_num, 2334 ira_loop_nodes[i].loop->header->index, 2335 ira_loop_nodes[i].loop->header->frequency, 2336 loop_depth (ira_loop_nodes[i].loop)); 2337 } 2338} 2339 2340/* Definition of vector of loop tree nodes. */ 2341 2342/* Vec containing references to all removed loop tree nodes. */ 2343static vec<ira_loop_tree_node_t> removed_loop_vec; 2344 2345/* Vec containing references to all children of loop tree nodes. */ 2346static vec<ira_loop_tree_node_t> children_vec; 2347 2348/* Remove subregions of NODE if their separate allocation will not 2349 improve the result. */ 2350static void 2351remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_node_t node) 2352{ 2353 unsigned int start; 2354 bool remove_p; 2355 ira_loop_tree_node_t subnode; 2356 2357 remove_p = node->to_remove_p; 2358 if (! remove_p) 2359 children_vec.safe_push (node); 2360 start = children_vec.length (); 2361 for (subnode = node->children; subnode != NULL; subnode = subnode->next) 2362 if (subnode->bb == NULL) 2363 remove_uneccesary_loop_nodes_from_loop_tree (subnode); 2364 else 2365 children_vec.safe_push (subnode); 2366 node->children = node->subloops = NULL; 2367 if (remove_p) 2368 { 2369 removed_loop_vec.safe_push (node); 2370 return; 2371 } 2372 while (children_vec.length () > start) 2373 { 2374 subnode = children_vec.pop (); 2375 subnode->parent = node; 2376 subnode->next = node->children; 2377 node->children = subnode; 2378 if (subnode->bb == NULL) 2379 { 2380 subnode->subloop_next = node->subloops; 2381 node->subloops = subnode; 2382 } 2383 } 2384} 2385 2386/* Return TRUE if NODE is inside PARENT. */ 2387static bool 2388loop_is_inside_p (ira_loop_tree_node_t node, ira_loop_tree_node_t parent) 2389{ 2390 for (node = node->parent; node != NULL; node = node->parent) 2391 if (node == parent) 2392 return true; 2393 return false; 2394} 2395 2396/* Sort allocnos according to their order in regno allocno list. */ 2397static int 2398regno_allocno_order_compare_func (const void *v1p, const void *v2p) 2399{ 2400 ira_allocno_t a1 = *(const ira_allocno_t *) v1p; 2401 ira_allocno_t a2 = *(const ira_allocno_t *) v2p; 2402 ira_loop_tree_node_t n1 = ALLOCNO_LOOP_TREE_NODE (a1); 2403 ira_loop_tree_node_t n2 = ALLOCNO_LOOP_TREE_NODE (a2); 2404 2405 if (loop_is_inside_p (n1, n2)) 2406 return -1; 2407 else if (loop_is_inside_p (n2, n1)) 2408 return 1; 2409 /* If allocnos are equally good, sort by allocno numbers, so that 2410 the results of qsort leave nothing to chance. We put allocnos 2411 with higher number first in the list because it is the original 2412 order for allocnos from loops on the same levels. */ 2413 return ALLOCNO_NUM (a2) - ALLOCNO_NUM (a1); 2414} 2415 2416/* This array is used to sort allocnos to restore allocno order in 2417 the regno allocno list. */ 2418static ira_allocno_t *regno_allocnos; 2419 2420/* Restore allocno order for REGNO in the regno allocno list. */ 2421static void 2422ira_rebuild_regno_allocno_list (int regno) 2423{ 2424 int i, n; 2425 ira_allocno_t a; 2426 2427 for (n = 0, a = ira_regno_allocno_map[regno]; 2428 a != NULL; 2429 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 2430 regno_allocnos[n++] = a; 2431 ira_assert (n > 0); 2432 qsort (regno_allocnos, n, sizeof (ira_allocno_t), 2433 regno_allocno_order_compare_func); 2434 for (i = 1; i < n; i++) 2435 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[i - 1]) = regno_allocnos[i]; 2436 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[n - 1]) = NULL; 2437 ira_regno_allocno_map[regno] = regno_allocnos[0]; 2438 if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL) 2439 fprintf (ira_dump_file, " Rebuilding regno allocno list for %d\n", regno); 2440} 2441 2442/* Propagate info from allocno FROM_A to allocno A. */ 2443static void 2444propagate_some_info_from_allocno (ira_allocno_t a, ira_allocno_t from_a) 2445{ 2446 enum reg_class aclass; 2447 2448 merge_hard_reg_conflicts (from_a, a, false); 2449 ALLOCNO_NREFS (a) += ALLOCNO_NREFS (from_a); 2450 ALLOCNO_FREQ (a) += ALLOCNO_FREQ (from_a); 2451 ALLOCNO_CALL_FREQ (a) += ALLOCNO_CALL_FREQ (from_a); 2452 ALLOCNO_CALLS_CROSSED_NUM (a) += ALLOCNO_CALLS_CROSSED_NUM (from_a); 2453 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a) 2454 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (from_a); 2455 IOR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a), 2456 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (from_a)); 2457 2458 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) 2459 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (from_a); 2460 if (! ALLOCNO_BAD_SPILL_P (from_a)) 2461 ALLOCNO_BAD_SPILL_P (a) = false; 2462 aclass = ALLOCNO_CLASS (from_a); 2463 ira_assert (aclass == ALLOCNO_CLASS (a)); 2464 ira_allocate_and_accumulate_costs (&ALLOCNO_HARD_REG_COSTS (a), aclass, 2465 ALLOCNO_HARD_REG_COSTS (from_a)); 2466 ira_allocate_and_accumulate_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a), 2467 aclass, 2468 ALLOCNO_CONFLICT_HARD_REG_COSTS (from_a)); 2469 ALLOCNO_CLASS_COST (a) += ALLOCNO_CLASS_COST (from_a); 2470 ALLOCNO_MEMORY_COST (a) += ALLOCNO_MEMORY_COST (from_a); 2471} 2472 2473/* Remove allocnos from loops removed from the allocation 2474 consideration. */ 2475static void 2476remove_unnecessary_allocnos (void) 2477{ 2478 int regno; 2479 bool merged_p, rebuild_p; 2480 ira_allocno_t a, prev_a, next_a, parent_a; 2481 ira_loop_tree_node_t a_node, parent; 2482 2483 merged_p = false; 2484 regno_allocnos = NULL; 2485 for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--) 2486 { 2487 rebuild_p = false; 2488 for (prev_a = NULL, a = ira_regno_allocno_map[regno]; 2489 a != NULL; 2490 a = next_a) 2491 { 2492 next_a = ALLOCNO_NEXT_REGNO_ALLOCNO (a); 2493 a_node = ALLOCNO_LOOP_TREE_NODE (a); 2494 if (! a_node->to_remove_p) 2495 prev_a = a; 2496 else 2497 { 2498 for (parent = a_node->parent; 2499 (parent_a = parent->regno_allocno_map[regno]) == NULL 2500 && parent->to_remove_p; 2501 parent = parent->parent) 2502 ; 2503 if (parent_a == NULL) 2504 { 2505 /* There are no allocnos with the same regno in 2506 upper region -- just move the allocno to the 2507 upper region. */ 2508 prev_a = a; 2509 ALLOCNO_LOOP_TREE_NODE (a) = parent; 2510 parent->regno_allocno_map[regno] = a; 2511 bitmap_set_bit (parent->all_allocnos, ALLOCNO_NUM (a)); 2512 rebuild_p = true; 2513 } 2514 else 2515 { 2516 /* Remove the allocno and update info of allocno in 2517 the upper region. */ 2518 if (prev_a == NULL) 2519 ira_regno_allocno_map[regno] = next_a; 2520 else 2521 ALLOCNO_NEXT_REGNO_ALLOCNO (prev_a) = next_a; 2522 move_allocno_live_ranges (a, parent_a); 2523 merged_p = true; 2524 propagate_some_info_from_allocno (parent_a, a); 2525 /* Remove it from the corresponding regno allocno 2526 map to avoid info propagation of subsequent 2527 allocno into this already removed allocno. */ 2528 a_node->regno_allocno_map[regno] = NULL; 2529 ira_remove_allocno_prefs (a); 2530 finish_allocno (a); 2531 } 2532 } 2533 } 2534 if (rebuild_p) 2535 /* We need to restore the order in regno allocno list. */ 2536 { 2537 if (regno_allocnos == NULL) 2538 regno_allocnos 2539 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) 2540 * ira_allocnos_num); 2541 ira_rebuild_regno_allocno_list (regno); 2542 } 2543 } 2544 if (merged_p) 2545 ira_rebuild_start_finish_chains (); 2546 if (regno_allocnos != NULL) 2547 ira_free (regno_allocnos); 2548} 2549 2550/* Remove allocnos from all loops but the root. */ 2551static void 2552remove_low_level_allocnos (void) 2553{ 2554 int regno; 2555 bool merged_p, propagate_p; 2556 ira_allocno_t a, top_a; 2557 ira_loop_tree_node_t a_node, parent; 2558 ira_allocno_iterator ai; 2559 2560 merged_p = false; 2561 FOR_EACH_ALLOCNO (a, ai) 2562 { 2563 a_node = ALLOCNO_LOOP_TREE_NODE (a); 2564 if (a_node == ira_loop_tree_root || ALLOCNO_CAP_MEMBER (a) != NULL) 2565 continue; 2566 regno = ALLOCNO_REGNO (a); 2567 if ((top_a = ira_loop_tree_root->regno_allocno_map[regno]) == NULL) 2568 { 2569 ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root; 2570 ira_loop_tree_root->regno_allocno_map[regno] = a; 2571 continue; 2572 } 2573 propagate_p = a_node->parent->regno_allocno_map[regno] == NULL; 2574 /* Remove the allocno and update info of allocno in the upper 2575 region. */ 2576 move_allocno_live_ranges (a, top_a); 2577 merged_p = true; 2578 if (propagate_p) 2579 propagate_some_info_from_allocno (top_a, a); 2580 } 2581 FOR_EACH_ALLOCNO (a, ai) 2582 { 2583 a_node = ALLOCNO_LOOP_TREE_NODE (a); 2584 if (a_node == ira_loop_tree_root) 2585 continue; 2586 parent = a_node->parent; 2587 regno = ALLOCNO_REGNO (a); 2588 if (ALLOCNO_CAP_MEMBER (a) != NULL) 2589 ira_assert (ALLOCNO_CAP (a) != NULL); 2590 else if (ALLOCNO_CAP (a) == NULL) 2591 ira_assert (parent->regno_allocno_map[regno] != NULL); 2592 } 2593 FOR_EACH_ALLOCNO (a, ai) 2594 { 2595 regno = ALLOCNO_REGNO (a); 2596 if (ira_loop_tree_root->regno_allocno_map[regno] == a) 2597 { 2598 ira_object_t obj; 2599 ira_allocno_object_iterator oi; 2600 2601 ira_regno_allocno_map[regno] = a; 2602 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = NULL; 2603 ALLOCNO_CAP_MEMBER (a) = NULL; 2604 FOR_EACH_ALLOCNO_OBJECT (a, obj, oi) 2605 COPY_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj), 2606 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj)); 2607#ifdef STACK_REGS 2608 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a)) 2609 ALLOCNO_NO_STACK_REG_P (a) = true; 2610#endif 2611 } 2612 else 2613 { 2614 ira_remove_allocno_prefs (a); 2615 finish_allocno (a); 2616 } 2617 } 2618 if (merged_p) 2619 ira_rebuild_start_finish_chains (); 2620} 2621 2622/* Remove loops from consideration. We remove all loops except for 2623 root if ALL_P or loops for which a separate allocation will not 2624 improve the result. We have to do this after allocno creation and 2625 their costs and allocno class evaluation because only after that 2626 the register pressure can be known and is calculated. */ 2627static void 2628remove_unnecessary_regions (bool all_p) 2629{ 2630 if (current_loops == NULL) 2631 return; 2632 if (all_p) 2633 mark_all_loops_for_removal (); 2634 else 2635 mark_loops_for_removal (); 2636 children_vec.create (last_basic_block_for_fn (cfun) 2637 + number_of_loops (cfun)); 2638 removed_loop_vec.create (last_basic_block_for_fn (cfun) 2639 + number_of_loops (cfun)); 2640 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root); 2641 children_vec.release (); 2642 if (all_p) 2643 remove_low_level_allocnos (); 2644 else 2645 remove_unnecessary_allocnos (); 2646 while (removed_loop_vec.length () > 0) 2647 finish_loop_tree_node (removed_loop_vec.pop ()); 2648 removed_loop_vec.release (); 2649} 2650 2651 2652 2653/* At this point true value of allocno attribute bad_spill_p means 2654 that there is an insn where allocno occurs and where the allocno 2655 can not be used as memory. The function updates the attribute, now 2656 it can be true only for allocnos which can not be used as memory in 2657 an insn and in whose live ranges there is other allocno deaths. 2658 Spilling allocnos with true value will not improve the code because 2659 it will not make other allocnos colorable and additional reloads 2660 for the corresponding pseudo will be generated in reload pass for 2661 each insn it occurs. 2662 2663 This is a trick mentioned in one classic article of Chaitin etc 2664 which is frequently omitted in other implementations of RA based on 2665 graph coloring. */ 2666static void 2667update_bad_spill_attribute (void) 2668{ 2669 int i; 2670 ira_allocno_t a; 2671 ira_allocno_iterator ai; 2672 ira_allocno_object_iterator aoi; 2673 ira_object_t obj; 2674 live_range_t r; 2675 enum reg_class aclass; 2676 bitmap_head dead_points[N_REG_CLASSES]; 2677 2678 for (i = 0; i < ira_allocno_classes_num; i++) 2679 { 2680 aclass = ira_allocno_classes[i]; 2681 bitmap_initialize (&dead_points[aclass], ®_obstack); 2682 } 2683 FOR_EACH_ALLOCNO (a, ai) 2684 { 2685 aclass = ALLOCNO_CLASS (a); 2686 if (aclass == NO_REGS) 2687 continue; 2688 FOR_EACH_ALLOCNO_OBJECT (a, obj, aoi) 2689 for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next) 2690 bitmap_set_bit (&dead_points[aclass], r->finish); 2691 } 2692 FOR_EACH_ALLOCNO (a, ai) 2693 { 2694 aclass = ALLOCNO_CLASS (a); 2695 if (aclass == NO_REGS) 2696 continue; 2697 if (! ALLOCNO_BAD_SPILL_P (a)) 2698 continue; 2699 FOR_EACH_ALLOCNO_OBJECT (a, obj, aoi) 2700 { 2701 for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next) 2702 { 2703 for (i = r->start + 1; i < r->finish; i++) 2704 if (bitmap_bit_p (&dead_points[aclass], i)) 2705 break; 2706 if (i < r->finish) 2707 break; 2708 } 2709 if (r != NULL) 2710 { 2711 ALLOCNO_BAD_SPILL_P (a) = false; 2712 break; 2713 } 2714 } 2715 } 2716 for (i = 0; i < ira_allocno_classes_num; i++) 2717 { 2718 aclass = ira_allocno_classes[i]; 2719 bitmap_clear (&dead_points[aclass]); 2720 } 2721} 2722 2723 2724 2725/* Set up minimal and maximal live range points for allocnos. */ 2726static void 2727setup_min_max_allocno_live_range_point (void) 2728{ 2729 int i; 2730 ira_allocno_t a, parent_a, cap; 2731 ira_allocno_iterator ai; 2732#ifdef ENABLE_IRA_CHECKING 2733 ira_object_iterator oi; 2734 ira_object_t obj; 2735#endif 2736 live_range_t r; 2737 ira_loop_tree_node_t parent; 2738 2739 FOR_EACH_ALLOCNO (a, ai) 2740 { 2741 int n = ALLOCNO_NUM_OBJECTS (a); 2742 2743 for (i = 0; i < n; i++) 2744 { 2745 ira_object_t obj = ALLOCNO_OBJECT (a, i); 2746 r = OBJECT_LIVE_RANGES (obj); 2747 if (r == NULL) 2748 continue; 2749 OBJECT_MAX (obj) = r->finish; 2750 for (; r->next != NULL; r = r->next) 2751 ; 2752 OBJECT_MIN (obj) = r->start; 2753 } 2754 } 2755 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--) 2756 for (a = ira_regno_allocno_map[i]; 2757 a != NULL; 2758 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 2759 { 2760 int j; 2761 int n = ALLOCNO_NUM_OBJECTS (a); 2762 2763 for (j = 0; j < n; j++) 2764 { 2765 ira_object_t obj = ALLOCNO_OBJECT (a, j); 2766 ira_object_t parent_obj; 2767 2768 if (OBJECT_MAX (obj) < 0) 2769 continue; 2770 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL); 2771 /* Accumulation of range info. */ 2772 if (ALLOCNO_CAP (a) != NULL) 2773 { 2774 for (cap = ALLOCNO_CAP (a); cap != NULL; cap = ALLOCNO_CAP (cap)) 2775 { 2776 ira_object_t cap_obj = ALLOCNO_OBJECT (cap, j); 2777 if (OBJECT_MAX (cap_obj) < OBJECT_MAX (obj)) 2778 OBJECT_MAX (cap_obj) = OBJECT_MAX (obj); 2779 if (OBJECT_MIN (cap_obj) > OBJECT_MIN (obj)) 2780 OBJECT_MIN (cap_obj) = OBJECT_MIN (obj); 2781 } 2782 continue; 2783 } 2784 if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) == NULL) 2785 continue; 2786 parent_a = parent->regno_allocno_map[i]; 2787 parent_obj = ALLOCNO_OBJECT (parent_a, j); 2788 if (OBJECT_MAX (parent_obj) < OBJECT_MAX (obj)) 2789 OBJECT_MAX (parent_obj) = OBJECT_MAX (obj); 2790 if (OBJECT_MIN (parent_obj) > OBJECT_MIN (obj)) 2791 OBJECT_MIN (parent_obj) = OBJECT_MIN (obj); 2792 } 2793 } 2794#ifdef ENABLE_IRA_CHECKING 2795 FOR_EACH_OBJECT (obj, oi) 2796 { 2797 if ((0 <= OBJECT_MIN (obj) && OBJECT_MIN (obj) <= ira_max_point) 2798 && (0 <= OBJECT_MAX (obj) && OBJECT_MAX (obj) <= ira_max_point)) 2799 continue; 2800 gcc_unreachable (); 2801 } 2802#endif 2803} 2804 2805/* Sort allocnos according to their live ranges. Allocnos with 2806 smaller allocno class are put first unless we use priority 2807 coloring. Allocnos with the same class are ordered according 2808 their start (min). Allocnos with the same start are ordered 2809 according their finish (max). */ 2810static int 2811object_range_compare_func (const void *v1p, const void *v2p) 2812{ 2813 int diff; 2814 ira_object_t obj1 = *(const ira_object_t *) v1p; 2815 ira_object_t obj2 = *(const ira_object_t *) v2p; 2816 ira_allocno_t a1 = OBJECT_ALLOCNO (obj1); 2817 ira_allocno_t a2 = OBJECT_ALLOCNO (obj2); 2818 2819 if ((diff = OBJECT_MIN (obj1) - OBJECT_MIN (obj2)) != 0) 2820 return diff; 2821 if ((diff = OBJECT_MAX (obj1) - OBJECT_MAX (obj2)) != 0) 2822 return diff; 2823 return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2); 2824} 2825 2826/* Sort ira_object_id_map and set up conflict id of allocnos. */ 2827static void 2828sort_conflict_id_map (void) 2829{ 2830 int i, num; 2831 ira_allocno_t a; 2832 ira_allocno_iterator ai; 2833 2834 num = 0; 2835 FOR_EACH_ALLOCNO (a, ai) 2836 { 2837 ira_allocno_object_iterator oi; 2838 ira_object_t obj; 2839 2840 FOR_EACH_ALLOCNO_OBJECT (a, obj, oi) 2841 ira_object_id_map[num++] = obj; 2842 } 2843 if (num > 1) 2844 qsort (ira_object_id_map, num, sizeof (ira_object_t), 2845 object_range_compare_func); 2846 for (i = 0; i < num; i++) 2847 { 2848 ira_object_t obj = ira_object_id_map[i]; 2849 2850 gcc_assert (obj != NULL); 2851 OBJECT_CONFLICT_ID (obj) = i; 2852 } 2853 for (i = num; i < ira_objects_num; i++) 2854 ira_object_id_map[i] = NULL; 2855} 2856 2857/* Set up minimal and maximal conflict ids of allocnos with which 2858 given allocno can conflict. */ 2859static void 2860setup_min_max_conflict_allocno_ids (void) 2861{ 2862 int aclass; 2863 int i, j, min, max, start, finish, first_not_finished, filled_area_start; 2864 int *live_range_min, *last_lived; 2865 int word0_min, word0_max; 2866 ira_allocno_t a; 2867 ira_allocno_iterator ai; 2868 2869 live_range_min = (int *) ira_allocate (sizeof (int) * ira_objects_num); 2870 aclass = -1; 2871 first_not_finished = -1; 2872 for (i = 0; i < ira_objects_num; i++) 2873 { 2874 ira_object_t obj = ira_object_id_map[i]; 2875 2876 if (obj == NULL) 2877 continue; 2878 2879 a = OBJECT_ALLOCNO (obj); 2880 2881 if (aclass < 0) 2882 { 2883 aclass = ALLOCNO_CLASS (a); 2884 min = i; 2885 first_not_finished = i; 2886 } 2887 else 2888 { 2889 start = OBJECT_MIN (obj); 2890 /* If we skip an allocno, the allocno with smaller ids will 2891 be also skipped because of the secondary sorting the 2892 range finishes (see function 2893 object_range_compare_func). */ 2894 while (first_not_finished < i 2895 && start > OBJECT_MAX (ira_object_id_map 2896 [first_not_finished])) 2897 first_not_finished++; 2898 min = first_not_finished; 2899 } 2900 if (min == i) 2901 /* We could increase min further in this case but it is good 2902 enough. */ 2903 min++; 2904 live_range_min[i] = OBJECT_MIN (obj); 2905 OBJECT_MIN (obj) = min; 2906 } 2907 last_lived = (int *) ira_allocate (sizeof (int) * ira_max_point); 2908 aclass = -1; 2909 filled_area_start = -1; 2910 for (i = ira_objects_num - 1; i >= 0; i--) 2911 { 2912 ira_object_t obj = ira_object_id_map[i]; 2913 2914 if (obj == NULL) 2915 continue; 2916 2917 a = OBJECT_ALLOCNO (obj); 2918 if (aclass < 0) 2919 { 2920 aclass = ALLOCNO_CLASS (a); 2921 for (j = 0; j < ira_max_point; j++) 2922 last_lived[j] = -1; 2923 filled_area_start = ira_max_point; 2924 } 2925 min = live_range_min[i]; 2926 finish = OBJECT_MAX (obj); 2927 max = last_lived[finish]; 2928 if (max < 0) 2929 /* We could decrease max further in this case but it is good 2930 enough. */ 2931 max = OBJECT_CONFLICT_ID (obj) - 1; 2932 OBJECT_MAX (obj) = max; 2933 /* In filling, we can go further A range finish to recognize 2934 intersection quickly because if the finish of subsequently 2935 processed allocno (it has smaller conflict id) range is 2936 further A range finish than they are definitely intersected 2937 (the reason for this is the allocnos with bigger conflict id 2938 have their range starts not smaller than allocnos with 2939 smaller ids. */ 2940 for (j = min; j < filled_area_start; j++) 2941 last_lived[j] = i; 2942 filled_area_start = min; 2943 } 2944 ira_free (last_lived); 2945 ira_free (live_range_min); 2946 2947 /* For allocnos with more than one object, we may later record extra conflicts in 2948 subobject 0 that we cannot really know about here. 2949 For now, simply widen the min/max range of these subobjects. */ 2950 2951 word0_min = INT_MAX; 2952 word0_max = INT_MIN; 2953 2954 FOR_EACH_ALLOCNO (a, ai) 2955 { 2956 int n = ALLOCNO_NUM_OBJECTS (a); 2957 ira_object_t obj0; 2958 2959 if (n < 2) 2960 continue; 2961 obj0 = ALLOCNO_OBJECT (a, 0); 2962 if (OBJECT_CONFLICT_ID (obj0) < word0_min) 2963 word0_min = OBJECT_CONFLICT_ID (obj0); 2964 if (OBJECT_CONFLICT_ID (obj0) > word0_max) 2965 word0_max = OBJECT_CONFLICT_ID (obj0); 2966 } 2967 FOR_EACH_ALLOCNO (a, ai) 2968 { 2969 int n = ALLOCNO_NUM_OBJECTS (a); 2970 ira_object_t obj0; 2971 2972 if (n < 2) 2973 continue; 2974 obj0 = ALLOCNO_OBJECT (a, 0); 2975 if (OBJECT_MIN (obj0) > word0_min) 2976 OBJECT_MIN (obj0) = word0_min; 2977 if (OBJECT_MAX (obj0) < word0_max) 2978 OBJECT_MAX (obj0) = word0_max; 2979 } 2980} 2981 2982 2983 2984static void 2985create_caps (void) 2986{ 2987 ira_allocno_t a; 2988 ira_allocno_iterator ai; 2989 ira_loop_tree_node_t loop_tree_node; 2990 2991 FOR_EACH_ALLOCNO (a, ai) 2992 { 2993 if (ALLOCNO_LOOP_TREE_NODE (a) == ira_loop_tree_root) 2994 continue; 2995 if (ALLOCNO_CAP_MEMBER (a) != NULL) 2996 create_cap_allocno (a); 2997 else if (ALLOCNO_CAP (a) == NULL) 2998 { 2999 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a); 3000 if (!bitmap_bit_p (loop_tree_node->border_allocnos, ALLOCNO_NUM (a))) 3001 create_cap_allocno (a); 3002 } 3003 } 3004} 3005 3006 3007 3008/* The page contains code transforming more one region internal 3009 representation (IR) to one region IR which is necessary for reload. 3010 This transformation is called IR flattening. We might just rebuild 3011 the IR for one region but we don't do it because it takes a lot of 3012 time. */ 3013 3014/* Map: regno -> allocnos which will finally represent the regno for 3015 IR with one region. */ 3016static ira_allocno_t *regno_top_level_allocno_map; 3017 3018/* Find the allocno that corresponds to A at a level one higher up in the 3019 loop tree. Returns NULL if A is a cap, or if it has no parent. */ 3020ira_allocno_t 3021ira_parent_allocno (ira_allocno_t a) 3022{ 3023 ira_loop_tree_node_t parent; 3024 3025 if (ALLOCNO_CAP (a) != NULL) 3026 return NULL; 3027 3028 parent = ALLOCNO_LOOP_TREE_NODE (a)->parent; 3029 if (parent == NULL) 3030 return NULL; 3031 3032 return parent->regno_allocno_map[ALLOCNO_REGNO (a)]; 3033} 3034 3035/* Find the allocno that corresponds to A at a level one higher up in the 3036 loop tree. If ALLOCNO_CAP is set for A, return that. */ 3037ira_allocno_t 3038ira_parent_or_cap_allocno (ira_allocno_t a) 3039{ 3040 if (ALLOCNO_CAP (a) != NULL) 3041 return ALLOCNO_CAP (a); 3042 3043 return ira_parent_allocno (a); 3044} 3045 3046/* Process all allocnos originated from pseudo REGNO and copy live 3047 ranges, hard reg conflicts, and allocno stack reg attributes from 3048 low level allocnos to final allocnos which are destinations of 3049 removed stores at a loop exit. Return true if we copied live 3050 ranges. */ 3051static bool 3052copy_info_to_removed_store_destinations (int regno) 3053{ 3054 ira_allocno_t a; 3055 ira_allocno_t parent_a = NULL; 3056 ira_loop_tree_node_t parent; 3057 bool merged_p; 3058 3059 merged_p = false; 3060 for (a = ira_regno_allocno_map[regno]; 3061 a != NULL; 3062 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 3063 { 3064 if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))]) 3065 /* This allocno will be removed. */ 3066 continue; 3067 3068 /* Caps will be removed. */ 3069 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL); 3070 for (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent; 3071 parent != NULL; 3072 parent = parent->parent) 3073 if ((parent_a = parent->regno_allocno_map[regno]) == NULL 3074 || (parent_a 3075 == regno_top_level_allocno_map[REGNO 3076 (allocno_emit_reg (parent_a))] 3077 && ALLOCNO_EMIT_DATA (parent_a)->mem_optimized_dest_p)) 3078 break; 3079 if (parent == NULL || parent_a == NULL) 3080 continue; 3081 3082 copy_allocno_live_ranges (a, parent_a); 3083 merge_hard_reg_conflicts (a, parent_a, true); 3084 3085 ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a); 3086 ALLOCNO_CALLS_CROSSED_NUM (parent_a) 3087 += ALLOCNO_CALLS_CROSSED_NUM (a); 3088 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a) 3089 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a); 3090 IOR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a), 3091 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a)); 3092 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a) 3093 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a); 3094 merged_p = true; 3095 } 3096 return merged_p; 3097} 3098 3099/* Flatten the IR. In other words, this function transforms IR as if 3100 it were built with one region (without loops). We could make it 3101 much simpler by rebuilding IR with one region, but unfortunately it 3102 takes a lot of time. MAX_REGNO_BEFORE_EMIT and 3103 IRA_MAX_POINT_BEFORE_EMIT are correspondingly MAX_REG_NUM () and 3104 IRA_MAX_POINT before emitting insns on the loop borders. */ 3105void 3106ira_flattening (int max_regno_before_emit, int ira_max_point_before_emit) 3107{ 3108 int i, j; 3109 bool keep_p; 3110 int hard_regs_num; 3111 bool new_pseudos_p, merged_p, mem_dest_p; 3112 unsigned int n; 3113 enum reg_class aclass; 3114 ira_allocno_t a, parent_a, first, second, node_first, node_second; 3115 ira_copy_t cp; 3116 ira_loop_tree_node_t node; 3117 live_range_t r; 3118 ira_allocno_iterator ai; 3119 ira_copy_iterator ci; 3120 3121 regno_top_level_allocno_map 3122 = (ira_allocno_t *) ira_allocate (max_reg_num () 3123 * sizeof (ira_allocno_t)); 3124 memset (regno_top_level_allocno_map, 0, 3125 max_reg_num () * sizeof (ira_allocno_t)); 3126 new_pseudos_p = merged_p = false; 3127 FOR_EACH_ALLOCNO (a, ai) 3128 { 3129 ira_allocno_object_iterator oi; 3130 ira_object_t obj; 3131 3132 if (ALLOCNO_CAP_MEMBER (a) != NULL) 3133 /* Caps are not in the regno allocno maps and they are never 3134 will be transformed into allocnos existing after IR 3135 flattening. */ 3136 continue; 3137 FOR_EACH_ALLOCNO_OBJECT (a, obj, oi) 3138 COPY_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), 3139 OBJECT_CONFLICT_HARD_REGS (obj)); 3140#ifdef STACK_REGS 3141 ALLOCNO_TOTAL_NO_STACK_REG_P (a) = ALLOCNO_NO_STACK_REG_P (a); 3142#endif 3143 } 3144 /* Fix final allocno attributes. */ 3145 for (i = max_regno_before_emit - 1; i >= FIRST_PSEUDO_REGISTER; i--) 3146 { 3147 mem_dest_p = false; 3148 for (a = ira_regno_allocno_map[i]; 3149 a != NULL; 3150 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 3151 { 3152 ira_emit_data_t parent_data, data = ALLOCNO_EMIT_DATA (a); 3153 3154 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL); 3155 if (data->somewhere_renamed_p) 3156 new_pseudos_p = true; 3157 parent_a = ira_parent_allocno (a); 3158 if (parent_a == NULL) 3159 { 3160 ALLOCNO_COPIES (a) = NULL; 3161 regno_top_level_allocno_map[REGNO (data->reg)] = a; 3162 continue; 3163 } 3164 ira_assert (ALLOCNO_CAP_MEMBER (parent_a) == NULL); 3165 3166 if (data->mem_optimized_dest != NULL) 3167 mem_dest_p = true; 3168 parent_data = ALLOCNO_EMIT_DATA (parent_a); 3169 if (REGNO (data->reg) == REGNO (parent_data->reg)) 3170 { 3171 merge_hard_reg_conflicts (a, parent_a, true); 3172 move_allocno_live_ranges (a, parent_a); 3173 merged_p = true; 3174 parent_data->mem_optimized_dest_p 3175 = (parent_data->mem_optimized_dest_p 3176 || data->mem_optimized_dest_p); 3177 continue; 3178 } 3179 new_pseudos_p = true; 3180 for (;;) 3181 { 3182 ALLOCNO_NREFS (parent_a) -= ALLOCNO_NREFS (a); 3183 ALLOCNO_FREQ (parent_a) -= ALLOCNO_FREQ (a); 3184 ALLOCNO_CALL_FREQ (parent_a) -= ALLOCNO_CALL_FREQ (a); 3185 ALLOCNO_CALLS_CROSSED_NUM (parent_a) 3186 -= ALLOCNO_CALLS_CROSSED_NUM (a); 3187 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a) 3188 -= ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a); 3189 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a) 3190 -= ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a); 3191 ira_assert (ALLOCNO_CALLS_CROSSED_NUM (parent_a) >= 0 3192 && ALLOCNO_NREFS (parent_a) >= 0 3193 && ALLOCNO_FREQ (parent_a) >= 0); 3194 aclass = ALLOCNO_CLASS (parent_a); 3195 hard_regs_num = ira_class_hard_regs_num[aclass]; 3196 if (ALLOCNO_HARD_REG_COSTS (a) != NULL 3197 && ALLOCNO_HARD_REG_COSTS (parent_a) != NULL) 3198 for (j = 0; j < hard_regs_num; j++) 3199 ALLOCNO_HARD_REG_COSTS (parent_a)[j] 3200 -= ALLOCNO_HARD_REG_COSTS (a)[j]; 3201 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL 3202 && ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a) != NULL) 3203 for (j = 0; j < hard_regs_num; j++) 3204 ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a)[j] 3205 -= ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[j]; 3206 ALLOCNO_CLASS_COST (parent_a) 3207 -= ALLOCNO_CLASS_COST (a); 3208 ALLOCNO_MEMORY_COST (parent_a) -= ALLOCNO_MEMORY_COST (a); 3209 parent_a = ira_parent_allocno (parent_a); 3210 if (parent_a == NULL) 3211 break; 3212 } 3213 ALLOCNO_COPIES (a) = NULL; 3214 regno_top_level_allocno_map[REGNO (data->reg)] = a; 3215 } 3216 if (mem_dest_p && copy_info_to_removed_store_destinations (i)) 3217 merged_p = true; 3218 } 3219 ira_assert (new_pseudos_p || ira_max_point_before_emit == ira_max_point); 3220 if (merged_p || ira_max_point_before_emit != ira_max_point) 3221 ira_rebuild_start_finish_chains (); 3222 if (new_pseudos_p) 3223 { 3224 sparseset objects_live; 3225 3226 /* Rebuild conflicts. */ 3227 FOR_EACH_ALLOCNO (a, ai) 3228 { 3229 ira_allocno_object_iterator oi; 3230 ira_object_t obj; 3231 3232 if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))] 3233 || ALLOCNO_CAP_MEMBER (a) != NULL) 3234 continue; 3235 FOR_EACH_ALLOCNO_OBJECT (a, obj, oi) 3236 { 3237 for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next) 3238 ira_assert (r->object == obj); 3239 clear_conflicts (obj); 3240 } 3241 } 3242 objects_live = sparseset_alloc (ira_objects_num); 3243 for (i = 0; i < ira_max_point; i++) 3244 { 3245 for (r = ira_start_point_ranges[i]; r != NULL; r = r->start_next) 3246 { 3247 ira_object_t obj = r->object; 3248 3249 a = OBJECT_ALLOCNO (obj); 3250 if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))] 3251 || ALLOCNO_CAP_MEMBER (a) != NULL) 3252 continue; 3253 3254 aclass = ALLOCNO_CLASS (a); 3255 EXECUTE_IF_SET_IN_SPARSESET (objects_live, n) 3256 { 3257 ira_object_t live_obj = ira_object_id_map[n]; 3258 ira_allocno_t live_a = OBJECT_ALLOCNO (live_obj); 3259 enum reg_class live_aclass = ALLOCNO_CLASS (live_a); 3260 3261 if (ira_reg_classes_intersect_p[aclass][live_aclass] 3262 /* Don't set up conflict for the allocno with itself. */ 3263 && live_a != a) 3264 ira_add_conflict (obj, live_obj); 3265 } 3266 sparseset_set_bit (objects_live, OBJECT_CONFLICT_ID (obj)); 3267 } 3268 3269 for (r = ira_finish_point_ranges[i]; r != NULL; r = r->finish_next) 3270 sparseset_clear_bit (objects_live, OBJECT_CONFLICT_ID (r->object)); 3271 } 3272 sparseset_free (objects_live); 3273 compress_conflict_vecs (); 3274 } 3275 /* Mark some copies for removing and change allocnos in the rest 3276 copies. */ 3277 FOR_EACH_COPY (cp, ci) 3278 { 3279 if (ALLOCNO_CAP_MEMBER (cp->first) != NULL 3280 || ALLOCNO_CAP_MEMBER (cp->second) != NULL) 3281 { 3282 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 3283 fprintf 3284 (ira_dump_file, " Remove cp%d:%c%dr%d-%c%dr%d\n", 3285 cp->num, ALLOCNO_CAP_MEMBER (cp->first) != NULL ? 'c' : 'a', 3286 ALLOCNO_NUM (cp->first), 3287 REGNO (allocno_emit_reg (cp->first)), 3288 ALLOCNO_CAP_MEMBER (cp->second) != NULL ? 'c' : 'a', 3289 ALLOCNO_NUM (cp->second), 3290 REGNO (allocno_emit_reg (cp->second))); 3291 cp->loop_tree_node = NULL; 3292 continue; 3293 } 3294 first 3295 = regno_top_level_allocno_map[REGNO (allocno_emit_reg (cp->first))]; 3296 second 3297 = regno_top_level_allocno_map[REGNO (allocno_emit_reg (cp->second))]; 3298 node = cp->loop_tree_node; 3299 if (node == NULL) 3300 keep_p = true; /* It copy generated in ira-emit.c. */ 3301 else 3302 { 3303 /* Check that the copy was not propagated from level on 3304 which we will have different pseudos. */ 3305 node_first = node->regno_allocno_map[ALLOCNO_REGNO (cp->first)]; 3306 node_second = node->regno_allocno_map[ALLOCNO_REGNO (cp->second)]; 3307 keep_p = ((REGNO (allocno_emit_reg (first)) 3308 == REGNO (allocno_emit_reg (node_first))) 3309 && (REGNO (allocno_emit_reg (second)) 3310 == REGNO (allocno_emit_reg (node_second)))); 3311 } 3312 if (keep_p) 3313 { 3314 cp->loop_tree_node = ira_loop_tree_root; 3315 cp->first = first; 3316 cp->second = second; 3317 } 3318 else 3319 { 3320 cp->loop_tree_node = NULL; 3321 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 3322 fprintf (ira_dump_file, " Remove cp%d:a%dr%d-a%dr%d\n", 3323 cp->num, ALLOCNO_NUM (cp->first), 3324 REGNO (allocno_emit_reg (cp->first)), 3325 ALLOCNO_NUM (cp->second), 3326 REGNO (allocno_emit_reg (cp->second))); 3327 } 3328 } 3329 /* Remove unnecessary allocnos on lower levels of the loop tree. */ 3330 FOR_EACH_ALLOCNO (a, ai) 3331 { 3332 if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))] 3333 || ALLOCNO_CAP_MEMBER (a) != NULL) 3334 { 3335 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 3336 fprintf (ira_dump_file, " Remove a%dr%d\n", 3337 ALLOCNO_NUM (a), REGNO (allocno_emit_reg (a))); 3338 ira_remove_allocno_prefs (a); 3339 finish_allocno (a); 3340 continue; 3341 } 3342 ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root; 3343 ALLOCNO_REGNO (a) = REGNO (allocno_emit_reg (a)); 3344 ALLOCNO_CAP (a) = NULL; 3345 /* Restore updated costs for assignments from reload. */ 3346 ALLOCNO_UPDATED_MEMORY_COST (a) = ALLOCNO_MEMORY_COST (a); 3347 ALLOCNO_UPDATED_CLASS_COST (a) = ALLOCNO_CLASS_COST (a); 3348 if (! ALLOCNO_ASSIGNED_P (a)) 3349 ira_free_allocno_updated_costs (a); 3350 ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL); 3351 ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL); 3352 } 3353 /* Remove unnecessary copies. */ 3354 FOR_EACH_COPY (cp, ci) 3355 { 3356 if (cp->loop_tree_node == NULL) 3357 { 3358 ira_copies[cp->num] = NULL; 3359 finish_copy (cp); 3360 continue; 3361 } 3362 ira_assert 3363 (ALLOCNO_LOOP_TREE_NODE (cp->first) == ira_loop_tree_root 3364 && ALLOCNO_LOOP_TREE_NODE (cp->second) == ira_loop_tree_root); 3365 add_allocno_copy_to_list (cp); 3366 swap_allocno_copy_ends_if_necessary (cp); 3367 } 3368 rebuild_regno_allocno_maps (); 3369 if (ira_max_point != ira_max_point_before_emit) 3370 ira_compress_allocno_live_ranges (); 3371 ira_free (regno_top_level_allocno_map); 3372} 3373 3374 3375 3376#ifdef ENABLE_IRA_CHECKING 3377/* Check creation of all allocnos. Allocnos on lower levels should 3378 have allocnos or caps on all upper levels. */ 3379static void 3380check_allocno_creation (void) 3381{ 3382 ira_allocno_t a; 3383 ira_allocno_iterator ai; 3384 ira_loop_tree_node_t loop_tree_node; 3385 3386 FOR_EACH_ALLOCNO (a, ai) 3387 { 3388 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a); 3389 ira_assert (bitmap_bit_p (loop_tree_node->all_allocnos, 3390 ALLOCNO_NUM (a))); 3391 if (loop_tree_node == ira_loop_tree_root) 3392 continue; 3393 if (ALLOCNO_CAP_MEMBER (a) != NULL) 3394 ira_assert (ALLOCNO_CAP (a) != NULL); 3395 else if (ALLOCNO_CAP (a) == NULL) 3396 ira_assert (loop_tree_node->parent 3397 ->regno_allocno_map[ALLOCNO_REGNO (a)] != NULL 3398 && bitmap_bit_p (loop_tree_node->border_allocnos, 3399 ALLOCNO_NUM (a))); 3400 } 3401} 3402#endif 3403 3404/* Identify allocnos which prefer a register class with a single hard register. 3405 Adjust ALLOCNO_CONFLICT_HARD_REG_COSTS so that conflicting allocnos are 3406 less likely to use the preferred singleton register. */ 3407static void 3408update_conflict_hard_reg_costs (void) 3409{ 3410 ira_allocno_t a; 3411 ira_allocno_iterator ai; 3412 int i, index, min; 3413 3414 FOR_EACH_ALLOCNO (a, ai) 3415 { 3416 reg_class_t aclass = ALLOCNO_CLASS (a); 3417 reg_class_t pref = reg_preferred_class (ALLOCNO_REGNO (a)); 3418 int singleton = ira_class_singleton[pref][ALLOCNO_MODE (a)]; 3419 if (singleton < 0) 3420 continue; 3421 index = ira_class_hard_reg_index[(int) aclass][singleton]; 3422 if (index < 0) 3423 continue; 3424 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) == NULL 3425 || ALLOCNO_HARD_REG_COSTS (a) == NULL) 3426 continue; 3427 min = INT_MAX; 3428 for (i = ira_class_hard_regs_num[(int) aclass] - 1; i >= 0; i--) 3429 if (ALLOCNO_HARD_REG_COSTS (a)[i] > ALLOCNO_CLASS_COST (a) 3430 && min > ALLOCNO_HARD_REG_COSTS (a)[i]) 3431 min = ALLOCNO_HARD_REG_COSTS (a)[i]; 3432 if (min == INT_MAX) 3433 continue; 3434 ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a), 3435 aclass, 0); 3436 ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[index] 3437 -= min - ALLOCNO_CLASS_COST (a); 3438 } 3439} 3440 3441/* Create a internal representation (IR) for IRA (allocnos, copies, 3442 loop tree nodes). The function returns TRUE if we generate loop 3443 structure (besides nodes representing all function and the basic 3444 blocks) for regional allocation. A true return means that we 3445 really need to flatten IR before the reload. */ 3446bool 3447ira_build (void) 3448{ 3449 bool loops_p; 3450 3451 df_analyze (); 3452 initiate_cost_vectors (); 3453 initiate_allocnos (); 3454 initiate_prefs (); 3455 initiate_copies (); 3456 create_loop_tree_nodes (); 3457 form_loop_tree (); 3458 create_allocnos (); 3459 ira_costs (); 3460 create_allocno_objects (); 3461 ira_create_allocno_live_ranges (); 3462 remove_unnecessary_regions (false); 3463 ira_compress_allocno_live_ranges (); 3464 update_bad_spill_attribute (); 3465 loops_p = more_one_region_p (); 3466 if (loops_p) 3467 { 3468 propagate_allocno_info (); 3469 create_caps (); 3470 } 3471 ira_tune_allocno_costs (); 3472#ifdef ENABLE_IRA_CHECKING 3473 check_allocno_creation (); 3474#endif 3475 setup_min_max_allocno_live_range_point (); 3476 sort_conflict_id_map (); 3477 setup_min_max_conflict_allocno_ids (); 3478 ira_build_conflicts (); 3479 update_conflict_hard_reg_costs (); 3480 if (! ira_conflicts_p) 3481 { 3482 ira_allocno_t a; 3483 ira_allocno_iterator ai; 3484 3485 /* Remove all regions but root one. */ 3486 if (loops_p) 3487 { 3488 remove_unnecessary_regions (true); 3489 loops_p = false; 3490 } 3491 /* We don't save hard registers around calls for fast allocation 3492 -- add caller clobbered registers as conflicting ones to 3493 allocno crossing calls. */ 3494 FOR_EACH_ALLOCNO (a, ai) 3495 if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0) 3496 ior_hard_reg_conflicts (a, &call_used_reg_set); 3497 } 3498 if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL) 3499 print_copies (ira_dump_file); 3500 if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL) 3501 print_prefs (ira_dump_file); 3502 if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL) 3503 { 3504 int n, nr, nr_big; 3505 ira_allocno_t a; 3506 live_range_t r; 3507 ira_allocno_iterator ai; 3508 3509 n = 0; 3510 nr = 0; 3511 nr_big = 0; 3512 FOR_EACH_ALLOCNO (a, ai) 3513 { 3514 int j, nobj = ALLOCNO_NUM_OBJECTS (a); 3515 3516 if (nobj > 1) 3517 nr_big++; 3518 for (j = 0; j < nobj; j++) 3519 { 3520 ira_object_t obj = ALLOCNO_OBJECT (a, j); 3521 n += OBJECT_NUM_CONFLICTS (obj); 3522 for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next) 3523 nr++; 3524 } 3525 } 3526 fprintf (ira_dump_file, " regions=%d, blocks=%d, points=%d\n", 3527 current_loops == NULL ? 1 : number_of_loops (cfun), 3528 n_basic_blocks_for_fn (cfun), ira_max_point); 3529 fprintf (ira_dump_file, 3530 " allocnos=%d (big %d), copies=%d, conflicts=%d, ranges=%d\n", 3531 ira_allocnos_num, nr_big, ira_copies_num, n, nr); 3532 } 3533 return loops_p; 3534} 3535 3536/* Release the data created by function ira_build. */ 3537void 3538ira_destroy (void) 3539{ 3540 finish_loop_tree_nodes (); 3541 finish_prefs (); 3542 finish_copies (); 3543 finish_allocnos (); 3544 finish_cost_vectors (); 3545 ira_finish_allocno_live_ranges (); 3546} 3547