1 /* Transformations based on profile information for values. 2 Copyright (C) 2003-2020 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify it under 7 the terms of the GNU General Public License as published by the Free 8 Software Foundation; either version 3, or (at your option) any later 9 version. 10 11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GCC; see the file COPYING3. If not see 18 <http://www.gnu.org/licenses/>. */ 19 20 #include "config.h" 21 #include "system.h" 22 #include "coretypes.h" 23 #include "backend.h" 24 #include "rtl.h" 25 #include "tree.h" 26 #include "gimple.h" 27 #include "cfghooks.h" 28 #include "ssa.h" 29 #include "cgraph.h" 30 #include "coverage.h" 31 #include "data-streamer.h" 32 #include "diagnostic.h" 33 #include "fold-const.h" 34 #include "tree-nested.h" 35 #include "calls.h" 36 #include "expr.h" 37 #include "value-prof.h" 38 #include "tree-eh.h" 39 #include "gimplify.h" 40 #include "gimple-iterator.h" 41 #include "tree-cfg.h" 42 #include "gimple-pretty-print.h" 43 #include "dumpfile.h" 44 #include "builtins.h" 45 46 /* In this file value profile based optimizations are placed. Currently the 47 following optimizations are implemented (for more detailed descriptions 48 see comments at value_profile_transformations): 49 50 1) Division/modulo specialization. Provided that we can determine that the 51 operands of the division have some special properties, we may use it to 52 produce more effective code. 53 54 2) Indirect/virtual call specialization. If we can determine most 55 common function callee in indirect/virtual call. We can use this 56 information to improve code effectiveness (especially info for 57 the inliner). 58 59 3) Speculative prefetching. If we are able to determine that the difference 60 between addresses accessed by a memory reference is usually constant, we 61 may add the prefetch instructions. 62 FIXME: This transformation was removed together with RTL based value 63 profiling. 64 65 66 Value profiling internals 67 ========================== 68 69 Every value profiling transformation starts with defining what values 70 to profile. There are different histogram types (see HIST_TYPE_* in 71 value-prof.h) and each transformation can request one or more histogram 72 types per GIMPLE statement. The function gimple_find_values_to_profile() 73 collects the values to profile in a vec, and adds the number of counters 74 required for the different histogram types. 75 76 For a -fprofile-generate run, the statements for which values should be 77 recorded, are instrumented in instrument_values(). The instrumentation 78 is done by helper functions that can be found in tree-profile.c, where 79 new types of histograms can be added if necessary. 80 81 After a -fprofile-use, the value profiling data is read back in by 82 compute_value_histograms() that translates the collected data to 83 histograms and attaches them to the profiled statements via 84 gimple_add_histogram_value(). Histograms are stored in a hash table 85 that is attached to every intrumented function, see VALUE_HISTOGRAMS 86 in function.h. 87 88 The value-profile transformations driver is the function 89 gimple_value_profile_transformations(). It traverses all statements in 90 the to-be-transformed function, and looks for statements with one or 91 more histograms attached to it. If a statement has histograms, the 92 transformation functions are called on the statement. 93 94 Limitations / FIXME / TODO: 95 * Only one histogram of each type can be associated with a statement. 96 * Some value profile transformations are done in builtins.c (?!) 97 * Updating of histograms needs some TLC. 98 * The value profiling code could be used to record analysis results 99 from non-profiling (e.g. VRP). 100 * Adding new profilers should be simplified, starting with a cleanup 101 of what-happens-where and with making gimple_find_values_to_profile 102 and gimple_value_profile_transformations table-driven, perhaps... 103 */ 104 105 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *); 106 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *); 107 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *); 108 static bool gimple_stringops_transform (gimple_stmt_iterator *); 109 static void dump_ic_profile (gimple_stmt_iterator *gsi); 110 111 /* Allocate histogram value. */ 112 113 histogram_value 114 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED, 115 enum hist_type type, gimple *stmt, tree value) 116 { 117 histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist)); 118 hist->hvalue.value = value; 119 hist->hvalue.stmt = stmt; 120 hist->type = type; 121 return hist; 122 } 123 124 /* Hash value for histogram. */ 125 126 static hashval_t 127 histogram_hash (const void *x) 128 { 129 return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt); 130 } 131 132 /* Return nonzero if statement for histogram_value X is Y. */ 133 134 static int 135 histogram_eq (const void *x, const void *y) 136 { 137 return ((const_histogram_value) x)->hvalue.stmt == (const gimple *) y; 138 } 139 140 /* Set histogram for STMT. */ 141 142 static void 143 set_histogram_value (struct function *fun, gimple *stmt, histogram_value hist) 144 { 145 void **loc; 146 if (!hist && !VALUE_HISTOGRAMS (fun)) 147 return; 148 if (!VALUE_HISTOGRAMS (fun)) 149 VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash, 150 histogram_eq, NULL); 151 loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt, 152 htab_hash_pointer (stmt), 153 hist ? INSERT : NO_INSERT); 154 if (!hist) 155 { 156 if (loc) 157 htab_clear_slot (VALUE_HISTOGRAMS (fun), loc); 158 return; 159 } 160 *loc = hist; 161 } 162 163 /* Get histogram list for STMT. */ 164 165 histogram_value 166 gimple_histogram_value (struct function *fun, gimple *stmt) 167 { 168 if (!VALUE_HISTOGRAMS (fun)) 169 return NULL; 170 return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt, 171 htab_hash_pointer (stmt)); 172 } 173 174 /* Add histogram for STMT. */ 175 176 void 177 gimple_add_histogram_value (struct function *fun, gimple *stmt, 178 histogram_value hist) 179 { 180 hist->hvalue.next = gimple_histogram_value (fun, stmt); 181 set_histogram_value (fun, stmt, hist); 182 hist->fun = fun; 183 } 184 185 /* Remove histogram HIST from STMT's histogram list. */ 186 187 void 188 gimple_remove_histogram_value (struct function *fun, gimple *stmt, 189 histogram_value hist) 190 { 191 histogram_value hist2 = gimple_histogram_value (fun, stmt); 192 if (hist == hist2) 193 { 194 set_histogram_value (fun, stmt, hist->hvalue.next); 195 } 196 else 197 { 198 while (hist2->hvalue.next != hist) 199 hist2 = hist2->hvalue.next; 200 hist2->hvalue.next = hist->hvalue.next; 201 } 202 free (hist->hvalue.counters); 203 if (flag_checking) 204 memset (hist, 0xab, sizeof (*hist)); 205 free (hist); 206 } 207 208 /* Lookup histogram of type TYPE in the STMT. */ 209 210 histogram_value 211 gimple_histogram_value_of_type (struct function *fun, gimple *stmt, 212 enum hist_type type) 213 { 214 histogram_value hist; 215 for (hist = gimple_histogram_value (fun, stmt); hist; 216 hist = hist->hvalue.next) 217 if (hist->type == type) 218 return hist; 219 return NULL; 220 } 221 222 /* Dump information about HIST to DUMP_FILE. */ 223 224 static void 225 dump_histogram_value (FILE *dump_file, histogram_value hist) 226 { 227 switch (hist->type) 228 { 229 case HIST_TYPE_INTERVAL: 230 if (hist->hvalue.counters) 231 { 232 fprintf (dump_file, "Interval counter range [%d,%d]: [", 233 hist->hdata.intvl.int_start, 234 (hist->hdata.intvl.int_start 235 + hist->hdata.intvl.steps - 1)); 236 237 unsigned int i; 238 for (i = 0; i < hist->hdata.intvl.steps; i++) 239 { 240 fprintf (dump_file, "%d:%" PRId64, 241 hist->hdata.intvl.int_start + i, 242 (int64_t) hist->hvalue.counters[i]); 243 if (i != hist->hdata.intvl.steps - 1) 244 fprintf (dump_file, ", "); 245 } 246 fprintf (dump_file, "] outside range: %" PRId64 ".\n", 247 (int64_t) hist->hvalue.counters[i]); 248 } 249 break; 250 251 case HIST_TYPE_POW2: 252 if (hist->hvalue.counters) 253 fprintf (dump_file, "Pow2 counter pow2:%" PRId64 254 " nonpow2:%" PRId64 ".\n", 255 (int64_t) hist->hvalue.counters[1], 256 (int64_t) hist->hvalue.counters[0]); 257 break; 258 259 case HIST_TYPE_TOPN_VALUES: 260 case HIST_TYPE_INDIR_CALL: 261 if (hist->hvalue.counters) 262 { 263 fprintf (dump_file, 264 (hist->type == HIST_TYPE_TOPN_VALUES 265 ? "Top N value counter" : "Indirect call counter")); 266 if (hist->hvalue.counters) 267 { 268 fprintf (dump_file, " all: %" PRId64 "%s, values: ", 269 (int64_t) abs_hwi (hist->hvalue.counters[0]), 270 hist->hvalue.counters[0] < 0 271 ? " (values missing)": ""); 272 for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) 273 { 274 fprintf (dump_file, "[%" PRId64 ":%" PRId64 "]", 275 (int64_t) hist->hvalue.counters[2 * i + 1], 276 (int64_t) hist->hvalue.counters[2 * i + 2]); 277 if (i != GCOV_TOPN_VALUES - 1) 278 fprintf (dump_file, ", "); 279 } 280 fprintf (dump_file, ".\n"); 281 } 282 } 283 break; 284 285 case HIST_TYPE_AVERAGE: 286 if (hist->hvalue.counters) 287 fprintf (dump_file, "Average value sum:%" PRId64 288 " times:%" PRId64 ".\n", 289 (int64_t) hist->hvalue.counters[0], 290 (int64_t) hist->hvalue.counters[1]); 291 break; 292 293 case HIST_TYPE_IOR: 294 if (hist->hvalue.counters) 295 fprintf (dump_file, "IOR value ior:%" PRId64 ".\n", 296 (int64_t) hist->hvalue.counters[0]); 297 break; 298 299 case HIST_TYPE_TIME_PROFILE: 300 if (hist->hvalue.counters) 301 fprintf (dump_file, "Time profile time:%" PRId64 ".\n", 302 (int64_t) hist->hvalue.counters[0]); 303 break; 304 default: 305 gcc_unreachable (); 306 } 307 } 308 309 /* Dump information about HIST to DUMP_FILE. */ 310 311 void 312 stream_out_histogram_value (struct output_block *ob, histogram_value hist) 313 { 314 struct bitpack_d bp; 315 unsigned int i; 316 317 bp = bitpack_create (ob->main_stream); 318 bp_pack_enum (&bp, hist_type, HIST_TYPE_MAX, hist->type); 319 bp_pack_value (&bp, hist->hvalue.next != NULL, 1); 320 streamer_write_bitpack (&bp); 321 switch (hist->type) 322 { 323 case HIST_TYPE_INTERVAL: 324 streamer_write_hwi (ob, hist->hdata.intvl.int_start); 325 streamer_write_uhwi (ob, hist->hdata.intvl.steps); 326 break; 327 default: 328 break; 329 } 330 for (i = 0; i < hist->n_counters; i++) 331 { 332 /* When user uses an unsigned type with a big value, constant converted 333 to gcov_type (a signed type) can be negative. */ 334 gcov_type value = hist->hvalue.counters[i]; 335 if (hist->type == HIST_TYPE_TOPN_VALUES 336 || hist->type == HIST_TYPE_IOR) 337 /* Note that the IOR counter tracks pointer values and these can have 338 sign bit set. */ 339 ; 340 else 341 gcc_assert (value >= 0); 342 343 streamer_write_gcov_count (ob, value); 344 } 345 if (hist->hvalue.next) 346 stream_out_histogram_value (ob, hist->hvalue.next); 347 } 348 349 /* Dump information about HIST to DUMP_FILE. */ 350 351 void 352 stream_in_histogram_value (class lto_input_block *ib, gimple *stmt) 353 { 354 enum hist_type type; 355 unsigned int ncounters = 0; 356 struct bitpack_d bp; 357 unsigned int i; 358 histogram_value new_val; 359 bool next; 360 histogram_value *next_p = NULL; 361 362 do 363 { 364 bp = streamer_read_bitpack (ib); 365 type = bp_unpack_enum (&bp, hist_type, HIST_TYPE_MAX); 366 next = bp_unpack_value (&bp, 1); 367 new_val = gimple_alloc_histogram_value (cfun, type, stmt); 368 switch (type) 369 { 370 case HIST_TYPE_INTERVAL: 371 new_val->hdata.intvl.int_start = streamer_read_hwi (ib); 372 new_val->hdata.intvl.steps = streamer_read_uhwi (ib); 373 ncounters = new_val->hdata.intvl.steps + 2; 374 break; 375 376 case HIST_TYPE_POW2: 377 case HIST_TYPE_AVERAGE: 378 ncounters = 2; 379 break; 380 381 case HIST_TYPE_TOPN_VALUES: 382 case HIST_TYPE_INDIR_CALL: 383 ncounters = GCOV_TOPN_VALUES_COUNTERS; 384 break; 385 386 case HIST_TYPE_IOR: 387 case HIST_TYPE_TIME_PROFILE: 388 ncounters = 1; 389 break; 390 391 default: 392 gcc_unreachable (); 393 } 394 new_val->hvalue.counters = XNEWVAR (gcov_type, 395 sizeof (*new_val->hvalue.counters) 396 * ncounters); 397 new_val->n_counters = ncounters; 398 for (i = 0; i < ncounters; i++) 399 new_val->hvalue.counters[i] = streamer_read_gcov_count (ib); 400 if (!next_p) 401 gimple_add_histogram_value (cfun, stmt, new_val); 402 else 403 *next_p = new_val; 404 next_p = &new_val->hvalue.next; 405 } 406 while (next); 407 } 408 409 /* Dump all histograms attached to STMT to DUMP_FILE. */ 410 411 void 412 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple *stmt) 413 { 414 histogram_value hist; 415 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next) 416 dump_histogram_value (dump_file, hist); 417 } 418 419 /* Remove all histograms associated with STMT. */ 420 421 void 422 gimple_remove_stmt_histograms (struct function *fun, gimple *stmt) 423 { 424 histogram_value val; 425 while ((val = gimple_histogram_value (fun, stmt)) != NULL) 426 gimple_remove_histogram_value (fun, stmt, val); 427 } 428 429 /* Duplicate all histograms associates with OSTMT to STMT. */ 430 431 void 432 gimple_duplicate_stmt_histograms (struct function *fun, gimple *stmt, 433 struct function *ofun, gimple *ostmt) 434 { 435 histogram_value val; 436 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next) 437 { 438 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type); 439 memcpy (new_val, val, sizeof (*val)); 440 new_val->hvalue.stmt = stmt; 441 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters); 442 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters); 443 gimple_add_histogram_value (fun, stmt, new_val); 444 } 445 } 446 447 /* Move all histograms associated with OSTMT to STMT. */ 448 449 void 450 gimple_move_stmt_histograms (struct function *fun, gimple *stmt, gimple *ostmt) 451 { 452 histogram_value val = gimple_histogram_value (fun, ostmt); 453 if (val) 454 { 455 /* The following three statements can't be reordered, 456 because histogram hashtab relies on stmt field value 457 for finding the exact slot. */ 458 set_histogram_value (fun, ostmt, NULL); 459 for (; val != NULL; val = val->hvalue.next) 460 val->hvalue.stmt = stmt; 461 set_histogram_value (fun, stmt, val); 462 } 463 } 464 465 static bool error_found = false; 466 467 /* Helper function for verify_histograms. For each histogram reachable via htab 468 walk verify that it was reached via statement walk. */ 469 470 static int 471 visit_hist (void **slot, void *data) 472 { 473 hash_set<histogram_value> *visited = (hash_set<histogram_value> *) data; 474 histogram_value hist = *(histogram_value *) slot; 475 476 if (!visited->contains (hist) 477 && hist->type != HIST_TYPE_TIME_PROFILE) 478 { 479 error ("dead histogram"); 480 dump_histogram_value (stderr, hist); 481 debug_gimple_stmt (hist->hvalue.stmt); 482 error_found = true; 483 } 484 return 1; 485 } 486 487 /* Verify sanity of the histograms. */ 488 489 DEBUG_FUNCTION void 490 verify_histograms (void) 491 { 492 basic_block bb; 493 gimple_stmt_iterator gsi; 494 histogram_value hist; 495 496 error_found = false; 497 hash_set<histogram_value> visited_hists; 498 FOR_EACH_BB_FN (bb, cfun) 499 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 500 { 501 gimple *stmt = gsi_stmt (gsi); 502 503 for (hist = gimple_histogram_value (cfun, stmt); hist; 504 hist = hist->hvalue.next) 505 { 506 if (hist->hvalue.stmt != stmt) 507 { 508 error ("histogram value statement does not correspond to " 509 "the statement it is associated with"); 510 debug_gimple_stmt (stmt); 511 dump_histogram_value (stderr, hist); 512 error_found = true; 513 } 514 visited_hists.add (hist); 515 } 516 } 517 if (VALUE_HISTOGRAMS (cfun)) 518 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, &visited_hists); 519 if (error_found) 520 internal_error ("%qs failed", __func__); 521 } 522 523 /* Helper function for verify_histograms. For each histogram reachable via htab 524 walk verify that it was reached via statement walk. */ 525 526 static int 527 free_hist (void **slot, void *data ATTRIBUTE_UNUSED) 528 { 529 histogram_value hist = *(histogram_value *) slot; 530 free (hist->hvalue.counters); 531 free (hist); 532 return 1; 533 } 534 535 void 536 free_histograms (struct function *fn) 537 { 538 if (VALUE_HISTOGRAMS (fn)) 539 { 540 htab_traverse (VALUE_HISTOGRAMS (fn), free_hist, NULL); 541 htab_delete (VALUE_HISTOGRAMS (fn)); 542 VALUE_HISTOGRAMS (fn) = NULL; 543 } 544 } 545 546 /* The overall number of invocations of the counter should match 547 execution count of basic block. Report it as error rather than 548 internal error as it might mean that user has misused the profile 549 somehow. */ 550 551 static bool 552 check_counter (gimple *stmt, const char * name, 553 gcov_type *count, gcov_type *all, profile_count bb_count_d) 554 { 555 gcov_type bb_count = bb_count_d.ipa ().to_gcov_type (); 556 if (*all != bb_count || *count > *all) 557 { 558 dump_user_location_t locus; 559 locus = ((stmt != NULL) 560 ? dump_user_location_t (stmt) 561 : dump_user_location_t::from_function_decl 562 (current_function_decl)); 563 if (flag_profile_correction) 564 { 565 if (dump_enabled_p ()) 566 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus, 567 "correcting inconsistent value profile: %s " 568 "profiler overall count (%d) does not match BB " 569 "count (%d)\n", name, (int)*all, (int)bb_count); 570 *all = bb_count; 571 if (*count > *all) 572 *count = *all; 573 return false; 574 } 575 else 576 { 577 error_at (locus.get_location_t (), "corrupted value profile: %s " 578 "profile counter (%d out of %d) inconsistent with " 579 "basic-block count (%d)", 580 name, 581 (int) *count, 582 (int) *all, 583 (int) bb_count); 584 return true; 585 } 586 } 587 588 return false; 589 } 590 591 /* GIMPLE based transformations. */ 592 593 bool 594 gimple_value_profile_transformations (void) 595 { 596 basic_block bb; 597 gimple_stmt_iterator gsi; 598 bool changed = false; 599 600 FOR_EACH_BB_FN (bb, cfun) 601 { 602 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 603 { 604 gimple *stmt = gsi_stmt (gsi); 605 histogram_value th = gimple_histogram_value (cfun, stmt); 606 if (!th) 607 continue; 608 609 if (dump_file) 610 { 611 fprintf (dump_file, "Trying transformations on stmt "); 612 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 613 dump_histograms_for_stmt (cfun, dump_file, stmt); 614 } 615 616 /* Transformations: */ 617 /* The order of things in this conditional controls which 618 transformation is used when more than one is applicable. */ 619 /* It is expected that any code added by the transformations 620 will be added before the current statement, and that the 621 current statement remain valid (although possibly 622 modified) upon return. */ 623 if (gimple_mod_subtract_transform (&gsi) 624 || gimple_divmod_fixed_value_transform (&gsi) 625 || gimple_mod_pow2_value_transform (&gsi) 626 || gimple_stringops_transform (&gsi)) 627 { 628 stmt = gsi_stmt (gsi); 629 changed = true; 630 /* Original statement may no longer be in the same block. */ 631 if (bb != gimple_bb (stmt)) 632 { 633 bb = gimple_bb (stmt); 634 gsi = gsi_for_stmt (stmt); 635 } 636 } 637 638 /* The function never thansforms a GIMPLE statement. */ 639 if (dump_enabled_p ()) 640 dump_ic_profile (&gsi); 641 } 642 } 643 644 return changed; 645 } 646 647 /* Generate code for transformation 1 (with parent gimple assignment 648 STMT and probability of taking the optimal path PROB, which is 649 equivalent to COUNT/ALL within roundoff error). This generates the 650 result into a temp and returns the temp; it does not replace or 651 alter the original STMT. */ 652 653 static tree 654 gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob, 655 gcov_type count, gcov_type all) 656 { 657 gassign *stmt1, *stmt2; 658 gcond *stmt3; 659 tree tmp0, tmp1, tmp2; 660 gimple *bb1end, *bb2end, *bb3end; 661 basic_block bb, bb2, bb3, bb4; 662 tree optype, op1, op2; 663 edge e12, e13, e23, e24, e34; 664 gimple_stmt_iterator gsi; 665 666 gcc_assert (is_gimple_assign (stmt) 667 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR 668 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR)); 669 670 optype = TREE_TYPE (gimple_assign_lhs (stmt)); 671 op1 = gimple_assign_rhs1 (stmt); 672 op2 = gimple_assign_rhs2 (stmt); 673 674 bb = gimple_bb (stmt); 675 gsi = gsi_for_stmt (stmt); 676 677 tmp0 = make_temp_ssa_name (optype, NULL, "PROF"); 678 tmp1 = make_temp_ssa_name (optype, NULL, "PROF"); 679 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value)); 680 stmt2 = gimple_build_assign (tmp1, op2); 681 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE); 682 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 683 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); 684 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT); 685 bb1end = stmt3; 686 687 tmp2 = create_tmp_reg (optype, "PROF"); 688 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, tmp0); 689 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 690 bb2end = stmt1; 691 692 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, op2); 693 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 694 bb3end = stmt1; 695 696 /* Fix CFG. */ 697 /* Edge e23 connects bb2 to bb3, etc. */ 698 e12 = split_block (bb, bb1end); 699 bb2 = e12->dest; 700 bb2->count = profile_count::from_gcov_type (count); 701 e23 = split_block (bb2, bb2end); 702 bb3 = e23->dest; 703 bb3->count = profile_count::from_gcov_type (all - count); 704 e34 = split_block (bb3, bb3end); 705 bb4 = e34->dest; 706 bb4->count = profile_count::from_gcov_type (all); 707 708 e12->flags &= ~EDGE_FALLTHRU; 709 e12->flags |= EDGE_FALSE_VALUE; 710 e12->probability = prob; 711 712 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE); 713 e13->probability = prob.invert (); 714 715 remove_edge (e23); 716 717 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU); 718 e24->probability = profile_probability::always (); 719 720 e34->probability = profile_probability::always (); 721 722 return tmp2; 723 } 724 725 /* Return the n-th value count of TOPN_VALUE histogram. If 726 there's a value, return true and set VALUE and COUNT 727 arguments. 728 729 Counters have the following meaning. 730 731 abs (counters[0]) is the number of executions 732 for i in 0 ... TOPN-1 733 counters[2 * i + 1] is target 734 abs (counters[2 * i + 2]) is corresponding hitrate counter. 735 736 Value of counters[0] negative when counter became 737 full during merging and some values are lost. */ 738 739 bool 740 get_nth_most_common_value (gimple *stmt, const char *counter_type, 741 histogram_value hist, gcov_type *value, 742 gcov_type *count, gcov_type *all, unsigned n) 743 { 744 gcc_assert (n < GCOV_TOPN_VALUES); 745 746 *count = 0; 747 *value = 0; 748 749 gcov_type read_all = abs_hwi (hist->hvalue.counters[0]); 750 751 gcov_type v = hist->hvalue.counters[2 * n + 1]; 752 gcov_type c = hist->hvalue.counters[2 * n + 2]; 753 754 if (hist->hvalue.counters[0] < 0 755 && (flag_profile_reproducible == PROFILE_REPRODUCIBILITY_PARALLEL_RUNS 756 || (flag_profile_reproducible 757 == PROFILE_REPRODUCIBILITY_MULTITHREADED))) 758 return false; 759 760 /* Indirect calls can't be verified. */ 761 if (stmt 762 && check_counter (stmt, counter_type, &c, &read_all, 763 gimple_bb (stmt)->count)) 764 return false; 765 766 *all = read_all; 767 768 *value = v; 769 *count = c; 770 return true; 771 } 772 773 /* Do transform 1) on INSN if applicable. */ 774 775 static bool 776 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si) 777 { 778 histogram_value histogram; 779 enum tree_code code; 780 gcov_type val, count, all; 781 tree result, value, tree_val; 782 profile_probability prob; 783 gassign *stmt; 784 785 stmt = dyn_cast <gassign *> (gsi_stmt (*si)); 786 if (!stmt) 787 return false; 788 789 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt)))) 790 return false; 791 792 code = gimple_assign_rhs_code (stmt); 793 794 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR) 795 return false; 796 797 histogram = gimple_histogram_value_of_type (cfun, stmt, 798 HIST_TYPE_TOPN_VALUES); 799 if (!histogram) 800 return false; 801 802 if (!get_nth_most_common_value (stmt, "divmod", histogram, &val, &count, 803 &all)) 804 return false; 805 806 value = histogram->hvalue.value; 807 gimple_remove_histogram_value (cfun, stmt, histogram); 808 809 /* We require that count is at least half of all. */ 810 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1 811 || 2 * count < all 812 || optimize_bb_for_size_p (gimple_bb (stmt))) 813 return false; 814 815 /* Compute probability of taking the optimal path. */ 816 if (all > 0) 817 prob = profile_probability::probability_in_gcov_type (count, all); 818 else 819 prob = profile_probability::never (); 820 821 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT)) 822 tree_val = build_int_cst (get_gcov_type (), val); 823 else 824 { 825 HOST_WIDE_INT a[2]; 826 a[0] = (unsigned HOST_WIDE_INT) val; 827 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1; 828 829 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2, 830 TYPE_PRECISION (get_gcov_type ()), false)); 831 } 832 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all); 833 834 if (dump_enabled_p ()) 835 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt, 836 "Transformation done: div/mod by constant %T\n", tree_val); 837 838 gimple_assign_set_rhs_from_tree (si, result); 839 update_stmt (gsi_stmt (*si)); 840 841 return true; 842 } 843 844 /* Generate code for transformation 2 (with parent gimple assign STMT and 845 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL 846 within roundoff error). This generates the result into a temp and returns 847 the temp; it does not replace or alter the original STMT. */ 848 849 static tree 850 gimple_mod_pow2 (gassign *stmt, profile_probability prob, gcov_type count, gcov_type all) 851 { 852 gassign *stmt1, *stmt2, *stmt3; 853 gcond *stmt4; 854 tree tmp2, tmp3; 855 gimple *bb1end, *bb2end, *bb3end; 856 basic_block bb, bb2, bb3, bb4; 857 tree optype, op1, op2; 858 edge e12, e13, e23, e24, e34; 859 gimple_stmt_iterator gsi; 860 tree result; 861 862 gcc_assert (is_gimple_assign (stmt) 863 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR); 864 865 optype = TREE_TYPE (gimple_assign_lhs (stmt)); 866 op1 = gimple_assign_rhs1 (stmt); 867 op2 = gimple_assign_rhs2 (stmt); 868 869 bb = gimple_bb (stmt); 870 gsi = gsi_for_stmt (stmt); 871 872 result = create_tmp_reg (optype, "PROF"); 873 tmp2 = make_temp_ssa_name (optype, NULL, "PROF"); 874 tmp3 = make_temp_ssa_name (optype, NULL, "PROF"); 875 stmt2 = gimple_build_assign (tmp2, PLUS_EXPR, op2, 876 build_int_cst (optype, -1)); 877 stmt3 = gimple_build_assign (tmp3, BIT_AND_EXPR, tmp2, op2); 878 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0), 879 NULL_TREE, NULL_TREE); 880 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); 881 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT); 882 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT); 883 bb1end = stmt4; 884 885 /* tmp2 == op2-1 inherited from previous block. */ 886 stmt1 = gimple_build_assign (result, BIT_AND_EXPR, op1, tmp2); 887 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 888 bb2end = stmt1; 889 890 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt), 891 op1, op2); 892 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 893 bb3end = stmt1; 894 895 /* Fix CFG. */ 896 /* Edge e23 connects bb2 to bb3, etc. */ 897 e12 = split_block (bb, bb1end); 898 bb2 = e12->dest; 899 bb2->count = profile_count::from_gcov_type (count); 900 e23 = split_block (bb2, bb2end); 901 bb3 = e23->dest; 902 bb3->count = profile_count::from_gcov_type (all - count); 903 e34 = split_block (bb3, bb3end); 904 bb4 = e34->dest; 905 bb4->count = profile_count::from_gcov_type (all); 906 907 e12->flags &= ~EDGE_FALLTHRU; 908 e12->flags |= EDGE_FALSE_VALUE; 909 e12->probability = prob; 910 911 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE); 912 e13->probability = prob.invert (); 913 914 remove_edge (e23); 915 916 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU); 917 e24->probability = profile_probability::always (); 918 919 e34->probability = profile_probability::always (); 920 921 return result; 922 } 923 924 /* Do transform 2) on INSN if applicable. */ 925 926 static bool 927 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si) 928 { 929 histogram_value histogram; 930 enum tree_code code; 931 gcov_type count, wrong_values, all; 932 tree lhs_type, result, value; 933 profile_probability prob; 934 gassign *stmt; 935 936 stmt = dyn_cast <gassign *> (gsi_stmt (*si)); 937 if (!stmt) 938 return false; 939 940 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt)); 941 if (!INTEGRAL_TYPE_P (lhs_type)) 942 return false; 943 944 code = gimple_assign_rhs_code (stmt); 945 946 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type)) 947 return false; 948 949 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2); 950 if (!histogram) 951 return false; 952 953 value = histogram->hvalue.value; 954 wrong_values = histogram->hvalue.counters[0]; 955 count = histogram->hvalue.counters[1]; 956 957 gimple_remove_histogram_value (cfun, stmt, histogram); 958 959 /* We require that we hit a power of 2 at least half of all evaluations. */ 960 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1 961 || count < wrong_values 962 || optimize_bb_for_size_p (gimple_bb (stmt))) 963 return false; 964 965 /* Compute probability of taking the optimal path. */ 966 all = count + wrong_values; 967 968 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count)) 969 return false; 970 971 if (dump_enabled_p ()) 972 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt, 973 "Transformation done: mod power of 2\n"); 974 975 if (all > 0) 976 prob = profile_probability::probability_in_gcov_type (count, all); 977 else 978 prob = profile_probability::never (); 979 980 result = gimple_mod_pow2 (stmt, prob, count, all); 981 982 gimple_assign_set_rhs_from_tree (si, result); 983 update_stmt (gsi_stmt (*si)); 984 985 return true; 986 } 987 988 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and 989 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is 990 supported and this is built into this interface. The probabilities of taking 991 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and 992 COUNT2/ALL respectively within roundoff error). This generates the 993 result into a temp and returns the temp; it does not replace or alter 994 the original STMT. */ 995 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */ 996 997 static tree 998 gimple_mod_subtract (gassign *stmt, profile_probability prob1, 999 profile_probability prob2, int ncounts, 1000 gcov_type count1, gcov_type count2, gcov_type all) 1001 { 1002 gassign *stmt1; 1003 gimple *stmt2; 1004 gcond *stmt3; 1005 tree tmp1; 1006 gimple *bb1end, *bb2end = NULL, *bb3end; 1007 basic_block bb, bb2, bb3, bb4; 1008 tree optype, op1, op2; 1009 edge e12, e23 = 0, e24, e34, e14; 1010 gimple_stmt_iterator gsi; 1011 tree result; 1012 1013 gcc_assert (is_gimple_assign (stmt) 1014 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR); 1015 1016 optype = TREE_TYPE (gimple_assign_lhs (stmt)); 1017 op1 = gimple_assign_rhs1 (stmt); 1018 op2 = gimple_assign_rhs2 (stmt); 1019 1020 bb = gimple_bb (stmt); 1021 gsi = gsi_for_stmt (stmt); 1022 1023 result = create_tmp_reg (optype, "PROF"); 1024 tmp1 = make_temp_ssa_name (optype, NULL, "PROF"); 1025 stmt1 = gimple_build_assign (result, op1); 1026 stmt2 = gimple_build_assign (tmp1, op2); 1027 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE); 1028 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 1029 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); 1030 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT); 1031 bb1end = stmt3; 1032 1033 if (ncounts) /* Assumed to be 0 or 1 */ 1034 { 1035 stmt1 = gimple_build_assign (result, MINUS_EXPR, result, tmp1); 1036 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE); 1037 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 1038 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); 1039 bb2end = stmt2; 1040 } 1041 1042 /* Fallback case. */ 1043 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt), 1044 result, tmp1); 1045 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); 1046 bb3end = stmt1; 1047 1048 /* Fix CFG. */ 1049 /* Edge e23 connects bb2 to bb3, etc. */ 1050 /* However block 3 is optional; if it is not there, references 1051 to 3 really refer to block 2. */ 1052 e12 = split_block (bb, bb1end); 1053 bb2 = e12->dest; 1054 bb2->count = profile_count::from_gcov_type (all - count1); 1055 1056 if (ncounts) /* Assumed to be 0 or 1. */ 1057 { 1058 e23 = split_block (bb2, bb2end); 1059 bb3 = e23->dest; 1060 bb3->count = profile_count::from_gcov_type (all - count1 - count2); 1061 } 1062 1063 e34 = split_block (ncounts ? bb3 : bb2, bb3end); 1064 bb4 = e34->dest; 1065 bb4->count = profile_count::from_gcov_type (all); 1066 1067 e12->flags &= ~EDGE_FALLTHRU; 1068 e12->flags |= EDGE_FALSE_VALUE; 1069 e12->probability = prob1.invert (); 1070 1071 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE); 1072 e14->probability = prob1; 1073 1074 if (ncounts) /* Assumed to be 0 or 1. */ 1075 { 1076 e23->flags &= ~EDGE_FALLTHRU; 1077 e23->flags |= EDGE_FALSE_VALUE; 1078 e23->probability = prob2.invert (); 1079 1080 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE); 1081 e24->probability = prob2; 1082 } 1083 1084 e34->probability = profile_probability::always (); 1085 1086 return result; 1087 } 1088 1089 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */ 1090 1091 static bool 1092 gimple_mod_subtract_transform (gimple_stmt_iterator *si) 1093 { 1094 histogram_value histogram; 1095 enum tree_code code; 1096 gcov_type count, wrong_values, all; 1097 tree lhs_type, result; 1098 profile_probability prob1, prob2; 1099 unsigned int i, steps; 1100 gcov_type count1, count2; 1101 gassign *stmt; 1102 stmt = dyn_cast <gassign *> (gsi_stmt (*si)); 1103 if (!stmt) 1104 return false; 1105 1106 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt)); 1107 if (!INTEGRAL_TYPE_P (lhs_type)) 1108 return false; 1109 1110 code = gimple_assign_rhs_code (stmt); 1111 1112 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type)) 1113 return false; 1114 1115 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL); 1116 if (!histogram) 1117 return false; 1118 1119 all = 0; 1120 wrong_values = 0; 1121 for (i = 0; i < histogram->hdata.intvl.steps; i++) 1122 all += histogram->hvalue.counters[i]; 1123 1124 wrong_values += histogram->hvalue.counters[i]; 1125 wrong_values += histogram->hvalue.counters[i+1]; 1126 steps = histogram->hdata.intvl.steps; 1127 all += wrong_values; 1128 count1 = histogram->hvalue.counters[0]; 1129 count2 = histogram->hvalue.counters[1]; 1130 1131 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count)) 1132 { 1133 gimple_remove_histogram_value (cfun, stmt, histogram); 1134 return false; 1135 } 1136 1137 if (flag_profile_correction && count1 + count2 > all) 1138 all = count1 + count2; 1139 1140 gcc_assert (count1 + count2 <= all); 1141 1142 /* We require that we use just subtractions in at least 50% of all 1143 evaluations. */ 1144 count = 0; 1145 for (i = 0; i < histogram->hdata.intvl.steps; i++) 1146 { 1147 count += histogram->hvalue.counters[i]; 1148 if (count * 2 >= all) 1149 break; 1150 } 1151 if (i == steps 1152 || optimize_bb_for_size_p (gimple_bb (stmt))) 1153 return false; 1154 1155 gimple_remove_histogram_value (cfun, stmt, histogram); 1156 if (dump_enabled_p ()) 1157 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt, 1158 "Transformation done: mod subtract\n"); 1159 1160 /* Compute probability of taking the optimal path(s). */ 1161 if (all > 0) 1162 { 1163 prob1 = profile_probability::probability_in_gcov_type (count1, all); 1164 prob2 = profile_probability::probability_in_gcov_type (count2, all); 1165 } 1166 else 1167 { 1168 prob1 = prob2 = profile_probability::never (); 1169 } 1170 1171 /* In practice, "steps" is always 2. This interface reflects this, 1172 and will need to be changed if "steps" can change. */ 1173 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all); 1174 1175 gimple_assign_set_rhs_from_tree (si, result); 1176 update_stmt (gsi_stmt (*si)); 1177 1178 return true; 1179 } 1180 1181 typedef int_hash <unsigned int, 0, UINT_MAX> profile_id_hash; 1182 1183 static hash_map<profile_id_hash, cgraph_node *> *cgraph_node_map = 0; 1184 1185 /* Returns true if node graph is initialized. This 1186 is used to test if profile_id has been created 1187 for cgraph_nodes. */ 1188 1189 bool 1190 coverage_node_map_initialized_p (void) 1191 { 1192 return cgraph_node_map != 0; 1193 } 1194 1195 /* Initialize map from PROFILE_ID to CGRAPH_NODE. 1196 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume 1197 that the PROFILE_IDs was already assigned. */ 1198 1199 void 1200 init_node_map (bool local) 1201 { 1202 struct cgraph_node *n; 1203 cgraph_node_map = new hash_map<profile_id_hash, cgraph_node *>; 1204 1205 FOR_EACH_DEFINED_FUNCTION (n) 1206 if (n->has_gimple_body_p () || n->thunk.thunk_p) 1207 { 1208 cgraph_node **val; 1209 dump_user_location_t loc 1210 = dump_user_location_t::from_function_decl (n->decl); 1211 if (local) 1212 { 1213 n->profile_id = coverage_compute_profile_id (n); 1214 while ((val = cgraph_node_map->get (n->profile_id)) 1215 || !n->profile_id) 1216 { 1217 if (dump_enabled_p ()) 1218 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc, 1219 "Local profile-id %i conflict" 1220 " with nodes %s %s\n", 1221 n->profile_id, 1222 n->dump_name (), 1223 (*val)->dump_name ()); 1224 n->profile_id = (n->profile_id + 1) & 0x7fffffff; 1225 } 1226 } 1227 else if (!n->profile_id) 1228 { 1229 if (dump_enabled_p ()) 1230 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc, 1231 "Node %s has no profile-id" 1232 " (profile feedback missing?)\n", 1233 n->dump_name ()); 1234 continue; 1235 } 1236 else if ((val = cgraph_node_map->get (n->profile_id))) 1237 { 1238 if (dump_enabled_p ()) 1239 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc, 1240 "Node %s has IP profile-id %i conflict. " 1241 "Giving up.\n", 1242 n->dump_name (), n->profile_id); 1243 *val = NULL; 1244 continue; 1245 } 1246 cgraph_node_map->put (n->profile_id, n); 1247 } 1248 } 1249 1250 /* Delete the CGRAPH_NODE_MAP. */ 1251 1252 void 1253 del_node_map (void) 1254 { 1255 delete cgraph_node_map; 1256 } 1257 1258 /* Return cgraph node for function with pid */ 1259 1260 struct cgraph_node* 1261 find_func_by_profile_id (int profile_id) 1262 { 1263 cgraph_node **val = cgraph_node_map->get (profile_id); 1264 if (val) 1265 return *val; 1266 else 1267 return NULL; 1268 } 1269 1270 /* Do transformation 1271 1272 if (actual_callee_address == address_of_most_common_function/method) 1273 do direct call 1274 else 1275 old call 1276 */ 1277 1278 gcall * 1279 gimple_ic (gcall *icall_stmt, struct cgraph_node *direct_call, 1280 profile_probability prob) 1281 { 1282 gcall *dcall_stmt; 1283 gassign *load_stmt; 1284 gcond *cond_stmt; 1285 tree tmp0, tmp1, tmp; 1286 basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL; 1287 edge e_cd, e_ci, e_di, e_dj = NULL, e_ij; 1288 gimple_stmt_iterator gsi; 1289 int lp_nr, dflags; 1290 edge e_eh, e; 1291 edge_iterator ei; 1292 1293 cond_bb = gimple_bb (icall_stmt); 1294 gsi = gsi_for_stmt (icall_stmt); 1295 1296 tmp0 = make_temp_ssa_name (ptr_type_node, NULL, "PROF"); 1297 tmp1 = make_temp_ssa_name (ptr_type_node, NULL, "PROF"); 1298 tmp = unshare_expr (gimple_call_fn (icall_stmt)); 1299 load_stmt = gimple_build_assign (tmp0, tmp); 1300 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); 1301 1302 tmp = fold_convert (ptr_type_node, build_addr (direct_call->decl)); 1303 load_stmt = gimple_build_assign (tmp1, tmp); 1304 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); 1305 1306 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE); 1307 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT); 1308 1309 if (TREE_CODE (gimple_vdef (icall_stmt)) == SSA_NAME) 1310 { 1311 unlink_stmt_vdef (icall_stmt); 1312 release_ssa_name (gimple_vdef (icall_stmt)); 1313 } 1314 gimple_set_vdef (icall_stmt, NULL_TREE); 1315 gimple_set_vuse (icall_stmt, NULL_TREE); 1316 update_stmt (icall_stmt); 1317 dcall_stmt = as_a <gcall *> (gimple_copy (icall_stmt)); 1318 gimple_call_set_fndecl (dcall_stmt, direct_call->decl); 1319 dflags = flags_from_decl_or_type (direct_call->decl); 1320 if ((dflags & ECF_NORETURN) != 0 1321 && should_remove_lhs_p (gimple_call_lhs (dcall_stmt))) 1322 gimple_call_set_lhs (dcall_stmt, NULL_TREE); 1323 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT); 1324 1325 /* Fix CFG. */ 1326 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */ 1327 e_cd = split_block (cond_bb, cond_stmt); 1328 dcall_bb = e_cd->dest; 1329 dcall_bb->count = cond_bb->count.apply_probability (prob); 1330 1331 e_di = split_block (dcall_bb, dcall_stmt); 1332 icall_bb = e_di->dest; 1333 icall_bb->count = cond_bb->count - dcall_bb->count; 1334 1335 /* Do not disturb existing EH edges from the indirect call. */ 1336 if (!stmt_ends_bb_p (icall_stmt)) 1337 e_ij = split_block (icall_bb, icall_stmt); 1338 else 1339 { 1340 e_ij = find_fallthru_edge (icall_bb->succs); 1341 /* The indirect call might be noreturn. */ 1342 if (e_ij != NULL) 1343 { 1344 e_ij->probability = profile_probability::always (); 1345 e_ij = single_pred_edge (split_edge (e_ij)); 1346 } 1347 } 1348 if (e_ij != NULL) 1349 { 1350 join_bb = e_ij->dest; 1351 join_bb->count = cond_bb->count; 1352 } 1353 1354 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE; 1355 e_cd->probability = prob; 1356 1357 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE); 1358 e_ci->probability = prob.invert (); 1359 1360 remove_edge (e_di); 1361 1362 if (e_ij != NULL) 1363 { 1364 if ((dflags & ECF_NORETURN) == 0) 1365 { 1366 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU); 1367 e_dj->probability = profile_probability::always (); 1368 } 1369 e_ij->probability = profile_probability::always (); 1370 } 1371 1372 /* Insert PHI node for the call result if necessary. */ 1373 if (gimple_call_lhs (icall_stmt) 1374 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME 1375 && (dflags & ECF_NORETURN) == 0) 1376 { 1377 tree result = gimple_call_lhs (icall_stmt); 1378 gphi *phi = create_phi_node (result, join_bb); 1379 gimple_call_set_lhs (icall_stmt, 1380 duplicate_ssa_name (result, icall_stmt)); 1381 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION); 1382 gimple_call_set_lhs (dcall_stmt, 1383 duplicate_ssa_name (result, dcall_stmt)); 1384 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION); 1385 } 1386 1387 /* Build an EH edge for the direct call if necessary. */ 1388 lp_nr = lookup_stmt_eh_lp (icall_stmt); 1389 if (lp_nr > 0 && stmt_could_throw_p (cfun, dcall_stmt)) 1390 { 1391 add_stmt_to_eh_lp (dcall_stmt, lp_nr); 1392 } 1393 1394 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs) 1395 if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL)) 1396 { 1397 e = make_edge (dcall_bb, e_eh->dest, e_eh->flags); 1398 e->probability = e_eh->probability; 1399 for (gphi_iterator psi = gsi_start_phis (e_eh->dest); 1400 !gsi_end_p (psi); gsi_next (&psi)) 1401 { 1402 gphi *phi = psi.phi (); 1403 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e), 1404 PHI_ARG_DEF_FROM_EDGE (phi, e_eh)); 1405 } 1406 } 1407 if (!stmt_could_throw_p (cfun, dcall_stmt)) 1408 gimple_purge_dead_eh_edges (dcall_bb); 1409 return dcall_stmt; 1410 } 1411 1412 /* Dump info about indirect call profile. */ 1413 1414 static void 1415 dump_ic_profile (gimple_stmt_iterator *gsi) 1416 { 1417 gcall *stmt; 1418 histogram_value histogram; 1419 gcov_type val, count, all; 1420 struct cgraph_node *direct_call; 1421 1422 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi)); 1423 if (!stmt) 1424 return; 1425 1426 if (gimple_call_fndecl (stmt) != NULL_TREE) 1427 return; 1428 1429 if (gimple_call_internal_p (stmt)) 1430 return; 1431 1432 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL); 1433 if (!histogram) 1434 return; 1435 1436 count = 0; 1437 all = histogram->hvalue.counters[0]; 1438 1439 for (unsigned j = 0; j < GCOV_TOPN_VALUES; j++) 1440 { 1441 if (!get_nth_most_common_value (NULL, "indirect call", histogram, &val, 1442 &count, &all, j)) 1443 return; 1444 if (!count) 1445 continue; 1446 1447 direct_call = find_func_by_profile_id ((int) val); 1448 1449 if (direct_call == NULL) 1450 dump_printf_loc ( 1451 MSG_MISSED_OPTIMIZATION, stmt, 1452 "Indirect call -> direct call from other " 1453 "module %T=> %i (will resolve by ipa-profile only with LTO)\n", 1454 gimple_call_fn (stmt), (int) val); 1455 else 1456 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt, 1457 "Indirect call -> direct call " 1458 "%T => %T (will resolve by ipa-profile)\n", 1459 gimple_call_fn (stmt), direct_call->decl); 1460 dump_printf_loc (MSG_NOTE, stmt, 1461 "hist->count %" PRId64 " hist->all %" PRId64 "\n", 1462 count, all); 1463 } 1464 } 1465 1466 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be 1467 set to the argument index for the size of the string operation. */ 1468 1469 static bool 1470 interesting_stringop_to_profile_p (gcall *call, int *size_arg) 1471 { 1472 enum built_in_function fcode; 1473 1474 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (call)); 1475 switch (fcode) 1476 { 1477 case BUILT_IN_MEMCPY: 1478 case BUILT_IN_MEMPCPY: 1479 case BUILT_IN_MEMMOVE: 1480 *size_arg = 2; 1481 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE, 1482 INTEGER_TYPE, VOID_TYPE); 1483 case BUILT_IN_MEMSET: 1484 *size_arg = 2; 1485 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE, 1486 INTEGER_TYPE, VOID_TYPE); 1487 case BUILT_IN_BZERO: 1488 *size_arg = 1; 1489 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE, 1490 VOID_TYPE); 1491 default: 1492 return false; 1493 } 1494 } 1495 1496 /* Convert stringop (..., vcall_size) 1497 into 1498 if (vcall_size == icall_size) 1499 stringop (..., icall_size); 1500 else 1501 stringop (..., vcall_size); 1502 assuming we'll propagate a true constant into ICALL_SIZE later. */ 1503 1504 static void 1505 gimple_stringop_fixed_value (gcall *vcall_stmt, tree icall_size, profile_probability prob, 1506 gcov_type count, gcov_type all) 1507 { 1508 gassign *tmp_stmt; 1509 gcond *cond_stmt; 1510 gcall *icall_stmt; 1511 tree tmp0, tmp1, vcall_size, optype; 1512 basic_block cond_bb, icall_bb, vcall_bb, join_bb; 1513 edge e_ci, e_cv, e_iv, e_ij, e_vj; 1514 gimple_stmt_iterator gsi; 1515 int size_arg; 1516 1517 if (!interesting_stringop_to_profile_p (vcall_stmt, &size_arg)) 1518 gcc_unreachable (); 1519 1520 cond_bb = gimple_bb (vcall_stmt); 1521 gsi = gsi_for_stmt (vcall_stmt); 1522 1523 vcall_size = gimple_call_arg (vcall_stmt, size_arg); 1524 optype = TREE_TYPE (vcall_size); 1525 1526 tmp0 = make_temp_ssa_name (optype, NULL, "PROF"); 1527 tmp1 = make_temp_ssa_name (optype, NULL, "PROF"); 1528 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size)); 1529 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT); 1530 1531 tmp_stmt = gimple_build_assign (tmp1, vcall_size); 1532 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT); 1533 1534 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE); 1535 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT); 1536 1537 if (TREE_CODE (gimple_vdef (vcall_stmt)) == SSA_NAME) 1538 { 1539 unlink_stmt_vdef (vcall_stmt); 1540 release_ssa_name (gimple_vdef (vcall_stmt)); 1541 } 1542 gimple_set_vdef (vcall_stmt, NULL); 1543 gimple_set_vuse (vcall_stmt, NULL); 1544 update_stmt (vcall_stmt); 1545 icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt)); 1546 gimple_call_set_arg (icall_stmt, size_arg, 1547 fold_convert (optype, icall_size)); 1548 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT); 1549 1550 /* Fix CFG. */ 1551 /* Edge e_ci connects cond_bb to icall_bb, etc. */ 1552 e_ci = split_block (cond_bb, cond_stmt); 1553 icall_bb = e_ci->dest; 1554 icall_bb->count = profile_count::from_gcov_type (count); 1555 1556 e_iv = split_block (icall_bb, icall_stmt); 1557 vcall_bb = e_iv->dest; 1558 vcall_bb->count = profile_count::from_gcov_type (all - count); 1559 1560 e_vj = split_block (vcall_bb, vcall_stmt); 1561 join_bb = e_vj->dest; 1562 join_bb->count = profile_count::from_gcov_type (all); 1563 1564 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE; 1565 e_ci->probability = prob; 1566 1567 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE); 1568 e_cv->probability = prob.invert (); 1569 1570 remove_edge (e_iv); 1571 1572 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU); 1573 e_ij->probability = profile_probability::always (); 1574 1575 e_vj->probability = profile_probability::always (); 1576 1577 /* Insert PHI node for the call result if necessary. */ 1578 if (gimple_call_lhs (vcall_stmt) 1579 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME) 1580 { 1581 tree result = gimple_call_lhs (vcall_stmt); 1582 gphi *phi = create_phi_node (result, join_bb); 1583 gimple_call_set_lhs (vcall_stmt, 1584 duplicate_ssa_name (result, vcall_stmt)); 1585 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION); 1586 gimple_call_set_lhs (icall_stmt, 1587 duplicate_ssa_name (result, icall_stmt)); 1588 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION); 1589 } 1590 1591 /* Because these are all string op builtins, they're all nothrow. */ 1592 gcc_assert (!stmt_could_throw_p (cfun, vcall_stmt)); 1593 gcc_assert (!stmt_could_throw_p (cfun, icall_stmt)); 1594 } 1595 1596 /* Find values inside STMT for that we want to measure histograms for 1597 division/modulo optimization. */ 1598 1599 static bool 1600 gimple_stringops_transform (gimple_stmt_iterator *gsi) 1601 { 1602 gcall *stmt; 1603 tree blck_size; 1604 enum built_in_function fcode; 1605 histogram_value histogram; 1606 gcov_type count, all, val; 1607 tree dest, src; 1608 unsigned int dest_align, src_align; 1609 profile_probability prob; 1610 tree tree_val; 1611 int size_arg; 1612 1613 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi)); 1614 if (!stmt) 1615 return false; 1616 1617 if (!gimple_call_builtin_p (gsi_stmt (*gsi), BUILT_IN_NORMAL)) 1618 return false; 1619 1620 if (!interesting_stringop_to_profile_p (stmt, &size_arg)) 1621 return false; 1622 1623 blck_size = gimple_call_arg (stmt, size_arg); 1624 if (TREE_CODE (blck_size) == INTEGER_CST) 1625 return false; 1626 1627 histogram = gimple_histogram_value_of_type (cfun, stmt, 1628 HIST_TYPE_TOPN_VALUES); 1629 if (!histogram) 1630 return false; 1631 1632 if (!get_nth_most_common_value (stmt, "stringops", histogram, &val, &count, 1633 &all)) 1634 return false; 1635 1636 gimple_remove_histogram_value (cfun, stmt, histogram); 1637 1638 /* We require that count is at least half of all. */ 1639 if (2 * count < all || optimize_bb_for_size_p (gimple_bb (stmt))) 1640 return false; 1641 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count)) 1642 return false; 1643 if (all > 0) 1644 prob = profile_probability::probability_in_gcov_type (count, all); 1645 else 1646 prob = profile_probability::never (); 1647 1648 dest = gimple_call_arg (stmt, 0); 1649 dest_align = get_pointer_alignment (dest); 1650 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)); 1651 switch (fcode) 1652 { 1653 case BUILT_IN_MEMCPY: 1654 case BUILT_IN_MEMPCPY: 1655 case BUILT_IN_MEMMOVE: 1656 src = gimple_call_arg (stmt, 1); 1657 src_align = get_pointer_alignment (src); 1658 if (!can_move_by_pieces (val, MIN (dest_align, src_align))) 1659 return false; 1660 break; 1661 case BUILT_IN_MEMSET: 1662 if (!can_store_by_pieces (val, builtin_memset_read_str, 1663 gimple_call_arg (stmt, 1), 1664 dest_align, true)) 1665 return false; 1666 break; 1667 case BUILT_IN_BZERO: 1668 if (!can_store_by_pieces (val, builtin_memset_read_str, 1669 integer_zero_node, 1670 dest_align, true)) 1671 return false; 1672 break; 1673 default: 1674 gcc_unreachable (); 1675 } 1676 1677 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT)) 1678 tree_val = build_int_cst (get_gcov_type (), val); 1679 else 1680 { 1681 HOST_WIDE_INT a[2]; 1682 a[0] = (unsigned HOST_WIDE_INT) val; 1683 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1; 1684 1685 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2, 1686 TYPE_PRECISION (get_gcov_type ()), false)); 1687 } 1688 1689 if (dump_enabled_p ()) 1690 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt, 1691 "Transformation done: single value %i stringop for %s\n", 1692 (int)val, built_in_names[(int)fcode]); 1693 1694 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all); 1695 1696 return true; 1697 } 1698 1699 void 1700 stringop_block_profile (gimple *stmt, unsigned int *expected_align, 1701 HOST_WIDE_INT *expected_size) 1702 { 1703 histogram_value histogram; 1704 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE); 1705 1706 if (!histogram) 1707 *expected_size = -1; 1708 else if (!histogram->hvalue.counters[1]) 1709 { 1710 *expected_size = -1; 1711 gimple_remove_histogram_value (cfun, stmt, histogram); 1712 } 1713 else 1714 { 1715 gcov_type size; 1716 size = ((histogram->hvalue.counters[0] 1717 + histogram->hvalue.counters[1] / 2) 1718 / histogram->hvalue.counters[1]); 1719 /* Even if we can hold bigger value in SIZE, INT_MAX 1720 is safe "infinity" for code generation strategies. */ 1721 if (size > INT_MAX) 1722 size = INT_MAX; 1723 *expected_size = size; 1724 gimple_remove_histogram_value (cfun, stmt, histogram); 1725 } 1726 1727 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR); 1728 1729 if (!histogram) 1730 *expected_align = 0; 1731 else if (!histogram->hvalue.counters[0]) 1732 { 1733 gimple_remove_histogram_value (cfun, stmt, histogram); 1734 *expected_align = 0; 1735 } 1736 else 1737 { 1738 gcov_type count; 1739 unsigned int alignment; 1740 1741 count = histogram->hvalue.counters[0]; 1742 alignment = 1; 1743 while (!(count & alignment) 1744 && (alignment <= UINT_MAX / 2 / BITS_PER_UNIT)) 1745 alignment <<= 1; 1746 *expected_align = alignment * BITS_PER_UNIT; 1747 gimple_remove_histogram_value (cfun, stmt, histogram); 1748 } 1749 } 1750 1751 1752 /* Find values inside STMT for that we want to measure histograms for 1753 division/modulo optimization. */ 1754 1755 static void 1756 gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values) 1757 { 1758 tree lhs, divisor, op0, type; 1759 histogram_value hist; 1760 1761 if (gimple_code (stmt) != GIMPLE_ASSIGN) 1762 return; 1763 1764 lhs = gimple_assign_lhs (stmt); 1765 type = TREE_TYPE (lhs); 1766 if (!INTEGRAL_TYPE_P (type)) 1767 return; 1768 1769 switch (gimple_assign_rhs_code (stmt)) 1770 { 1771 case TRUNC_DIV_EXPR: 1772 case TRUNC_MOD_EXPR: 1773 divisor = gimple_assign_rhs2 (stmt); 1774 op0 = gimple_assign_rhs1 (stmt); 1775 1776 if (TREE_CODE (divisor) == SSA_NAME) 1777 /* Check for the case where the divisor is the same value most 1778 of the time. */ 1779 values->safe_push (gimple_alloc_histogram_value (cfun, 1780 HIST_TYPE_TOPN_VALUES, 1781 stmt, divisor)); 1782 1783 /* For mod, check whether it is not often a noop (or replaceable by 1784 a few subtractions). */ 1785 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR 1786 && TYPE_UNSIGNED (type) 1787 && TREE_CODE (divisor) == SSA_NAME) 1788 { 1789 tree val; 1790 /* Check for a special case where the divisor is power of 2. */ 1791 values->safe_push (gimple_alloc_histogram_value (cfun, 1792 HIST_TYPE_POW2, 1793 stmt, divisor)); 1794 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor); 1795 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL, 1796 stmt, val); 1797 hist->hdata.intvl.int_start = 0; 1798 hist->hdata.intvl.steps = 2; 1799 values->safe_push (hist); 1800 } 1801 return; 1802 1803 default: 1804 return; 1805 } 1806 } 1807 1808 /* Find calls inside STMT for that we want to measure histograms for 1809 indirect/virtual call optimization. */ 1810 1811 static void 1812 gimple_indirect_call_to_profile (gimple *stmt, histogram_values *values) 1813 { 1814 tree callee; 1815 1816 if (gimple_code (stmt) != GIMPLE_CALL 1817 || gimple_call_internal_p (stmt) 1818 || gimple_call_fndecl (stmt) != NULL_TREE) 1819 return; 1820 1821 callee = gimple_call_fn (stmt); 1822 histogram_value v = gimple_alloc_histogram_value (cfun, HIST_TYPE_INDIR_CALL, 1823 stmt, callee); 1824 values->safe_push (v); 1825 1826 return; 1827 } 1828 1829 /* Find values inside STMT for that we want to measure histograms for 1830 string operations. */ 1831 1832 static void 1833 gimple_stringops_values_to_profile (gimple *gs, histogram_values *values) 1834 { 1835 gcall *stmt; 1836 tree blck_size; 1837 tree dest; 1838 int size_arg; 1839 1840 stmt = dyn_cast <gcall *> (gs); 1841 if (!stmt) 1842 return; 1843 1844 if (!gimple_call_builtin_p (gs, BUILT_IN_NORMAL)) 1845 return; 1846 1847 if (!interesting_stringop_to_profile_p (stmt, &size_arg)) 1848 return; 1849 1850 dest = gimple_call_arg (stmt, 0); 1851 blck_size = gimple_call_arg (stmt, size_arg); 1852 1853 if (TREE_CODE (blck_size) != INTEGER_CST) 1854 { 1855 values->safe_push (gimple_alloc_histogram_value (cfun, 1856 HIST_TYPE_TOPN_VALUES, 1857 stmt, blck_size)); 1858 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE, 1859 stmt, blck_size)); 1860 } 1861 1862 if (TREE_CODE (blck_size) != INTEGER_CST) 1863 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR, 1864 stmt, dest)); 1865 } 1866 1867 /* Find values inside STMT for that we want to measure histograms and adds 1868 them to list VALUES. */ 1869 1870 static void 1871 gimple_values_to_profile (gimple *stmt, histogram_values *values) 1872 { 1873 gimple_divmod_values_to_profile (stmt, values); 1874 gimple_stringops_values_to_profile (stmt, values); 1875 gimple_indirect_call_to_profile (stmt, values); 1876 } 1877 1878 void 1879 gimple_find_values_to_profile (histogram_values *values) 1880 { 1881 basic_block bb; 1882 gimple_stmt_iterator gsi; 1883 unsigned i; 1884 histogram_value hist = NULL; 1885 values->create (0); 1886 1887 FOR_EACH_BB_FN (bb, cfun) 1888 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1889 gimple_values_to_profile (gsi_stmt (gsi), values); 1890 1891 values->safe_push (gimple_alloc_histogram_value (cfun, 1892 HIST_TYPE_TIME_PROFILE)); 1893 1894 FOR_EACH_VEC_ELT (*values, i, hist) 1895 { 1896 switch (hist->type) 1897 { 1898 case HIST_TYPE_INTERVAL: 1899 hist->n_counters = hist->hdata.intvl.steps + 2; 1900 break; 1901 1902 case HIST_TYPE_POW2: 1903 hist->n_counters = 2; 1904 break; 1905 1906 case HIST_TYPE_TOPN_VALUES: 1907 case HIST_TYPE_INDIR_CALL: 1908 hist->n_counters = GCOV_TOPN_VALUES_COUNTERS; 1909 break; 1910 1911 case HIST_TYPE_TIME_PROFILE: 1912 hist->n_counters = 1; 1913 break; 1914 1915 case HIST_TYPE_AVERAGE: 1916 hist->n_counters = 2; 1917 break; 1918 1919 case HIST_TYPE_IOR: 1920 hist->n_counters = 1; 1921 break; 1922 1923 default: 1924 gcc_unreachable (); 1925 } 1926 if (dump_file && hist->hvalue.stmt != NULL) 1927 { 1928 fprintf (dump_file, "Stmt "); 1929 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM); 1930 dump_histogram_value (dump_file, hist); 1931 } 1932 } 1933 } 1934