1/* Building internal representation for IRA. 2 Copyright (C) 2006, 2007, 2008, 2009 3 Free Software Foundation, Inc. 4 Contributed by Vladimir Makarov <vmakarov@redhat.com>. 5 6This file is part of GCC. 7 8GCC is free software; you can redistribute it and/or modify it under 9the terms of the GNU General Public License as published by the Free 10Software Foundation; either version 3, or (at your option) any later 11version. 12 13GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14WARRANTY; without even the implied warranty of MERCHANTABILITY or 15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16for more details. 17 18You should have received a copy of the GNU General Public License 19along with GCC; see the file COPYING3. If not see 20<http://www.gnu.org/licenses/>. */ 21 22#include "config.h" 23#include "system.h" 24#include "coretypes.h" 25#include "tm.h" 26#include "rtl.h" 27#include "tm_p.h" 28#include "target.h" 29#include "regs.h" 30#include "flags.h" 31#include "hard-reg-set.h" 32#include "basic-block.h" 33#include "insn-config.h" 34#include "recog.h" 35#include "toplev.h" 36#include "params.h" 37#include "df.h" 38#include "output.h" 39#include "reload.h" 40#include "sparseset.h" 41#include "ira-int.h" 42 43static ira_copy_t find_allocno_copy (ira_allocno_t, ira_allocno_t, rtx, 44 ira_loop_tree_node_t); 45 46/* The root of the loop tree corresponding to the all function. */ 47ira_loop_tree_node_t ira_loop_tree_root; 48 49/* Height of the loop tree. */ 50int ira_loop_tree_height; 51 52/* All nodes representing basic blocks are referred through the 53 following array. We can not use basic block member `aux' for this 54 because it is used for insertion of insns on edges. */ 55ira_loop_tree_node_t ira_bb_nodes; 56 57/* All nodes representing loops are referred through the following 58 array. */ 59ira_loop_tree_node_t ira_loop_nodes; 60 61/* Map regno -> allocnos with given regno (see comments for 62 allocno member `next_regno_allocno'). */ 63ira_allocno_t *ira_regno_allocno_map; 64 65/* Array of references to all allocnos. The order number of the 66 allocno corresponds to the index in the array. Removed allocnos 67 have NULL element value. */ 68ira_allocno_t *ira_allocnos; 69 70/* Sizes of the previous array. */ 71int ira_allocnos_num; 72 73/* Map conflict id -> allocno with given conflict id (see comments for 74 allocno member `conflict_id'). */ 75ira_allocno_t *ira_conflict_id_allocno_map; 76 77/* Array of references to all copies. The order number of the copy 78 corresponds to the index in the array. Removed copies have NULL 79 element value. */ 80ira_copy_t *ira_copies; 81 82/* Size of the previous array. */ 83int ira_copies_num; 84 85 86 87/* LAST_BASIC_BLOCK before generating additional insns because of live 88 range splitting. Emitting insns on a critical edge creates a new 89 basic block. */ 90static int last_basic_block_before_change; 91 92/* The following function allocates the loop tree nodes. If LOOPS_P 93 is FALSE, the nodes corresponding to the loops (except the root 94 which corresponds the all function) will be not allocated but nodes 95 will still be allocated for basic blocks. */ 96static void 97create_loop_tree_nodes (bool loops_p) 98{ 99 unsigned int i, j; 100 int max_regno; 101 bool skip_p; 102 edge_iterator ei; 103 edge e; 104 VEC (edge, heap) *edges; 105 loop_p loop; 106 107 ira_bb_nodes 108 = ((struct ira_loop_tree_node *) 109 ira_allocate (sizeof (struct ira_loop_tree_node) * last_basic_block)); 110 last_basic_block_before_change = last_basic_block; 111 for (i = 0; i < (unsigned int) last_basic_block; i++) 112 { 113 ira_bb_nodes[i].regno_allocno_map = NULL; 114 memset (ira_bb_nodes[i].reg_pressure, 0, 115 sizeof (ira_bb_nodes[i].reg_pressure)); 116 ira_bb_nodes[i].all_allocnos = NULL; 117 ira_bb_nodes[i].modified_regnos = NULL; 118 ira_bb_nodes[i].border_allocnos = NULL; 119 ira_bb_nodes[i].local_copies = NULL; 120 } 121 ira_loop_nodes = ((struct ira_loop_tree_node *) 122 ira_allocate (sizeof (struct ira_loop_tree_node) 123 * VEC_length (loop_p, ira_loops.larray))); 124 max_regno = max_reg_num (); 125 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++) 126 { 127 if (loop != ira_loops.tree_root) 128 { 129 ira_loop_nodes[i].regno_allocno_map = NULL; 130 if (! loops_p) 131 continue; 132 skip_p = false; 133 FOR_EACH_EDGE (e, ei, loop->header->preds) 134 if (e->src != loop->latch 135 && (e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)) 136 { 137 skip_p = true; 138 break; 139 } 140 if (skip_p) 141 continue; 142 edges = get_loop_exit_edges (loop); 143 for (j = 0; VEC_iterate (edge, edges, j, e); j++) 144 if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)) 145 { 146 skip_p = true; 147 break; 148 } 149 VEC_free (edge, heap, edges); 150 if (skip_p) 151 continue; 152 } 153 ira_loop_nodes[i].regno_allocno_map 154 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) * max_regno); 155 memset (ira_loop_nodes[i].regno_allocno_map, 0, 156 sizeof (ira_allocno_t) * max_regno); 157 memset (ira_loop_nodes[i].reg_pressure, 0, 158 sizeof (ira_loop_nodes[i].reg_pressure)); 159 ira_loop_nodes[i].all_allocnos = ira_allocate_bitmap (); 160 ira_loop_nodes[i].modified_regnos = ira_allocate_bitmap (); 161 ira_loop_nodes[i].border_allocnos = ira_allocate_bitmap (); 162 ira_loop_nodes[i].local_copies = ira_allocate_bitmap (); 163 } 164} 165 166/* The function returns TRUE if there are more one allocation 167 region. */ 168static bool 169more_one_region_p (void) 170{ 171 unsigned int i; 172 loop_p loop; 173 174 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++) 175 if (ira_loop_nodes[i].regno_allocno_map != NULL 176 && ira_loop_tree_root != &ira_loop_nodes[i]) 177 return true; 178 return false; 179} 180 181/* Free the loop tree node of a loop. */ 182static void 183finish_loop_tree_node (ira_loop_tree_node_t loop) 184{ 185 if (loop->regno_allocno_map != NULL) 186 { 187 ira_assert (loop->bb == NULL); 188 ira_free_bitmap (loop->local_copies); 189 ira_free_bitmap (loop->border_allocnos); 190 ira_free_bitmap (loop->modified_regnos); 191 ira_free_bitmap (loop->all_allocnos); 192 ira_free (loop->regno_allocno_map); 193 loop->regno_allocno_map = NULL; 194 } 195} 196 197/* Free the loop tree nodes. */ 198static void 199finish_loop_tree_nodes (void) 200{ 201 unsigned int i; 202 loop_p loop; 203 204 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++) 205 finish_loop_tree_node (&ira_loop_nodes[i]); 206 ira_free (ira_loop_nodes); 207 for (i = 0; i < (unsigned int) last_basic_block_before_change; i++) 208 { 209 if (ira_bb_nodes[i].local_copies != NULL) 210 ira_free_bitmap (ira_bb_nodes[i].local_copies); 211 if (ira_bb_nodes[i].border_allocnos != NULL) 212 ira_free_bitmap (ira_bb_nodes[i].border_allocnos); 213 if (ira_bb_nodes[i].modified_regnos != NULL) 214 ira_free_bitmap (ira_bb_nodes[i].modified_regnos); 215 if (ira_bb_nodes[i].all_allocnos != NULL) 216 ira_free_bitmap (ira_bb_nodes[i].all_allocnos); 217 if (ira_bb_nodes[i].regno_allocno_map != NULL) 218 ira_free (ira_bb_nodes[i].regno_allocno_map); 219 } 220 ira_free (ira_bb_nodes); 221} 222 223 224 225/* The following recursive function adds LOOP to the loop tree 226 hierarchy. LOOP is added only once. */ 227static void 228add_loop_to_tree (struct loop *loop) 229{ 230 struct loop *parent; 231 ira_loop_tree_node_t loop_node, parent_node; 232 233 /* We can not use loop node access macros here because of potential 234 checking and because the nodes are not initialized enough 235 yet. */ 236 if (loop_outer (loop) != NULL) 237 add_loop_to_tree (loop_outer (loop)); 238 if (ira_loop_nodes[loop->num].regno_allocno_map != NULL 239 && ira_loop_nodes[loop->num].children == NULL) 240 { 241 /* We have not added loop node to the tree yet. */ 242 loop_node = &ira_loop_nodes[loop->num]; 243 loop_node->loop = loop; 244 loop_node->bb = NULL; 245 for (parent = loop_outer (loop); 246 parent != NULL; 247 parent = loop_outer (parent)) 248 if (ira_loop_nodes[parent->num].regno_allocno_map != NULL) 249 break; 250 if (parent == NULL) 251 { 252 loop_node->next = NULL; 253 loop_node->subloop_next = NULL; 254 loop_node->parent = NULL; 255 } 256 else 257 { 258 parent_node = &ira_loop_nodes[parent->num]; 259 loop_node->next = parent_node->children; 260 parent_node->children = loop_node; 261 loop_node->subloop_next = parent_node->subloops; 262 parent_node->subloops = loop_node; 263 loop_node->parent = parent_node; 264 } 265 } 266} 267 268/* The following recursive function sets up levels of nodes of the 269 tree given its root LOOP_NODE. The enumeration starts with LEVEL. 270 The function returns maximal value of level in the tree + 1. */ 271static int 272setup_loop_tree_level (ira_loop_tree_node_t loop_node, int level) 273{ 274 int height, max_height; 275 ira_loop_tree_node_t subloop_node; 276 277 ira_assert (loop_node->bb == NULL); 278 loop_node->level = level; 279 max_height = level + 1; 280 for (subloop_node = loop_node->subloops; 281 subloop_node != NULL; 282 subloop_node = subloop_node->subloop_next) 283 { 284 ira_assert (subloop_node->bb == NULL); 285 height = setup_loop_tree_level (subloop_node, level + 1); 286 if (height > max_height) 287 max_height = height; 288 } 289 return max_height; 290} 291 292/* Create the loop tree. The algorithm is designed to provide correct 293 order of loops (they are ordered by their last loop BB) and basic 294 blocks in the chain formed by member next. */ 295static void 296form_loop_tree (void) 297{ 298 unsigned int i; 299 basic_block bb; 300 struct loop *parent; 301 ira_loop_tree_node_t bb_node, loop_node; 302 loop_p loop; 303 304 /* We can not use loop/bb node access macros because of potential 305 checking and because the nodes are not initialized enough 306 yet. */ 307 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++) 308 if (ira_loop_nodes[i].regno_allocno_map != NULL) 309 { 310 ira_loop_nodes[i].children = NULL; 311 ira_loop_nodes[i].subloops = NULL; 312 } 313 FOR_EACH_BB (bb) 314 { 315 bb_node = &ira_bb_nodes[bb->index]; 316 bb_node->bb = bb; 317 bb_node->loop = NULL; 318 bb_node->subloops = NULL; 319 bb_node->children = NULL; 320 bb_node->subloop_next = NULL; 321 bb_node->next = NULL; 322 for (parent = bb->loop_father; 323 parent != NULL; 324 parent = loop_outer (parent)) 325 if (ira_loop_nodes[parent->num].regno_allocno_map != NULL) 326 break; 327 add_loop_to_tree (parent); 328 loop_node = &ira_loop_nodes[parent->num]; 329 bb_node->next = loop_node->children; 330 bb_node->parent = loop_node; 331 loop_node->children = bb_node; 332 } 333 ira_loop_tree_root = IRA_LOOP_NODE_BY_INDEX (ira_loops.tree_root->num); 334 ira_loop_tree_height = setup_loop_tree_level (ira_loop_tree_root, 0); 335 ira_assert (ira_loop_tree_root->regno_allocno_map != NULL); 336} 337 338 339 340/* Rebuild IRA_REGNO_ALLOCNO_MAP and REGNO_ALLOCNO_MAPs of the loop 341 tree nodes. */ 342static void 343rebuild_regno_allocno_maps (void) 344{ 345 unsigned int l; 346 int max_regno, regno; 347 ira_allocno_t a; 348 ira_loop_tree_node_t loop_tree_node; 349 loop_p loop; 350 ira_allocno_iterator ai; 351 352 max_regno = max_reg_num (); 353 for (l = 0; VEC_iterate (loop_p, ira_loops.larray, l, loop); l++) 354 if (ira_loop_nodes[l].regno_allocno_map != NULL) 355 { 356 ira_free (ira_loop_nodes[l].regno_allocno_map); 357 ira_loop_nodes[l].regno_allocno_map 358 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) 359 * max_regno); 360 memset (ira_loop_nodes[l].regno_allocno_map, 0, 361 sizeof (ira_allocno_t) * max_regno); 362 } 363 ira_free (ira_regno_allocno_map); 364 ira_regno_allocno_map 365 = (ira_allocno_t *) ira_allocate (max_regno * sizeof (ira_allocno_t)); 366 memset (ira_regno_allocno_map, 0, max_regno * sizeof (ira_allocno_t)); 367 FOR_EACH_ALLOCNO (a, ai) 368 { 369 if (ALLOCNO_CAP_MEMBER (a) != NULL) 370 /* Caps are not in the regno allocno maps. */ 371 continue; 372 regno = ALLOCNO_REGNO (a); 373 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a); 374 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno]; 375 ira_regno_allocno_map[regno] = a; 376 if (loop_tree_node->regno_allocno_map[regno] == NULL) 377 /* Remember that we can create temporary allocnos to break 378 cycles in register shuffle. */ 379 loop_tree_node->regno_allocno_map[regno] = a; 380 } 381} 382 383 384 385/* Pools for allocnos and allocno live ranges. */ 386static alloc_pool allocno_pool, allocno_live_range_pool; 387 388/* Vec containing references to all created allocnos. It is a 389 container of array allocnos. */ 390static VEC(ira_allocno_t,heap) *allocno_vec; 391 392/* Vec containing references to all created allocnos. It is a 393 container of ira_conflict_id_allocno_map. */ 394static VEC(ira_allocno_t,heap) *ira_conflict_id_allocno_map_vec; 395 396/* Initialize data concerning allocnos. */ 397static void 398initiate_allocnos (void) 399{ 400 allocno_live_range_pool 401 = create_alloc_pool ("allocno live ranges", 402 sizeof (struct ira_allocno_live_range), 100); 403 allocno_pool 404 = create_alloc_pool ("allocnos", sizeof (struct ira_allocno), 100); 405 allocno_vec = VEC_alloc (ira_allocno_t, heap, max_reg_num () * 2); 406 ira_allocnos = NULL; 407 ira_allocnos_num = 0; 408 ira_conflict_id_allocno_map_vec 409 = VEC_alloc (ira_allocno_t, heap, max_reg_num () * 2); 410 ira_conflict_id_allocno_map = NULL; 411 ira_regno_allocno_map 412 = (ira_allocno_t *) ira_allocate (max_reg_num () * sizeof (ira_allocno_t)); 413 memset (ira_regno_allocno_map, 0, max_reg_num () * sizeof (ira_allocno_t)); 414} 415 416/* Create and return the allocno corresponding to REGNO in 417 LOOP_TREE_NODE. Add the allocno to the list of allocnos with the 418 same regno if CAP_P is FALSE. */ 419ira_allocno_t 420ira_create_allocno (int regno, bool cap_p, ira_loop_tree_node_t loop_tree_node) 421{ 422 ira_allocno_t a; 423 424 a = (ira_allocno_t) pool_alloc (allocno_pool); 425 ALLOCNO_REGNO (a) = regno; 426 ALLOCNO_LOOP_TREE_NODE (a) = loop_tree_node; 427 if (! cap_p) 428 { 429 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno]; 430 ira_regno_allocno_map[regno] = a; 431 if (loop_tree_node->regno_allocno_map[regno] == NULL) 432 /* Remember that we can create temporary allocnos to break 433 cycles in register shuffle on region borders (see 434 ira-emit.c). */ 435 loop_tree_node->regno_allocno_map[regno] = a; 436 } 437 ALLOCNO_CAP (a) = NULL; 438 ALLOCNO_CAP_MEMBER (a) = NULL; 439 ALLOCNO_NUM (a) = ira_allocnos_num; 440 bitmap_set_bit (loop_tree_node->all_allocnos, ALLOCNO_NUM (a)); 441 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) = NULL; 442 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = 0; 443 COPY_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (a), ira_no_alloc_regs); 444 COPY_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), ira_no_alloc_regs); 445 ALLOCNO_NREFS (a) = 0; 446 ALLOCNO_FREQ (a) = 0; 447 ALLOCNO_HARD_REGNO (a) = -1; 448 ALLOCNO_CALL_FREQ (a) = 0; 449 ALLOCNO_CALLS_CROSSED_NUM (a) = 0; 450#ifdef STACK_REGS 451 ALLOCNO_NO_STACK_REG_P (a) = false; 452 ALLOCNO_TOTAL_NO_STACK_REG_P (a) = false; 453#endif 454 ALLOCNO_MEM_OPTIMIZED_DEST (a) = NULL; 455 ALLOCNO_MEM_OPTIMIZED_DEST_P (a) = false; 456 ALLOCNO_SOMEWHERE_RENAMED_P (a) = false; 457 ALLOCNO_CHILD_RENAMED_P (a) = false; 458 ALLOCNO_DONT_REASSIGN_P (a) = false; 459 ALLOCNO_BAD_SPILL_P (a) = false; 460 ALLOCNO_IN_GRAPH_P (a) = false; 461 ALLOCNO_ASSIGNED_P (a) = false; 462 ALLOCNO_MAY_BE_SPILLED_P (a) = false; 463 ALLOCNO_SPLAY_REMOVED_P (a) = false; 464 ALLOCNO_CONFLICT_VEC_P (a) = false; 465 ALLOCNO_MODE (a) = (regno < 0 ? VOIDmode : PSEUDO_REGNO_MODE (regno)); 466 ALLOCNO_COPIES (a) = NULL; 467 ALLOCNO_HARD_REG_COSTS (a) = NULL; 468 ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL; 469 ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL; 470 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL; 471 ALLOCNO_LEFT_CONFLICTS_SIZE (a) = -1; 472 ALLOCNO_COVER_CLASS (a) = NO_REGS; 473 ALLOCNO_UPDATED_COVER_CLASS_COST (a) = 0; 474 ALLOCNO_COVER_CLASS_COST (a) = 0; 475 ALLOCNO_MEMORY_COST (a) = 0; 476 ALLOCNO_UPDATED_MEMORY_COST (a) = 0; 477 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) = 0; 478 ALLOCNO_NEXT_BUCKET_ALLOCNO (a) = NULL; 479 ALLOCNO_PREV_BUCKET_ALLOCNO (a) = NULL; 480 ALLOCNO_FIRST_COALESCED_ALLOCNO (a) = a; 481 ALLOCNO_NEXT_COALESCED_ALLOCNO (a) = a; 482 ALLOCNO_LIVE_RANGES (a) = NULL; 483 ALLOCNO_MIN (a) = INT_MAX; 484 ALLOCNO_MAX (a) = -1; 485 ALLOCNO_CONFLICT_ID (a) = ira_allocnos_num; 486 VEC_safe_push (ira_allocno_t, heap, allocno_vec, a); 487 ira_allocnos = VEC_address (ira_allocno_t, allocno_vec); 488 ira_allocnos_num = VEC_length (ira_allocno_t, allocno_vec); 489 VEC_safe_push (ira_allocno_t, heap, ira_conflict_id_allocno_map_vec, a); 490 ira_conflict_id_allocno_map 491 = VEC_address (ira_allocno_t, ira_conflict_id_allocno_map_vec); 492 return a; 493} 494 495/* Set up cover class for A and update its conflict hard registers. */ 496void 497ira_set_allocno_cover_class (ira_allocno_t a, enum reg_class cover_class) 498{ 499 ALLOCNO_COVER_CLASS (a) = cover_class; 500 IOR_COMPL_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (a), 501 reg_class_contents[cover_class]); 502 IOR_COMPL_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), 503 reg_class_contents[cover_class]); 504} 505 506/* Return TRUE if the conflict vector with NUM elements is more 507 profitable than conflict bit vector for A. */ 508bool 509ira_conflict_vector_profitable_p (ira_allocno_t a, int num) 510{ 511 int nw; 512 513 if (ALLOCNO_MAX (a) < ALLOCNO_MIN (a)) 514 /* We prefer bit vector in such case because it does not result in 515 allocation. */ 516 return false; 517 518 nw = (ALLOCNO_MAX (a) - ALLOCNO_MIN (a) + IRA_INT_BITS) / IRA_INT_BITS; 519 return (2 * sizeof (ira_allocno_t) * (num + 1) 520 < 3 * nw * sizeof (IRA_INT_TYPE)); 521} 522 523/* Allocates and initialize the conflict vector of A for NUM 524 conflicting allocnos. */ 525void 526ira_allocate_allocno_conflict_vec (ira_allocno_t a, int num) 527{ 528 int size; 529 ira_allocno_t *vec; 530 531 ira_assert (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) == NULL); 532 num++; /* for NULL end marker */ 533 size = sizeof (ira_allocno_t) * num; 534 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) = ira_allocate (size); 535 vec = (ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a); 536 vec[0] = NULL; 537 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = 0; 538 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a) = size; 539 ALLOCNO_CONFLICT_VEC_P (a) = true; 540} 541 542/* Allocate and initialize the conflict bit vector of A. */ 543static void 544allocate_allocno_conflict_bit_vec (ira_allocno_t a) 545{ 546 unsigned int size; 547 548 ira_assert (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) == NULL); 549 size = ((ALLOCNO_MAX (a) - ALLOCNO_MIN (a) + IRA_INT_BITS) 550 / IRA_INT_BITS * sizeof (IRA_INT_TYPE)); 551 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) = ira_allocate (size); 552 memset (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a), 0, size); 553 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a) = size; 554 ALLOCNO_CONFLICT_VEC_P (a) = false; 555} 556 557/* Allocate and initialize the conflict vector or conflict bit vector 558 of A for NUM conflicting allocnos whatever is more profitable. */ 559void 560ira_allocate_allocno_conflicts (ira_allocno_t a, int num) 561{ 562 if (ira_conflict_vector_profitable_p (a, num)) 563 ira_allocate_allocno_conflict_vec (a, num); 564 else 565 allocate_allocno_conflict_bit_vec (a); 566} 567 568/* Add A2 to the conflicts of A1. */ 569static void 570add_to_allocno_conflicts (ira_allocno_t a1, ira_allocno_t a2) 571{ 572 int num; 573 unsigned int size; 574 575 if (ALLOCNO_CONFLICT_VEC_P (a1)) 576 { 577 ira_allocno_t *vec; 578 579 num = ALLOCNO_CONFLICT_ALLOCNOS_NUM (a1) + 2; 580 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) 581 >= num * sizeof (ira_allocno_t)) 582 vec = (ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1); 583 else 584 { 585 size = (3 * num / 2 + 1) * sizeof (ira_allocno_t); 586 vec = (ira_allocno_t *) ira_allocate (size); 587 memcpy (vec, ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1), 588 sizeof (ira_allocno_t) * ALLOCNO_CONFLICT_ALLOCNOS_NUM (a1)); 589 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1)); 590 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1) = vec; 591 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) = size; 592 } 593 vec[num - 2] = a2; 594 vec[num - 1] = NULL; 595 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a1)++; 596 } 597 else 598 { 599 int nw, added_head_nw, id; 600 IRA_INT_TYPE *vec; 601 602 id = ALLOCNO_CONFLICT_ID (a2); 603 vec = (IRA_INT_TYPE *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1); 604 if (ALLOCNO_MIN (a1) > id) 605 { 606 /* Expand head of the bit vector. */ 607 added_head_nw = (ALLOCNO_MIN (a1) - id - 1) / IRA_INT_BITS + 1; 608 nw = (ALLOCNO_MAX (a1) - ALLOCNO_MIN (a1)) / IRA_INT_BITS + 1; 609 size = (nw + added_head_nw) * sizeof (IRA_INT_TYPE); 610 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) >= size) 611 { 612 memmove ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE), 613 vec, nw * sizeof (IRA_INT_TYPE)); 614 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE)); 615 } 616 else 617 { 618 size 619 = (3 * (nw + added_head_nw) / 2 + 1) * sizeof (IRA_INT_TYPE); 620 vec = (IRA_INT_TYPE *) ira_allocate (size); 621 memcpy ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE), 622 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1), 623 nw * sizeof (IRA_INT_TYPE)); 624 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE)); 625 memset ((char *) vec 626 + (nw + added_head_nw) * sizeof (IRA_INT_TYPE), 627 0, size - (nw + added_head_nw) * sizeof (IRA_INT_TYPE)); 628 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1)); 629 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1) = vec; 630 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) = size; 631 } 632 ALLOCNO_MIN (a1) -= added_head_nw * IRA_INT_BITS; 633 } 634 else if (ALLOCNO_MAX (a1) < id) 635 { 636 nw = (id - ALLOCNO_MIN (a1)) / IRA_INT_BITS + 1; 637 size = nw * sizeof (IRA_INT_TYPE); 638 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) < size) 639 { 640 /* Expand tail of the bit vector. */ 641 size = (3 * nw / 2 + 1) * sizeof (IRA_INT_TYPE); 642 vec = (IRA_INT_TYPE *) ira_allocate (size); 643 memcpy (vec, ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1), 644 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1)); 645 memset ((char *) vec + ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1), 646 0, size - ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1)); 647 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1)); 648 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1) = vec; 649 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) = size; 650 } 651 ALLOCNO_MAX (a1) = id; 652 } 653 SET_ALLOCNO_SET_BIT (vec, id, ALLOCNO_MIN (a1), ALLOCNO_MAX (a1)); 654 } 655} 656 657/* Add A1 to the conflicts of A2 and vise versa. */ 658void 659ira_add_allocno_conflict (ira_allocno_t a1, ira_allocno_t a2) 660{ 661 add_to_allocno_conflicts (a1, a2); 662 add_to_allocno_conflicts (a2, a1); 663} 664 665/* Clear all conflicts of allocno A. */ 666static void 667clear_allocno_conflicts (ira_allocno_t a) 668{ 669 if (ALLOCNO_CONFLICT_VEC_P (a)) 670 { 671 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = 0; 672 ((ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a))[0] = NULL; 673 } 674 else if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a) != 0) 675 { 676 int nw; 677 678 nw = (ALLOCNO_MAX (a) - ALLOCNO_MIN (a)) / IRA_INT_BITS + 1; 679 memset (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a), 0, 680 nw * sizeof (IRA_INT_TYPE)); 681 } 682} 683 684/* The array used to find duplications in conflict vectors of 685 allocnos. */ 686static int *allocno_conflict_check; 687 688/* The value used to mark allocation presence in conflict vector of 689 the current allocno. */ 690static int curr_allocno_conflict_check_tick; 691 692/* Remove duplications in conflict vector of A. */ 693static void 694compress_allocno_conflict_vec (ira_allocno_t a) 695{ 696 ira_allocno_t *vec, conflict_a; 697 int i, j; 698 699 ira_assert (ALLOCNO_CONFLICT_VEC_P (a)); 700 vec = (ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a); 701 curr_allocno_conflict_check_tick++; 702 for (i = j = 0; (conflict_a = vec[i]) != NULL; i++) 703 { 704 if (allocno_conflict_check[ALLOCNO_NUM (conflict_a)] 705 != curr_allocno_conflict_check_tick) 706 { 707 allocno_conflict_check[ALLOCNO_NUM (conflict_a)] 708 = curr_allocno_conflict_check_tick; 709 vec[j++] = conflict_a; 710 } 711 } 712 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = j; 713 vec[j] = NULL; 714} 715 716/* Remove duplications in conflict vectors of all allocnos. */ 717static void 718compress_conflict_vecs (void) 719{ 720 ira_allocno_t a; 721 ira_allocno_iterator ai; 722 723 allocno_conflict_check 724 = (int *) ira_allocate (sizeof (int) * ira_allocnos_num); 725 memset (allocno_conflict_check, 0, sizeof (int) * ira_allocnos_num); 726 curr_allocno_conflict_check_tick = 0; 727 FOR_EACH_ALLOCNO (a, ai) 728 if (ALLOCNO_CONFLICT_VEC_P (a)) 729 compress_allocno_conflict_vec (a); 730 ira_free (allocno_conflict_check); 731} 732 733/* This recursive function outputs allocno A and if it is a cap the 734 function outputs its members. */ 735void 736ira_print_expanded_allocno (ira_allocno_t a) 737{ 738 basic_block bb; 739 740 fprintf (ira_dump_file, " a%d(r%d", ALLOCNO_NUM (a), ALLOCNO_REGNO (a)); 741 if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL) 742 fprintf (ira_dump_file, ",b%d", bb->index); 743 else 744 fprintf (ira_dump_file, ",l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop->num); 745 if (ALLOCNO_CAP_MEMBER (a) != NULL) 746 { 747 fprintf (ira_dump_file, ":"); 748 ira_print_expanded_allocno (ALLOCNO_CAP_MEMBER (a)); 749 } 750 fprintf (ira_dump_file, ")"); 751} 752 753/* Create and return the cap representing allocno A in the 754 parent loop. */ 755static ira_allocno_t 756create_cap_allocno (ira_allocno_t a) 757{ 758 ira_allocno_t cap; 759 ira_loop_tree_node_t parent; 760 enum reg_class cover_class; 761 762 ira_assert (ALLOCNO_FIRST_COALESCED_ALLOCNO (a) == a 763 && ALLOCNO_NEXT_COALESCED_ALLOCNO (a) == a); 764 parent = ALLOCNO_LOOP_TREE_NODE (a)->parent; 765 cap = ira_create_allocno (ALLOCNO_REGNO (a), true, parent); 766 ALLOCNO_MODE (cap) = ALLOCNO_MODE (a); 767 cover_class = ALLOCNO_COVER_CLASS (a); 768 ira_set_allocno_cover_class (cap, cover_class); 769 ALLOCNO_AVAILABLE_REGS_NUM (cap) = ALLOCNO_AVAILABLE_REGS_NUM (a); 770 ALLOCNO_CAP_MEMBER (cap) = a; 771 ALLOCNO_CAP (a) = cap; 772 ALLOCNO_COVER_CLASS_COST (cap) = ALLOCNO_COVER_CLASS_COST (a); 773 ALLOCNO_MEMORY_COST (cap) = ALLOCNO_MEMORY_COST (a); 774 ira_allocate_and_copy_costs 775 (&ALLOCNO_HARD_REG_COSTS (cap), cover_class, ALLOCNO_HARD_REG_COSTS (a)); 776 ira_allocate_and_copy_costs 777 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (cap), cover_class, 778 ALLOCNO_CONFLICT_HARD_REG_COSTS (a)); 779 ALLOCNO_BAD_SPILL_P (cap) = ALLOCNO_BAD_SPILL_P (a); 780 ALLOCNO_NREFS (cap) = ALLOCNO_NREFS (a); 781 ALLOCNO_FREQ (cap) = ALLOCNO_FREQ (a); 782 ALLOCNO_CALL_FREQ (cap) = ALLOCNO_CALL_FREQ (a); 783 IOR_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (cap), 784 ALLOCNO_CONFLICT_HARD_REGS (a)); 785 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (cap), 786 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a)); 787 ALLOCNO_CALLS_CROSSED_NUM (cap) = ALLOCNO_CALLS_CROSSED_NUM (a); 788#ifdef STACK_REGS 789 ALLOCNO_NO_STACK_REG_P (cap) = ALLOCNO_NO_STACK_REG_P (a); 790 ALLOCNO_TOTAL_NO_STACK_REG_P (cap) = ALLOCNO_TOTAL_NO_STACK_REG_P (a); 791#endif 792 if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL) 793 { 794 fprintf (ira_dump_file, " Creating cap "); 795 ira_print_expanded_allocno (cap); 796 fprintf (ira_dump_file, "\n"); 797 } 798 return cap; 799} 800 801/* Create and return allocno live range with given attributes. */ 802allocno_live_range_t 803ira_create_allocno_live_range (ira_allocno_t a, int start, int finish, 804 allocno_live_range_t next) 805{ 806 allocno_live_range_t p; 807 808 p = (allocno_live_range_t) pool_alloc (allocno_live_range_pool); 809 p->allocno = a; 810 p->start = start; 811 p->finish = finish; 812 p->next = next; 813 return p; 814} 815 816/* Copy allocno live range R and return the result. */ 817static allocno_live_range_t 818copy_allocno_live_range (allocno_live_range_t r) 819{ 820 allocno_live_range_t p; 821 822 p = (allocno_live_range_t) pool_alloc (allocno_live_range_pool); 823 *p = *r; 824 return p; 825} 826 827/* Copy allocno live range list given by its head R and return the 828 result. */ 829allocno_live_range_t 830ira_copy_allocno_live_range_list (allocno_live_range_t r) 831{ 832 allocno_live_range_t p, first, last; 833 834 if (r == NULL) 835 return NULL; 836 for (first = last = NULL; r != NULL; r = r->next) 837 { 838 p = copy_allocno_live_range (r); 839 if (first == NULL) 840 first = p; 841 else 842 last->next = p; 843 last = p; 844 } 845 return first; 846} 847 848/* Merge ranges R1 and R2 and returns the result. The function 849 maintains the order of ranges and tries to minimize number of the 850 result ranges. */ 851allocno_live_range_t 852ira_merge_allocno_live_ranges (allocno_live_range_t r1, 853 allocno_live_range_t r2) 854{ 855 allocno_live_range_t first, last, temp; 856 857 if (r1 == NULL) 858 return r2; 859 if (r2 == NULL) 860 return r1; 861 for (first = last = NULL; r1 != NULL && r2 != NULL;) 862 { 863 if (r1->start < r2->start) 864 { 865 temp = r1; 866 r1 = r2; 867 r2 = temp; 868 } 869 if (r1->start <= r2->finish + 1) 870 { 871 /* Intersected ranges: merge r1 and r2 into r1. */ 872 r1->start = r2->start; 873 if (r1->finish < r2->finish) 874 r1->finish = r2->finish; 875 temp = r2; 876 r2 = r2->next; 877 ira_finish_allocno_live_range (temp); 878 if (r2 == NULL) 879 { 880 /* To try to merge with subsequent ranges in r1. */ 881 r2 = r1->next; 882 r1->next = NULL; 883 } 884 } 885 else 886 { 887 /* Add r1 to the result. */ 888 if (first == NULL) 889 first = last = r1; 890 else 891 { 892 last->next = r1; 893 last = r1; 894 } 895 r1 = r1->next; 896 if (r1 == NULL) 897 { 898 /* To try to merge with subsequent ranges in r2. */ 899 r1 = r2->next; 900 r2->next = NULL; 901 } 902 } 903 } 904 if (r1 != NULL) 905 { 906 if (first == NULL) 907 first = r1; 908 else 909 last->next = r1; 910 ira_assert (r1->next == NULL); 911 } 912 else if (r2 != NULL) 913 { 914 if (first == NULL) 915 first = r2; 916 else 917 last->next = r2; 918 ira_assert (r2->next == NULL); 919 } 920 else 921 { 922 ira_assert (last->next == NULL); 923 } 924 return first; 925} 926 927/* Return TRUE if live ranges R1 and R2 intersect. */ 928bool 929ira_allocno_live_ranges_intersect_p (allocno_live_range_t r1, 930 allocno_live_range_t r2) 931{ 932 /* Remember the live ranges are always kept ordered. */ 933 while (r1 != NULL && r2 != NULL) 934 { 935 if (r1->start > r2->finish) 936 r1 = r1->next; 937 else if (r2->start > r1->finish) 938 r2 = r2->next; 939 else 940 return true; 941 } 942 return false; 943} 944 945/* Free allocno live range R. */ 946void 947ira_finish_allocno_live_range (allocno_live_range_t r) 948{ 949 pool_free (allocno_live_range_pool, r); 950} 951 952/* Free list of allocno live ranges starting with R. */ 953void 954ira_finish_allocno_live_range_list (allocno_live_range_t r) 955{ 956 allocno_live_range_t next_r; 957 958 for (; r != NULL; r = next_r) 959 { 960 next_r = r->next; 961 ira_finish_allocno_live_range (r); 962 } 963} 964 965/* Free updated register costs of allocno A. */ 966void 967ira_free_allocno_updated_costs (ira_allocno_t a) 968{ 969 enum reg_class cover_class; 970 971 cover_class = ALLOCNO_COVER_CLASS (a); 972 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL) 973 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), cover_class); 974 ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL; 975 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL) 976 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a), 977 cover_class); 978 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL; 979} 980 981/* Free the memory allocated for allocno A. */ 982static void 983finish_allocno (ira_allocno_t a) 984{ 985 enum reg_class cover_class = ALLOCNO_COVER_CLASS (a); 986 987 ira_allocnos[ALLOCNO_NUM (a)] = NULL; 988 ira_conflict_id_allocno_map[ALLOCNO_CONFLICT_ID (a)] = NULL; 989 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) != NULL) 990 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a)); 991 if (ALLOCNO_HARD_REG_COSTS (a) != NULL) 992 ira_free_cost_vector (ALLOCNO_HARD_REG_COSTS (a), cover_class); 993 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL) 994 ira_free_cost_vector (ALLOCNO_CONFLICT_HARD_REG_COSTS (a), cover_class); 995 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL) 996 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), cover_class); 997 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL) 998 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a), 999 cover_class); 1000 ira_finish_allocno_live_range_list (ALLOCNO_LIVE_RANGES (a)); 1001 pool_free (allocno_pool, a); 1002} 1003 1004/* Free the memory allocated for all allocnos. */ 1005static void 1006finish_allocnos (void) 1007{ 1008 ira_allocno_t a; 1009 ira_allocno_iterator ai; 1010 1011 FOR_EACH_ALLOCNO (a, ai) 1012 finish_allocno (a); 1013 ira_free (ira_regno_allocno_map); 1014 VEC_free (ira_allocno_t, heap, ira_conflict_id_allocno_map_vec); 1015 VEC_free (ira_allocno_t, heap, allocno_vec); 1016 free_alloc_pool (allocno_pool); 1017 free_alloc_pool (allocno_live_range_pool); 1018} 1019 1020 1021 1022/* Pools for copies. */ 1023static alloc_pool copy_pool; 1024 1025/* Vec containing references to all created copies. It is a 1026 container of array ira_copies. */ 1027static VEC(ira_copy_t,heap) *copy_vec; 1028 1029/* The function initializes data concerning allocno copies. */ 1030static void 1031initiate_copies (void) 1032{ 1033 copy_pool 1034 = create_alloc_pool ("copies", sizeof (struct ira_allocno_copy), 100); 1035 copy_vec = VEC_alloc (ira_copy_t, heap, get_max_uid ()); 1036 ira_copies = NULL; 1037 ira_copies_num = 0; 1038} 1039 1040/* Return copy connecting A1 and A2 and originated from INSN of 1041 LOOP_TREE_NODE if any. */ 1042static ira_copy_t 1043find_allocno_copy (ira_allocno_t a1, ira_allocno_t a2, rtx insn, 1044 ira_loop_tree_node_t loop_tree_node) 1045{ 1046 ira_copy_t cp, next_cp; 1047 ira_allocno_t another_a; 1048 1049 for (cp = ALLOCNO_COPIES (a1); cp != NULL; cp = next_cp) 1050 { 1051 if (cp->first == a1) 1052 { 1053 next_cp = cp->next_first_allocno_copy; 1054 another_a = cp->second; 1055 } 1056 else if (cp->second == a1) 1057 { 1058 next_cp = cp->next_second_allocno_copy; 1059 another_a = cp->first; 1060 } 1061 else 1062 gcc_unreachable (); 1063 if (another_a == a2 && cp->insn == insn 1064 && cp->loop_tree_node == loop_tree_node) 1065 return cp; 1066 } 1067 return NULL; 1068} 1069 1070/* Create and return copy with given attributes LOOP_TREE_NODE, FIRST, 1071 SECOND, FREQ, CONSTRAINT_P, and INSN. */ 1072ira_copy_t 1073ira_create_copy (ira_allocno_t first, ira_allocno_t second, int freq, 1074 bool constraint_p, rtx insn, 1075 ira_loop_tree_node_t loop_tree_node) 1076{ 1077 ira_copy_t cp; 1078 1079 cp = (ira_copy_t) pool_alloc (copy_pool); 1080 cp->num = ira_copies_num; 1081 cp->first = first; 1082 cp->second = second; 1083 cp->freq = freq; 1084 cp->constraint_p = constraint_p; 1085 cp->insn = insn; 1086 cp->loop_tree_node = loop_tree_node; 1087 VEC_safe_push (ira_copy_t, heap, copy_vec, cp); 1088 ira_copies = VEC_address (ira_copy_t, copy_vec); 1089 ira_copies_num = VEC_length (ira_copy_t, copy_vec); 1090 return cp; 1091} 1092 1093/* Attach a copy CP to allocnos involved into the copy. */ 1094void 1095ira_add_allocno_copy_to_list (ira_copy_t cp) 1096{ 1097 ira_allocno_t first = cp->first, second = cp->second; 1098 1099 cp->prev_first_allocno_copy = NULL; 1100 cp->prev_second_allocno_copy = NULL; 1101 cp->next_first_allocno_copy = ALLOCNO_COPIES (first); 1102 if (cp->next_first_allocno_copy != NULL) 1103 { 1104 if (cp->next_first_allocno_copy->first == first) 1105 cp->next_first_allocno_copy->prev_first_allocno_copy = cp; 1106 else 1107 cp->next_first_allocno_copy->prev_second_allocno_copy = cp; 1108 } 1109 cp->next_second_allocno_copy = ALLOCNO_COPIES (second); 1110 if (cp->next_second_allocno_copy != NULL) 1111 { 1112 if (cp->next_second_allocno_copy->second == second) 1113 cp->next_second_allocno_copy->prev_second_allocno_copy = cp; 1114 else 1115 cp->next_second_allocno_copy->prev_first_allocno_copy = cp; 1116 } 1117 ALLOCNO_COPIES (first) = cp; 1118 ALLOCNO_COPIES (second) = cp; 1119} 1120 1121/* Detach a copy CP from allocnos involved into the copy. */ 1122void 1123ira_remove_allocno_copy_from_list (ira_copy_t cp) 1124{ 1125 ira_allocno_t first = cp->first, second = cp->second; 1126 ira_copy_t prev, next; 1127 1128 next = cp->next_first_allocno_copy; 1129 prev = cp->prev_first_allocno_copy; 1130 if (prev == NULL) 1131 ALLOCNO_COPIES (first) = next; 1132 else if (prev->first == first) 1133 prev->next_first_allocno_copy = next; 1134 else 1135 prev->next_second_allocno_copy = next; 1136 if (next != NULL) 1137 { 1138 if (next->first == first) 1139 next->prev_first_allocno_copy = prev; 1140 else 1141 next->prev_second_allocno_copy = prev; 1142 } 1143 cp->prev_first_allocno_copy = cp->next_first_allocno_copy = NULL; 1144 1145 next = cp->next_second_allocno_copy; 1146 prev = cp->prev_second_allocno_copy; 1147 if (prev == NULL) 1148 ALLOCNO_COPIES (second) = next; 1149 else if (prev->second == second) 1150 prev->next_second_allocno_copy = next; 1151 else 1152 prev->next_first_allocno_copy = next; 1153 if (next != NULL) 1154 { 1155 if (next->second == second) 1156 next->prev_second_allocno_copy = prev; 1157 else 1158 next->prev_first_allocno_copy = prev; 1159 } 1160 cp->prev_second_allocno_copy = cp->next_second_allocno_copy = NULL; 1161} 1162 1163/* Make a copy CP a canonical copy where number of the 1164 first allocno is less than the second one. */ 1165void 1166ira_swap_allocno_copy_ends_if_necessary (ira_copy_t cp) 1167{ 1168 ira_allocno_t temp; 1169 ira_copy_t temp_cp; 1170 1171 if (ALLOCNO_NUM (cp->first) <= ALLOCNO_NUM (cp->second)) 1172 return; 1173 1174 temp = cp->first; 1175 cp->first = cp->second; 1176 cp->second = temp; 1177 1178 temp_cp = cp->prev_first_allocno_copy; 1179 cp->prev_first_allocno_copy = cp->prev_second_allocno_copy; 1180 cp->prev_second_allocno_copy = temp_cp; 1181 1182 temp_cp = cp->next_first_allocno_copy; 1183 cp->next_first_allocno_copy = cp->next_second_allocno_copy; 1184 cp->next_second_allocno_copy = temp_cp; 1185} 1186 1187/* Create (or update frequency if the copy already exists) and return 1188 the copy of allocnos FIRST and SECOND with frequency FREQ 1189 corresponding to move insn INSN (if any) and originated from 1190 LOOP_TREE_NODE. */ 1191ira_copy_t 1192ira_add_allocno_copy (ira_allocno_t first, ira_allocno_t second, int freq, 1193 bool constraint_p, rtx insn, 1194 ira_loop_tree_node_t loop_tree_node) 1195{ 1196 ira_copy_t cp; 1197 1198 if ((cp = find_allocno_copy (first, second, insn, loop_tree_node)) != NULL) 1199 { 1200 cp->freq += freq; 1201 return cp; 1202 } 1203 cp = ira_create_copy (first, second, freq, constraint_p, insn, 1204 loop_tree_node); 1205 ira_assert (first != NULL && second != NULL); 1206 ira_add_allocno_copy_to_list (cp); 1207 ira_swap_allocno_copy_ends_if_necessary (cp); 1208 return cp; 1209} 1210 1211/* Print info about copy CP into file F. */ 1212static void 1213print_copy (FILE *f, ira_copy_t cp) 1214{ 1215 fprintf (f, " cp%d:a%d(r%d)<->a%d(r%d)@%d:%s\n", cp->num, 1216 ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first), 1217 ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second), cp->freq, 1218 cp->insn != NULL 1219 ? "move" : cp->constraint_p ? "constraint" : "shuffle"); 1220} 1221 1222/* Print info about copy CP into stderr. */ 1223void 1224ira_debug_copy (ira_copy_t cp) 1225{ 1226 print_copy (stderr, cp); 1227} 1228 1229/* Print info about all copies into file F. */ 1230static void 1231print_copies (FILE *f) 1232{ 1233 ira_copy_t cp; 1234 ira_copy_iterator ci; 1235 1236 FOR_EACH_COPY (cp, ci) 1237 print_copy (f, cp); 1238} 1239 1240/* Print info about all copies into stderr. */ 1241void 1242ira_debug_copies (void) 1243{ 1244 print_copies (stderr); 1245} 1246 1247/* Print info about copies involving allocno A into file F. */ 1248static void 1249print_allocno_copies (FILE *f, ira_allocno_t a) 1250{ 1251 ira_allocno_t another_a; 1252 ira_copy_t cp, next_cp; 1253 1254 fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a)); 1255 for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp) 1256 { 1257 if (cp->first == a) 1258 { 1259 next_cp = cp->next_first_allocno_copy; 1260 another_a = cp->second; 1261 } 1262 else if (cp->second == a) 1263 { 1264 next_cp = cp->next_second_allocno_copy; 1265 another_a = cp->first; 1266 } 1267 else 1268 gcc_unreachable (); 1269 fprintf (f, " cp%d:a%d(r%d)@%d", cp->num, 1270 ALLOCNO_NUM (another_a), ALLOCNO_REGNO (another_a), cp->freq); 1271 } 1272 fprintf (f, "\n"); 1273} 1274 1275/* Print info about copies involving allocno A into stderr. */ 1276void 1277ira_debug_allocno_copies (ira_allocno_t a) 1278{ 1279 print_allocno_copies (stderr, a); 1280} 1281 1282/* The function frees memory allocated for copy CP. */ 1283static void 1284finish_copy (ira_copy_t cp) 1285{ 1286 pool_free (copy_pool, cp); 1287} 1288 1289 1290/* Free memory allocated for all copies. */ 1291static void 1292finish_copies (void) 1293{ 1294 ira_copy_t cp; 1295 ira_copy_iterator ci; 1296 1297 FOR_EACH_COPY (cp, ci) 1298 finish_copy (cp); 1299 VEC_free (ira_copy_t, heap, copy_vec); 1300 free_alloc_pool (copy_pool); 1301} 1302 1303 1304 1305/* Pools for cost vectors. It is defined only for cover classes. */ 1306static alloc_pool cost_vector_pool[N_REG_CLASSES]; 1307 1308/* The function initiates work with hard register cost vectors. It 1309 creates allocation pool for each cover class. */ 1310static void 1311initiate_cost_vectors (void) 1312{ 1313 int i; 1314 enum reg_class cover_class; 1315 1316 for (i = 0; i < ira_reg_class_cover_size; i++) 1317 { 1318 cover_class = ira_reg_class_cover[i]; 1319 cost_vector_pool[cover_class] 1320 = create_alloc_pool ("cost vectors", 1321 sizeof (int) 1322 * ira_class_hard_regs_num[cover_class], 1323 100); 1324 } 1325} 1326 1327/* Allocate and return a cost vector VEC for COVER_CLASS. */ 1328int * 1329ira_allocate_cost_vector (enum reg_class cover_class) 1330{ 1331 return (int *) pool_alloc (cost_vector_pool[cover_class]); 1332} 1333 1334/* Free a cost vector VEC for COVER_CLASS. */ 1335void 1336ira_free_cost_vector (int *vec, enum reg_class cover_class) 1337{ 1338 ira_assert (vec != NULL); 1339 pool_free (cost_vector_pool[cover_class], vec); 1340} 1341 1342/* Finish work with hard register cost vectors. Release allocation 1343 pool for each cover class. */ 1344static void 1345finish_cost_vectors (void) 1346{ 1347 int i; 1348 enum reg_class cover_class; 1349 1350 for (i = 0; i < ira_reg_class_cover_size; i++) 1351 { 1352 cover_class = ira_reg_class_cover[i]; 1353 free_alloc_pool (cost_vector_pool[cover_class]); 1354 } 1355} 1356 1357 1358 1359/* The current loop tree node and its regno allocno map. */ 1360ira_loop_tree_node_t ira_curr_loop_tree_node; 1361ira_allocno_t *ira_curr_regno_allocno_map; 1362 1363/* This recursive function traverses loop tree with root LOOP_NODE 1364 calling non-null functions PREORDER_FUNC and POSTORDER_FUNC 1365 correspondingly in preorder and postorder. The function sets up 1366 IRA_CURR_LOOP_TREE_NODE and IRA_CURR_REGNO_ALLOCNO_MAP. If BB_P, 1367 basic block nodes of LOOP_NODE is also processed (before its 1368 subloop nodes). */ 1369void 1370ira_traverse_loop_tree (bool bb_p, ira_loop_tree_node_t loop_node, 1371 void (*preorder_func) (ira_loop_tree_node_t), 1372 void (*postorder_func) (ira_loop_tree_node_t)) 1373{ 1374 ira_loop_tree_node_t subloop_node; 1375 1376 ira_assert (loop_node->bb == NULL); 1377 ira_curr_loop_tree_node = loop_node; 1378 ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map; 1379 1380 if (preorder_func != NULL) 1381 (*preorder_func) (loop_node); 1382 1383 if (bb_p) 1384 for (subloop_node = loop_node->children; 1385 subloop_node != NULL; 1386 subloop_node = subloop_node->next) 1387 if (subloop_node->bb != NULL) 1388 { 1389 if (preorder_func != NULL) 1390 (*preorder_func) (subloop_node); 1391 1392 if (postorder_func != NULL) 1393 (*postorder_func) (subloop_node); 1394 } 1395 1396 for (subloop_node = loop_node->subloops; 1397 subloop_node != NULL; 1398 subloop_node = subloop_node->subloop_next) 1399 { 1400 ira_assert (subloop_node->bb == NULL); 1401 ira_traverse_loop_tree (bb_p, subloop_node, 1402 preorder_func, postorder_func); 1403 } 1404 1405 ira_curr_loop_tree_node = loop_node; 1406 ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map; 1407 1408 if (postorder_func != NULL) 1409 (*postorder_func) (loop_node); 1410} 1411 1412 1413 1414/* The basic block currently being processed. */ 1415static basic_block curr_bb; 1416 1417/* This recursive function creates allocnos corresponding to 1418 pseudo-registers containing in X. True OUTPUT_P means that X is 1419 a lvalue. */ 1420static void 1421create_insn_allocnos (rtx x, bool output_p) 1422{ 1423 int i, j; 1424 const char *fmt; 1425 enum rtx_code code = GET_CODE (x); 1426 1427 if (code == REG) 1428 { 1429 int regno; 1430 1431 if ((regno = REGNO (x)) >= FIRST_PSEUDO_REGISTER) 1432 { 1433 ira_allocno_t a; 1434 1435 if ((a = ira_curr_regno_allocno_map[regno]) == NULL) 1436 a = ira_create_allocno (regno, false, ira_curr_loop_tree_node); 1437 1438 ALLOCNO_NREFS (a)++; 1439 ALLOCNO_FREQ (a) += REG_FREQ_FROM_BB (curr_bb); 1440 if (output_p) 1441 bitmap_set_bit (ira_curr_loop_tree_node->modified_regnos, regno); 1442 } 1443 return; 1444 } 1445 else if (code == SET) 1446 { 1447 create_insn_allocnos (SET_DEST (x), true); 1448 create_insn_allocnos (SET_SRC (x), false); 1449 return; 1450 } 1451 else if (code == CLOBBER) 1452 { 1453 create_insn_allocnos (XEXP (x, 0), true); 1454 return; 1455 } 1456 else if (code == MEM) 1457 { 1458 create_insn_allocnos (XEXP (x, 0), false); 1459 return; 1460 } 1461 else if (code == PRE_DEC || code == POST_DEC || code == PRE_INC || 1462 code == POST_INC || code == POST_MODIFY || code == PRE_MODIFY) 1463 { 1464 create_insn_allocnos (XEXP (x, 0), true); 1465 create_insn_allocnos (XEXP (x, 0), false); 1466 return; 1467 } 1468 1469 fmt = GET_RTX_FORMAT (code); 1470 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 1471 { 1472 if (fmt[i] == 'e') 1473 create_insn_allocnos (XEXP (x, i), output_p); 1474 else if (fmt[i] == 'E') 1475 for (j = 0; j < XVECLEN (x, i); j++) 1476 create_insn_allocnos (XVECEXP (x, i, j), output_p); 1477 } 1478} 1479 1480/* Create allocnos corresponding to pseudo-registers living in the 1481 basic block represented by the corresponding loop tree node 1482 BB_NODE. */ 1483static void 1484create_bb_allocnos (ira_loop_tree_node_t bb_node) 1485{ 1486 basic_block bb; 1487 rtx insn; 1488 unsigned int i; 1489 bitmap_iterator bi; 1490 1491 curr_bb = bb = bb_node->bb; 1492 ira_assert (bb != NULL); 1493 FOR_BB_INSNS_REVERSE (bb, insn) 1494 if (NONDEBUG_INSN_P (insn)) 1495 create_insn_allocnos (PATTERN (insn), false); 1496 /* It might be a allocno living through from one subloop to 1497 another. */ 1498 EXECUTE_IF_SET_IN_REG_SET (DF_LR_IN (bb), FIRST_PSEUDO_REGISTER, i, bi) 1499 if (ira_curr_regno_allocno_map[i] == NULL) 1500 ira_create_allocno (i, false, ira_curr_loop_tree_node); 1501} 1502 1503/* Create allocnos corresponding to pseudo-registers living on edge E 1504 (a loop entry or exit). Also mark the allocnos as living on the 1505 loop border. */ 1506static void 1507create_loop_allocnos (edge e) 1508{ 1509 unsigned int i; 1510 bitmap live_in_regs, border_allocnos; 1511 bitmap_iterator bi; 1512 ira_loop_tree_node_t parent; 1513 1514 live_in_regs = DF_LR_IN (e->dest); 1515 border_allocnos = ira_curr_loop_tree_node->border_allocnos; 1516 EXECUTE_IF_SET_IN_REG_SET (DF_LR_OUT (e->src), 1517 FIRST_PSEUDO_REGISTER, i, bi) 1518 if (bitmap_bit_p (live_in_regs, i)) 1519 { 1520 if (ira_curr_regno_allocno_map[i] == NULL) 1521 { 1522 /* The order of creations is important for right 1523 ira_regno_allocno_map. */ 1524 if ((parent = ira_curr_loop_tree_node->parent) != NULL 1525 && parent->regno_allocno_map[i] == NULL) 1526 ira_create_allocno (i, false, parent); 1527 ira_create_allocno (i, false, ira_curr_loop_tree_node); 1528 } 1529 bitmap_set_bit (border_allocnos, 1530 ALLOCNO_NUM (ira_curr_regno_allocno_map[i])); 1531 } 1532} 1533 1534/* Create allocnos corresponding to pseudo-registers living in loop 1535 represented by the corresponding loop tree node LOOP_NODE. This 1536 function is called by ira_traverse_loop_tree. */ 1537static void 1538create_loop_tree_node_allocnos (ira_loop_tree_node_t loop_node) 1539{ 1540 if (loop_node->bb != NULL) 1541 create_bb_allocnos (loop_node); 1542 else if (loop_node != ira_loop_tree_root) 1543 { 1544 int i; 1545 edge_iterator ei; 1546 edge e; 1547 VEC (edge, heap) *edges; 1548 1549 FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds) 1550 if (e->src != loop_node->loop->latch) 1551 create_loop_allocnos (e); 1552 1553 edges = get_loop_exit_edges (loop_node->loop); 1554 for (i = 0; VEC_iterate (edge, edges, i, e); i++) 1555 create_loop_allocnos (e); 1556 VEC_free (edge, heap, edges); 1557 } 1558} 1559 1560/* Propagate information about allocnos modified inside the loop given 1561 by its LOOP_TREE_NODE to its parent. */ 1562static void 1563propagate_modified_regnos (ira_loop_tree_node_t loop_tree_node) 1564{ 1565 if (loop_tree_node == ira_loop_tree_root) 1566 return; 1567 ira_assert (loop_tree_node->bb == NULL); 1568 bitmap_ior_into (loop_tree_node->parent->modified_regnos, 1569 loop_tree_node->modified_regnos); 1570} 1571 1572/* Propagate new info about allocno A (see comments about accumulated 1573 info in allocno definition) to the corresponding allocno on upper 1574 loop tree level. So allocnos on upper levels accumulate 1575 information about the corresponding allocnos in nested regions. 1576 The new info means allocno info finally calculated in this 1577 file. */ 1578static void 1579propagate_allocno_info (void) 1580{ 1581 int i; 1582 ira_allocno_t a, parent_a; 1583 ira_loop_tree_node_t parent; 1584 enum reg_class cover_class; 1585 1586 if (flag_ira_region != IRA_REGION_ALL 1587 && flag_ira_region != IRA_REGION_MIXED) 1588 return; 1589 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--) 1590 for (a = ira_regno_allocno_map[i]; 1591 a != NULL; 1592 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 1593 if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) != NULL 1594 && (parent_a = parent->regno_allocno_map[i]) != NULL 1595 /* There are no caps yet at this point. So use 1596 border_allocnos to find allocnos for the propagation. */ 1597 && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE (a)->border_allocnos, 1598 ALLOCNO_NUM (a))) 1599 { 1600 if (! ALLOCNO_BAD_SPILL_P (a)) 1601 ALLOCNO_BAD_SPILL_P (parent_a) = false; 1602 ALLOCNO_NREFS (parent_a) += ALLOCNO_NREFS (a); 1603 ALLOCNO_FREQ (parent_a) += ALLOCNO_FREQ (a); 1604 ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a); 1605#ifdef STACK_REGS 1606 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a)) 1607 ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a) = true; 1608#endif 1609 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (parent_a), 1610 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a)); 1611 ALLOCNO_CALLS_CROSSED_NUM (parent_a) 1612 += ALLOCNO_CALLS_CROSSED_NUM (a); 1613 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a) 1614 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a); 1615 cover_class = ALLOCNO_COVER_CLASS (a); 1616 ira_assert (cover_class == ALLOCNO_COVER_CLASS (parent_a)); 1617 ira_allocate_and_accumulate_costs 1618 (&ALLOCNO_HARD_REG_COSTS (parent_a), cover_class, 1619 ALLOCNO_HARD_REG_COSTS (a)); 1620 ira_allocate_and_accumulate_costs 1621 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a), 1622 cover_class, 1623 ALLOCNO_CONFLICT_HARD_REG_COSTS (a)); 1624 ALLOCNO_COVER_CLASS_COST (parent_a) 1625 += ALLOCNO_COVER_CLASS_COST (a); 1626 ALLOCNO_MEMORY_COST (parent_a) += ALLOCNO_MEMORY_COST (a); 1627 } 1628} 1629 1630/* Create allocnos corresponding to pseudo-registers in the current 1631 function. Traverse the loop tree for this. */ 1632static void 1633create_allocnos (void) 1634{ 1635 /* We need to process BB first to correctly link allocnos by member 1636 next_regno_allocno. */ 1637 ira_traverse_loop_tree (true, ira_loop_tree_root, 1638 create_loop_tree_node_allocnos, NULL); 1639 if (optimize) 1640 ira_traverse_loop_tree (false, ira_loop_tree_root, NULL, 1641 propagate_modified_regnos); 1642} 1643 1644 1645 1646/* The page contains function to remove some regions from a separate 1647 register allocation. We remove regions whose separate allocation 1648 will hardly improve the result. As a result we speed up regional 1649 register allocation. */ 1650 1651/* The function changes allocno in range list given by R onto A. */ 1652static void 1653change_allocno_in_range_list (allocno_live_range_t r, ira_allocno_t a) 1654{ 1655 for (; r != NULL; r = r->next) 1656 r->allocno = a; 1657} 1658 1659/* Return TRUE if NODE represents a loop with low register 1660 pressure. */ 1661static bool 1662low_pressure_loop_node_p (ira_loop_tree_node_t node) 1663{ 1664 int i; 1665 enum reg_class cover_class; 1666 1667 if (node->bb != NULL) 1668 return false; 1669 1670 for (i = 0; i < ira_reg_class_cover_size; i++) 1671 { 1672 cover_class = ira_reg_class_cover[i]; 1673 if (node->reg_pressure[cover_class] 1674 > ira_available_class_regs[cover_class]) 1675 return false; 1676 } 1677 return true; 1678} 1679 1680/* Sort loops for marking them for removal. We put already marked 1681 loops first, then less frequent loops next, and then outer loops 1682 next. */ 1683static int 1684loop_compare_func (const void *v1p, const void *v2p) 1685{ 1686 int diff; 1687 ira_loop_tree_node_t l1 = *(const ira_loop_tree_node_t *) v1p; 1688 ira_loop_tree_node_t l2 = *(const ira_loop_tree_node_t *) v2p; 1689 1690 ira_assert (l1->parent != NULL && l2->parent != NULL); 1691 if (l1->to_remove_p && ! l2->to_remove_p) 1692 return -1; 1693 if (! l1->to_remove_p && l2->to_remove_p) 1694 return 1; 1695 if ((diff = l1->loop->header->frequency - l2->loop->header->frequency) != 0) 1696 return diff; 1697 if ((diff = (int) loop_depth (l1->loop) - (int) loop_depth (l2->loop)) != 0) 1698 return diff; 1699 /* Make sorting stable. */ 1700 return l1->loop->num - l2->loop->num; 1701} 1702 1703 1704/* Mark loops which should be removed from regional allocation. We 1705 remove a loop with low register pressure inside another loop with 1706 register pressure. In this case a separate allocation of the loop 1707 hardly helps (for irregular register file architecture it could 1708 help by choosing a better hard register in the loop but we prefer 1709 faster allocation even in this case). We also remove cheap loops 1710 if there are more than IRA_MAX_LOOPS_NUM of them. */ 1711static void 1712mark_loops_for_removal (void) 1713{ 1714 int i, n; 1715 ira_loop_tree_node_t *sorted_loops; 1716 loop_p loop; 1717 1718 sorted_loops 1719 = (ira_loop_tree_node_t *) ira_allocate (sizeof (ira_loop_tree_node_t) 1720 * VEC_length (loop_p, 1721 ira_loops.larray)); 1722 for (n = i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++) 1723 if (ira_loop_nodes[i].regno_allocno_map != NULL) 1724 { 1725 if (ira_loop_nodes[i].parent == NULL) 1726 { 1727 /* Don't remove the root. */ 1728 ira_loop_nodes[i].to_remove_p = false; 1729 continue; 1730 } 1731 sorted_loops[n++] = &ira_loop_nodes[i]; 1732 ira_loop_nodes[i].to_remove_p 1733 = (low_pressure_loop_node_p (ira_loop_nodes[i].parent) 1734 && low_pressure_loop_node_p (&ira_loop_nodes[i])); 1735 } 1736 qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func); 1737 for (i = 0; n - i + 1 > IRA_MAX_LOOPS_NUM; i++) 1738 { 1739 sorted_loops[i]->to_remove_p = true; 1740 if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL) 1741 fprintf 1742 (ira_dump_file, 1743 " Mark loop %d (header %d, freq %d, depth %d) for removal (%s)\n", 1744 sorted_loops[i]->loop->num, sorted_loops[i]->loop->header->index, 1745 sorted_loops[i]->loop->header->frequency, 1746 loop_depth (sorted_loops[i]->loop), 1747 low_pressure_loop_node_p (sorted_loops[i]->parent) 1748 && low_pressure_loop_node_p (sorted_loops[i]) 1749 ? "low pressure" : "cheap loop"); 1750 } 1751 ira_free (sorted_loops); 1752} 1753 1754/* Mark all loops but root for removing. */ 1755static void 1756mark_all_loops_for_removal (void) 1757{ 1758 int i; 1759 loop_p loop; 1760 1761 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++) 1762 if (ira_loop_nodes[i].regno_allocno_map != NULL) 1763 { 1764 if (ira_loop_nodes[i].parent == NULL) 1765 { 1766 /* Don't remove the root. */ 1767 ira_loop_nodes[i].to_remove_p = false; 1768 continue; 1769 } 1770 ira_loop_nodes[i].to_remove_p = true; 1771 if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL) 1772 fprintf 1773 (ira_dump_file, 1774 " Mark loop %d (header %d, freq %d, depth %d) for removal\n", 1775 ira_loop_nodes[i].loop->num, 1776 ira_loop_nodes[i].loop->header->index, 1777 ira_loop_nodes[i].loop->header->frequency, 1778 loop_depth (ira_loop_nodes[i].loop)); 1779 } 1780} 1781 1782/* Definition of vector of loop tree nodes. */ 1783DEF_VEC_P(ira_loop_tree_node_t); 1784DEF_VEC_ALLOC_P(ira_loop_tree_node_t, heap); 1785 1786/* Vec containing references to all removed loop tree nodes. */ 1787static VEC(ira_loop_tree_node_t,heap) *removed_loop_vec; 1788 1789/* Vec containing references to all children of loop tree nodes. */ 1790static VEC(ira_loop_tree_node_t,heap) *children_vec; 1791 1792/* Remove subregions of NODE if their separate allocation will not 1793 improve the result. */ 1794static void 1795remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_node_t node) 1796{ 1797 unsigned int start; 1798 bool remove_p; 1799 ira_loop_tree_node_t subnode; 1800 1801 remove_p = node->to_remove_p; 1802 if (! remove_p) 1803 VEC_safe_push (ira_loop_tree_node_t, heap, children_vec, node); 1804 start = VEC_length (ira_loop_tree_node_t, children_vec); 1805 for (subnode = node->children; subnode != NULL; subnode = subnode->next) 1806 if (subnode->bb == NULL) 1807 remove_uneccesary_loop_nodes_from_loop_tree (subnode); 1808 else 1809 VEC_safe_push (ira_loop_tree_node_t, heap, children_vec, subnode); 1810 node->children = node->subloops = NULL; 1811 if (remove_p) 1812 { 1813 VEC_safe_push (ira_loop_tree_node_t, heap, removed_loop_vec, node); 1814 return; 1815 } 1816 while (VEC_length (ira_loop_tree_node_t, children_vec) > start) 1817 { 1818 subnode = VEC_pop (ira_loop_tree_node_t, children_vec); 1819 subnode->parent = node; 1820 subnode->next = node->children; 1821 node->children = subnode; 1822 if (subnode->bb == NULL) 1823 { 1824 subnode->subloop_next = node->subloops; 1825 node->subloops = subnode; 1826 } 1827 } 1828} 1829 1830/* Return TRUE if NODE is inside PARENT. */ 1831static bool 1832loop_is_inside_p (ira_loop_tree_node_t node, ira_loop_tree_node_t parent) 1833{ 1834 for (node = node->parent; node != NULL; node = node->parent) 1835 if (node == parent) 1836 return true; 1837 return false; 1838} 1839 1840/* Sort allocnos according to their order in regno allocno list. */ 1841static int 1842regno_allocno_order_compare_func (const void *v1p, const void *v2p) 1843{ 1844 ira_allocno_t a1 = *(const ira_allocno_t *) v1p; 1845 ira_allocno_t a2 = *(const ira_allocno_t *) v2p; 1846 ira_loop_tree_node_t n1 = ALLOCNO_LOOP_TREE_NODE (a1); 1847 ira_loop_tree_node_t n2 = ALLOCNO_LOOP_TREE_NODE (a2); 1848 1849 if (loop_is_inside_p (n1, n2)) 1850 return -1; 1851 else if (loop_is_inside_p (n2, n1)) 1852 return 1; 1853 /* If allocnos are equally good, sort by allocno numbers, so that 1854 the results of qsort leave nothing to chance. We put allocnos 1855 with higher number first in the list because it is the original 1856 order for allocnos from loops on the same levels. */ 1857 return ALLOCNO_NUM (a2) - ALLOCNO_NUM (a1); 1858} 1859 1860/* This array is used to sort allocnos to restore allocno order in 1861 the regno allocno list. */ 1862static ira_allocno_t *regno_allocnos; 1863 1864/* Restore allocno order for REGNO in the regno allocno list. */ 1865static void 1866ira_rebuild_regno_allocno_list (int regno) 1867{ 1868 int i, n; 1869 ira_allocno_t a; 1870 1871 for (n = 0, a = ira_regno_allocno_map[regno]; 1872 a != NULL; 1873 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 1874 regno_allocnos[n++] = a; 1875 ira_assert (n > 0); 1876 qsort (regno_allocnos, n, sizeof (ira_allocno_t), 1877 regno_allocno_order_compare_func); 1878 for (i = 1; i < n; i++) 1879 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[i - 1]) = regno_allocnos[i]; 1880 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[n - 1]) = NULL; 1881 ira_regno_allocno_map[regno] = regno_allocnos[0]; 1882 if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL) 1883 fprintf (ira_dump_file, " Rebuilding regno allocno list for %d\n", regno); 1884} 1885 1886/* Propagate info from allocno FROM_A to allocno A. */ 1887static void 1888propagate_some_info_from_allocno (ira_allocno_t a, ira_allocno_t from_a) 1889{ 1890 enum reg_class cover_class; 1891 1892 IOR_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (a), 1893 ALLOCNO_CONFLICT_HARD_REGS (from_a)); 1894#ifdef STACK_REGS 1895 if (ALLOCNO_NO_STACK_REG_P (from_a)) 1896 ALLOCNO_NO_STACK_REG_P (a) = true; 1897#endif 1898 ALLOCNO_NREFS (a) += ALLOCNO_NREFS (from_a); 1899 ALLOCNO_FREQ (a) += ALLOCNO_FREQ (from_a); 1900 ALLOCNO_CALL_FREQ (a) += ALLOCNO_CALL_FREQ (from_a); 1901 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), 1902 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (from_a)); 1903 ALLOCNO_CALLS_CROSSED_NUM (a) += ALLOCNO_CALLS_CROSSED_NUM (from_a); 1904 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) 1905 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (from_a); 1906 if (! ALLOCNO_BAD_SPILL_P (from_a)) 1907 ALLOCNO_BAD_SPILL_P (a) = false; 1908#ifdef STACK_REGS 1909 if (ALLOCNO_TOTAL_NO_STACK_REG_P (from_a)) 1910 ALLOCNO_TOTAL_NO_STACK_REG_P (a) = true; 1911#endif 1912 cover_class = ALLOCNO_COVER_CLASS (from_a); 1913 ira_assert (cover_class == ALLOCNO_COVER_CLASS (a)); 1914 ira_allocate_and_accumulate_costs (&ALLOCNO_HARD_REG_COSTS (a), cover_class, 1915 ALLOCNO_HARD_REG_COSTS (from_a)); 1916 ira_allocate_and_accumulate_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a), 1917 cover_class, 1918 ALLOCNO_CONFLICT_HARD_REG_COSTS (from_a)); 1919 ALLOCNO_COVER_CLASS_COST (a) += ALLOCNO_COVER_CLASS_COST (from_a); 1920 ALLOCNO_MEMORY_COST (a) += ALLOCNO_MEMORY_COST (from_a); 1921} 1922 1923/* Remove allocnos from loops removed from the allocation 1924 consideration. */ 1925static void 1926remove_unnecessary_allocnos (void) 1927{ 1928 int regno; 1929 bool merged_p, rebuild_p; 1930 ira_allocno_t a, prev_a, next_a, parent_a; 1931 ira_loop_tree_node_t a_node, parent; 1932 allocno_live_range_t r; 1933 1934 merged_p = false; 1935 regno_allocnos = NULL; 1936 for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--) 1937 { 1938 rebuild_p = false; 1939 for (prev_a = NULL, a = ira_regno_allocno_map[regno]; 1940 a != NULL; 1941 a = next_a) 1942 { 1943 next_a = ALLOCNO_NEXT_REGNO_ALLOCNO (a); 1944 a_node = ALLOCNO_LOOP_TREE_NODE (a); 1945 if (! a_node->to_remove_p) 1946 prev_a = a; 1947 else 1948 { 1949 for (parent = a_node->parent; 1950 (parent_a = parent->regno_allocno_map[regno]) == NULL 1951 && parent->to_remove_p; 1952 parent = parent->parent) 1953 ; 1954 if (parent_a == NULL) 1955 { 1956 /* There are no allocnos with the same regno in 1957 upper region -- just move the allocno to the 1958 upper region. */ 1959 prev_a = a; 1960 ALLOCNO_LOOP_TREE_NODE (a) = parent; 1961 parent->regno_allocno_map[regno] = a; 1962 bitmap_set_bit (parent->all_allocnos, ALLOCNO_NUM (a)); 1963 rebuild_p = true; 1964 } 1965 else 1966 { 1967 /* Remove the allocno and update info of allocno in 1968 the upper region. */ 1969 if (prev_a == NULL) 1970 ira_regno_allocno_map[regno] = next_a; 1971 else 1972 ALLOCNO_NEXT_REGNO_ALLOCNO (prev_a) = next_a; 1973 r = ALLOCNO_LIVE_RANGES (a); 1974 change_allocno_in_range_list (r, parent_a); 1975 ALLOCNO_LIVE_RANGES (parent_a) 1976 = ira_merge_allocno_live_ranges 1977 (r, ALLOCNO_LIVE_RANGES (parent_a)); 1978 merged_p = true; 1979 ALLOCNO_LIVE_RANGES (a) = NULL; 1980 propagate_some_info_from_allocno (parent_a, a); 1981 /* Remove it from the corresponding regno allocno 1982 map to avoid info propagation of subsequent 1983 allocno into this already removed allocno. */ 1984 a_node->regno_allocno_map[regno] = NULL; 1985 finish_allocno (a); 1986 } 1987 } 1988 } 1989 if (rebuild_p) 1990 /* We need to restore the order in regno allocno list. */ 1991 { 1992 if (regno_allocnos == NULL) 1993 regno_allocnos 1994 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) 1995 * ira_allocnos_num); 1996 ira_rebuild_regno_allocno_list (regno); 1997 } 1998 } 1999 if (merged_p) 2000 ira_rebuild_start_finish_chains (); 2001 if (regno_allocnos != NULL) 2002 ira_free (regno_allocnos); 2003} 2004 2005/* Remove allocnos from all loops but the root. */ 2006static void 2007remove_low_level_allocnos (void) 2008{ 2009 int regno; 2010 bool merged_p, propagate_p; 2011 ira_allocno_t a, top_a; 2012 ira_loop_tree_node_t a_node, parent; 2013 allocno_live_range_t r; 2014 ira_allocno_iterator ai; 2015 2016 merged_p = false; 2017 FOR_EACH_ALLOCNO (a, ai) 2018 { 2019 a_node = ALLOCNO_LOOP_TREE_NODE (a); 2020 if (a_node == ira_loop_tree_root || ALLOCNO_CAP_MEMBER (a) != NULL) 2021 continue; 2022 regno = ALLOCNO_REGNO (a); 2023 if ((top_a = ira_loop_tree_root->regno_allocno_map[regno]) == NULL) 2024 { 2025 ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root; 2026 ira_loop_tree_root->regno_allocno_map[regno] = a; 2027 continue; 2028 } 2029 propagate_p = a_node->parent->regno_allocno_map[regno] == NULL; 2030 /* Remove the allocno and update info of allocno in the upper 2031 region. */ 2032 r = ALLOCNO_LIVE_RANGES (a); 2033 change_allocno_in_range_list (r, top_a); 2034 ALLOCNO_LIVE_RANGES (top_a) 2035 = ira_merge_allocno_live_ranges (r, ALLOCNO_LIVE_RANGES (top_a)); 2036 merged_p = true; 2037 ALLOCNO_LIVE_RANGES (a) = NULL; 2038 if (propagate_p) 2039 propagate_some_info_from_allocno (top_a, a); 2040 } 2041 FOR_EACH_ALLOCNO (a, ai) 2042 { 2043 a_node = ALLOCNO_LOOP_TREE_NODE (a); 2044 if (a_node == ira_loop_tree_root) 2045 continue; 2046 parent = a_node->parent; 2047 regno = ALLOCNO_REGNO (a); 2048 if (ALLOCNO_CAP_MEMBER (a) != NULL) 2049 ira_assert (ALLOCNO_CAP (a) != NULL); 2050 else if (ALLOCNO_CAP (a) == NULL) 2051 ira_assert (parent->regno_allocno_map[regno] != NULL); 2052 } 2053 FOR_EACH_ALLOCNO (a, ai) 2054 { 2055 regno = ALLOCNO_REGNO (a); 2056 if (ira_loop_tree_root->regno_allocno_map[regno] == a) 2057 { 2058 ira_regno_allocno_map[regno] = a; 2059 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = NULL; 2060 ALLOCNO_CAP_MEMBER (a) = NULL; 2061 COPY_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (a), 2062 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a)); 2063#ifdef STACK_REGS 2064 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a)) 2065 ALLOCNO_NO_STACK_REG_P (a) = true; 2066#endif 2067 } 2068 else 2069 finish_allocno (a); 2070 } 2071 if (merged_p) 2072 ira_rebuild_start_finish_chains (); 2073} 2074 2075/* Remove loops from consideration. We remove all loops except for 2076 root if ALL_P or loops for which a separate allocation will not 2077 improve the result. We have to do this after allocno creation and 2078 their costs and cover class evaluation because only after that the 2079 register pressure can be known and is calculated. */ 2080static void 2081remove_unnecessary_regions (bool all_p) 2082{ 2083 if (all_p) 2084 mark_all_loops_for_removal (); 2085 else 2086 mark_loops_for_removal (); 2087 children_vec 2088 = VEC_alloc (ira_loop_tree_node_t, heap, 2089 last_basic_block + VEC_length (loop_p, ira_loops.larray)); 2090 removed_loop_vec 2091 = VEC_alloc (ira_loop_tree_node_t, heap, 2092 last_basic_block + VEC_length (loop_p, ira_loops.larray)); 2093 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root) ; 2094 VEC_free (ira_loop_tree_node_t, heap, children_vec); 2095 if (all_p) 2096 remove_low_level_allocnos (); 2097 else 2098 remove_unnecessary_allocnos (); 2099 while (VEC_length (ira_loop_tree_node_t, removed_loop_vec) > 0) 2100 finish_loop_tree_node (VEC_pop (ira_loop_tree_node_t, removed_loop_vec)); 2101 VEC_free (ira_loop_tree_node_t, heap, removed_loop_vec); 2102} 2103 2104 2105 2106/* At this point true value of allocno attribute bad_spill_p means 2107 that there is an insn where allocno occurs and where the allocno 2108 can not be used as memory. The function updates the attribute, now 2109 it can be true only for allocnos which can not be used as memory in 2110 an insn and in whose live ranges there is other allocno deaths. 2111 Spilling allocnos with true value will not improve the code because 2112 it will not make other allocnos colorable and additional reloads 2113 for the corresponding pseudo will be generated in reload pass for 2114 each insn it occurs. 2115 2116 This is a trick mentioned in one classic article of Chaitin etc 2117 which is frequently omitted in other implementations of RA based on 2118 graph coloring. */ 2119static void 2120update_bad_spill_attribute (void) 2121{ 2122 int i; 2123 ira_allocno_t a; 2124 ira_allocno_iterator ai; 2125 allocno_live_range_t r; 2126 enum reg_class cover_class; 2127 bitmap_head dead_points[N_REG_CLASSES]; 2128 2129 for (i = 0; i < ira_reg_class_cover_size; i++) 2130 { 2131 cover_class = ira_reg_class_cover[i]; 2132 bitmap_initialize (&dead_points[cover_class], ®_obstack); 2133 } 2134 FOR_EACH_ALLOCNO (a, ai) 2135 { 2136 cover_class = ALLOCNO_COVER_CLASS (a); 2137 if (cover_class == NO_REGS) 2138 continue; 2139 for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next) 2140 bitmap_set_bit (&dead_points[cover_class], r->finish); 2141 } 2142 FOR_EACH_ALLOCNO (a, ai) 2143 { 2144 cover_class = ALLOCNO_COVER_CLASS (a); 2145 if (cover_class == NO_REGS) 2146 continue; 2147 if (! ALLOCNO_BAD_SPILL_P (a)) 2148 continue; 2149 for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next) 2150 { 2151 for (i = r->start + 1; i < r->finish; i++) 2152 if (bitmap_bit_p (&dead_points[cover_class], i)) 2153 break; 2154 if (i < r->finish) 2155 break; 2156 } 2157 if (r != NULL) 2158 ALLOCNO_BAD_SPILL_P (a) = false; 2159 } 2160 for (i = 0; i < ira_reg_class_cover_size; i++) 2161 { 2162 cover_class = ira_reg_class_cover[i]; 2163 bitmap_clear (&dead_points[cover_class]); 2164 } 2165} 2166 2167 2168 2169/* Set up minimal and maximal live range points for allocnos. */ 2170static void 2171setup_min_max_allocno_live_range_point (void) 2172{ 2173 int i; 2174 ira_allocno_t a, parent_a, cap; 2175 ira_allocno_iterator ai; 2176 allocno_live_range_t r; 2177 ira_loop_tree_node_t parent; 2178 2179 FOR_EACH_ALLOCNO (a, ai) 2180 { 2181 r = ALLOCNO_LIVE_RANGES (a); 2182 if (r == NULL) 2183 continue; 2184 ALLOCNO_MAX (a) = r->finish; 2185 for (; r->next != NULL; r = r->next) 2186 ; 2187 ALLOCNO_MIN (a) = r->start; 2188 } 2189 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--) 2190 for (a = ira_regno_allocno_map[i]; 2191 a != NULL; 2192 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 2193 { 2194 if (ALLOCNO_MAX (a) < 0) 2195 continue; 2196 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL); 2197 /* Accumulation of range info. */ 2198 if (ALLOCNO_CAP (a) != NULL) 2199 { 2200 for (cap = ALLOCNO_CAP (a); cap != NULL; cap = ALLOCNO_CAP (cap)) 2201 { 2202 if (ALLOCNO_MAX (cap) < ALLOCNO_MAX (a)) 2203 ALLOCNO_MAX (cap) = ALLOCNO_MAX (a); 2204 if (ALLOCNO_MIN (cap) > ALLOCNO_MIN (a)) 2205 ALLOCNO_MIN (cap) = ALLOCNO_MIN (a); 2206 } 2207 continue; 2208 } 2209 if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) == NULL) 2210 continue; 2211 parent_a = parent->regno_allocno_map[i]; 2212 if (ALLOCNO_MAX (parent_a) < ALLOCNO_MAX (a)) 2213 ALLOCNO_MAX (parent_a) = ALLOCNO_MAX (a); 2214 if (ALLOCNO_MIN (parent_a) > ALLOCNO_MIN (a)) 2215 ALLOCNO_MIN (parent_a) = ALLOCNO_MIN (a); 2216 } 2217#ifdef ENABLE_IRA_CHECKING 2218 FOR_EACH_ALLOCNO (a, ai) 2219 { 2220 if ((0 <= ALLOCNO_MIN (a) && ALLOCNO_MIN (a) <= ira_max_point) 2221 && (0 <= ALLOCNO_MAX (a) && ALLOCNO_MAX (a) <= ira_max_point)) 2222 continue; 2223 gcc_unreachable (); 2224 } 2225#endif 2226} 2227 2228/* Sort allocnos according to their live ranges. Allocnos with 2229 smaller cover class are put first unless we use priority coloring. 2230 Allocnos with the same cove class are ordered according their start 2231 (min). Allocnos with the same start are ordered according their 2232 finish (max). */ 2233static int 2234allocno_range_compare_func (const void *v1p, const void *v2p) 2235{ 2236 int diff; 2237 ira_allocno_t a1 = *(const ira_allocno_t *) v1p; 2238 ira_allocno_t a2 = *(const ira_allocno_t *) v2p; 2239 2240 if (flag_ira_algorithm != IRA_ALGORITHM_PRIORITY 2241 && (diff = ALLOCNO_COVER_CLASS (a1) - ALLOCNO_COVER_CLASS (a2)) != 0) 2242 return diff; 2243 if ((diff = ALLOCNO_MIN (a1) - ALLOCNO_MIN (a2)) != 0) 2244 return diff; 2245 if ((diff = ALLOCNO_MAX (a1) - ALLOCNO_MAX (a2)) != 0) 2246 return diff; 2247 return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2); 2248} 2249 2250/* Sort ira_conflict_id_allocno_map and set up conflict id of 2251 allocnos. */ 2252static void 2253sort_conflict_id_allocno_map (void) 2254{ 2255 int i, num; 2256 ira_allocno_t a; 2257 ira_allocno_iterator ai; 2258 2259 num = 0; 2260 FOR_EACH_ALLOCNO (a, ai) 2261 ira_conflict_id_allocno_map[num++] = a; 2262 qsort (ira_conflict_id_allocno_map, num, sizeof (ira_allocno_t), 2263 allocno_range_compare_func); 2264 for (i = 0; i < num; i++) 2265 if ((a = ira_conflict_id_allocno_map[i]) != NULL) 2266 ALLOCNO_CONFLICT_ID (a) = i; 2267 for (i = num; i < ira_allocnos_num; i++) 2268 ira_conflict_id_allocno_map[i] = NULL; 2269} 2270 2271/* Set up minimal and maximal conflict ids of allocnos with which 2272 given allocno can conflict. */ 2273static void 2274setup_min_max_conflict_allocno_ids (void) 2275{ 2276 int cover_class; 2277 int i, j, min, max, start, finish, first_not_finished, filled_area_start; 2278 int *live_range_min, *last_lived; 2279 ira_allocno_t a; 2280 2281 live_range_min = (int *) ira_allocate (sizeof (int) * ira_allocnos_num); 2282 cover_class = -1; 2283 first_not_finished = -1; 2284 for (i = 0; i < ira_allocnos_num; i++) 2285 { 2286 a = ira_conflict_id_allocno_map[i]; 2287 if (a == NULL) 2288 continue; 2289 if (cover_class < 0 2290 || (flag_ira_algorithm != IRA_ALGORITHM_PRIORITY 2291 && cover_class != (int) ALLOCNO_COVER_CLASS (a))) 2292 { 2293 cover_class = ALLOCNO_COVER_CLASS (a); 2294 min = i; 2295 first_not_finished = i; 2296 } 2297 else 2298 { 2299 start = ALLOCNO_MIN (a); 2300 /* If we skip an allocno, the allocno with smaller ids will 2301 be also skipped because of the secondary sorting the 2302 range finishes (see function 2303 allocno_range_compare_func). */ 2304 while (first_not_finished < i 2305 && start > ALLOCNO_MAX (ira_conflict_id_allocno_map 2306 [first_not_finished])) 2307 first_not_finished++; 2308 min = first_not_finished; 2309 } 2310 if (min == i) 2311 /* We could increase min further in this case but it is good 2312 enough. */ 2313 min++; 2314 live_range_min[i] = ALLOCNO_MIN (a); 2315 ALLOCNO_MIN (a) = min; 2316 } 2317 last_lived = (int *) ira_allocate (sizeof (int) * ira_max_point); 2318 cover_class = -1; 2319 filled_area_start = -1; 2320 for (i = ira_allocnos_num - 1; i >= 0; i--) 2321 { 2322 a = ira_conflict_id_allocno_map[i]; 2323 if (a == NULL) 2324 continue; 2325 if (cover_class < 0 2326 || (flag_ira_algorithm != IRA_ALGORITHM_PRIORITY 2327 && cover_class != (int) ALLOCNO_COVER_CLASS (a))) 2328 { 2329 cover_class = ALLOCNO_COVER_CLASS (a); 2330 for (j = 0; j < ira_max_point; j++) 2331 last_lived[j] = -1; 2332 filled_area_start = ira_max_point; 2333 } 2334 min = live_range_min[i]; 2335 finish = ALLOCNO_MAX (a); 2336 max = last_lived[finish]; 2337 if (max < 0) 2338 /* We could decrease max further in this case but it is good 2339 enough. */ 2340 max = ALLOCNO_CONFLICT_ID (a) - 1; 2341 ALLOCNO_MAX (a) = max; 2342 /* In filling, we can go further A range finish to recognize 2343 intersection quickly because if the finish of subsequently 2344 processed allocno (it has smaller conflict id) range is 2345 further A range finish than they are definitely intersected 2346 (the reason for this is the allocnos with bigger conflict id 2347 have their range starts not smaller than allocnos with 2348 smaller ids. */ 2349 for (j = min; j < filled_area_start; j++) 2350 last_lived[j] = i; 2351 filled_area_start = min; 2352 } 2353 ira_free (last_lived); 2354 ira_free (live_range_min); 2355} 2356 2357 2358 2359static void 2360create_caps (void) 2361{ 2362 ira_allocno_t a; 2363 ira_allocno_iterator ai; 2364 ira_loop_tree_node_t loop_tree_node; 2365 2366 FOR_EACH_ALLOCNO (a, ai) 2367 { 2368 if (ALLOCNO_LOOP_TREE_NODE (a) == ira_loop_tree_root) 2369 continue; 2370 if (ALLOCNO_CAP_MEMBER (a) != NULL) 2371 create_cap_allocno (a); 2372 else if (ALLOCNO_CAP (a) == NULL) 2373 { 2374 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a); 2375 if (!bitmap_bit_p (loop_tree_node->border_allocnos, ALLOCNO_NUM (a))) 2376 create_cap_allocno (a); 2377 } 2378 } 2379} 2380 2381 2382 2383/* The page contains code transforming more one region internal 2384 representation (IR) to one region IR which is necessary for reload. 2385 This transformation is called IR flattening. We might just rebuild 2386 the IR for one region but we don't do it because it takes a lot of 2387 time. */ 2388 2389/* Map: regno -> allocnos which will finally represent the regno for 2390 IR with one region. */ 2391static ira_allocno_t *regno_top_level_allocno_map; 2392 2393/* Process all allocnos originated from pseudo REGNO and copy live 2394 ranges, hard reg conflicts, and allocno stack reg attributes from 2395 low level allocnos to final allocnos which are destinations of 2396 removed stores at a loop exit. Return true if we copied live 2397 ranges. */ 2398static bool 2399copy_info_to_removed_store_destinations (int regno) 2400{ 2401 ira_allocno_t a; 2402 ira_allocno_t parent_a = NULL; 2403 ira_loop_tree_node_t parent; 2404 allocno_live_range_t r; 2405 bool merged_p; 2406 2407 merged_p = false; 2408 for (a = ira_regno_allocno_map[regno]; 2409 a != NULL; 2410 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 2411 { 2412 if (a != regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))]) 2413 /* This allocno will be removed. */ 2414 continue; 2415 /* Caps will be removed. */ 2416 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL); 2417 for (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent; 2418 parent != NULL; 2419 parent = parent->parent) 2420 if ((parent_a = parent->regno_allocno_map[regno]) == NULL 2421 || (parent_a == regno_top_level_allocno_map[REGNO (ALLOCNO_REG 2422 (parent_a))] 2423 && ALLOCNO_MEM_OPTIMIZED_DEST_P (parent_a))) 2424 break; 2425 if (parent == NULL || parent_a == NULL) 2426 continue; 2427 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 2428 { 2429 fprintf 2430 (ira_dump_file, 2431 " Coping ranges of a%dr%d to a%dr%d: ", 2432 ALLOCNO_NUM (a), REGNO (ALLOCNO_REG (a)), 2433 ALLOCNO_NUM (parent_a), REGNO (ALLOCNO_REG (parent_a))); 2434 ira_print_live_range_list (ira_dump_file, 2435 ALLOCNO_LIVE_RANGES (a)); 2436 } 2437 r = ira_copy_allocno_live_range_list (ALLOCNO_LIVE_RANGES (a)); 2438 change_allocno_in_range_list (r, parent_a); 2439 ALLOCNO_LIVE_RANGES (parent_a) 2440 = ira_merge_allocno_live_ranges (r, ALLOCNO_LIVE_RANGES (parent_a)); 2441 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (parent_a), 2442 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a)); 2443#ifdef STACK_REGS 2444 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a)) 2445 ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a) = true; 2446#endif 2447 ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a); 2448 ALLOCNO_CALLS_CROSSED_NUM (parent_a) 2449 += ALLOCNO_CALLS_CROSSED_NUM (a); 2450 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a) 2451 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a); 2452 merged_p = true; 2453 } 2454 return merged_p; 2455} 2456 2457/* Flatten the IR. In other words, this function transforms IR as if 2458 it were built with one region (without loops). We could make it 2459 much simpler by rebuilding IR with one region, but unfortunately it 2460 takes a lot of time. MAX_REGNO_BEFORE_EMIT and 2461 IRA_MAX_POINT_BEFORE_EMIT are correspondingly MAX_REG_NUM () and 2462 IRA_MAX_POINT before emitting insns on the loop borders. */ 2463void 2464ira_flattening (int max_regno_before_emit, int ira_max_point_before_emit) 2465{ 2466 int i, j, num; 2467 bool keep_p; 2468 int hard_regs_num; 2469 bool new_pseudos_p, merged_p, mem_dest_p; 2470 unsigned int n; 2471 enum reg_class cover_class; 2472 ira_allocno_t a, parent_a, first, second, node_first, node_second; 2473 ira_copy_t cp; 2474 ira_loop_tree_node_t parent, node; 2475 allocno_live_range_t r; 2476 ira_allocno_iterator ai; 2477 ira_copy_iterator ci; 2478 sparseset allocnos_live; 2479 2480 regno_top_level_allocno_map 2481 = (ira_allocno_t *) ira_allocate (max_reg_num () * sizeof (ira_allocno_t)); 2482 memset (regno_top_level_allocno_map, 0, 2483 max_reg_num () * sizeof (ira_allocno_t)); 2484 new_pseudos_p = merged_p = false; 2485 FOR_EACH_ALLOCNO (a, ai) 2486 { 2487 if (ALLOCNO_CAP_MEMBER (a) != NULL) 2488 /* Caps are not in the regno allocno maps and they are never 2489 will be transformed into allocnos existing after IR 2490 flattening. */ 2491 continue; 2492 COPY_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), 2493 ALLOCNO_CONFLICT_HARD_REGS (a)); 2494#ifdef STACK_REGS 2495 ALLOCNO_TOTAL_NO_STACK_REG_P (a) = ALLOCNO_NO_STACK_REG_P (a); 2496#endif 2497 } 2498 /* Fix final allocno attributes. */ 2499 for (i = max_regno_before_emit - 1; i >= FIRST_PSEUDO_REGISTER; i--) 2500 { 2501 mem_dest_p = false; 2502 for (a = ira_regno_allocno_map[i]; 2503 a != NULL; 2504 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a)) 2505 { 2506 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL); 2507 if (ALLOCNO_SOMEWHERE_RENAMED_P (a)) 2508 new_pseudos_p = true; 2509 if (ALLOCNO_CAP (a) != NULL 2510 || (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) == NULL 2511 || ((parent_a = parent->regno_allocno_map[ALLOCNO_REGNO (a)]) 2512 == NULL)) 2513 { 2514 ALLOCNO_COPIES (a) = NULL; 2515 regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))] = a; 2516 continue; 2517 } 2518 ira_assert (ALLOCNO_CAP_MEMBER (parent_a) == NULL); 2519 2520 if (ALLOCNO_MEM_OPTIMIZED_DEST (a) != NULL) 2521 mem_dest_p = true; 2522 if (REGNO (ALLOCNO_REG (a)) == REGNO (ALLOCNO_REG (parent_a))) 2523 { 2524 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (parent_a), 2525 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a)); 2526#ifdef STACK_REGS 2527 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a)) 2528 ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a) = true; 2529#endif 2530 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 2531 { 2532 fprintf (ira_dump_file, 2533 " Moving ranges of a%dr%d to a%dr%d: ", 2534 ALLOCNO_NUM (a), REGNO (ALLOCNO_REG (a)), 2535 ALLOCNO_NUM (parent_a), 2536 REGNO (ALLOCNO_REG (parent_a))); 2537 ira_print_live_range_list (ira_dump_file, 2538 ALLOCNO_LIVE_RANGES (a)); 2539 } 2540 change_allocno_in_range_list (ALLOCNO_LIVE_RANGES (a), parent_a); 2541 ALLOCNO_LIVE_RANGES (parent_a) 2542 = ira_merge_allocno_live_ranges 2543 (ALLOCNO_LIVE_RANGES (a), ALLOCNO_LIVE_RANGES (parent_a)); 2544 merged_p = true; 2545 ALLOCNO_LIVE_RANGES (a) = NULL; 2546 ALLOCNO_MEM_OPTIMIZED_DEST_P (parent_a) 2547 = (ALLOCNO_MEM_OPTIMIZED_DEST_P (parent_a) 2548 || ALLOCNO_MEM_OPTIMIZED_DEST_P (a)); 2549 continue; 2550 } 2551 new_pseudos_p = true; 2552 for (;;) 2553 { 2554 ALLOCNO_NREFS (parent_a) -= ALLOCNO_NREFS (a); 2555 ALLOCNO_FREQ (parent_a) -= ALLOCNO_FREQ (a); 2556 ALLOCNO_CALL_FREQ (parent_a) -= ALLOCNO_CALL_FREQ (a); 2557 ALLOCNO_CALLS_CROSSED_NUM (parent_a) 2558 -= ALLOCNO_CALLS_CROSSED_NUM (a); 2559 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a) 2560 -= ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a); 2561 ira_assert (ALLOCNO_CALLS_CROSSED_NUM (parent_a) >= 0 2562 && ALLOCNO_NREFS (parent_a) >= 0 2563 && ALLOCNO_FREQ (parent_a) >= 0); 2564 cover_class = ALLOCNO_COVER_CLASS (parent_a); 2565 hard_regs_num = ira_class_hard_regs_num[cover_class]; 2566 if (ALLOCNO_HARD_REG_COSTS (a) != NULL 2567 && ALLOCNO_HARD_REG_COSTS (parent_a) != NULL) 2568 for (j = 0; j < hard_regs_num; j++) 2569 ALLOCNO_HARD_REG_COSTS (parent_a)[j] 2570 -= ALLOCNO_HARD_REG_COSTS (a)[j]; 2571 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL 2572 && ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a) != NULL) 2573 for (j = 0; j < hard_regs_num; j++) 2574 ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a)[j] 2575 -= ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[j]; 2576 ALLOCNO_COVER_CLASS_COST (parent_a) 2577 -= ALLOCNO_COVER_CLASS_COST (a); 2578 ALLOCNO_MEMORY_COST (parent_a) -= ALLOCNO_MEMORY_COST (a); 2579 if (ALLOCNO_CAP (parent_a) != NULL 2580 || (parent 2581 = ALLOCNO_LOOP_TREE_NODE (parent_a)->parent) == NULL 2582 || (parent_a = (parent->regno_allocno_map 2583 [ALLOCNO_REGNO (parent_a)])) == NULL) 2584 break; 2585 } 2586 ALLOCNO_COPIES (a) = NULL; 2587 regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))] = a; 2588 } 2589 if (mem_dest_p && copy_info_to_removed_store_destinations (i)) 2590 merged_p = true; 2591 } 2592 ira_assert (new_pseudos_p || ira_max_point_before_emit == ira_max_point); 2593 if (merged_p || ira_max_point_before_emit != ira_max_point) 2594 ira_rebuild_start_finish_chains (); 2595 if (new_pseudos_p) 2596 { 2597 /* Rebuild conflicts. */ 2598 FOR_EACH_ALLOCNO (a, ai) 2599 { 2600 if (a != regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))] 2601 || ALLOCNO_CAP_MEMBER (a) != NULL) 2602 continue; 2603 for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next) 2604 ira_assert (r->allocno == a); 2605 clear_allocno_conflicts (a); 2606 } 2607 allocnos_live = sparseset_alloc (ira_allocnos_num); 2608 for (i = 0; i < ira_max_point; i++) 2609 { 2610 for (r = ira_start_point_ranges[i]; r != NULL; r = r->start_next) 2611 { 2612 a = r->allocno; 2613 if (a != regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))] 2614 || ALLOCNO_CAP_MEMBER (a) != NULL) 2615 continue; 2616 num = ALLOCNO_NUM (a); 2617 cover_class = ALLOCNO_COVER_CLASS (a); 2618 sparseset_set_bit (allocnos_live, num); 2619 EXECUTE_IF_SET_IN_SPARSESET (allocnos_live, n) 2620 { 2621 ira_allocno_t live_a = ira_allocnos[n]; 2622 2623 if (ira_reg_classes_intersect_p 2624 [cover_class][ALLOCNO_COVER_CLASS (live_a)] 2625 /* Don't set up conflict for the allocno with itself. */ 2626 && num != (int) n) 2627 ira_add_allocno_conflict (a, live_a); 2628 } 2629 } 2630 2631 for (r = ira_finish_point_ranges[i]; r != NULL; r = r->finish_next) 2632 sparseset_clear_bit (allocnos_live, ALLOCNO_NUM (r->allocno)); 2633 } 2634 sparseset_free (allocnos_live); 2635 compress_conflict_vecs (); 2636 } 2637 /* Mark some copies for removing and change allocnos in the rest 2638 copies. */ 2639 FOR_EACH_COPY (cp, ci) 2640 { 2641 if (ALLOCNO_CAP_MEMBER (cp->first) != NULL 2642 || ALLOCNO_CAP_MEMBER (cp->second) != NULL) 2643 { 2644 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 2645 fprintf 2646 (ira_dump_file, " Remove cp%d:%c%dr%d-%c%dr%d\n", 2647 cp->num, ALLOCNO_CAP_MEMBER (cp->first) != NULL ? 'c' : 'a', 2648 ALLOCNO_NUM (cp->first), REGNO (ALLOCNO_REG (cp->first)), 2649 ALLOCNO_CAP_MEMBER (cp->second) != NULL ? 'c' : 'a', 2650 ALLOCNO_NUM (cp->second), REGNO (ALLOCNO_REG (cp->second))); 2651 cp->loop_tree_node = NULL; 2652 continue; 2653 } 2654 first = regno_top_level_allocno_map[REGNO (ALLOCNO_REG (cp->first))]; 2655 second = regno_top_level_allocno_map[REGNO (ALLOCNO_REG (cp->second))]; 2656 node = cp->loop_tree_node; 2657 if (node == NULL) 2658 keep_p = true; /* It copy generated in ira-emit.c. */ 2659 else 2660 { 2661 /* Check that the copy was not propagated from level on 2662 which we will have different pseudos. */ 2663 node_first = node->regno_allocno_map[ALLOCNO_REGNO (cp->first)]; 2664 node_second = node->regno_allocno_map[ALLOCNO_REGNO (cp->second)]; 2665 keep_p = ((REGNO (ALLOCNO_REG (first)) 2666 == REGNO (ALLOCNO_REG (node_first))) 2667 && (REGNO (ALLOCNO_REG (second)) 2668 == REGNO (ALLOCNO_REG (node_second)))); 2669 } 2670 if (keep_p) 2671 { 2672 cp->loop_tree_node = ira_loop_tree_root; 2673 cp->first = first; 2674 cp->second = second; 2675 } 2676 else 2677 { 2678 cp->loop_tree_node = NULL; 2679 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 2680 fprintf (ira_dump_file, " Remove cp%d:a%dr%d-a%dr%d\n", 2681 cp->num, ALLOCNO_NUM (cp->first), 2682 REGNO (ALLOCNO_REG (cp->first)), ALLOCNO_NUM (cp->second), 2683 REGNO (ALLOCNO_REG (cp->second))); 2684 } 2685 } 2686 /* Remove unnecessary allocnos on lower levels of the loop tree. */ 2687 FOR_EACH_ALLOCNO (a, ai) 2688 { 2689 if (a != regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))] 2690 || ALLOCNO_CAP_MEMBER (a) != NULL) 2691 { 2692 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL) 2693 fprintf (ira_dump_file, " Remove a%dr%d\n", 2694 ALLOCNO_NUM (a), REGNO (ALLOCNO_REG (a))); 2695 finish_allocno (a); 2696 continue; 2697 } 2698 ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root; 2699 ALLOCNO_REGNO (a) = REGNO (ALLOCNO_REG (a)); 2700 ALLOCNO_CAP (a) = NULL; 2701 /* Restore updated costs for assignments from reload. */ 2702 ALLOCNO_UPDATED_MEMORY_COST (a) = ALLOCNO_MEMORY_COST (a); 2703 ALLOCNO_UPDATED_COVER_CLASS_COST (a) = ALLOCNO_COVER_CLASS_COST (a); 2704 if (! ALLOCNO_ASSIGNED_P (a)) 2705 ira_free_allocno_updated_costs (a); 2706 ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL); 2707 ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL); 2708 } 2709 /* Remove unnecessary copies. */ 2710 FOR_EACH_COPY (cp, ci) 2711 { 2712 if (cp->loop_tree_node == NULL) 2713 { 2714 ira_copies[cp->num] = NULL; 2715 finish_copy (cp); 2716 continue; 2717 } 2718 ira_assert 2719 (ALLOCNO_LOOP_TREE_NODE (cp->first) == ira_loop_tree_root 2720 && ALLOCNO_LOOP_TREE_NODE (cp->second) == ira_loop_tree_root); 2721 ira_add_allocno_copy_to_list (cp); 2722 ira_swap_allocno_copy_ends_if_necessary (cp); 2723 } 2724 rebuild_regno_allocno_maps (); 2725 if (ira_max_point != ira_max_point_before_emit) 2726 ira_compress_allocno_live_ranges (); 2727 ira_free (regno_top_level_allocno_map); 2728} 2729 2730 2731 2732#ifdef ENABLE_IRA_CHECKING 2733/* Check creation of all allocnos. Allocnos on lower levels should 2734 have allocnos or caps on all upper levels. */ 2735static void 2736check_allocno_creation (void) 2737{ 2738 ira_allocno_t a; 2739 ira_allocno_iterator ai; 2740 ira_loop_tree_node_t loop_tree_node; 2741 2742 FOR_EACH_ALLOCNO (a, ai) 2743 { 2744 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a); 2745 ira_assert (bitmap_bit_p (loop_tree_node->all_allocnos, 2746 ALLOCNO_NUM (a))); 2747 if (loop_tree_node == ira_loop_tree_root) 2748 continue; 2749 if (ALLOCNO_CAP_MEMBER (a) != NULL) 2750 ira_assert (ALLOCNO_CAP (a) != NULL); 2751 else if (ALLOCNO_CAP (a) == NULL) 2752 ira_assert (loop_tree_node->parent 2753 ->regno_allocno_map[ALLOCNO_REGNO (a)] != NULL 2754 && bitmap_bit_p (loop_tree_node->border_allocnos, 2755 ALLOCNO_NUM (a))); 2756 } 2757} 2758#endif 2759 2760/* Create a internal representation (IR) for IRA (allocnos, copies, 2761 loop tree nodes). If LOOPS_P is FALSE the nodes corresponding to 2762 the loops (except the root which corresponds the all function) and 2763 correspondingly allocnos for the loops will be not created. Such 2764 parameter value is used for Chaitin-Briggs coloring. The function 2765 returns TRUE if we generate loop structure (besides nodes 2766 representing all function and the basic blocks) for regional 2767 allocation. A true return means that we really need to flatten IR 2768 before the reload. */ 2769bool 2770ira_build (bool loops_p) 2771{ 2772 df_analyze (); 2773 2774 initiate_cost_vectors (); 2775 initiate_allocnos (); 2776 initiate_copies (); 2777 create_loop_tree_nodes (loops_p); 2778 form_loop_tree (); 2779 create_allocnos (); 2780 ira_costs (); 2781 ira_create_allocno_live_ranges (); 2782 remove_unnecessary_regions (false); 2783 ira_compress_allocno_live_ranges (); 2784 update_bad_spill_attribute (); 2785 loops_p = more_one_region_p (); 2786 if (loops_p) 2787 { 2788 propagate_allocno_info (); 2789 create_caps (); 2790 } 2791 ira_tune_allocno_costs_and_cover_classes (); 2792#ifdef ENABLE_IRA_CHECKING 2793 check_allocno_creation (); 2794#endif 2795 setup_min_max_allocno_live_range_point (); 2796 sort_conflict_id_allocno_map (); 2797 setup_min_max_conflict_allocno_ids (); 2798 ira_build_conflicts (); 2799 if (! ira_conflicts_p) 2800 { 2801 ira_allocno_t a; 2802 ira_allocno_iterator ai; 2803 2804 /* Remove all regions but root one. */ 2805 if (loops_p) 2806 { 2807 remove_unnecessary_regions (true); 2808 loops_p = false; 2809 } 2810 /* We don't save hard registers around calls for fast allocation 2811 -- add caller clobbered registers as conflicting ones to 2812 allocno crossing calls. */ 2813 FOR_EACH_ALLOCNO (a, ai) 2814 if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0) 2815 { 2816 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), 2817 call_used_reg_set); 2818 IOR_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (a), 2819 call_used_reg_set); 2820 } 2821 } 2822 if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL) 2823 print_copies (ira_dump_file); 2824 if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL) 2825 { 2826 int n, nr; 2827 ira_allocno_t a; 2828 allocno_live_range_t r; 2829 ira_allocno_iterator ai; 2830 2831 n = 0; 2832 FOR_EACH_ALLOCNO (a, ai) 2833 n += ALLOCNO_CONFLICT_ALLOCNOS_NUM (a); 2834 nr = 0; 2835 FOR_EACH_ALLOCNO (a, ai) 2836 for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next) 2837 nr++; 2838 fprintf (ira_dump_file, " regions=%d, blocks=%d, points=%d\n", 2839 VEC_length (loop_p, ira_loops.larray), n_basic_blocks, 2840 ira_max_point); 2841 fprintf (ira_dump_file, 2842 " allocnos=%d, copies=%d, conflicts=%d, ranges=%d\n", 2843 ira_allocnos_num, ira_copies_num, n, nr); 2844 } 2845 return loops_p; 2846} 2847 2848/* Release the data created by function ira_build. */ 2849void 2850ira_destroy (void) 2851{ 2852 finish_loop_tree_nodes (); 2853 finish_copies (); 2854 finish_allocnos (); 2855 finish_cost_vectors (); 2856 ira_finish_allocno_live_ranges (); 2857} 2858