1/* Scanning of rtl for dataflow analysis. 2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 3 2008, 2009, 2010 Free Software Foundation, Inc. 4 Originally contributed by Michael P. Hayes 5 (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com) 6 Major rewrite contributed by Danny Berlin (dberlin@dberlin.org) 7 and Kenneth Zadeck (zadeck@naturalbridge.com). 8 9This file is part of GCC. 10 11GCC is free software; you can redistribute it and/or modify it under 12the terms of the GNU General Public License as published by the Free 13Software Foundation; either version 3, or (at your option) any later 14version. 15 16GCC is distributed in the hope that it will be useful, but WITHOUT ANY 17WARRANTY; without even the implied warranty of MERCHANTABILITY or 18FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 19for more details. 20 21You should have received a copy of the GNU General Public License 22along with GCC; see the file COPYING3. If not see 23<http://www.gnu.org/licenses/>. */ 24 25#include "config.h" 26#include "system.h" 27#include "coretypes.h" 28#include "tm.h" 29#include "rtl.h" 30#include "tm_p.h" 31#include "insn-config.h" 32#include "recog.h" 33#include "function.h" 34#include "regs.h" 35#include "output.h" 36#include "alloc-pool.h" 37#include "flags.h" 38#include "hard-reg-set.h" 39#include "basic-block.h" 40#include "sbitmap.h" 41#include "bitmap.h" 42#include "timevar.h" 43#include "tree.h" 44#include "target.h" 45#include "target-def.h" 46#include "df.h" 47#include "tree-pass.h" 48 49DEF_VEC_P(df_ref); 50DEF_VEC_ALLOC_P_STACK(df_ref); 51 52#define VEC_df_ref_stack_alloc(alloc) VEC_stack_alloc (df_ref, alloc) 53 54typedef struct df_mw_hardreg *df_mw_hardreg_ptr; 55 56DEF_VEC_P(df_mw_hardreg_ptr); 57DEF_VEC_ALLOC_P_STACK(df_mw_hardreg_ptr); 58 59#define VEC_df_mw_hardreg_ptr_stack_alloc(alloc) \ 60 VEC_stack_alloc (df_mw_hardreg_ptr, alloc) 61 62#ifndef HAVE_epilogue 63#define HAVE_epilogue 0 64#endif 65#ifndef HAVE_prologue 66#define HAVE_prologue 0 67#endif 68#ifndef HAVE_sibcall_epilogue 69#define HAVE_sibcall_epilogue 0 70#endif 71 72#ifndef EPILOGUE_USES 73#define EPILOGUE_USES(REGNO) 0 74#endif 75 76/* The following two macros free the vecs that hold either the refs or 77 the mw refs. They are a little tricky because the vec has 0 78 elements is special and is not to be freed. */ 79#define df_scan_free_ref_vec(V) \ 80 do { \ 81 if (V && *V) \ 82 free (V); \ 83 } while (0) 84 85#define df_scan_free_mws_vec(V) \ 86 do { \ 87 if (V && *V) \ 88 free (V); \ 89 } while (0) 90 91/* The set of hard registers in eliminables[i].from. */ 92 93static HARD_REG_SET elim_reg_set; 94 95/* Initialize ur_in and ur_out as if all hard registers were partially 96 available. */ 97 98struct df_collection_rec 99{ 100 VEC(df_ref,stack) *def_vec; 101 VEC(df_ref,stack) *use_vec; 102 VEC(df_ref,stack) *eq_use_vec; 103 VEC(df_mw_hardreg_ptr,stack) *mw_vec; 104}; 105 106static df_ref df_null_ref_rec[1]; 107static struct df_mw_hardreg * df_null_mw_rec[1]; 108 109static void df_ref_record (enum df_ref_class, struct df_collection_rec *, 110 rtx, rtx *, 111 basic_block, struct df_insn_info *, 112 enum df_ref_type, int ref_flags, 113 int, int, enum machine_mode); 114static void df_def_record_1 (struct df_collection_rec *, rtx, 115 basic_block, struct df_insn_info *, 116 int ref_flags); 117static void df_defs_record (struct df_collection_rec *, rtx, 118 basic_block, struct df_insn_info *, 119 int ref_flags); 120static void df_uses_record (enum df_ref_class, struct df_collection_rec *, 121 rtx *, enum df_ref_type, 122 basic_block, struct df_insn_info *, 123 int ref_flags, 124 int, int, enum machine_mode); 125 126static df_ref df_ref_create_structure (enum df_ref_class, 127 struct df_collection_rec *, rtx, rtx *, 128 basic_block, struct df_insn_info *, 129 enum df_ref_type, int ref_flags, 130 int, int, enum machine_mode); 131 132static void df_insn_refs_collect (struct df_collection_rec*, 133 basic_block, struct df_insn_info *); 134static void df_canonize_collection_rec (struct df_collection_rec *); 135 136static void df_get_regular_block_artificial_uses (bitmap); 137static void df_get_eh_block_artificial_uses (bitmap); 138 139static void df_record_entry_block_defs (bitmap); 140static void df_record_exit_block_uses (bitmap); 141static void df_get_exit_block_use_set (bitmap); 142static void df_get_entry_block_def_set (bitmap); 143static void df_grow_ref_info (struct df_ref_info *, unsigned int); 144static void df_ref_chain_delete_du_chain (df_ref *); 145static void df_ref_chain_delete (df_ref *); 146 147static void df_refs_add_to_chains (struct df_collection_rec *, 148 basic_block, rtx); 149 150static bool df_insn_refs_verify (struct df_collection_rec *, basic_block, rtx, bool); 151static void df_entry_block_defs_collect (struct df_collection_rec *, bitmap); 152static void df_exit_block_uses_collect (struct df_collection_rec *, bitmap); 153static void df_install_ref (df_ref, struct df_reg_info *, 154 struct df_ref_info *, bool); 155 156static int df_ref_compare (const void *, const void *); 157static int df_mw_compare (const void *, const void *); 158 159/* Indexed by hardware reg number, is true if that register is ever 160 used in the current function. 161 162 In df-scan.c, this is set up to record the hard regs used 163 explicitly. Reload adds in the hard regs used for holding pseudo 164 regs. Final uses it to generate the code in the function prologue 165 and epilogue to save and restore registers as needed. */ 166 167static bool regs_ever_live[FIRST_PSEUDO_REGISTER]; 168 169/*---------------------------------------------------------------------------- 170 SCANNING DATAFLOW PROBLEM 171 172 There are several ways in which scanning looks just like the other 173 dataflow problems. It shares the all the mechanisms for local info 174 as well as basic block info. Where it differs is when and how often 175 it gets run. It also has no need for the iterative solver. 176----------------------------------------------------------------------------*/ 177 178/* Problem data for the scanning dataflow function. */ 179struct df_scan_problem_data 180{ 181 alloc_pool ref_base_pool; 182 alloc_pool ref_artificial_pool; 183 alloc_pool ref_regular_pool; 184 alloc_pool ref_extract_pool; 185 alloc_pool insn_pool; 186 alloc_pool reg_pool; 187 alloc_pool mw_reg_pool; 188 bitmap_obstack reg_bitmaps; 189 bitmap_obstack insn_bitmaps; 190}; 191 192typedef struct df_scan_bb_info *df_scan_bb_info_t; 193 194 195/* Internal function to shut down the scanning problem. */ 196static void 197df_scan_free_internal (void) 198{ 199 struct df_scan_problem_data *problem_data 200 = (struct df_scan_problem_data *) df_scan->problem_data; 201 unsigned int i; 202 basic_block bb; 203 204 /* The vectors that hold the refs are not pool allocated because 205 they come in many sizes. This makes them impossible to delete 206 all at once. */ 207 for (i = 0; i < DF_INSN_SIZE(); i++) 208 { 209 struct df_insn_info *insn_info = DF_INSN_UID_GET(i); 210 /* Skip the insns that have no insn_info or have been 211 deleted. */ 212 if (insn_info) 213 { 214 df_scan_free_ref_vec (insn_info->defs); 215 df_scan_free_ref_vec (insn_info->uses); 216 df_scan_free_ref_vec (insn_info->eq_uses); 217 df_scan_free_mws_vec (insn_info->mw_hardregs); 218 } 219 } 220 221 FOR_ALL_BB (bb) 222 { 223 unsigned int bb_index = bb->index; 224 struct df_scan_bb_info *bb_info = df_scan_get_bb_info (bb_index); 225 if (bb_info) 226 { 227 df_scan_free_ref_vec (bb_info->artificial_defs); 228 df_scan_free_ref_vec (bb_info->artificial_uses); 229 } 230 } 231 232 free (df->def_info.refs); 233 free (df->def_info.begin); 234 free (df->def_info.count); 235 memset (&df->def_info, 0, (sizeof (struct df_ref_info))); 236 237 free (df->use_info.refs); 238 free (df->use_info.begin); 239 free (df->use_info.count); 240 memset (&df->use_info, 0, (sizeof (struct df_ref_info))); 241 242 free (df->def_regs); 243 df->def_regs = NULL; 244 free (df->use_regs); 245 df->use_regs = NULL; 246 free (df->eq_use_regs); 247 df->eq_use_regs = NULL; 248 df->regs_size = 0; 249 DF_REG_SIZE(df) = 0; 250 251 free (df->insns); 252 df->insns = NULL; 253 DF_INSN_SIZE () = 0; 254 255 free (df_scan->block_info); 256 df_scan->block_info = NULL; 257 df_scan->block_info_size = 0; 258 259 BITMAP_FREE (df->hardware_regs_used); 260 BITMAP_FREE (df->regular_block_artificial_uses); 261 BITMAP_FREE (df->eh_block_artificial_uses); 262 BITMAP_FREE (df->entry_block_defs); 263 BITMAP_FREE (df->exit_block_uses); 264 BITMAP_FREE (df->insns_to_delete); 265 BITMAP_FREE (df->insns_to_rescan); 266 BITMAP_FREE (df->insns_to_notes_rescan); 267 268 free_alloc_pool (df_scan->block_pool); 269 free_alloc_pool (problem_data->ref_base_pool); 270 free_alloc_pool (problem_data->ref_artificial_pool); 271 free_alloc_pool (problem_data->ref_regular_pool); 272 free_alloc_pool (problem_data->ref_extract_pool); 273 free_alloc_pool (problem_data->insn_pool); 274 free_alloc_pool (problem_data->reg_pool); 275 free_alloc_pool (problem_data->mw_reg_pool); 276 bitmap_obstack_release (&problem_data->reg_bitmaps); 277 bitmap_obstack_release (&problem_data->insn_bitmaps); 278 free (df_scan->problem_data); 279} 280 281 282/* Set basic block info. */ 283 284static void 285df_scan_set_bb_info (unsigned int index, 286 struct df_scan_bb_info *bb_info) 287{ 288 df_grow_bb_info (df_scan); 289 df_scan->block_info[index] = (void *) bb_info; 290} 291 292 293/* Free basic block info. */ 294 295static void 296df_scan_free_bb_info (basic_block bb, void *vbb_info) 297{ 298 struct df_scan_bb_info *bb_info = (struct df_scan_bb_info *) vbb_info; 299 unsigned int bb_index = bb->index; 300 if (bb_info) 301 { 302 rtx insn; 303 FOR_BB_INSNS (bb, insn) 304 { 305 if (INSN_P (insn)) 306 /* Record defs within INSN. */ 307 df_insn_delete (bb, INSN_UID (insn)); 308 } 309 310 if (bb_index < df_scan->block_info_size) 311 bb_info = df_scan_get_bb_info (bb_index); 312 313 /* Get rid of any artificial uses or defs. */ 314 df_ref_chain_delete_du_chain (bb_info->artificial_defs); 315 df_ref_chain_delete_du_chain (bb_info->artificial_uses); 316 df_ref_chain_delete (bb_info->artificial_defs); 317 df_ref_chain_delete (bb_info->artificial_uses); 318 bb_info->artificial_defs = NULL; 319 bb_info->artificial_uses = NULL; 320 pool_free (df_scan->block_pool, bb_info); 321 } 322} 323 324 325/* Allocate the problem data for the scanning problem. This should be 326 called when the problem is created or when the entire function is to 327 be rescanned. */ 328void 329df_scan_alloc (bitmap all_blocks ATTRIBUTE_UNUSED) 330{ 331 struct df_scan_problem_data *problem_data; 332 unsigned int insn_num = get_max_uid () + 1; 333 unsigned int block_size = 400; 334 basic_block bb; 335 336 /* Given the number of pools, this is really faster than tearing 337 everything apart. */ 338 if (df_scan->problem_data) 339 df_scan_free_internal (); 340 341 df_scan->block_pool 342 = create_alloc_pool ("df_scan_block pool", 343 sizeof (struct df_scan_bb_info), 344 block_size); 345 346 problem_data = XNEW (struct df_scan_problem_data); 347 df_scan->problem_data = problem_data; 348 df_scan->computed = true; 349 350 problem_data->ref_base_pool 351 = create_alloc_pool ("df_scan ref base", 352 sizeof (struct df_base_ref), block_size); 353 problem_data->ref_artificial_pool 354 = create_alloc_pool ("df_scan ref artificial", 355 sizeof (struct df_artificial_ref), block_size); 356 problem_data->ref_regular_pool 357 = create_alloc_pool ("df_scan ref regular", 358 sizeof (struct df_regular_ref), block_size); 359 problem_data->ref_extract_pool 360 = create_alloc_pool ("df_scan ref extract", 361 sizeof (struct df_extract_ref), block_size); 362 problem_data->insn_pool 363 = create_alloc_pool ("df_scan insn", 364 sizeof (struct df_insn_info), block_size); 365 problem_data->reg_pool 366 = create_alloc_pool ("df_scan reg", 367 sizeof (struct df_reg_info), block_size); 368 problem_data->mw_reg_pool 369 = create_alloc_pool ("df_scan mw_reg", 370 sizeof (struct df_mw_hardreg), block_size); 371 372 bitmap_obstack_initialize (&problem_data->reg_bitmaps); 373 bitmap_obstack_initialize (&problem_data->insn_bitmaps); 374 375 insn_num += insn_num / 4; 376 df_grow_reg_info (); 377 378 df_grow_insn_info (); 379 df_grow_bb_info (df_scan); 380 381 FOR_ALL_BB (bb) 382 { 383 unsigned int bb_index = bb->index; 384 struct df_scan_bb_info *bb_info = df_scan_get_bb_info (bb_index); 385 if (!bb_info) 386 { 387 bb_info = (struct df_scan_bb_info *) pool_alloc (df_scan->block_pool); 388 df_scan_set_bb_info (bb_index, bb_info); 389 } 390 bb_info->artificial_defs = NULL; 391 bb_info->artificial_uses = NULL; 392 } 393 394 df->hardware_regs_used = BITMAP_ALLOC (&problem_data->reg_bitmaps); 395 df->regular_block_artificial_uses = BITMAP_ALLOC (&problem_data->reg_bitmaps); 396 df->eh_block_artificial_uses = BITMAP_ALLOC (&problem_data->reg_bitmaps); 397 df->entry_block_defs = BITMAP_ALLOC (&problem_data->reg_bitmaps); 398 df->exit_block_uses = BITMAP_ALLOC (&problem_data->reg_bitmaps); 399 df->insns_to_delete = BITMAP_ALLOC (&problem_data->insn_bitmaps); 400 df->insns_to_rescan = BITMAP_ALLOC (&problem_data->insn_bitmaps); 401 df->insns_to_notes_rescan = BITMAP_ALLOC (&problem_data->insn_bitmaps); 402 df_scan->optional_p = false; 403} 404 405 406/* Free all of the data associated with the scan problem. */ 407 408static void 409df_scan_free (void) 410{ 411 if (df_scan->problem_data) 412 df_scan_free_internal (); 413 414 if (df->blocks_to_analyze) 415 { 416 BITMAP_FREE (df->blocks_to_analyze); 417 df->blocks_to_analyze = NULL; 418 } 419 420 free (df_scan); 421} 422 423/* Dump the preamble for DF_SCAN dump. */ 424static void 425df_scan_start_dump (FILE *file ATTRIBUTE_UNUSED) 426{ 427 int i; 428 int dcount = 0; 429 int ucount = 0; 430 int ecount = 0; 431 int icount = 0; 432 int ccount = 0; 433 basic_block bb; 434 rtx insn; 435 436 fprintf (file, ";; invalidated by call \t"); 437 df_print_regset (file, regs_invalidated_by_call_regset); 438 fprintf (file, ";; hardware regs used \t"); 439 df_print_regset (file, df->hardware_regs_used); 440 fprintf (file, ";; regular block artificial uses \t"); 441 df_print_regset (file, df->regular_block_artificial_uses); 442 fprintf (file, ";; eh block artificial uses \t"); 443 df_print_regset (file, df->eh_block_artificial_uses); 444 fprintf (file, ";; entry block defs \t"); 445 df_print_regset (file, df->entry_block_defs); 446 fprintf (file, ";; exit block uses \t"); 447 df_print_regset (file, df->exit_block_uses); 448 fprintf (file, ";; regs ever live \t"); 449 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 450 if (df_regs_ever_live_p (i)) 451 fprintf (file, " %d[%s]", i, reg_names[i]); 452 fprintf (file, "\n;; ref usage \t"); 453 454 for (i = 0; i < (int)df->regs_inited; i++) 455 if (DF_REG_DEF_COUNT (i) || DF_REG_USE_COUNT (i) || DF_REG_EQ_USE_COUNT (i)) 456 { 457 const char * sep = ""; 458 459 fprintf (file, "r%d={", i); 460 if (DF_REG_DEF_COUNT (i)) 461 { 462 fprintf (file, "%dd", DF_REG_DEF_COUNT (i)); 463 sep = ","; 464 dcount += DF_REG_DEF_COUNT (i); 465 } 466 if (DF_REG_USE_COUNT (i)) 467 { 468 fprintf (file, "%s%du", sep, DF_REG_USE_COUNT (i)); 469 sep = ","; 470 ucount += DF_REG_USE_COUNT (i); 471 } 472 if (DF_REG_EQ_USE_COUNT (i)) 473 { 474 fprintf (file, "%s%de", sep, DF_REG_EQ_USE_COUNT (i)); 475 ecount += DF_REG_EQ_USE_COUNT (i); 476 } 477 fprintf (file, "} "); 478 } 479 480 FOR_EACH_BB (bb) 481 FOR_BB_INSNS (bb, insn) 482 if (INSN_P (insn)) 483 { 484 if (CALL_P (insn)) 485 ccount++; 486 else 487 icount++; 488 } 489 490 fprintf (file, "\n;; total ref usage %d{%dd,%du,%de}" 491 " in %d{%d regular + %d call} insns.\n", 492 dcount + ucount + ecount, dcount, ucount, ecount, 493 icount + ccount, icount, ccount); 494} 495 496/* Dump the bb_info for a given basic block. */ 497static void 498df_scan_start_block (basic_block bb, FILE *file) 499{ 500 struct df_scan_bb_info *bb_info 501 = df_scan_get_bb_info (bb->index); 502 503 if (bb_info) 504 { 505 fprintf (file, ";; bb %d artificial_defs: ", bb->index); 506 df_refs_chain_dump (bb_info->artificial_defs, true, file); 507 fprintf (file, "\n;; bb %d artificial_uses: ", bb->index); 508 df_refs_chain_dump (bb_info->artificial_uses, true, file); 509 fprintf (file, "\n"); 510 } 511#if 0 512 { 513 rtx insn; 514 FOR_BB_INSNS (bb, insn) 515 if (INSN_P (insn)) 516 df_insn_debug (insn, false, file); 517 } 518#endif 519} 520 521static struct df_problem problem_SCAN = 522{ 523 DF_SCAN, /* Problem id. */ 524 DF_NONE, /* Direction. */ 525 df_scan_alloc, /* Allocate the problem specific data. */ 526 NULL, /* Reset global information. */ 527 df_scan_free_bb_info, /* Free basic block info. */ 528 NULL, /* Local compute function. */ 529 NULL, /* Init the solution specific data. */ 530 NULL, /* Iterative solver. */ 531 NULL, /* Confluence operator 0. */ 532 NULL, /* Confluence operator n. */ 533 NULL, /* Transfer function. */ 534 NULL, /* Finalize function. */ 535 df_scan_free, /* Free all of the problem information. */ 536 NULL, /* Remove this problem from the stack of dataflow problems. */ 537 df_scan_start_dump, /* Debugging. */ 538 df_scan_start_block, /* Debugging start block. */ 539 NULL, /* Debugging end block. */ 540 NULL, /* Incremental solution verify start. */ 541 NULL, /* Incremental solution verify end. */ 542 NULL, /* Dependent problem. */ 543 TV_DF_SCAN, /* Timing variable. */ 544 false /* Reset blocks on dropping out of blocks_to_analyze. */ 545}; 546 547 548/* Create a new DATAFLOW instance and add it to an existing instance 549 of DF. The returned structure is what is used to get at the 550 solution. */ 551 552void 553df_scan_add_problem (void) 554{ 555 df_add_problem (&problem_SCAN); 556} 557 558 559/*---------------------------------------------------------------------------- 560 Storage Allocation Utilities 561----------------------------------------------------------------------------*/ 562 563 564/* First, grow the reg_info information. If the current size is less than 565 the number of pseudos, grow to 25% more than the number of 566 pseudos. 567 568 Second, assure that all of the slots up to max_reg_num have been 569 filled with reg_info structures. */ 570 571void 572df_grow_reg_info (void) 573{ 574 unsigned int max_reg = max_reg_num (); 575 unsigned int new_size = max_reg; 576 struct df_scan_problem_data *problem_data 577 = (struct df_scan_problem_data *) df_scan->problem_data; 578 unsigned int i; 579 580 if (df->regs_size < new_size) 581 { 582 new_size += new_size / 4; 583 df->def_regs = XRESIZEVEC (struct df_reg_info *, df->def_regs, new_size); 584 df->use_regs = XRESIZEVEC (struct df_reg_info *, df->use_regs, new_size); 585 df->eq_use_regs = XRESIZEVEC (struct df_reg_info *, df->eq_use_regs, 586 new_size); 587 df->def_info.begin = XRESIZEVEC (unsigned, df->def_info.begin, new_size); 588 df->def_info.count = XRESIZEVEC (unsigned, df->def_info.count, new_size); 589 df->use_info.begin = XRESIZEVEC (unsigned, df->use_info.begin, new_size); 590 df->use_info.count = XRESIZEVEC (unsigned, df->use_info.count, new_size); 591 df->regs_size = new_size; 592 } 593 594 for (i = df->regs_inited; i < max_reg; i++) 595 { 596 struct df_reg_info *reg_info; 597 598 reg_info = (struct df_reg_info *) pool_alloc (problem_data->reg_pool); 599 memset (reg_info, 0, sizeof (struct df_reg_info)); 600 df->def_regs[i] = reg_info; 601 reg_info = (struct df_reg_info *) pool_alloc (problem_data->reg_pool); 602 memset (reg_info, 0, sizeof (struct df_reg_info)); 603 df->use_regs[i] = reg_info; 604 reg_info = (struct df_reg_info *) pool_alloc (problem_data->reg_pool); 605 memset (reg_info, 0, sizeof (struct df_reg_info)); 606 df->eq_use_regs[i] = reg_info; 607 df->def_info.begin[i] = 0; 608 df->def_info.count[i] = 0; 609 df->use_info.begin[i] = 0; 610 df->use_info.count[i] = 0; 611 } 612 613 df->regs_inited = max_reg; 614} 615 616 617/* Grow the ref information. */ 618 619static void 620df_grow_ref_info (struct df_ref_info *ref_info, unsigned int new_size) 621{ 622 if (ref_info->refs_size < new_size) 623 { 624 ref_info->refs = XRESIZEVEC (df_ref, ref_info->refs, new_size); 625 memset (ref_info->refs + ref_info->refs_size, 0, 626 (new_size - ref_info->refs_size) *sizeof (df_ref)); 627 ref_info->refs_size = new_size; 628 } 629} 630 631 632/* Check and grow the ref information if necessary. This routine 633 guarantees total_size + BITMAP_ADDEND amount of entries in refs 634 array. It updates ref_info->refs_size only and does not change 635 ref_info->total_size. */ 636 637static void 638df_check_and_grow_ref_info (struct df_ref_info *ref_info, 639 unsigned bitmap_addend) 640{ 641 if (ref_info->refs_size < ref_info->total_size + bitmap_addend) 642 { 643 int new_size = ref_info->total_size + bitmap_addend; 644 new_size += ref_info->total_size / 4; 645 df_grow_ref_info (ref_info, new_size); 646 } 647} 648 649 650/* Grow the ref information. If the current size is less than the 651 number of instructions, grow to 25% more than the number of 652 instructions. */ 653 654void 655df_grow_insn_info (void) 656{ 657 unsigned int new_size = get_max_uid () + 1; 658 if (DF_INSN_SIZE () < new_size) 659 { 660 new_size += new_size / 4; 661 df->insns = XRESIZEVEC (struct df_insn_info *, df->insns, new_size); 662 memset (df->insns + df->insns_size, 0, 663 (new_size - DF_INSN_SIZE ()) *sizeof (struct df_insn_info *)); 664 DF_INSN_SIZE () = new_size; 665 } 666} 667 668 669 670 671/*---------------------------------------------------------------------------- 672 PUBLIC INTERFACES FOR SMALL GRAIN CHANGES TO SCANNING. 673----------------------------------------------------------------------------*/ 674 675/* Rescan all of the block_to_analyze or all of the blocks in the 676 function if df_set_blocks if blocks_to_analyze is NULL; */ 677 678void 679df_scan_blocks (void) 680{ 681 basic_block bb; 682 683 df->def_info.ref_order = DF_REF_ORDER_NO_TABLE; 684 df->use_info.ref_order = DF_REF_ORDER_NO_TABLE; 685 686 df_get_regular_block_artificial_uses (df->regular_block_artificial_uses); 687 df_get_eh_block_artificial_uses (df->eh_block_artificial_uses); 688 689 bitmap_ior_into (df->eh_block_artificial_uses, 690 df->regular_block_artificial_uses); 691 692 /* ENTRY and EXIT blocks have special defs/uses. */ 693 df_get_entry_block_def_set (df->entry_block_defs); 694 df_record_entry_block_defs (df->entry_block_defs); 695 df_get_exit_block_use_set (df->exit_block_uses); 696 df_record_exit_block_uses (df->exit_block_uses); 697 df_set_bb_dirty (BASIC_BLOCK (ENTRY_BLOCK)); 698 df_set_bb_dirty (BASIC_BLOCK (EXIT_BLOCK)); 699 700 /* Regular blocks */ 701 FOR_EACH_BB (bb) 702 { 703 unsigned int bb_index = bb->index; 704 df_bb_refs_record (bb_index, true); 705 } 706} 707 708 709/* Create a new ref of type DF_REF_TYPE for register REG at address 710 LOC within INSN of BB. This function is only used externally. 711 712 If the REF_FLAGS field contain DF_REF_SIGN_EXTRACT or 713 DF_REF_ZERO_EXTRACT. WIDTH, OFFSET and MODE are used to access the 714 fields if they were constants. Otherwise they should be -1 if 715 those flags were set. */ 716 717df_ref 718df_ref_create (rtx reg, rtx *loc, rtx insn, 719 basic_block bb, 720 enum df_ref_type ref_type, 721 int ref_flags, 722 int width, int offset, enum machine_mode mode) 723{ 724 df_ref ref; 725 struct df_reg_info **reg_info; 726 struct df_ref_info *ref_info; 727 df_ref *ref_rec; 728 df_ref **ref_rec_ptr; 729 unsigned int count = 0; 730 bool add_to_table; 731 enum df_ref_class cl; 732 733 df_grow_reg_info (); 734 735 /* You cannot hack artificial refs. */ 736 gcc_assert (insn); 737 738 if (width != -1 || offset != -1) 739 cl = DF_REF_EXTRACT; 740 else if (loc) 741 cl = DF_REF_REGULAR; 742 else 743 cl = DF_REF_BASE; 744 ref = df_ref_create_structure (cl, NULL, reg, loc, bb, DF_INSN_INFO_GET (insn), 745 ref_type, ref_flags, 746 width, offset, mode); 747 748 if (DF_REF_REG_DEF_P (ref)) 749 { 750 reg_info = df->def_regs; 751 ref_info = &df->def_info; 752 ref_rec_ptr = &DF_INSN_DEFS (insn); 753 add_to_table = ref_info->ref_order != DF_REF_ORDER_NO_TABLE; 754 } 755 else if (DF_REF_FLAGS (ref) & DF_REF_IN_NOTE) 756 { 757 reg_info = df->eq_use_regs; 758 ref_info = &df->use_info; 759 ref_rec_ptr = &DF_INSN_EQ_USES (insn); 760 switch (ref_info->ref_order) 761 { 762 case DF_REF_ORDER_UNORDERED_WITH_NOTES: 763 case DF_REF_ORDER_BY_REG_WITH_NOTES: 764 case DF_REF_ORDER_BY_INSN_WITH_NOTES: 765 add_to_table = true; 766 break; 767 default: 768 add_to_table = false; 769 break; 770 } 771 } 772 else 773 { 774 reg_info = df->use_regs; 775 ref_info = &df->use_info; 776 ref_rec_ptr = &DF_INSN_USES (insn); 777 add_to_table = ref_info->ref_order != DF_REF_ORDER_NO_TABLE; 778 } 779 780 /* Do not add if ref is not in the right blocks. */ 781 if (add_to_table && df->analyze_subset) 782 add_to_table = bitmap_bit_p (df->blocks_to_analyze, bb->index); 783 784 df_install_ref (ref, reg_info[DF_REF_REGNO (ref)], ref_info, add_to_table); 785 786 if (add_to_table) 787 switch (ref_info->ref_order) 788 { 789 case DF_REF_ORDER_UNORDERED_WITH_NOTES: 790 case DF_REF_ORDER_BY_REG_WITH_NOTES: 791 case DF_REF_ORDER_BY_INSN_WITH_NOTES: 792 ref_info->ref_order = DF_REF_ORDER_UNORDERED_WITH_NOTES; 793 break; 794 default: 795 ref_info->ref_order = DF_REF_ORDER_UNORDERED; 796 break; 797 } 798 799 ref_rec = *ref_rec_ptr; 800 while (*ref_rec) 801 { 802 count++; 803 ref_rec++; 804 } 805 806 ref_rec = *ref_rec_ptr; 807 if (count) 808 { 809 ref_rec = XRESIZEVEC (df_ref, ref_rec, count+2); 810 *ref_rec_ptr = ref_rec; 811 ref_rec[count] = ref; 812 ref_rec[count+1] = NULL; 813 qsort (ref_rec, count + 1, sizeof (df_ref), df_ref_compare); 814 } 815 else 816 { 817 df_ref *ref_rec = XNEWVEC (df_ref, 2); 818 ref_rec[0] = ref; 819 ref_rec[1] = NULL; 820 *ref_rec_ptr = ref_rec; 821 } 822 823#if 0 824 if (dump_file) 825 { 826 fprintf (dump_file, "adding ref "); 827 df_ref_debug (ref, dump_file); 828 } 829#endif 830 /* By adding the ref directly, df_insn_rescan my not find any 831 differences even though the block will have changed. So we need 832 to mark the block dirty ourselves. */ 833 if (!DEBUG_INSN_P (DF_REF_INSN (ref))) 834 df_set_bb_dirty (bb); 835 836 return ref; 837} 838 839 840 841/*---------------------------------------------------------------------------- 842 UTILITIES TO CREATE AND DESTROY REFS AND CHAINS. 843----------------------------------------------------------------------------*/ 844 845static void 846df_free_ref (df_ref ref) 847{ 848 struct df_scan_problem_data *problem_data 849 = (struct df_scan_problem_data *) df_scan->problem_data; 850 851 switch (DF_REF_CLASS (ref)) 852 { 853 case DF_REF_BASE: 854 pool_free (problem_data->ref_base_pool, ref); 855 break; 856 857 case DF_REF_ARTIFICIAL: 858 pool_free (problem_data->ref_artificial_pool, ref); 859 break; 860 861 case DF_REF_REGULAR: 862 pool_free (problem_data->ref_regular_pool, ref); 863 break; 864 865 case DF_REF_EXTRACT: 866 pool_free (problem_data->ref_extract_pool, ref); 867 break; 868 } 869} 870 871 872/* Unlink and delete REF at the reg_use, reg_eq_use or reg_def chain. 873 Also delete the def-use or use-def chain if it exists. */ 874 875static void 876df_reg_chain_unlink (df_ref ref) 877{ 878 df_ref next = DF_REF_NEXT_REG (ref); 879 df_ref prev = DF_REF_PREV_REG (ref); 880 int id = DF_REF_ID (ref); 881 struct df_reg_info *reg_info; 882 df_ref *refs = NULL; 883 884 if (DF_REF_REG_DEF_P (ref)) 885 { 886 int regno = DF_REF_REGNO (ref); 887 reg_info = DF_REG_DEF_GET (regno); 888 refs = df->def_info.refs; 889 } 890 else 891 { 892 if (DF_REF_FLAGS (ref) & DF_REF_IN_NOTE) 893 { 894 reg_info = DF_REG_EQ_USE_GET (DF_REF_REGNO (ref)); 895 switch (df->use_info.ref_order) 896 { 897 case DF_REF_ORDER_UNORDERED_WITH_NOTES: 898 case DF_REF_ORDER_BY_REG_WITH_NOTES: 899 case DF_REF_ORDER_BY_INSN_WITH_NOTES: 900 refs = df->use_info.refs; 901 break; 902 default: 903 break; 904 } 905 } 906 else 907 { 908 reg_info = DF_REG_USE_GET (DF_REF_REGNO (ref)); 909 refs = df->use_info.refs; 910 } 911 } 912 913 if (refs) 914 { 915 if (df->analyze_subset) 916 { 917 if (bitmap_bit_p (df->blocks_to_analyze, DF_REF_BBNO (ref))) 918 refs[id] = NULL; 919 } 920 else 921 refs[id] = NULL; 922 } 923 924 /* Delete any def-use or use-def chains that start here. It is 925 possible that there is trash in this field. This happens for 926 insns that have been deleted when rescanning has been deferred 927 and the chain problem has also been deleted. The chain tear down 928 code skips deleted insns. */ 929 if (df_chain && DF_REF_CHAIN (ref)) 930 df_chain_unlink (ref); 931 932 reg_info->n_refs--; 933 if (DF_REF_FLAGS_IS_SET (ref, DF_HARD_REG_LIVE)) 934 { 935 gcc_assert (DF_REF_REGNO (ref) < FIRST_PSEUDO_REGISTER); 936 df->hard_regs_live_count[DF_REF_REGNO (ref)]--; 937 } 938 939 /* Unlink from the reg chain. If there is no prev, this is the 940 first of the list. If not, just join the next and prev. */ 941 if (prev) 942 DF_REF_NEXT_REG (prev) = next; 943 else 944 { 945 gcc_assert (reg_info->reg_chain == ref); 946 reg_info->reg_chain = next; 947 } 948 if (next) 949 DF_REF_PREV_REG (next) = prev; 950 951 df_free_ref (ref); 952} 953 954 955/* Remove REF from VEC. */ 956 957static void 958df_ref_compress_rec (df_ref **vec_ptr, df_ref ref) 959{ 960 df_ref *vec = *vec_ptr; 961 962 if (vec[1]) 963 { 964 while (*vec && *vec != ref) 965 vec++; 966 967 while (*vec) 968 { 969 *vec = *(vec+1); 970 vec++; 971 } 972 } 973 else 974 { 975 free (vec); 976 *vec_ptr = df_null_ref_rec; 977 } 978} 979 980 981/* Unlink REF from all def-use/use-def chains, etc. */ 982 983void 984df_ref_remove (df_ref ref) 985{ 986#if 0 987 if (dump_file) 988 { 989 fprintf (dump_file, "removing ref "); 990 df_ref_debug (ref, dump_file); 991 } 992#endif 993 994 if (DF_REF_REG_DEF_P (ref)) 995 { 996 if (DF_REF_IS_ARTIFICIAL (ref)) 997 { 998 struct df_scan_bb_info *bb_info 999 = df_scan_get_bb_info (DF_REF_BBNO (ref)); 1000 df_ref_compress_rec (&bb_info->artificial_defs, ref); 1001 } 1002 else 1003 { 1004 unsigned int uid = DF_REF_INSN_UID (ref); 1005 struct df_insn_info *insn_rec = DF_INSN_UID_GET (uid); 1006 df_ref_compress_rec (&insn_rec->defs, ref); 1007 } 1008 } 1009 else 1010 { 1011 if (DF_REF_IS_ARTIFICIAL (ref)) 1012 { 1013 struct df_scan_bb_info *bb_info 1014 = df_scan_get_bb_info (DF_REF_BBNO (ref)); 1015 df_ref_compress_rec (&bb_info->artificial_uses, ref); 1016 } 1017 else 1018 { 1019 unsigned int uid = DF_REF_INSN_UID (ref); 1020 struct df_insn_info *insn_rec = DF_INSN_UID_GET (uid); 1021 1022 if (DF_REF_FLAGS (ref) & DF_REF_IN_NOTE) 1023 df_ref_compress_rec (&insn_rec->eq_uses, ref); 1024 else 1025 df_ref_compress_rec (&insn_rec->uses, ref); 1026 } 1027 } 1028 1029 /* By deleting the ref directly, df_insn_rescan my not find any 1030 differences even though the block will have changed. So we need 1031 to mark the block dirty ourselves. */ 1032 if (!DEBUG_INSN_P (DF_REF_INSN (ref))) 1033 df_set_bb_dirty (DF_REF_BB (ref)); 1034 df_reg_chain_unlink (ref); 1035} 1036 1037 1038/* Create the insn record for INSN. If there was one there, zero it 1039 out. */ 1040 1041struct df_insn_info * 1042df_insn_create_insn_record (rtx insn) 1043{ 1044 struct df_scan_problem_data *problem_data 1045 = (struct df_scan_problem_data *) df_scan->problem_data; 1046 struct df_insn_info *insn_rec; 1047 1048 df_grow_insn_info (); 1049 insn_rec = DF_INSN_INFO_GET (insn); 1050 if (!insn_rec) 1051 { 1052 insn_rec = (struct df_insn_info *) pool_alloc (problem_data->insn_pool); 1053 DF_INSN_INFO_SET (insn, insn_rec); 1054 } 1055 memset (insn_rec, 0, sizeof (struct df_insn_info)); 1056 insn_rec->insn = insn; 1057 return insn_rec; 1058} 1059 1060 1061/* Delete all du chain (DF_REF_CHAIN()) of all refs in the ref chain. */ 1062 1063static void 1064df_ref_chain_delete_du_chain (df_ref *ref_rec) 1065{ 1066 while (*ref_rec) 1067 { 1068 df_ref ref = *ref_rec; 1069 /* CHAIN is allocated by DF_CHAIN. So make sure to 1070 pass df_scan instance for the problem. */ 1071 if (DF_REF_CHAIN (ref)) 1072 df_chain_unlink (ref); 1073 ref_rec++; 1074 } 1075} 1076 1077 1078/* Delete all refs in the ref chain. */ 1079 1080static void 1081df_ref_chain_delete (df_ref *ref_rec) 1082{ 1083 df_ref *start = ref_rec; 1084 while (*ref_rec) 1085 { 1086 df_reg_chain_unlink (*ref_rec); 1087 ref_rec++; 1088 } 1089 1090 /* If the list is empty, it has a special shared element that is not 1091 to be deleted. */ 1092 if (*start) 1093 free (start); 1094} 1095 1096 1097/* Delete the hardreg chain. */ 1098 1099static void 1100df_mw_hardreg_chain_delete (struct df_mw_hardreg **hardregs) 1101{ 1102 struct df_scan_problem_data *problem_data; 1103 1104 if (!hardregs) 1105 return; 1106 1107 problem_data = (struct df_scan_problem_data *) df_scan->problem_data; 1108 1109 while (*hardregs) 1110 { 1111 pool_free (problem_data->mw_reg_pool, *hardregs); 1112 hardregs++; 1113 } 1114} 1115 1116 1117/* Delete all of the refs information from INSN. BB must be passed in 1118 except when called from df_process_deferred_rescans to mark the block 1119 as dirty. */ 1120 1121void 1122df_insn_delete (basic_block bb, unsigned int uid) 1123{ 1124 struct df_insn_info *insn_info = NULL; 1125 if (!df) 1126 return; 1127 1128 df_grow_bb_info (df_scan); 1129 df_grow_reg_info (); 1130 1131 /* The block must be marked as dirty now, rather than later as in 1132 df_insn_rescan and df_notes_rescan because it may not be there at 1133 rescanning time and the mark would blow up. */ 1134 if (bb) 1135 df_set_bb_dirty (bb); 1136 1137 insn_info = DF_INSN_UID_SAFE_GET (uid); 1138 1139 /* The client has deferred rescanning. */ 1140 if (df->changeable_flags & DF_DEFER_INSN_RESCAN) 1141 { 1142 if (insn_info) 1143 { 1144 bitmap_clear_bit (df->insns_to_rescan, uid); 1145 bitmap_clear_bit (df->insns_to_notes_rescan, uid); 1146 bitmap_set_bit (df->insns_to_delete, uid); 1147 } 1148 if (dump_file) 1149 fprintf (dump_file, "deferring deletion of insn with uid = %d.\n", uid); 1150 return; 1151 } 1152 1153 if (dump_file) 1154 fprintf (dump_file, "deleting insn with uid = %d.\n", uid); 1155 1156 bitmap_clear_bit (df->insns_to_delete, uid); 1157 bitmap_clear_bit (df->insns_to_rescan, uid); 1158 bitmap_clear_bit (df->insns_to_notes_rescan, uid); 1159 if (insn_info) 1160 { 1161 struct df_scan_problem_data *problem_data 1162 = (struct df_scan_problem_data *) df_scan->problem_data; 1163 1164 /* In general, notes do not have the insn_info fields 1165 initialized. However, combine deletes insns by changing them 1166 to notes. How clever. So we cannot just check if it is a 1167 valid insn before short circuiting this code, we need to see 1168 if we actually initialized it. */ 1169 if (insn_info->defs) 1170 { 1171 df_mw_hardreg_chain_delete (insn_info->mw_hardregs); 1172 1173 if (df_chain) 1174 { 1175 df_ref_chain_delete_du_chain (insn_info->defs); 1176 df_ref_chain_delete_du_chain (insn_info->uses); 1177 df_ref_chain_delete_du_chain (insn_info->eq_uses); 1178 } 1179 1180 df_ref_chain_delete (insn_info->defs); 1181 df_ref_chain_delete (insn_info->uses); 1182 df_ref_chain_delete (insn_info->eq_uses); 1183 } 1184 pool_free (problem_data->insn_pool, insn_info); 1185 DF_INSN_UID_SET (uid, NULL); 1186 } 1187} 1188 1189 1190/* Free all of the refs and the mw_hardregs in COLLECTION_REC. */ 1191 1192static void 1193df_free_collection_rec (struct df_collection_rec *collection_rec) 1194{ 1195 unsigned int ix; 1196 struct df_scan_problem_data *problem_data 1197 = (struct df_scan_problem_data *) df_scan->problem_data; 1198 df_ref ref; 1199 struct df_mw_hardreg *mw; 1200 1201 for (ix = 0; VEC_iterate (df_ref, collection_rec->def_vec, ix, ref); ++ix) 1202 df_free_ref (ref); 1203 for (ix = 0; VEC_iterate (df_ref, collection_rec->use_vec, ix, ref); ++ix) 1204 df_free_ref (ref); 1205 for (ix = 0; VEC_iterate (df_ref, collection_rec->eq_use_vec, ix, ref); ++ix) 1206 df_free_ref (ref); 1207 for (ix = 0; 1208 VEC_iterate (df_mw_hardreg_ptr, collection_rec->mw_vec, ix, mw); 1209 ++ix) 1210 pool_free (problem_data->mw_reg_pool, mw); 1211 1212 VEC_free (df_ref, stack, collection_rec->def_vec); 1213 VEC_free (df_ref, stack, collection_rec->use_vec); 1214 VEC_free (df_ref, stack, collection_rec->eq_use_vec); 1215 VEC_free (df_mw_hardreg_ptr, stack, collection_rec->mw_vec); 1216} 1217 1218/* Rescan INSN. Return TRUE if the rescanning produced any changes. */ 1219 1220bool 1221df_insn_rescan (rtx insn) 1222{ 1223 unsigned int uid = INSN_UID (insn); 1224 struct df_insn_info *insn_info = NULL; 1225 basic_block bb = BLOCK_FOR_INSN (insn); 1226 struct df_collection_rec collection_rec; 1227 1228 if ((!df) || (!INSN_P (insn))) 1229 return false; 1230 1231 if (!bb) 1232 { 1233 if (dump_file) 1234 fprintf (dump_file, "no bb for insn with uid = %d.\n", uid); 1235 return false; 1236 } 1237 1238 /* The client has disabled rescanning and plans to do it itself. */ 1239 if (df->changeable_flags & DF_NO_INSN_RESCAN) 1240 return false; 1241 1242 df_grow_bb_info (df_scan); 1243 df_grow_reg_info (); 1244 1245 insn_info = DF_INSN_UID_SAFE_GET (uid); 1246 1247 /* The client has deferred rescanning. */ 1248 if (df->changeable_flags & DF_DEFER_INSN_RESCAN) 1249 { 1250 if (!insn_info) 1251 { 1252 insn_info = df_insn_create_insn_record (insn); 1253 insn_info->defs = df_null_ref_rec; 1254 insn_info->uses = df_null_ref_rec; 1255 insn_info->eq_uses = df_null_ref_rec; 1256 insn_info->mw_hardregs = df_null_mw_rec; 1257 } 1258 if (dump_file) 1259 fprintf (dump_file, "deferring rescan insn with uid = %d.\n", uid); 1260 1261 bitmap_clear_bit (df->insns_to_delete, uid); 1262 bitmap_clear_bit (df->insns_to_notes_rescan, uid); 1263 bitmap_set_bit (df->insns_to_rescan, INSN_UID (insn)); 1264 return false; 1265 } 1266 1267 collection_rec.def_vec = VEC_alloc (df_ref, stack, 128); 1268 collection_rec.use_vec = VEC_alloc (df_ref, stack, 32); 1269 collection_rec.eq_use_vec = VEC_alloc (df_ref, stack, 32); 1270 collection_rec.mw_vec = VEC_alloc (df_mw_hardreg_ptr, stack, 32); 1271 1272 bitmap_clear_bit (df->insns_to_delete, uid); 1273 bitmap_clear_bit (df->insns_to_rescan, uid); 1274 bitmap_clear_bit (df->insns_to_notes_rescan, uid); 1275 if (insn_info) 1276 { 1277 int luid; 1278 bool the_same = df_insn_refs_verify (&collection_rec, bb, insn, false); 1279 /* If there's no change, return false. */ 1280 if (the_same) 1281 { 1282 df_free_collection_rec (&collection_rec); 1283 if (dump_file) 1284 fprintf (dump_file, "verify found no changes in insn with uid = %d.\n", uid); 1285 return false; 1286 } 1287 if (dump_file) 1288 fprintf (dump_file, "rescanning insn with uid = %d.\n", uid); 1289 1290 /* There's change - we need to delete the existing info. 1291 Since the insn isn't moved, we can salvage its LUID. */ 1292 luid = DF_INSN_LUID (insn); 1293 df_insn_delete (NULL, uid); 1294 df_insn_create_insn_record (insn); 1295 DF_INSN_LUID (insn) = luid; 1296 } 1297 else 1298 { 1299 struct df_insn_info *insn_info = df_insn_create_insn_record (insn); 1300 df_insn_refs_collect (&collection_rec, bb, insn_info); 1301 if (dump_file) 1302 fprintf (dump_file, "scanning new insn with uid = %d.\n", uid); 1303 } 1304 1305 df_refs_add_to_chains (&collection_rec, bb, insn); 1306 if (DEBUG_INSN_P (insn)) 1307 df_set_bb_dirty_nonlr (bb); 1308 else 1309 df_set_bb_dirty (bb); 1310 1311 VEC_free (df_ref, stack, collection_rec.def_vec); 1312 VEC_free (df_ref, stack, collection_rec.use_vec); 1313 VEC_free (df_ref, stack, collection_rec.eq_use_vec); 1314 VEC_free (df_mw_hardreg_ptr, stack, collection_rec.mw_vec); 1315 1316 return true; 1317} 1318 1319/* Same as df_insn_rescan, but don't mark the basic block as 1320 dirty. */ 1321 1322bool 1323df_insn_rescan_debug_internal (rtx insn) 1324{ 1325 unsigned int uid = INSN_UID (insn); 1326 struct df_insn_info *insn_info; 1327 1328 gcc_assert (DEBUG_INSN_P (insn) 1329 && VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn))); 1330 1331 if (!df) 1332 return false; 1333 1334 insn_info = DF_INSN_UID_SAFE_GET (INSN_UID (insn)); 1335 if (!insn_info) 1336 return false; 1337 1338 if (dump_file) 1339 fprintf (dump_file, "deleting debug_insn with uid = %d.\n", uid); 1340 1341 bitmap_clear_bit (df->insns_to_delete, uid); 1342 bitmap_clear_bit (df->insns_to_rescan, uid); 1343 bitmap_clear_bit (df->insns_to_notes_rescan, uid); 1344 1345 if (!insn_info->defs) 1346 return false; 1347 1348 if (insn_info->defs == df_null_ref_rec 1349 && insn_info->uses == df_null_ref_rec 1350 && insn_info->eq_uses == df_null_ref_rec 1351 && insn_info->mw_hardregs == df_null_mw_rec) 1352 return false; 1353 1354 df_mw_hardreg_chain_delete (insn_info->mw_hardregs); 1355 1356 if (df_chain) 1357 { 1358 df_ref_chain_delete_du_chain (insn_info->defs); 1359 df_ref_chain_delete_du_chain (insn_info->uses); 1360 df_ref_chain_delete_du_chain (insn_info->eq_uses); 1361 } 1362 1363 df_ref_chain_delete (insn_info->defs); 1364 df_ref_chain_delete (insn_info->uses); 1365 df_ref_chain_delete (insn_info->eq_uses); 1366 1367 insn_info->defs = df_null_ref_rec; 1368 insn_info->uses = df_null_ref_rec; 1369 insn_info->eq_uses = df_null_ref_rec; 1370 insn_info->mw_hardregs = df_null_mw_rec; 1371 1372 return true; 1373} 1374 1375 1376/* Rescan all of the insns in the function. Note that the artificial 1377 uses and defs are not touched. This function will destroy def-se 1378 or use-def chains. */ 1379 1380void 1381df_insn_rescan_all (void) 1382{ 1383 bool no_insn_rescan = false; 1384 bool defer_insn_rescan = false; 1385 basic_block bb; 1386 bitmap_iterator bi; 1387 unsigned int uid; 1388 bitmap tmp = BITMAP_ALLOC (&df_bitmap_obstack); 1389 1390 if (df->changeable_flags & DF_NO_INSN_RESCAN) 1391 { 1392 df_clear_flags (DF_NO_INSN_RESCAN); 1393 no_insn_rescan = true; 1394 } 1395 1396 if (df->changeable_flags & DF_DEFER_INSN_RESCAN) 1397 { 1398 df_clear_flags (DF_DEFER_INSN_RESCAN); 1399 defer_insn_rescan = true; 1400 } 1401 1402 bitmap_copy (tmp, df->insns_to_delete); 1403 EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi) 1404 { 1405 struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid); 1406 if (insn_info) 1407 df_insn_delete (NULL, uid); 1408 } 1409 1410 BITMAP_FREE (tmp); 1411 bitmap_clear (df->insns_to_delete); 1412 bitmap_clear (df->insns_to_rescan); 1413 bitmap_clear (df->insns_to_notes_rescan); 1414 1415 FOR_EACH_BB (bb) 1416 { 1417 rtx insn; 1418 FOR_BB_INSNS (bb, insn) 1419 { 1420 df_insn_rescan (insn); 1421 } 1422 } 1423 1424 if (no_insn_rescan) 1425 df_set_flags (DF_NO_INSN_RESCAN); 1426 if (defer_insn_rescan) 1427 df_set_flags (DF_DEFER_INSN_RESCAN); 1428} 1429 1430 1431/* Process all of the deferred rescans or deletions. */ 1432 1433void 1434df_process_deferred_rescans (void) 1435{ 1436 bool no_insn_rescan = false; 1437 bool defer_insn_rescan = false; 1438 bitmap_iterator bi; 1439 unsigned int uid; 1440 bitmap tmp = BITMAP_ALLOC (&df_bitmap_obstack); 1441 1442 if (df->changeable_flags & DF_NO_INSN_RESCAN) 1443 { 1444 df_clear_flags (DF_NO_INSN_RESCAN); 1445 no_insn_rescan = true; 1446 } 1447 1448 if (df->changeable_flags & DF_DEFER_INSN_RESCAN) 1449 { 1450 df_clear_flags (DF_DEFER_INSN_RESCAN); 1451 defer_insn_rescan = true; 1452 } 1453 1454 if (dump_file) 1455 fprintf (dump_file, "starting the processing of deferred insns\n"); 1456 1457 bitmap_copy (tmp, df->insns_to_delete); 1458 EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi) 1459 { 1460 struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid); 1461 if (insn_info) 1462 df_insn_delete (NULL, uid); 1463 } 1464 1465 bitmap_copy (tmp, df->insns_to_rescan); 1466 EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi) 1467 { 1468 struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid); 1469 if (insn_info) 1470 df_insn_rescan (insn_info->insn); 1471 } 1472 1473 bitmap_copy (tmp, df->insns_to_notes_rescan); 1474 EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi) 1475 { 1476 struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid); 1477 if (insn_info) 1478 df_notes_rescan (insn_info->insn); 1479 } 1480 1481 if (dump_file) 1482 fprintf (dump_file, "ending the processing of deferred insns\n"); 1483 1484 BITMAP_FREE (tmp); 1485 bitmap_clear (df->insns_to_delete); 1486 bitmap_clear (df->insns_to_rescan); 1487 bitmap_clear (df->insns_to_notes_rescan); 1488 1489 if (no_insn_rescan) 1490 df_set_flags (DF_NO_INSN_RESCAN); 1491 if (defer_insn_rescan) 1492 df_set_flags (DF_DEFER_INSN_RESCAN); 1493 1494 /* If someone changed regs_ever_live during this pass, fix up the 1495 entry and exit blocks. */ 1496 if (df->redo_entry_and_exit) 1497 { 1498 df_update_entry_exit_and_calls (); 1499 df->redo_entry_and_exit = false; 1500 } 1501} 1502 1503 1504/* Count the number of refs. Include the defs if INCLUDE_DEFS. Include 1505 the uses if INCLUDE_USES. Include the eq_uses if 1506 INCLUDE_EQ_USES. */ 1507 1508static unsigned int 1509df_count_refs (bool include_defs, bool include_uses, 1510 bool include_eq_uses) 1511{ 1512 unsigned int regno; 1513 int size = 0; 1514 unsigned int m = df->regs_inited; 1515 1516 for (regno = 0; regno < m; regno++) 1517 { 1518 if (include_defs) 1519 size += DF_REG_DEF_COUNT (regno); 1520 if (include_uses) 1521 size += DF_REG_USE_COUNT (regno); 1522 if (include_eq_uses) 1523 size += DF_REG_EQ_USE_COUNT (regno); 1524 } 1525 return size; 1526} 1527 1528 1529/* Take build ref table for either the uses or defs from the reg-use 1530 or reg-def chains. This version processes the refs in reg order 1531 which is likely to be best if processing the whole function. */ 1532 1533static void 1534df_reorganize_refs_by_reg_by_reg (struct df_ref_info *ref_info, 1535 bool include_defs, 1536 bool include_uses, 1537 bool include_eq_uses) 1538{ 1539 unsigned int m = df->regs_inited; 1540 unsigned int regno; 1541 unsigned int offset = 0; 1542 unsigned int start; 1543 1544 if (df->changeable_flags & DF_NO_HARD_REGS) 1545 { 1546 start = FIRST_PSEUDO_REGISTER; 1547 memset (ref_info->begin, 0, sizeof (int) * FIRST_PSEUDO_REGISTER); 1548 memset (ref_info->count, 0, sizeof (int) * FIRST_PSEUDO_REGISTER); 1549 } 1550 else 1551 start = 0; 1552 1553 ref_info->total_size 1554 = df_count_refs (include_defs, include_uses, include_eq_uses); 1555 1556 df_check_and_grow_ref_info (ref_info, 1); 1557 1558 for (regno = start; regno < m; regno++) 1559 { 1560 int count = 0; 1561 ref_info->begin[regno] = offset; 1562 if (include_defs) 1563 { 1564 df_ref ref = DF_REG_DEF_CHAIN (regno); 1565 while (ref) 1566 { 1567 ref_info->refs[offset] = ref; 1568 DF_REF_ID (ref) = offset++; 1569 count++; 1570 ref = DF_REF_NEXT_REG (ref); 1571 gcc_assert (offset < ref_info->refs_size); 1572 } 1573 } 1574 if (include_uses) 1575 { 1576 df_ref ref = DF_REG_USE_CHAIN (regno); 1577 while (ref) 1578 { 1579 ref_info->refs[offset] = ref; 1580 DF_REF_ID (ref) = offset++; 1581 count++; 1582 ref = DF_REF_NEXT_REG (ref); 1583 gcc_assert (offset < ref_info->refs_size); 1584 } 1585 } 1586 if (include_eq_uses) 1587 { 1588 df_ref ref = DF_REG_EQ_USE_CHAIN (regno); 1589 while (ref) 1590 { 1591 ref_info->refs[offset] = ref; 1592 DF_REF_ID (ref) = offset++; 1593 count++; 1594 ref = DF_REF_NEXT_REG (ref); 1595 gcc_assert (offset < ref_info->refs_size); 1596 } 1597 } 1598 ref_info->count[regno] = count; 1599 } 1600 1601 /* The bitmap size is not decremented when refs are deleted. So 1602 reset it now that we have squished out all of the empty 1603 slots. */ 1604 ref_info->table_size = offset; 1605} 1606 1607 1608/* Take build ref table for either the uses or defs from the reg-use 1609 or reg-def chains. This version processes the refs in insn order 1610 which is likely to be best if processing some segment of the 1611 function. */ 1612 1613static void 1614df_reorganize_refs_by_reg_by_insn (struct df_ref_info *ref_info, 1615 bool include_defs, 1616 bool include_uses, 1617 bool include_eq_uses) 1618{ 1619 bitmap_iterator bi; 1620 unsigned int bb_index; 1621 unsigned int m = df->regs_inited; 1622 unsigned int offset = 0; 1623 unsigned int r; 1624 unsigned int start 1625 = (df->changeable_flags & DF_NO_HARD_REGS) ? FIRST_PSEUDO_REGISTER : 0; 1626 1627 memset (ref_info->begin, 0, sizeof (int) * df->regs_inited); 1628 memset (ref_info->count, 0, sizeof (int) * df->regs_inited); 1629 1630 ref_info->total_size = df_count_refs (include_defs, include_uses, include_eq_uses); 1631 df_check_and_grow_ref_info (ref_info, 1); 1632 1633 EXECUTE_IF_SET_IN_BITMAP (df->blocks_to_analyze, 0, bb_index, bi) 1634 { 1635 basic_block bb = BASIC_BLOCK (bb_index); 1636 rtx insn; 1637 df_ref *ref_rec; 1638 1639 if (include_defs) 1640 for (ref_rec = df_get_artificial_defs (bb_index); *ref_rec; ref_rec++) 1641 { 1642 unsigned int regno = DF_REF_REGNO (*ref_rec); 1643 ref_info->count[regno]++; 1644 } 1645 if (include_uses) 1646 for (ref_rec = df_get_artificial_uses (bb_index); *ref_rec; ref_rec++) 1647 { 1648 unsigned int regno = DF_REF_REGNO (*ref_rec); 1649 ref_info->count[regno]++; 1650 } 1651 1652 FOR_BB_INSNS (bb, insn) 1653 { 1654 if (INSN_P (insn)) 1655 { 1656 unsigned int uid = INSN_UID (insn); 1657 1658 if (include_defs) 1659 for (ref_rec = DF_INSN_UID_DEFS (uid); *ref_rec; ref_rec++) 1660 { 1661 unsigned int regno = DF_REF_REGNO (*ref_rec); 1662 ref_info->count[regno]++; 1663 } 1664 if (include_uses) 1665 for (ref_rec = DF_INSN_UID_USES (uid); *ref_rec; ref_rec++) 1666 { 1667 unsigned int regno = DF_REF_REGNO (*ref_rec); 1668 ref_info->count[regno]++; 1669 } 1670 if (include_eq_uses) 1671 for (ref_rec = DF_INSN_UID_EQ_USES (uid); *ref_rec; ref_rec++) 1672 { 1673 unsigned int regno = DF_REF_REGNO (*ref_rec); 1674 ref_info->count[regno]++; 1675 } 1676 } 1677 } 1678 } 1679 1680 for (r = start; r < m; r++) 1681 { 1682 ref_info->begin[r] = offset; 1683 offset += ref_info->count[r]; 1684 ref_info->count[r] = 0; 1685 } 1686 1687 EXECUTE_IF_SET_IN_BITMAP (df->blocks_to_analyze, 0, bb_index, bi) 1688 { 1689 basic_block bb = BASIC_BLOCK (bb_index); 1690 rtx insn; 1691 df_ref *ref_rec; 1692 1693 if (include_defs) 1694 for (ref_rec = df_get_artificial_defs (bb_index); *ref_rec; ref_rec++) 1695 { 1696 df_ref ref = *ref_rec; 1697 unsigned int regno = DF_REF_REGNO (ref); 1698 if (regno >= start) 1699 { 1700 unsigned int id 1701 = ref_info->begin[regno] + ref_info->count[regno]++; 1702 DF_REF_ID (ref) = id; 1703 ref_info->refs[id] = ref; 1704 } 1705 } 1706 if (include_uses) 1707 for (ref_rec = df_get_artificial_uses (bb_index); *ref_rec; ref_rec++) 1708 { 1709 df_ref ref = *ref_rec; 1710 unsigned int regno = DF_REF_REGNO (ref); 1711 if (regno >= start) 1712 { 1713 unsigned int id 1714 = ref_info->begin[regno] + ref_info->count[regno]++; 1715 DF_REF_ID (ref) = id; 1716 ref_info->refs[id] = ref; 1717 } 1718 } 1719 1720 FOR_BB_INSNS (bb, insn) 1721 { 1722 if (INSN_P (insn)) 1723 { 1724 unsigned int uid = INSN_UID (insn); 1725 1726 if (include_defs) 1727 for (ref_rec = DF_INSN_UID_DEFS (uid); *ref_rec; ref_rec++) 1728 { 1729 df_ref ref = *ref_rec; 1730 unsigned int regno = DF_REF_REGNO (ref); 1731 if (regno >= start) 1732 { 1733 unsigned int id 1734 = ref_info->begin[regno] + ref_info->count[regno]++; 1735 DF_REF_ID (ref) = id; 1736 ref_info->refs[id] = ref; 1737 } 1738 } 1739 if (include_uses) 1740 for (ref_rec = DF_INSN_UID_USES (uid); *ref_rec; ref_rec++) 1741 { 1742 df_ref ref = *ref_rec; 1743 unsigned int regno = DF_REF_REGNO (ref); 1744 if (regno >= start) 1745 { 1746 unsigned int id 1747 = ref_info->begin[regno] + ref_info->count[regno]++; 1748 DF_REF_ID (ref) = id; 1749 ref_info->refs[id] = ref; 1750 } 1751 } 1752 if (include_eq_uses) 1753 for (ref_rec = DF_INSN_UID_EQ_USES (uid); *ref_rec; ref_rec++) 1754 { 1755 df_ref ref = *ref_rec; 1756 unsigned int regno = DF_REF_REGNO (ref); 1757 if (regno >= start) 1758 { 1759 unsigned int id 1760 = ref_info->begin[regno] + ref_info->count[regno]++; 1761 DF_REF_ID (ref) = id; 1762 ref_info->refs[id] = ref; 1763 } 1764 } 1765 } 1766 } 1767 } 1768 1769 /* The bitmap size is not decremented when refs are deleted. So 1770 reset it now that we have squished out all of the empty 1771 slots. */ 1772 1773 ref_info->table_size = offset; 1774} 1775 1776/* Take build ref table for either the uses or defs from the reg-use 1777 or reg-def chains. */ 1778 1779static void 1780df_reorganize_refs_by_reg (struct df_ref_info *ref_info, 1781 bool include_defs, 1782 bool include_uses, 1783 bool include_eq_uses) 1784{ 1785 if (df->analyze_subset) 1786 df_reorganize_refs_by_reg_by_insn (ref_info, include_defs, 1787 include_uses, include_eq_uses); 1788 else 1789 df_reorganize_refs_by_reg_by_reg (ref_info, include_defs, 1790 include_uses, include_eq_uses); 1791} 1792 1793 1794/* Add the refs in REF_VEC to the table in REF_INFO starting at OFFSET. */ 1795static unsigned int 1796df_add_refs_to_table (unsigned int offset, 1797 struct df_ref_info *ref_info, 1798 df_ref *ref_vec) 1799{ 1800 while (*ref_vec) 1801 { 1802 df_ref ref = *ref_vec; 1803 if ((!(df->changeable_flags & DF_NO_HARD_REGS)) 1804 || (DF_REF_REGNO (ref) >= FIRST_PSEUDO_REGISTER)) 1805 { 1806 ref_info->refs[offset] = ref; 1807 DF_REF_ID (*ref_vec) = offset++; 1808 } 1809 ref_vec++; 1810 } 1811 return offset; 1812} 1813 1814 1815/* Count the number of refs in all of the insns of BB. Include the 1816 defs if INCLUDE_DEFS. Include the uses if INCLUDE_USES. Include the 1817 eq_uses if INCLUDE_EQ_USES. */ 1818 1819static unsigned int 1820df_reorganize_refs_by_insn_bb (basic_block bb, unsigned int offset, 1821 struct df_ref_info *ref_info, 1822 bool include_defs, bool include_uses, 1823 bool include_eq_uses) 1824{ 1825 rtx insn; 1826 1827 if (include_defs) 1828 offset = df_add_refs_to_table (offset, ref_info, 1829 df_get_artificial_defs (bb->index)); 1830 if (include_uses) 1831 offset = df_add_refs_to_table (offset, ref_info, 1832 df_get_artificial_uses (bb->index)); 1833 1834 FOR_BB_INSNS (bb, insn) 1835 if (INSN_P (insn)) 1836 { 1837 unsigned int uid = INSN_UID (insn); 1838 if (include_defs) 1839 offset = df_add_refs_to_table (offset, ref_info, 1840 DF_INSN_UID_DEFS (uid)); 1841 if (include_uses) 1842 offset = df_add_refs_to_table (offset, ref_info, 1843 DF_INSN_UID_USES (uid)); 1844 if (include_eq_uses) 1845 offset = df_add_refs_to_table (offset, ref_info, 1846 DF_INSN_UID_EQ_USES (uid)); 1847 } 1848 return offset; 1849} 1850 1851 1852/* Organize the refs by insn into the table in REF_INFO. If 1853 blocks_to_analyze is defined, use that set, otherwise the entire 1854 program. Include the defs if INCLUDE_DEFS. Include the uses if 1855 INCLUDE_USES. Include the eq_uses if INCLUDE_EQ_USES. */ 1856 1857static void 1858df_reorganize_refs_by_insn (struct df_ref_info *ref_info, 1859 bool include_defs, bool include_uses, 1860 bool include_eq_uses) 1861{ 1862 basic_block bb; 1863 unsigned int offset = 0; 1864 1865 ref_info->total_size = df_count_refs (include_defs, include_uses, include_eq_uses); 1866 df_check_and_grow_ref_info (ref_info, 1); 1867 if (df->blocks_to_analyze) 1868 { 1869 bitmap_iterator bi; 1870 unsigned int index; 1871 1872 EXECUTE_IF_SET_IN_BITMAP (df->blocks_to_analyze, 0, index, bi) 1873 { 1874 offset = df_reorganize_refs_by_insn_bb (BASIC_BLOCK (index), offset, ref_info, 1875 include_defs, include_uses, 1876 include_eq_uses); 1877 } 1878 1879 ref_info->table_size = offset; 1880 } 1881 else 1882 { 1883 FOR_ALL_BB (bb) 1884 offset = df_reorganize_refs_by_insn_bb (bb, offset, ref_info, 1885 include_defs, include_uses, 1886 include_eq_uses); 1887 ref_info->table_size = offset; 1888 } 1889} 1890 1891 1892/* If the use refs in DF are not organized, reorganize them. */ 1893 1894void 1895df_maybe_reorganize_use_refs (enum df_ref_order order) 1896{ 1897 if (order == df->use_info.ref_order) 1898 return; 1899 1900 switch (order) 1901 { 1902 case DF_REF_ORDER_BY_REG: 1903 df_reorganize_refs_by_reg (&df->use_info, false, true, false); 1904 break; 1905 1906 case DF_REF_ORDER_BY_REG_WITH_NOTES: 1907 df_reorganize_refs_by_reg (&df->use_info, false, true, true); 1908 break; 1909 1910 case DF_REF_ORDER_BY_INSN: 1911 df_reorganize_refs_by_insn (&df->use_info, false, true, false); 1912 break; 1913 1914 case DF_REF_ORDER_BY_INSN_WITH_NOTES: 1915 df_reorganize_refs_by_insn (&df->use_info, false, true, true); 1916 break; 1917 1918 case DF_REF_ORDER_NO_TABLE: 1919 free (df->use_info.refs); 1920 df->use_info.refs = NULL; 1921 df->use_info.refs_size = 0; 1922 break; 1923 1924 case DF_REF_ORDER_UNORDERED: 1925 case DF_REF_ORDER_UNORDERED_WITH_NOTES: 1926 gcc_unreachable (); 1927 break; 1928 } 1929 1930 df->use_info.ref_order = order; 1931} 1932 1933 1934/* If the def refs in DF are not organized, reorganize them. */ 1935 1936void 1937df_maybe_reorganize_def_refs (enum df_ref_order order) 1938{ 1939 if (order == df->def_info.ref_order) 1940 return; 1941 1942 switch (order) 1943 { 1944 case DF_REF_ORDER_BY_REG: 1945 df_reorganize_refs_by_reg (&df->def_info, true, false, false); 1946 break; 1947 1948 case DF_REF_ORDER_BY_INSN: 1949 df_reorganize_refs_by_insn (&df->def_info, true, false, false); 1950 break; 1951 1952 case DF_REF_ORDER_NO_TABLE: 1953 free (df->def_info.refs); 1954 df->def_info.refs = NULL; 1955 df->def_info.refs_size = 0; 1956 break; 1957 1958 case DF_REF_ORDER_BY_INSN_WITH_NOTES: 1959 case DF_REF_ORDER_BY_REG_WITH_NOTES: 1960 case DF_REF_ORDER_UNORDERED: 1961 case DF_REF_ORDER_UNORDERED_WITH_NOTES: 1962 gcc_unreachable (); 1963 break; 1964 } 1965 1966 df->def_info.ref_order = order; 1967} 1968 1969 1970/* Change all of the basic block references in INSN to use the insn's 1971 current basic block. This function is called from routines that move 1972 instructions from one block to another. */ 1973 1974void 1975df_insn_change_bb (rtx insn, basic_block new_bb) 1976{ 1977 basic_block old_bb = BLOCK_FOR_INSN (insn); 1978 struct df_insn_info *insn_info; 1979 unsigned int uid = INSN_UID (insn); 1980 1981 if (old_bb == new_bb) 1982 return; 1983 1984 set_block_for_insn (insn, new_bb); 1985 1986 if (!df) 1987 return; 1988 1989 if (dump_file) 1990 fprintf (dump_file, "changing bb of uid %d\n", uid); 1991 1992 insn_info = DF_INSN_UID_SAFE_GET (uid); 1993 if (insn_info == NULL) 1994 { 1995 if (dump_file) 1996 fprintf (dump_file, " unscanned insn\n"); 1997 df_insn_rescan (insn); 1998 return; 1999 } 2000 2001 if (!INSN_P (insn)) 2002 return; 2003 2004 df_set_bb_dirty (new_bb); 2005 if (old_bb) 2006 { 2007 if (dump_file) 2008 fprintf (dump_file, " from %d to %d\n", 2009 old_bb->index, new_bb->index); 2010 df_set_bb_dirty (old_bb); 2011 } 2012 else 2013 if (dump_file) 2014 fprintf (dump_file, " to %d\n", new_bb->index); 2015} 2016 2017 2018/* Helper function for df_ref_change_reg_with_loc. */ 2019 2020static void 2021df_ref_change_reg_with_loc_1 (struct df_reg_info *old_df, 2022 struct df_reg_info *new_df, 2023 int new_regno, rtx loc) 2024{ 2025 df_ref the_ref = old_df->reg_chain; 2026 2027 while (the_ref) 2028 { 2029 if ((!DF_REF_IS_ARTIFICIAL (the_ref)) 2030 && (DF_REF_LOC (the_ref)) 2031 && (*DF_REF_LOC (the_ref) == loc)) 2032 { 2033 df_ref next_ref = DF_REF_NEXT_REG (the_ref); 2034 df_ref prev_ref = DF_REF_PREV_REG (the_ref); 2035 df_ref *ref_vec, *ref_vec_t; 2036 struct df_insn_info *insn_info = DF_REF_INSN_INFO (the_ref); 2037 unsigned int count = 0; 2038 2039 DF_REF_REGNO (the_ref) = new_regno; 2040 DF_REF_REG (the_ref) = regno_reg_rtx[new_regno]; 2041 2042 /* Pull the_ref out of the old regno chain. */ 2043 if (prev_ref) 2044 DF_REF_NEXT_REG (prev_ref) = next_ref; 2045 else 2046 old_df->reg_chain = next_ref; 2047 if (next_ref) 2048 DF_REF_PREV_REG (next_ref) = prev_ref; 2049 old_df->n_refs--; 2050 2051 /* Put the ref into the new regno chain. */ 2052 DF_REF_PREV_REG (the_ref) = NULL; 2053 DF_REF_NEXT_REG (the_ref) = new_df->reg_chain; 2054 if (new_df->reg_chain) 2055 DF_REF_PREV_REG (new_df->reg_chain) = the_ref; 2056 new_df->reg_chain = the_ref; 2057 new_df->n_refs++; 2058 if (DF_REF_BB (the_ref)) 2059 df_set_bb_dirty (DF_REF_BB (the_ref)); 2060 2061 /* Need to sort the record again that the ref was in because 2062 the regno is a sorting key. First, find the right 2063 record. */ 2064 if (DF_REF_FLAGS (the_ref) & DF_REF_IN_NOTE) 2065 ref_vec = insn_info->eq_uses; 2066 else 2067 ref_vec = insn_info->uses; 2068 if (dump_file) 2069 fprintf (dump_file, "changing reg in insn %d\n", 2070 DF_REF_INSN_UID (the_ref)); 2071 2072 ref_vec_t = ref_vec; 2073 2074 /* Find the length. */ 2075 while (*ref_vec_t) 2076 { 2077 count++; 2078 ref_vec_t++; 2079 } 2080 qsort (ref_vec, count, sizeof (df_ref ), df_ref_compare); 2081 2082 the_ref = next_ref; 2083 } 2084 else 2085 the_ref = DF_REF_NEXT_REG (the_ref); 2086 } 2087} 2088 2089 2090/* Change the regno of all refs that contained LOC from OLD_REGNO to 2091 NEW_REGNO. Refs that do not match LOC are not changed which means 2092 that artificial refs are not changed since they have no loc. This 2093 call is to support the SET_REGNO macro. */ 2094 2095void 2096df_ref_change_reg_with_loc (int old_regno, int new_regno, rtx loc) 2097{ 2098 if ((!df) || (old_regno == -1) || (old_regno == new_regno)) 2099 return; 2100 2101 df_grow_reg_info (); 2102 2103 df_ref_change_reg_with_loc_1 (DF_REG_DEF_GET (old_regno), 2104 DF_REG_DEF_GET (new_regno), new_regno, loc); 2105 df_ref_change_reg_with_loc_1 (DF_REG_USE_GET (old_regno), 2106 DF_REG_USE_GET (new_regno), new_regno, loc); 2107 df_ref_change_reg_with_loc_1 (DF_REG_EQ_USE_GET (old_regno), 2108 DF_REG_EQ_USE_GET (new_regno), new_regno, loc); 2109} 2110 2111 2112/* Delete the mw_hardregs that point into the eq_notes. */ 2113 2114static unsigned int 2115df_mw_hardreg_chain_delete_eq_uses (struct df_insn_info *insn_info) 2116{ 2117 struct df_mw_hardreg **mw_vec = insn_info->mw_hardregs; 2118 unsigned int deleted = 0; 2119 unsigned int count = 0; 2120 struct df_scan_problem_data *problem_data 2121 = (struct df_scan_problem_data *) df_scan->problem_data; 2122 2123 if (!*mw_vec) 2124 return 0; 2125 2126 while (*mw_vec) 2127 { 2128 if ((*mw_vec)->flags & DF_REF_IN_NOTE) 2129 { 2130 struct df_mw_hardreg **temp_vec = mw_vec; 2131 2132 pool_free (problem_data->mw_reg_pool, *mw_vec); 2133 temp_vec = mw_vec; 2134 /* Shove the remaining ones down one to fill the gap. While 2135 this looks n**2, it is highly unusual to have any mw regs 2136 in eq_notes and the chances of more than one are almost 2137 non existent. */ 2138 while (*temp_vec) 2139 { 2140 *temp_vec = *(temp_vec + 1); 2141 temp_vec++; 2142 } 2143 deleted++; 2144 } 2145 else 2146 { 2147 mw_vec++; 2148 count++; 2149 } 2150 } 2151 2152 if (count == 0) 2153 { 2154 df_scan_free_mws_vec (insn_info->mw_hardregs); 2155 insn_info->mw_hardregs = df_null_mw_rec; 2156 return 0; 2157 } 2158 return deleted; 2159} 2160 2161 2162/* Rescan only the REG_EQUIV/REG_EQUAL notes part of INSN. */ 2163 2164void 2165df_notes_rescan (rtx insn) 2166{ 2167 struct df_insn_info *insn_info; 2168 unsigned int uid = INSN_UID (insn); 2169 2170 if (!df) 2171 return; 2172 2173 /* The client has disabled rescanning and plans to do it itself. */ 2174 if (df->changeable_flags & DF_NO_INSN_RESCAN) 2175 return; 2176 2177 /* Do nothing if the insn hasn't been emitted yet. */ 2178 if (!BLOCK_FOR_INSN (insn)) 2179 return; 2180 2181 df_grow_bb_info (df_scan); 2182 df_grow_reg_info (); 2183 2184 insn_info = DF_INSN_UID_SAFE_GET (INSN_UID(insn)); 2185 2186 /* The client has deferred rescanning. */ 2187 if (df->changeable_flags & DF_DEFER_INSN_RESCAN) 2188 { 2189 if (!insn_info) 2190 { 2191 insn_info = df_insn_create_insn_record (insn); 2192 insn_info->defs = df_null_ref_rec; 2193 insn_info->uses = df_null_ref_rec; 2194 insn_info->eq_uses = df_null_ref_rec; 2195 insn_info->mw_hardregs = df_null_mw_rec; 2196 } 2197 2198 bitmap_clear_bit (df->insns_to_delete, uid); 2199 /* If the insn is set to be rescanned, it does not need to also 2200 be notes rescanned. */ 2201 if (!bitmap_bit_p (df->insns_to_rescan, uid)) 2202 bitmap_set_bit (df->insns_to_notes_rescan, INSN_UID (insn)); 2203 return; 2204 } 2205 2206 bitmap_clear_bit (df->insns_to_delete, uid); 2207 bitmap_clear_bit (df->insns_to_notes_rescan, uid); 2208 2209 if (insn_info) 2210 { 2211 basic_block bb = BLOCK_FOR_INSN (insn); 2212 rtx note; 2213 struct df_collection_rec collection_rec; 2214 unsigned int num_deleted; 2215 unsigned int mw_len; 2216 2217 memset (&collection_rec, 0, sizeof (struct df_collection_rec)); 2218 collection_rec.eq_use_vec = VEC_alloc (df_ref, stack, 32); 2219 collection_rec.mw_vec = VEC_alloc (df_mw_hardreg_ptr, stack, 32); 2220 2221 num_deleted = df_mw_hardreg_chain_delete_eq_uses (insn_info); 2222 df_ref_chain_delete (insn_info->eq_uses); 2223 insn_info->eq_uses = NULL; 2224 2225 /* Process REG_EQUIV/REG_EQUAL notes */ 2226 for (note = REG_NOTES (insn); note; 2227 note = XEXP (note, 1)) 2228 { 2229 switch (REG_NOTE_KIND (note)) 2230 { 2231 case REG_EQUIV: 2232 case REG_EQUAL: 2233 df_uses_record (DF_REF_REGULAR, &collection_rec, 2234 &XEXP (note, 0), DF_REF_REG_USE, 2235 bb, insn_info, DF_REF_IN_NOTE, -1, -1, VOIDmode); 2236 default: 2237 break; 2238 } 2239 } 2240 2241 /* Find some place to put any new mw_hardregs. */ 2242 df_canonize_collection_rec (&collection_rec); 2243 mw_len = VEC_length (df_mw_hardreg_ptr, collection_rec.mw_vec); 2244 if (mw_len) 2245 { 2246 unsigned int count = 0; 2247 struct df_mw_hardreg **mw_rec = insn_info->mw_hardregs; 2248 while (*mw_rec) 2249 { 2250 count++; 2251 mw_rec++; 2252 } 2253 2254 if (count) 2255 { 2256 /* Append to the end of the existing record after 2257 expanding it if necessary. */ 2258 if (mw_len > num_deleted) 2259 { 2260 insn_info->mw_hardregs = 2261 XRESIZEVEC (struct df_mw_hardreg *, 2262 insn_info->mw_hardregs, 2263 count + 1 + mw_len); 2264 } 2265 memcpy (&insn_info->mw_hardregs[count], 2266 VEC_address (df_mw_hardreg_ptr, collection_rec.mw_vec), 2267 mw_len * sizeof (struct df_mw_hardreg *)); 2268 insn_info->mw_hardregs[count + mw_len] = NULL; 2269 qsort (insn_info->mw_hardregs, count + mw_len, 2270 sizeof (struct df_mw_hardreg *), df_mw_compare); 2271 } 2272 else 2273 { 2274 /* No vector there. */ 2275 insn_info->mw_hardregs 2276 = XNEWVEC (struct df_mw_hardreg*, 1 + mw_len); 2277 memcpy (insn_info->mw_hardregs, 2278 VEC_address (df_mw_hardreg_ptr, collection_rec.mw_vec), 2279 mw_len * sizeof (struct df_mw_hardreg *)); 2280 insn_info->mw_hardregs[mw_len] = NULL; 2281 } 2282 } 2283 /* Get rid of the mw_rec so that df_refs_add_to_chains will 2284 ignore it. */ 2285 VEC_free (df_mw_hardreg_ptr, stack, collection_rec.mw_vec); 2286 df_refs_add_to_chains (&collection_rec, bb, insn); 2287 VEC_free (df_ref, stack, collection_rec.eq_use_vec); 2288 } 2289 else 2290 df_insn_rescan (insn); 2291 2292} 2293 2294 2295/*---------------------------------------------------------------------------- 2296 Hard core instruction scanning code. No external interfaces here, 2297 just a lot of routines that look inside insns. 2298----------------------------------------------------------------------------*/ 2299 2300 2301/* Return true if the contents of two df_ref's are identical. 2302 It ignores DF_REF_MARKER. */ 2303 2304static bool 2305df_ref_equal_p (df_ref ref1, df_ref ref2) 2306{ 2307 if (!ref2) 2308 return false; 2309 2310 if (ref1 == ref2) 2311 return true; 2312 2313 if (DF_REF_CLASS (ref1) != DF_REF_CLASS (ref2) 2314 || DF_REF_REGNO (ref1) != DF_REF_REGNO (ref2) 2315 || DF_REF_REG (ref1) != DF_REF_REG (ref2) 2316 || DF_REF_TYPE (ref1) != DF_REF_TYPE (ref2) 2317 || ((DF_REF_FLAGS (ref1) & ~(DF_REF_REG_MARKER + DF_REF_MW_HARDREG)) 2318 != (DF_REF_FLAGS (ref2) & ~(DF_REF_REG_MARKER + DF_REF_MW_HARDREG))) 2319 || DF_REF_BB (ref1) != DF_REF_BB (ref2) 2320 || DF_REF_INSN_INFO (ref1) != DF_REF_INSN_INFO (ref2)) 2321 return false; 2322 2323 switch (DF_REF_CLASS (ref1)) 2324 { 2325 case DF_REF_ARTIFICIAL: 2326 case DF_REF_BASE: 2327 return true; 2328 2329 case DF_REF_EXTRACT: 2330 if ((DF_REF_EXTRACT_OFFSET (ref1) != DF_REF_EXTRACT_OFFSET (ref2)) 2331 || (DF_REF_EXTRACT_WIDTH (ref1) != DF_REF_EXTRACT_WIDTH (ref2)) 2332 || (DF_REF_EXTRACT_MODE (ref1) != DF_REF_EXTRACT_MODE (ref2))) 2333 return false; 2334 /* fallthru. */ 2335 2336 case DF_REF_REGULAR: 2337 return DF_REF_LOC (ref1) == DF_REF_LOC (ref2); 2338 2339 default: 2340 gcc_unreachable (); 2341 } 2342 return false; 2343} 2344 2345 2346/* Compare REF1 and REF2 for sorting. This is only called from places 2347 where all of the refs are of the same type, in the same insn, and 2348 have the same bb. So these fields are not checked. */ 2349 2350static int 2351df_ref_compare (const void *r1, const void *r2) 2352{ 2353 const df_ref ref1 = *(const df_ref *)r1; 2354 const df_ref ref2 = *(const df_ref *)r2; 2355 2356 if (ref1 == ref2) 2357 return 0; 2358 2359 if (DF_REF_CLASS (ref1) != DF_REF_CLASS (ref2)) 2360 return (int)DF_REF_CLASS (ref1) - (int)DF_REF_CLASS (ref2); 2361 2362 if (DF_REF_REGNO (ref1) != DF_REF_REGNO (ref2)) 2363 return (int)DF_REF_REGNO (ref1) - (int)DF_REF_REGNO (ref2); 2364 2365 if (DF_REF_TYPE (ref1) != DF_REF_TYPE (ref2)) 2366 return (int)DF_REF_TYPE (ref1) - (int)DF_REF_TYPE (ref2); 2367 2368 if (DF_REF_REG (ref1) != DF_REF_REG (ref2)) 2369 return (int)DF_REF_ORDER (ref1) - (int)DF_REF_ORDER (ref2); 2370 2371 /* Cannot look at the LOC field on artificial refs. */ 2372 if (DF_REF_CLASS (ref1) != DF_REF_ARTIFICIAL 2373 && DF_REF_LOC (ref1) != DF_REF_LOC (ref2)) 2374 return (int)DF_REF_ORDER (ref1) - (int)DF_REF_ORDER (ref2); 2375 2376 if (DF_REF_FLAGS (ref1) != DF_REF_FLAGS (ref2)) 2377 { 2378 /* If two refs are identical except that one of them has is from 2379 a mw and one is not, we need to have the one with the mw 2380 first. */ 2381 if (DF_REF_FLAGS_IS_SET (ref1, DF_REF_MW_HARDREG) == 2382 DF_REF_FLAGS_IS_SET (ref2, DF_REF_MW_HARDREG)) 2383 return DF_REF_FLAGS (ref1) - DF_REF_FLAGS (ref2); 2384 else if (DF_REF_FLAGS_IS_SET (ref1, DF_REF_MW_HARDREG)) 2385 return -1; 2386 else 2387 return 1; 2388 } 2389 2390 /* The classes are the same at this point so it is safe to only look 2391 at ref1. */ 2392 if (DF_REF_CLASS (ref1) == DF_REF_EXTRACT) 2393 { 2394 if (DF_REF_EXTRACT_OFFSET (ref1) != DF_REF_EXTRACT_OFFSET (ref2)) 2395 return DF_REF_EXTRACT_OFFSET (ref1) - DF_REF_EXTRACT_OFFSET (ref2); 2396 if (DF_REF_EXTRACT_WIDTH (ref1) != DF_REF_EXTRACT_WIDTH (ref2)) 2397 return DF_REF_EXTRACT_WIDTH (ref1) - DF_REF_EXTRACT_WIDTH (ref2); 2398 if (DF_REF_EXTRACT_MODE (ref1) != DF_REF_EXTRACT_MODE (ref2)) 2399 return DF_REF_EXTRACT_MODE (ref1) - DF_REF_EXTRACT_MODE (ref2); 2400 } 2401 return (int)DF_REF_ORDER (ref1) - (int)DF_REF_ORDER (ref2); 2402} 2403 2404static void 2405df_swap_refs (VEC(df_ref,stack) **ref_vec, int i, int j) 2406{ 2407 df_ref tmp = VEC_index (df_ref, *ref_vec, i); 2408 VEC_replace (df_ref, *ref_vec, i, VEC_index (df_ref, *ref_vec, j)); 2409 VEC_replace (df_ref, *ref_vec, j, tmp); 2410} 2411 2412/* Sort and compress a set of refs. */ 2413 2414static void 2415df_sort_and_compress_refs (VEC(df_ref,stack) **ref_vec) 2416{ 2417 unsigned int count; 2418 unsigned int i; 2419 unsigned int dist = 0; 2420 2421 count = VEC_length (df_ref, *ref_vec); 2422 2423 /* If there are 1 or 0 elements, there is nothing to do. */ 2424 if (count < 2) 2425 return; 2426 else if (count == 2) 2427 { 2428 df_ref r0 = VEC_index (df_ref, *ref_vec, 0); 2429 df_ref r1 = VEC_index (df_ref, *ref_vec, 1); 2430 if (df_ref_compare (&r0, &r1) > 0) 2431 df_swap_refs (ref_vec, 0, 1); 2432 } 2433 else 2434 { 2435 for (i = 0; i < count - 1; i++) 2436 { 2437 df_ref r0 = VEC_index (df_ref, *ref_vec, i); 2438 df_ref r1 = VEC_index (df_ref, *ref_vec, i + 1); 2439 if (df_ref_compare (&r0, &r1) >= 0) 2440 break; 2441 } 2442 /* If the array is already strictly ordered, 2443 which is the most common case for large COUNT case 2444 (which happens for CALL INSNs), 2445 no need to sort and filter out duplicate. 2446 Simply return the count. 2447 Make sure DF_GET_ADD_REFS adds refs in the increasing order 2448 of DF_REF_COMPARE. */ 2449 if (i == count - 1) 2450 return; 2451 qsort (VEC_address (df_ref, *ref_vec), count, sizeof (df_ref), 2452 df_ref_compare); 2453 } 2454 2455 for (i=0; i<count-dist; i++) 2456 { 2457 /* Find the next ref that is not equal to the current ref. */ 2458 while (i + dist + 1 < count 2459 && df_ref_equal_p (VEC_index (df_ref, *ref_vec, i), 2460 VEC_index (df_ref, *ref_vec, i + dist + 1))) 2461 { 2462 df_free_ref (VEC_index (df_ref, *ref_vec, i + dist + 1)); 2463 dist++; 2464 } 2465 /* Copy it down to the next position. */ 2466 if (dist && i + dist + 1 < count) 2467 VEC_replace (df_ref, *ref_vec, i + 1, 2468 VEC_index (df_ref, *ref_vec, i + dist + 1)); 2469 } 2470 2471 count -= dist; 2472 VEC_truncate (df_ref, *ref_vec, count); 2473} 2474 2475 2476/* Return true if the contents of two df_ref's are identical. 2477 It ignores DF_REF_MARKER. */ 2478 2479static bool 2480df_mw_equal_p (struct df_mw_hardreg *mw1, struct df_mw_hardreg *mw2) 2481{ 2482 if (!mw2) 2483 return false; 2484 return (mw1 == mw2) || 2485 (mw1->mw_reg == mw2->mw_reg 2486 && mw1->type == mw2->type 2487 && mw1->flags == mw2->flags 2488 && mw1->start_regno == mw2->start_regno 2489 && mw1->end_regno == mw2->end_regno); 2490} 2491 2492 2493/* Compare MW1 and MW2 for sorting. */ 2494 2495static int 2496df_mw_compare (const void *m1, const void *m2) 2497{ 2498 const struct df_mw_hardreg *const mw1 = *(const struct df_mw_hardreg *const*)m1; 2499 const struct df_mw_hardreg *const mw2 = *(const struct df_mw_hardreg *const*)m2; 2500 2501 if (mw1 == mw2) 2502 return 0; 2503 2504 if (mw1->type != mw2->type) 2505 return mw1->type - mw2->type; 2506 2507 if (mw1->flags != mw2->flags) 2508 return mw1->flags - mw2->flags; 2509 2510 if (mw1->start_regno != mw2->start_regno) 2511 return mw1->start_regno - mw2->start_regno; 2512 2513 if (mw1->end_regno != mw2->end_regno) 2514 return mw1->end_regno - mw2->end_regno; 2515 2516 if (mw1->mw_reg != mw2->mw_reg) 2517 return mw1->mw_order - mw2->mw_order; 2518 2519 return 0; 2520} 2521 2522 2523/* Sort and compress a set of refs. */ 2524 2525static void 2526df_sort_and_compress_mws (VEC(df_mw_hardreg_ptr,stack) **mw_vec) 2527{ 2528 unsigned int count; 2529 struct df_scan_problem_data *problem_data 2530 = (struct df_scan_problem_data *) df_scan->problem_data; 2531 unsigned int i; 2532 unsigned int dist = 0; 2533 2534 count = VEC_length (df_mw_hardreg_ptr, *mw_vec); 2535 if (count < 2) 2536 return; 2537 else if (count == 2) 2538 { 2539 struct df_mw_hardreg *m0 = VEC_index (df_mw_hardreg_ptr, *mw_vec, 0); 2540 struct df_mw_hardreg *m1 = VEC_index (df_mw_hardreg_ptr, *mw_vec, 1); 2541 if (df_mw_compare (&m0, &m1) > 0) 2542 { 2543 struct df_mw_hardreg *tmp = VEC_index (df_mw_hardreg_ptr, 2544 *mw_vec, 0); 2545 VEC_replace (df_mw_hardreg_ptr, *mw_vec, 0, 2546 VEC_index (df_mw_hardreg_ptr, *mw_vec, 1)); 2547 VEC_replace (df_mw_hardreg_ptr, *mw_vec, 1, tmp); 2548 } 2549 } 2550 else 2551 qsort (VEC_address (df_mw_hardreg_ptr, *mw_vec), count, 2552 sizeof (struct df_mw_hardreg *), df_mw_compare); 2553 2554 for (i=0; i<count-dist; i++) 2555 { 2556 /* Find the next ref that is not equal to the current ref. */ 2557 while (i + dist + 1 < count 2558 && df_mw_equal_p (VEC_index (df_mw_hardreg_ptr, *mw_vec, i), 2559 VEC_index (df_mw_hardreg_ptr, *mw_vec, 2560 i + dist + 1))) 2561 { 2562 pool_free (problem_data->mw_reg_pool, 2563 VEC_index (df_mw_hardreg_ptr, *mw_vec, i + dist + 1)); 2564 dist++; 2565 } 2566 /* Copy it down to the next position. */ 2567 if (dist && i + dist + 1 < count) 2568 VEC_replace (df_mw_hardreg_ptr, *mw_vec, i + 1, 2569 VEC_index (df_mw_hardreg_ptr, *mw_vec, i + dist + 1)); 2570 } 2571 2572 count -= dist; 2573 VEC_truncate (df_mw_hardreg_ptr, *mw_vec, count); 2574} 2575 2576 2577/* Sort and remove duplicates from the COLLECTION_REC. */ 2578 2579static void 2580df_canonize_collection_rec (struct df_collection_rec *collection_rec) 2581{ 2582 df_sort_and_compress_refs (&collection_rec->def_vec); 2583 df_sort_and_compress_refs (&collection_rec->use_vec); 2584 df_sort_and_compress_refs (&collection_rec->eq_use_vec); 2585 df_sort_and_compress_mws (&collection_rec->mw_vec); 2586} 2587 2588 2589/* Add the new df_ref to appropriate reg_info/ref_info chains. */ 2590 2591static void 2592df_install_ref (df_ref this_ref, 2593 struct df_reg_info *reg_info, 2594 struct df_ref_info *ref_info, 2595 bool add_to_table) 2596{ 2597 unsigned int regno = DF_REF_REGNO (this_ref); 2598 /* Add the ref to the reg_{def,use,eq_use} chain. */ 2599 df_ref head = reg_info->reg_chain; 2600 2601 reg_info->reg_chain = this_ref; 2602 reg_info->n_refs++; 2603 2604 if (DF_REF_FLAGS_IS_SET (this_ref, DF_HARD_REG_LIVE)) 2605 { 2606 gcc_assert (regno < FIRST_PSEUDO_REGISTER); 2607 df->hard_regs_live_count[regno]++; 2608 } 2609 2610 gcc_assert (DF_REF_NEXT_REG (this_ref) == NULL 2611 && DF_REF_PREV_REG (this_ref) == NULL); 2612 2613 DF_REF_NEXT_REG (this_ref) = head; 2614 2615 /* We cannot actually link to the head of the chain. */ 2616 DF_REF_PREV_REG (this_ref) = NULL; 2617 2618 if (head) 2619 DF_REF_PREV_REG (head) = this_ref; 2620 2621 if (add_to_table) 2622 { 2623 gcc_assert (ref_info->ref_order != DF_REF_ORDER_NO_TABLE); 2624 df_check_and_grow_ref_info (ref_info, 1); 2625 DF_REF_ID (this_ref) = ref_info->table_size; 2626 /* Add the ref to the big array of defs. */ 2627 ref_info->refs[ref_info->table_size] = this_ref; 2628 ref_info->table_size++; 2629 } 2630 else 2631 DF_REF_ID (this_ref) = -1; 2632 2633 ref_info->total_size++; 2634} 2635 2636 2637/* This function takes one of the groups of refs (defs, uses or 2638 eq_uses) and installs the entire group into the insn. It also adds 2639 each of these refs into the appropriate chains. */ 2640 2641static df_ref * 2642df_install_refs (basic_block bb, 2643 VEC(df_ref,stack)* old_vec, 2644 struct df_reg_info **reg_info, 2645 struct df_ref_info *ref_info, 2646 bool is_notes) 2647{ 2648 unsigned int count; 2649 2650 count = VEC_length (df_ref, old_vec); 2651 if (count) 2652 { 2653 df_ref *new_vec = XNEWVEC (df_ref, count + 1); 2654 bool add_to_table; 2655 df_ref this_ref; 2656 unsigned int ix; 2657 2658 switch (ref_info->ref_order) 2659 { 2660 case DF_REF_ORDER_UNORDERED_WITH_NOTES: 2661 case DF_REF_ORDER_BY_REG_WITH_NOTES: 2662 case DF_REF_ORDER_BY_INSN_WITH_NOTES: 2663 ref_info->ref_order = DF_REF_ORDER_UNORDERED_WITH_NOTES; 2664 add_to_table = true; 2665 break; 2666 case DF_REF_ORDER_UNORDERED: 2667 case DF_REF_ORDER_BY_REG: 2668 case DF_REF_ORDER_BY_INSN: 2669 ref_info->ref_order = DF_REF_ORDER_UNORDERED; 2670 add_to_table = !is_notes; 2671 break; 2672 default: 2673 add_to_table = false; 2674 break; 2675 } 2676 2677 /* Do not add if ref is not in the right blocks. */ 2678 if (add_to_table && df->analyze_subset) 2679 add_to_table = bitmap_bit_p (df->blocks_to_analyze, bb->index); 2680 2681 for (ix = 0; VEC_iterate (df_ref, old_vec, ix, this_ref); ++ix) 2682 { 2683 new_vec[ix] = this_ref; 2684 df_install_ref (this_ref, reg_info[DF_REF_REGNO (this_ref)], 2685 ref_info, add_to_table); 2686 } 2687 2688 new_vec[count] = NULL; 2689 return new_vec; 2690 } 2691 else 2692 return df_null_ref_rec; 2693} 2694 2695 2696/* This function takes the mws installs the entire group into the 2697 insn. */ 2698 2699static struct df_mw_hardreg ** 2700df_install_mws (VEC(df_mw_hardreg_ptr,stack) *old_vec) 2701{ 2702 unsigned int count; 2703 2704 count = VEC_length (df_mw_hardreg_ptr, old_vec); 2705 if (count) 2706 { 2707 struct df_mw_hardreg **new_vec 2708 = XNEWVEC (struct df_mw_hardreg*, count + 1); 2709 memcpy (new_vec, VEC_address (df_mw_hardreg_ptr, old_vec), 2710 sizeof (struct df_mw_hardreg*) * count); 2711 new_vec[count] = NULL; 2712 return new_vec; 2713 } 2714 else 2715 return df_null_mw_rec; 2716} 2717 2718 2719/* Add a chain of df_refs to appropriate ref chain/reg_info/ref_info 2720 chains and update other necessary information. */ 2721 2722static void 2723df_refs_add_to_chains (struct df_collection_rec *collection_rec, 2724 basic_block bb, rtx insn) 2725{ 2726 if (insn) 2727 { 2728 struct df_insn_info *insn_rec = DF_INSN_INFO_GET (insn); 2729 /* If there is a vector in the collection rec, add it to the 2730 insn. A null rec is a signal that the caller will handle the 2731 chain specially. */ 2732 if (collection_rec->def_vec) 2733 { 2734 df_scan_free_ref_vec (insn_rec->defs); 2735 insn_rec->defs 2736 = df_install_refs (bb, collection_rec->def_vec, 2737 df->def_regs, 2738 &df->def_info, false); 2739 } 2740 if (collection_rec->use_vec) 2741 { 2742 df_scan_free_ref_vec (insn_rec->uses); 2743 insn_rec->uses 2744 = df_install_refs (bb, collection_rec->use_vec, 2745 df->use_regs, 2746 &df->use_info, false); 2747 } 2748 if (collection_rec->eq_use_vec) 2749 { 2750 df_scan_free_ref_vec (insn_rec->eq_uses); 2751 insn_rec->eq_uses 2752 = df_install_refs (bb, collection_rec->eq_use_vec, 2753 df->eq_use_regs, 2754 &df->use_info, true); 2755 } 2756 if (collection_rec->mw_vec) 2757 { 2758 df_scan_free_mws_vec (insn_rec->mw_hardregs); 2759 insn_rec->mw_hardregs 2760 = df_install_mws (collection_rec->mw_vec); 2761 } 2762 } 2763 else 2764 { 2765 struct df_scan_bb_info *bb_info = df_scan_get_bb_info (bb->index); 2766 2767 df_scan_free_ref_vec (bb_info->artificial_defs); 2768 bb_info->artificial_defs 2769 = df_install_refs (bb, collection_rec->def_vec, 2770 df->def_regs, 2771 &df->def_info, false); 2772 df_scan_free_ref_vec (bb_info->artificial_uses); 2773 bb_info->artificial_uses 2774 = df_install_refs (bb, collection_rec->use_vec, 2775 df->use_regs, 2776 &df->use_info, false); 2777 } 2778} 2779 2780 2781/* Allocate a ref and initialize its fields. 2782 2783 If the REF_FLAGS field contain DF_REF_SIGN_EXTRACT or 2784 DF_REF_ZERO_EXTRACT. WIDTH, OFFSET and MODE are used to access the fields 2785 if they were constants. Otherwise they should be -1 if those flags 2786 were set. */ 2787 2788static df_ref 2789df_ref_create_structure (enum df_ref_class cl, 2790 struct df_collection_rec *collection_rec, 2791 rtx reg, rtx *loc, 2792 basic_block bb, struct df_insn_info *info, 2793 enum df_ref_type ref_type, 2794 int ref_flags, 2795 int width, int offset, enum machine_mode mode) 2796{ 2797 df_ref this_ref = NULL; 2798 int regno = REGNO (GET_CODE (reg) == SUBREG ? SUBREG_REG (reg) : reg); 2799 struct df_scan_problem_data *problem_data 2800 = (struct df_scan_problem_data *) df_scan->problem_data; 2801 2802 switch (cl) 2803 { 2804 case DF_REF_BASE: 2805 this_ref = (df_ref) pool_alloc (problem_data->ref_base_pool); 2806 gcc_assert (loc == NULL); 2807 break; 2808 2809 case DF_REF_ARTIFICIAL: 2810 this_ref = (df_ref) pool_alloc (problem_data->ref_artificial_pool); 2811 this_ref->artificial_ref.bb = bb; 2812 gcc_assert (loc == NULL); 2813 break; 2814 2815 case DF_REF_REGULAR: 2816 this_ref = (df_ref) pool_alloc (problem_data->ref_regular_pool); 2817 this_ref->regular_ref.loc = loc; 2818 gcc_assert (loc); 2819 break; 2820 2821 case DF_REF_EXTRACT: 2822 this_ref = (df_ref) pool_alloc (problem_data->ref_extract_pool); 2823 DF_REF_EXTRACT_WIDTH (this_ref) = width; 2824 DF_REF_EXTRACT_OFFSET (this_ref) = offset; 2825 DF_REF_EXTRACT_MODE (this_ref) = mode; 2826 this_ref->regular_ref.loc = loc; 2827 gcc_assert (loc); 2828 break; 2829 } 2830 2831 DF_REF_CLASS (this_ref) = cl; 2832 DF_REF_ID (this_ref) = -1; 2833 DF_REF_REG (this_ref) = reg; 2834 DF_REF_REGNO (this_ref) = regno; 2835 DF_REF_TYPE (this_ref) = ref_type; 2836 DF_REF_INSN_INFO (this_ref) = info; 2837 DF_REF_CHAIN (this_ref) = NULL; 2838 DF_REF_FLAGS (this_ref) = ref_flags; 2839 DF_REF_NEXT_REG (this_ref) = NULL; 2840 DF_REF_PREV_REG (this_ref) = NULL; 2841 DF_REF_ORDER (this_ref) = df->ref_order++; 2842 2843 /* We need to clear this bit because fwprop, and in the future 2844 possibly other optimizations sometimes create new refs using ond 2845 refs as the model. */ 2846 DF_REF_FLAGS_CLEAR (this_ref, DF_HARD_REG_LIVE); 2847 2848 /* See if this ref needs to have DF_HARD_REG_LIVE bit set. */ 2849 if ((regno < FIRST_PSEUDO_REGISTER) 2850 && (!DF_REF_IS_ARTIFICIAL (this_ref))) 2851 { 2852 if (DF_REF_REG_DEF_P (this_ref)) 2853 { 2854 if (!DF_REF_FLAGS_IS_SET (this_ref, DF_REF_MAY_CLOBBER)) 2855 DF_REF_FLAGS_SET (this_ref, DF_HARD_REG_LIVE); 2856 } 2857 else if (!(TEST_HARD_REG_BIT (elim_reg_set, regno) 2858 && (regno == FRAME_POINTER_REGNUM 2859 || regno == ARG_POINTER_REGNUM))) 2860 DF_REF_FLAGS_SET (this_ref, DF_HARD_REG_LIVE); 2861 } 2862 2863 if (collection_rec) 2864 { 2865 if (DF_REF_REG_DEF_P (this_ref)) 2866 VEC_safe_push (df_ref, stack, collection_rec->def_vec, this_ref); 2867 else if (DF_REF_FLAGS (this_ref) & DF_REF_IN_NOTE) 2868 VEC_safe_push (df_ref, stack, collection_rec->eq_use_vec, this_ref); 2869 else 2870 VEC_safe_push (df_ref, stack, collection_rec->use_vec, this_ref); 2871 } 2872 2873 return this_ref; 2874} 2875 2876 2877/* Create new references of type DF_REF_TYPE for each part of register REG 2878 at address LOC within INSN of BB. 2879 2880 If the REF_FLAGS field contain DF_REF_SIGN_EXTRACT or 2881 DF_REF_ZERO_EXTRACT. WIDTH, OFFSET and MODE are used to access the 2882 fields if they were constants. Otherwise they should be -1 if 2883 those flags were set. */ 2884 2885 2886static void 2887df_ref_record (enum df_ref_class cl, 2888 struct df_collection_rec *collection_rec, 2889 rtx reg, rtx *loc, 2890 basic_block bb, struct df_insn_info *insn_info, 2891 enum df_ref_type ref_type, 2892 int ref_flags, 2893 int width, int offset, enum machine_mode mode) 2894{ 2895 unsigned int regno; 2896 2897 gcc_assert (REG_P (reg) || GET_CODE (reg) == SUBREG); 2898 2899 regno = REGNO (GET_CODE (reg) == SUBREG ? SUBREG_REG (reg) : reg); 2900 if (regno < FIRST_PSEUDO_REGISTER) 2901 { 2902 struct df_mw_hardreg *hardreg = NULL; 2903 struct df_scan_problem_data *problem_data 2904 = (struct df_scan_problem_data *) df_scan->problem_data; 2905 unsigned int i; 2906 unsigned int endregno; 2907 df_ref ref; 2908 2909 if (GET_CODE (reg) == SUBREG) 2910 { 2911 regno += subreg_regno_offset (regno, GET_MODE (SUBREG_REG (reg)), 2912 SUBREG_BYTE (reg), GET_MODE (reg)); 2913 endregno = regno + subreg_nregs (reg); 2914 } 2915 else 2916 endregno = END_HARD_REGNO (reg); 2917 2918 /* If this is a multiword hardreg, we create some extra 2919 datastructures that will enable us to easily build REG_DEAD 2920 and REG_UNUSED notes. */ 2921 if ((endregno != regno + 1) && insn_info) 2922 { 2923 /* Sets to a subreg of a multiword register are partial. 2924 Sets to a non-subreg of a multiword register are not. */ 2925 if (GET_CODE (reg) == SUBREG) 2926 ref_flags |= DF_REF_PARTIAL; 2927 ref_flags |= DF_REF_MW_HARDREG; 2928 2929 hardreg = (struct df_mw_hardreg *) pool_alloc (problem_data->mw_reg_pool); 2930 hardreg->type = ref_type; 2931 hardreg->flags = ref_flags; 2932 hardreg->mw_reg = reg; 2933 hardreg->start_regno = regno; 2934 hardreg->end_regno = endregno - 1; 2935 hardreg->mw_order = df->ref_order++; 2936 VEC_safe_push (df_mw_hardreg_ptr, stack, collection_rec->mw_vec, 2937 hardreg); 2938 } 2939 2940 for (i = regno; i < endregno; i++) 2941 { 2942 ref = df_ref_create_structure (cl, collection_rec, regno_reg_rtx[i], loc, 2943 bb, insn_info, ref_type, ref_flags, 2944 width, offset, mode); 2945 2946 gcc_assert (ORIGINAL_REGNO (DF_REF_REG (ref)) == i); 2947 } 2948 } 2949 else 2950 { 2951 df_ref_create_structure (cl, collection_rec, reg, loc, bb, insn_info, 2952 ref_type, ref_flags, width, offset, mode); 2953 } 2954} 2955 2956 2957/* A set to a non-paradoxical SUBREG for which the number of word_mode units 2958 covered by the outer mode is smaller than that covered by the inner mode, 2959 is a read-modify-write operation. 2960 This function returns true iff the SUBREG X is such a SUBREG. */ 2961 2962bool 2963df_read_modify_subreg_p (rtx x) 2964{ 2965 unsigned int isize, osize; 2966 if (GET_CODE (x) != SUBREG) 2967 return false; 2968 isize = GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))); 2969 osize = GET_MODE_SIZE (GET_MODE (x)); 2970 return isize > osize 2971 && isize > REGMODE_NATURAL_SIZE (GET_MODE (SUBREG_REG (x))); 2972} 2973 2974 2975/* Process all the registers defined in the rtx, X. 2976 Autoincrement/decrement definitions will be picked up by 2977 df_uses_record. */ 2978 2979static void 2980df_def_record_1 (struct df_collection_rec *collection_rec, 2981 rtx x, basic_block bb, struct df_insn_info *insn_info, 2982 int flags) 2983{ 2984 rtx *loc; 2985 rtx dst; 2986 int offset = -1; 2987 int width = -1; 2988 enum machine_mode mode = VOIDmode; 2989 enum df_ref_class cl = DF_REF_REGULAR; 2990 2991 /* We may recursively call ourselves on EXPR_LIST when dealing with PARALLEL 2992 construct. */ 2993 if (GET_CODE (x) == EXPR_LIST || GET_CODE (x) == CLOBBER) 2994 loc = &XEXP (x, 0); 2995 else 2996 loc = &SET_DEST (x); 2997 dst = *loc; 2998 2999 /* It is legal to have a set destination be a parallel. */ 3000 if (GET_CODE (dst) == PARALLEL) 3001 { 3002 int i; 3003 3004 for (i = XVECLEN (dst, 0) - 1; i >= 0; i--) 3005 { 3006 rtx temp = XVECEXP (dst, 0, i); 3007 if (GET_CODE (temp) == EXPR_LIST || GET_CODE (temp) == CLOBBER 3008 || GET_CODE (temp) == SET) 3009 df_def_record_1 (collection_rec, 3010 temp, bb, insn_info, 3011 GET_CODE (temp) == CLOBBER 3012 ? flags | DF_REF_MUST_CLOBBER : flags); 3013 } 3014 return; 3015 } 3016 3017 if (GET_CODE (dst) == STRICT_LOW_PART) 3018 { 3019 flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL | DF_REF_STRICT_LOW_PART; 3020 3021 loc = &XEXP (dst, 0); 3022 dst = *loc; 3023 } 3024 3025 if (GET_CODE (dst) == ZERO_EXTRACT) 3026 { 3027 flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL | DF_REF_ZERO_EXTRACT; 3028 3029 if (CONST_INT_P (XEXP (dst, 1)) 3030 && CONST_INT_P (XEXP (dst, 2))) 3031 { 3032 width = INTVAL (XEXP (dst, 1)); 3033 offset = INTVAL (XEXP (dst, 2)); 3034 mode = GET_MODE (dst); 3035 cl = DF_REF_EXTRACT; 3036 } 3037 3038 loc = &XEXP (dst, 0); 3039 dst = *loc; 3040 } 3041 3042 /* At this point if we do not have a reg or a subreg, just return. */ 3043 if (REG_P (dst)) 3044 { 3045 df_ref_record (cl, collection_rec, 3046 dst, loc, bb, insn_info, DF_REF_REG_DEF, flags, 3047 width, offset, mode); 3048 3049 /* We want to keep sp alive everywhere - by making all 3050 writes to sp also use of sp. */ 3051 if (REGNO (dst) == STACK_POINTER_REGNUM) 3052 df_ref_record (DF_REF_BASE, collection_rec, 3053 dst, NULL, bb, insn_info, DF_REF_REG_USE, flags, 3054 width, offset, mode); 3055 } 3056 else if (GET_CODE (dst) == SUBREG && REG_P (SUBREG_REG (dst))) 3057 { 3058 if (df_read_modify_subreg_p (dst)) 3059 flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL; 3060 3061 flags |= DF_REF_SUBREG; 3062 3063 df_ref_record (cl, collection_rec, 3064 dst, loc, bb, insn_info, DF_REF_REG_DEF, flags, 3065 width, offset, mode); 3066 } 3067} 3068 3069 3070/* Process all the registers defined in the pattern rtx, X. */ 3071 3072static void 3073df_defs_record (struct df_collection_rec *collection_rec, 3074 rtx x, basic_block bb, struct df_insn_info *insn_info, 3075 int flags) 3076{ 3077 RTX_CODE code = GET_CODE (x); 3078 3079 if (code == SET || code == CLOBBER) 3080 { 3081 /* Mark the single def within the pattern. */ 3082 int clobber_flags = flags; 3083 clobber_flags |= (code == CLOBBER) ? DF_REF_MUST_CLOBBER : 0; 3084 df_def_record_1 (collection_rec, x, bb, insn_info, clobber_flags); 3085 } 3086 else if (code == COND_EXEC) 3087 { 3088 df_defs_record (collection_rec, COND_EXEC_CODE (x), 3089 bb, insn_info, DF_REF_CONDITIONAL); 3090 } 3091 else if (code == PARALLEL) 3092 { 3093 int i; 3094 3095 /* Mark the multiple defs within the pattern. */ 3096 for (i = XVECLEN (x, 0) - 1; i >= 0; i--) 3097 df_defs_record (collection_rec, XVECEXP (x, 0, i), bb, insn_info, flags); 3098 } 3099} 3100 3101 3102/* Process all the registers used in the rtx at address LOC. 3103 3104 If the REF_FLAGS field contain DF_REF_SIGN_EXTRACT or 3105 DF_REF_ZERO_EXTRACT. WIDTH, OFFSET and MODE are used to access the 3106 fields if they were constants. Otherwise they should be -1 if 3107 those flags were set. */ 3108 3109static void 3110df_uses_record (enum df_ref_class cl, struct df_collection_rec *collection_rec, 3111 rtx *loc, enum df_ref_type ref_type, 3112 basic_block bb, struct df_insn_info *insn_info, 3113 int flags, 3114 int width, int offset, enum machine_mode mode) 3115{ 3116 RTX_CODE code; 3117 rtx x; 3118 3119 retry: 3120 x = *loc; 3121 if (!x) 3122 return; 3123 code = GET_CODE (x); 3124 switch (code) 3125 { 3126 case LABEL_REF: 3127 case SYMBOL_REF: 3128 case CONST_INT: 3129 case CONST: 3130 case CONST_DOUBLE: 3131 case CONST_FIXED: 3132 case CONST_VECTOR: 3133 case PC: 3134 case CC0: 3135 case ADDR_VEC: 3136 case ADDR_DIFF_VEC: 3137 return; 3138 3139 case CLOBBER: 3140 /* If we are clobbering a MEM, mark any registers inside the address 3141 as being used. */ 3142 if (MEM_P (XEXP (x, 0))) 3143 df_uses_record (cl, collection_rec, 3144 &XEXP (XEXP (x, 0), 0), 3145 DF_REF_REG_MEM_STORE, 3146 bb, insn_info, 3147 flags, width, offset, mode); 3148 3149 /* If we're clobbering a REG then we have a def so ignore. */ 3150 return; 3151 3152 case MEM: 3153 df_uses_record (cl, collection_rec, 3154 &XEXP (x, 0), DF_REF_REG_MEM_LOAD, 3155 bb, insn_info, flags & DF_REF_IN_NOTE, 3156 width, offset, mode); 3157 return; 3158 3159 case SUBREG: 3160 /* While we're here, optimize this case. */ 3161 flags |= DF_REF_PARTIAL; 3162 /* In case the SUBREG is not of a REG, do not optimize. */ 3163 if (!REG_P (SUBREG_REG (x))) 3164 { 3165 loc = &SUBREG_REG (x); 3166 df_uses_record (cl, collection_rec, loc, ref_type, bb, insn_info, flags, 3167 width, offset, mode); 3168 return; 3169 } 3170 /* ... Fall through ... */ 3171 3172 case REG: 3173 df_ref_record (cl, collection_rec, 3174 x, loc, bb, insn_info, 3175 ref_type, flags, 3176 width, offset, mode); 3177 return; 3178 3179 case SIGN_EXTRACT: 3180 case ZERO_EXTRACT: 3181 { 3182 /* If the parameters to the zero or sign extract are 3183 constants, strip them off and recurse, otherwise there is 3184 no information that we can gain from this operation. */ 3185 if (CONST_INT_P (XEXP (x, 1)) 3186 && CONST_INT_P (XEXP (x, 2))) 3187 { 3188 width = INTVAL (XEXP (x, 1)); 3189 offset = INTVAL (XEXP (x, 2)); 3190 mode = GET_MODE (x); 3191 3192 if (code == ZERO_EXTRACT) 3193 flags |= DF_REF_ZERO_EXTRACT; 3194 else 3195 flags |= DF_REF_SIGN_EXTRACT; 3196 3197 df_uses_record (DF_REF_EXTRACT, collection_rec, 3198 &XEXP (x, 0), ref_type, bb, insn_info, flags, 3199 width, offset, mode); 3200 return; 3201 } 3202 } 3203 break; 3204 3205 case SET: 3206 { 3207 rtx dst = SET_DEST (x); 3208 gcc_assert (!(flags & DF_REF_IN_NOTE)); 3209 df_uses_record (cl, collection_rec, 3210 &SET_SRC (x), DF_REF_REG_USE, bb, insn_info, flags, 3211 width, offset, mode); 3212 3213 switch (GET_CODE (dst)) 3214 { 3215 case SUBREG: 3216 if (df_read_modify_subreg_p (dst)) 3217 { 3218 df_uses_record (cl, collection_rec, &SUBREG_REG (dst), 3219 DF_REF_REG_USE, bb, insn_info, 3220 flags | DF_REF_READ_WRITE | DF_REF_SUBREG, 3221 width, offset, mode); 3222 break; 3223 } 3224 /* Fall through. */ 3225 case REG: 3226 case PARALLEL: 3227 case SCRATCH: 3228 case PC: 3229 case CC0: 3230 break; 3231 case MEM: 3232 df_uses_record (cl, collection_rec, &XEXP (dst, 0), 3233 DF_REF_REG_MEM_STORE, bb, insn_info, flags, 3234 width, offset, mode); 3235 break; 3236 case STRICT_LOW_PART: 3237 { 3238 rtx *temp = &XEXP (dst, 0); 3239 /* A strict_low_part uses the whole REG and not just the 3240 SUBREG. */ 3241 dst = XEXP (dst, 0); 3242 df_uses_record (cl, collection_rec, 3243 (GET_CODE (dst) == SUBREG) ? &SUBREG_REG (dst) : temp, 3244 DF_REF_REG_USE, bb, insn_info, 3245 DF_REF_READ_WRITE | DF_REF_STRICT_LOW_PART, 3246 width, offset, mode); 3247 } 3248 break; 3249 case ZERO_EXTRACT: 3250 { 3251 if (CONST_INT_P (XEXP (dst, 1)) 3252 && CONST_INT_P (XEXP (dst, 2))) 3253 { 3254 width = INTVAL (XEXP (dst, 1)); 3255 offset = INTVAL (XEXP (dst, 2)); 3256 mode = GET_MODE (dst); 3257 if (GET_CODE (XEXP (dst,0)) == MEM) 3258 { 3259 /* Handle the case of zero_extract(mem(...)) in the set dest. 3260 This special case is allowed only if the mem is a single byte and 3261 is useful to set a bitfield in memory. */ 3262 df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (XEXP (dst,0), 0), 3263 DF_REF_REG_MEM_STORE, bb, insn_info, 3264 DF_REF_ZERO_EXTRACT, 3265 width, offset, mode); 3266 } 3267 else 3268 { 3269 df_uses_record (DF_REF_EXTRACT, collection_rec, &XEXP (dst, 0), 3270 DF_REF_REG_USE, bb, insn_info, 3271 DF_REF_READ_WRITE | DF_REF_ZERO_EXTRACT, 3272 width, offset, mode); 3273 } 3274 } 3275 else 3276 { 3277 df_uses_record (cl, collection_rec, &XEXP (dst, 1), 3278 DF_REF_REG_USE, bb, insn_info, flags, 3279 width, offset, mode); 3280 df_uses_record (cl, collection_rec, &XEXP (dst, 2), 3281 DF_REF_REG_USE, bb, insn_info, flags, 3282 width, offset, mode); 3283 df_uses_record (cl, collection_rec, &XEXP (dst, 0), 3284 DF_REF_REG_USE, bb, insn_info, 3285 DF_REF_READ_WRITE | DF_REF_ZERO_EXTRACT, 3286 width, offset, mode); 3287 } 3288 3289 } 3290 break; 3291 3292 default: 3293 gcc_unreachable (); 3294 } 3295 return; 3296 } 3297 3298 case RETURN: 3299 break; 3300 3301 case ASM_OPERANDS: 3302 case UNSPEC_VOLATILE: 3303 case TRAP_IF: 3304 case ASM_INPUT: 3305 { 3306 /* Traditional and volatile asm instructions must be 3307 considered to use and clobber all hard registers, all 3308 pseudo-registers and all of memory. So must TRAP_IF and 3309 UNSPEC_VOLATILE operations. 3310 3311 Consider for instance a volatile asm that changes the fpu 3312 rounding mode. An insn should not be moved across this 3313 even if it only uses pseudo-regs because it might give an 3314 incorrectly rounded result. 3315 3316 However, flow.c's liveness computation did *not* do this, 3317 giving the reasoning as " ?!? Unfortunately, marking all 3318 hard registers as live causes massive problems for the 3319 register allocator and marking all pseudos as live creates 3320 mountains of uninitialized variable warnings." 3321 3322 In order to maintain the status quo with regard to liveness 3323 and uses, we do what flow.c did and just mark any regs we 3324 can find in ASM_OPERANDS as used. In global asm insns are 3325 scanned and regs_asm_clobbered is filled out. 3326 3327 For all ASM_OPERANDS, we must traverse the vector of input 3328 operands. We can not just fall through here since then we 3329 would be confused by the ASM_INPUT rtx inside ASM_OPERANDS, 3330 which do not indicate traditional asms unlike their normal 3331 usage. */ 3332 if (code == ASM_OPERANDS) 3333 { 3334 int j; 3335 3336 for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++) 3337 df_uses_record (cl, collection_rec, &ASM_OPERANDS_INPUT (x, j), 3338 DF_REF_REG_USE, bb, insn_info, flags, 3339 width, offset, mode); 3340 return; 3341 } 3342 break; 3343 } 3344 3345 case VAR_LOCATION: 3346 df_uses_record (cl, collection_rec, 3347 &PAT_VAR_LOCATION_LOC (x), 3348 DF_REF_REG_USE, bb, insn_info, 3349 flags, width, offset, mode); 3350 return; 3351 3352 case PRE_DEC: 3353 case POST_DEC: 3354 case PRE_INC: 3355 case POST_INC: 3356 case PRE_MODIFY: 3357 case POST_MODIFY: 3358 gcc_assert (!DEBUG_INSN_P (insn_info->insn)); 3359 /* Catch the def of the register being modified. */ 3360 df_ref_record (cl, collection_rec, XEXP (x, 0), &XEXP (x, 0), 3361 bb, insn_info, 3362 DF_REF_REG_DEF, 3363 flags | DF_REF_READ_WRITE | DF_REF_PRE_POST_MODIFY, 3364 width, offset, mode); 3365 3366 /* ... Fall through to handle uses ... */ 3367 3368 default: 3369 break; 3370 } 3371 3372 /* Recursively scan the operands of this expression. */ 3373 { 3374 const char *fmt = GET_RTX_FORMAT (code); 3375 int i; 3376 3377 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 3378 { 3379 if (fmt[i] == 'e') 3380 { 3381 /* Tail recursive case: save a function call level. */ 3382 if (i == 0) 3383 { 3384 loc = &XEXP (x, 0); 3385 goto retry; 3386 } 3387 df_uses_record (cl, collection_rec, &XEXP (x, i), ref_type, 3388 bb, insn_info, flags, 3389 width, offset, mode); 3390 } 3391 else if (fmt[i] == 'E') 3392 { 3393 int j; 3394 for (j = 0; j < XVECLEN (x, i); j++) 3395 df_uses_record (cl, collection_rec, 3396 &XVECEXP (x, i, j), ref_type, 3397 bb, insn_info, flags, 3398 width, offset, mode); 3399 } 3400 } 3401 } 3402 3403 return; 3404} 3405 3406 3407/* For all DF_REF_CONDITIONAL defs, add a corresponding uses. */ 3408 3409static void 3410df_get_conditional_uses (struct df_collection_rec *collection_rec) 3411{ 3412 unsigned int ix; 3413 df_ref ref; 3414 3415 for (ix = 0; VEC_iterate (df_ref, collection_rec->def_vec, ix, ref); ++ix) 3416 { 3417 if (DF_REF_FLAGS_IS_SET (ref, DF_REF_CONDITIONAL)) 3418 { 3419 int width = -1; 3420 int offset = -1; 3421 enum machine_mode mode = VOIDmode; 3422 df_ref use; 3423 3424 if (DF_REF_FLAGS_IS_SET (ref, DF_REF_SIGN_EXTRACT | DF_REF_ZERO_EXTRACT)) 3425 { 3426 width = DF_REF_EXTRACT_WIDTH (ref); 3427 offset = DF_REF_EXTRACT_OFFSET (ref); 3428 mode = DF_REF_EXTRACT_MODE (ref); 3429 } 3430 3431 use = df_ref_create_structure (DF_REF_CLASS (ref), collection_rec, DF_REF_REG (ref), 3432 DF_REF_LOC (ref), DF_REF_BB (ref), 3433 DF_REF_INSN_INFO (ref), DF_REF_REG_USE, 3434 DF_REF_FLAGS (ref) & ~DF_REF_CONDITIONAL, 3435 width, offset, mode); 3436 DF_REF_REGNO (use) = DF_REF_REGNO (ref); 3437 } 3438 } 3439} 3440 3441 3442/* Get call's extra defs and uses. */ 3443 3444static void 3445df_get_call_refs (struct df_collection_rec * collection_rec, 3446 basic_block bb, 3447 struct df_insn_info *insn_info, 3448 int flags) 3449{ 3450 rtx note; 3451 bitmap_iterator bi; 3452 unsigned int ui; 3453 bool is_sibling_call; 3454 unsigned int i; 3455 df_ref def; 3456 bitmap defs_generated = BITMAP_ALLOC (&df_bitmap_obstack); 3457 3458 /* Do not generate clobbers for registers that are the result of the 3459 call. This causes ordering problems in the chain building code 3460 depending on which def is seen first. */ 3461 for (i = 0; VEC_iterate (df_ref, collection_rec->def_vec, i, def); ++i) 3462 bitmap_set_bit (defs_generated, DF_REF_REGNO (def)); 3463 3464 /* Record the registers used to pass arguments, and explicitly 3465 noted as clobbered. */ 3466 for (note = CALL_INSN_FUNCTION_USAGE (insn_info->insn); note; 3467 note = XEXP (note, 1)) 3468 { 3469 if (GET_CODE (XEXP (note, 0)) == USE) 3470 df_uses_record (DF_REF_REGULAR, collection_rec, &XEXP (XEXP (note, 0), 0), 3471 DF_REF_REG_USE, bb, insn_info, flags, -1, -1, 3472 VOIDmode); 3473 else if (GET_CODE (XEXP (note, 0)) == CLOBBER) 3474 { 3475 if (REG_P (XEXP (XEXP (note, 0), 0))) 3476 { 3477 unsigned int regno = REGNO (XEXP (XEXP (note, 0), 0)); 3478 if (!bitmap_bit_p (defs_generated, regno)) 3479 df_defs_record (collection_rec, XEXP (note, 0), bb, 3480 insn_info, flags); 3481 } 3482 else 3483 df_uses_record (DF_REF_REGULAR, collection_rec, &XEXP (note, 0), 3484 DF_REF_REG_USE, bb, insn_info, flags, -1, -1, 3485 VOIDmode); 3486 } 3487 } 3488 3489 /* The stack ptr is used (honorarily) by a CALL insn. */ 3490 df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[STACK_POINTER_REGNUM], 3491 NULL, bb, insn_info, DF_REF_REG_USE, 3492 DF_REF_CALL_STACK_USAGE | flags, 3493 -1, -1, VOIDmode); 3494 3495 /* Calls may also reference any of the global registers, 3496 so they are recorded as used. */ 3497 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 3498 if (global_regs[i]) 3499 { 3500 df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i], 3501 NULL, bb, insn_info, DF_REF_REG_USE, flags, -1, -1, 3502 VOIDmode); 3503 df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i], 3504 NULL, bb, insn_info, DF_REF_REG_DEF, flags, -1, -1, 3505 VOIDmode); 3506 } 3507 3508 is_sibling_call = SIBLING_CALL_P (insn_info->insn); 3509 EXECUTE_IF_SET_IN_BITMAP (regs_invalidated_by_call_regset, 0, ui, bi) 3510 { 3511 if (!global_regs[ui] 3512 && (!bitmap_bit_p (defs_generated, ui)) 3513 && (!is_sibling_call 3514 || !bitmap_bit_p (df->exit_block_uses, ui) 3515 || refers_to_regno_p (ui, ui+1, 3516 crtl->return_rtx, NULL))) 3517 df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[ui], 3518 NULL, bb, insn_info, DF_REF_REG_DEF, 3519 DF_REF_MAY_CLOBBER | flags, 3520 -1, -1, VOIDmode); 3521 } 3522 3523 BITMAP_FREE (defs_generated); 3524 return; 3525} 3526 3527/* Collect all refs in the INSN. This function is free of any 3528 side-effect - it will create and return a lists of df_ref's in the 3529 COLLECTION_REC without putting those refs into existing ref chains 3530 and reg chains. */ 3531 3532static void 3533df_insn_refs_collect (struct df_collection_rec* collection_rec, 3534 basic_block bb, struct df_insn_info *insn_info) 3535{ 3536 rtx note; 3537 bool is_cond_exec = (GET_CODE (PATTERN (insn_info->insn)) == COND_EXEC); 3538 3539 /* Clear out the collection record. */ 3540 VEC_truncate (df_ref, collection_rec->def_vec, 0); 3541 VEC_truncate (df_ref, collection_rec->use_vec, 0); 3542 VEC_truncate (df_ref, collection_rec->eq_use_vec, 0); 3543 VEC_truncate (df_mw_hardreg_ptr, collection_rec->mw_vec, 0); 3544 3545 /* Record register defs. */ 3546 df_defs_record (collection_rec, PATTERN (insn_info->insn), bb, insn_info, 0); 3547 3548 /* Process REG_EQUIV/REG_EQUAL notes. */ 3549 for (note = REG_NOTES (insn_info->insn); note; 3550 note = XEXP (note, 1)) 3551 { 3552 switch (REG_NOTE_KIND (note)) 3553 { 3554 case REG_EQUIV: 3555 case REG_EQUAL: 3556 df_uses_record (DF_REF_REGULAR, collection_rec, 3557 &XEXP (note, 0), DF_REF_REG_USE, 3558 bb, insn_info, DF_REF_IN_NOTE, -1, -1, VOIDmode); 3559 break; 3560 case REG_NON_LOCAL_GOTO: 3561 /* The frame ptr is used by a non-local goto. */ 3562 df_ref_record (DF_REF_BASE, collection_rec, 3563 regno_reg_rtx[FRAME_POINTER_REGNUM], 3564 NULL, bb, insn_info, 3565 DF_REF_REG_USE, 0, -1, -1, VOIDmode); 3566#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 3567 df_ref_record (DF_REF_BASE, collection_rec, 3568 regno_reg_rtx[HARD_FRAME_POINTER_REGNUM], 3569 NULL, bb, insn_info, 3570 DF_REF_REG_USE, 0, -1, -1, VOIDmode); 3571#endif 3572 break; 3573 default: 3574 break; 3575 } 3576 } 3577 3578 if (CALL_P (insn_info->insn)) 3579 df_get_call_refs (collection_rec, bb, insn_info, 3580 (is_cond_exec) ? DF_REF_CONDITIONAL : 0); 3581 3582 /* Record the register uses. */ 3583 df_uses_record (DF_REF_REGULAR, collection_rec, 3584 &PATTERN (insn_info->insn), DF_REF_REG_USE, bb, insn_info, 0, 3585 -1, -1, VOIDmode); 3586 3587 /* DF_REF_CONDITIONAL needs corresponding USES. */ 3588 if (is_cond_exec) 3589 df_get_conditional_uses (collection_rec); 3590 3591 df_canonize_collection_rec (collection_rec); 3592} 3593 3594/* Recompute the luids for the insns in BB. */ 3595 3596void 3597df_recompute_luids (basic_block bb) 3598{ 3599 rtx insn; 3600 int luid = 0; 3601 3602 df_grow_insn_info (); 3603 3604 /* Scan the block an insn at a time from beginning to end. */ 3605 FOR_BB_INSNS (bb, insn) 3606 { 3607 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn); 3608 /* Inserting labels does not always trigger the incremental 3609 rescanning. */ 3610 if (!insn_info) 3611 { 3612 gcc_assert (!INSN_P (insn)); 3613 insn_info = df_insn_create_insn_record (insn); 3614 } 3615 3616 DF_INSN_INFO_LUID (insn_info) = luid; 3617 if (INSN_P (insn)) 3618 luid++; 3619 } 3620} 3621 3622 3623/* Collect all artificial refs at the block level for BB and add them 3624 to COLLECTION_REC. */ 3625 3626static void 3627df_bb_refs_collect (struct df_collection_rec *collection_rec, basic_block bb) 3628{ 3629 VEC_truncate (df_ref, collection_rec->def_vec, 0); 3630 VEC_truncate (df_ref, collection_rec->use_vec, 0); 3631 VEC_truncate (df_ref, collection_rec->eq_use_vec, 0); 3632 VEC_truncate (df_mw_hardreg_ptr, collection_rec->mw_vec, 0); 3633 3634 if (bb->index == ENTRY_BLOCK) 3635 { 3636 df_entry_block_defs_collect (collection_rec, df->entry_block_defs); 3637 return; 3638 } 3639 else if (bb->index == EXIT_BLOCK) 3640 { 3641 df_exit_block_uses_collect (collection_rec, df->exit_block_uses); 3642 return; 3643 } 3644 3645#ifdef EH_RETURN_DATA_REGNO 3646 if (bb_has_eh_pred (bb)) 3647 { 3648 unsigned int i; 3649 /* Mark the registers that will contain data for the handler. */ 3650 for (i = 0; ; ++i) 3651 { 3652 unsigned regno = EH_RETURN_DATA_REGNO (i); 3653 if (regno == INVALID_REGNUM) 3654 break; 3655 df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[regno], NULL, 3656 bb, NULL, DF_REF_REG_DEF, DF_REF_AT_TOP, -1, -1, 3657 VOIDmode); 3658 } 3659 } 3660#endif 3661 3662 /* Add the hard_frame_pointer if this block is the target of a 3663 non-local goto. */ 3664 if (bb->flags & BB_NON_LOCAL_GOTO_TARGET) 3665 df_ref_record (DF_REF_ARTIFICIAL, collection_rec, hard_frame_pointer_rtx, NULL, 3666 bb, NULL, DF_REF_REG_DEF, DF_REF_AT_TOP, -1, -1, VOIDmode); 3667 3668 /* Add the artificial uses. */ 3669 if (bb->index >= NUM_FIXED_BLOCKS) 3670 { 3671 bitmap_iterator bi; 3672 unsigned int regno; 3673 bitmap au = bb_has_eh_pred (bb) 3674 ? df->eh_block_artificial_uses 3675 : df->regular_block_artificial_uses; 3676 3677 EXECUTE_IF_SET_IN_BITMAP (au, 0, regno, bi) 3678 { 3679 df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[regno], NULL, 3680 bb, NULL, DF_REF_REG_USE, 0, -1, -1, VOIDmode); 3681 } 3682 } 3683 3684 df_canonize_collection_rec (collection_rec); 3685} 3686 3687 3688/* Record all the refs within the basic block BB_INDEX and scan the instructions if SCAN_INSNS. */ 3689 3690void 3691df_bb_refs_record (int bb_index, bool scan_insns) 3692{ 3693 basic_block bb = BASIC_BLOCK (bb_index); 3694 rtx insn; 3695 int luid = 0; 3696 struct df_scan_bb_info *bb_info; 3697 struct df_collection_rec collection_rec; 3698 3699 if (!df) 3700 return; 3701 3702 bb_info = df_scan_get_bb_info (bb_index); 3703 3704 /* Need to make sure that there is a record in the basic block info. */ 3705 if (!bb_info) 3706 { 3707 bb_info = (struct df_scan_bb_info *) pool_alloc (df_scan->block_pool); 3708 df_scan_set_bb_info (bb_index, bb_info); 3709 bb_info->artificial_defs = NULL; 3710 bb_info->artificial_uses = NULL; 3711 } 3712 3713 collection_rec.def_vec = VEC_alloc (df_ref, stack, 128); 3714 collection_rec.use_vec = VEC_alloc (df_ref, stack, 32); 3715 collection_rec.eq_use_vec = VEC_alloc (df_ref, stack, 32); 3716 collection_rec.mw_vec = VEC_alloc (df_mw_hardreg_ptr, stack, 32); 3717 3718 if (scan_insns) 3719 /* Scan the block an insn at a time from beginning to end. */ 3720 FOR_BB_INSNS (bb, insn) 3721 { 3722 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn); 3723 gcc_assert (!insn_info); 3724 3725 insn_info = df_insn_create_insn_record (insn); 3726 if (INSN_P (insn)) 3727 { 3728 /* Record refs within INSN. */ 3729 DF_INSN_INFO_LUID (insn_info) = luid++; 3730 df_insn_refs_collect (&collection_rec, bb, DF_INSN_INFO_GET (insn)); 3731 df_refs_add_to_chains (&collection_rec, bb, insn); 3732 } 3733 DF_INSN_INFO_LUID (insn_info) = luid; 3734 } 3735 3736 /* Other block level artificial refs */ 3737 df_bb_refs_collect (&collection_rec, bb); 3738 df_refs_add_to_chains (&collection_rec, bb, NULL); 3739 3740 VEC_free (df_ref, stack, collection_rec.def_vec); 3741 VEC_free (df_ref, stack, collection_rec.use_vec); 3742 VEC_free (df_ref, stack, collection_rec.eq_use_vec); 3743 VEC_free (df_mw_hardreg_ptr, stack, collection_rec.mw_vec); 3744 3745 /* Now that the block has been processed, set the block as dirty so 3746 LR and LIVE will get it processed. */ 3747 df_set_bb_dirty (bb); 3748} 3749 3750 3751/* Get the artificial use set for a regular (i.e. non-exit/non-entry) 3752 block. */ 3753 3754static void 3755df_get_regular_block_artificial_uses (bitmap regular_block_artificial_uses) 3756{ 3757#ifdef EH_USES 3758 unsigned int i; 3759#endif 3760 3761 bitmap_clear (regular_block_artificial_uses); 3762 3763 if (reload_completed) 3764 { 3765 if (frame_pointer_needed) 3766 bitmap_set_bit (regular_block_artificial_uses, HARD_FRAME_POINTER_REGNUM); 3767 } 3768 else 3769 /* Before reload, there are a few registers that must be forced 3770 live everywhere -- which might not already be the case for 3771 blocks within infinite loops. */ 3772 { 3773 /* Any reference to any pseudo before reload is a potential 3774 reference of the frame pointer. */ 3775 bitmap_set_bit (regular_block_artificial_uses, FRAME_POINTER_REGNUM); 3776 3777#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 3778 bitmap_set_bit (regular_block_artificial_uses, HARD_FRAME_POINTER_REGNUM); 3779#endif 3780 3781#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM 3782 /* Pseudos with argument area equivalences may require 3783 reloading via the argument pointer. */ 3784 if (fixed_regs[ARG_POINTER_REGNUM]) 3785 bitmap_set_bit (regular_block_artificial_uses, ARG_POINTER_REGNUM); 3786#endif 3787 3788 /* Any constant, or pseudo with constant equivalences, may 3789 require reloading from memory using the pic register. */ 3790 if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM 3791 && fixed_regs[PIC_OFFSET_TABLE_REGNUM]) 3792 bitmap_set_bit (regular_block_artificial_uses, PIC_OFFSET_TABLE_REGNUM); 3793 } 3794 /* The all-important stack pointer must always be live. */ 3795 bitmap_set_bit (regular_block_artificial_uses, STACK_POINTER_REGNUM); 3796 3797#ifdef EH_USES 3798 /* EH_USES registers are used: 3799 1) at all insns that might throw (calls or with -fnon-call-exceptions 3800 trapping insns) 3801 2) in all EH edges 3802 3) to support backtraces and/or debugging, anywhere between their 3803 initialization and where they the saved registers are restored 3804 from them, including the cases where we don't reach the epilogue 3805 (noreturn call or infinite loop). */ 3806 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 3807 if (EH_USES (i)) 3808 bitmap_set_bit (regular_block_artificial_uses, i); 3809#endif 3810} 3811 3812 3813/* Get the artificial use set for an eh block. */ 3814 3815static void 3816df_get_eh_block_artificial_uses (bitmap eh_block_artificial_uses) 3817{ 3818 bitmap_clear (eh_block_artificial_uses); 3819 3820 /* The following code (down thru the arg_pointer setting APPEARS 3821 to be necessary because there is nothing that actually 3822 describes what the exception handling code may actually need 3823 to keep alive. */ 3824 if (reload_completed) 3825 { 3826 if (frame_pointer_needed) 3827 { 3828 bitmap_set_bit (eh_block_artificial_uses, FRAME_POINTER_REGNUM); 3829#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 3830 bitmap_set_bit (eh_block_artificial_uses, HARD_FRAME_POINTER_REGNUM); 3831#endif 3832 } 3833#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM 3834 if (fixed_regs[ARG_POINTER_REGNUM]) 3835 bitmap_set_bit (eh_block_artificial_uses, ARG_POINTER_REGNUM); 3836#endif 3837 } 3838} 3839 3840 3841 3842/*---------------------------------------------------------------------------- 3843 Specialized hard register scanning functions. 3844----------------------------------------------------------------------------*/ 3845 3846 3847/* Mark a register in SET. Hard registers in large modes get all 3848 of their component registers set as well. */ 3849 3850static void 3851df_mark_reg (rtx reg, void *vset) 3852{ 3853 bitmap set = (bitmap) vset; 3854 int regno = REGNO (reg); 3855 3856 gcc_assert (GET_MODE (reg) != BLKmode); 3857 3858 if (regno < FIRST_PSEUDO_REGISTER) 3859 { 3860 int n = hard_regno_nregs[regno][GET_MODE (reg)]; 3861 bitmap_set_range (set, regno, n); 3862 } 3863 else 3864 bitmap_set_bit (set, regno); 3865} 3866 3867 3868/* Set the bit for regs that are considered being defined at the entry. */ 3869 3870static void 3871df_get_entry_block_def_set (bitmap entry_block_defs) 3872{ 3873 rtx r; 3874 int i; 3875 3876 bitmap_clear (entry_block_defs); 3877 3878 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 3879 { 3880 if (FUNCTION_ARG_REGNO_P (i)) 3881#ifdef INCOMING_REGNO 3882 bitmap_set_bit (entry_block_defs, INCOMING_REGNO (i)); 3883#else 3884 bitmap_set_bit (entry_block_defs, i); 3885#endif 3886 } 3887 3888 /* The always important stack pointer. */ 3889 bitmap_set_bit (entry_block_defs, STACK_POINTER_REGNUM); 3890 3891 /* Once the prologue has been generated, all of these registers 3892 should just show up in the first regular block. */ 3893 if (HAVE_prologue && epilogue_completed) 3894 { 3895 /* Defs for the callee saved registers are inserted so that the 3896 pushes have some defining location. */ 3897 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 3898 if ((call_used_regs[i] == 0) && (df_regs_ever_live_p (i))) 3899 bitmap_set_bit (entry_block_defs, i); 3900 } 3901 3902 r = targetm.calls.struct_value_rtx (current_function_decl, true); 3903 if (r && REG_P (r)) 3904 bitmap_set_bit (entry_block_defs, REGNO (r)); 3905 3906 /* If the function has an incoming STATIC_CHAIN, it has to show up 3907 in the entry def set. */ 3908 r = targetm.calls.static_chain (current_function_decl, true); 3909 if (r && REG_P (r)) 3910 bitmap_set_bit (entry_block_defs, REGNO (r)); 3911 3912 if ((!reload_completed) || frame_pointer_needed) 3913 { 3914 /* Any reference to any pseudo before reload is a potential 3915 reference of the frame pointer. */ 3916 bitmap_set_bit (entry_block_defs, FRAME_POINTER_REGNUM); 3917#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 3918 /* If they are different, also mark the hard frame pointer as live. */ 3919 if (!LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM)) 3920 bitmap_set_bit (entry_block_defs, HARD_FRAME_POINTER_REGNUM); 3921#endif 3922 } 3923 3924 /* These registers are live everywhere. */ 3925 if (!reload_completed) 3926 { 3927#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM 3928 /* Pseudos with argument area equivalences may require 3929 reloading via the argument pointer. */ 3930 if (fixed_regs[ARG_POINTER_REGNUM]) 3931 bitmap_set_bit (entry_block_defs, ARG_POINTER_REGNUM); 3932#endif 3933 3934#ifdef PIC_OFFSET_TABLE_REGNUM 3935 /* Any constant, or pseudo with constant equivalences, may 3936 require reloading from memory using the pic register. */ 3937 if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM 3938 && fixed_regs[PIC_OFFSET_TABLE_REGNUM]) 3939 bitmap_set_bit (entry_block_defs, PIC_OFFSET_TABLE_REGNUM); 3940#endif 3941 } 3942 3943#ifdef INCOMING_RETURN_ADDR_RTX 3944 if (REG_P (INCOMING_RETURN_ADDR_RTX)) 3945 bitmap_set_bit (entry_block_defs, REGNO (INCOMING_RETURN_ADDR_RTX)); 3946#endif 3947 3948 targetm.live_on_entry (entry_block_defs); 3949} 3950 3951 3952/* Return the (conservative) set of hard registers that are defined on 3953 entry to the function. 3954 It uses df->entry_block_defs to determine which register 3955 reference to include. */ 3956 3957static void 3958df_entry_block_defs_collect (struct df_collection_rec *collection_rec, 3959 bitmap entry_block_defs) 3960{ 3961 unsigned int i; 3962 bitmap_iterator bi; 3963 3964 EXECUTE_IF_SET_IN_BITMAP (entry_block_defs, 0, i, bi) 3965 { 3966 df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[i], NULL, 3967 ENTRY_BLOCK_PTR, NULL, DF_REF_REG_DEF, 0, -1, -1, 3968 VOIDmode); 3969 } 3970 3971 df_canonize_collection_rec (collection_rec); 3972} 3973 3974 3975/* Record the (conservative) set of hard registers that are defined on 3976 entry to the function. */ 3977 3978static void 3979df_record_entry_block_defs (bitmap entry_block_defs) 3980{ 3981 struct df_collection_rec collection_rec; 3982 memset (&collection_rec, 0, sizeof (struct df_collection_rec)); 3983 collection_rec.def_vec = VEC_alloc (df_ref, stack, FIRST_PSEUDO_REGISTER); 3984 df_entry_block_defs_collect (&collection_rec, entry_block_defs); 3985 3986 /* Process bb_refs chain */ 3987 df_refs_add_to_chains (&collection_rec, BASIC_BLOCK (ENTRY_BLOCK), NULL); 3988 VEC_free (df_ref, stack, collection_rec.def_vec); 3989} 3990 3991 3992/* Update the defs in the entry block. */ 3993 3994void 3995df_update_entry_block_defs (void) 3996{ 3997 bitmap refs = BITMAP_ALLOC (&df_bitmap_obstack); 3998 bool changed = false; 3999 4000 df_get_entry_block_def_set (refs); 4001 if (df->entry_block_defs) 4002 { 4003 if (!bitmap_equal_p (df->entry_block_defs, refs)) 4004 { 4005 struct df_scan_bb_info *bb_info = df_scan_get_bb_info (ENTRY_BLOCK); 4006 df_ref_chain_delete_du_chain (bb_info->artificial_defs); 4007 df_ref_chain_delete (bb_info->artificial_defs); 4008 bb_info->artificial_defs = NULL; 4009 changed = true; 4010 } 4011 } 4012 else 4013 { 4014 struct df_scan_problem_data *problem_data 4015 = (struct df_scan_problem_data *) df_scan->problem_data; 4016 df->entry_block_defs = BITMAP_ALLOC (&problem_data->reg_bitmaps); 4017 changed = true; 4018 } 4019 4020 if (changed) 4021 { 4022 df_record_entry_block_defs (refs); 4023 bitmap_copy (df->entry_block_defs, refs); 4024 df_set_bb_dirty (BASIC_BLOCK (ENTRY_BLOCK)); 4025 } 4026 BITMAP_FREE (refs); 4027} 4028 4029 4030/* Set the bit for regs that are considered being used at the exit. */ 4031 4032static void 4033df_get_exit_block_use_set (bitmap exit_block_uses) 4034{ 4035 unsigned int i; 4036 4037 bitmap_clear (exit_block_uses); 4038 4039 /* Stack pointer is always live at the exit. */ 4040 bitmap_set_bit (exit_block_uses, STACK_POINTER_REGNUM); 4041 4042 /* Mark the frame pointer if needed at the end of the function. 4043 If we end up eliminating it, it will be removed from the live 4044 list of each basic block by reload. */ 4045 4046 if ((!reload_completed) || frame_pointer_needed) 4047 { 4048 bitmap_set_bit (exit_block_uses, FRAME_POINTER_REGNUM); 4049#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 4050 /* If they are different, also mark the hard frame pointer as live. */ 4051 if (!LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM)) 4052 bitmap_set_bit (exit_block_uses, HARD_FRAME_POINTER_REGNUM); 4053#endif 4054 } 4055 4056#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 4057 /* Many architectures have a GP register even without flag_pic. 4058 Assume the pic register is not in use, or will be handled by 4059 other means, if it is not fixed. */ 4060 if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM 4061 && fixed_regs[PIC_OFFSET_TABLE_REGNUM]) 4062 bitmap_set_bit (exit_block_uses, PIC_OFFSET_TABLE_REGNUM); 4063#endif 4064 4065 /* Mark all global registers, and all registers used by the 4066 epilogue as being live at the end of the function since they 4067 may be referenced by our caller. */ 4068 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 4069 if (global_regs[i] || EPILOGUE_USES (i)) 4070 bitmap_set_bit (exit_block_uses, i); 4071 4072 if (HAVE_epilogue && epilogue_completed) 4073 { 4074 /* Mark all call-saved registers that we actually used. */ 4075 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 4076 if (df_regs_ever_live_p (i) && !LOCAL_REGNO (i) 4077 && !TEST_HARD_REG_BIT (regs_invalidated_by_call, i)) 4078 bitmap_set_bit (exit_block_uses, i); 4079 } 4080 4081#ifdef EH_RETURN_DATA_REGNO 4082 /* Mark the registers that will contain data for the handler. */ 4083 if (reload_completed && crtl->calls_eh_return) 4084 for (i = 0; ; ++i) 4085 { 4086 unsigned regno = EH_RETURN_DATA_REGNO (i); 4087 if (regno == INVALID_REGNUM) 4088 break; 4089 bitmap_set_bit (exit_block_uses, regno); 4090 } 4091#endif 4092 4093#ifdef EH_RETURN_STACKADJ_RTX 4094 if ((!HAVE_epilogue || ! epilogue_completed) 4095 && crtl->calls_eh_return) 4096 { 4097 rtx tmp = EH_RETURN_STACKADJ_RTX; 4098 if (tmp && REG_P (tmp)) 4099 df_mark_reg (tmp, exit_block_uses); 4100 } 4101#endif 4102 4103#ifdef EH_RETURN_HANDLER_RTX 4104 if ((!HAVE_epilogue || ! epilogue_completed) 4105 && crtl->calls_eh_return) 4106 { 4107 rtx tmp = EH_RETURN_HANDLER_RTX; 4108 if (tmp && REG_P (tmp)) 4109 df_mark_reg (tmp, exit_block_uses); 4110 } 4111#endif 4112 4113 /* Mark function return value. */ 4114 diddle_return_value (df_mark_reg, (void*) exit_block_uses); 4115} 4116 4117 4118/* Return the refs of hard registers that are used in the exit block. 4119 It uses df->exit_block_uses to determine register to include. */ 4120 4121static void 4122df_exit_block_uses_collect (struct df_collection_rec *collection_rec, bitmap exit_block_uses) 4123{ 4124 unsigned int i; 4125 bitmap_iterator bi; 4126 4127 EXECUTE_IF_SET_IN_BITMAP (exit_block_uses, 0, i, bi) 4128 df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[i], NULL, 4129 EXIT_BLOCK_PTR, NULL, DF_REF_REG_USE, 0, -1, -1, VOIDmode); 4130 4131#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM 4132 /* It is deliberate that this is not put in the exit block uses but 4133 I do not know why. */ 4134 if (reload_completed 4135 && !bitmap_bit_p (exit_block_uses, ARG_POINTER_REGNUM) 4136 && bb_has_eh_pred (EXIT_BLOCK_PTR) 4137 && fixed_regs[ARG_POINTER_REGNUM]) 4138 df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[ARG_POINTER_REGNUM], NULL, 4139 EXIT_BLOCK_PTR, NULL, DF_REF_REG_USE, 0, -1, -1, VOIDmode); 4140#endif 4141 4142 df_canonize_collection_rec (collection_rec); 4143} 4144 4145 4146/* Record the set of hard registers that are used in the exit block. 4147 It uses df->exit_block_uses to determine which bit to include. */ 4148 4149static void 4150df_record_exit_block_uses (bitmap exit_block_uses) 4151{ 4152 struct df_collection_rec collection_rec; 4153 memset (&collection_rec, 0, sizeof (struct df_collection_rec)); 4154 collection_rec.use_vec = VEC_alloc (df_ref, stack, FIRST_PSEUDO_REGISTER); 4155 4156 df_exit_block_uses_collect (&collection_rec, exit_block_uses); 4157 4158 /* Process bb_refs chain */ 4159 df_refs_add_to_chains (&collection_rec, BASIC_BLOCK (EXIT_BLOCK), NULL); 4160 VEC_free (df_ref, stack, collection_rec.use_vec); 4161} 4162 4163 4164/* Update the uses in the exit block. */ 4165 4166void 4167df_update_exit_block_uses (void) 4168{ 4169 bitmap refs = BITMAP_ALLOC (&df_bitmap_obstack); 4170 bool changed = false; 4171 4172 df_get_exit_block_use_set (refs); 4173 if (df->exit_block_uses) 4174 { 4175 if (!bitmap_equal_p (df->exit_block_uses, refs)) 4176 { 4177 struct df_scan_bb_info *bb_info = df_scan_get_bb_info (EXIT_BLOCK); 4178 df_ref_chain_delete_du_chain (bb_info->artificial_uses); 4179 df_ref_chain_delete (bb_info->artificial_uses); 4180 bb_info->artificial_uses = NULL; 4181 changed = true; 4182 } 4183 } 4184 else 4185 { 4186 struct df_scan_problem_data *problem_data 4187 = (struct df_scan_problem_data *) df_scan->problem_data; 4188 df->exit_block_uses = BITMAP_ALLOC (&problem_data->reg_bitmaps); 4189 changed = true; 4190 } 4191 4192 if (changed) 4193 { 4194 df_record_exit_block_uses (refs); 4195 bitmap_copy (df->exit_block_uses, refs); 4196 df_set_bb_dirty (BASIC_BLOCK (EXIT_BLOCK)); 4197 } 4198 BITMAP_FREE (refs); 4199} 4200 4201static bool initialized = false; 4202 4203 4204/* Initialize some platform specific structures. */ 4205 4206void 4207df_hard_reg_init (void) 4208{ 4209#ifdef ELIMINABLE_REGS 4210 int i; 4211 static const struct {const int from, to; } eliminables[] = ELIMINABLE_REGS; 4212#endif 4213 if (initialized) 4214 return; 4215 4216 /* Record which registers will be eliminated. We use this in 4217 mark_used_regs. */ 4218 CLEAR_HARD_REG_SET (elim_reg_set); 4219 4220#ifdef ELIMINABLE_REGS 4221 for (i = 0; i < (int) ARRAY_SIZE (eliminables); i++) 4222 SET_HARD_REG_BIT (elim_reg_set, eliminables[i].from); 4223#else 4224 SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM); 4225#endif 4226 4227 initialized = true; 4228} 4229 4230 4231/* Recompute the parts of scanning that are based on regs_ever_live 4232 because something changed in that array. */ 4233 4234void 4235df_update_entry_exit_and_calls (void) 4236{ 4237 basic_block bb; 4238 4239 df_update_entry_block_defs (); 4240 df_update_exit_block_uses (); 4241 4242 /* The call insns need to be rescanned because there may be changes 4243 in the set of registers clobbered across the call. */ 4244 FOR_EACH_BB (bb) 4245 { 4246 rtx insn; 4247 FOR_BB_INSNS (bb, insn) 4248 { 4249 if (INSN_P (insn) && CALL_P (insn)) 4250 df_insn_rescan (insn); 4251 } 4252 } 4253} 4254 4255 4256/* Return true if hard REG is actually used in the some instruction. 4257 There are a fair number of conditions that affect the setting of 4258 this array. See the comment in df.h for df->hard_regs_live_count 4259 for the conditions that this array is set. */ 4260 4261bool 4262df_hard_reg_used_p (unsigned int reg) 4263{ 4264 return df->hard_regs_live_count[reg] != 0; 4265} 4266 4267 4268/* A count of the number of times REG is actually used in the some 4269 instruction. There are a fair number of conditions that affect the 4270 setting of this array. See the comment in df.h for 4271 df->hard_regs_live_count for the conditions that this array is 4272 set. */ 4273 4274 4275unsigned int 4276df_hard_reg_used_count (unsigned int reg) 4277{ 4278 return df->hard_regs_live_count[reg]; 4279} 4280 4281 4282/* Get the value of regs_ever_live[REGNO]. */ 4283 4284bool 4285df_regs_ever_live_p (unsigned int regno) 4286{ 4287 return regs_ever_live[regno]; 4288} 4289 4290 4291/* Set regs_ever_live[REGNO] to VALUE. If this cause regs_ever_live 4292 to change, schedule that change for the next update. */ 4293 4294void 4295df_set_regs_ever_live (unsigned int regno, bool value) 4296{ 4297 if (regs_ever_live[regno] == value) 4298 return; 4299 4300 regs_ever_live[regno] = value; 4301 if (df) 4302 df->redo_entry_and_exit = true; 4303} 4304 4305 4306/* Compute "regs_ever_live" information from the underlying df 4307 information. Set the vector to all false if RESET. */ 4308 4309void 4310df_compute_regs_ever_live (bool reset) 4311{ 4312 unsigned int i; 4313 bool changed = df->redo_entry_and_exit; 4314 4315 if (reset) 4316 memset (regs_ever_live, 0, sizeof (regs_ever_live)); 4317 4318 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 4319 if ((!regs_ever_live[i]) && df_hard_reg_used_p (i)) 4320 { 4321 regs_ever_live[i] = true; 4322 changed = true; 4323 } 4324 if (changed) 4325 df_update_entry_exit_and_calls (); 4326 df->redo_entry_and_exit = false; 4327} 4328 4329 4330/*---------------------------------------------------------------------------- 4331 Dataflow ref information verification functions. 4332 4333 df_reg_chain_mark (refs, regno, is_def, is_eq_use) 4334 df_reg_chain_verify_unmarked (refs) 4335 df_refs_verify (VEC(stack,df_ref)*, ref*, bool) 4336 df_mws_verify (mw*, mw*, bool) 4337 df_insn_refs_verify (collection_rec, bb, insn, bool) 4338 df_bb_refs_verify (bb, refs, bool) 4339 df_bb_verify (bb) 4340 df_exit_block_bitmap_verify (bool) 4341 df_entry_block_bitmap_verify (bool) 4342 df_scan_verify () 4343----------------------------------------------------------------------------*/ 4344 4345 4346/* Mark all refs in the reg chain. Verify that all of the registers 4347are in the correct chain. */ 4348 4349static unsigned int 4350df_reg_chain_mark (df_ref refs, unsigned int regno, 4351 bool is_def, bool is_eq_use) 4352{ 4353 unsigned int count = 0; 4354 df_ref ref; 4355 for (ref = refs; ref; ref = DF_REF_NEXT_REG (ref)) 4356 { 4357 gcc_assert (!DF_REF_IS_REG_MARKED (ref)); 4358 4359 /* If there are no def-use or use-def chains, make sure that all 4360 of the chains are clear. */ 4361 if (!df_chain) 4362 gcc_assert (!DF_REF_CHAIN (ref)); 4363 4364 /* Check to make sure the ref is in the correct chain. */ 4365 gcc_assert (DF_REF_REGNO (ref) == regno); 4366 if (is_def) 4367 gcc_assert (DF_REF_REG_DEF_P (ref)); 4368 else 4369 gcc_assert (!DF_REF_REG_DEF_P (ref)); 4370 4371 if (is_eq_use) 4372 gcc_assert ((DF_REF_FLAGS (ref) & DF_REF_IN_NOTE)); 4373 else 4374 gcc_assert ((DF_REF_FLAGS (ref) & DF_REF_IN_NOTE) == 0); 4375 4376 if (DF_REF_NEXT_REG (ref)) 4377 gcc_assert (DF_REF_PREV_REG (DF_REF_NEXT_REG (ref)) == ref); 4378 count++; 4379 DF_REF_REG_MARK (ref); 4380 } 4381 return count; 4382} 4383 4384 4385/* Verify that all of the registers in the chain are unmarked. */ 4386 4387static void 4388df_reg_chain_verify_unmarked (df_ref refs) 4389{ 4390 df_ref ref; 4391 for (ref = refs; ref; ref = DF_REF_NEXT_REG (ref)) 4392 gcc_assert (!DF_REF_IS_REG_MARKED (ref)); 4393} 4394 4395 4396/* Verify that NEW_REC and OLD_REC have exactly the same members. */ 4397 4398static bool 4399df_refs_verify (VEC(df_ref,stack) *new_rec, df_ref *old_rec, 4400 bool abort_if_fail) 4401{ 4402 unsigned int ix; 4403 df_ref new_ref; 4404 4405 for (ix = 0; VEC_iterate (df_ref, new_rec, ix, new_ref); ++ix) 4406 { 4407 if (*old_rec == NULL || !df_ref_equal_p (new_ref, *old_rec)) 4408 { 4409 if (abort_if_fail) 4410 gcc_assert (0); 4411 else 4412 return false; 4413 } 4414 4415 /* Abort if fail is called from the function level verifier. If 4416 that is the context, mark this reg as being seem. */ 4417 if (abort_if_fail) 4418 { 4419 gcc_assert (DF_REF_IS_REG_MARKED (*old_rec)); 4420 DF_REF_REG_UNMARK (*old_rec); 4421 } 4422 4423 old_rec++; 4424 } 4425 4426 if (abort_if_fail) 4427 gcc_assert (*old_rec == NULL); 4428 else 4429 return *old_rec == NULL; 4430 return false; 4431} 4432 4433 4434/* Verify that NEW_REC and OLD_REC have exactly the same members. */ 4435 4436static bool 4437df_mws_verify (VEC(df_mw_hardreg_ptr,stack) *new_rec, 4438 struct df_mw_hardreg **old_rec, 4439 bool abort_if_fail) 4440{ 4441 unsigned int ix; 4442 struct df_mw_hardreg *new_reg; 4443 4444 for (ix = 0; VEC_iterate (df_mw_hardreg_ptr, new_rec, ix, new_reg); ++ix) 4445 { 4446 if (*old_rec == NULL || !df_mw_equal_p (new_reg, *old_rec)) 4447 { 4448 if (abort_if_fail) 4449 gcc_assert (0); 4450 else 4451 return false; 4452 } 4453 old_rec++; 4454 } 4455 4456 if (abort_if_fail) 4457 gcc_assert (*old_rec == NULL); 4458 else 4459 return *old_rec == NULL; 4460 return false; 4461} 4462 4463 4464/* Return true if the existing insn refs information is complete and 4465 correct. Otherwise (i.e. if there's any missing or extra refs), 4466 return the correct df_ref chain in REFS_RETURN. 4467 4468 If ABORT_IF_FAIL, leave the refs that are verified (already in the 4469 ref chain) as DF_REF_MARKED(). If it's false, then it's a per-insn 4470 verification mode instead of the whole function, so unmark 4471 everything. 4472 4473 If ABORT_IF_FAIL is set, this function never returns false. */ 4474 4475static bool 4476df_insn_refs_verify (struct df_collection_rec *collection_rec, 4477 basic_block bb, 4478 rtx insn, 4479 bool abort_if_fail) 4480{ 4481 bool ret1, ret2, ret3, ret4; 4482 unsigned int uid = INSN_UID (insn); 4483 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn); 4484 4485 df_insn_refs_collect (collection_rec, bb, insn_info); 4486 4487 if (!DF_INSN_UID_DEFS (uid)) 4488 { 4489 /* The insn_rec was created but it was never filled out. */ 4490 if (abort_if_fail) 4491 gcc_assert (0); 4492 else 4493 return false; 4494 } 4495 4496 /* Unfortunately we cannot opt out early if one of these is not 4497 right because the marks will not get cleared. */ 4498 ret1 = df_refs_verify (collection_rec->def_vec, DF_INSN_UID_DEFS (uid), 4499 abort_if_fail); 4500 ret2 = df_refs_verify (collection_rec->use_vec, DF_INSN_UID_USES (uid), 4501 abort_if_fail); 4502 ret3 = df_refs_verify (collection_rec->eq_use_vec, DF_INSN_UID_EQ_USES (uid), 4503 abort_if_fail); 4504 ret4 = df_mws_verify (collection_rec->mw_vec, DF_INSN_UID_MWS (uid), 4505 abort_if_fail); 4506 return (ret1 && ret2 && ret3 && ret4); 4507} 4508 4509 4510/* Return true if all refs in the basic block are correct and complete. 4511 Due to df_ref_chain_verify, it will cause all refs 4512 that are verified to have DF_REF_MARK bit set. */ 4513 4514static bool 4515df_bb_verify (basic_block bb) 4516{ 4517 rtx insn; 4518 struct df_scan_bb_info *bb_info = df_scan_get_bb_info (bb->index); 4519 struct df_collection_rec collection_rec; 4520 4521 memset (&collection_rec, 0, sizeof (struct df_collection_rec)); 4522 collection_rec.def_vec = VEC_alloc (df_ref, stack, 128); 4523 collection_rec.use_vec = VEC_alloc (df_ref, stack, 32); 4524 collection_rec.eq_use_vec = VEC_alloc (df_ref, stack, 32); 4525 collection_rec.mw_vec = VEC_alloc (df_mw_hardreg_ptr, stack, 32); 4526 4527 gcc_assert (bb_info); 4528 4529 /* Scan the block, one insn at a time, from beginning to end. */ 4530 FOR_BB_INSNS_REVERSE (bb, insn) 4531 { 4532 if (!INSN_P (insn)) 4533 continue; 4534 df_insn_refs_verify (&collection_rec, bb, insn, true); 4535 df_free_collection_rec (&collection_rec); 4536 } 4537 4538 /* Do the artificial defs and uses. */ 4539 df_bb_refs_collect (&collection_rec, bb); 4540 df_refs_verify (collection_rec.def_vec, df_get_artificial_defs (bb->index), true); 4541 df_refs_verify (collection_rec.use_vec, df_get_artificial_uses (bb->index), true); 4542 df_free_collection_rec (&collection_rec); 4543 4544 return true; 4545} 4546 4547 4548/* Returns true if the entry block has correct and complete df_ref set. 4549 If not it either aborts if ABORT_IF_FAIL is true or returns false. */ 4550 4551static bool 4552df_entry_block_bitmap_verify (bool abort_if_fail) 4553{ 4554 bitmap entry_block_defs = BITMAP_ALLOC (&df_bitmap_obstack); 4555 bool is_eq; 4556 4557 df_get_entry_block_def_set (entry_block_defs); 4558 4559 is_eq = bitmap_equal_p (entry_block_defs, df->entry_block_defs); 4560 4561 if (!is_eq && abort_if_fail) 4562 { 4563 print_current_pass (stderr); 4564 fprintf (stderr, "entry_block_defs = "); 4565 df_print_regset (stderr, entry_block_defs); 4566 fprintf (stderr, "df->entry_block_defs = "); 4567 df_print_regset (stderr, df->entry_block_defs); 4568 gcc_assert (0); 4569 } 4570 4571 BITMAP_FREE (entry_block_defs); 4572 4573 return is_eq; 4574} 4575 4576 4577/* Returns true if the exit block has correct and complete df_ref set. 4578 If not it either aborts if ABORT_IF_FAIL is true or returns false. */ 4579 4580static bool 4581df_exit_block_bitmap_verify (bool abort_if_fail) 4582{ 4583 bitmap exit_block_uses = BITMAP_ALLOC (&df_bitmap_obstack); 4584 bool is_eq; 4585 4586 df_get_exit_block_use_set (exit_block_uses); 4587 4588 is_eq = bitmap_equal_p (exit_block_uses, df->exit_block_uses); 4589 4590 if (!is_eq && abort_if_fail) 4591 { 4592 print_current_pass (stderr); 4593 fprintf (stderr, "exit_block_uses = "); 4594 df_print_regset (stderr, exit_block_uses); 4595 fprintf (stderr, "df->exit_block_uses = "); 4596 df_print_regset (stderr, df->exit_block_uses); 4597 gcc_assert (0); 4598 } 4599 4600 BITMAP_FREE (exit_block_uses); 4601 4602 return is_eq; 4603} 4604 4605 4606/* Return true if df_ref information for all insns in all blocks are 4607 correct and complete. */ 4608 4609void 4610df_scan_verify (void) 4611{ 4612 unsigned int i; 4613 basic_block bb; 4614 bitmap regular_block_artificial_uses; 4615 bitmap eh_block_artificial_uses; 4616 4617 if (!df) 4618 return; 4619 4620 /* Verification is a 4 step process. */ 4621 4622 /* (1) All of the refs are marked by going thru the reg chains. */ 4623 for (i = 0; i < DF_REG_SIZE (df); i++) 4624 { 4625 gcc_assert (df_reg_chain_mark (DF_REG_DEF_CHAIN (i), i, true, false) 4626 == DF_REG_DEF_COUNT(i)); 4627 gcc_assert (df_reg_chain_mark (DF_REG_USE_CHAIN (i), i, false, false) 4628 == DF_REG_USE_COUNT(i)); 4629 gcc_assert (df_reg_chain_mark (DF_REG_EQ_USE_CHAIN (i), i, false, true) 4630 == DF_REG_EQ_USE_COUNT(i)); 4631 } 4632 4633 /* (2) There are various bitmaps whose value may change over the 4634 course of the compilation. This step recomputes them to make 4635 sure that they have not slipped out of date. */ 4636 regular_block_artificial_uses = BITMAP_ALLOC (&df_bitmap_obstack); 4637 eh_block_artificial_uses = BITMAP_ALLOC (&df_bitmap_obstack); 4638 4639 df_get_regular_block_artificial_uses (regular_block_artificial_uses); 4640 df_get_eh_block_artificial_uses (eh_block_artificial_uses); 4641 4642 bitmap_ior_into (eh_block_artificial_uses, 4643 regular_block_artificial_uses); 4644 4645 /* Check artificial_uses bitmaps didn't change. */ 4646 gcc_assert (bitmap_equal_p (regular_block_artificial_uses, 4647 df->regular_block_artificial_uses)); 4648 gcc_assert (bitmap_equal_p (eh_block_artificial_uses, 4649 df->eh_block_artificial_uses)); 4650 4651 BITMAP_FREE (regular_block_artificial_uses); 4652 BITMAP_FREE (eh_block_artificial_uses); 4653 4654 /* Verify entry block and exit block. These only verify the bitmaps, 4655 the refs are verified in df_bb_verify. */ 4656 df_entry_block_bitmap_verify (true); 4657 df_exit_block_bitmap_verify (true); 4658 4659 /* (3) All of the insns in all of the blocks are traversed and the 4660 marks are cleared both in the artificial refs attached to the 4661 blocks and the real refs inside the insns. It is a failure to 4662 clear a mark that has not been set as this means that the ref in 4663 the block or insn was not in the reg chain. */ 4664 4665 FOR_ALL_BB (bb) 4666 df_bb_verify (bb); 4667 4668 /* (4) See if all reg chains are traversed a second time. This time 4669 a check is made that the marks are clear. A set mark would be a 4670 from a reg that is not in any insn or basic block. */ 4671 4672 for (i = 0; i < DF_REG_SIZE (df); i++) 4673 { 4674 df_reg_chain_verify_unmarked (DF_REG_DEF_CHAIN (i)); 4675 df_reg_chain_verify_unmarked (DF_REG_USE_CHAIN (i)); 4676 df_reg_chain_verify_unmarked (DF_REG_EQ_USE_CHAIN (i)); 4677 } 4678} 4679