1 /* A pass for lowering trees to RTL. 2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 3 Free Software Foundation, Inc. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3, or (at your option) 10 any later version. 11 12 GCC is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 #include "config.h" 22 #include "system.h" 23 #include "coretypes.h" 24 #include "tm.h" 25 #include "tree.h" 26 #include "rtl.h" 27 #include "tm_p.h" 28 #include "basic-block.h" 29 #include "function.h" 30 #include "expr.h" 31 #include "langhooks.h" 32 #include "tree-flow.h" 33 #include "timevar.h" 34 #include "tree-dump.h" 35 #include "tree-pass.h" 36 #include "except.h" 37 #include "flags.h" 38 #include "diagnostic.h" 39 #include "tree-pretty-print.h" 40 #include "gimple-pretty-print.h" 41 #include "toplev.h" 42 #include "debug.h" 43 #include "params.h" 44 #include "tree-inline.h" 45 #include "value-prof.h" 46 #include "target.h" 47 #include "ssaexpand.h" 48 #include "bitmap.h" 49 #include "sbitmap.h" 50 #include "insn-attr.h" /* For INSN_SCHEDULING. */ 51 52 /* This variable holds information helping the rewriting of SSA trees 53 into RTL. */ 54 struct ssaexpand SA; 55 56 /* This variable holds the currently expanded gimple statement for purposes 57 of comminucating the profile info to the builtin expanders. */ 58 gimple currently_expanding_gimple_stmt; 59 60 static rtx expand_debug_expr (tree); 61 62 /* Return an expression tree corresponding to the RHS of GIMPLE 63 statement STMT. */ 64 65 tree 66 gimple_assign_rhs_to_tree (gimple stmt) 67 { 68 tree t; 69 enum gimple_rhs_class grhs_class; 70 71 grhs_class = get_gimple_rhs_class (gimple_expr_code (stmt)); 72 73 if (grhs_class == GIMPLE_TERNARY_RHS) 74 t = build3 (gimple_assign_rhs_code (stmt), 75 TREE_TYPE (gimple_assign_lhs (stmt)), 76 gimple_assign_rhs1 (stmt), 77 gimple_assign_rhs2 (stmt), 78 gimple_assign_rhs3 (stmt)); 79 else if (grhs_class == GIMPLE_BINARY_RHS) 80 t = build2 (gimple_assign_rhs_code (stmt), 81 TREE_TYPE (gimple_assign_lhs (stmt)), 82 gimple_assign_rhs1 (stmt), 83 gimple_assign_rhs2 (stmt)); 84 else if (grhs_class == GIMPLE_UNARY_RHS) 85 t = build1 (gimple_assign_rhs_code (stmt), 86 TREE_TYPE (gimple_assign_lhs (stmt)), 87 gimple_assign_rhs1 (stmt)); 88 else if (grhs_class == GIMPLE_SINGLE_RHS) 89 { 90 t = gimple_assign_rhs1 (stmt); 91 /* Avoid modifying this tree in place below. */ 92 if ((gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t) 93 && gimple_location (stmt) != EXPR_LOCATION (t)) 94 || (gimple_block (stmt) 95 && currently_expanding_to_rtl 96 && EXPR_P (t) 97 && gimple_block (stmt) != TREE_BLOCK (t))) 98 t = copy_node (t); 99 } 100 else 101 gcc_unreachable (); 102 103 if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t)) 104 SET_EXPR_LOCATION (t, gimple_location (stmt)); 105 if (gimple_block (stmt) && currently_expanding_to_rtl && EXPR_P (t)) 106 TREE_BLOCK (t) = gimple_block (stmt); 107 108 return t; 109 } 110 111 112 #ifndef STACK_ALIGNMENT_NEEDED 113 #define STACK_ALIGNMENT_NEEDED 1 114 #endif 115 116 #define SSAVAR(x) (TREE_CODE (x) == SSA_NAME ? SSA_NAME_VAR (x) : x) 117 118 /* Associate declaration T with storage space X. If T is no 119 SSA name this is exactly SET_DECL_RTL, otherwise make the 120 partition of T associated with X. */ 121 static inline void 122 set_rtl (tree t, rtx x) 123 { 124 if (TREE_CODE (t) == SSA_NAME) 125 { 126 SA.partition_to_pseudo[var_to_partition (SA.map, t)] = x; 127 if (x && !MEM_P (x)) 128 set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (t), x); 129 /* For the benefit of debug information at -O0 (where vartracking 130 doesn't run) record the place also in the base DECL if it's 131 a normal variable (not a parameter). */ 132 if (x && x != pc_rtx && TREE_CODE (SSA_NAME_VAR (t)) == VAR_DECL) 133 { 134 tree var = SSA_NAME_VAR (t); 135 /* If we don't yet have something recorded, just record it now. */ 136 if (!DECL_RTL_SET_P (var)) 137 SET_DECL_RTL (var, x); 138 /* If we have it set already to "multiple places" don't 139 change this. */ 140 else if (DECL_RTL (var) == pc_rtx) 141 ; 142 /* If we have something recorded and it's not the same place 143 as we want to record now, we have multiple partitions for the 144 same base variable, with different places. We can't just 145 randomly chose one, hence we have to say that we don't know. 146 This only happens with optimization, and there var-tracking 147 will figure out the right thing. */ 148 else if (DECL_RTL (var) != x) 149 SET_DECL_RTL (var, pc_rtx); 150 } 151 } 152 else 153 SET_DECL_RTL (t, x); 154 } 155 156 /* This structure holds data relevant to one variable that will be 157 placed in a stack slot. */ 158 struct stack_var 159 { 160 /* The Variable. */ 161 tree decl; 162 163 /* Initially, the size of the variable. Later, the size of the partition, 164 if this variable becomes it's partition's representative. */ 165 HOST_WIDE_INT size; 166 167 /* The *byte* alignment required for this variable. Or as, with the 168 size, the alignment for this partition. */ 169 unsigned int alignb; 170 171 /* The partition representative. */ 172 size_t representative; 173 174 /* The next stack variable in the partition, or EOC. */ 175 size_t next; 176 177 /* The numbers of conflicting stack variables. */ 178 bitmap conflicts; 179 }; 180 181 #define EOC ((size_t)-1) 182 183 /* We have an array of such objects while deciding allocation. */ 184 static struct stack_var *stack_vars; 185 static size_t stack_vars_alloc; 186 static size_t stack_vars_num; 187 static struct pointer_map_t *decl_to_stack_part; 188 189 /* An array of indices such that stack_vars[stack_vars_sorted[i]].size 190 is non-decreasing. */ 191 static size_t *stack_vars_sorted; 192 193 /* The phase of the stack frame. This is the known misalignment of 194 virtual_stack_vars_rtx from PREFERRED_STACK_BOUNDARY. That is, 195 (frame_offset+frame_phase) % PREFERRED_STACK_BOUNDARY == 0. */ 196 static int frame_phase; 197 198 /* Used during expand_used_vars to remember if we saw any decls for 199 which we'd like to enable stack smashing protection. */ 200 static bool has_protected_decls; 201 202 /* Used during expand_used_vars. Remember if we say a character buffer 203 smaller than our cutoff threshold. Used for -Wstack-protector. */ 204 static bool has_short_buffer; 205 206 /* Compute the byte alignment to use for DECL. Ignore alignment 207 we can't do with expected alignment of the stack boundary. */ 208 209 static unsigned int 210 align_local_variable (tree decl) 211 { 212 unsigned int align = LOCAL_DECL_ALIGNMENT (decl); 213 DECL_ALIGN (decl) = align; 214 return align / BITS_PER_UNIT; 215 } 216 217 /* Allocate SIZE bytes at byte alignment ALIGN from the stack frame. 218 Return the frame offset. */ 219 220 static HOST_WIDE_INT 221 alloc_stack_frame_space (HOST_WIDE_INT size, unsigned HOST_WIDE_INT align) 222 { 223 HOST_WIDE_INT offset, new_frame_offset; 224 225 new_frame_offset = frame_offset; 226 if (FRAME_GROWS_DOWNWARD) 227 { 228 new_frame_offset -= size + frame_phase; 229 new_frame_offset &= -align; 230 new_frame_offset += frame_phase; 231 offset = new_frame_offset; 232 } 233 else 234 { 235 new_frame_offset -= frame_phase; 236 new_frame_offset += align - 1; 237 new_frame_offset &= -align; 238 new_frame_offset += frame_phase; 239 offset = new_frame_offset; 240 new_frame_offset += size; 241 } 242 frame_offset = new_frame_offset; 243 244 if (frame_offset_overflow (frame_offset, cfun->decl)) 245 frame_offset = offset = 0; 246 247 return offset; 248 } 249 250 /* Accumulate DECL into STACK_VARS. */ 251 252 static void 253 add_stack_var (tree decl) 254 { 255 struct stack_var *v; 256 257 if (stack_vars_num >= stack_vars_alloc) 258 { 259 if (stack_vars_alloc) 260 stack_vars_alloc = stack_vars_alloc * 3 / 2; 261 else 262 stack_vars_alloc = 32; 263 stack_vars 264 = XRESIZEVEC (struct stack_var, stack_vars, stack_vars_alloc); 265 } 266 if (!decl_to_stack_part) 267 decl_to_stack_part = pointer_map_create (); 268 269 v = &stack_vars[stack_vars_num]; 270 * (size_t *)pointer_map_insert (decl_to_stack_part, decl) = stack_vars_num; 271 272 v->decl = decl; 273 v->size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (decl)), 1); 274 /* Ensure that all variables have size, so that &a != &b for any two 275 variables that are simultaneously live. */ 276 if (v->size == 0) 277 v->size = 1; 278 v->alignb = align_local_variable (SSAVAR (decl)); 279 /* An alignment of zero can mightily confuse us later. */ 280 gcc_assert (v->alignb != 0); 281 282 /* All variables are initially in their own partition. */ 283 v->representative = stack_vars_num; 284 v->next = EOC; 285 286 /* All variables initially conflict with no other. */ 287 v->conflicts = NULL; 288 289 /* Ensure that this decl doesn't get put onto the list twice. */ 290 set_rtl (decl, pc_rtx); 291 292 stack_vars_num++; 293 } 294 295 /* Make the decls associated with luid's X and Y conflict. */ 296 297 static void 298 add_stack_var_conflict (size_t x, size_t y) 299 { 300 struct stack_var *a = &stack_vars[x]; 301 struct stack_var *b = &stack_vars[y]; 302 if (!a->conflicts) 303 a->conflicts = BITMAP_ALLOC (NULL); 304 if (!b->conflicts) 305 b->conflicts = BITMAP_ALLOC (NULL); 306 bitmap_set_bit (a->conflicts, y); 307 bitmap_set_bit (b->conflicts, x); 308 } 309 310 /* Check whether the decls associated with luid's X and Y conflict. */ 311 312 static bool 313 stack_var_conflict_p (size_t x, size_t y) 314 { 315 struct stack_var *a = &stack_vars[x]; 316 struct stack_var *b = &stack_vars[y]; 317 if (x == y) 318 return false; 319 /* Partitions containing an SSA name result from gimple registers 320 with things like unsupported modes. They are top-level and 321 hence conflict with everything else. */ 322 if (TREE_CODE (a->decl) == SSA_NAME || TREE_CODE (b->decl) == SSA_NAME) 323 return true; 324 325 if (!a->conflicts || !b->conflicts) 326 return false; 327 return bitmap_bit_p (a->conflicts, y); 328 } 329 330 /* Returns true if TYPE is or contains a union type. */ 331 332 static bool 333 aggregate_contains_union_type (tree type) 334 { 335 tree field; 336 337 if (TREE_CODE (type) == UNION_TYPE 338 || TREE_CODE (type) == QUAL_UNION_TYPE) 339 return true; 340 if (TREE_CODE (type) == ARRAY_TYPE) 341 return aggregate_contains_union_type (TREE_TYPE (type)); 342 if (TREE_CODE (type) != RECORD_TYPE) 343 return false; 344 345 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) 346 if (TREE_CODE (field) == FIELD_DECL) 347 if (aggregate_contains_union_type (TREE_TYPE (field))) 348 return true; 349 350 return false; 351 } 352 353 /* A subroutine of expand_used_vars. If two variables X and Y have alias 354 sets that do not conflict, then do add a conflict for these variables 355 in the interference graph. We also need to make sure to add conflicts 356 for union containing structures. Else RTL alias analysis comes along 357 and due to type based aliasing rules decides that for two overlapping 358 union temporaries { short s; int i; } accesses to the same mem through 359 different types may not alias and happily reorders stores across 360 life-time boundaries of the temporaries (See PR25654). */ 361 362 static void 363 add_alias_set_conflicts (void) 364 { 365 size_t i, j, n = stack_vars_num; 366 367 for (i = 0; i < n; ++i) 368 { 369 tree type_i = TREE_TYPE (stack_vars[i].decl); 370 bool aggr_i = AGGREGATE_TYPE_P (type_i); 371 bool contains_union; 372 373 contains_union = aggregate_contains_union_type (type_i); 374 for (j = 0; j < i; ++j) 375 { 376 tree type_j = TREE_TYPE (stack_vars[j].decl); 377 bool aggr_j = AGGREGATE_TYPE_P (type_j); 378 if (aggr_i != aggr_j 379 /* Either the objects conflict by means of type based 380 aliasing rules, or we need to add a conflict. */ 381 || !objects_must_conflict_p (type_i, type_j) 382 /* In case the types do not conflict ensure that access 383 to elements will conflict. In case of unions we have 384 to be careful as type based aliasing rules may say 385 access to the same memory does not conflict. So play 386 safe and add a conflict in this case when 387 -fstrict-aliasing is used. */ 388 || (contains_union && flag_strict_aliasing)) 389 add_stack_var_conflict (i, j); 390 } 391 } 392 } 393 394 /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var 395 enter its partition number into bitmap DATA. */ 396 397 static bool 398 visit_op (gimple stmt ATTRIBUTE_UNUSED, tree op, void *data) 399 { 400 bitmap active = (bitmap)data; 401 op = get_base_address (op); 402 if (op 403 && DECL_P (op) 404 && DECL_RTL_IF_SET (op) == pc_rtx) 405 { 406 size_t *v = (size_t *) pointer_map_contains (decl_to_stack_part, op); 407 if (v) 408 bitmap_set_bit (active, *v); 409 } 410 return false; 411 } 412 413 /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var 414 record conflicts between it and all currently active other partitions 415 from bitmap DATA. */ 416 417 static bool 418 visit_conflict (gimple stmt ATTRIBUTE_UNUSED, tree op, void *data) 419 { 420 bitmap active = (bitmap)data; 421 op = get_base_address (op); 422 if (op 423 && DECL_P (op) 424 && DECL_RTL_IF_SET (op) == pc_rtx) 425 { 426 size_t *v = 427 (size_t *) pointer_map_contains (decl_to_stack_part, op); 428 if (v && bitmap_set_bit (active, *v)) 429 { 430 size_t num = *v; 431 bitmap_iterator bi; 432 unsigned i; 433 gcc_assert (num < stack_vars_num); 434 EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi) 435 add_stack_var_conflict (num, i); 436 } 437 } 438 return false; 439 } 440 441 /* Helper routine for add_scope_conflicts, calculating the active partitions 442 at the end of BB, leaving the result in WORK. We're called to generate 443 conflicts when FOR_CONFLICT is true, otherwise we're just tracking 444 liveness. */ 445 446 static void 447 add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict) 448 { 449 edge e; 450 edge_iterator ei; 451 gimple_stmt_iterator gsi; 452 bool (*visit)(gimple, tree, void *); 453 454 bitmap_clear (work); 455 FOR_EACH_EDGE (e, ei, bb->preds) 456 bitmap_ior_into (work, (bitmap)e->src->aux); 457 458 visit = visit_op; 459 460 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 461 { 462 gimple stmt = gsi_stmt (gsi); 463 walk_stmt_load_store_addr_ops (stmt, work, NULL, NULL, visit); 464 } 465 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 466 { 467 gimple stmt = gsi_stmt (gsi); 468 469 if (gimple_clobber_p (stmt)) 470 { 471 tree lhs = gimple_assign_lhs (stmt); 472 size_t *v; 473 /* Nested function lowering might introduce LHSs 474 that are COMPONENT_REFs. */ 475 if (TREE_CODE (lhs) != VAR_DECL) 476 continue; 477 if (DECL_RTL_IF_SET (lhs) == pc_rtx 478 && (v = (size_t *) 479 pointer_map_contains (decl_to_stack_part, lhs))) 480 bitmap_clear_bit (work, *v); 481 } 482 else if (!is_gimple_debug (stmt)) 483 { 484 if (for_conflict 485 && visit == visit_op) 486 { 487 /* If this is the first real instruction in this BB we need 488 to add conflicts for everything live at this point now. 489 Unlike classical liveness for named objects we can't 490 rely on seeing a def/use of the names we're interested in. 491 There might merely be indirect loads/stores. We'd not add any 492 conflicts for such partitions. */ 493 bitmap_iterator bi; 494 unsigned i; 495 EXECUTE_IF_SET_IN_BITMAP (work, 0, i, bi) 496 { 497 unsigned j; 498 bitmap_iterator bj; 499 EXECUTE_IF_SET_IN_BITMAP (work, i + 1, j, bj) 500 add_stack_var_conflict (i, j); 501 } 502 visit = visit_conflict; 503 } 504 walk_stmt_load_store_addr_ops (stmt, work, visit, visit, visit); 505 } 506 } 507 } 508 509 /* Generate stack partition conflicts between all partitions that are 510 simultaneously live. */ 511 512 static void 513 add_scope_conflicts (void) 514 { 515 basic_block bb; 516 bool changed; 517 bitmap work = BITMAP_ALLOC (NULL); 518 519 /* We approximate the live range of a stack variable by taking the first 520 mention of its name as starting point(s), and by the end-of-scope 521 death clobber added by gimplify as ending point(s) of the range. 522 This overapproximates in the case we for instance moved an address-taken 523 operation upward, without also moving a dereference to it upwards. 524 But it's conservatively correct as a variable never can hold values 525 before its name is mentioned at least once. 526 527 We then do a mostly classical bitmap liveness algorithm. */ 528 529 FOR_ALL_BB (bb) 530 bb->aux = BITMAP_ALLOC (NULL); 531 532 changed = true; 533 while (changed) 534 { 535 changed = false; 536 FOR_EACH_BB (bb) 537 { 538 bitmap active = (bitmap)bb->aux; 539 add_scope_conflicts_1 (bb, work, false); 540 if (bitmap_ior_into (active, work)) 541 changed = true; 542 } 543 } 544 545 FOR_EACH_BB (bb) 546 add_scope_conflicts_1 (bb, work, true); 547 548 BITMAP_FREE (work); 549 FOR_ALL_BB (bb) 550 BITMAP_FREE (bb->aux); 551 } 552 553 /* A subroutine of partition_stack_vars. A comparison function for qsort, 554 sorting an array of indices by the properties of the object. */ 555 556 static int 557 stack_var_cmp (const void *a, const void *b) 558 { 559 size_t ia = *(const size_t *)a; 560 size_t ib = *(const size_t *)b; 561 unsigned int aligna = stack_vars[ia].alignb; 562 unsigned int alignb = stack_vars[ib].alignb; 563 HOST_WIDE_INT sizea = stack_vars[ia].size; 564 HOST_WIDE_INT sizeb = stack_vars[ib].size; 565 tree decla = stack_vars[ia].decl; 566 tree declb = stack_vars[ib].decl; 567 bool largea, largeb; 568 unsigned int uida, uidb; 569 570 /* Primary compare on "large" alignment. Large comes first. */ 571 largea = (aligna * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT); 572 largeb = (alignb * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT); 573 if (largea != largeb) 574 return (int)largeb - (int)largea; 575 576 /* Secondary compare on size, decreasing */ 577 if (sizea > sizeb) 578 return -1; 579 if (sizea < sizeb) 580 return 1; 581 582 /* Tertiary compare on true alignment, decreasing. */ 583 if (aligna < alignb) 584 return -1; 585 if (aligna > alignb) 586 return 1; 587 588 /* Final compare on ID for sort stability, increasing. 589 Two SSA names are compared by their version, SSA names come before 590 non-SSA names, and two normal decls are compared by their DECL_UID. */ 591 if (TREE_CODE (decla) == SSA_NAME) 592 { 593 if (TREE_CODE (declb) == SSA_NAME) 594 uida = SSA_NAME_VERSION (decla), uidb = SSA_NAME_VERSION (declb); 595 else 596 return -1; 597 } 598 else if (TREE_CODE (declb) == SSA_NAME) 599 return 1; 600 else 601 uida = DECL_UID (decla), uidb = DECL_UID (declb); 602 if (uida < uidb) 603 return 1; 604 if (uida > uidb) 605 return -1; 606 return 0; 607 } 608 609 610 /* If the points-to solution *PI points to variables that are in a partition 611 together with other variables add all partition members to the pointed-to 612 variables bitmap. */ 613 614 static void 615 add_partitioned_vars_to_ptset (struct pt_solution *pt, 616 struct pointer_map_t *decls_to_partitions, 617 struct pointer_set_t *visited, bitmap temp) 618 { 619 bitmap_iterator bi; 620 unsigned i; 621 bitmap *part; 622 623 if (pt->anything 624 || pt->vars == NULL 625 /* The pointed-to vars bitmap is shared, it is enough to 626 visit it once. */ 627 || pointer_set_insert(visited, pt->vars)) 628 return; 629 630 bitmap_clear (temp); 631 632 /* By using a temporary bitmap to store all members of the partitions 633 we have to add we make sure to visit each of the partitions only 634 once. */ 635 EXECUTE_IF_SET_IN_BITMAP (pt->vars, 0, i, bi) 636 if ((!temp 637 || !bitmap_bit_p (temp, i)) 638 && (part = (bitmap *) pointer_map_contains (decls_to_partitions, 639 (void *)(size_t) i))) 640 bitmap_ior_into (temp, *part); 641 if (!bitmap_empty_p (temp)) 642 bitmap_ior_into (pt->vars, temp); 643 } 644 645 /* Update points-to sets based on partition info, so we can use them on RTL. 646 The bitmaps representing stack partitions will be saved until expand, 647 where partitioned decls used as bases in memory expressions will be 648 rewritten. */ 649 650 static void 651 update_alias_info_with_stack_vars (void) 652 { 653 struct pointer_map_t *decls_to_partitions = NULL; 654 size_t i, j; 655 tree var = NULL_TREE; 656 657 for (i = 0; i < stack_vars_num; i++) 658 { 659 bitmap part = NULL; 660 tree name; 661 struct ptr_info_def *pi; 662 663 /* Not interested in partitions with single variable. */ 664 if (stack_vars[i].representative != i 665 || stack_vars[i].next == EOC) 666 continue; 667 668 if (!decls_to_partitions) 669 { 670 decls_to_partitions = pointer_map_create (); 671 cfun->gimple_df->decls_to_pointers = pointer_map_create (); 672 } 673 674 /* Create an SSA_NAME that points to the partition for use 675 as base during alias-oracle queries on RTL for bases that 676 have been partitioned. */ 677 if (var == NULL_TREE) 678 var = create_tmp_var (ptr_type_node, NULL); 679 name = make_ssa_name (var, NULL); 680 681 /* Create bitmaps representing partitions. They will be used for 682 points-to sets later, so use GGC alloc. */ 683 part = BITMAP_GGC_ALLOC (); 684 for (j = i; j != EOC; j = stack_vars[j].next) 685 { 686 tree decl = stack_vars[j].decl; 687 unsigned int uid = DECL_PT_UID (decl); 688 /* We should never end up partitioning SSA names (though they 689 may end up on the stack). Neither should we allocate stack 690 space to something that is unused and thus unreferenced, except 691 for -O0 where we are preserving even unreferenced variables. */ 692 gcc_assert (DECL_P (decl) 693 && (!optimize 694 || referenced_var_lookup (cfun, DECL_UID (decl)))); 695 bitmap_set_bit (part, uid); 696 *((bitmap *) pointer_map_insert (decls_to_partitions, 697 (void *)(size_t) uid)) = part; 698 *((tree *) pointer_map_insert (cfun->gimple_df->decls_to_pointers, 699 decl)) = name; 700 } 701 702 /* Make the SSA name point to all partition members. */ 703 pi = get_ptr_info (name); 704 pt_solution_set (&pi->pt, part, false); 705 } 706 707 /* Make all points-to sets that contain one member of a partition 708 contain all members of the partition. */ 709 if (decls_to_partitions) 710 { 711 unsigned i; 712 struct pointer_set_t *visited = pointer_set_create (); 713 bitmap temp = BITMAP_ALLOC (NULL); 714 715 for (i = 1; i < num_ssa_names; i++) 716 { 717 tree name = ssa_name (i); 718 struct ptr_info_def *pi; 719 720 if (name 721 && POINTER_TYPE_P (TREE_TYPE (name)) 722 && ((pi = SSA_NAME_PTR_INFO (name)) != NULL)) 723 add_partitioned_vars_to_ptset (&pi->pt, decls_to_partitions, 724 visited, temp); 725 } 726 727 add_partitioned_vars_to_ptset (&cfun->gimple_df->escaped, 728 decls_to_partitions, visited, temp); 729 730 pointer_set_destroy (visited); 731 pointer_map_destroy (decls_to_partitions); 732 BITMAP_FREE (temp); 733 } 734 } 735 736 /* A subroutine of partition_stack_vars. The UNION portion of a UNION/FIND 737 partitioning algorithm. Partitions A and B are known to be non-conflicting. 738 Merge them into a single partition A. */ 739 740 static void 741 union_stack_vars (size_t a, size_t b) 742 { 743 struct stack_var *vb = &stack_vars[b]; 744 bitmap_iterator bi; 745 unsigned u; 746 747 gcc_assert (stack_vars[b].next == EOC); 748 /* Add B to A's partition. */ 749 stack_vars[b].next = stack_vars[a].next; 750 stack_vars[b].representative = a; 751 stack_vars[a].next = b; 752 753 /* Update the required alignment of partition A to account for B. */ 754 if (stack_vars[a].alignb < stack_vars[b].alignb) 755 stack_vars[a].alignb = stack_vars[b].alignb; 756 757 /* Update the interference graph and merge the conflicts. */ 758 if (vb->conflicts) 759 { 760 EXECUTE_IF_SET_IN_BITMAP (vb->conflicts, 0, u, bi) 761 add_stack_var_conflict (a, stack_vars[u].representative); 762 BITMAP_FREE (vb->conflicts); 763 } 764 } 765 766 /* A subroutine of expand_used_vars. Binpack the variables into 767 partitions constrained by the interference graph. The overall 768 algorithm used is as follows: 769 770 Sort the objects by size in descending order. 771 For each object A { 772 S = size(A) 773 O = 0 774 loop { 775 Look for the largest non-conflicting object B with size <= S. 776 UNION (A, B) 777 } 778 } 779 */ 780 781 static void 782 partition_stack_vars (void) 783 { 784 size_t si, sj, n = stack_vars_num; 785 786 stack_vars_sorted = XNEWVEC (size_t, stack_vars_num); 787 for (si = 0; si < n; ++si) 788 stack_vars_sorted[si] = si; 789 790 if (n == 1) 791 return; 792 793 qsort (stack_vars_sorted, n, sizeof (size_t), stack_var_cmp); 794 795 for (si = 0; si < n; ++si) 796 { 797 size_t i = stack_vars_sorted[si]; 798 unsigned int ialign = stack_vars[i].alignb; 799 800 /* Ignore objects that aren't partition representatives. If we 801 see a var that is not a partition representative, it must 802 have been merged earlier. */ 803 if (stack_vars[i].representative != i) 804 continue; 805 806 for (sj = si + 1; sj < n; ++sj) 807 { 808 size_t j = stack_vars_sorted[sj]; 809 unsigned int jalign = stack_vars[j].alignb; 810 811 /* Ignore objects that aren't partition representatives. */ 812 if (stack_vars[j].representative != j) 813 continue; 814 815 /* Ignore conflicting objects. */ 816 if (stack_var_conflict_p (i, j)) 817 continue; 818 819 /* Do not mix objects of "small" (supported) alignment 820 and "large" (unsupported) alignment. */ 821 if ((ialign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) 822 != (jalign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)) 823 continue; 824 825 /* UNION the objects, placing J at OFFSET. */ 826 union_stack_vars (i, j); 827 } 828 } 829 830 update_alias_info_with_stack_vars (); 831 } 832 833 /* A debugging aid for expand_used_vars. Dump the generated partitions. */ 834 835 static void 836 dump_stack_var_partition (void) 837 { 838 size_t si, i, j, n = stack_vars_num; 839 840 for (si = 0; si < n; ++si) 841 { 842 i = stack_vars_sorted[si]; 843 844 /* Skip variables that aren't partition representatives, for now. */ 845 if (stack_vars[i].representative != i) 846 continue; 847 848 fprintf (dump_file, "Partition %lu: size " HOST_WIDE_INT_PRINT_DEC 849 " align %u\n", (unsigned long) i, stack_vars[i].size, 850 stack_vars[i].alignb); 851 852 for (j = i; j != EOC; j = stack_vars[j].next) 853 { 854 fputc ('\t', dump_file); 855 print_generic_expr (dump_file, stack_vars[j].decl, dump_flags); 856 } 857 fputc ('\n', dump_file); 858 } 859 } 860 861 /* Assign rtl to DECL at BASE + OFFSET. */ 862 863 static void 864 expand_one_stack_var_at (tree decl, rtx base, unsigned base_align, 865 HOST_WIDE_INT offset) 866 { 867 unsigned align; 868 rtx x; 869 870 /* If this fails, we've overflowed the stack frame. Error nicely? */ 871 gcc_assert (offset == trunc_int_for_mode (offset, Pmode)); 872 873 x = plus_constant (base, offset); 874 x = gen_rtx_MEM (DECL_MODE (SSAVAR (decl)), x); 875 876 if (TREE_CODE (decl) != SSA_NAME) 877 { 878 /* Set alignment we actually gave this decl if it isn't an SSA name. 879 If it is we generate stack slots only accidentally so it isn't as 880 important, we'll simply use the alignment that is already set. */ 881 if (base == virtual_stack_vars_rtx) 882 offset -= frame_phase; 883 align = offset & -offset; 884 align *= BITS_PER_UNIT; 885 if (align == 0 || align > base_align) 886 align = base_align; 887 888 /* One would think that we could assert that we're not decreasing 889 alignment here, but (at least) the i386 port does exactly this 890 via the MINIMUM_ALIGNMENT hook. */ 891 892 DECL_ALIGN (decl) = align; 893 DECL_USER_ALIGN (decl) = 0; 894 } 895 896 set_mem_attributes (x, SSAVAR (decl), true); 897 set_rtl (decl, x); 898 } 899 900 /* A subroutine of expand_used_vars. Give each partition representative 901 a unique location within the stack frame. Update each partition member 902 with that location. */ 903 904 static void 905 expand_stack_vars (bool (*pred) (tree)) 906 { 907 size_t si, i, j, n = stack_vars_num; 908 HOST_WIDE_INT large_size = 0, large_alloc = 0; 909 rtx large_base = NULL; 910 unsigned large_align = 0; 911 tree decl; 912 913 /* Determine if there are any variables requiring "large" alignment. 914 Since these are dynamically allocated, we only process these if 915 no predicate involved. */ 916 large_align = stack_vars[stack_vars_sorted[0]].alignb * BITS_PER_UNIT; 917 if (pred == NULL && large_align > MAX_SUPPORTED_STACK_ALIGNMENT) 918 { 919 /* Find the total size of these variables. */ 920 for (si = 0; si < n; ++si) 921 { 922 unsigned alignb; 923 924 i = stack_vars_sorted[si]; 925 alignb = stack_vars[i].alignb; 926 927 /* Stop when we get to the first decl with "small" alignment. */ 928 if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) 929 break; 930 931 /* Skip variables that aren't partition representatives. */ 932 if (stack_vars[i].representative != i) 933 continue; 934 935 /* Skip variables that have already had rtl assigned. See also 936 add_stack_var where we perpetrate this pc_rtx hack. */ 937 decl = stack_vars[i].decl; 938 if ((TREE_CODE (decl) == SSA_NAME 939 ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)] 940 : DECL_RTL (decl)) != pc_rtx) 941 continue; 942 943 large_size += alignb - 1; 944 large_size &= -(HOST_WIDE_INT)alignb; 945 large_size += stack_vars[i].size; 946 } 947 948 /* If there were any, allocate space. */ 949 if (large_size > 0) 950 large_base = allocate_dynamic_stack_space (GEN_INT (large_size), 0, 951 large_align, true); 952 } 953 954 for (si = 0; si < n; ++si) 955 { 956 rtx base; 957 unsigned base_align, alignb; 958 HOST_WIDE_INT offset; 959 960 i = stack_vars_sorted[si]; 961 962 /* Skip variables that aren't partition representatives, for now. */ 963 if (stack_vars[i].representative != i) 964 continue; 965 966 /* Skip variables that have already had rtl assigned. See also 967 add_stack_var where we perpetrate this pc_rtx hack. */ 968 decl = stack_vars[i].decl; 969 if ((TREE_CODE (decl) == SSA_NAME 970 ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)] 971 : DECL_RTL (decl)) != pc_rtx) 972 continue; 973 974 /* Check the predicate to see whether this variable should be 975 allocated in this pass. */ 976 if (pred && !pred (decl)) 977 continue; 978 979 alignb = stack_vars[i].alignb; 980 if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) 981 { 982 offset = alloc_stack_frame_space (stack_vars[i].size, alignb); 983 base = virtual_stack_vars_rtx; 984 base_align = crtl->max_used_stack_slot_alignment; 985 } 986 else 987 { 988 /* Large alignment is only processed in the last pass. */ 989 if (pred) 990 continue; 991 gcc_assert (large_base != NULL); 992 993 large_alloc += alignb - 1; 994 large_alloc &= -(HOST_WIDE_INT)alignb; 995 offset = large_alloc; 996 large_alloc += stack_vars[i].size; 997 998 base = large_base; 999 base_align = large_align; 1000 } 1001 1002 /* Create rtl for each variable based on their location within the 1003 partition. */ 1004 for (j = i; j != EOC; j = stack_vars[j].next) 1005 { 1006 expand_one_stack_var_at (stack_vars[j].decl, 1007 base, base_align, 1008 offset); 1009 } 1010 } 1011 1012 gcc_assert (large_alloc == large_size); 1013 } 1014 1015 /* Take into account all sizes of partitions and reset DECL_RTLs. */ 1016 static HOST_WIDE_INT 1017 account_stack_vars (void) 1018 { 1019 size_t si, j, i, n = stack_vars_num; 1020 HOST_WIDE_INT size = 0; 1021 1022 for (si = 0; si < n; ++si) 1023 { 1024 i = stack_vars_sorted[si]; 1025 1026 /* Skip variables that aren't partition representatives, for now. */ 1027 if (stack_vars[i].representative != i) 1028 continue; 1029 1030 size += stack_vars[i].size; 1031 for (j = i; j != EOC; j = stack_vars[j].next) 1032 set_rtl (stack_vars[j].decl, NULL); 1033 } 1034 return size; 1035 } 1036 1037 /* A subroutine of expand_one_var. Called to immediately assign rtl 1038 to a variable to be allocated in the stack frame. */ 1039 1040 static void 1041 expand_one_stack_var (tree var) 1042 { 1043 HOST_WIDE_INT size, offset; 1044 unsigned byte_align; 1045 1046 size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (var)), 1); 1047 byte_align = align_local_variable (SSAVAR (var)); 1048 1049 /* We handle highly aligned variables in expand_stack_vars. */ 1050 gcc_assert (byte_align * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT); 1051 1052 offset = alloc_stack_frame_space (size, byte_align); 1053 1054 expand_one_stack_var_at (var, virtual_stack_vars_rtx, 1055 crtl->max_used_stack_slot_alignment, offset); 1056 } 1057 1058 /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL 1059 that will reside in a hard register. */ 1060 1061 static void 1062 expand_one_hard_reg_var (tree var) 1063 { 1064 rest_of_decl_compilation (var, 0, 0); 1065 } 1066 1067 /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL 1068 that will reside in a pseudo register. */ 1069 1070 static void 1071 expand_one_register_var (tree var) 1072 { 1073 tree decl = SSAVAR (var); 1074 tree type = TREE_TYPE (decl); 1075 enum machine_mode reg_mode = promote_decl_mode (decl, NULL); 1076 rtx x = gen_reg_rtx (reg_mode); 1077 1078 set_rtl (var, x); 1079 1080 /* Note if the object is a user variable. */ 1081 if (!DECL_ARTIFICIAL (decl)) 1082 mark_user_reg (x); 1083 1084 if (POINTER_TYPE_P (type)) 1085 mark_reg_pointer (x, get_pointer_alignment (var)); 1086 } 1087 1088 /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL that 1089 has some associated error, e.g. its type is error-mark. We just need 1090 to pick something that won't crash the rest of the compiler. */ 1091 1092 static void 1093 expand_one_error_var (tree var) 1094 { 1095 enum machine_mode mode = DECL_MODE (var); 1096 rtx x; 1097 1098 if (mode == BLKmode) 1099 x = gen_rtx_MEM (BLKmode, const0_rtx); 1100 else if (mode == VOIDmode) 1101 x = const0_rtx; 1102 else 1103 x = gen_reg_rtx (mode); 1104 1105 SET_DECL_RTL (var, x); 1106 } 1107 1108 /* A subroutine of expand_one_var. VAR is a variable that will be 1109 allocated to the local stack frame. Return true if we wish to 1110 add VAR to STACK_VARS so that it will be coalesced with other 1111 variables. Return false to allocate VAR immediately. 1112 1113 This function is used to reduce the number of variables considered 1114 for coalescing, which reduces the size of the quadratic problem. */ 1115 1116 static bool 1117 defer_stack_allocation (tree var, bool toplevel) 1118 { 1119 /* If stack protection is enabled, *all* stack variables must be deferred, 1120 so that we can re-order the strings to the top of the frame. */ 1121 if (flag_stack_protect) 1122 return true; 1123 1124 /* We handle "large" alignment via dynamic allocation. We want to handle 1125 this extra complication in only one place, so defer them. */ 1126 if (DECL_ALIGN (var) > MAX_SUPPORTED_STACK_ALIGNMENT) 1127 return true; 1128 1129 /* Variables in the outermost scope automatically conflict with 1130 every other variable. The only reason to want to defer them 1131 at all is that, after sorting, we can more efficiently pack 1132 small variables in the stack frame. Continue to defer at -O2. */ 1133 if (toplevel && optimize < 2) 1134 return false; 1135 1136 /* Without optimization, *most* variables are allocated from the 1137 stack, which makes the quadratic problem large exactly when we 1138 want compilation to proceed as quickly as possible. On the 1139 other hand, we don't want the function's stack frame size to 1140 get completely out of hand. So we avoid adding scalars and 1141 "small" aggregates to the list at all. */ 1142 if (optimize == 0 && tree_low_cst (DECL_SIZE_UNIT (var), 1) < 32) 1143 return false; 1144 1145 return true; 1146 } 1147 1148 /* A subroutine of expand_used_vars. Expand one variable according to 1149 its flavor. Variables to be placed on the stack are not actually 1150 expanded yet, merely recorded. 1151 When REALLY_EXPAND is false, only add stack values to be allocated. 1152 Return stack usage this variable is supposed to take. 1153 */ 1154 1155 static HOST_WIDE_INT 1156 expand_one_var (tree var, bool toplevel, bool really_expand) 1157 { 1158 unsigned int align = BITS_PER_UNIT; 1159 tree origvar = var; 1160 1161 var = SSAVAR (var); 1162 1163 if (TREE_TYPE (var) != error_mark_node && TREE_CODE (var) == VAR_DECL) 1164 { 1165 /* Because we don't know if VAR will be in register or on stack, 1166 we conservatively assume it will be on stack even if VAR is 1167 eventually put into register after RA pass. For non-automatic 1168 variables, which won't be on stack, we collect alignment of 1169 type and ignore user specified alignment. */ 1170 if (TREE_STATIC (var) || DECL_EXTERNAL (var)) 1171 align = MINIMUM_ALIGNMENT (TREE_TYPE (var), 1172 TYPE_MODE (TREE_TYPE (var)), 1173 TYPE_ALIGN (TREE_TYPE (var))); 1174 else if (DECL_HAS_VALUE_EXPR_P (var) 1175 || (DECL_RTL_SET_P (var) && MEM_P (DECL_RTL (var)))) 1176 /* Don't consider debug only variables with DECL_HAS_VALUE_EXPR_P set 1177 or variables which were assigned a stack slot already by 1178 expand_one_stack_var_at - in the latter case DECL_ALIGN has been 1179 changed from the offset chosen to it. */ 1180 align = crtl->stack_alignment_estimated; 1181 else 1182 align = MINIMUM_ALIGNMENT (var, DECL_MODE (var), DECL_ALIGN (var)); 1183 1184 /* If the variable alignment is very large we'll dynamicaly allocate 1185 it, which means that in-frame portion is just a pointer. */ 1186 if (align > MAX_SUPPORTED_STACK_ALIGNMENT) 1187 align = POINTER_SIZE; 1188 } 1189 1190 if (SUPPORTS_STACK_ALIGNMENT 1191 && crtl->stack_alignment_estimated < align) 1192 { 1193 /* stack_alignment_estimated shouldn't change after stack 1194 realign decision made */ 1195 gcc_assert(!crtl->stack_realign_processed); 1196 crtl->stack_alignment_estimated = align; 1197 } 1198 1199 /* stack_alignment_needed > PREFERRED_STACK_BOUNDARY is permitted. 1200 So here we only make sure stack_alignment_needed >= align. */ 1201 if (crtl->stack_alignment_needed < align) 1202 crtl->stack_alignment_needed = align; 1203 if (crtl->max_used_stack_slot_alignment < align) 1204 crtl->max_used_stack_slot_alignment = align; 1205 1206 if (TREE_CODE (origvar) == SSA_NAME) 1207 { 1208 gcc_assert (TREE_CODE (var) != VAR_DECL 1209 || (!DECL_EXTERNAL (var) 1210 && !DECL_HAS_VALUE_EXPR_P (var) 1211 && !TREE_STATIC (var) 1212 && TREE_TYPE (var) != error_mark_node 1213 && !DECL_HARD_REGISTER (var) 1214 && really_expand)); 1215 } 1216 if (TREE_CODE (var) != VAR_DECL && TREE_CODE (origvar) != SSA_NAME) 1217 ; 1218 else if (DECL_EXTERNAL (var)) 1219 ; 1220 else if (DECL_HAS_VALUE_EXPR_P (var)) 1221 ; 1222 else if (TREE_STATIC (var)) 1223 ; 1224 else if (TREE_CODE (origvar) != SSA_NAME && DECL_RTL_SET_P (var)) 1225 ; 1226 else if (TREE_TYPE (var) == error_mark_node) 1227 { 1228 if (really_expand) 1229 expand_one_error_var (var); 1230 } 1231 else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var)) 1232 { 1233 if (really_expand) 1234 expand_one_hard_reg_var (var); 1235 } 1236 else if (use_register_for_decl (var)) 1237 { 1238 if (really_expand) 1239 expand_one_register_var (origvar); 1240 } 1241 else if (!host_integerp (DECL_SIZE_UNIT (var), 1)) 1242 { 1243 if (really_expand) 1244 { 1245 error ("size of variable %q+D is too large", var); 1246 expand_one_error_var (var); 1247 } 1248 } 1249 else if (defer_stack_allocation (var, toplevel)) 1250 add_stack_var (origvar); 1251 else 1252 { 1253 if (really_expand) 1254 expand_one_stack_var (origvar); 1255 return tree_low_cst (DECL_SIZE_UNIT (var), 1); 1256 } 1257 return 0; 1258 } 1259 1260 /* A subroutine of expand_used_vars. Walk down through the BLOCK tree 1261 expanding variables. Those variables that can be put into registers 1262 are allocated pseudos; those that can't are put on the stack. 1263 1264 TOPLEVEL is true if this is the outermost BLOCK. */ 1265 1266 static void 1267 expand_used_vars_for_block (tree block, bool toplevel) 1268 { 1269 tree t; 1270 1271 /* Expand all variables at this level. */ 1272 for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t)) 1273 if (TREE_USED (t) 1274 && ((TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != RESULT_DECL) 1275 || !DECL_NONSHAREABLE (t))) 1276 expand_one_var (t, toplevel, true); 1277 1278 /* Expand all variables at containing levels. */ 1279 for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t)) 1280 expand_used_vars_for_block (t, false); 1281 } 1282 1283 /* A subroutine of expand_used_vars. Walk down through the BLOCK tree 1284 and clear TREE_USED on all local variables. */ 1285 1286 static void 1287 clear_tree_used (tree block) 1288 { 1289 tree t; 1290 1291 for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t)) 1292 /* if (!TREE_STATIC (t) && !DECL_EXTERNAL (t)) */ 1293 if ((TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != RESULT_DECL) 1294 || !DECL_NONSHAREABLE (t)) 1295 TREE_USED (t) = 0; 1296 1297 for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t)) 1298 clear_tree_used (t); 1299 } 1300 1301 /* Examine TYPE and determine a bit mask of the following features. */ 1302 1303 #define SPCT_HAS_LARGE_CHAR_ARRAY 1 1304 #define SPCT_HAS_SMALL_CHAR_ARRAY 2 1305 #define SPCT_HAS_ARRAY 4 1306 #define SPCT_HAS_AGGREGATE 8 1307 1308 static unsigned int 1309 stack_protect_classify_type (tree type) 1310 { 1311 unsigned int ret = 0; 1312 tree t; 1313 1314 switch (TREE_CODE (type)) 1315 { 1316 case ARRAY_TYPE: 1317 t = TYPE_MAIN_VARIANT (TREE_TYPE (type)); 1318 if (t == char_type_node 1319 || t == signed_char_type_node 1320 || t == unsigned_char_type_node) 1321 { 1322 unsigned HOST_WIDE_INT max = PARAM_VALUE (PARAM_SSP_BUFFER_SIZE); 1323 unsigned HOST_WIDE_INT len; 1324 1325 if (!TYPE_SIZE_UNIT (type) 1326 || !host_integerp (TYPE_SIZE_UNIT (type), 1)) 1327 len = max; 1328 else 1329 len = tree_low_cst (TYPE_SIZE_UNIT (type), 1); 1330 1331 if (len < max) 1332 ret = SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_ARRAY; 1333 else 1334 ret = SPCT_HAS_LARGE_CHAR_ARRAY | SPCT_HAS_ARRAY; 1335 } 1336 else 1337 ret = SPCT_HAS_ARRAY; 1338 break; 1339 1340 case UNION_TYPE: 1341 case QUAL_UNION_TYPE: 1342 case RECORD_TYPE: 1343 ret = SPCT_HAS_AGGREGATE; 1344 for (t = TYPE_FIELDS (type); t ; t = TREE_CHAIN (t)) 1345 if (TREE_CODE (t) == FIELD_DECL) 1346 ret |= stack_protect_classify_type (TREE_TYPE (t)); 1347 break; 1348 1349 default: 1350 break; 1351 } 1352 1353 return ret; 1354 } 1355 1356 /* Return nonzero if DECL should be segregated into the "vulnerable" upper 1357 part of the local stack frame. Remember if we ever return nonzero for 1358 any variable in this function. The return value is the phase number in 1359 which the variable should be allocated. */ 1360 1361 static int 1362 stack_protect_decl_phase (tree decl) 1363 { 1364 unsigned int bits = stack_protect_classify_type (TREE_TYPE (decl)); 1365 int ret = 0; 1366 1367 if (bits & SPCT_HAS_SMALL_CHAR_ARRAY) 1368 has_short_buffer = true; 1369 1370 if (flag_stack_protect == 2) 1371 { 1372 if ((bits & (SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_LARGE_CHAR_ARRAY)) 1373 && !(bits & SPCT_HAS_AGGREGATE)) 1374 ret = 1; 1375 else if (bits & SPCT_HAS_ARRAY) 1376 ret = 2; 1377 } 1378 else 1379 ret = (bits & SPCT_HAS_LARGE_CHAR_ARRAY) != 0; 1380 1381 if (ret) 1382 has_protected_decls = true; 1383 1384 return ret; 1385 } 1386 1387 /* Two helper routines that check for phase 1 and phase 2. These are used 1388 as callbacks for expand_stack_vars. */ 1389 1390 static bool 1391 stack_protect_decl_phase_1 (tree decl) 1392 { 1393 return stack_protect_decl_phase (decl) == 1; 1394 } 1395 1396 static bool 1397 stack_protect_decl_phase_2 (tree decl) 1398 { 1399 return stack_protect_decl_phase (decl) == 2; 1400 } 1401 1402 /* Ensure that variables in different stack protection phases conflict 1403 so that they are not merged and share the same stack slot. */ 1404 1405 static void 1406 add_stack_protection_conflicts (void) 1407 { 1408 size_t i, j, n = stack_vars_num; 1409 unsigned char *phase; 1410 1411 phase = XNEWVEC (unsigned char, n); 1412 for (i = 0; i < n; ++i) 1413 phase[i] = stack_protect_decl_phase (stack_vars[i].decl); 1414 1415 for (i = 0; i < n; ++i) 1416 { 1417 unsigned char ph_i = phase[i]; 1418 for (j = 0; j < i; ++j) 1419 if (ph_i != phase[j]) 1420 add_stack_var_conflict (i, j); 1421 } 1422 1423 XDELETEVEC (phase); 1424 } 1425 1426 /* Create a decl for the guard at the top of the stack frame. */ 1427 1428 static void 1429 create_stack_guard (void) 1430 { 1431 tree guard = build_decl (DECL_SOURCE_LOCATION (current_function_decl), 1432 VAR_DECL, NULL, ptr_type_node); 1433 TREE_THIS_VOLATILE (guard) = 1; 1434 TREE_USED (guard) = 1; 1435 expand_one_stack_var (guard); 1436 crtl->stack_protect_guard = guard; 1437 } 1438 1439 /* Prepare for expanding variables. */ 1440 static void 1441 init_vars_expansion (void) 1442 { 1443 tree t; 1444 unsigned ix; 1445 /* Set TREE_USED on all variables in the local_decls. */ 1446 FOR_EACH_LOCAL_DECL (cfun, ix, t) 1447 TREE_USED (t) = 1; 1448 1449 /* Clear TREE_USED on all variables associated with a block scope. */ 1450 clear_tree_used (DECL_INITIAL (current_function_decl)); 1451 1452 /* Initialize local stack smashing state. */ 1453 has_protected_decls = false; 1454 has_short_buffer = false; 1455 } 1456 1457 /* Free up stack variable graph data. */ 1458 static void 1459 fini_vars_expansion (void) 1460 { 1461 size_t i, n = stack_vars_num; 1462 for (i = 0; i < n; i++) 1463 BITMAP_FREE (stack_vars[i].conflicts); 1464 XDELETEVEC (stack_vars); 1465 XDELETEVEC (stack_vars_sorted); 1466 stack_vars = NULL; 1467 stack_vars_alloc = stack_vars_num = 0; 1468 pointer_map_destroy (decl_to_stack_part); 1469 decl_to_stack_part = NULL; 1470 } 1471 1472 /* Make a fair guess for the size of the stack frame of the function 1473 in NODE. This doesn't have to be exact, the result is only used in 1474 the inline heuristics. So we don't want to run the full stack var 1475 packing algorithm (which is quadratic in the number of stack vars). 1476 Instead, we calculate the total size of all stack vars. This turns 1477 out to be a pretty fair estimate -- packing of stack vars doesn't 1478 happen very often. */ 1479 1480 HOST_WIDE_INT 1481 estimated_stack_frame_size (struct cgraph_node *node) 1482 { 1483 HOST_WIDE_INT size = 0; 1484 size_t i; 1485 tree var; 1486 tree old_cur_fun_decl = current_function_decl; 1487 referenced_var_iterator rvi; 1488 struct function *fn = DECL_STRUCT_FUNCTION (node->decl); 1489 1490 current_function_decl = node->decl; 1491 push_cfun (fn); 1492 1493 gcc_checking_assert (gimple_referenced_vars (fn)); 1494 FOR_EACH_REFERENCED_VAR (fn, var, rvi) 1495 size += expand_one_var (var, true, false); 1496 1497 if (stack_vars_num > 0) 1498 { 1499 /* Fake sorting the stack vars for account_stack_vars (). */ 1500 stack_vars_sorted = XNEWVEC (size_t, stack_vars_num); 1501 for (i = 0; i < stack_vars_num; ++i) 1502 stack_vars_sorted[i] = i; 1503 size += account_stack_vars (); 1504 fini_vars_expansion (); 1505 } 1506 pop_cfun (); 1507 current_function_decl = old_cur_fun_decl; 1508 return size; 1509 } 1510 1511 /* Expand all variables used in the function. */ 1512 1513 static void 1514 expand_used_vars (void) 1515 { 1516 tree var, outer_block = DECL_INITIAL (current_function_decl); 1517 VEC(tree,heap) *maybe_local_decls = NULL; 1518 unsigned i; 1519 unsigned len; 1520 1521 /* Compute the phase of the stack frame for this function. */ 1522 { 1523 int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; 1524 int off = STARTING_FRAME_OFFSET % align; 1525 frame_phase = off ? align - off : 0; 1526 } 1527 1528 init_vars_expansion (); 1529 1530 for (i = 0; i < SA.map->num_partitions; i++) 1531 { 1532 tree var = partition_to_var (SA.map, i); 1533 1534 gcc_assert (is_gimple_reg (var)); 1535 if (TREE_CODE (SSA_NAME_VAR (var)) == VAR_DECL) 1536 expand_one_var (var, true, true); 1537 else 1538 { 1539 /* This is a PARM_DECL or RESULT_DECL. For those partitions that 1540 contain the default def (representing the parm or result itself) 1541 we don't do anything here. But those which don't contain the 1542 default def (representing a temporary based on the parm/result) 1543 we need to allocate space just like for normal VAR_DECLs. */ 1544 if (!bitmap_bit_p (SA.partition_has_default_def, i)) 1545 { 1546 expand_one_var (var, true, true); 1547 gcc_assert (SA.partition_to_pseudo[i]); 1548 } 1549 } 1550 } 1551 1552 /* At this point all variables on the local_decls with TREE_USED 1553 set are not associated with any block scope. Lay them out. */ 1554 1555 len = VEC_length (tree, cfun->local_decls); 1556 FOR_EACH_LOCAL_DECL (cfun, i, var) 1557 { 1558 bool expand_now = false; 1559 1560 /* Expanded above already. */ 1561 if (is_gimple_reg (var)) 1562 { 1563 TREE_USED (var) = 0; 1564 goto next; 1565 } 1566 /* We didn't set a block for static or extern because it's hard 1567 to tell the difference between a global variable (re)declared 1568 in a local scope, and one that's really declared there to 1569 begin with. And it doesn't really matter much, since we're 1570 not giving them stack space. Expand them now. */ 1571 else if (TREE_STATIC (var) || DECL_EXTERNAL (var)) 1572 expand_now = true; 1573 1574 /* If the variable is not associated with any block, then it 1575 was created by the optimizers, and could be live anywhere 1576 in the function. */ 1577 else if (TREE_USED (var)) 1578 expand_now = true; 1579 1580 /* Finally, mark all variables on the list as used. We'll use 1581 this in a moment when we expand those associated with scopes. */ 1582 TREE_USED (var) = 1; 1583 1584 if (expand_now) 1585 expand_one_var (var, true, true); 1586 1587 next: 1588 if (DECL_ARTIFICIAL (var) && !DECL_IGNORED_P (var)) 1589 { 1590 rtx rtl = DECL_RTL_IF_SET (var); 1591 1592 /* Keep artificial non-ignored vars in cfun->local_decls 1593 chain until instantiate_decls. */ 1594 if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT)) 1595 add_local_decl (cfun, var); 1596 else if (rtl == NULL_RTX) 1597 /* If rtl isn't set yet, which can happen e.g. with 1598 -fstack-protector, retry before returning from this 1599 function. */ 1600 VEC_safe_push (tree, heap, maybe_local_decls, var); 1601 } 1602 } 1603 1604 /* We duplicated some of the decls in CFUN->LOCAL_DECLS. 1605 1606 +-----------------+-----------------+ 1607 | ...processed... | ...duplicates...| 1608 +-----------------+-----------------+ 1609 ^ 1610 +-- LEN points here. 1611 1612 We just want the duplicates, as those are the artificial 1613 non-ignored vars that we want to keep until instantiate_decls. 1614 Move them down and truncate the array. */ 1615 if (!VEC_empty (tree, cfun->local_decls)) 1616 VEC_block_remove (tree, cfun->local_decls, 0, len); 1617 1618 /* At this point, all variables within the block tree with TREE_USED 1619 set are actually used by the optimized function. Lay them out. */ 1620 expand_used_vars_for_block (outer_block, true); 1621 1622 if (stack_vars_num > 0) 1623 { 1624 add_scope_conflicts (); 1625 /* Due to the way alias sets work, no variables with non-conflicting 1626 alias sets may be assigned the same address. Add conflicts to 1627 reflect this. */ 1628 add_alias_set_conflicts (); 1629 1630 /* If stack protection is enabled, we don't share space between 1631 vulnerable data and non-vulnerable data. */ 1632 if (flag_stack_protect) 1633 add_stack_protection_conflicts (); 1634 1635 /* Now that we have collected all stack variables, and have computed a 1636 minimal interference graph, attempt to save some stack space. */ 1637 partition_stack_vars (); 1638 if (dump_file) 1639 dump_stack_var_partition (); 1640 } 1641 1642 /* There are several conditions under which we should create a 1643 stack guard: protect-all, alloca used, protected decls present. */ 1644 if (flag_stack_protect == 2 1645 || (flag_stack_protect 1646 && (cfun->calls_alloca || has_protected_decls))) 1647 create_stack_guard (); 1648 1649 /* Assign rtl to each variable based on these partitions. */ 1650 if (stack_vars_num > 0) 1651 { 1652 /* Reorder decls to be protected by iterating over the variables 1653 array multiple times, and allocating out of each phase in turn. */ 1654 /* ??? We could probably integrate this into the qsort we did 1655 earlier, such that we naturally see these variables first, 1656 and thus naturally allocate things in the right order. */ 1657 if (has_protected_decls) 1658 { 1659 /* Phase 1 contains only character arrays. */ 1660 expand_stack_vars (stack_protect_decl_phase_1); 1661 1662 /* Phase 2 contains other kinds of arrays. */ 1663 if (flag_stack_protect == 2) 1664 expand_stack_vars (stack_protect_decl_phase_2); 1665 } 1666 1667 expand_stack_vars (NULL); 1668 1669 fini_vars_expansion (); 1670 } 1671 1672 /* If there were any artificial non-ignored vars without rtl 1673 found earlier, see if deferred stack allocation hasn't assigned 1674 rtl to them. */ 1675 FOR_EACH_VEC_ELT_REVERSE (tree, maybe_local_decls, i, var) 1676 { 1677 rtx rtl = DECL_RTL_IF_SET (var); 1678 1679 /* Keep artificial non-ignored vars in cfun->local_decls 1680 chain until instantiate_decls. */ 1681 if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT)) 1682 add_local_decl (cfun, var); 1683 } 1684 VEC_free (tree, heap, maybe_local_decls); 1685 1686 /* If the target requires that FRAME_OFFSET be aligned, do it. */ 1687 if (STACK_ALIGNMENT_NEEDED) 1688 { 1689 HOST_WIDE_INT align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; 1690 if (!FRAME_GROWS_DOWNWARD) 1691 frame_offset += align - 1; 1692 frame_offset &= -align; 1693 } 1694 } 1695 1696 1697 /* If we need to produce a detailed dump, print the tree representation 1698 for STMT to the dump file. SINCE is the last RTX after which the RTL 1699 generated for STMT should have been appended. */ 1700 1701 static void 1702 maybe_dump_rtl_for_gimple_stmt (gimple stmt, rtx since) 1703 { 1704 if (dump_file && (dump_flags & TDF_DETAILS)) 1705 { 1706 fprintf (dump_file, "\n;; "); 1707 print_gimple_stmt (dump_file, stmt, 0, 1708 TDF_SLIM | (dump_flags & TDF_LINENO)); 1709 fprintf (dump_file, "\n"); 1710 1711 print_rtl (dump_file, since ? NEXT_INSN (since) : since); 1712 } 1713 } 1714 1715 /* Maps the blocks that do not contain tree labels to rtx labels. */ 1716 1717 static struct pointer_map_t *lab_rtx_for_bb; 1718 1719 /* Returns the label_rtx expression for a label starting basic block BB. */ 1720 1721 static rtx 1722 label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED) 1723 { 1724 gimple_stmt_iterator gsi; 1725 tree lab; 1726 gimple lab_stmt; 1727 void **elt; 1728 1729 if (bb->flags & BB_RTL) 1730 return block_label (bb); 1731 1732 elt = pointer_map_contains (lab_rtx_for_bb, bb); 1733 if (elt) 1734 return (rtx) *elt; 1735 1736 /* Find the tree label if it is present. */ 1737 1738 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1739 { 1740 lab_stmt = gsi_stmt (gsi); 1741 if (gimple_code (lab_stmt) != GIMPLE_LABEL) 1742 break; 1743 1744 lab = gimple_label_label (lab_stmt); 1745 if (DECL_NONLOCAL (lab)) 1746 break; 1747 1748 return label_rtx (lab); 1749 } 1750 1751 elt = pointer_map_insert (lab_rtx_for_bb, bb); 1752 *elt = gen_label_rtx (); 1753 return (rtx) *elt; 1754 } 1755 1756 1757 /* A subroutine of expand_gimple_cond. Given E, a fallthrough edge 1758 of a basic block where we just expanded the conditional at the end, 1759 possibly clean up the CFG and instruction sequence. LAST is the 1760 last instruction before the just emitted jump sequence. */ 1761 1762 static void 1763 maybe_cleanup_end_of_block (edge e, rtx last) 1764 { 1765 /* Special case: when jumpif decides that the condition is 1766 trivial it emits an unconditional jump (and the necessary 1767 barrier). But we still have two edges, the fallthru one is 1768 wrong. purge_dead_edges would clean this up later. Unfortunately 1769 we have to insert insns (and split edges) before 1770 find_many_sub_basic_blocks and hence before purge_dead_edges. 1771 But splitting edges might create new blocks which depend on the 1772 fact that if there are two edges there's no barrier. So the 1773 barrier would get lost and verify_flow_info would ICE. Instead 1774 of auditing all edge splitters to care for the barrier (which 1775 normally isn't there in a cleaned CFG), fix it here. */ 1776 if (BARRIER_P (get_last_insn ())) 1777 { 1778 rtx insn; 1779 remove_edge (e); 1780 /* Now, we have a single successor block, if we have insns to 1781 insert on the remaining edge we potentially will insert 1782 it at the end of this block (if the dest block isn't feasible) 1783 in order to avoid splitting the edge. This insertion will take 1784 place in front of the last jump. But we might have emitted 1785 multiple jumps (conditional and one unconditional) to the 1786 same destination. Inserting in front of the last one then 1787 is a problem. See PR 40021. We fix this by deleting all 1788 jumps except the last unconditional one. */ 1789 insn = PREV_INSN (get_last_insn ()); 1790 /* Make sure we have an unconditional jump. Otherwise we're 1791 confused. */ 1792 gcc_assert (JUMP_P (insn) && !any_condjump_p (insn)); 1793 for (insn = PREV_INSN (insn); insn != last;) 1794 { 1795 insn = PREV_INSN (insn); 1796 if (JUMP_P (NEXT_INSN (insn))) 1797 { 1798 if (!any_condjump_p (NEXT_INSN (insn))) 1799 { 1800 gcc_assert (BARRIER_P (NEXT_INSN (NEXT_INSN (insn)))); 1801 delete_insn (NEXT_INSN (NEXT_INSN (insn))); 1802 } 1803 delete_insn (NEXT_INSN (insn)); 1804 } 1805 } 1806 } 1807 } 1808 1809 /* A subroutine of expand_gimple_basic_block. Expand one GIMPLE_COND. 1810 Returns a new basic block if we've terminated the current basic 1811 block and created a new one. */ 1812 1813 static basic_block 1814 expand_gimple_cond (basic_block bb, gimple stmt) 1815 { 1816 basic_block new_bb, dest; 1817 edge new_edge; 1818 edge true_edge; 1819 edge false_edge; 1820 rtx last2, last; 1821 enum tree_code code; 1822 tree op0, op1; 1823 1824 code = gimple_cond_code (stmt); 1825 op0 = gimple_cond_lhs (stmt); 1826 op1 = gimple_cond_rhs (stmt); 1827 /* We're sometimes presented with such code: 1828 D.123_1 = x < y; 1829 if (D.123_1 != 0) 1830 ... 1831 This would expand to two comparisons which then later might 1832 be cleaned up by combine. But some pattern matchers like if-conversion 1833 work better when there's only one compare, so make up for this 1834 here as special exception if TER would have made the same change. */ 1835 if (gimple_cond_single_var_p (stmt) 1836 && SA.values 1837 && TREE_CODE (op0) == SSA_NAME 1838 && bitmap_bit_p (SA.values, SSA_NAME_VERSION (op0))) 1839 { 1840 gimple second = SSA_NAME_DEF_STMT (op0); 1841 if (gimple_code (second) == GIMPLE_ASSIGN) 1842 { 1843 enum tree_code code2 = gimple_assign_rhs_code (second); 1844 if (TREE_CODE_CLASS (code2) == tcc_comparison) 1845 { 1846 code = code2; 1847 op0 = gimple_assign_rhs1 (second); 1848 op1 = gimple_assign_rhs2 (second); 1849 } 1850 /* If jumps are cheap turn some more codes into 1851 jumpy sequences. */ 1852 else if (BRANCH_COST (optimize_insn_for_speed_p (), false) < 4) 1853 { 1854 if ((code2 == BIT_AND_EXPR 1855 && TYPE_PRECISION (TREE_TYPE (op0)) == 1 1856 && TREE_CODE (gimple_assign_rhs2 (second)) != INTEGER_CST) 1857 || code2 == TRUTH_AND_EXPR) 1858 { 1859 code = TRUTH_ANDIF_EXPR; 1860 op0 = gimple_assign_rhs1 (second); 1861 op1 = gimple_assign_rhs2 (second); 1862 } 1863 else if (code2 == BIT_IOR_EXPR || code2 == TRUTH_OR_EXPR) 1864 { 1865 code = TRUTH_ORIF_EXPR; 1866 op0 = gimple_assign_rhs1 (second); 1867 op1 = gimple_assign_rhs2 (second); 1868 } 1869 } 1870 } 1871 } 1872 1873 last2 = last = get_last_insn (); 1874 1875 extract_true_false_edges_from_block (bb, &true_edge, &false_edge); 1876 set_curr_insn_source_location (gimple_location (stmt)); 1877 set_curr_insn_block (gimple_block (stmt)); 1878 1879 /* These flags have no purpose in RTL land. */ 1880 true_edge->flags &= ~EDGE_TRUE_VALUE; 1881 false_edge->flags &= ~EDGE_FALSE_VALUE; 1882 1883 /* We can either have a pure conditional jump with one fallthru edge or 1884 two-way jump that needs to be decomposed into two basic blocks. */ 1885 if (false_edge->dest == bb->next_bb) 1886 { 1887 jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest), 1888 true_edge->probability); 1889 maybe_dump_rtl_for_gimple_stmt (stmt, last); 1890 if (true_edge->goto_locus) 1891 { 1892 set_curr_insn_source_location (true_edge->goto_locus); 1893 set_curr_insn_block (true_edge->goto_block); 1894 true_edge->goto_locus = curr_insn_locator (); 1895 } 1896 true_edge->goto_block = NULL; 1897 false_edge->flags |= EDGE_FALLTHRU; 1898 maybe_cleanup_end_of_block (false_edge, last); 1899 return NULL; 1900 } 1901 if (true_edge->dest == bb->next_bb) 1902 { 1903 jumpifnot_1 (code, op0, op1, label_rtx_for_bb (false_edge->dest), 1904 false_edge->probability); 1905 maybe_dump_rtl_for_gimple_stmt (stmt, last); 1906 if (false_edge->goto_locus) 1907 { 1908 set_curr_insn_source_location (false_edge->goto_locus); 1909 set_curr_insn_block (false_edge->goto_block); 1910 false_edge->goto_locus = curr_insn_locator (); 1911 } 1912 false_edge->goto_block = NULL; 1913 true_edge->flags |= EDGE_FALLTHRU; 1914 maybe_cleanup_end_of_block (true_edge, last); 1915 return NULL; 1916 } 1917 1918 jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest), 1919 true_edge->probability); 1920 last = get_last_insn (); 1921 if (false_edge->goto_locus) 1922 { 1923 set_curr_insn_source_location (false_edge->goto_locus); 1924 set_curr_insn_block (false_edge->goto_block); 1925 false_edge->goto_locus = curr_insn_locator (); 1926 } 1927 false_edge->goto_block = NULL; 1928 emit_jump (label_rtx_for_bb (false_edge->dest)); 1929 1930 BB_END (bb) = last; 1931 if (BARRIER_P (BB_END (bb))) 1932 BB_END (bb) = PREV_INSN (BB_END (bb)); 1933 update_bb_for_insn (bb); 1934 1935 new_bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb); 1936 dest = false_edge->dest; 1937 redirect_edge_succ (false_edge, new_bb); 1938 false_edge->flags |= EDGE_FALLTHRU; 1939 new_bb->count = false_edge->count; 1940 new_bb->frequency = EDGE_FREQUENCY (false_edge); 1941 new_edge = make_edge (new_bb, dest, 0); 1942 new_edge->probability = REG_BR_PROB_BASE; 1943 new_edge->count = new_bb->count; 1944 if (BARRIER_P (BB_END (new_bb))) 1945 BB_END (new_bb) = PREV_INSN (BB_END (new_bb)); 1946 update_bb_for_insn (new_bb); 1947 1948 maybe_dump_rtl_for_gimple_stmt (stmt, last2); 1949 1950 if (true_edge->goto_locus) 1951 { 1952 set_curr_insn_source_location (true_edge->goto_locus); 1953 set_curr_insn_block (true_edge->goto_block); 1954 true_edge->goto_locus = curr_insn_locator (); 1955 } 1956 true_edge->goto_block = NULL; 1957 1958 return new_bb; 1959 } 1960 1961 /* Mark all calls that can have a transaction restart. */ 1962 1963 static void 1964 mark_transaction_restart_calls (gimple stmt) 1965 { 1966 struct tm_restart_node dummy; 1967 void **slot; 1968 1969 if (!cfun->gimple_df->tm_restart) 1970 return; 1971 1972 dummy.stmt = stmt; 1973 slot = htab_find_slot (cfun->gimple_df->tm_restart, &dummy, NO_INSERT); 1974 if (slot) 1975 { 1976 struct tm_restart_node *n = (struct tm_restart_node *) *slot; 1977 tree list = n->label_or_list; 1978 rtx insn; 1979 1980 for (insn = next_real_insn (get_last_insn ()); 1981 !CALL_P (insn); 1982 insn = next_real_insn (insn)) 1983 continue; 1984 1985 if (TREE_CODE (list) == LABEL_DECL) 1986 add_reg_note (insn, REG_TM, label_rtx (list)); 1987 else 1988 for (; list ; list = TREE_CHAIN (list)) 1989 add_reg_note (insn, REG_TM, label_rtx (TREE_VALUE (list))); 1990 } 1991 } 1992 1993 /* A subroutine of expand_gimple_stmt_1, expanding one GIMPLE_CALL 1994 statement STMT. */ 1995 1996 static void 1997 expand_call_stmt (gimple stmt) 1998 { 1999 tree exp, decl, lhs; 2000 bool builtin_p; 2001 size_t i; 2002 2003 if (gimple_call_internal_p (stmt)) 2004 { 2005 expand_internal_call (stmt); 2006 return; 2007 } 2008 2009 exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3); 2010 2011 CALL_EXPR_FN (exp) = gimple_call_fn (stmt); 2012 decl = gimple_call_fndecl (stmt); 2013 builtin_p = decl && DECL_BUILT_IN (decl); 2014 2015 /* If this is not a builtin function, the function type through which the 2016 call is made may be different from the type of the function. */ 2017 if (!builtin_p) 2018 CALL_EXPR_FN (exp) 2019 = fold_convert (build_pointer_type (gimple_call_fntype (stmt)), 2020 CALL_EXPR_FN (exp)); 2021 2022 TREE_TYPE (exp) = gimple_call_return_type (stmt); 2023 CALL_EXPR_STATIC_CHAIN (exp) = gimple_call_chain (stmt); 2024 2025 for (i = 0; i < gimple_call_num_args (stmt); i++) 2026 { 2027 tree arg = gimple_call_arg (stmt, i); 2028 gimple def; 2029 /* TER addresses into arguments of builtin functions so we have a 2030 chance to infer more correct alignment information. See PR39954. */ 2031 if (builtin_p 2032 && TREE_CODE (arg) == SSA_NAME 2033 && (def = get_gimple_for_ssa_name (arg)) 2034 && gimple_assign_rhs_code (def) == ADDR_EXPR) 2035 arg = gimple_assign_rhs1 (def); 2036 CALL_EXPR_ARG (exp, i) = arg; 2037 } 2038 2039 if (gimple_has_side_effects (stmt)) 2040 TREE_SIDE_EFFECTS (exp) = 1; 2041 2042 if (gimple_call_nothrow_p (stmt)) 2043 TREE_NOTHROW (exp) = 1; 2044 2045 CALL_EXPR_TAILCALL (exp) = gimple_call_tail_p (stmt); 2046 CALL_EXPR_RETURN_SLOT_OPT (exp) = gimple_call_return_slot_opt_p (stmt); 2047 if (decl 2048 && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL 2049 && (DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA 2050 || DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA_WITH_ALIGN)) 2051 CALL_ALLOCA_FOR_VAR_P (exp) = gimple_call_alloca_for_var_p (stmt); 2052 else 2053 CALL_FROM_THUNK_P (exp) = gimple_call_from_thunk_p (stmt); 2054 CALL_EXPR_VA_ARG_PACK (exp) = gimple_call_va_arg_pack_p (stmt); 2055 SET_EXPR_LOCATION (exp, gimple_location (stmt)); 2056 TREE_BLOCK (exp) = gimple_block (stmt); 2057 2058 /* Ensure RTL is created for debug args. */ 2059 if (decl && DECL_HAS_DEBUG_ARGS_P (decl)) 2060 { 2061 VEC(tree, gc) **debug_args = decl_debug_args_lookup (decl); 2062 unsigned int ix; 2063 tree dtemp; 2064 2065 if (debug_args) 2066 for (ix = 1; VEC_iterate (tree, *debug_args, ix, dtemp); ix += 2) 2067 { 2068 gcc_assert (TREE_CODE (dtemp) == DEBUG_EXPR_DECL); 2069 expand_debug_expr (dtemp); 2070 } 2071 } 2072 2073 lhs = gimple_call_lhs (stmt); 2074 if (lhs) 2075 expand_assignment (lhs, exp, false); 2076 else 2077 expand_expr_real_1 (exp, const0_rtx, VOIDmode, EXPAND_NORMAL, NULL); 2078 2079 mark_transaction_restart_calls (stmt); 2080 } 2081 2082 /* A subroutine of expand_gimple_stmt, expanding one gimple statement 2083 STMT that doesn't require special handling for outgoing edges. That 2084 is no tailcalls and no GIMPLE_COND. */ 2085 2086 static void 2087 expand_gimple_stmt_1 (gimple stmt) 2088 { 2089 tree op0; 2090 2091 set_curr_insn_source_location (gimple_location (stmt)); 2092 set_curr_insn_block (gimple_block (stmt)); 2093 2094 switch (gimple_code (stmt)) 2095 { 2096 case GIMPLE_GOTO: 2097 op0 = gimple_goto_dest (stmt); 2098 if (TREE_CODE (op0) == LABEL_DECL) 2099 expand_goto (op0); 2100 else 2101 expand_computed_goto (op0); 2102 break; 2103 case GIMPLE_LABEL: 2104 expand_label (gimple_label_label (stmt)); 2105 break; 2106 case GIMPLE_NOP: 2107 case GIMPLE_PREDICT: 2108 break; 2109 case GIMPLE_SWITCH: 2110 expand_case (stmt); 2111 break; 2112 case GIMPLE_ASM: 2113 expand_asm_stmt (stmt); 2114 break; 2115 case GIMPLE_CALL: 2116 expand_call_stmt (stmt); 2117 break; 2118 2119 case GIMPLE_RETURN: 2120 op0 = gimple_return_retval (stmt); 2121 2122 if (op0 && op0 != error_mark_node) 2123 { 2124 tree result = DECL_RESULT (current_function_decl); 2125 2126 /* If we are not returning the current function's RESULT_DECL, 2127 build an assignment to it. */ 2128 if (op0 != result) 2129 { 2130 /* I believe that a function's RESULT_DECL is unique. */ 2131 gcc_assert (TREE_CODE (op0) != RESULT_DECL); 2132 2133 /* ??? We'd like to use simply expand_assignment here, 2134 but this fails if the value is of BLKmode but the return 2135 decl is a register. expand_return has special handling 2136 for this combination, which eventually should move 2137 to common code. See comments there. Until then, let's 2138 build a modify expression :-/ */ 2139 op0 = build2 (MODIFY_EXPR, TREE_TYPE (result), 2140 result, op0); 2141 } 2142 } 2143 if (!op0) 2144 expand_null_return (); 2145 else 2146 expand_return (op0); 2147 break; 2148 2149 case GIMPLE_ASSIGN: 2150 { 2151 tree lhs = gimple_assign_lhs (stmt); 2152 2153 /* Tree expand used to fiddle with |= and &= of two bitfield 2154 COMPONENT_REFs here. This can't happen with gimple, the LHS 2155 of binary assigns must be a gimple reg. */ 2156 2157 if (TREE_CODE (lhs) != SSA_NAME 2158 || get_gimple_rhs_class (gimple_expr_code (stmt)) 2159 == GIMPLE_SINGLE_RHS) 2160 { 2161 tree rhs = gimple_assign_rhs1 (stmt); 2162 gcc_assert (get_gimple_rhs_class (gimple_expr_code (stmt)) 2163 == GIMPLE_SINGLE_RHS); 2164 if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs)) 2165 SET_EXPR_LOCATION (rhs, gimple_location (stmt)); 2166 if (TREE_CLOBBER_P (rhs)) 2167 /* This is a clobber to mark the going out of scope for 2168 this LHS. */ 2169 ; 2170 else 2171 expand_assignment (lhs, rhs, 2172 gimple_assign_nontemporal_move_p (stmt)); 2173 } 2174 else 2175 { 2176 rtx target, temp; 2177 bool nontemporal = gimple_assign_nontemporal_move_p (stmt); 2178 struct separate_ops ops; 2179 bool promoted = false; 2180 2181 target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); 2182 if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target)) 2183 promoted = true; 2184 2185 ops.code = gimple_assign_rhs_code (stmt); 2186 ops.type = TREE_TYPE (lhs); 2187 switch (get_gimple_rhs_class (gimple_expr_code (stmt))) 2188 { 2189 case GIMPLE_TERNARY_RHS: 2190 ops.op2 = gimple_assign_rhs3 (stmt); 2191 /* Fallthru */ 2192 case GIMPLE_BINARY_RHS: 2193 ops.op1 = gimple_assign_rhs2 (stmt); 2194 /* Fallthru */ 2195 case GIMPLE_UNARY_RHS: 2196 ops.op0 = gimple_assign_rhs1 (stmt); 2197 break; 2198 default: 2199 gcc_unreachable (); 2200 } 2201 ops.location = gimple_location (stmt); 2202 2203 /* If we want to use a nontemporal store, force the value to 2204 register first. If we store into a promoted register, 2205 don't directly expand to target. */ 2206 temp = nontemporal || promoted ? NULL_RTX : target; 2207 temp = expand_expr_real_2 (&ops, temp, GET_MODE (target), 2208 EXPAND_NORMAL); 2209 2210 if (temp == target) 2211 ; 2212 else if (promoted) 2213 { 2214 int unsignedp = SUBREG_PROMOTED_UNSIGNED_P (target); 2215 /* If TEMP is a VOIDmode constant, use convert_modes to make 2216 sure that we properly convert it. */ 2217 if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode) 2218 { 2219 temp = convert_modes (GET_MODE (target), 2220 TYPE_MODE (ops.type), 2221 temp, unsignedp); 2222 temp = convert_modes (GET_MODE (SUBREG_REG (target)), 2223 GET_MODE (target), temp, unsignedp); 2224 } 2225 2226 convert_move (SUBREG_REG (target), temp, unsignedp); 2227 } 2228 else if (nontemporal && emit_storent_insn (target, temp)) 2229 ; 2230 else 2231 { 2232 temp = force_operand (temp, target); 2233 if (temp != target) 2234 emit_move_insn (target, temp); 2235 } 2236 } 2237 } 2238 break; 2239 2240 default: 2241 gcc_unreachable (); 2242 } 2243 } 2244 2245 /* Expand one gimple statement STMT and return the last RTL instruction 2246 before any of the newly generated ones. 2247 2248 In addition to generating the necessary RTL instructions this also 2249 sets REG_EH_REGION notes if necessary and sets the current source 2250 location for diagnostics. */ 2251 2252 static rtx 2253 expand_gimple_stmt (gimple stmt) 2254 { 2255 location_t saved_location = input_location; 2256 rtx last = get_last_insn (); 2257 int lp_nr; 2258 2259 gcc_assert (cfun); 2260 2261 /* We need to save and restore the current source location so that errors 2262 discovered during expansion are emitted with the right location. But 2263 it would be better if the diagnostic routines used the source location 2264 embedded in the tree nodes rather than globals. */ 2265 if (gimple_has_location (stmt)) 2266 input_location = gimple_location (stmt); 2267 2268 expand_gimple_stmt_1 (stmt); 2269 2270 /* Free any temporaries used to evaluate this statement. */ 2271 free_temp_slots (); 2272 2273 input_location = saved_location; 2274 2275 /* Mark all insns that may trap. */ 2276 lp_nr = lookup_stmt_eh_lp (stmt); 2277 if (lp_nr) 2278 { 2279 rtx insn; 2280 for (insn = next_real_insn (last); insn; 2281 insn = next_real_insn (insn)) 2282 { 2283 if (! find_reg_note (insn, REG_EH_REGION, NULL_RTX) 2284 /* If we want exceptions for non-call insns, any 2285 may_trap_p instruction may throw. */ 2286 && GET_CODE (PATTERN (insn)) != CLOBBER 2287 && GET_CODE (PATTERN (insn)) != USE 2288 && insn_could_throw_p (insn)) 2289 make_reg_eh_region_note (insn, 0, lp_nr); 2290 } 2291 } 2292 2293 return last; 2294 } 2295 2296 /* A subroutine of expand_gimple_basic_block. Expand one GIMPLE_CALL 2297 that has CALL_EXPR_TAILCALL set. Returns non-null if we actually 2298 generated a tail call (something that might be denied by the ABI 2299 rules governing the call; see calls.c). 2300 2301 Sets CAN_FALLTHRU if we generated a *conditional* tail call, and 2302 can still reach the rest of BB. The case here is __builtin_sqrt, 2303 where the NaN result goes through the external function (with a 2304 tailcall) and the normal result happens via a sqrt instruction. */ 2305 2306 static basic_block 2307 expand_gimple_tailcall (basic_block bb, gimple stmt, bool *can_fallthru) 2308 { 2309 rtx last2, last; 2310 edge e; 2311 edge_iterator ei; 2312 int probability; 2313 gcov_type count; 2314 2315 last2 = last = expand_gimple_stmt (stmt); 2316 2317 for (last = NEXT_INSN (last); last; last = NEXT_INSN (last)) 2318 if (CALL_P (last) && SIBLING_CALL_P (last)) 2319 goto found; 2320 2321 maybe_dump_rtl_for_gimple_stmt (stmt, last2); 2322 2323 *can_fallthru = true; 2324 return NULL; 2325 2326 found: 2327 /* ??? Wouldn't it be better to just reset any pending stack adjust? 2328 Any instructions emitted here are about to be deleted. */ 2329 do_pending_stack_adjust (); 2330 2331 /* Remove any non-eh, non-abnormal edges that don't go to exit. */ 2332 /* ??? I.e. the fallthrough edge. HOWEVER! If there were to be 2333 EH or abnormal edges, we shouldn't have created a tail call in 2334 the first place. So it seems to me we should just be removing 2335 all edges here, or redirecting the existing fallthru edge to 2336 the exit block. */ 2337 2338 probability = 0; 2339 count = 0; 2340 2341 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) 2342 { 2343 if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH))) 2344 { 2345 if (e->dest != EXIT_BLOCK_PTR) 2346 { 2347 e->dest->count -= e->count; 2348 e->dest->frequency -= EDGE_FREQUENCY (e); 2349 if (e->dest->count < 0) 2350 e->dest->count = 0; 2351 if (e->dest->frequency < 0) 2352 e->dest->frequency = 0; 2353 } 2354 count += e->count; 2355 probability += e->probability; 2356 remove_edge (e); 2357 } 2358 else 2359 ei_next (&ei); 2360 } 2361 2362 /* This is somewhat ugly: the call_expr expander often emits instructions 2363 after the sibcall (to perform the function return). These confuse the 2364 find_many_sub_basic_blocks code, so we need to get rid of these. */ 2365 last = NEXT_INSN (last); 2366 gcc_assert (BARRIER_P (last)); 2367 2368 *can_fallthru = false; 2369 while (NEXT_INSN (last)) 2370 { 2371 /* For instance an sqrt builtin expander expands if with 2372 sibcall in the then and label for `else`. */ 2373 if (LABEL_P (NEXT_INSN (last))) 2374 { 2375 *can_fallthru = true; 2376 break; 2377 } 2378 delete_insn (NEXT_INSN (last)); 2379 } 2380 2381 e = make_edge (bb, EXIT_BLOCK_PTR, EDGE_ABNORMAL | EDGE_SIBCALL); 2382 e->probability += probability; 2383 e->count += count; 2384 BB_END (bb) = last; 2385 update_bb_for_insn (bb); 2386 2387 if (NEXT_INSN (last)) 2388 { 2389 bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb); 2390 2391 last = BB_END (bb); 2392 if (BARRIER_P (last)) 2393 BB_END (bb) = PREV_INSN (last); 2394 } 2395 2396 maybe_dump_rtl_for_gimple_stmt (stmt, last2); 2397 2398 return bb; 2399 } 2400 2401 /* Return the difference between the floor and the truncated result of 2402 a signed division by OP1 with remainder MOD. */ 2403 static rtx 2404 floor_sdiv_adjust (enum machine_mode mode, rtx mod, rtx op1) 2405 { 2406 /* (mod != 0 ? (op1 / mod < 0 ? -1 : 0) : 0) */ 2407 return gen_rtx_IF_THEN_ELSE 2408 (mode, gen_rtx_NE (BImode, mod, const0_rtx), 2409 gen_rtx_IF_THEN_ELSE 2410 (mode, gen_rtx_LT (BImode, 2411 gen_rtx_DIV (mode, op1, mod), 2412 const0_rtx), 2413 constm1_rtx, const0_rtx), 2414 const0_rtx); 2415 } 2416 2417 /* Return the difference between the ceil and the truncated result of 2418 a signed division by OP1 with remainder MOD. */ 2419 static rtx 2420 ceil_sdiv_adjust (enum machine_mode mode, rtx mod, rtx op1) 2421 { 2422 /* (mod != 0 ? (op1 / mod > 0 ? 1 : 0) : 0) */ 2423 return gen_rtx_IF_THEN_ELSE 2424 (mode, gen_rtx_NE (BImode, mod, const0_rtx), 2425 gen_rtx_IF_THEN_ELSE 2426 (mode, gen_rtx_GT (BImode, 2427 gen_rtx_DIV (mode, op1, mod), 2428 const0_rtx), 2429 const1_rtx, const0_rtx), 2430 const0_rtx); 2431 } 2432 2433 /* Return the difference between the ceil and the truncated result of 2434 an unsigned division by OP1 with remainder MOD. */ 2435 static rtx 2436 ceil_udiv_adjust (enum machine_mode mode, rtx mod, rtx op1 ATTRIBUTE_UNUSED) 2437 { 2438 /* (mod != 0 ? 1 : 0) */ 2439 return gen_rtx_IF_THEN_ELSE 2440 (mode, gen_rtx_NE (BImode, mod, const0_rtx), 2441 const1_rtx, const0_rtx); 2442 } 2443 2444 /* Return the difference between the rounded and the truncated result 2445 of a signed division by OP1 with remainder MOD. Halfway cases are 2446 rounded away from zero, rather than to the nearest even number. */ 2447 static rtx 2448 round_sdiv_adjust (enum machine_mode mode, rtx mod, rtx op1) 2449 { 2450 /* (abs (mod) >= abs (op1) - abs (mod) 2451 ? (op1 / mod > 0 ? 1 : -1) 2452 : 0) */ 2453 return gen_rtx_IF_THEN_ELSE 2454 (mode, gen_rtx_GE (BImode, gen_rtx_ABS (mode, mod), 2455 gen_rtx_MINUS (mode, 2456 gen_rtx_ABS (mode, op1), 2457 gen_rtx_ABS (mode, mod))), 2458 gen_rtx_IF_THEN_ELSE 2459 (mode, gen_rtx_GT (BImode, 2460 gen_rtx_DIV (mode, op1, mod), 2461 const0_rtx), 2462 const1_rtx, constm1_rtx), 2463 const0_rtx); 2464 } 2465 2466 /* Return the difference between the rounded and the truncated result 2467 of a unsigned division by OP1 with remainder MOD. Halfway cases 2468 are rounded away from zero, rather than to the nearest even 2469 number. */ 2470 static rtx 2471 round_udiv_adjust (enum machine_mode mode, rtx mod, rtx op1) 2472 { 2473 /* (mod >= op1 - mod ? 1 : 0) */ 2474 return gen_rtx_IF_THEN_ELSE 2475 (mode, gen_rtx_GE (BImode, mod, 2476 gen_rtx_MINUS (mode, op1, mod)), 2477 const1_rtx, const0_rtx); 2478 } 2479 2480 /* Convert X to MODE, that must be Pmode or ptr_mode, without emitting 2481 any rtl. */ 2482 2483 static rtx 2484 convert_debug_memory_address (enum machine_mode mode, rtx x, 2485 addr_space_t as) 2486 { 2487 enum machine_mode xmode = GET_MODE (x); 2488 2489 #ifndef POINTERS_EXTEND_UNSIGNED 2490 gcc_assert (mode == Pmode 2491 || mode == targetm.addr_space.address_mode (as)); 2492 gcc_assert (xmode == mode || xmode == VOIDmode); 2493 #else 2494 rtx temp; 2495 2496 gcc_assert (targetm.addr_space.valid_pointer_mode (mode, as)); 2497 2498 if (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode) 2499 return x; 2500 2501 if (GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (xmode)) 2502 x = simplify_gen_subreg (mode, x, xmode, 2503 subreg_lowpart_offset 2504 (mode, xmode)); 2505 else if (POINTERS_EXTEND_UNSIGNED > 0) 2506 x = gen_rtx_ZERO_EXTEND (mode, x); 2507 else if (!POINTERS_EXTEND_UNSIGNED) 2508 x = gen_rtx_SIGN_EXTEND (mode, x); 2509 else 2510 { 2511 switch (GET_CODE (x)) 2512 { 2513 case SUBREG: 2514 if ((SUBREG_PROMOTED_VAR_P (x) 2515 || (REG_P (SUBREG_REG (x)) && REG_POINTER (SUBREG_REG (x))) 2516 || (GET_CODE (SUBREG_REG (x)) == PLUS 2517 && REG_P (XEXP (SUBREG_REG (x), 0)) 2518 && REG_POINTER (XEXP (SUBREG_REG (x), 0)) 2519 && CONST_INT_P (XEXP (SUBREG_REG (x), 1)))) 2520 && GET_MODE (SUBREG_REG (x)) == mode) 2521 return SUBREG_REG (x); 2522 break; 2523 case LABEL_REF: 2524 temp = gen_rtx_LABEL_REF (mode, XEXP (x, 0)); 2525 LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x); 2526 return temp; 2527 case SYMBOL_REF: 2528 temp = shallow_copy_rtx (x); 2529 PUT_MODE (temp, mode); 2530 return temp; 2531 case CONST: 2532 temp = convert_debug_memory_address (mode, XEXP (x, 0), as); 2533 if (temp) 2534 temp = gen_rtx_CONST (mode, temp); 2535 return temp; 2536 case PLUS: 2537 case MINUS: 2538 if (CONST_INT_P (XEXP (x, 1))) 2539 { 2540 temp = convert_debug_memory_address (mode, XEXP (x, 0), as); 2541 if (temp) 2542 return gen_rtx_fmt_ee (GET_CODE (x), mode, temp, XEXP (x, 1)); 2543 } 2544 break; 2545 default: 2546 break; 2547 } 2548 /* Don't know how to express ptr_extend as operation in debug info. */ 2549 return NULL; 2550 } 2551 #endif /* POINTERS_EXTEND_UNSIGNED */ 2552 2553 return x; 2554 } 2555 2556 /* Return an RTX equivalent to the value of the parameter DECL. */ 2557 2558 static rtx 2559 expand_debug_parm_decl (tree decl) 2560 { 2561 rtx incoming = DECL_INCOMING_RTL (decl); 2562 2563 if (incoming 2564 && GET_MODE (incoming) != BLKmode 2565 && ((REG_P (incoming) && HARD_REGISTER_P (incoming)) 2566 || (MEM_P (incoming) 2567 && REG_P (XEXP (incoming, 0)) 2568 && HARD_REGISTER_P (XEXP (incoming, 0))))) 2569 { 2570 rtx rtl = gen_rtx_ENTRY_VALUE (GET_MODE (incoming)); 2571 2572 #ifdef HAVE_window_save 2573 /* DECL_INCOMING_RTL uses the INCOMING_REGNO of parameter registers. 2574 If the target machine has an explicit window save instruction, the 2575 actual entry value is the corresponding OUTGOING_REGNO instead. */ 2576 if (REG_P (incoming) 2577 && OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming)) 2578 incoming 2579 = gen_rtx_REG_offset (incoming, GET_MODE (incoming), 2580 OUTGOING_REGNO (REGNO (incoming)), 0); 2581 else if (MEM_P (incoming)) 2582 { 2583 rtx reg = XEXP (incoming, 0); 2584 if (OUTGOING_REGNO (REGNO (reg)) != REGNO (reg)) 2585 { 2586 reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg))); 2587 incoming = replace_equiv_address_nv (incoming, reg); 2588 } 2589 } 2590 #endif 2591 2592 ENTRY_VALUE_EXP (rtl) = incoming; 2593 return rtl; 2594 } 2595 2596 if (incoming 2597 && GET_MODE (incoming) != BLKmode 2598 && !TREE_ADDRESSABLE (decl) 2599 && MEM_P (incoming) 2600 && (XEXP (incoming, 0) == virtual_incoming_args_rtx 2601 || (GET_CODE (XEXP (incoming, 0)) == PLUS 2602 && XEXP (XEXP (incoming, 0), 0) == virtual_incoming_args_rtx 2603 && CONST_INT_P (XEXP (XEXP (incoming, 0), 1))))) 2604 return incoming; 2605 2606 return NULL_RTX; 2607 } 2608 2609 /* Return an RTX equivalent to the value of the tree expression EXP. */ 2610 2611 static rtx 2612 expand_debug_expr (tree exp) 2613 { 2614 rtx op0 = NULL_RTX, op1 = NULL_RTX, op2 = NULL_RTX; 2615 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp)); 2616 enum machine_mode inner_mode = VOIDmode; 2617 int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); 2618 addr_space_t as; 2619 2620 switch (TREE_CODE_CLASS (TREE_CODE (exp))) 2621 { 2622 case tcc_expression: 2623 switch (TREE_CODE (exp)) 2624 { 2625 case COND_EXPR: 2626 case DOT_PROD_EXPR: 2627 case WIDEN_MULT_PLUS_EXPR: 2628 case WIDEN_MULT_MINUS_EXPR: 2629 case FMA_EXPR: 2630 goto ternary; 2631 2632 case TRUTH_ANDIF_EXPR: 2633 case TRUTH_ORIF_EXPR: 2634 case TRUTH_AND_EXPR: 2635 case TRUTH_OR_EXPR: 2636 case TRUTH_XOR_EXPR: 2637 goto binary; 2638 2639 case TRUTH_NOT_EXPR: 2640 goto unary; 2641 2642 default: 2643 break; 2644 } 2645 break; 2646 2647 ternary: 2648 op2 = expand_debug_expr (TREE_OPERAND (exp, 2)); 2649 if (!op2) 2650 return NULL_RTX; 2651 /* Fall through. */ 2652 2653 binary: 2654 case tcc_binary: 2655 case tcc_comparison: 2656 op1 = expand_debug_expr (TREE_OPERAND (exp, 1)); 2657 if (!op1) 2658 return NULL_RTX; 2659 /* Fall through. */ 2660 2661 unary: 2662 case tcc_unary: 2663 inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))); 2664 op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); 2665 if (!op0) 2666 return NULL_RTX; 2667 break; 2668 2669 case tcc_type: 2670 case tcc_statement: 2671 gcc_unreachable (); 2672 2673 case tcc_constant: 2674 case tcc_exceptional: 2675 case tcc_declaration: 2676 case tcc_reference: 2677 case tcc_vl_exp: 2678 break; 2679 } 2680 2681 switch (TREE_CODE (exp)) 2682 { 2683 case STRING_CST: 2684 if (!lookup_constant_def (exp)) 2685 { 2686 if (strlen (TREE_STRING_POINTER (exp)) + 1 2687 != (size_t) TREE_STRING_LENGTH (exp)) 2688 return NULL_RTX; 2689 op0 = gen_rtx_CONST_STRING (Pmode, TREE_STRING_POINTER (exp)); 2690 op0 = gen_rtx_MEM (BLKmode, op0); 2691 set_mem_attributes (op0, exp, 0); 2692 return op0; 2693 } 2694 /* Fall through... */ 2695 2696 case INTEGER_CST: 2697 case REAL_CST: 2698 case FIXED_CST: 2699 op0 = expand_expr (exp, NULL_RTX, mode, EXPAND_INITIALIZER); 2700 return op0; 2701 2702 case COMPLEX_CST: 2703 gcc_assert (COMPLEX_MODE_P (mode)); 2704 op0 = expand_debug_expr (TREE_REALPART (exp)); 2705 op1 = expand_debug_expr (TREE_IMAGPART (exp)); 2706 return gen_rtx_CONCAT (mode, op0, op1); 2707 2708 case DEBUG_EXPR_DECL: 2709 op0 = DECL_RTL_IF_SET (exp); 2710 2711 if (op0) 2712 return op0; 2713 2714 op0 = gen_rtx_DEBUG_EXPR (mode); 2715 DEBUG_EXPR_TREE_DECL (op0) = exp; 2716 SET_DECL_RTL (exp, op0); 2717 2718 return op0; 2719 2720 case VAR_DECL: 2721 case PARM_DECL: 2722 case FUNCTION_DECL: 2723 case LABEL_DECL: 2724 case CONST_DECL: 2725 case RESULT_DECL: 2726 op0 = DECL_RTL_IF_SET (exp); 2727 2728 /* This decl was probably optimized away. */ 2729 if (!op0) 2730 { 2731 if (TREE_CODE (exp) != VAR_DECL 2732 || DECL_EXTERNAL (exp) 2733 || !TREE_STATIC (exp) 2734 || !DECL_NAME (exp) 2735 || DECL_HARD_REGISTER (exp) 2736 || DECL_IN_CONSTANT_POOL (exp) 2737 || mode == VOIDmode) 2738 return NULL; 2739 2740 op0 = make_decl_rtl_for_debug (exp); 2741 if (!MEM_P (op0) 2742 || GET_CODE (XEXP (op0, 0)) != SYMBOL_REF 2743 || SYMBOL_REF_DECL (XEXP (op0, 0)) != exp) 2744 return NULL; 2745 } 2746 else 2747 op0 = copy_rtx (op0); 2748 2749 if (GET_MODE (op0) == BLKmode 2750 /* If op0 is not BLKmode, but BLKmode is, adjust_mode 2751 below would ICE. While it is likely a FE bug, 2752 try to be robust here. See PR43166. */ 2753 || mode == BLKmode 2754 || (mode == VOIDmode && GET_MODE (op0) != VOIDmode)) 2755 { 2756 gcc_assert (MEM_P (op0)); 2757 op0 = adjust_address_nv (op0, mode, 0); 2758 return op0; 2759 } 2760 2761 /* Fall through. */ 2762 2763 adjust_mode: 2764 case PAREN_EXPR: 2765 case NOP_EXPR: 2766 case CONVERT_EXPR: 2767 { 2768 inner_mode = GET_MODE (op0); 2769 2770 if (mode == inner_mode) 2771 return op0; 2772 2773 if (inner_mode == VOIDmode) 2774 { 2775 if (TREE_CODE (exp) == SSA_NAME) 2776 inner_mode = TYPE_MODE (TREE_TYPE (exp)); 2777 else 2778 inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))); 2779 if (mode == inner_mode) 2780 return op0; 2781 } 2782 2783 if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode)) 2784 { 2785 if (GET_MODE_BITSIZE (mode) == GET_MODE_BITSIZE (inner_mode)) 2786 op0 = simplify_gen_subreg (mode, op0, inner_mode, 0); 2787 else if (GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (inner_mode)) 2788 op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode); 2789 else 2790 op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode); 2791 } 2792 else if (FLOAT_MODE_P (mode)) 2793 { 2794 gcc_assert (TREE_CODE (exp) != SSA_NAME); 2795 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) 2796 op0 = simplify_gen_unary (UNSIGNED_FLOAT, mode, op0, inner_mode); 2797 else 2798 op0 = simplify_gen_unary (FLOAT, mode, op0, inner_mode); 2799 } 2800 else if (FLOAT_MODE_P (inner_mode)) 2801 { 2802 if (unsignedp) 2803 op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode); 2804 else 2805 op0 = simplify_gen_unary (FIX, mode, op0, inner_mode); 2806 } 2807 else if (CONSTANT_P (op0) 2808 || GET_MODE_PRECISION (mode) <= GET_MODE_PRECISION (inner_mode)) 2809 op0 = simplify_gen_subreg (mode, op0, inner_mode, 2810 subreg_lowpart_offset (mode, 2811 inner_mode)); 2812 else if (TREE_CODE_CLASS (TREE_CODE (exp)) == tcc_unary 2813 ? TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) 2814 : unsignedp) 2815 op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); 2816 else 2817 op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); 2818 2819 return op0; 2820 } 2821 2822 case MEM_REF: 2823 if (!is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0))) 2824 { 2825 tree newexp = fold_binary (MEM_REF, TREE_TYPE (exp), 2826 TREE_OPERAND (exp, 0), 2827 TREE_OPERAND (exp, 1)); 2828 if (newexp) 2829 return expand_debug_expr (newexp); 2830 } 2831 /* FALLTHROUGH */ 2832 case INDIRECT_REF: 2833 op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); 2834 if (!op0) 2835 return NULL; 2836 2837 if (TREE_CODE (exp) == MEM_REF) 2838 { 2839 if (GET_CODE (op0) == DEBUG_IMPLICIT_PTR 2840 || (GET_CODE (op0) == PLUS 2841 && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR)) 2842 /* (mem (debug_implicit_ptr)) might confuse aliasing. 2843 Instead just use get_inner_reference. */ 2844 goto component_ref; 2845 2846 op1 = expand_debug_expr (TREE_OPERAND (exp, 1)); 2847 if (!op1 || !CONST_INT_P (op1)) 2848 return NULL; 2849 2850 op0 = plus_constant (op0, INTVAL (op1)); 2851 } 2852 2853 if (POINTER_TYPE_P (TREE_TYPE (exp))) 2854 as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp))); 2855 else 2856 as = ADDR_SPACE_GENERIC; 2857 2858 op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as), 2859 op0, as); 2860 if (op0 == NULL_RTX) 2861 return NULL; 2862 2863 op0 = gen_rtx_MEM (mode, op0); 2864 set_mem_attributes (op0, exp, 0); 2865 if (TREE_CODE (exp) == MEM_REF 2866 && !is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0))) 2867 set_mem_expr (op0, NULL_TREE); 2868 set_mem_addr_space (op0, as); 2869 2870 return op0; 2871 2872 case TARGET_MEM_REF: 2873 if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR 2874 && !DECL_RTL_SET_P (TREE_OPERAND (TMR_BASE (exp), 0))) 2875 return NULL; 2876 2877 op0 = expand_debug_expr 2878 (tree_mem_ref_addr (build_pointer_type (TREE_TYPE (exp)), exp)); 2879 if (!op0) 2880 return NULL; 2881 2882 if (POINTER_TYPE_P (TREE_TYPE (exp))) 2883 as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp))); 2884 else 2885 as = ADDR_SPACE_GENERIC; 2886 2887 op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as), 2888 op0, as); 2889 if (op0 == NULL_RTX) 2890 return NULL; 2891 2892 op0 = gen_rtx_MEM (mode, op0); 2893 2894 set_mem_attributes (op0, exp, 0); 2895 set_mem_addr_space (op0, as); 2896 2897 return op0; 2898 2899 component_ref: 2900 case ARRAY_REF: 2901 case ARRAY_RANGE_REF: 2902 case COMPONENT_REF: 2903 case BIT_FIELD_REF: 2904 case REALPART_EXPR: 2905 case IMAGPART_EXPR: 2906 case VIEW_CONVERT_EXPR: 2907 { 2908 enum machine_mode mode1; 2909 HOST_WIDE_INT bitsize, bitpos; 2910 tree offset; 2911 int volatilep = 0; 2912 tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset, 2913 &mode1, &unsignedp, &volatilep, false); 2914 rtx orig_op0; 2915 2916 if (bitsize == 0) 2917 return NULL; 2918 2919 orig_op0 = op0 = expand_debug_expr (tem); 2920 2921 if (!op0) 2922 return NULL; 2923 2924 if (offset) 2925 { 2926 enum machine_mode addrmode, offmode; 2927 2928 if (!MEM_P (op0)) 2929 return NULL; 2930 2931 op0 = XEXP (op0, 0); 2932 addrmode = GET_MODE (op0); 2933 if (addrmode == VOIDmode) 2934 addrmode = Pmode; 2935 2936 op1 = expand_debug_expr (offset); 2937 if (!op1) 2938 return NULL; 2939 2940 offmode = GET_MODE (op1); 2941 if (offmode == VOIDmode) 2942 offmode = TYPE_MODE (TREE_TYPE (offset)); 2943 2944 if (addrmode != offmode) 2945 op1 = simplify_gen_subreg (addrmode, op1, offmode, 2946 subreg_lowpart_offset (addrmode, 2947 offmode)); 2948 2949 /* Don't use offset_address here, we don't need a 2950 recognizable address, and we don't want to generate 2951 code. */ 2952 op0 = gen_rtx_MEM (mode, simplify_gen_binary (PLUS, addrmode, 2953 op0, op1)); 2954 } 2955 2956 if (MEM_P (op0)) 2957 { 2958 if (mode1 == VOIDmode) 2959 /* Bitfield. */ 2960 mode1 = smallest_mode_for_size (bitsize, MODE_INT); 2961 if (bitpos >= BITS_PER_UNIT) 2962 { 2963 op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT); 2964 bitpos %= BITS_PER_UNIT; 2965 } 2966 else if (bitpos < 0) 2967 { 2968 HOST_WIDE_INT units 2969 = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT; 2970 op0 = adjust_address_nv (op0, mode1, units); 2971 bitpos += units * BITS_PER_UNIT; 2972 } 2973 else if (bitpos == 0 && bitsize == GET_MODE_BITSIZE (mode)) 2974 op0 = adjust_address_nv (op0, mode, 0); 2975 else if (GET_MODE (op0) != mode1) 2976 op0 = adjust_address_nv (op0, mode1, 0); 2977 else 2978 op0 = copy_rtx (op0); 2979 if (op0 == orig_op0) 2980 op0 = shallow_copy_rtx (op0); 2981 set_mem_attributes (op0, exp, 0); 2982 } 2983 2984 if (bitpos == 0 && mode == GET_MODE (op0)) 2985 return op0; 2986 2987 if (bitpos < 0) 2988 return NULL; 2989 2990 if (GET_MODE (op0) == BLKmode) 2991 return NULL; 2992 2993 if ((bitpos % BITS_PER_UNIT) == 0 2994 && bitsize == GET_MODE_BITSIZE (mode1)) 2995 { 2996 enum machine_mode opmode = GET_MODE (op0); 2997 2998 if (opmode == VOIDmode) 2999 opmode = TYPE_MODE (TREE_TYPE (tem)); 3000 3001 /* This condition may hold if we're expanding the address 3002 right past the end of an array that turned out not to 3003 be addressable (i.e., the address was only computed in 3004 debug stmts). The gen_subreg below would rightfully 3005 crash, and the address doesn't really exist, so just 3006 drop it. */ 3007 if (bitpos >= GET_MODE_BITSIZE (opmode)) 3008 return NULL; 3009 3010 if ((bitpos % GET_MODE_BITSIZE (mode)) == 0) 3011 return simplify_gen_subreg (mode, op0, opmode, 3012 bitpos / BITS_PER_UNIT); 3013 } 3014 3015 return simplify_gen_ternary (SCALAR_INT_MODE_P (GET_MODE (op0)) 3016 && TYPE_UNSIGNED (TREE_TYPE (exp)) 3017 ? SIGN_EXTRACT 3018 : ZERO_EXTRACT, mode, 3019 GET_MODE (op0) != VOIDmode 3020 ? GET_MODE (op0) 3021 : TYPE_MODE (TREE_TYPE (tem)), 3022 op0, GEN_INT (bitsize), GEN_INT (bitpos)); 3023 } 3024 3025 case ABS_EXPR: 3026 return simplify_gen_unary (ABS, mode, op0, mode); 3027 3028 case NEGATE_EXPR: 3029 return simplify_gen_unary (NEG, mode, op0, mode); 3030 3031 case BIT_NOT_EXPR: 3032 return simplify_gen_unary (NOT, mode, op0, mode); 3033 3034 case FLOAT_EXPR: 3035 return simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 3036 0))) 3037 ? UNSIGNED_FLOAT : FLOAT, mode, op0, 3038 inner_mode); 3039 3040 case FIX_TRUNC_EXPR: 3041 return simplify_gen_unary (unsignedp ? UNSIGNED_FIX : FIX, mode, op0, 3042 inner_mode); 3043 3044 case POINTER_PLUS_EXPR: 3045 /* For the rare target where pointers are not the same size as 3046 size_t, we need to check for mis-matched modes and correct 3047 the addend. */ 3048 if (op0 && op1 3049 && GET_MODE (op0) != VOIDmode && GET_MODE (op1) != VOIDmode 3050 && GET_MODE (op0) != GET_MODE (op1)) 3051 { 3052 if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE (op1))) 3053 op1 = simplify_gen_unary (TRUNCATE, GET_MODE (op0), op1, 3054 GET_MODE (op1)); 3055 else 3056 /* We always sign-extend, regardless of the signedness of 3057 the operand, because the operand is always unsigned 3058 here even if the original C expression is signed. */ 3059 op1 = simplify_gen_unary (SIGN_EXTEND, GET_MODE (op0), op1, 3060 GET_MODE (op1)); 3061 } 3062 /* Fall through. */ 3063 case PLUS_EXPR: 3064 return simplify_gen_binary (PLUS, mode, op0, op1); 3065 3066 case MINUS_EXPR: 3067 return simplify_gen_binary (MINUS, mode, op0, op1); 3068 3069 case MULT_EXPR: 3070 return simplify_gen_binary (MULT, mode, op0, op1); 3071 3072 case RDIV_EXPR: 3073 case TRUNC_DIV_EXPR: 3074 case EXACT_DIV_EXPR: 3075 if (unsignedp) 3076 return simplify_gen_binary (UDIV, mode, op0, op1); 3077 else 3078 return simplify_gen_binary (DIV, mode, op0, op1); 3079 3080 case TRUNC_MOD_EXPR: 3081 return simplify_gen_binary (unsignedp ? UMOD : MOD, mode, op0, op1); 3082 3083 case FLOOR_DIV_EXPR: 3084 if (unsignedp) 3085 return simplify_gen_binary (UDIV, mode, op0, op1); 3086 else 3087 { 3088 rtx div = simplify_gen_binary (DIV, mode, op0, op1); 3089 rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 3090 rtx adj = floor_sdiv_adjust (mode, mod, op1); 3091 return simplify_gen_binary (PLUS, mode, div, adj); 3092 } 3093 3094 case FLOOR_MOD_EXPR: 3095 if (unsignedp) 3096 return simplify_gen_binary (UMOD, mode, op0, op1); 3097 else 3098 { 3099 rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 3100 rtx adj = floor_sdiv_adjust (mode, mod, op1); 3101 adj = simplify_gen_unary (NEG, mode, 3102 simplify_gen_binary (MULT, mode, adj, op1), 3103 mode); 3104 return simplify_gen_binary (PLUS, mode, mod, adj); 3105 } 3106 3107 case CEIL_DIV_EXPR: 3108 if (unsignedp) 3109 { 3110 rtx div = simplify_gen_binary (UDIV, mode, op0, op1); 3111 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 3112 rtx adj = ceil_udiv_adjust (mode, mod, op1); 3113 return simplify_gen_binary (PLUS, mode, div, adj); 3114 } 3115 else 3116 { 3117 rtx div = simplify_gen_binary (DIV, mode, op0, op1); 3118 rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 3119 rtx adj = ceil_sdiv_adjust (mode, mod, op1); 3120 return simplify_gen_binary (PLUS, mode, div, adj); 3121 } 3122 3123 case CEIL_MOD_EXPR: 3124 if (unsignedp) 3125 { 3126 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 3127 rtx adj = ceil_udiv_adjust (mode, mod, op1); 3128 adj = simplify_gen_unary (NEG, mode, 3129 simplify_gen_binary (MULT, mode, adj, op1), 3130 mode); 3131 return simplify_gen_binary (PLUS, mode, mod, adj); 3132 } 3133 else 3134 { 3135 rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 3136 rtx adj = ceil_sdiv_adjust (mode, mod, op1); 3137 adj = simplify_gen_unary (NEG, mode, 3138 simplify_gen_binary (MULT, mode, adj, op1), 3139 mode); 3140 return simplify_gen_binary (PLUS, mode, mod, adj); 3141 } 3142 3143 case ROUND_DIV_EXPR: 3144 if (unsignedp) 3145 { 3146 rtx div = simplify_gen_binary (UDIV, mode, op0, op1); 3147 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 3148 rtx adj = round_udiv_adjust (mode, mod, op1); 3149 return simplify_gen_binary (PLUS, mode, div, adj); 3150 } 3151 else 3152 { 3153 rtx div = simplify_gen_binary (DIV, mode, op0, op1); 3154 rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 3155 rtx adj = round_sdiv_adjust (mode, mod, op1); 3156 return simplify_gen_binary (PLUS, mode, div, adj); 3157 } 3158 3159 case ROUND_MOD_EXPR: 3160 if (unsignedp) 3161 { 3162 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 3163 rtx adj = round_udiv_adjust (mode, mod, op1); 3164 adj = simplify_gen_unary (NEG, mode, 3165 simplify_gen_binary (MULT, mode, adj, op1), 3166 mode); 3167 return simplify_gen_binary (PLUS, mode, mod, adj); 3168 } 3169 else 3170 { 3171 rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 3172 rtx adj = round_sdiv_adjust (mode, mod, op1); 3173 adj = simplify_gen_unary (NEG, mode, 3174 simplify_gen_binary (MULT, mode, adj, op1), 3175 mode); 3176 return simplify_gen_binary (PLUS, mode, mod, adj); 3177 } 3178 3179 case LSHIFT_EXPR: 3180 return simplify_gen_binary (ASHIFT, mode, op0, op1); 3181 3182 case RSHIFT_EXPR: 3183 if (unsignedp) 3184 return simplify_gen_binary (LSHIFTRT, mode, op0, op1); 3185 else 3186 return simplify_gen_binary (ASHIFTRT, mode, op0, op1); 3187 3188 case LROTATE_EXPR: 3189 return simplify_gen_binary (ROTATE, mode, op0, op1); 3190 3191 case RROTATE_EXPR: 3192 return simplify_gen_binary (ROTATERT, mode, op0, op1); 3193 3194 case MIN_EXPR: 3195 return simplify_gen_binary (unsignedp ? UMIN : SMIN, mode, op0, op1); 3196 3197 case MAX_EXPR: 3198 return simplify_gen_binary (unsignedp ? UMAX : SMAX, mode, op0, op1); 3199 3200 case BIT_AND_EXPR: 3201 case TRUTH_AND_EXPR: 3202 return simplify_gen_binary (AND, mode, op0, op1); 3203 3204 case BIT_IOR_EXPR: 3205 case TRUTH_OR_EXPR: 3206 return simplify_gen_binary (IOR, mode, op0, op1); 3207 3208 case BIT_XOR_EXPR: 3209 case TRUTH_XOR_EXPR: 3210 return simplify_gen_binary (XOR, mode, op0, op1); 3211 3212 case TRUTH_ANDIF_EXPR: 3213 return gen_rtx_IF_THEN_ELSE (mode, op0, op1, const0_rtx); 3214 3215 case TRUTH_ORIF_EXPR: 3216 return gen_rtx_IF_THEN_ELSE (mode, op0, const_true_rtx, op1); 3217 3218 case TRUTH_NOT_EXPR: 3219 return simplify_gen_relational (EQ, mode, inner_mode, op0, const0_rtx); 3220 3221 case LT_EXPR: 3222 return simplify_gen_relational (unsignedp ? LTU : LT, mode, inner_mode, 3223 op0, op1); 3224 3225 case LE_EXPR: 3226 return simplify_gen_relational (unsignedp ? LEU : LE, mode, inner_mode, 3227 op0, op1); 3228 3229 case GT_EXPR: 3230 return simplify_gen_relational (unsignedp ? GTU : GT, mode, inner_mode, 3231 op0, op1); 3232 3233 case GE_EXPR: 3234 return simplify_gen_relational (unsignedp ? GEU : GE, mode, inner_mode, 3235 op0, op1); 3236 3237 case EQ_EXPR: 3238 return simplify_gen_relational (EQ, mode, inner_mode, op0, op1); 3239 3240 case NE_EXPR: 3241 return simplify_gen_relational (NE, mode, inner_mode, op0, op1); 3242 3243 case UNORDERED_EXPR: 3244 return simplify_gen_relational (UNORDERED, mode, inner_mode, op0, op1); 3245 3246 case ORDERED_EXPR: 3247 return simplify_gen_relational (ORDERED, mode, inner_mode, op0, op1); 3248 3249 case UNLT_EXPR: 3250 return simplify_gen_relational (UNLT, mode, inner_mode, op0, op1); 3251 3252 case UNLE_EXPR: 3253 return simplify_gen_relational (UNLE, mode, inner_mode, op0, op1); 3254 3255 case UNGT_EXPR: 3256 return simplify_gen_relational (UNGT, mode, inner_mode, op0, op1); 3257 3258 case UNGE_EXPR: 3259 return simplify_gen_relational (UNGE, mode, inner_mode, op0, op1); 3260 3261 case UNEQ_EXPR: 3262 return simplify_gen_relational (UNEQ, mode, inner_mode, op0, op1); 3263 3264 case LTGT_EXPR: 3265 return simplify_gen_relational (LTGT, mode, inner_mode, op0, op1); 3266 3267 case COND_EXPR: 3268 return gen_rtx_IF_THEN_ELSE (mode, op0, op1, op2); 3269 3270 case COMPLEX_EXPR: 3271 gcc_assert (COMPLEX_MODE_P (mode)); 3272 if (GET_MODE (op0) == VOIDmode) 3273 op0 = gen_rtx_CONST (GET_MODE_INNER (mode), op0); 3274 if (GET_MODE (op1) == VOIDmode) 3275 op1 = gen_rtx_CONST (GET_MODE_INNER (mode), op1); 3276 return gen_rtx_CONCAT (mode, op0, op1); 3277 3278 case CONJ_EXPR: 3279 if (GET_CODE (op0) == CONCAT) 3280 return gen_rtx_CONCAT (mode, XEXP (op0, 0), 3281 simplify_gen_unary (NEG, GET_MODE_INNER (mode), 3282 XEXP (op0, 1), 3283 GET_MODE_INNER (mode))); 3284 else 3285 { 3286 enum machine_mode imode = GET_MODE_INNER (mode); 3287 rtx re, im; 3288 3289 if (MEM_P (op0)) 3290 { 3291 re = adjust_address_nv (op0, imode, 0); 3292 im = adjust_address_nv (op0, imode, GET_MODE_SIZE (imode)); 3293 } 3294 else 3295 { 3296 enum machine_mode ifmode = int_mode_for_mode (mode); 3297 enum machine_mode ihmode = int_mode_for_mode (imode); 3298 rtx halfsize; 3299 if (ifmode == BLKmode || ihmode == BLKmode) 3300 return NULL; 3301 halfsize = GEN_INT (GET_MODE_BITSIZE (ihmode)); 3302 re = op0; 3303 if (mode != ifmode) 3304 re = gen_rtx_SUBREG (ifmode, re, 0); 3305 re = gen_rtx_ZERO_EXTRACT (ihmode, re, halfsize, const0_rtx); 3306 if (imode != ihmode) 3307 re = gen_rtx_SUBREG (imode, re, 0); 3308 im = copy_rtx (op0); 3309 if (mode != ifmode) 3310 im = gen_rtx_SUBREG (ifmode, im, 0); 3311 im = gen_rtx_ZERO_EXTRACT (ihmode, im, halfsize, halfsize); 3312 if (imode != ihmode) 3313 im = gen_rtx_SUBREG (imode, im, 0); 3314 } 3315 im = gen_rtx_NEG (imode, im); 3316 return gen_rtx_CONCAT (mode, re, im); 3317 } 3318 3319 case ADDR_EXPR: 3320 op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); 3321 if (!op0 || !MEM_P (op0)) 3322 { 3323 if ((TREE_CODE (TREE_OPERAND (exp, 0)) == VAR_DECL 3324 || TREE_CODE (TREE_OPERAND (exp, 0)) == PARM_DECL 3325 || TREE_CODE (TREE_OPERAND (exp, 0)) == RESULT_DECL) 3326 && (!TREE_ADDRESSABLE (TREE_OPERAND (exp, 0)) 3327 || target_for_debug_bind (TREE_OPERAND (exp, 0)))) 3328 return gen_rtx_DEBUG_IMPLICIT_PTR (mode, TREE_OPERAND (exp, 0)); 3329 3330 if (handled_component_p (TREE_OPERAND (exp, 0))) 3331 { 3332 HOST_WIDE_INT bitoffset, bitsize, maxsize; 3333 tree decl 3334 = get_ref_base_and_extent (TREE_OPERAND (exp, 0), 3335 &bitoffset, &bitsize, &maxsize); 3336 if ((TREE_CODE (decl) == VAR_DECL 3337 || TREE_CODE (decl) == PARM_DECL 3338 || TREE_CODE (decl) == RESULT_DECL) 3339 && (!TREE_ADDRESSABLE (decl) 3340 || target_for_debug_bind (decl)) 3341 && (bitoffset % BITS_PER_UNIT) == 0 3342 && bitsize > 0 3343 && bitsize == maxsize) 3344 return plus_constant (gen_rtx_DEBUG_IMPLICIT_PTR (mode, decl), 3345 bitoffset / BITS_PER_UNIT); 3346 } 3347 3348 return NULL; 3349 } 3350 3351 as = TYPE_ADDR_SPACE (TREE_TYPE (exp)); 3352 op0 = convert_debug_memory_address (mode, XEXP (op0, 0), as); 3353 3354 return op0; 3355 3356 case VECTOR_CST: 3357 exp = build_constructor_from_list (TREE_TYPE (exp), 3358 TREE_VECTOR_CST_ELTS (exp)); 3359 /* Fall through. */ 3360 3361 case CONSTRUCTOR: 3362 if (TREE_CLOBBER_P (exp)) 3363 return NULL; 3364 else if (TREE_CODE (TREE_TYPE (exp)) == VECTOR_TYPE) 3365 { 3366 unsigned i; 3367 tree val; 3368 3369 op0 = gen_rtx_CONCATN 3370 (mode, rtvec_alloc (TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)))); 3371 3372 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), i, val) 3373 { 3374 op1 = expand_debug_expr (val); 3375 if (!op1) 3376 return NULL; 3377 XVECEXP (op0, 0, i) = op1; 3378 } 3379 3380 if (i < TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp))) 3381 { 3382 op1 = expand_debug_expr 3383 (build_zero_cst (TREE_TYPE (TREE_TYPE (exp)))); 3384 3385 if (!op1) 3386 return NULL; 3387 3388 for (; i < TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)); i++) 3389 XVECEXP (op0, 0, i) = op1; 3390 } 3391 3392 return op0; 3393 } 3394 else 3395 goto flag_unsupported; 3396 3397 case CALL_EXPR: 3398 /* ??? Maybe handle some builtins? */ 3399 return NULL; 3400 3401 case SSA_NAME: 3402 { 3403 gimple g = get_gimple_for_ssa_name (exp); 3404 if (g) 3405 { 3406 op0 = expand_debug_expr (gimple_assign_rhs_to_tree (g)); 3407 if (!op0) 3408 return NULL; 3409 } 3410 else 3411 { 3412 int part = var_to_partition (SA.map, exp); 3413 3414 if (part == NO_PARTITION) 3415 { 3416 /* If this is a reference to an incoming value of parameter 3417 that is never used in the code or where the incoming 3418 value is never used in the code, use PARM_DECL's 3419 DECL_RTL if set. */ 3420 if (SSA_NAME_IS_DEFAULT_DEF (exp) 3421 && TREE_CODE (SSA_NAME_VAR (exp)) == PARM_DECL) 3422 { 3423 op0 = expand_debug_parm_decl (SSA_NAME_VAR (exp)); 3424 if (op0) 3425 goto adjust_mode; 3426 op0 = expand_debug_expr (SSA_NAME_VAR (exp)); 3427 if (op0) 3428 goto adjust_mode; 3429 } 3430 return NULL; 3431 } 3432 3433 gcc_assert (part >= 0 && (unsigned)part < SA.map->num_partitions); 3434 3435 op0 = copy_rtx (SA.partition_to_pseudo[part]); 3436 } 3437 goto adjust_mode; 3438 } 3439 3440 case ERROR_MARK: 3441 return NULL; 3442 3443 /* Vector stuff. For most of the codes we don't have rtl codes. */ 3444 case REALIGN_LOAD_EXPR: 3445 case REDUC_MAX_EXPR: 3446 case REDUC_MIN_EXPR: 3447 case REDUC_PLUS_EXPR: 3448 case VEC_COND_EXPR: 3449 case VEC_LSHIFT_EXPR: 3450 case VEC_PACK_FIX_TRUNC_EXPR: 3451 case VEC_PACK_SAT_EXPR: 3452 case VEC_PACK_TRUNC_EXPR: 3453 case VEC_RSHIFT_EXPR: 3454 case VEC_UNPACK_FLOAT_HI_EXPR: 3455 case VEC_UNPACK_FLOAT_LO_EXPR: 3456 case VEC_UNPACK_HI_EXPR: 3457 case VEC_UNPACK_LO_EXPR: 3458 case VEC_WIDEN_MULT_HI_EXPR: 3459 case VEC_WIDEN_MULT_LO_EXPR: 3460 case VEC_WIDEN_LSHIFT_HI_EXPR: 3461 case VEC_WIDEN_LSHIFT_LO_EXPR: 3462 case VEC_PERM_EXPR: 3463 return NULL; 3464 3465 /* Misc codes. */ 3466 case ADDR_SPACE_CONVERT_EXPR: 3467 case FIXED_CONVERT_EXPR: 3468 case OBJ_TYPE_REF: 3469 case WITH_SIZE_EXPR: 3470 return NULL; 3471 3472 case DOT_PROD_EXPR: 3473 if (SCALAR_INT_MODE_P (GET_MODE (op0)) 3474 && SCALAR_INT_MODE_P (mode)) 3475 { 3476 op0 3477 = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 3478 0))) 3479 ? ZERO_EXTEND : SIGN_EXTEND, mode, op0, 3480 inner_mode); 3481 op1 3482 = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 3483 1))) 3484 ? ZERO_EXTEND : SIGN_EXTEND, mode, op1, 3485 inner_mode); 3486 op0 = simplify_gen_binary (MULT, mode, op0, op1); 3487 return simplify_gen_binary (PLUS, mode, op0, op2); 3488 } 3489 return NULL; 3490 3491 case WIDEN_MULT_EXPR: 3492 case WIDEN_MULT_PLUS_EXPR: 3493 case WIDEN_MULT_MINUS_EXPR: 3494 if (SCALAR_INT_MODE_P (GET_MODE (op0)) 3495 && SCALAR_INT_MODE_P (mode)) 3496 { 3497 inner_mode = GET_MODE (op0); 3498 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) 3499 op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); 3500 else 3501 op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); 3502 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1)))) 3503 op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode); 3504 else 3505 op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode); 3506 op0 = simplify_gen_binary (MULT, mode, op0, op1); 3507 if (TREE_CODE (exp) == WIDEN_MULT_EXPR) 3508 return op0; 3509 else if (TREE_CODE (exp) == WIDEN_MULT_PLUS_EXPR) 3510 return simplify_gen_binary (PLUS, mode, op0, op2); 3511 else 3512 return simplify_gen_binary (MINUS, mode, op2, op0); 3513 } 3514 return NULL; 3515 3516 case WIDEN_SUM_EXPR: 3517 case WIDEN_LSHIFT_EXPR: 3518 if (SCALAR_INT_MODE_P (GET_MODE (op0)) 3519 && SCALAR_INT_MODE_P (mode)) 3520 { 3521 op0 3522 = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 3523 0))) 3524 ? ZERO_EXTEND : SIGN_EXTEND, mode, op0, 3525 inner_mode); 3526 return simplify_gen_binary (TREE_CODE (exp) == WIDEN_LSHIFT_EXPR 3527 ? ASHIFT : PLUS, mode, op0, op1); 3528 } 3529 return NULL; 3530 3531 case FMA_EXPR: 3532 return simplify_gen_ternary (FMA, mode, inner_mode, op0, op1, op2); 3533 3534 default: 3535 flag_unsupported: 3536 #ifdef ENABLE_CHECKING 3537 debug_tree (exp); 3538 gcc_unreachable (); 3539 #else 3540 return NULL; 3541 #endif 3542 } 3543 } 3544 3545 /* Return an RTX equivalent to the source bind value of the tree expression 3546 EXP. */ 3547 3548 static rtx 3549 expand_debug_source_expr (tree exp) 3550 { 3551 rtx op0 = NULL_RTX; 3552 enum machine_mode mode = VOIDmode, inner_mode; 3553 3554 switch (TREE_CODE (exp)) 3555 { 3556 case PARM_DECL: 3557 { 3558 mode = DECL_MODE (exp); 3559 op0 = expand_debug_parm_decl (exp); 3560 if (op0) 3561 break; 3562 /* See if this isn't an argument that has been completely 3563 optimized out. */ 3564 if (!DECL_RTL_SET_P (exp) 3565 && !DECL_INCOMING_RTL (exp) 3566 && DECL_ABSTRACT_ORIGIN (current_function_decl)) 3567 { 3568 tree aexp = exp; 3569 if (DECL_ABSTRACT_ORIGIN (exp)) 3570 aexp = DECL_ABSTRACT_ORIGIN (exp); 3571 if (DECL_CONTEXT (aexp) 3572 == DECL_ABSTRACT_ORIGIN (current_function_decl)) 3573 { 3574 VEC(tree, gc) **debug_args; 3575 unsigned int ix; 3576 tree ddecl; 3577 #ifdef ENABLE_CHECKING 3578 tree parm; 3579 for (parm = DECL_ARGUMENTS (current_function_decl); 3580 parm; parm = DECL_CHAIN (parm)) 3581 gcc_assert (parm != exp 3582 && DECL_ABSTRACT_ORIGIN (parm) != aexp); 3583 #endif 3584 debug_args = decl_debug_args_lookup (current_function_decl); 3585 if (debug_args != NULL) 3586 { 3587 for (ix = 0; VEC_iterate (tree, *debug_args, ix, ddecl); 3588 ix += 2) 3589 if (ddecl == aexp) 3590 return gen_rtx_DEBUG_PARAMETER_REF (mode, aexp); 3591 } 3592 } 3593 } 3594 break; 3595 } 3596 default: 3597 break; 3598 } 3599 3600 if (op0 == NULL_RTX) 3601 return NULL_RTX; 3602 3603 inner_mode = GET_MODE (op0); 3604 if (mode == inner_mode) 3605 return op0; 3606 3607 if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode)) 3608 { 3609 if (GET_MODE_BITSIZE (mode) == GET_MODE_BITSIZE (inner_mode)) 3610 op0 = simplify_gen_subreg (mode, op0, inner_mode, 0); 3611 else if (GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (inner_mode)) 3612 op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode); 3613 else 3614 op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode); 3615 } 3616 else if (FLOAT_MODE_P (mode)) 3617 gcc_unreachable (); 3618 else if (FLOAT_MODE_P (inner_mode)) 3619 { 3620 if (TYPE_UNSIGNED (TREE_TYPE (exp))) 3621 op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode); 3622 else 3623 op0 = simplify_gen_unary (FIX, mode, op0, inner_mode); 3624 } 3625 else if (CONSTANT_P (op0) 3626 || GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (inner_mode)) 3627 op0 = simplify_gen_subreg (mode, op0, inner_mode, 3628 subreg_lowpart_offset (mode, inner_mode)); 3629 else if (TYPE_UNSIGNED (TREE_TYPE (exp))) 3630 op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); 3631 else 3632 op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); 3633 3634 return op0; 3635 } 3636 3637 /* Expand the _LOCs in debug insns. We run this after expanding all 3638 regular insns, so that any variables referenced in the function 3639 will have their DECL_RTLs set. */ 3640 3641 static void 3642 expand_debug_locations (void) 3643 { 3644 rtx insn; 3645 rtx last = get_last_insn (); 3646 int save_strict_alias = flag_strict_aliasing; 3647 3648 /* New alias sets while setting up memory attributes cause 3649 -fcompare-debug failures, even though it doesn't bring about any 3650 codegen changes. */ 3651 flag_strict_aliasing = 0; 3652 3653 for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) 3654 if (DEBUG_INSN_P (insn)) 3655 { 3656 tree value = (tree)INSN_VAR_LOCATION_LOC (insn); 3657 rtx val; 3658 enum machine_mode mode; 3659 3660 if (value == NULL_TREE) 3661 val = NULL_RTX; 3662 else 3663 { 3664 if (INSN_VAR_LOCATION_STATUS (insn) 3665 == VAR_INIT_STATUS_UNINITIALIZED) 3666 val = expand_debug_source_expr (value); 3667 else 3668 val = expand_debug_expr (value); 3669 gcc_assert (last == get_last_insn ()); 3670 } 3671 3672 if (!val) 3673 val = gen_rtx_UNKNOWN_VAR_LOC (); 3674 else 3675 { 3676 mode = GET_MODE (INSN_VAR_LOCATION (insn)); 3677 3678 gcc_assert (mode == GET_MODE (val) 3679 || (GET_MODE (val) == VOIDmode 3680 && (CONST_INT_P (val) 3681 || GET_CODE (val) == CONST_FIXED 3682 || GET_CODE (val) == CONST_DOUBLE 3683 || GET_CODE (val) == LABEL_REF))); 3684 } 3685 3686 INSN_VAR_LOCATION_LOC (insn) = val; 3687 } 3688 3689 flag_strict_aliasing = save_strict_alias; 3690 } 3691 3692 /* Expand basic block BB from GIMPLE trees to RTL. */ 3693 3694 static basic_block 3695 expand_gimple_basic_block (basic_block bb) 3696 { 3697 gimple_stmt_iterator gsi; 3698 gimple_seq stmts; 3699 gimple stmt = NULL; 3700 rtx note, last; 3701 edge e; 3702 edge_iterator ei; 3703 void **elt; 3704 3705 if (dump_file) 3706 fprintf (dump_file, "\n;; Generating RTL for gimple basic block %d\n", 3707 bb->index); 3708 3709 /* Note that since we are now transitioning from GIMPLE to RTL, we 3710 cannot use the gsi_*_bb() routines because they expect the basic 3711 block to be in GIMPLE, instead of RTL. Therefore, we need to 3712 access the BB sequence directly. */ 3713 stmts = bb_seq (bb); 3714 bb->il.gimple = NULL; 3715 rtl_profile_for_bb (bb); 3716 init_rtl_bb_info (bb); 3717 bb->flags |= BB_RTL; 3718 3719 /* Remove the RETURN_EXPR if we may fall though to the exit 3720 instead. */ 3721 gsi = gsi_last (stmts); 3722 if (!gsi_end_p (gsi) 3723 && gimple_code (gsi_stmt (gsi)) == GIMPLE_RETURN) 3724 { 3725 gimple ret_stmt = gsi_stmt (gsi); 3726 3727 gcc_assert (single_succ_p (bb)); 3728 gcc_assert (single_succ (bb) == EXIT_BLOCK_PTR); 3729 3730 if (bb->next_bb == EXIT_BLOCK_PTR 3731 && !gimple_return_retval (ret_stmt)) 3732 { 3733 gsi_remove (&gsi, false); 3734 single_succ_edge (bb)->flags |= EDGE_FALLTHRU; 3735 } 3736 } 3737 3738 gsi = gsi_start (stmts); 3739 if (!gsi_end_p (gsi)) 3740 { 3741 stmt = gsi_stmt (gsi); 3742 if (gimple_code (stmt) != GIMPLE_LABEL) 3743 stmt = NULL; 3744 } 3745 3746 elt = pointer_map_contains (lab_rtx_for_bb, bb); 3747 3748 if (stmt || elt) 3749 { 3750 last = get_last_insn (); 3751 3752 if (stmt) 3753 { 3754 expand_gimple_stmt (stmt); 3755 gsi_next (&gsi); 3756 } 3757 3758 if (elt) 3759 emit_label ((rtx) *elt); 3760 3761 /* Java emits line number notes in the top of labels. 3762 ??? Make this go away once line number notes are obsoleted. */ 3763 BB_HEAD (bb) = NEXT_INSN (last); 3764 if (NOTE_P (BB_HEAD (bb))) 3765 BB_HEAD (bb) = NEXT_INSN (BB_HEAD (bb)); 3766 note = emit_note_after (NOTE_INSN_BASIC_BLOCK, BB_HEAD (bb)); 3767 3768 maybe_dump_rtl_for_gimple_stmt (stmt, last); 3769 } 3770 else 3771 note = BB_HEAD (bb) = emit_note (NOTE_INSN_BASIC_BLOCK); 3772 3773 NOTE_BASIC_BLOCK (note) = bb; 3774 3775 for (; !gsi_end_p (gsi); gsi_next (&gsi)) 3776 { 3777 basic_block new_bb; 3778 3779 stmt = gsi_stmt (gsi); 3780 3781 /* If this statement is a non-debug one, and we generate debug 3782 insns, then this one might be the last real use of a TERed 3783 SSA_NAME, but where there are still some debug uses further 3784 down. Expanding the current SSA name in such further debug 3785 uses by their RHS might lead to wrong debug info, as coalescing 3786 might make the operands of such RHS be placed into the same 3787 pseudo as something else. Like so: 3788 a_1 = a_0 + 1; // Assume a_1 is TERed and a_0 is dead 3789 use(a_1); 3790 a_2 = ... 3791 #DEBUG ... => a_1 3792 As a_0 and a_2 don't overlap in lifetime, assume they are coalesced. 3793 If we now would expand a_1 by it's RHS (a_0 + 1) in the debug use, 3794 the write to a_2 would actually have clobbered the place which 3795 formerly held a_0. 3796 3797 So, instead of that, we recognize the situation, and generate 3798 debug temporaries at the last real use of TERed SSA names: 3799 a_1 = a_0 + 1; 3800 #DEBUG #D1 => a_1 3801 use(a_1); 3802 a_2 = ... 3803 #DEBUG ... => #D1 3804 */ 3805 if (MAY_HAVE_DEBUG_INSNS 3806 && SA.values 3807 && !is_gimple_debug (stmt)) 3808 { 3809 ssa_op_iter iter; 3810 tree op; 3811 gimple def; 3812 3813 location_t sloc = get_curr_insn_source_location (); 3814 tree sblock = get_curr_insn_block (); 3815 3816 /* Look for SSA names that have their last use here (TERed 3817 names always have only one real use). */ 3818 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE) 3819 if ((def = get_gimple_for_ssa_name (op))) 3820 { 3821 imm_use_iterator imm_iter; 3822 use_operand_p use_p; 3823 bool have_debug_uses = false; 3824 3825 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op) 3826 { 3827 if (gimple_debug_bind_p (USE_STMT (use_p))) 3828 { 3829 have_debug_uses = true; 3830 break; 3831 } 3832 } 3833 3834 if (have_debug_uses) 3835 { 3836 /* OP is a TERed SSA name, with DEF it's defining 3837 statement, and where OP is used in further debug 3838 instructions. Generate a debug temporary, and 3839 replace all uses of OP in debug insns with that 3840 temporary. */ 3841 gimple debugstmt; 3842 tree value = gimple_assign_rhs_to_tree (def); 3843 tree vexpr = make_node (DEBUG_EXPR_DECL); 3844 rtx val; 3845 enum machine_mode mode; 3846 3847 set_curr_insn_source_location (gimple_location (def)); 3848 set_curr_insn_block (gimple_block (def)); 3849 3850 DECL_ARTIFICIAL (vexpr) = 1; 3851 TREE_TYPE (vexpr) = TREE_TYPE (value); 3852 if (DECL_P (value)) 3853 mode = DECL_MODE (value); 3854 else 3855 mode = TYPE_MODE (TREE_TYPE (value)); 3856 DECL_MODE (vexpr) = mode; 3857 3858 val = gen_rtx_VAR_LOCATION 3859 (mode, vexpr, (rtx)value, VAR_INIT_STATUS_INITIALIZED); 3860 3861 emit_debug_insn (val); 3862 3863 FOR_EACH_IMM_USE_STMT (debugstmt, imm_iter, op) 3864 { 3865 if (!gimple_debug_bind_p (debugstmt)) 3866 continue; 3867 3868 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) 3869 SET_USE (use_p, vexpr); 3870 3871 update_stmt (debugstmt); 3872 } 3873 } 3874 } 3875 set_curr_insn_source_location (sloc); 3876 set_curr_insn_block (sblock); 3877 } 3878 3879 currently_expanding_gimple_stmt = stmt; 3880 3881 /* Expand this statement, then evaluate the resulting RTL and 3882 fixup the CFG accordingly. */ 3883 if (gimple_code (stmt) == GIMPLE_COND) 3884 { 3885 new_bb = expand_gimple_cond (bb, stmt); 3886 if (new_bb) 3887 return new_bb; 3888 } 3889 else if (gimple_debug_bind_p (stmt)) 3890 { 3891 location_t sloc = get_curr_insn_source_location (); 3892 tree sblock = get_curr_insn_block (); 3893 gimple_stmt_iterator nsi = gsi; 3894 3895 for (;;) 3896 { 3897 tree var = gimple_debug_bind_get_var (stmt); 3898 tree value; 3899 rtx val; 3900 enum machine_mode mode; 3901 3902 if (TREE_CODE (var) != DEBUG_EXPR_DECL 3903 && TREE_CODE (var) != LABEL_DECL 3904 && !target_for_debug_bind (var)) 3905 goto delink_debug_stmt; 3906 3907 if (gimple_debug_bind_has_value_p (stmt)) 3908 value = gimple_debug_bind_get_value (stmt); 3909 else 3910 value = NULL_TREE; 3911 3912 last = get_last_insn (); 3913 3914 set_curr_insn_source_location (gimple_location (stmt)); 3915 set_curr_insn_block (gimple_block (stmt)); 3916 3917 if (DECL_P (var)) 3918 mode = DECL_MODE (var); 3919 else 3920 mode = TYPE_MODE (TREE_TYPE (var)); 3921 3922 val = gen_rtx_VAR_LOCATION 3923 (mode, var, (rtx)value, VAR_INIT_STATUS_INITIALIZED); 3924 3925 emit_debug_insn (val); 3926 3927 if (dump_file && (dump_flags & TDF_DETAILS)) 3928 { 3929 /* We can't dump the insn with a TREE where an RTX 3930 is expected. */ 3931 PAT_VAR_LOCATION_LOC (val) = const0_rtx; 3932 maybe_dump_rtl_for_gimple_stmt (stmt, last); 3933 PAT_VAR_LOCATION_LOC (val) = (rtx)value; 3934 } 3935 3936 delink_debug_stmt: 3937 /* In order not to generate too many debug temporaries, 3938 we delink all uses of debug statements we already expanded. 3939 Therefore debug statements between definition and real 3940 use of TERed SSA names will continue to use the SSA name, 3941 and not be replaced with debug temps. */ 3942 delink_stmt_imm_use (stmt); 3943 3944 gsi = nsi; 3945 gsi_next (&nsi); 3946 if (gsi_end_p (nsi)) 3947 break; 3948 stmt = gsi_stmt (nsi); 3949 if (!gimple_debug_bind_p (stmt)) 3950 break; 3951 } 3952 3953 set_curr_insn_source_location (sloc); 3954 set_curr_insn_block (sblock); 3955 } 3956 else if (gimple_debug_source_bind_p (stmt)) 3957 { 3958 location_t sloc = get_curr_insn_source_location (); 3959 tree sblock = get_curr_insn_block (); 3960 tree var = gimple_debug_source_bind_get_var (stmt); 3961 tree value = gimple_debug_source_bind_get_value (stmt); 3962 rtx val; 3963 enum machine_mode mode; 3964 3965 last = get_last_insn (); 3966 3967 set_curr_insn_source_location (gimple_location (stmt)); 3968 set_curr_insn_block (gimple_block (stmt)); 3969 3970 mode = DECL_MODE (var); 3971 3972 val = gen_rtx_VAR_LOCATION (mode, var, (rtx)value, 3973 VAR_INIT_STATUS_UNINITIALIZED); 3974 3975 emit_debug_insn (val); 3976 3977 if (dump_file && (dump_flags & TDF_DETAILS)) 3978 { 3979 /* We can't dump the insn with a TREE where an RTX 3980 is expected. */ 3981 PAT_VAR_LOCATION_LOC (val) = const0_rtx; 3982 maybe_dump_rtl_for_gimple_stmt (stmt, last); 3983 PAT_VAR_LOCATION_LOC (val) = (rtx)value; 3984 } 3985 3986 set_curr_insn_source_location (sloc); 3987 set_curr_insn_block (sblock); 3988 } 3989 else 3990 { 3991 if (is_gimple_call (stmt) && gimple_call_tail_p (stmt)) 3992 { 3993 bool can_fallthru; 3994 new_bb = expand_gimple_tailcall (bb, stmt, &can_fallthru); 3995 if (new_bb) 3996 { 3997 if (can_fallthru) 3998 bb = new_bb; 3999 else 4000 return new_bb; 4001 } 4002 } 4003 else 4004 { 4005 def_operand_p def_p; 4006 def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF); 4007 4008 if (def_p != NULL) 4009 { 4010 /* Ignore this stmt if it is in the list of 4011 replaceable expressions. */ 4012 if (SA.values 4013 && bitmap_bit_p (SA.values, 4014 SSA_NAME_VERSION (DEF_FROM_PTR (def_p)))) 4015 continue; 4016 } 4017 last = expand_gimple_stmt (stmt); 4018 maybe_dump_rtl_for_gimple_stmt (stmt, last); 4019 } 4020 } 4021 } 4022 4023 currently_expanding_gimple_stmt = NULL; 4024 4025 /* Expand implicit goto and convert goto_locus. */ 4026 FOR_EACH_EDGE (e, ei, bb->succs) 4027 { 4028 if (e->goto_locus && e->goto_block) 4029 { 4030 set_curr_insn_source_location (e->goto_locus); 4031 set_curr_insn_block (e->goto_block); 4032 e->goto_locus = curr_insn_locator (); 4033 } 4034 e->goto_block = NULL; 4035 if ((e->flags & EDGE_FALLTHRU) && e->dest != bb->next_bb) 4036 { 4037 emit_jump (label_rtx_for_bb (e->dest)); 4038 e->flags &= ~EDGE_FALLTHRU; 4039 } 4040 } 4041 4042 /* Expanded RTL can create a jump in the last instruction of block. 4043 This later might be assumed to be a jump to successor and break edge insertion. 4044 We need to insert dummy move to prevent this. PR41440. */ 4045 if (single_succ_p (bb) 4046 && (single_succ_edge (bb)->flags & EDGE_FALLTHRU) 4047 && (last = get_last_insn ()) 4048 && JUMP_P (last)) 4049 { 4050 rtx dummy = gen_reg_rtx (SImode); 4051 emit_insn_after_noloc (gen_move_insn (dummy, dummy), last, NULL); 4052 } 4053 4054 do_pending_stack_adjust (); 4055 4056 /* Find the block tail. The last insn in the block is the insn 4057 before a barrier and/or table jump insn. */ 4058 last = get_last_insn (); 4059 if (BARRIER_P (last)) 4060 last = PREV_INSN (last); 4061 if (JUMP_TABLE_DATA_P (last)) 4062 last = PREV_INSN (PREV_INSN (last)); 4063 BB_END (bb) = last; 4064 4065 update_bb_for_insn (bb); 4066 4067 return bb; 4068 } 4069 4070 4071 /* Create a basic block for initialization code. */ 4072 4073 static basic_block 4074 construct_init_block (void) 4075 { 4076 basic_block init_block, first_block; 4077 edge e = NULL; 4078 int flags; 4079 4080 /* Multiple entry points not supported yet. */ 4081 gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR->succs) == 1); 4082 init_rtl_bb_info (ENTRY_BLOCK_PTR); 4083 init_rtl_bb_info (EXIT_BLOCK_PTR); 4084 ENTRY_BLOCK_PTR->flags |= BB_RTL; 4085 EXIT_BLOCK_PTR->flags |= BB_RTL; 4086 4087 e = EDGE_SUCC (ENTRY_BLOCK_PTR, 0); 4088 4089 /* When entry edge points to first basic block, we don't need jump, 4090 otherwise we have to jump into proper target. */ 4091 if (e && e->dest != ENTRY_BLOCK_PTR->next_bb) 4092 { 4093 tree label = gimple_block_label (e->dest); 4094 4095 emit_jump (label_rtx (label)); 4096 flags = 0; 4097 } 4098 else 4099 flags = EDGE_FALLTHRU; 4100 4101 init_block = create_basic_block (NEXT_INSN (get_insns ()), 4102 get_last_insn (), 4103 ENTRY_BLOCK_PTR); 4104 init_block->frequency = ENTRY_BLOCK_PTR->frequency; 4105 init_block->count = ENTRY_BLOCK_PTR->count; 4106 if (e) 4107 { 4108 first_block = e->dest; 4109 redirect_edge_succ (e, init_block); 4110 e = make_edge (init_block, first_block, flags); 4111 } 4112 else 4113 e = make_edge (init_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU); 4114 e->probability = REG_BR_PROB_BASE; 4115 e->count = ENTRY_BLOCK_PTR->count; 4116 4117 update_bb_for_insn (init_block); 4118 return init_block; 4119 } 4120 4121 /* For each lexical block, set BLOCK_NUMBER to the depth at which it is 4122 found in the block tree. */ 4123 4124 static void 4125 set_block_levels (tree block, int level) 4126 { 4127 while (block) 4128 { 4129 BLOCK_NUMBER (block) = level; 4130 set_block_levels (BLOCK_SUBBLOCKS (block), level + 1); 4131 block = BLOCK_CHAIN (block); 4132 } 4133 } 4134 4135 /* Create a block containing landing pads and similar stuff. */ 4136 4137 static void 4138 construct_exit_block (void) 4139 { 4140 rtx head = get_last_insn (); 4141 rtx end; 4142 basic_block exit_block; 4143 edge e, e2; 4144 unsigned ix; 4145 edge_iterator ei; 4146 rtx orig_end = BB_END (EXIT_BLOCK_PTR->prev_bb); 4147 4148 rtl_profile_for_bb (EXIT_BLOCK_PTR); 4149 4150 /* Make sure the locus is set to the end of the function, so that 4151 epilogue line numbers and warnings are set properly. */ 4152 if (cfun->function_end_locus != UNKNOWN_LOCATION) 4153 input_location = cfun->function_end_locus; 4154 4155 /* The following insns belong to the top scope. */ 4156 set_curr_insn_block (DECL_INITIAL (current_function_decl)); 4157 4158 /* Generate rtl for function exit. */ 4159 expand_function_end (); 4160 4161 end = get_last_insn (); 4162 if (head == end) 4163 return; 4164 /* While emitting the function end we could move end of the last basic block. 4165 */ 4166 BB_END (EXIT_BLOCK_PTR->prev_bb) = orig_end; 4167 while (NEXT_INSN (head) && NOTE_P (NEXT_INSN (head))) 4168 head = NEXT_INSN (head); 4169 exit_block = create_basic_block (NEXT_INSN (head), end, 4170 EXIT_BLOCK_PTR->prev_bb); 4171 exit_block->frequency = EXIT_BLOCK_PTR->frequency; 4172 exit_block->count = EXIT_BLOCK_PTR->count; 4173 4174 ix = 0; 4175 while (ix < EDGE_COUNT (EXIT_BLOCK_PTR->preds)) 4176 { 4177 e = EDGE_PRED (EXIT_BLOCK_PTR, ix); 4178 if (!(e->flags & EDGE_ABNORMAL)) 4179 redirect_edge_succ (e, exit_block); 4180 else 4181 ix++; 4182 } 4183 4184 e = make_edge (exit_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU); 4185 e->probability = REG_BR_PROB_BASE; 4186 e->count = EXIT_BLOCK_PTR->count; 4187 FOR_EACH_EDGE (e2, ei, EXIT_BLOCK_PTR->preds) 4188 if (e2 != e) 4189 { 4190 e->count -= e2->count; 4191 exit_block->count -= e2->count; 4192 exit_block->frequency -= EDGE_FREQUENCY (e2); 4193 } 4194 if (e->count < 0) 4195 e->count = 0; 4196 if (exit_block->count < 0) 4197 exit_block->count = 0; 4198 if (exit_block->frequency < 0) 4199 exit_block->frequency = 0; 4200 update_bb_for_insn (exit_block); 4201 } 4202 4203 /* Helper function for discover_nonconstant_array_refs. 4204 Look for ARRAY_REF nodes with non-constant indexes and mark them 4205 addressable. */ 4206 4207 static tree 4208 discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees, 4209 void *data ATTRIBUTE_UNUSED) 4210 { 4211 tree t = *tp; 4212 4213 if (IS_TYPE_OR_DECL_P (t)) 4214 *walk_subtrees = 0; 4215 else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF) 4216 { 4217 while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF) 4218 && is_gimple_min_invariant (TREE_OPERAND (t, 1)) 4219 && (!TREE_OPERAND (t, 2) 4220 || is_gimple_min_invariant (TREE_OPERAND (t, 2)))) 4221 || (TREE_CODE (t) == COMPONENT_REF 4222 && (!TREE_OPERAND (t,2) 4223 || is_gimple_min_invariant (TREE_OPERAND (t, 2)))) 4224 || TREE_CODE (t) == BIT_FIELD_REF 4225 || TREE_CODE (t) == REALPART_EXPR 4226 || TREE_CODE (t) == IMAGPART_EXPR 4227 || TREE_CODE (t) == VIEW_CONVERT_EXPR 4228 || CONVERT_EXPR_P (t)) 4229 t = TREE_OPERAND (t, 0); 4230 4231 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF) 4232 { 4233 t = get_base_address (t); 4234 if (t && DECL_P (t) 4235 && DECL_MODE (t) != BLKmode) 4236 TREE_ADDRESSABLE (t) = 1; 4237 } 4238 4239 *walk_subtrees = 0; 4240 } 4241 4242 return NULL_TREE; 4243 } 4244 4245 /* RTL expansion is not able to compile array references with variable 4246 offsets for arrays stored in single register. Discover such 4247 expressions and mark variables as addressable to avoid this 4248 scenario. */ 4249 4250 static void 4251 discover_nonconstant_array_refs (void) 4252 { 4253 basic_block bb; 4254 gimple_stmt_iterator gsi; 4255 4256 FOR_EACH_BB (bb) 4257 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 4258 { 4259 gimple stmt = gsi_stmt (gsi); 4260 if (!is_gimple_debug (stmt)) 4261 walk_gimple_op (stmt, discover_nonconstant_array_refs_r, NULL); 4262 } 4263 } 4264 4265 /* This function sets crtl->args.internal_arg_pointer to a virtual 4266 register if DRAP is needed. Local register allocator will replace 4267 virtual_incoming_args_rtx with the virtual register. */ 4268 4269 static void 4270 expand_stack_alignment (void) 4271 { 4272 rtx drap_rtx; 4273 unsigned int preferred_stack_boundary; 4274 4275 if (! SUPPORTS_STACK_ALIGNMENT) 4276 return; 4277 4278 if (cfun->calls_alloca 4279 || cfun->has_nonlocal_label 4280 || crtl->has_nonlocal_goto) 4281 crtl->need_drap = true; 4282 4283 /* Call update_stack_boundary here again to update incoming stack 4284 boundary. It may set incoming stack alignment to a different 4285 value after RTL expansion. TARGET_FUNCTION_OK_FOR_SIBCALL may 4286 use the minimum incoming stack alignment to check if it is OK 4287 to perform sibcall optimization since sibcall optimization will 4288 only align the outgoing stack to incoming stack boundary. */ 4289 if (targetm.calls.update_stack_boundary) 4290 targetm.calls.update_stack_boundary (); 4291 4292 /* The incoming stack frame has to be aligned at least at 4293 parm_stack_boundary. */ 4294 gcc_assert (crtl->parm_stack_boundary <= INCOMING_STACK_BOUNDARY); 4295 4296 /* Update crtl->stack_alignment_estimated and use it later to align 4297 stack. We check PREFERRED_STACK_BOUNDARY if there may be non-call 4298 exceptions since callgraph doesn't collect incoming stack alignment 4299 in this case. */ 4300 if (cfun->can_throw_non_call_exceptions 4301 && PREFERRED_STACK_BOUNDARY > crtl->preferred_stack_boundary) 4302 preferred_stack_boundary = PREFERRED_STACK_BOUNDARY; 4303 else 4304 preferred_stack_boundary = crtl->preferred_stack_boundary; 4305 if (preferred_stack_boundary > crtl->stack_alignment_estimated) 4306 crtl->stack_alignment_estimated = preferred_stack_boundary; 4307 if (preferred_stack_boundary > crtl->stack_alignment_needed) 4308 crtl->stack_alignment_needed = preferred_stack_boundary; 4309 4310 gcc_assert (crtl->stack_alignment_needed 4311 <= crtl->stack_alignment_estimated); 4312 4313 crtl->stack_realign_needed 4314 = INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated; 4315 crtl->stack_realign_tried = crtl->stack_realign_needed; 4316 4317 crtl->stack_realign_processed = true; 4318 4319 /* Target has to redefine TARGET_GET_DRAP_RTX to support stack 4320 alignment. */ 4321 gcc_assert (targetm.calls.get_drap_rtx != NULL); 4322 drap_rtx = targetm.calls.get_drap_rtx (); 4323 4324 /* stack_realign_drap and drap_rtx must match. */ 4325 gcc_assert ((stack_realign_drap != 0) == (drap_rtx != NULL)); 4326 4327 /* Do nothing if NULL is returned, which means DRAP is not needed. */ 4328 if (NULL != drap_rtx) 4329 { 4330 crtl->args.internal_arg_pointer = drap_rtx; 4331 4332 /* Call fixup_tail_calls to clean up REG_EQUIV note if DRAP is 4333 needed. */ 4334 fixup_tail_calls (); 4335 } 4336 } 4337 4338 /* Translate the intermediate representation contained in the CFG 4339 from GIMPLE trees to RTL. 4340 4341 We do conversion per basic block and preserve/update the tree CFG. 4342 This implies we have to do some magic as the CFG can simultaneously 4343 consist of basic blocks containing RTL and GIMPLE trees. This can 4344 confuse the CFG hooks, so be careful to not manipulate CFG during 4345 the expansion. */ 4346 4347 static unsigned int 4348 gimple_expand_cfg (void) 4349 { 4350 basic_block bb, init_block; 4351 sbitmap blocks; 4352 edge_iterator ei; 4353 edge e; 4354 rtx var_seq; 4355 unsigned i; 4356 4357 timevar_push (TV_OUT_OF_SSA); 4358 rewrite_out_of_ssa (&SA); 4359 timevar_pop (TV_OUT_OF_SSA); 4360 SA.partition_to_pseudo = (rtx *)xcalloc (SA.map->num_partitions, 4361 sizeof (rtx)); 4362 4363 /* Some backends want to know that we are expanding to RTL. */ 4364 currently_expanding_to_rtl = 1; 4365 4366 rtl_profile_for_bb (ENTRY_BLOCK_PTR); 4367 4368 insn_locators_alloc (); 4369 if (!DECL_IS_BUILTIN (current_function_decl)) 4370 { 4371 /* Eventually, all FEs should explicitly set function_start_locus. */ 4372 if (cfun->function_start_locus == UNKNOWN_LOCATION) 4373 set_curr_insn_source_location 4374 (DECL_SOURCE_LOCATION (current_function_decl)); 4375 else 4376 set_curr_insn_source_location (cfun->function_start_locus); 4377 } 4378 else 4379 set_curr_insn_source_location (UNKNOWN_LOCATION); 4380 set_curr_insn_block (DECL_INITIAL (current_function_decl)); 4381 prologue_locator = curr_insn_locator (); 4382 4383 #ifdef INSN_SCHEDULING 4384 init_sched_attrs (); 4385 #endif 4386 4387 /* Make sure first insn is a note even if we don't want linenums. 4388 This makes sure the first insn will never be deleted. 4389 Also, final expects a note to appear there. */ 4390 emit_note (NOTE_INSN_DELETED); 4391 4392 /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */ 4393 discover_nonconstant_array_refs (); 4394 4395 targetm.expand_to_rtl_hook (); 4396 crtl->stack_alignment_needed = STACK_BOUNDARY; 4397 crtl->max_used_stack_slot_alignment = STACK_BOUNDARY; 4398 crtl->stack_alignment_estimated = 0; 4399 crtl->preferred_stack_boundary = STACK_BOUNDARY; 4400 cfun->cfg->max_jumptable_ents = 0; 4401 4402 /* Resovle the function section. Some targets, like ARM EABI rely on knowledge 4403 of the function section at exapnsion time to predict distance of calls. */ 4404 resolve_unique_section (current_function_decl, 0, flag_function_sections); 4405 4406 /* Expand the variables recorded during gimple lowering. */ 4407 timevar_push (TV_VAR_EXPAND); 4408 start_sequence (); 4409 4410 expand_used_vars (); 4411 4412 var_seq = get_insns (); 4413 end_sequence (); 4414 timevar_pop (TV_VAR_EXPAND); 4415 4416 /* Honor stack protection warnings. */ 4417 if (warn_stack_protect) 4418 { 4419 if (cfun->calls_alloca) 4420 warning (OPT_Wstack_protector, 4421 "stack protector not protecting local variables: " 4422 "variable length buffer"); 4423 if (has_short_buffer && !crtl->stack_protect_guard) 4424 warning (OPT_Wstack_protector, 4425 "stack protector not protecting function: " 4426 "all local arrays are less than %d bytes long", 4427 (int) PARAM_VALUE (PARAM_SSP_BUFFER_SIZE)); 4428 } 4429 4430 /* Set up parameters and prepare for return, for the function. */ 4431 expand_function_start (current_function_decl); 4432 4433 /* If we emitted any instructions for setting up the variables, 4434 emit them before the FUNCTION_START note. */ 4435 if (var_seq) 4436 { 4437 emit_insn_before (var_seq, parm_birth_insn); 4438 4439 /* In expand_function_end we'll insert the alloca save/restore 4440 before parm_birth_insn. We've just insertted an alloca call. 4441 Adjust the pointer to match. */ 4442 parm_birth_insn = var_seq; 4443 } 4444 4445 /* Now that we also have the parameter RTXs, copy them over to our 4446 partitions. */ 4447 for (i = 0; i < SA.map->num_partitions; i++) 4448 { 4449 tree var = SSA_NAME_VAR (partition_to_var (SA.map, i)); 4450 4451 if (TREE_CODE (var) != VAR_DECL 4452 && !SA.partition_to_pseudo[i]) 4453 SA.partition_to_pseudo[i] = DECL_RTL_IF_SET (var); 4454 gcc_assert (SA.partition_to_pseudo[i]); 4455 4456 /* If this decl was marked as living in multiple places, reset 4457 this now to NULL. */ 4458 if (DECL_RTL_IF_SET (var) == pc_rtx) 4459 SET_DECL_RTL (var, NULL); 4460 4461 /* Some RTL parts really want to look at DECL_RTL(x) when x 4462 was a decl marked in REG_ATTR or MEM_ATTR. We could use 4463 SET_DECL_RTL here making this available, but that would mean 4464 to select one of the potentially many RTLs for one DECL. Instead 4465 of doing that we simply reset the MEM_EXPR of the RTL in question, 4466 then nobody can get at it and hence nobody can call DECL_RTL on it. */ 4467 if (!DECL_RTL_SET_P (var)) 4468 { 4469 if (MEM_P (SA.partition_to_pseudo[i])) 4470 set_mem_expr (SA.partition_to_pseudo[i], NULL); 4471 } 4472 } 4473 4474 /* If we have a class containing differently aligned pointers 4475 we need to merge those into the corresponding RTL pointer 4476 alignment. */ 4477 for (i = 1; i < num_ssa_names; i++) 4478 { 4479 tree name = ssa_name (i); 4480 int part; 4481 rtx r; 4482 4483 if (!name 4484 || !POINTER_TYPE_P (TREE_TYPE (name)) 4485 /* We might have generated new SSA names in 4486 update_alias_info_with_stack_vars. They will have a NULL 4487 defining statements, and won't be part of the partitioning, 4488 so ignore those. */ 4489 || !SSA_NAME_DEF_STMT (name)) 4490 continue; 4491 part = var_to_partition (SA.map, name); 4492 if (part == NO_PARTITION) 4493 continue; 4494 r = SA.partition_to_pseudo[part]; 4495 if (REG_P (r)) 4496 mark_reg_pointer (r, get_pointer_alignment (name)); 4497 } 4498 4499 /* If this function is `main', emit a call to `__main' 4500 to run global initializers, etc. */ 4501 if (DECL_NAME (current_function_decl) 4502 && MAIN_NAME_P (DECL_NAME (current_function_decl)) 4503 && DECL_FILE_SCOPE_P (current_function_decl)) 4504 expand_main_function (); 4505 4506 /* Initialize the stack_protect_guard field. This must happen after the 4507 call to __main (if any) so that the external decl is initialized. */ 4508 if (crtl->stack_protect_guard) 4509 stack_protect_prologue (); 4510 4511 expand_phi_nodes (&SA); 4512 4513 /* Register rtl specific functions for cfg. */ 4514 rtl_register_cfg_hooks (); 4515 4516 init_block = construct_init_block (); 4517 4518 /* Clear EDGE_EXECUTABLE on the entry edge(s). It is cleaned from the 4519 remaining edges later. */ 4520 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs) 4521 e->flags &= ~EDGE_EXECUTABLE; 4522 4523 lab_rtx_for_bb = pointer_map_create (); 4524 FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR, next_bb) 4525 bb = expand_gimple_basic_block (bb); 4526 4527 if (MAY_HAVE_DEBUG_INSNS) 4528 expand_debug_locations (); 4529 4530 execute_free_datastructures (); 4531 timevar_push (TV_OUT_OF_SSA); 4532 finish_out_of_ssa (&SA); 4533 timevar_pop (TV_OUT_OF_SSA); 4534 4535 timevar_push (TV_POST_EXPAND); 4536 /* We are no longer in SSA form. */ 4537 cfun->gimple_df->in_ssa_p = false; 4538 4539 /* Expansion is used by optimization passes too, set maybe_hot_insn_p 4540 conservatively to true until they are all profile aware. */ 4541 pointer_map_destroy (lab_rtx_for_bb); 4542 free_histograms (); 4543 4544 construct_exit_block (); 4545 set_curr_insn_block (DECL_INITIAL (current_function_decl)); 4546 insn_locators_finalize (); 4547 4548 /* Zap the tree EH table. */ 4549 set_eh_throw_stmt_table (cfun, NULL); 4550 4551 /* We need JUMP_LABEL be set in order to redirect jumps, and hence 4552 split edges which edge insertions might do. */ 4553 rebuild_jump_labels (get_insns ()); 4554 4555 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb) 4556 { 4557 edge e; 4558 edge_iterator ei; 4559 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) 4560 { 4561 if (e->insns.r) 4562 { 4563 rebuild_jump_labels_chain (e->insns.r); 4564 /* Avoid putting insns before parm_birth_insn. */ 4565 if (e->src == ENTRY_BLOCK_PTR 4566 && single_succ_p (ENTRY_BLOCK_PTR) 4567 && parm_birth_insn) 4568 { 4569 rtx insns = e->insns.r; 4570 e->insns.r = NULL_RTX; 4571 emit_insn_after_noloc (insns, parm_birth_insn, e->dest); 4572 } 4573 else 4574 commit_one_edge_insertion (e); 4575 } 4576 else 4577 ei_next (&ei); 4578 } 4579 } 4580 4581 /* We're done expanding trees to RTL. */ 4582 currently_expanding_to_rtl = 0; 4583 4584 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb) 4585 { 4586 edge e; 4587 edge_iterator ei; 4588 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) 4589 { 4590 /* Clear EDGE_EXECUTABLE. This flag is never used in the backend. */ 4591 e->flags &= ~EDGE_EXECUTABLE; 4592 4593 /* At the moment not all abnormal edges match the RTL 4594 representation. It is safe to remove them here as 4595 find_many_sub_basic_blocks will rediscover them. 4596 In the future we should get this fixed properly. */ 4597 if ((e->flags & EDGE_ABNORMAL) 4598 && !(e->flags & EDGE_SIBCALL)) 4599 remove_edge (e); 4600 else 4601 ei_next (&ei); 4602 } 4603 } 4604 4605 blocks = sbitmap_alloc (last_basic_block); 4606 sbitmap_ones (blocks); 4607 find_many_sub_basic_blocks (blocks); 4608 sbitmap_free (blocks); 4609 purge_all_dead_edges (); 4610 4611 compact_blocks (); 4612 4613 expand_stack_alignment (); 4614 4615 #ifdef ENABLE_CHECKING 4616 verify_flow_info (); 4617 #endif 4618 4619 /* There's no need to defer outputting this function any more; we 4620 know we want to output it. */ 4621 DECL_DEFER_OUTPUT (current_function_decl) = 0; 4622 4623 /* Now that we're done expanding trees to RTL, we shouldn't have any 4624 more CONCATs anywhere. */ 4625 generating_concat_p = 0; 4626 4627 if (dump_file) 4628 { 4629 fprintf (dump_file, 4630 "\n\n;;\n;; Full RTL generated for this function:\n;;\n"); 4631 /* And the pass manager will dump RTL for us. */ 4632 } 4633 4634 /* If we're emitting a nested function, make sure its parent gets 4635 emitted as well. Doing otherwise confuses debug info. */ 4636 { 4637 tree parent; 4638 for (parent = DECL_CONTEXT (current_function_decl); 4639 parent != NULL_TREE; 4640 parent = get_containing_scope (parent)) 4641 if (TREE_CODE (parent) == FUNCTION_DECL) 4642 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1; 4643 } 4644 4645 /* We are now committed to emitting code for this function. Do any 4646 preparation, such as emitting abstract debug info for the inline 4647 before it gets mangled by optimization. */ 4648 if (cgraph_function_possibly_inlined_p (current_function_decl)) 4649 (*debug_hooks->outlining_inline_function) (current_function_decl); 4650 4651 TREE_ASM_WRITTEN (current_function_decl) = 1; 4652 4653 /* After expanding, the return labels are no longer needed. */ 4654 return_label = NULL; 4655 naked_return_label = NULL; 4656 4657 /* After expanding, the tm_restart map is no longer needed. */ 4658 if (cfun->gimple_df->tm_restart) 4659 { 4660 htab_delete (cfun->gimple_df->tm_restart); 4661 cfun->gimple_df->tm_restart = NULL; 4662 } 4663 4664 /* Tag the blocks with a depth number so that change_scope can find 4665 the common parent easily. */ 4666 set_block_levels (DECL_INITIAL (cfun->decl), 0); 4667 default_rtl_profile (); 4668 timevar_pop (TV_POST_EXPAND); 4669 return 0; 4670 } 4671 4672 struct rtl_opt_pass pass_expand = 4673 { 4674 { 4675 RTL_PASS, 4676 "expand", /* name */ 4677 NULL, /* gate */ 4678 gimple_expand_cfg, /* execute */ 4679 NULL, /* sub */ 4680 NULL, /* next */ 4681 0, /* static_pass_number */ 4682 TV_EXPAND, /* tv_id */ 4683 PROP_ssa | PROP_gimple_leh | PROP_cfg 4684 | PROP_gimple_lcx, /* properties_required */ 4685 PROP_rtl, /* properties_provided */ 4686 PROP_ssa | PROP_trees, /* properties_destroyed */ 4687 TODO_verify_ssa | TODO_verify_flow 4688 | TODO_verify_stmts, /* todo_flags_start */ 4689 TODO_ggc_collect /* todo_flags_finish */ 4690 } 4691 }; 4692