Home | History | Annotate | Line # | Download | only in gcc
      1 /* Control flow functions for trees.
      2    Copyright (C) 2001-2024 Free Software Foundation, Inc.
      3    Contributed by Diego Novillo <dnovillo (at) redhat.com>
      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 "backend.h"
     25 #include "target.h"
     26 #include "rtl.h"
     27 #include "tree.h"
     28 #include "gimple.h"
     29 #include "cfghooks.h"
     30 #include "tree-pass.h"
     31 #include "ssa.h"
     32 #include "cgraph.h"
     33 #include "gimple-pretty-print.h"
     34 #include "diagnostic-core.h"
     35 #include "fold-const.h"
     36 #include "trans-mem.h"
     37 #include "stor-layout.h"
     38 #include "print-tree.h"
     39 #include "cfganal.h"
     40 #include "gimple-iterator.h"
     41 #include "gimple-fold.h"
     42 #include "tree-eh.h"
     43 #include "gimplify-me.h"
     44 #include "gimple-walk.h"
     45 #include "tree-cfg.h"
     46 #include "tree-ssa-loop-manip.h"
     47 #include "tree-ssa-loop-niter.h"
     48 #include "tree-into-ssa.h"
     49 #include "tree-dfa.h"
     50 #include "tree-ssa.h"
     51 #include "except.h"
     52 #include "cfgloop.h"
     53 #include "tree-ssa-propagate.h"
     54 #include "value-prof.h"
     55 #include "tree-inline.h"
     56 #include "tree-ssa-live.h"
     57 #include "tree-ssa-dce.h"
     58 #include "omp-general.h"
     59 #include "omp-expand.h"
     60 #include "tree-cfgcleanup.h"
     61 #include "gimplify.h"
     62 #include "attribs.h"
     63 #include "selftest.h"
     64 #include "opts.h"
     65 #include "asan.h"
     66 #include "profile.h"
     67 #include "sreal.h"
     68 
     69 /* This file contains functions for building the Control Flow Graph (CFG)
     70    for a function tree.  */
     71 
     72 /* Local declarations.  */
     73 
     74 /* Initial capacity for the basic block array.  */
     75 static const int initial_cfg_capacity = 20;
     76 
     77 /* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
     78    which use a particular edge.  The CASE_LABEL_EXPRs are chained together
     79    via their CASE_CHAIN field, which we clear after we're done with the
     80    hash table to prevent problems with duplication of GIMPLE_SWITCHes.
     81 
     82    Access to this list of CASE_LABEL_EXPRs allows us to efficiently
     83    update the case vector in response to edge redirections.
     84 
     85    Right now this table is set up and torn down at key points in the
     86    compilation process.  It would be nice if we could make the table
     87    more persistent.  The key is getting notification of changes to
     88    the CFG (particularly edge removal, creation and redirection).  */
     89 
     90 static hash_map<edge, tree> *edge_to_cases;
     91 
     92 /* If we record edge_to_cases, this bitmap will hold indexes
     93    of basic blocks that end in a GIMPLE_SWITCH which we touched
     94    due to edge manipulations.  */
     95 
     96 static bitmap touched_switch_bbs;
     97 
     98 /* OpenMP region idxs for blocks during cfg pass.  */
     99 static vec<int> bb_to_omp_idx;
    100 
    101 /* CFG statistics.  */
    102 struct cfg_stats_d
    103 {
    104   long num_merged_labels;
    105 };
    106 
    107 static struct cfg_stats_d cfg_stats;
    108 
    109 /* Data to pass to replace_block_vars_by_duplicates_1.  */
    110 struct replace_decls_d
    111 {
    112   hash_map<tree, tree> *vars_map;
    113   tree to_context;
    114 };
    115 
    116 /* Hash table to store last discriminator assigned for each locus.  */
    117 struct locus_discrim_map
    118 {
    119   int location_line;
    120   int discriminator;
    121 };
    122 
    123 /* Hashtable helpers.  */
    124 
    125 struct locus_discrim_hasher : free_ptr_hash <locus_discrim_map>
    126 {
    127   static inline hashval_t hash (const locus_discrim_map *);
    128   static inline bool equal (const locus_discrim_map *,
    129 			    const locus_discrim_map *);
    130 };
    131 
    132 /* Trivial hash function for a location_t.  ITEM is a pointer to
    133    a hash table entry that maps a location_t to a discriminator.  */
    134 
    135 inline hashval_t
    136 locus_discrim_hasher::hash (const locus_discrim_map *item)
    137 {
    138   return item->location_line;
    139 }
    140 
    141 /* Equality function for the locus-to-discriminator map.  A and B
    142    point to the two hash table entries to compare.  */
    143 
    144 inline bool
    145 locus_discrim_hasher::equal (const locus_discrim_map *a,
    146 			     const locus_discrim_map *b)
    147 {
    148   return a->location_line == b->location_line;
    149 }
    150 
    151 static hash_table<locus_discrim_hasher> *discriminator_per_locus;
    152 
    153 /* Basic blocks and flowgraphs.  */
    154 static void make_blocks (gimple_seq);
    155 
    156 /* Edges.  */
    157 static void make_edges (void);
    158 static void assign_discriminators (void);
    159 static void make_cond_expr_edges (basic_block);
    160 static void make_gimple_switch_edges (gswitch *, basic_block);
    161 static bool make_goto_expr_edges (basic_block);
    162 static void make_gimple_asm_edges (basic_block);
    163 static edge gimple_redirect_edge_and_branch (edge, basic_block);
    164 static edge gimple_try_redirect_by_replacing_jump (edge, basic_block);
    165 
    166 /* Various helpers.  */
    167 static inline bool stmt_starts_bb_p (gimple *, gimple *);
    168 static bool gimple_verify_flow_info (void);
    169 static void gimple_make_forwarder_block (edge);
    170 static gimple *first_non_label_nondebug_stmt (basic_block);
    171 static bool verify_gimple_transaction (gtransaction *);
    172 static bool call_can_make_abnormal_goto (gimple *);
    173 
    174 /* Flowgraph optimization and cleanup.  */
    175 static void gimple_merge_blocks (basic_block, basic_block);
    176 static bool gimple_can_merge_blocks_p (basic_block, basic_block);
    177 static void remove_bb (basic_block);
    178 static edge find_taken_edge_computed_goto (basic_block, tree);
    179 static edge find_taken_edge_cond_expr (const gcond *, tree);
    180 
    181 void
    182 init_empty_tree_cfg_for_function (struct function *fn)
    183 {
    184   /* Initialize the basic block array.  */
    185   init_flow (fn);
    186   profile_status_for_fn (fn) = PROFILE_ABSENT;
    187   n_basic_blocks_for_fn (fn) = NUM_FIXED_BLOCKS;
    188   last_basic_block_for_fn (fn) = NUM_FIXED_BLOCKS;
    189   vec_safe_grow_cleared (basic_block_info_for_fn (fn),
    190 			 initial_cfg_capacity, true);
    191 
    192   /* Build a mapping of labels to their associated blocks.  */
    193   vec_safe_grow_cleared (label_to_block_map_for_fn (fn),
    194 			 initial_cfg_capacity, true);
    195 
    196   SET_BASIC_BLOCK_FOR_FN (fn, ENTRY_BLOCK, ENTRY_BLOCK_PTR_FOR_FN (fn));
    197   SET_BASIC_BLOCK_FOR_FN (fn, EXIT_BLOCK, EXIT_BLOCK_PTR_FOR_FN (fn));
    198 
    199   ENTRY_BLOCK_PTR_FOR_FN (fn)->next_bb
    200     = EXIT_BLOCK_PTR_FOR_FN (fn);
    201   EXIT_BLOCK_PTR_FOR_FN (fn)->prev_bb
    202     = ENTRY_BLOCK_PTR_FOR_FN (fn);
    203 }
    204 
    205 void
    206 init_empty_tree_cfg (void)
    207 {
    208   init_empty_tree_cfg_for_function (cfun);
    209 }
    210 
    211 /*---------------------------------------------------------------------------
    212 			      Create basic blocks
    213 ---------------------------------------------------------------------------*/
    214 
    215 /* Entry point to the CFG builder for trees.  SEQ is the sequence of
    216    statements to be added to the flowgraph.  */
    217 
    218 static void
    219 build_gimple_cfg (gimple_seq seq)
    220 {
    221   /* Register specific gimple functions.  */
    222   gimple_register_cfg_hooks ();
    223 
    224   memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
    225 
    226   init_empty_tree_cfg ();
    227 
    228   make_blocks (seq);
    229 
    230   /* Make sure there is always at least one block, even if it's empty.  */
    231   if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
    232     create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (cfun));
    233 
    234   /* Adjust the size of the array.  */
    235   if (basic_block_info_for_fn (cfun)->length ()
    236       < (size_t) n_basic_blocks_for_fn (cfun))
    237     vec_safe_grow_cleared (basic_block_info_for_fn (cfun),
    238 			   n_basic_blocks_for_fn (cfun));
    239 
    240   /* To speed up statement iterator walks, we first purge dead labels.  */
    241   cleanup_dead_labels ();
    242 
    243   /* Group case nodes to reduce the number of edges.
    244      We do this after cleaning up dead labels because otherwise we miss
    245      a lot of obvious case merging opportunities.  */
    246   group_case_labels ();
    247 
    248   /* Create the edges of the flowgraph.  */
    249   discriminator_per_locus = new hash_table<locus_discrim_hasher> (13);
    250   make_edges ();
    251   assign_discriminators ();
    252   cleanup_dead_labels ();
    253   delete discriminator_per_locus;
    254   discriminator_per_locus = NULL;
    255 }
    256 
    257 /* Look for ANNOTATE calls with loop annotation kind in BB; if found, remove
    258    them and propagate the information to LOOP.  We assume that the annotations
    259    come immediately before the condition in BB, if any.  */
    260 
    261 static void
    262 replace_loop_annotate_in_block (basic_block bb, class loop *loop)
    263 {
    264   gimple_stmt_iterator gsi = gsi_last_bb (bb);
    265   gimple *stmt = gsi_stmt (gsi);
    266 
    267   if (!(stmt && gimple_code (stmt) == GIMPLE_COND))
    268     return;
    269 
    270   for (gsi_prev_nondebug (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))
    271     {
    272       stmt = gsi_stmt (gsi);
    273       if (gimple_code (stmt) != GIMPLE_CALL)
    274 	break;
    275       if (!gimple_call_internal_p (stmt)
    276 	  || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
    277 	break;
    278 
    279       switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1)))
    280 	{
    281 	case annot_expr_ivdep_kind:
    282 	  loop->safelen = INT_MAX;
    283 	  break;
    284 	case annot_expr_unroll_kind:
    285 	  loop->unroll
    286 	    = (unsigned short) tree_to_shwi (gimple_call_arg (stmt, 2));
    287 	  cfun->has_unroll = true;
    288 	  break;
    289 	case annot_expr_no_vector_kind:
    290 	  loop->dont_vectorize = true;
    291 	  break;
    292 	case annot_expr_vector_kind:
    293 	  loop->force_vectorize = true;
    294 	  cfun->has_force_vectorize_loops = true;
    295 	  break;
    296 	case annot_expr_parallel_kind:
    297 	  loop->can_be_parallel = true;
    298 	  loop->safelen = INT_MAX;
    299 	  break;
    300 	case annot_expr_maybe_infinite_kind:
    301 	  loop->finite_p = false;
    302 	  break;
    303 	default:
    304 	  gcc_unreachable ();
    305 	}
    306 
    307       stmt = gimple_build_assign (gimple_call_lhs (stmt),
    308 				  gimple_call_arg (stmt, 0));
    309       gsi_replace (&gsi, stmt, true);
    310     }
    311 }
    312 
    313 /* Look for ANNOTATE calls with loop annotation kind; if found, remove
    314    them and propagate the information to the loop.  We assume that the
    315    annotations come immediately before the condition of the loop.  */
    316 
    317 static void
    318 replace_loop_annotate (void)
    319 {
    320   basic_block bb;
    321   gimple_stmt_iterator gsi;
    322   gimple *stmt;
    323 
    324   for (auto loop : loops_list (cfun, 0))
    325     {
    326       /* Push the global flag_finite_loops state down to individual loops.  */
    327       loop->finite_p = flag_finite_loops;
    328 
    329       /* Check all exit source blocks for annotations.  */
    330       for (auto e : get_loop_exit_edges (loop))
    331 	replace_loop_annotate_in_block (e->src, loop);
    332     }
    333 
    334   /* Remove IFN_ANNOTATE.  Safeguard for the case loop->latch == NULL.  */
    335   FOR_EACH_BB_FN (bb, cfun)
    336     {
    337       for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
    338 	{
    339 	  stmt = gsi_stmt (gsi);
    340 	  if (gimple_code (stmt) != GIMPLE_CALL)
    341 	    continue;
    342 	  if (!gimple_call_internal_p (stmt)
    343 	      || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
    344 	    continue;
    345 
    346 	  switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1)))
    347 	    {
    348 	    case annot_expr_ivdep_kind:
    349 	    case annot_expr_unroll_kind:
    350 	    case annot_expr_no_vector_kind:
    351 	    case annot_expr_vector_kind:
    352 	    case annot_expr_parallel_kind:
    353 	    case annot_expr_maybe_infinite_kind:
    354 	      break;
    355 	    default:
    356 	      gcc_unreachable ();
    357 	    }
    358 
    359 	  warning_at (gimple_location (stmt), 0, "ignoring loop annotation");
    360 	  stmt = gimple_build_assign (gimple_call_lhs (stmt),
    361 				      gimple_call_arg (stmt, 0));
    362 	  gsi_replace (&gsi, stmt, true);
    363 	}
    364     }
    365 }
    366 
    367 static unsigned int
    368 execute_build_cfg (void)
    369 {
    370   gimple_seq body = gimple_body (current_function_decl);
    371 
    372   build_gimple_cfg (body);
    373   gimple_set_body (current_function_decl, NULL);
    374   if (dump_file && (dump_flags & TDF_DETAILS))
    375     {
    376       fprintf (dump_file, "Scope blocks:\n");
    377       dump_scope_blocks (dump_file, dump_flags);
    378     }
    379   cleanup_tree_cfg ();
    380 
    381   bb_to_omp_idx.release ();
    382 
    383   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
    384   replace_loop_annotate ();
    385   return 0;
    386 }
    387 
    388 namespace {
    389 
    390 const pass_data pass_data_build_cfg =
    391 {
    392   GIMPLE_PASS, /* type */
    393   "cfg", /* name */
    394   OPTGROUP_NONE, /* optinfo_flags */
    395   TV_TREE_CFG, /* tv_id */
    396   PROP_gimple_leh, /* properties_required */
    397   ( PROP_cfg | PROP_loops ), /* properties_provided */
    398   0, /* properties_destroyed */
    399   0, /* todo_flags_start */
    400   0, /* todo_flags_finish */
    401 };
    402 
    403 class pass_build_cfg : public gimple_opt_pass
    404 {
    405 public:
    406   pass_build_cfg (gcc::context *ctxt)
    407     : gimple_opt_pass (pass_data_build_cfg, ctxt)
    408   {}
    409 
    410   /* opt_pass methods: */
    411   unsigned int execute (function *) final override
    412   {
    413     return execute_build_cfg ();
    414   }
    415 
    416 }; // class pass_build_cfg
    417 
    418 } // anon namespace
    419 
    420 gimple_opt_pass *
    421 make_pass_build_cfg (gcc::context *ctxt)
    422 {
    423   return new pass_build_cfg (ctxt);
    424 }
    425 
    426 
    427 /* Return true if T is a computed goto.  */
    428 
    429 bool
    430 computed_goto_p (gimple *t)
    431 {
    432   return (gimple_code (t) == GIMPLE_GOTO
    433 	  && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL);
    434 }
    435 
    436 /* Returns true if the sequence of statements STMTS only contains
    437    a call to __builtin_unreachable ().  */
    438 
    439 bool
    440 gimple_seq_unreachable_p (gimple_seq stmts)
    441 {
    442   if (stmts == NULL
    443       /* Return false if -fsanitize=unreachable, we don't want to
    444 	 optimize away those calls, but rather turn them into
    445 	 __ubsan_handle_builtin_unreachable () or __builtin_trap ()
    446 	 later.  */
    447       || sanitize_flags_p (SANITIZE_UNREACHABLE))
    448     return false;
    449 
    450   gimple_stmt_iterator gsi = gsi_last (stmts);
    451 
    452   if (!gimple_call_builtin_p (gsi_stmt (gsi), BUILT_IN_UNREACHABLE))
    453     return false;
    454 
    455   for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))
    456     {
    457       gimple *stmt = gsi_stmt (gsi);
    458       if (gimple_code (stmt) != GIMPLE_LABEL
    459 	  && !is_gimple_debug (stmt)
    460 	  && !gimple_clobber_p (stmt))
    461       return false;
    462     }
    463   return true;
    464 }
    465 
    466 /* Returns true for edge E where e->src ends with a GIMPLE_COND and
    467    the other edge points to a bb with just __builtin_unreachable ().
    468    I.e. return true for C->M edge in:
    469    <bb C>:
    470    ...
    471    if (something)
    472      goto <bb N>;
    473    else
    474      goto <bb M>;
    475    <bb N>:
    476    __builtin_unreachable ();
    477    <bb M>:  */
    478 
    479 bool
    480 assert_unreachable_fallthru_edge_p (edge e)
    481 {
    482   basic_block pred_bb = e->src;
    483   if (safe_is_a <gcond *> (*gsi_last_bb (pred_bb)))
    484     {
    485       basic_block other_bb = EDGE_SUCC (pred_bb, 0)->dest;
    486       if (other_bb == e->dest)
    487 	other_bb = EDGE_SUCC (pred_bb, 1)->dest;
    488       if (EDGE_COUNT (other_bb->succs) == 0)
    489 	return gimple_seq_unreachable_p (bb_seq (other_bb));
    490     }
    491   return false;
    492 }
    493 
    494 
    495 /* Initialize GF_CALL_CTRL_ALTERING flag, which indicates the call
    496    could alter control flow except via eh. We initialize the flag at
    497    CFG build time and only ever clear it later.  */
    498 
    499 static void
    500 gimple_call_initialize_ctrl_altering (gimple *stmt)
    501 {
    502   int flags = gimple_call_flags (stmt);
    503 
    504   /* A call alters control flow if it can make an abnormal goto.  */
    505   if (call_can_make_abnormal_goto (stmt)
    506       /* A call also alters control flow if it does not return.  */
    507       || flags & ECF_NORETURN
    508       /* TM ending statements have backedges out of the transaction.
    509 	 Return true so we split the basic block containing them.
    510 	 Note that the TM_BUILTIN test is merely an optimization.  */
    511       || ((flags & ECF_TM_BUILTIN)
    512 	  && is_tm_ending_fndecl (gimple_call_fndecl (stmt)))
    513       /* BUILT_IN_RETURN call is same as return statement.  */
    514       || gimple_call_builtin_p (stmt, BUILT_IN_RETURN)
    515       /* IFN_UNIQUE should be the last insn, to make checking for it
    516 	 as cheap as possible.  */
    517       || (gimple_call_internal_p (stmt)
    518 	  && gimple_call_internal_unique_p (stmt)))
    519     gimple_call_set_ctrl_altering (stmt, true);
    520   else
    521     gimple_call_set_ctrl_altering (stmt, false);
    522 }
    523 
    524 
    525 /* Insert SEQ after BB and build a flowgraph.  */
    526 
    527 static basic_block
    528 make_blocks_1 (gimple_seq seq, basic_block bb)
    529 {
    530   gimple_stmt_iterator i = gsi_start (seq);
    531   gimple *stmt = NULL;
    532   gimple *prev_stmt = NULL;
    533   bool start_new_block = true;
    534   bool first_stmt_of_seq = true;
    535 
    536   while (!gsi_end_p (i))
    537     {
    538       /* PREV_STMT should only be set to a debug stmt if the debug
    539 	 stmt is before nondebug stmts.  Once stmt reaches a nondebug
    540 	 nonlabel, prev_stmt will be set to it, so that
    541 	 stmt_starts_bb_p will know to start a new block if a label is
    542 	 found.  However, if stmt was a label after debug stmts only,
    543 	 keep the label in prev_stmt even if we find further debug
    544 	 stmts, for there may be other labels after them, and they
    545 	 should land in the same block.  */
    546       if (!prev_stmt || !stmt || !is_gimple_debug (stmt))
    547 	prev_stmt = stmt;
    548       stmt = gsi_stmt (i);
    549 
    550       if (stmt && is_gimple_call (stmt))
    551 	gimple_call_initialize_ctrl_altering (stmt);
    552 
    553       /* If the statement starts a new basic block or if we have determined
    554 	 in a previous pass that we need to create a new block for STMT, do
    555 	 so now.  */
    556       if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
    557 	{
    558 	  if (!first_stmt_of_seq)
    559 	    gsi_split_seq_before (&i, &seq);
    560 	  bb = create_basic_block (seq, bb);
    561 	  start_new_block = false;
    562 	  prev_stmt = NULL;
    563 	}
    564 
    565       /* Now add STMT to BB and create the subgraphs for special statement
    566 	 codes.  */
    567       gimple_set_bb (stmt, bb);
    568 
    569       /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
    570 	 next iteration.  */
    571       if (stmt_ends_bb_p (stmt))
    572 	{
    573 	  /* If the stmt can make abnormal goto use a new temporary
    574 	     for the assignment to the LHS.  This makes sure the old value
    575 	     of the LHS is available on the abnormal edge.  Otherwise
    576 	     we will end up with overlapping life-ranges for abnormal
    577 	     SSA names.  */
    578 	  if (gimple_has_lhs (stmt)
    579 	      && stmt_can_make_abnormal_goto (stmt)
    580 	      && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt))))
    581 	    {
    582 	      tree lhs = gimple_get_lhs (stmt);
    583 	      tree tmp = create_tmp_var (TREE_TYPE (lhs));
    584 	      gimple *s = gimple_build_assign (lhs, tmp);
    585 	      gimple_set_location (s, gimple_location (stmt));
    586 	      gimple_set_block (s, gimple_block (stmt));
    587 	      gimple_set_lhs (stmt, tmp);
    588 	      gsi_insert_after (&i, s, GSI_SAME_STMT);
    589 	    }
    590 	  start_new_block = true;
    591 	}
    592 
    593       gsi_next (&i);
    594       first_stmt_of_seq = false;
    595     }
    596   return bb;
    597 }
    598 
    599 /* Build a flowgraph for the sequence of stmts SEQ.  */
    600 
    601 static void
    602 make_blocks (gimple_seq seq)
    603 {
    604   /* Look for debug markers right before labels, and move the debug
    605      stmts after the labels.  Accepting labels among debug markers
    606      adds no value, just complexity; if we wanted to annotate labels
    607      with view numbers (so sequencing among markers would matter) or
    608      somesuch, we're probably better off still moving the labels, but
    609      adding other debug annotations in their original positions or
    610      emitting nonbind or bind markers associated with the labels in
    611      the original position of the labels.
    612 
    613      Moving labels would probably be simpler, but we can't do that:
    614      moving labels assigns label ids to them, and doing so because of
    615      debug markers makes for -fcompare-debug and possibly even codegen
    616      differences.  So, we have to move the debug stmts instead.  To
    617      that end, we scan SEQ backwards, marking the position of the
    618      latest (earliest we find) label, and moving debug stmts that are
    619      not separated from it by nondebug nonlabel stmts after the
    620      label.  */
    621   if (MAY_HAVE_DEBUG_MARKER_STMTS)
    622     {
    623       gimple_stmt_iterator label = gsi_none ();
    624 
    625       for (gimple_stmt_iterator i = gsi_last (seq); !gsi_end_p (i); gsi_prev (&i))
    626 	{
    627 	  gimple *stmt = gsi_stmt (i);
    628 
    629 	  /* If this is the first label we encounter (latest in SEQ)
    630 	     before nondebug stmts, record its position.  */
    631 	  if (is_a <glabel *> (stmt))
    632 	    {
    633 	      if (gsi_end_p (label))
    634 		label = i;
    635 	      continue;
    636 	    }
    637 
    638 	  /* Without a recorded label position to move debug stmts to,
    639 	     there's nothing to do.  */
    640 	  if (gsi_end_p (label))
    641 	    continue;
    642 
    643 	  /* Move the debug stmt at I after LABEL.  */
    644 	  if (is_gimple_debug (stmt))
    645 	    {
    646 	      gcc_assert (gimple_debug_nonbind_marker_p (stmt));
    647 	      /* As STMT is removed, I advances to the stmt after
    648 		 STMT, so the gsi_prev in the for "increment"
    649 		 expression gets us to the stmt we're to visit after
    650 		 STMT.  LABEL, however, would advance to the moved
    651 		 stmt if we passed it to gsi_move_after, so pass it a
    652 		 copy instead, so as to keep LABEL pointing to the
    653 		 LABEL.  */
    654 	      gimple_stmt_iterator copy = label;
    655 	      gsi_move_after (&i, &copy);
    656 	      continue;
    657 	    }
    658 
    659 	  /* There aren't any (more?) debug stmts before label, so
    660 	     there isn't anything else to move after it.  */
    661 	  label = gsi_none ();
    662 	}
    663     }
    664 
    665   make_blocks_1 (seq, ENTRY_BLOCK_PTR_FOR_FN (cfun));
    666 }
    667 
    668 /* Create and return a new empty basic block after bb AFTER.  */
    669 
    670 static basic_block
    671 create_bb (void *h, void *e, basic_block after)
    672 {
    673   basic_block bb;
    674 
    675   gcc_assert (!e);
    676 
    677   /* Create and initialize a new basic block.  Since alloc_block uses
    678      GC allocation that clears memory to allocate a basic block, we do
    679      not have to clear the newly allocated basic block here.  */
    680   bb = alloc_block ();
    681 
    682   bb->index = last_basic_block_for_fn (cfun);
    683   bb->flags = BB_NEW;
    684   set_bb_seq (bb, h ? (gimple_seq) h : NULL);
    685 
    686   /* Add the new block to the linked list of blocks.  */
    687   link_block (bb, after);
    688 
    689   /* Grow the basic block array if needed.  */
    690   if ((size_t) last_basic_block_for_fn (cfun)
    691       == basic_block_info_for_fn (cfun)->length ())
    692     vec_safe_grow_cleared (basic_block_info_for_fn (cfun),
    693 			   last_basic_block_for_fn (cfun) + 1);
    694 
    695   /* Add the newly created block to the array.  */
    696   SET_BASIC_BLOCK_FOR_FN (cfun, last_basic_block_for_fn (cfun), bb);
    697 
    698   n_basic_blocks_for_fn (cfun)++;
    699   last_basic_block_for_fn (cfun)++;
    700 
    701   return bb;
    702 }
    703 
    704 
    705 /*---------------------------------------------------------------------------
    706 				 Edge creation
    707 ---------------------------------------------------------------------------*/
    708 
    709 /* If basic block BB has an abnormal edge to a basic block
    710    containing IFN_ABNORMAL_DISPATCHER internal call, return
    711    that the dispatcher's basic block, otherwise return NULL.  */
    712 
    713 basic_block
    714 get_abnormal_succ_dispatcher (basic_block bb)
    715 {
    716   edge e;
    717   edge_iterator ei;
    718 
    719   FOR_EACH_EDGE (e, ei, bb->succs)
    720     if ((e->flags & (EDGE_ABNORMAL | EDGE_EH)) == EDGE_ABNORMAL)
    721       {
    722 	gimple_stmt_iterator gsi
    723 	  = gsi_start_nondebug_after_labels_bb (e->dest);
    724 	gimple *g = gsi_stmt (gsi);
    725 	if (g && gimple_call_internal_p (g, IFN_ABNORMAL_DISPATCHER))
    726 	  return e->dest;
    727       }
    728   return NULL;
    729 }
    730 
    731 /* Helper function for make_edges.  Create a basic block with
    732    with ABNORMAL_DISPATCHER internal call in it if needed, and
    733    create abnormal edges from BBS to it and from it to FOR_BB
    734    if COMPUTED_GOTO is false, otherwise factor the computed gotos.  */
    735 
    736 static void
    737 handle_abnormal_edges (basic_block *dispatcher_bbs, basic_block for_bb,
    738 		       auto_vec<basic_block> *bbs, bool computed_goto)
    739 {
    740   basic_block *dispatcher = dispatcher_bbs + (computed_goto ? 1 : 0);
    741   unsigned int idx = 0;
    742   basic_block bb;
    743   bool inner = false;
    744 
    745   if (!bb_to_omp_idx.is_empty ())
    746     {
    747       dispatcher = dispatcher_bbs + 2 * bb_to_omp_idx[for_bb->index];
    748       if (bb_to_omp_idx[for_bb->index] != 0)
    749 	inner = true;
    750     }
    751 
    752   /* If the dispatcher has been created already, then there are basic
    753      blocks with abnormal edges to it, so just make a new edge to
    754      for_bb.  */
    755   if (*dispatcher == NULL)
    756     {
    757       /* Check if there are any basic blocks that need to have
    758 	 abnormal edges to this dispatcher.  If there are none, return
    759 	 early.  */
    760       if (bb_to_omp_idx.is_empty ())
    761 	{
    762 	  if (bbs->is_empty ())
    763 	    return;
    764 	}
    765       else
    766 	{
    767 	  FOR_EACH_VEC_ELT (*bbs, idx, bb)
    768 	    if (bb_to_omp_idx[bb->index] == bb_to_omp_idx[for_bb->index])
    769 	      break;
    770 	  if (bb == NULL)
    771 	    return;
    772 	}
    773 
    774       /* Create the dispatcher bb.  */
    775       *dispatcher = create_basic_block (NULL, for_bb);
    776       if (computed_goto)
    777 	{
    778 	  /* Factor computed gotos into a common computed goto site.  Also
    779 	     record the location of that site so that we can un-factor the
    780 	     gotos after we have converted back to normal form.  */
    781 	  gimple_stmt_iterator gsi = gsi_start_bb (*dispatcher);
    782 
    783 	  /* Create the destination of the factored goto.  Each original
    784 	     computed goto will put its desired destination into this
    785 	     variable and jump to the label we create immediately below.  */
    786 	  tree var = create_tmp_var (ptr_type_node, "gotovar");
    787 
    788 	  /* Build a label for the new block which will contain the
    789 	     factored computed goto.  */
    790 	  tree factored_label_decl
    791 	    = create_artificial_label (UNKNOWN_LOCATION);
    792 	  gimple *factored_computed_goto_label
    793 	    = gimple_build_label (factored_label_decl);
    794 	  gsi_insert_after (&gsi, factored_computed_goto_label, GSI_NEW_STMT);
    795 
    796 	  /* Build our new computed goto.  */
    797 	  gimple *factored_computed_goto = gimple_build_goto (var);
    798 	  gsi_insert_after (&gsi, factored_computed_goto, GSI_NEW_STMT);
    799 
    800 	  FOR_EACH_VEC_ELT (*bbs, idx, bb)
    801 	    {
    802 	      if (!bb_to_omp_idx.is_empty ()
    803 		  && bb_to_omp_idx[bb->index] != bb_to_omp_idx[for_bb->index])
    804 		continue;
    805 
    806 	      gsi = gsi_last_bb (bb);
    807 	      gimple *last = gsi_stmt (gsi);
    808 
    809 	      gcc_assert (computed_goto_p (last));
    810 
    811 	      /* Copy the original computed goto's destination into VAR.  */
    812 	      gimple *assignment
    813 		= gimple_build_assign (var, gimple_goto_dest (last));
    814 	      gsi_insert_before (&gsi, assignment, GSI_SAME_STMT);
    815 
    816 	      edge e = make_edge (bb, *dispatcher, EDGE_FALLTHRU);
    817 	      e->goto_locus = gimple_location (last);
    818 	      gsi_remove (&gsi, true);
    819 	    }
    820 	}
    821       else
    822 	{
    823 	  tree arg = inner ? boolean_true_node : boolean_false_node;
    824 	  gcall *g = gimple_build_call_internal (IFN_ABNORMAL_DISPATCHER,
    825 						 1, arg);
    826 	  gimple_call_set_ctrl_altering (g, true);
    827 	  gimple_stmt_iterator gsi = gsi_after_labels (*dispatcher);
    828 	  gsi_insert_after (&gsi, g, GSI_NEW_STMT);
    829 
    830 	  /* Create predecessor edges of the dispatcher.  */
    831 	  FOR_EACH_VEC_ELT (*bbs, idx, bb)
    832 	    {
    833 	      if (!bb_to_omp_idx.is_empty ()
    834 		  && bb_to_omp_idx[bb->index] != bb_to_omp_idx[for_bb->index])
    835 		continue;
    836 	      make_edge (bb, *dispatcher, EDGE_ABNORMAL);
    837 	    }
    838 	}
    839     }
    840 
    841   make_edge (*dispatcher, for_bb, EDGE_ABNORMAL);
    842 }
    843 
    844 /* Creates outgoing edges for BB.  Returns 1 when it ends with an
    845    computed goto, returns 2 when it ends with a statement that
    846    might return to this function via an nonlocal goto, otherwise
    847    return 0.  Updates *PCUR_REGION with the OMP region this BB is in.  */
    848 
    849 static int
    850 make_edges_bb (basic_block bb, struct omp_region **pcur_region, int *pomp_index)
    851 {
    852   gimple *last = *gsi_last_bb (bb);
    853   bool fallthru = false;
    854   int ret = 0;
    855 
    856   if (!last)
    857     return ret;
    858 
    859   switch (gimple_code (last))
    860     {
    861     case GIMPLE_GOTO:
    862       if (make_goto_expr_edges (bb))
    863 	ret = 1;
    864       fallthru = false;
    865       break;
    866     case GIMPLE_RETURN:
    867       {
    868 	edge e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
    869 	e->goto_locus = gimple_location (last);
    870 	fallthru = false;
    871       }
    872       break;
    873     case GIMPLE_COND:
    874       make_cond_expr_edges (bb);
    875       fallthru = false;
    876       break;
    877     case GIMPLE_SWITCH:
    878       make_gimple_switch_edges (as_a <gswitch *> (last), bb);
    879       fallthru = false;
    880       break;
    881     case GIMPLE_RESX:
    882       make_eh_edge (last);
    883       fallthru = false;
    884       break;
    885     case GIMPLE_EH_DISPATCH:
    886       fallthru = make_eh_dispatch_edges (as_a <geh_dispatch *> (last));
    887       break;
    888 
    889     case GIMPLE_CALL:
    890       /* If this function receives a nonlocal goto, then we need to
    891 	 make edges from this call site to all the nonlocal goto
    892 	 handlers.  */
    893       if (stmt_can_make_abnormal_goto (last))
    894 	ret = 2;
    895 
    896       /* If this statement has reachable exception handlers, then
    897 	 create abnormal edges to them.  */
    898       make_eh_edge (last);
    899 
    900       /* BUILTIN_RETURN is really a return statement.  */
    901       if (gimple_call_builtin_p (last, BUILT_IN_RETURN))
    902 	{
    903 	  make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
    904 	  fallthru = false;
    905 	}
    906       /* Some calls are known not to return.  */
    907       else
    908 	fallthru = !gimple_call_noreturn_p (last);
    909       break;
    910 
    911     case GIMPLE_ASSIGN:
    912       /* A GIMPLE_ASSIGN may throw internally and thus be considered
    913 	 control-altering.  */
    914       if (is_ctrl_altering_stmt (last))
    915 	make_eh_edge (last);
    916       fallthru = true;
    917       break;
    918 
    919     case GIMPLE_ASM:
    920       make_gimple_asm_edges (bb);
    921       fallthru = true;
    922       break;
    923 
    924     CASE_GIMPLE_OMP:
    925       fallthru = omp_make_gimple_edges (bb, pcur_region, pomp_index);
    926       break;
    927 
    928     case GIMPLE_TRANSACTION:
    929       {
    930         gtransaction *txn = as_a <gtransaction *> (last);
    931 	tree label1 = gimple_transaction_label_norm (txn);
    932 	tree label2 = gimple_transaction_label_uninst (txn);
    933 
    934 	if (label1)
    935 	  make_edge (bb, label_to_block (cfun, label1), EDGE_FALLTHRU);
    936 	if (label2)
    937 	  make_edge (bb, label_to_block (cfun, label2),
    938 		     EDGE_TM_UNINSTRUMENTED | (label1 ? 0 : EDGE_FALLTHRU));
    939 
    940 	tree label3 = gimple_transaction_label_over (txn);
    941 	if (gimple_transaction_subcode (txn)
    942 	    & (GTMA_HAVE_ABORT | GTMA_IS_OUTER))
    943 	  make_edge (bb, label_to_block (cfun, label3), EDGE_TM_ABORT);
    944 
    945 	fallthru = false;
    946       }
    947       break;
    948 
    949     default:
    950       gcc_assert (!stmt_ends_bb_p (last));
    951       fallthru = true;
    952       break;
    953     }
    954 
    955   if (fallthru)
    956     make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
    957 
    958   return ret;
    959 }
    960 
    961 /* Join all the blocks in the flowgraph.  */
    962 
    963 static void
    964 make_edges (void)
    965 {
    966   basic_block bb;
    967   struct omp_region *cur_region = NULL;
    968   auto_vec<basic_block> ab_edge_goto;
    969   auto_vec<basic_block> ab_edge_call;
    970   int cur_omp_region_idx = 0;
    971 
    972   /* Create an edge from entry to the first block with executable
    973      statements in it.  */
    974   make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun),
    975 	     BASIC_BLOCK_FOR_FN (cfun, NUM_FIXED_BLOCKS),
    976 	     EDGE_FALLTHRU);
    977 
    978   /* Traverse the basic block array placing edges.  */
    979   FOR_EACH_BB_FN (bb, cfun)
    980     {
    981       int mer;
    982 
    983       if (!bb_to_omp_idx.is_empty ())
    984 	bb_to_omp_idx[bb->index] = cur_omp_region_idx;
    985 
    986       mer = make_edges_bb (bb, &cur_region, &cur_omp_region_idx);
    987       if (mer == 1)
    988 	ab_edge_goto.safe_push (bb);
    989       else if (mer == 2)
    990 	ab_edge_call.safe_push (bb);
    991 
    992       if (cur_region && bb_to_omp_idx.is_empty ())
    993 	bb_to_omp_idx.safe_grow_cleared (n_basic_blocks_for_fn (cfun), true);
    994     }
    995 
    996   /* Computed gotos are hell to deal with, especially if there are
    997      lots of them with a large number of destinations.  So we factor
    998      them to a common computed goto location before we build the
    999      edge list.  After we convert back to normal form, we will un-factor
   1000      the computed gotos since factoring introduces an unwanted jump.
   1001      For non-local gotos and abnormal edges from calls to calls that return
   1002      twice or forced labels, factor the abnormal edges too, by having all
   1003      abnormal edges from the calls go to a common artificial basic block
   1004      with ABNORMAL_DISPATCHER internal call and abnormal edges from that
   1005      basic block to all forced labels and calls returning twice.
   1006      We do this per-OpenMP structured block, because those regions
   1007      are guaranteed to be single entry single exit by the standard,
   1008      so it is not allowed to enter or exit such regions abnormally this way,
   1009      thus all computed gotos, non-local gotos and setjmp/longjmp calls
   1010      must not transfer control across SESE region boundaries.  */
   1011   if (!ab_edge_goto.is_empty () || !ab_edge_call.is_empty ())
   1012     {
   1013       gimple_stmt_iterator gsi;
   1014       basic_block dispatcher_bb_array[2] = { NULL, NULL };
   1015       basic_block *dispatcher_bbs = dispatcher_bb_array;
   1016       int count = n_basic_blocks_for_fn (cfun);
   1017 
   1018       if (!bb_to_omp_idx.is_empty ())
   1019 	dispatcher_bbs = XCNEWVEC (basic_block, 2 * count);
   1020 
   1021       FOR_EACH_BB_FN (bb, cfun)
   1022 	{
   1023 	  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   1024 	    {
   1025 	      glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (gsi));
   1026 	      tree target;
   1027 
   1028 	      if (!label_stmt)
   1029 		break;
   1030 
   1031 	      target = gimple_label_label (label_stmt);
   1032 
   1033 	      /* Make an edge to every label block that has been marked as a
   1034 		 potential target for a computed goto or a non-local goto.  */
   1035 	      if (FORCED_LABEL (target))
   1036 		handle_abnormal_edges (dispatcher_bbs, bb, &ab_edge_goto,
   1037 				       true);
   1038 	      if (DECL_NONLOCAL (target))
   1039 		{
   1040 		  handle_abnormal_edges (dispatcher_bbs, bb, &ab_edge_call,
   1041 					 false);
   1042 		  break;
   1043 		}
   1044 	    }
   1045 
   1046 	  if (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi)))
   1047 	    gsi_next_nondebug (&gsi);
   1048 	  if (!gsi_end_p (gsi))
   1049 	    {
   1050 	      /* Make an edge to every setjmp-like call.  */
   1051 	      gimple *call_stmt = gsi_stmt (gsi);
   1052 	      if (is_gimple_call (call_stmt)
   1053 		  && ((gimple_call_flags (call_stmt) & ECF_RETURNS_TWICE)
   1054 		      || gimple_call_builtin_p (call_stmt,
   1055 						BUILT_IN_SETJMP_RECEIVER)))
   1056 		handle_abnormal_edges (dispatcher_bbs, bb, &ab_edge_call,
   1057 				       false);
   1058 	    }
   1059 	}
   1060 
   1061       if (!bb_to_omp_idx.is_empty ())
   1062 	XDELETE (dispatcher_bbs);
   1063     }
   1064 
   1065   omp_free_regions ();
   1066 }
   1067 
   1068 /* Add SEQ after GSI.  Start new bb after GSI, and created further bbs as
   1069    needed.  Returns true if new bbs were created.
   1070    Note: This is transitional code, and should not be used for new code.  We
   1071    should be able to get rid of this by rewriting all target va-arg
   1072    gimplification hooks to use an interface gimple_build_cond_value as described
   1073    in https://gcc.gnu.org/ml/gcc-patches/2015-02/msg01194.html.  */
   1074 
   1075 bool
   1076 gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi)
   1077 {
   1078   gimple *stmt = gsi_stmt (*gsi);
   1079   basic_block bb = gimple_bb (stmt);
   1080   basic_block lastbb, afterbb;
   1081   int old_num_bbs = n_basic_blocks_for_fn (cfun);
   1082   edge e;
   1083   lastbb = make_blocks_1 (seq, bb);
   1084   if (old_num_bbs == n_basic_blocks_for_fn (cfun))
   1085     return false;
   1086   e = split_block (bb, stmt);
   1087   /* Move e->dest to come after the new basic blocks.  */
   1088   afterbb = e->dest;
   1089   unlink_block (afterbb);
   1090   link_block (afterbb, lastbb);
   1091   redirect_edge_succ (e, bb->next_bb);
   1092   bb = bb->next_bb;
   1093   while (bb != afterbb)
   1094     {
   1095       struct omp_region *cur_region = NULL;
   1096       profile_count cnt = profile_count::zero ();
   1097       bool all = true;
   1098 
   1099       int cur_omp_region_idx = 0;
   1100       int mer = make_edges_bb (bb, &cur_region, &cur_omp_region_idx);
   1101       gcc_assert (!mer && !cur_region);
   1102       add_bb_to_loop (bb, afterbb->loop_father);
   1103 
   1104       edge e;
   1105       edge_iterator ei;
   1106       FOR_EACH_EDGE (e, ei, bb->preds)
   1107 	{
   1108 	  if (e->count ().initialized_p ())
   1109 	    cnt += e->count ();
   1110 	  else
   1111 	    all = false;
   1112 	}
   1113       tree_guess_outgoing_edge_probabilities (bb);
   1114       if (all || profile_status_for_fn (cfun) == PROFILE_READ)
   1115         bb->count = cnt;
   1116 
   1117       bb = bb->next_bb;
   1118     }
   1119   return true;
   1120 }
   1121 
   1122 /* Find the next available discriminator value for LOCUS.  The
   1123    discriminator distinguishes among several basic blocks that
   1124    share a common locus, allowing for more accurate sample-based
   1125    profiling.  */
   1126 
   1127 static int
   1128 next_discriminator_for_locus (int line)
   1129 {
   1130   struct locus_discrim_map item;
   1131   struct locus_discrim_map **slot;
   1132 
   1133   item.location_line = line;
   1134   item.discriminator = 0;
   1135   slot = discriminator_per_locus->find_slot_with_hash (&item, line, INSERT);
   1136   gcc_assert (slot);
   1137   if (*slot == HTAB_EMPTY_ENTRY)
   1138     {
   1139       *slot = XNEW (struct locus_discrim_map);
   1140       gcc_assert (*slot);
   1141       (*slot)->location_line = line;
   1142       (*slot)->discriminator = 0;
   1143     }
   1144   (*slot)->discriminator++;
   1145   return (*slot)->discriminator;
   1146 }
   1147 
   1148 /* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line.  */
   1149 
   1150 static bool
   1151 same_line_p (location_t locus1, expanded_location *from, location_t locus2)
   1152 {
   1153   expanded_location to;
   1154 
   1155   if (locus1 == locus2)
   1156     return true;
   1157 
   1158   to = expand_location (locus2);
   1159 
   1160   if (from->line != to.line)
   1161     return false;
   1162   if (from->file == to.file)
   1163     return true;
   1164   return (from->file != NULL
   1165           && to.file != NULL
   1166           && filename_cmp (from->file, to.file) == 0);
   1167 }
   1168 
   1169 /* Assign a unique discriminator value to all statements in block bb that
   1170    have the same line number as locus. */
   1171 
   1172 static void
   1173 assign_discriminator (location_t locus, basic_block bb)
   1174 {
   1175   gimple_stmt_iterator gsi;
   1176   int discriminator;
   1177 
   1178   if (locus == UNKNOWN_LOCATION)
   1179     return;
   1180 
   1181   expanded_location locus_e = expand_location (locus);
   1182 
   1183   discriminator = next_discriminator_for_locus (locus_e.line);
   1184 
   1185   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   1186     {
   1187       gimple *stmt = gsi_stmt (gsi);
   1188       location_t stmt_locus = gimple_location (stmt);
   1189       if (same_line_p (locus, &locus_e, stmt_locus))
   1190 	gimple_set_location (stmt,
   1191 	    location_with_discriminator (stmt_locus, discriminator));
   1192     }
   1193 }
   1194 
   1195 /* Assign discriminators to statement locations.  */
   1196 
   1197 static void
   1198 assign_discriminators (void)
   1199 {
   1200   basic_block bb;
   1201 
   1202   FOR_EACH_BB_FN (bb, cfun)
   1203     {
   1204       edge e;
   1205       edge_iterator ei;
   1206       gimple_stmt_iterator gsi;
   1207       location_t curr_locus = UNKNOWN_LOCATION;
   1208       expanded_location curr_locus_e = {};
   1209       int curr_discr = 0;
   1210 
   1211       /* Traverse the basic block, if two function calls within a basic block
   1212 	are mapped to the same line, assign a new discriminator because a call
   1213 	stmt could be a split point of a basic block.  */
   1214       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   1215 	{
   1216 	  gimple *stmt = gsi_stmt (gsi);
   1217 
   1218 	  /* Don't allow debug stmts to affect discriminators, but
   1219 	     allow them to take discriminators when they're on the
   1220 	     same line as the preceding nondebug stmt.  */
   1221 	  if (is_gimple_debug (stmt))
   1222 	    {
   1223 	      if (curr_locus != UNKNOWN_LOCATION
   1224 		  && same_line_p (curr_locus, &curr_locus_e,
   1225 				  gimple_location (stmt)))
   1226 		{
   1227 		  location_t loc = gimple_location (stmt);
   1228 		  location_t dloc = location_with_discriminator (loc,
   1229 								 curr_discr);
   1230 		  gimple_set_location (stmt, dloc);
   1231 		}
   1232 	      continue;
   1233 	    }
   1234 	  if (curr_locus == UNKNOWN_LOCATION)
   1235 	    {
   1236 	      curr_locus = gimple_location (stmt);
   1237 	      curr_locus_e = expand_location (curr_locus);
   1238 	    }
   1239 	  else if (!same_line_p (curr_locus, &curr_locus_e, gimple_location (stmt)))
   1240 	    {
   1241 	      curr_locus = gimple_location (stmt);
   1242 	      curr_locus_e = expand_location (curr_locus);
   1243 	      curr_discr = 0;
   1244 	    }
   1245 	  else if (curr_discr != 0)
   1246 	    {
   1247 	      location_t loc = gimple_location (stmt);
   1248 	      location_t dloc = location_with_discriminator (loc, curr_discr);
   1249 	      gimple_set_location (stmt, dloc);
   1250 	    }
   1251 	  /* Allocate a new discriminator for CALL stmt.  */
   1252 	  if (gimple_code (stmt) == GIMPLE_CALL)
   1253 	    curr_discr = next_discriminator_for_locus (curr_locus);
   1254 	}
   1255 
   1256       gimple *last = last_nondebug_stmt (bb);
   1257       location_t locus = last ? gimple_location (last) : UNKNOWN_LOCATION;
   1258       if (locus == UNKNOWN_LOCATION)
   1259 	continue;
   1260 
   1261       expanded_location locus_e = expand_location (locus);
   1262 
   1263       FOR_EACH_EDGE (e, ei, bb->succs)
   1264 	{
   1265 	  gimple *first = first_non_label_nondebug_stmt (e->dest);
   1266 	  gimple *last = last_nondebug_stmt (e->dest);
   1267 
   1268 	  gimple *stmt_on_same_line = NULL;
   1269 	  if (first && same_line_p (locus, &locus_e,
   1270 				     gimple_location (first)))
   1271 	    stmt_on_same_line = first;
   1272 	  else if (last && same_line_p (locus, &locus_e,
   1273 					gimple_location (last)))
   1274 	    stmt_on_same_line = last;
   1275 
   1276 	  if (stmt_on_same_line)
   1277 	    {
   1278 	      if (has_discriminator (gimple_location (stmt_on_same_line))
   1279 		  && !has_discriminator (locus))
   1280 		assign_discriminator (locus, bb);
   1281 	      else
   1282 		assign_discriminator (locus, e->dest);
   1283 	    }
   1284 	}
   1285     }
   1286 }
   1287 
   1288 /* Create the edges for a GIMPLE_COND starting at block BB.  */
   1289 
   1290 static void
   1291 make_cond_expr_edges (basic_block bb)
   1292 {
   1293   gcond *entry = as_a <gcond *> (*gsi_last_bb (bb));
   1294   gimple *then_stmt, *else_stmt;
   1295   basic_block then_bb, else_bb;
   1296   tree then_label, else_label;
   1297   edge e;
   1298 
   1299   gcc_assert (entry);
   1300 
   1301   /* Entry basic blocks for each component.  */
   1302   then_label = gimple_cond_true_label (entry);
   1303   else_label = gimple_cond_false_label (entry);
   1304   then_bb = label_to_block (cfun, then_label);
   1305   else_bb = label_to_block (cfun, else_label);
   1306   then_stmt = first_stmt (then_bb);
   1307   else_stmt = first_stmt (else_bb);
   1308 
   1309   e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
   1310   e->goto_locus = gimple_location (then_stmt);
   1311   e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
   1312   if (e)
   1313     e->goto_locus = gimple_location (else_stmt);
   1314 
   1315   /* We do not need the labels anymore.  */
   1316   gimple_cond_set_true_label (entry, NULL_TREE);
   1317   gimple_cond_set_false_label (entry, NULL_TREE);
   1318 }
   1319 
   1320 
   1321 /* Called for each element in the hash table (P) as we delete the
   1322    edge to cases hash table.
   1323 
   1324    Clear all the CASE_CHAINs to prevent problems with copying of
   1325    SWITCH_EXPRs and structure sharing rules, then free the hash table
   1326    element.  */
   1327 
   1328 bool
   1329 edge_to_cases_cleanup (edge const &, tree const &value, void *)
   1330 {
   1331   tree t, next;
   1332 
   1333   for (t = value; t; t = next)
   1334     {
   1335       next = CASE_CHAIN (t);
   1336       CASE_CHAIN (t) = NULL;
   1337     }
   1338 
   1339   return true;
   1340 }
   1341 
   1342 /* Start recording information mapping edges to case labels.  */
   1343 
   1344 void
   1345 start_recording_case_labels (void)
   1346 {
   1347   gcc_assert (edge_to_cases == NULL);
   1348   edge_to_cases = new hash_map<edge, tree>;
   1349   touched_switch_bbs = BITMAP_ALLOC (NULL);
   1350 }
   1351 
   1352 /* Return nonzero if we are recording information for case labels.  */
   1353 
   1354 static bool
   1355 recording_case_labels_p (void)
   1356 {
   1357   return (edge_to_cases != NULL);
   1358 }
   1359 
   1360 /* Stop recording information mapping edges to case labels and
   1361    remove any information we have recorded.  */
   1362 void
   1363 end_recording_case_labels (void)
   1364 {
   1365   bitmap_iterator bi;
   1366   unsigned i;
   1367   edge_to_cases->traverse<void *, edge_to_cases_cleanup> (NULL);
   1368   delete edge_to_cases;
   1369   edge_to_cases = NULL;
   1370   EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
   1371     {
   1372       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
   1373       if (bb)
   1374 	{
   1375 	  if (gswitch *stmt = safe_dyn_cast <gswitch *> (*gsi_last_bb (bb)))
   1376 	    group_case_labels_stmt (stmt);
   1377 	}
   1378     }
   1379   BITMAP_FREE (touched_switch_bbs);
   1380 }
   1381 
   1382 /* If we are inside a {start,end}_recording_cases block, then return
   1383    a chain of CASE_LABEL_EXPRs from T which reference E.
   1384 
   1385    Otherwise return NULL.  */
   1386 
   1387 tree
   1388 get_cases_for_edge (edge e, gswitch *t)
   1389 {
   1390   tree *slot;
   1391   size_t i, n;
   1392 
   1393   /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
   1394      chains available.  Return NULL so the caller can detect this case.  */
   1395   if (!recording_case_labels_p ())
   1396     return NULL;
   1397 
   1398   slot = edge_to_cases->get (e);
   1399   if (slot)
   1400     return *slot;
   1401 
   1402   /* If we did not find E in the hash table, then this must be the first
   1403      time we have been queried for information about E & T.  Add all the
   1404      elements from T to the hash table then perform the query again.  */
   1405 
   1406   n = gimple_switch_num_labels (t);
   1407   for (i = 0; i < n; i++)
   1408     {
   1409       tree elt = gimple_switch_label (t, i);
   1410       tree lab = CASE_LABEL (elt);
   1411       basic_block label_bb = label_to_block (cfun, lab);
   1412       edge this_edge = find_edge (e->src, label_bb);
   1413 
   1414       /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
   1415 	 a new chain.  */
   1416       tree &s = edge_to_cases->get_or_insert (this_edge);
   1417       CASE_CHAIN (elt) = s;
   1418       s = elt;
   1419     }
   1420 
   1421   return *edge_to_cases->get (e);
   1422 }
   1423 
   1424 /* Create the edges for a GIMPLE_SWITCH starting at block BB.  */
   1425 
   1426 static void
   1427 make_gimple_switch_edges (gswitch *entry, basic_block bb)
   1428 {
   1429   size_t i, n;
   1430 
   1431   n = gimple_switch_num_labels (entry);
   1432 
   1433   for (i = 0; i < n; ++i)
   1434     {
   1435       basic_block label_bb = gimple_switch_label_bb (cfun, entry, i);
   1436       make_edge (bb, label_bb, 0);
   1437     }
   1438 }
   1439 
   1440 
   1441 /* Return the basic block holding label DEST.  */
   1442 
   1443 basic_block
   1444 label_to_block (struct function *ifun, tree dest)
   1445 {
   1446   int uid = LABEL_DECL_UID (dest);
   1447 
   1448   /* We would die hard when faced by an undefined label.  Emit a label to
   1449      the very first basic block.  This will hopefully make even the dataflow
   1450      and undefined variable warnings quite right.  */
   1451   if (seen_error () && uid < 0)
   1452     {
   1453       gimple_stmt_iterator gsi =
   1454 	gsi_start_bb (BASIC_BLOCK_FOR_FN (cfun, NUM_FIXED_BLOCKS));
   1455       gimple *stmt;
   1456 
   1457       stmt = gimple_build_label (dest);
   1458       gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
   1459       uid = LABEL_DECL_UID (dest);
   1460     }
   1461   if (vec_safe_length (ifun->cfg->x_label_to_block_map) <= (unsigned int) uid)
   1462     return NULL;
   1463   return (*ifun->cfg->x_label_to_block_map)[uid];
   1464 }
   1465 
   1466 /* Create edges for a goto statement at block BB.  Returns true
   1467    if abnormal edges should be created.  */
   1468 
   1469 static bool
   1470 make_goto_expr_edges (basic_block bb)
   1471 {
   1472   gimple_stmt_iterator last = gsi_last_bb (bb);
   1473   gimple *goto_t = gsi_stmt (last);
   1474 
   1475   /* A simple GOTO creates normal edges.  */
   1476   if (simple_goto_p (goto_t))
   1477     {
   1478       tree dest = gimple_goto_dest (goto_t);
   1479       basic_block label_bb = label_to_block (cfun, dest);
   1480       edge e = make_edge (bb, label_bb, EDGE_FALLTHRU);
   1481       e->goto_locus = gimple_location (goto_t);
   1482       gsi_remove (&last, true);
   1483       return false;
   1484     }
   1485 
   1486   /* A computed GOTO creates abnormal edges.  */
   1487   return true;
   1488 }
   1489 
   1490 /* Create edges for an asm statement with labels at block BB.  */
   1491 
   1492 static void
   1493 make_gimple_asm_edges (basic_block bb)
   1494 {
   1495   gasm *stmt = as_a <gasm *> (*gsi_last_bb (bb));
   1496   int i, n = gimple_asm_nlabels (stmt);
   1497 
   1498   for (i = 0; i < n; ++i)
   1499     {
   1500       tree label = TREE_VALUE (gimple_asm_label_op (stmt, i));
   1501       basic_block label_bb = label_to_block (cfun, label);
   1502       make_edge (bb, label_bb, 0);
   1503     }
   1504 }
   1505 
   1506 /*---------------------------------------------------------------------------
   1507 			       Flowgraph analysis
   1508 ---------------------------------------------------------------------------*/
   1509 
   1510 /* Cleanup useless labels in basic blocks.  This is something we wish
   1511    to do early because it allows us to group case labels before creating
   1512    the edges for the CFG, and it speeds up block statement iterators in
   1513    all passes later on.
   1514    We rerun this pass after CFG is created, to get rid of the labels that
   1515    are no longer referenced.  After then we do not run it any more, since
   1516    (almost) no new labels should be created.  */
   1517 
   1518 /* A map from basic block index to the leading label of that block.  */
   1519 struct label_record
   1520 {
   1521   /* The label.  */
   1522   tree label;
   1523 
   1524   /* True if the label is referenced from somewhere.  */
   1525   bool used;
   1526 };
   1527 
   1528 /* Given LABEL return the first label in the same basic block.  */
   1529 
   1530 static tree
   1531 main_block_label (tree label, label_record *label_for_bb)
   1532 {
   1533   basic_block bb = label_to_block (cfun, label);
   1534   tree main_label = label_for_bb[bb->index].label;
   1535 
   1536   /* label_to_block possibly inserted undefined label into the chain.  */
   1537   if (!main_label)
   1538     {
   1539       label_for_bb[bb->index].label = label;
   1540       main_label = label;
   1541     }
   1542 
   1543   label_for_bb[bb->index].used = true;
   1544   return main_label;
   1545 }
   1546 
   1547 /* Clean up redundant labels within the exception tree.  */
   1548 
   1549 static void
   1550 cleanup_dead_labels_eh (label_record *label_for_bb)
   1551 {
   1552   eh_landing_pad lp;
   1553   eh_region r;
   1554   tree lab;
   1555   int i;
   1556 
   1557   if (cfun->eh == NULL)
   1558     return;
   1559 
   1560   for (i = 1; vec_safe_iterate (cfun->eh->lp_array, i, &lp); ++i)
   1561     if (lp && lp->post_landing_pad)
   1562       {
   1563 	lab = main_block_label (lp->post_landing_pad, label_for_bb);
   1564 	if (lab != lp->post_landing_pad)
   1565 	  {
   1566 	    EH_LANDING_PAD_NR (lp->post_landing_pad) = 0;
   1567 	    lp->post_landing_pad = lab;
   1568 	    EH_LANDING_PAD_NR (lab) = lp->index;
   1569 	  }
   1570       }
   1571 
   1572   FOR_ALL_EH_REGION (r)
   1573     switch (r->type)
   1574       {
   1575       case ERT_CLEANUP:
   1576       case ERT_MUST_NOT_THROW:
   1577 	break;
   1578 
   1579       case ERT_TRY:
   1580 	{
   1581 	  eh_catch c;
   1582 	  for (c = r->u.eh_try.first_catch; c ; c = c->next_catch)
   1583 	    {
   1584 	      lab = c->label;
   1585 	      if (lab)
   1586 		c->label = main_block_label (lab, label_for_bb);
   1587 	    }
   1588 	}
   1589 	break;
   1590 
   1591       case ERT_ALLOWED_EXCEPTIONS:
   1592 	lab = r->u.allowed.label;
   1593 	if (lab)
   1594 	  r->u.allowed.label = main_block_label (lab, label_for_bb);
   1595 	break;
   1596       }
   1597 }
   1598 
   1599 
   1600 /* Cleanup redundant labels.  This is a three-step process:
   1601      1) Find the leading label for each block.
   1602      2) Redirect all references to labels to the leading labels.
   1603      3) Cleanup all useless labels.  */
   1604 
   1605 void
   1606 cleanup_dead_labels (void)
   1607 {
   1608   basic_block bb;
   1609   label_record *label_for_bb = XCNEWVEC (struct label_record,
   1610 					 last_basic_block_for_fn (cfun));
   1611 
   1612   /* Find a suitable label for each block.  We use the first user-defined
   1613      label if there is one, or otherwise just the first label we see.  */
   1614   FOR_EACH_BB_FN (bb, cfun)
   1615     {
   1616       gimple_stmt_iterator i;
   1617 
   1618       for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
   1619 	{
   1620 	  tree label;
   1621 	  glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (i));
   1622 
   1623 	  if (!label_stmt)
   1624 	    break;
   1625 
   1626 	  label = gimple_label_label (label_stmt);
   1627 
   1628 	  /* If we have not yet seen a label for the current block,
   1629 	     remember this one and see if there are more labels.  */
   1630 	  if (!label_for_bb[bb->index].label)
   1631 	    {
   1632 	      label_for_bb[bb->index].label = label;
   1633 	      continue;
   1634 	    }
   1635 
   1636 	  /* If we did see a label for the current block already, but it
   1637 	     is an artificially created label, replace it if the current
   1638 	     label is a user defined label.  */
   1639 	  if (!DECL_ARTIFICIAL (label)
   1640 	      && DECL_ARTIFICIAL (label_for_bb[bb->index].label))
   1641 	    {
   1642 	      label_for_bb[bb->index].label = label;
   1643 	      break;
   1644 	    }
   1645 	}
   1646     }
   1647 
   1648   /* Now redirect all jumps/branches to the selected label.
   1649      First do so for each block ending in a control statement.  */
   1650   FOR_EACH_BB_FN (bb, cfun)
   1651     {
   1652       gimple *stmt = *gsi_last_bb (bb);
   1653       tree label, new_label;
   1654 
   1655       if (!stmt)
   1656 	continue;
   1657 
   1658       switch (gimple_code (stmt))
   1659 	{
   1660 	case GIMPLE_COND:
   1661 	  {
   1662 	    gcond *cond_stmt = as_a <gcond *> (stmt);
   1663 	    label = gimple_cond_true_label (cond_stmt);
   1664 	    if (label)
   1665 	      {
   1666 		new_label = main_block_label (label, label_for_bb);
   1667 		if (new_label != label)
   1668 		  gimple_cond_set_true_label (cond_stmt, new_label);
   1669 	      }
   1670 
   1671 	    label = gimple_cond_false_label (cond_stmt);
   1672 	    if (label)
   1673 	      {
   1674 		new_label = main_block_label (label, label_for_bb);
   1675 		if (new_label != label)
   1676 		  gimple_cond_set_false_label (cond_stmt, new_label);
   1677 	      }
   1678 	  }
   1679 	  break;
   1680 
   1681 	case GIMPLE_SWITCH:
   1682 	  {
   1683 	    gswitch *switch_stmt = as_a <gswitch *> (stmt);
   1684 	    size_t i, n = gimple_switch_num_labels (switch_stmt);
   1685 
   1686 	    /* Replace all destination labels.  */
   1687 	    for (i = 0; i < n; ++i)
   1688 	      {
   1689 		tree case_label = gimple_switch_label (switch_stmt, i);
   1690 		label = CASE_LABEL (case_label);
   1691 		new_label = main_block_label (label, label_for_bb);
   1692 		if (new_label != label)
   1693 		  CASE_LABEL (case_label) = new_label;
   1694 	      }
   1695 	    break;
   1696 	  }
   1697 
   1698 	case GIMPLE_ASM:
   1699 	  {
   1700 	    gasm *asm_stmt = as_a <gasm *> (stmt);
   1701 	    int i, n = gimple_asm_nlabels (asm_stmt);
   1702 
   1703 	    for (i = 0; i < n; ++i)
   1704 	      {
   1705 		tree cons = gimple_asm_label_op (asm_stmt, i);
   1706 		tree label = main_block_label (TREE_VALUE (cons), label_for_bb);
   1707 		TREE_VALUE (cons) = label;
   1708 	      }
   1709 	    break;
   1710 	  }
   1711 
   1712 	/* We have to handle gotos until they're removed, and we don't
   1713 	   remove them until after we've created the CFG edges.  */
   1714 	case GIMPLE_GOTO:
   1715 	  if (!computed_goto_p (stmt))
   1716 	    {
   1717 	      ggoto *goto_stmt = as_a <ggoto *> (stmt);
   1718 	      label = gimple_goto_dest (goto_stmt);
   1719 	      new_label = main_block_label (label, label_for_bb);
   1720 	      if (new_label != label)
   1721 		gimple_goto_set_dest (goto_stmt, new_label);
   1722 	    }
   1723 	  break;
   1724 
   1725 	case GIMPLE_TRANSACTION:
   1726 	  {
   1727 	    gtransaction *txn = as_a <gtransaction *> (stmt);
   1728 
   1729 	    label = gimple_transaction_label_norm (txn);
   1730 	    if (label)
   1731 	      {
   1732 		new_label = main_block_label (label, label_for_bb);
   1733 		if (new_label != label)
   1734 		  gimple_transaction_set_label_norm (txn, new_label);
   1735 	      }
   1736 
   1737 	    label = gimple_transaction_label_uninst (txn);
   1738 	    if (label)
   1739 	      {
   1740 		new_label = main_block_label (label, label_for_bb);
   1741 		if (new_label != label)
   1742 		  gimple_transaction_set_label_uninst (txn, new_label);
   1743 	      }
   1744 
   1745 	    label = gimple_transaction_label_over (txn);
   1746 	    if (label)
   1747 	      {
   1748 		new_label = main_block_label (label, label_for_bb);
   1749 		if (new_label != label)
   1750 		  gimple_transaction_set_label_over (txn, new_label);
   1751 	      }
   1752 	  }
   1753 	  break;
   1754 
   1755 	default:
   1756 	  break;
   1757       }
   1758     }
   1759 
   1760   /* Do the same for the exception region tree labels.  */
   1761   cleanup_dead_labels_eh (label_for_bb);
   1762 
   1763   /* Finally, purge dead labels.  All user-defined labels and labels that
   1764      can be the target of non-local gotos and labels which have their
   1765      address taken are preserved.  */
   1766   FOR_EACH_BB_FN (bb, cfun)
   1767     {
   1768       gimple_stmt_iterator i;
   1769       tree label_for_this_bb = label_for_bb[bb->index].label;
   1770 
   1771       if (!label_for_this_bb)
   1772 	continue;
   1773 
   1774       /* If the main label of the block is unused, we may still remove it.  */
   1775       if (!label_for_bb[bb->index].used)
   1776 	label_for_this_bb = NULL;
   1777 
   1778       for (i = gsi_start_bb (bb); !gsi_end_p (i); )
   1779 	{
   1780 	  tree label;
   1781 	  glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (i));
   1782 
   1783 	  if (!label_stmt)
   1784 	    break;
   1785 
   1786 	  label = gimple_label_label (label_stmt);
   1787 
   1788 	  if (label == label_for_this_bb
   1789 	      || !DECL_ARTIFICIAL (label)
   1790 	      || DECL_NONLOCAL (label)
   1791 	      || FORCED_LABEL (label))
   1792 	    gsi_next (&i);
   1793 	  else
   1794 	    {
   1795 	      gcc_checking_assert (EH_LANDING_PAD_NR (label) == 0);
   1796 	      gsi_remove (&i, true);
   1797 	    }
   1798 	}
   1799     }
   1800 
   1801   free (label_for_bb);
   1802 }
   1803 
   1804 /* Scan the sorted vector of cases in STMT (a GIMPLE_SWITCH) and combine
   1805    the ones jumping to the same label.
   1806    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
   1807 
   1808 bool
   1809 group_case_labels_stmt (gswitch *stmt)
   1810 {
   1811   int old_size = gimple_switch_num_labels (stmt);
   1812   int i, next_index, new_size;
   1813   basic_block default_bb = NULL;
   1814   hash_set<tree> *removed_labels = NULL;
   1815 
   1816   default_bb = gimple_switch_default_bb (cfun, stmt);
   1817 
   1818   /* Look for possible opportunities to merge cases.  */
   1819   new_size = i = 1;
   1820   while (i < old_size)
   1821     {
   1822       tree base_case, base_high;
   1823       basic_block base_bb;
   1824 
   1825       base_case = gimple_switch_label (stmt, i);
   1826 
   1827       gcc_assert (base_case);
   1828       base_bb = label_to_block (cfun, CASE_LABEL (base_case));
   1829 
   1830       /* Discard cases that have the same destination as the default case or
   1831 	 whose destination blocks have already been removed as unreachable.  */
   1832       if (base_bb == NULL
   1833 	  || base_bb == default_bb
   1834 	  || (removed_labels
   1835 	      && removed_labels->contains (CASE_LABEL (base_case))))
   1836 	{
   1837 	  i++;
   1838 	  continue;
   1839 	}
   1840 
   1841       base_high = CASE_HIGH (base_case)
   1842 	  ? CASE_HIGH (base_case)
   1843 	  : CASE_LOW (base_case);
   1844       next_index = i + 1;
   1845 
   1846       /* Try to merge case labels.  Break out when we reach the end
   1847 	 of the label vector or when we cannot merge the next case
   1848 	 label with the current one.  */
   1849       while (next_index < old_size)
   1850 	{
   1851 	  tree merge_case = gimple_switch_label (stmt, next_index);
   1852 	  basic_block merge_bb = label_to_block (cfun, CASE_LABEL (merge_case));
   1853 	  wide_int bhp1 = wi::to_wide (base_high) + 1;
   1854 
   1855 	  /* Merge the cases if they jump to the same place,
   1856 	     and their ranges are consecutive.  */
   1857 	  if (merge_bb == base_bb
   1858 	      && (removed_labels == NULL
   1859 		  || !removed_labels->contains (CASE_LABEL (merge_case)))
   1860 	      && wi::to_wide (CASE_LOW (merge_case)) == bhp1)
   1861 	    {
   1862 	      base_high
   1863 		= (CASE_HIGH (merge_case)
   1864 		   ? CASE_HIGH (merge_case) : CASE_LOW (merge_case));
   1865 	      CASE_HIGH (base_case) = base_high;
   1866 	      next_index++;
   1867 	    }
   1868 	  else
   1869 	    break;
   1870 	}
   1871 
   1872       /* Discard cases that have an unreachable destination block.  */
   1873       if (EDGE_COUNT (base_bb->succs) == 0
   1874 	  && gimple_seq_unreachable_p (bb_seq (base_bb))
   1875 	  /* Don't optimize this if __builtin_unreachable () is the
   1876 	     implicitly added one by the C++ FE too early, before
   1877 	     -Wreturn-type can be diagnosed.  We'll optimize it later
   1878 	     during switchconv pass or any other cfg cleanup.  */
   1879 	  && (gimple_in_ssa_p (cfun)
   1880 	      || (LOCATION_LOCUS (gimple_location (last_nondebug_stmt (base_bb)))
   1881 		  != BUILTINS_LOCATION)))
   1882 	{
   1883 	  edge base_edge = find_edge (gimple_bb (stmt), base_bb);
   1884 	  if (base_edge != NULL)
   1885 	    {
   1886 	      for (gimple_stmt_iterator gsi = gsi_start_bb (base_bb);
   1887 		   !gsi_end_p (gsi); gsi_next (&gsi))
   1888 		if (glabel *stmt = dyn_cast <glabel *> (gsi_stmt (gsi)))
   1889 		  {
   1890 		    if (FORCED_LABEL (gimple_label_label (stmt))
   1891 			|| DECL_NONLOCAL (gimple_label_label (stmt)))
   1892 		      {
   1893 			/* Forced/non-local labels aren't going to be removed,
   1894 			   but they will be moved to some neighbouring basic
   1895 			   block. If some later case label refers to one of
   1896 			   those labels, we should throw that case away rather
   1897 			   than keeping it around and refering to some random
   1898 			   other basic block without an edge to it.  */
   1899 			if (removed_labels == NULL)
   1900 			  removed_labels = new hash_set<tree>;
   1901 			removed_labels->add (gimple_label_label (stmt));
   1902 		      }
   1903 		  }
   1904 		else
   1905 		  break;
   1906 	      remove_edge_and_dominated_blocks (base_edge);
   1907 	    }
   1908 	  i = next_index;
   1909 	  continue;
   1910 	}
   1911 
   1912       if (new_size < i)
   1913 	gimple_switch_set_label (stmt, new_size,
   1914 				 gimple_switch_label (stmt, i));
   1915       i = next_index;
   1916       new_size++;
   1917     }
   1918 
   1919   gcc_assert (new_size <= old_size);
   1920 
   1921   if (new_size < old_size)
   1922     gimple_switch_set_num_labels (stmt, new_size);
   1923 
   1924   delete removed_labels;
   1925   return new_size < old_size;
   1926 }
   1927 
   1928 /* Look for blocks ending in a multiway branch (a GIMPLE_SWITCH),
   1929    and scan the sorted vector of cases.  Combine the ones jumping to the
   1930    same label.  */
   1931 
   1932 bool
   1933 group_case_labels (void)
   1934 {
   1935   basic_block bb;
   1936   bool changed = false;
   1937 
   1938   FOR_EACH_BB_FN (bb, cfun)
   1939     {
   1940       if (gswitch *stmt = safe_dyn_cast <gswitch *> (*gsi_last_bb (bb)))
   1941 	changed |= group_case_labels_stmt (stmt);
   1942     }
   1943 
   1944   return changed;
   1945 }
   1946 
   1947 /* Checks whether we can merge block B into block A.  */
   1948 
   1949 static bool
   1950 gimple_can_merge_blocks_p (basic_block a, basic_block b)
   1951 {
   1952   gimple *stmt;
   1953 
   1954   if (!single_succ_p (a))
   1955     return false;
   1956 
   1957   if (single_succ_edge (a)->flags & EDGE_COMPLEX)
   1958     return false;
   1959 
   1960   if (single_succ (a) != b)
   1961     return false;
   1962 
   1963   if (!single_pred_p (b))
   1964     return false;
   1965 
   1966   if (a == ENTRY_BLOCK_PTR_FOR_FN (cfun)
   1967       || b == EXIT_BLOCK_PTR_FOR_FN (cfun))
   1968     return false;
   1969 
   1970   /* If A ends by a statement causing exceptions or something similar, we
   1971      cannot merge the blocks.  */
   1972   stmt = *gsi_last_bb (a);
   1973   if (stmt && stmt_ends_bb_p (stmt))
   1974     return false;
   1975 
   1976   /* Examine the labels at the beginning of B.  */
   1977   for (gimple_stmt_iterator gsi = gsi_start_bb (b); !gsi_end_p (gsi);
   1978        gsi_next (&gsi))
   1979     {
   1980       tree lab;
   1981       glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (gsi));
   1982       if (!label_stmt)
   1983 	break;
   1984       lab = gimple_label_label (label_stmt);
   1985 
   1986       /* Do not remove user forced labels or for -O0 any user labels.  */
   1987       if (!DECL_ARTIFICIAL (lab) && (!optimize || FORCED_LABEL (lab)))
   1988 	return false;
   1989     }
   1990 
   1991   /* Protect simple loop latches.  We only want to avoid merging
   1992      the latch with the loop header or with a block in another
   1993      loop in this case.  */
   1994   if (current_loops
   1995       && b->loop_father->latch == b
   1996       && loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES)
   1997       && (b->loop_father->header == a
   1998 	  || b->loop_father != a->loop_father))
   1999     return false;
   2000 
   2001   /* It must be possible to eliminate all phi nodes in B.  If ssa form
   2002      is not up-to-date and a name-mapping is registered, we cannot eliminate
   2003      any phis.  Symbols marked for renaming are never a problem though.  */
   2004   for (gphi_iterator gsi = gsi_start_phis (b); !gsi_end_p (gsi);
   2005        gsi_next (&gsi))
   2006     {
   2007       gphi *phi = gsi.phi ();
   2008       /* Technically only new names matter.  */
   2009       if (name_registered_for_update_p (PHI_RESULT (phi)))
   2010 	return false;
   2011     }
   2012 
   2013   /* When not optimizing, don't merge if we'd lose goto_locus.  */
   2014   if (!optimize
   2015       && single_succ_edge (a)->goto_locus != UNKNOWN_LOCATION)
   2016     {
   2017       location_t goto_locus = single_succ_edge (a)->goto_locus;
   2018       gimple_stmt_iterator prev, next;
   2019       prev = gsi_last_nondebug_bb (a);
   2020       next = gsi_after_labels (b);
   2021       if (!gsi_end_p (next) && is_gimple_debug (gsi_stmt (next)))
   2022 	gsi_next_nondebug (&next);
   2023       if ((gsi_end_p (prev)
   2024 	   || gimple_location (gsi_stmt (prev)) != goto_locus)
   2025 	  && (gsi_end_p (next)
   2026 	      || gimple_location (gsi_stmt (next)) != goto_locus))
   2027 	return false;
   2028     }
   2029 
   2030   return true;
   2031 }
   2032 
   2033 /* Replaces all uses of NAME by VAL.  */
   2034 
   2035 void
   2036 replace_uses_by (tree name, tree val)
   2037 {
   2038   imm_use_iterator imm_iter;
   2039   use_operand_p use;
   2040   gimple *stmt;
   2041   edge e;
   2042 
   2043   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
   2044     {
   2045       /* Mark the block if we change the last stmt in it.  */
   2046       if (cfgcleanup_altered_bbs
   2047 	  && stmt_ends_bb_p (stmt))
   2048 	bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
   2049 
   2050       FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
   2051         {
   2052 	  replace_exp (use, val);
   2053 
   2054 	  if (gimple_code (stmt) == GIMPLE_PHI)
   2055 	    {
   2056 	      e = gimple_phi_arg_edge (as_a <gphi *> (stmt),
   2057 				       PHI_ARG_INDEX_FROM_USE (use));
   2058 	      if (e->flags & EDGE_ABNORMAL
   2059 		  && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val))
   2060 		{
   2061 		  /* This can only occur for virtual operands, since
   2062 		     for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
   2063 		     would prevent replacement.  */
   2064 		  gcc_checking_assert (virtual_operand_p (name));
   2065 		  SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
   2066 		}
   2067 	    }
   2068 	}
   2069 
   2070       if (gimple_code (stmt) != GIMPLE_PHI)
   2071 	{
   2072 	  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
   2073 	  gimple *orig_stmt = stmt;
   2074 	  size_t i;
   2075 
   2076 	  /* FIXME.  It shouldn't be required to keep TREE_CONSTANT
   2077 	     on ADDR_EXPRs up-to-date on GIMPLE.  Propagation will
   2078 	     only change sth from non-invariant to invariant, and only
   2079 	     when propagating constants.  */
   2080 	  if (is_gimple_min_invariant (val))
   2081 	    for (i = 0; i < gimple_num_ops (stmt); i++)
   2082 	      {
   2083 		tree op = gimple_op (stmt, i);
   2084 		/* Operands may be empty here.  For example, the labels
   2085 		   of a GIMPLE_COND are nulled out following the creation
   2086 		   of the corresponding CFG edges.  */
   2087 		if (op && TREE_CODE (op) == ADDR_EXPR)
   2088 		  recompute_tree_invariant_for_addr_expr (op);
   2089 	      }
   2090 
   2091 	  if (fold_stmt (&gsi))
   2092 	    stmt = gsi_stmt (gsi);
   2093 
   2094 	  if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
   2095 	    gimple_purge_dead_eh_edges (gimple_bb (stmt));
   2096 
   2097 	  update_stmt (stmt);
   2098 	}
   2099     }
   2100 
   2101   gcc_checking_assert (has_zero_uses (name));
   2102 
   2103   /* Also update the trees stored in loop structures.  */
   2104   if (current_loops)
   2105     {
   2106       for (auto loop : loops_list (cfun, 0))
   2107 	  substitute_in_loop_info (loop, name, val);
   2108     }
   2109 }
   2110 
   2111 /* Merge block B into block A.  */
   2112 
   2113 static void
   2114 gimple_merge_blocks (basic_block a, basic_block b)
   2115 {
   2116   gimple_stmt_iterator last, gsi;
   2117   gphi_iterator psi;
   2118 
   2119   if (dump_file)
   2120     fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
   2121 
   2122   /* Remove all single-valued PHI nodes from block B of the form
   2123      V_i = PHI <V_j> by propagating V_j to all the uses of V_i.  */
   2124   gsi = gsi_last_bb (a);
   2125   for (psi = gsi_start_phis (b); !gsi_end_p (psi); )
   2126     {
   2127       gimple *phi = gsi_stmt (psi);
   2128       tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
   2129       gimple *copy;
   2130       bool may_replace_uses = (virtual_operand_p (def)
   2131 			       || may_propagate_copy (def, use));
   2132 
   2133       /* In case we maintain loop closed ssa form, do not propagate arguments
   2134 	 of loop exit phi nodes.  */
   2135       if (current_loops
   2136 	  && loops_state_satisfies_p (LOOP_CLOSED_SSA)
   2137 	  && !virtual_operand_p (def)
   2138 	  && TREE_CODE (use) == SSA_NAME
   2139 	  && a->loop_father != b->loop_father)
   2140 	may_replace_uses = false;
   2141 
   2142       if (!may_replace_uses)
   2143 	{
   2144 	  gcc_assert (!virtual_operand_p (def));
   2145 
   2146 	  /* Note that just emitting the copies is fine -- there is no problem
   2147 	     with ordering of phi nodes.  This is because A is the single
   2148 	     predecessor of B, therefore results of the phi nodes cannot
   2149 	     appear as arguments of the phi nodes.  */
   2150 	  copy = gimple_build_assign (def, use);
   2151 	  gsi_insert_after (&gsi, copy, GSI_NEW_STMT);
   2152           remove_phi_node (&psi, false);
   2153 	}
   2154       else
   2155         {
   2156 	  /* If we deal with a PHI for virtual operands, we can simply
   2157 	     propagate these without fussing with folding or updating
   2158 	     the stmt.  */
   2159 	  if (virtual_operand_p (def))
   2160 	    {
   2161 	      imm_use_iterator iter;
   2162 	      use_operand_p use_p;
   2163 	      gimple *stmt;
   2164 
   2165 	      FOR_EACH_IMM_USE_STMT (stmt, iter, def)
   2166 		FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
   2167 		  SET_USE (use_p, use);
   2168 
   2169 	      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
   2170 		SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use) = 1;
   2171 	    }
   2172 	  else
   2173             replace_uses_by (def, use);
   2174 
   2175           remove_phi_node (&psi, true);
   2176         }
   2177     }
   2178 
   2179   /* Ensure that B follows A.  */
   2180   move_block_after (b, a);
   2181 
   2182   gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
   2183   gcc_assert (!*gsi_last_bb (a)
   2184 	      || !stmt_ends_bb_p (*gsi_last_bb (a)));
   2185 
   2186   /* Remove labels from B and set gimple_bb to A for other statements.  */
   2187   for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);)
   2188     {
   2189       gimple *stmt = gsi_stmt (gsi);
   2190       if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
   2191 	{
   2192 	  tree label = gimple_label_label (label_stmt);
   2193 	  int lp_nr;
   2194 
   2195 	  gsi_remove (&gsi, false);
   2196 
   2197 	  /* Now that we can thread computed gotos, we might have
   2198 	     a situation where we have a forced label in block B
   2199 	     However, the label at the start of block B might still be
   2200 	     used in other ways (think about the runtime checking for
   2201 	     Fortran assigned gotos).  So we cannot just delete the
   2202 	     label.  Instead we move the label to the start of block A.  */
   2203 	  if (FORCED_LABEL (label))
   2204 	    {
   2205 	      gimple_stmt_iterator dest_gsi = gsi_start_bb (a);
   2206 	      tree first_label = NULL_TREE;
   2207 	      if (!gsi_end_p (dest_gsi))
   2208 		if (glabel *first_label_stmt
   2209 		    = dyn_cast <glabel *> (gsi_stmt (dest_gsi)))
   2210 		  first_label = gimple_label_label (first_label_stmt);
   2211 	      if (first_label
   2212 		  && (DECL_NONLOCAL (first_label)
   2213 		      || EH_LANDING_PAD_NR (first_label) != 0))
   2214 		gsi_insert_after (&dest_gsi, stmt, GSI_NEW_STMT);
   2215 	      else
   2216 		gsi_insert_before (&dest_gsi, stmt, GSI_NEW_STMT);
   2217 	    }
   2218 	  /* Other user labels keep around in a form of a debug stmt.  */
   2219 	  else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_BIND_STMTS)
   2220 	    {
   2221 	      gimple *dbg = gimple_build_debug_bind (label,
   2222 						     integer_zero_node,
   2223 						     stmt);
   2224 	      gimple_debug_bind_reset_value (dbg);
   2225 	      gsi_insert_before (&gsi, dbg, GSI_SAME_STMT);
   2226 	    }
   2227 
   2228 	  lp_nr = EH_LANDING_PAD_NR (label);
   2229 	  if (lp_nr)
   2230 	    {
   2231 	      eh_landing_pad lp = get_eh_landing_pad_from_number (lp_nr);
   2232 	      lp->post_landing_pad = NULL;
   2233 	    }
   2234 	}
   2235       else
   2236 	{
   2237 	  gimple_set_bb (stmt, a);
   2238 	  gsi_next (&gsi);
   2239 	}
   2240     }
   2241 
   2242   /* When merging two BBs, if their counts are different, the larger count
   2243      is selected as the new bb count. This is to handle inconsistent
   2244      profiles.  */
   2245   if (a->loop_father == b->loop_father)
   2246     {
   2247       a->count = a->count.merge (b->count);
   2248     }
   2249 
   2250   /* Merge the sequences.  */
   2251   last = gsi_last_bb (a);
   2252   gsi_insert_seq_after (&last, bb_seq (b), GSI_NEW_STMT);
   2253   set_bb_seq (b, NULL);
   2254 
   2255   if (cfgcleanup_altered_bbs)
   2256     bitmap_set_bit (cfgcleanup_altered_bbs, a->index);
   2257 }
   2258 
   2259 
   2260 /* Return the one of two successors of BB that is not reachable by a
   2261    complex edge, if there is one.  Else, return BB.  We use
   2262    this in optimizations that use post-dominators for their heuristics,
   2263    to catch the cases in C++ where function calls are involved.  */
   2264 
   2265 basic_block
   2266 single_noncomplex_succ (basic_block bb)
   2267 {
   2268   edge e0, e1;
   2269   if (EDGE_COUNT (bb->succs) != 2)
   2270     return bb;
   2271 
   2272   e0 = EDGE_SUCC (bb, 0);
   2273   e1 = EDGE_SUCC (bb, 1);
   2274   if (e0->flags & EDGE_COMPLEX)
   2275     return e1->dest;
   2276   if (e1->flags & EDGE_COMPLEX)
   2277     return e0->dest;
   2278 
   2279   return bb;
   2280 }
   2281 
   2282 /* T is CALL_EXPR.  Set current_function_calls_* flags.  */
   2283 
   2284 void
   2285 notice_special_calls (gcall *call)
   2286 {
   2287   int flags = gimple_call_flags (call);
   2288 
   2289   if (flags & ECF_MAY_BE_ALLOCA)
   2290     cfun->calls_alloca = true;
   2291   if (flags & ECF_RETURNS_TWICE)
   2292     cfun->calls_setjmp = true;
   2293 }
   2294 
   2295 
   2296 /* Clear flags set by notice_special_calls.  Used by dead code removal
   2297    to update the flags.  */
   2298 
   2299 void
   2300 clear_special_calls (void)
   2301 {
   2302   cfun->calls_alloca = false;
   2303   cfun->calls_setjmp = false;
   2304 }
   2305 
   2306 /* Remove PHI nodes associated with basic block BB and all edges out of BB.  */
   2307 
   2308 static void
   2309 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
   2310 {
   2311   /* Since this block is no longer reachable, we can just delete all
   2312      of its PHI nodes.  */
   2313   remove_phi_nodes (bb);
   2314 
   2315   /* Remove edges to BB's successors.  */
   2316   while (EDGE_COUNT (bb->succs) > 0)
   2317     remove_edge (EDGE_SUCC (bb, 0));
   2318 }
   2319 
   2320 
   2321 /* Remove statements of basic block BB.  */
   2322 
   2323 static void
   2324 remove_bb (basic_block bb)
   2325 {
   2326   gimple_stmt_iterator i;
   2327 
   2328   if (dump_file)
   2329     {
   2330       fprintf (dump_file, "Removing basic block %d\n", bb->index);
   2331       if (dump_flags & TDF_DETAILS)
   2332 	{
   2333 	  dump_bb (dump_file, bb, 0, TDF_BLOCKS);
   2334 	  fprintf (dump_file, "\n");
   2335 	}
   2336     }
   2337 
   2338   if (current_loops)
   2339     {
   2340       class loop *loop = bb->loop_father;
   2341 
   2342       /* If a loop gets removed, clean up the information associated
   2343 	 with it.  */
   2344       if (loop->latch == bb
   2345 	  || loop->header == bb)
   2346 	free_numbers_of_iterations_estimates (loop);
   2347     }
   2348 
   2349   /* Remove all the instructions in the block.  */
   2350   if (bb_seq (bb) != NULL)
   2351     {
   2352       /* Walk backwards so as to get a chance to substitute all
   2353 	 released DEFs into debug stmts.  See
   2354 	 eliminate_unnecessary_stmts() in tree-ssa-dce.cc for more
   2355 	 details.  */
   2356       for (i = gsi_last_bb (bb); !gsi_end_p (i);)
   2357 	{
   2358 	  gimple *stmt = gsi_stmt (i);
   2359 	  glabel *label_stmt = dyn_cast <glabel *> (stmt);
   2360 	  if (label_stmt
   2361 	      && (FORCED_LABEL (gimple_label_label (label_stmt))
   2362 		  || DECL_NONLOCAL (gimple_label_label (label_stmt))))
   2363 	    {
   2364 	      basic_block new_bb;
   2365 	      gimple_stmt_iterator new_gsi;
   2366 
   2367 	      /* A non-reachable non-local label may still be referenced.
   2368 		 But it no longer needs to carry the extra semantics of
   2369 		 non-locality.  */
   2370 	      if (DECL_NONLOCAL (gimple_label_label (label_stmt)))
   2371 		{
   2372 		  DECL_NONLOCAL (gimple_label_label (label_stmt)) = 0;
   2373 		  FORCED_LABEL (gimple_label_label (label_stmt)) = 1;
   2374 		}
   2375 
   2376 	      new_bb = bb->prev_bb;
   2377 	      /* Don't move any labels into ENTRY block.  */
   2378 	      if (new_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
   2379 		{
   2380 		  new_bb = single_succ (new_bb);
   2381 		  gcc_assert (new_bb != bb);
   2382 		}
   2383 	      if ((unsigned) bb->index < bb_to_omp_idx.length ()
   2384 		  && ((unsigned) new_bb->index >= bb_to_omp_idx.length ()
   2385 		      || (bb_to_omp_idx[bb->index]
   2386 			  != bb_to_omp_idx[new_bb->index])))
   2387 		{
   2388 		  /* During cfg pass make sure to put orphaned labels
   2389 		     into the right OMP region.  */
   2390 		  unsigned int i;
   2391 		  int idx;
   2392 		  new_bb = NULL;
   2393 		  FOR_EACH_VEC_ELT (bb_to_omp_idx, i, idx)
   2394 		    if (i >= NUM_FIXED_BLOCKS
   2395 			&& idx == bb_to_omp_idx[bb->index]
   2396 			&& i != (unsigned) bb->index)
   2397 		      {
   2398 			new_bb = BASIC_BLOCK_FOR_FN (cfun, i);
   2399 			break;
   2400 		      }
   2401 		  if (new_bb == NULL)
   2402 		    {
   2403 		      new_bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
   2404 		      gcc_assert (new_bb != bb);
   2405 		    }
   2406 		}
   2407 	      new_gsi = gsi_after_labels (new_bb);
   2408 	      gsi_remove (&i, false);
   2409 	      gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
   2410 	    }
   2411 	  else
   2412 	    {
   2413 	      /* Release SSA definitions.  */
   2414 	      release_defs (stmt);
   2415 	      gsi_remove (&i, true);
   2416 	    }
   2417 
   2418 	  if (gsi_end_p (i))
   2419 	    i = gsi_last_bb (bb);
   2420 	  else
   2421 	    gsi_prev (&i);
   2422 	}
   2423     }
   2424 
   2425   if ((unsigned) bb->index < bb_to_omp_idx.length ())
   2426     bb_to_omp_idx[bb->index] = -1;
   2427   remove_phi_nodes_and_edges_for_unreachable_block (bb);
   2428   bb->il.gimple.seq = NULL;
   2429   bb->il.gimple.phi_nodes = NULL;
   2430 }
   2431 
   2432 
   2433 /* Given a basic block BB and a value VAL for use in the final statement
   2434    of the block (if a GIMPLE_COND, GIMPLE_SWITCH, or computed goto), return
   2435    the edge that will be taken out of the block.
   2436    If VAL is NULL_TREE, then the current value of the final statement's
   2437    predicate or index is used.
   2438    If the value does not match a unique edge, NULL is returned.  */
   2439 
   2440 edge
   2441 find_taken_edge (basic_block bb, tree val)
   2442 {
   2443   gimple *stmt;
   2444 
   2445   stmt = *gsi_last_bb (bb);
   2446 
   2447   /* Handle ENTRY and EXIT.  */
   2448   if (!stmt)
   2449     ;
   2450 
   2451   else if (gimple_code (stmt) == GIMPLE_COND)
   2452     return find_taken_edge_cond_expr (as_a <gcond *> (stmt), val);
   2453 
   2454   else if (gimple_code (stmt) == GIMPLE_SWITCH)
   2455     return find_taken_edge_switch_expr (as_a <gswitch *> (stmt), val);
   2456 
   2457   else if (computed_goto_p (stmt))
   2458     {
   2459       /* Only optimize if the argument is a label, if the argument is
   2460 	 not a label then we cannot construct a proper CFG.
   2461 
   2462          It may be the case that we only need to allow the LABEL_REF to
   2463          appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
   2464          appear inside a LABEL_EXPR just to be safe.  */
   2465       if (val
   2466 	  && (TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
   2467 	  && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
   2468 	return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
   2469     }
   2470 
   2471   /* Otherwise we only know the taken successor edge if it's unique.  */
   2472   return single_succ_p (bb) ? single_succ_edge (bb) : NULL;
   2473 }
   2474 
   2475 /* Given a constant value VAL and the entry block BB to a GOTO_EXPR
   2476    statement, determine which of the outgoing edges will be taken out of the
   2477    block.  Return NULL if either edge may be taken.  */
   2478 
   2479 static edge
   2480 find_taken_edge_computed_goto (basic_block bb, tree val)
   2481 {
   2482   basic_block dest;
   2483   edge e = NULL;
   2484 
   2485   dest = label_to_block (cfun, val);
   2486   if (dest)
   2487     e = find_edge (bb, dest);
   2488 
   2489   /* It's possible for find_edge to return NULL here on invalid code
   2490      that abuses the labels-as-values extension (e.g. code that attempts to
   2491      jump *between* functions via stored labels-as-values; PR 84136).
   2492      If so, then we simply return that NULL for the edge.
   2493      We don't currently have a way of detecting such invalid code, so we
   2494      can't assert that it was the case when a NULL edge occurs here.  */
   2495 
   2496   return e;
   2497 }
   2498 
   2499 /* Given COND_STMT and a constant value VAL for use as the predicate,
   2500    determine which of the two edges will be taken out of
   2501    the statement's block.  Return NULL if either edge may be taken.
   2502    If VAL is NULL_TREE, then the current value of COND_STMT's predicate
   2503    is used.  */
   2504 
   2505 static edge
   2506 find_taken_edge_cond_expr (const gcond *cond_stmt, tree val)
   2507 {
   2508   edge true_edge, false_edge;
   2509 
   2510   if (val == NULL_TREE)
   2511     {
   2512       /* Use the current value of the predicate.  */
   2513       if (gimple_cond_true_p (cond_stmt))
   2514 	val = integer_one_node;
   2515       else if (gimple_cond_false_p (cond_stmt))
   2516 	val = integer_zero_node;
   2517       else
   2518 	return NULL;
   2519     }
   2520   else if (TREE_CODE (val) != INTEGER_CST)
   2521     return NULL;
   2522 
   2523   extract_true_false_edges_from_block (gimple_bb (cond_stmt),
   2524 				       &true_edge, &false_edge);
   2525 
   2526   return (integer_zerop (val) ? false_edge : true_edge);
   2527 }
   2528 
   2529 /* Given SWITCH_STMT and an INTEGER_CST VAL for use as the index, determine
   2530    which edge will be taken out of the statement's block.  Return NULL if any
   2531    edge may be taken.
   2532    If VAL is NULL_TREE, then the current value of SWITCH_STMT's index
   2533    is used.  */
   2534 
   2535 edge
   2536 find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val)
   2537 {
   2538   basic_block dest_bb;
   2539   edge e;
   2540   tree taken_case;
   2541 
   2542   if (gimple_switch_num_labels (switch_stmt) == 1)
   2543     taken_case = gimple_switch_default_label (switch_stmt);
   2544   else
   2545     {
   2546       if (val == NULL_TREE)
   2547 	val = gimple_switch_index (switch_stmt);
   2548       if (TREE_CODE (val) != INTEGER_CST)
   2549 	return NULL;
   2550       else
   2551 	taken_case = find_case_label_for_value (switch_stmt, val);
   2552     }
   2553   dest_bb = label_to_block (cfun, CASE_LABEL (taken_case));
   2554 
   2555   e = find_edge (gimple_bb (switch_stmt), dest_bb);
   2556   gcc_assert (e);
   2557   return e;
   2558 }
   2559 
   2560 
   2561 /* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
   2562    We can make optimal use here of the fact that the case labels are
   2563    sorted: We can do a binary search for a case matching VAL.  */
   2564 
   2565 tree
   2566 find_case_label_for_value (const gswitch *switch_stmt, tree val)
   2567 {
   2568   size_t low, high, n = gimple_switch_num_labels (switch_stmt);
   2569   tree default_case = gimple_switch_default_label (switch_stmt);
   2570 
   2571   for (low = 0, high = n; high - low > 1; )
   2572     {
   2573       size_t i = (high + low) / 2;
   2574       tree t = gimple_switch_label (switch_stmt, i);
   2575       int cmp;
   2576 
   2577       /* Cache the result of comparing CASE_LOW and val.  */
   2578       cmp = tree_int_cst_compare (CASE_LOW (t), val);
   2579 
   2580       if (cmp > 0)
   2581 	high = i;
   2582       else
   2583 	low = i;
   2584 
   2585       if (CASE_HIGH (t) == NULL)
   2586 	{
   2587 	  /* A singe-valued case label.  */
   2588 	  if (cmp == 0)
   2589 	    return t;
   2590 	}
   2591       else
   2592 	{
   2593 	  /* A case range.  We can only handle integer ranges.  */
   2594 	  if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
   2595 	    return t;
   2596 	}
   2597     }
   2598 
   2599   return default_case;
   2600 }
   2601 
   2602 
   2603 /* Dump a basic block on stderr.  */
   2604 
   2605 void
   2606 gimple_debug_bb (basic_block bb)
   2607 {
   2608   dump_bb (stderr, bb, 0, TDF_VOPS|TDF_MEMSYMS|TDF_BLOCKS);
   2609 }
   2610 
   2611 
   2612 /* Dump basic block with index N on stderr.  */
   2613 
   2614 basic_block
   2615 gimple_debug_bb_n (int n)
   2616 {
   2617   gimple_debug_bb (BASIC_BLOCK_FOR_FN (cfun, n));
   2618   return BASIC_BLOCK_FOR_FN (cfun, n);
   2619 }
   2620 
   2621 
   2622 /* Dump the CFG on stderr.
   2623 
   2624    FLAGS are the same used by the tree dumping functions
   2625    (see TDF_* in dumpfile.h).  */
   2626 
   2627 void
   2628 gimple_debug_cfg (dump_flags_t flags)
   2629 {
   2630   gimple_dump_cfg (stderr, flags);
   2631 }
   2632 
   2633 
   2634 /* Dump the program showing basic block boundaries on the given FILE.
   2635 
   2636    FLAGS are the same used by the tree dumping functions (see TDF_* in
   2637    tree.h).  */
   2638 
   2639 void
   2640 gimple_dump_cfg (FILE *file, dump_flags_t flags)
   2641 {
   2642   if (flags & TDF_DETAILS)
   2643     {
   2644       dump_function_header (file, current_function_decl, flags);
   2645       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
   2646 	       n_basic_blocks_for_fn (cfun), n_edges_for_fn (cfun),
   2647 	       last_basic_block_for_fn (cfun));
   2648 
   2649       brief_dump_cfg (file, flags);
   2650       fprintf (file, "\n");
   2651     }
   2652 
   2653   if (flags & TDF_STATS)
   2654     dump_cfg_stats (file);
   2655 
   2656   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
   2657 }
   2658 
   2659 
   2660 /* Dump CFG statistics on FILE.  */
   2661 
   2662 void
   2663 dump_cfg_stats (FILE *file)
   2664 {
   2665   static long max_num_merged_labels = 0;
   2666   unsigned long size, total = 0;
   2667   long num_edges;
   2668   basic_block bb;
   2669   const char * const fmt_str   = "%-30s%-13s%12s\n";
   2670   const char * const fmt_str_1 = "%-30s%13d" PRsa (11) "\n";
   2671   const char * const fmt_str_2 = "%-30s%13ld" PRsa (11) "\n";
   2672   const char * const fmt_str_3 = "%-43s" PRsa (11) "\n";
   2673   const char *funcname = current_function_name ();
   2674 
   2675   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
   2676 
   2677   fprintf (file, "---------------------------------------------------------\n");
   2678   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
   2679   fprintf (file, fmt_str, "", "  instances  ", "used ");
   2680   fprintf (file, "---------------------------------------------------------\n");
   2681 
   2682   size = n_basic_blocks_for_fn (cfun) * sizeof (struct basic_block_def);
   2683   total += size;
   2684   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks_for_fn (cfun),
   2685 	   SIZE_AMOUNT (size));
   2686 
   2687   num_edges = 0;
   2688   FOR_EACH_BB_FN (bb, cfun)
   2689     num_edges += EDGE_COUNT (bb->succs);
   2690   size = num_edges * sizeof (class edge_def);
   2691   total += size;
   2692   fprintf (file, fmt_str_2, "Edges", num_edges, SIZE_AMOUNT (size));
   2693 
   2694   fprintf (file, "---------------------------------------------------------\n");
   2695   fprintf (file, fmt_str_3, "Total memory used by CFG data",
   2696 	   SIZE_AMOUNT (total));
   2697   fprintf (file, "---------------------------------------------------------\n");
   2698   fprintf (file, "\n");
   2699 
   2700   if (cfg_stats.num_merged_labels > max_num_merged_labels)
   2701     max_num_merged_labels = cfg_stats.num_merged_labels;
   2702 
   2703   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
   2704 	   cfg_stats.num_merged_labels, max_num_merged_labels);
   2705 
   2706   fprintf (file, "\n");
   2707 }
   2708 
   2709 
   2710 /* Dump CFG statistics on stderr.  Keep extern so that it's always
   2711    linked in the final executable.  */
   2712 
   2713 DEBUG_FUNCTION void
   2714 debug_cfg_stats (void)
   2715 {
   2716   dump_cfg_stats (stderr);
   2717 }
   2718 
   2719 /*---------------------------------------------------------------------------
   2720 			     Miscellaneous helpers
   2721 ---------------------------------------------------------------------------*/
   2722 
   2723 /* Return true if T, a GIMPLE_CALL, can make an abnormal transfer of control
   2724    flow.  Transfers of control flow associated with EH are excluded.  */
   2725 
   2726 static bool
   2727 call_can_make_abnormal_goto (gimple *t)
   2728 {
   2729   /* If the function has no non-local labels, then a call cannot make an
   2730      abnormal transfer of control.  */
   2731   if (!cfun->has_nonlocal_label
   2732       && !cfun->calls_setjmp)
   2733    return false;
   2734 
   2735   /* Likewise if the call has no side effects.  */
   2736   if (!gimple_has_side_effects (t))
   2737     return false;
   2738 
   2739   /* Likewise if the called function is leaf.  */
   2740   if (gimple_call_flags (t) & ECF_LEAF)
   2741     return false;
   2742 
   2743   return true;
   2744 }
   2745 
   2746 
   2747 /* Return true if T can make an abnormal transfer of control flow.
   2748    Transfers of control flow associated with EH are excluded.  */
   2749 
   2750 bool
   2751 stmt_can_make_abnormal_goto (gimple *t)
   2752 {
   2753   if (computed_goto_p (t))
   2754     return true;
   2755   if (is_gimple_call (t))
   2756     return call_can_make_abnormal_goto (t);
   2757   return false;
   2758 }
   2759 
   2760 
   2761 /* Return true if T represents a stmt that always transfers control.  */
   2762 
   2763 bool
   2764 is_ctrl_stmt (gimple *t)
   2765 {
   2766   switch (gimple_code (t))
   2767     {
   2768     case GIMPLE_COND:
   2769     case GIMPLE_SWITCH:
   2770     case GIMPLE_GOTO:
   2771     case GIMPLE_RETURN:
   2772     case GIMPLE_RESX:
   2773       return true;
   2774     default:
   2775       return false;
   2776     }
   2777 }
   2778 
   2779 
   2780 /* Return true if T is a statement that may alter the flow of control
   2781    (e.g., a call to a non-returning function).  */
   2782 
   2783 bool
   2784 is_ctrl_altering_stmt (gimple *t)
   2785 {
   2786   gcc_assert (t);
   2787 
   2788   switch (gimple_code (t))
   2789     {
   2790     case GIMPLE_CALL:
   2791       /* Per stmt call flag indicates whether the call could alter
   2792 	 controlflow.  */
   2793       if (gimple_call_ctrl_altering_p (t))
   2794 	return true;
   2795       break;
   2796 
   2797     case GIMPLE_EH_DISPATCH:
   2798       /* EH_DISPATCH branches to the individual catch handlers at
   2799 	 this level of a try or allowed-exceptions region.  It can
   2800 	 fallthru to the next statement as well.  */
   2801       return true;
   2802 
   2803     case GIMPLE_ASM:
   2804       if (gimple_asm_nlabels (as_a <gasm *> (t)) > 0)
   2805 	return true;
   2806       break;
   2807 
   2808     CASE_GIMPLE_OMP:
   2809       /* OpenMP directives alter control flow.  */
   2810       return true;
   2811 
   2812     case GIMPLE_TRANSACTION:
   2813       /* A transaction start alters control flow.  */
   2814       return true;
   2815 
   2816     default:
   2817       break;
   2818     }
   2819 
   2820   /* If a statement can throw, it alters control flow.  */
   2821   return stmt_can_throw_internal (cfun, t);
   2822 }
   2823 
   2824 
   2825 /* Return true if T is a simple local goto.  */
   2826 
   2827 bool
   2828 simple_goto_p (gimple *t)
   2829 {
   2830   return (gimple_code (t) == GIMPLE_GOTO
   2831 	  && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
   2832 }
   2833 
   2834 
   2835 /* Return true if STMT should start a new basic block.  PREV_STMT is
   2836    the statement preceding STMT.  It is used when STMT is a label or a
   2837    case label.  Labels should only start a new basic block if their
   2838    previous statement wasn't a label.  Otherwise, sequence of labels
   2839    would generate unnecessary basic blocks that only contain a single
   2840    label.  */
   2841 
   2842 static inline bool
   2843 stmt_starts_bb_p (gimple *stmt, gimple *prev_stmt)
   2844 {
   2845   if (stmt == NULL)
   2846     return false;
   2847 
   2848   /* PREV_STMT is only set to a debug stmt if the debug stmt is before
   2849      any nondebug stmts in the block.  We don't want to start another
   2850      block in this case: the debug stmt will already have started the
   2851      one STMT would start if we weren't outputting debug stmts.  */
   2852   if (prev_stmt && is_gimple_debug (prev_stmt))
   2853     return false;
   2854 
   2855   /* Labels start a new basic block only if the preceding statement
   2856      wasn't a label of the same type.  This prevents the creation of
   2857      consecutive blocks that have nothing but a single label.  */
   2858   if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
   2859     {
   2860       /* Nonlocal and computed GOTO targets always start a new block.  */
   2861       if (DECL_NONLOCAL (gimple_label_label (label_stmt))
   2862 	  || FORCED_LABEL (gimple_label_label (label_stmt)))
   2863 	return true;
   2864 
   2865       if (glabel *plabel = safe_dyn_cast <glabel *> (prev_stmt))
   2866 	{
   2867 	  if (DECL_NONLOCAL (gimple_label_label (plabel))
   2868 	      || !DECL_ARTIFICIAL (gimple_label_label (plabel)))
   2869 	    return true;
   2870 
   2871 	  cfg_stats.num_merged_labels++;
   2872 	  return false;
   2873 	}
   2874       else
   2875 	return true;
   2876     }
   2877   else if (gimple_code (stmt) == GIMPLE_CALL)
   2878     {
   2879       if (gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
   2880 	/* setjmp acts similar to a nonlocal GOTO target and thus should
   2881 	   start a new block.  */
   2882 	return true;
   2883       if (gimple_call_internal_p (stmt, IFN_PHI)
   2884 	  && prev_stmt
   2885 	  && gimple_code (prev_stmt) != GIMPLE_LABEL
   2886 	  && (gimple_code (prev_stmt) != GIMPLE_CALL
   2887 	      || ! gimple_call_internal_p (prev_stmt, IFN_PHI)))
   2888 	/* PHI nodes start a new block unless preceeded by a label
   2889 	   or another PHI.  */
   2890 	return true;
   2891     }
   2892 
   2893   return false;
   2894 }
   2895 
   2896 
   2897 /* Return true if T should end a basic block.  */
   2898 
   2899 bool
   2900 stmt_ends_bb_p (gimple *t)
   2901 {
   2902   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
   2903 }
   2904 
   2905 /* Remove block annotations and other data structures.  */
   2906 
   2907 void
   2908 delete_tree_cfg_annotations (struct function *fn)
   2909 {
   2910   vec_free (label_to_block_map_for_fn (fn));
   2911 }
   2912 
   2913 /* Return the virtual phi in BB.  */
   2914 
   2915 gphi *
   2916 get_virtual_phi (basic_block bb)
   2917 {
   2918   for (gphi_iterator gsi = gsi_start_phis (bb);
   2919        !gsi_end_p (gsi);
   2920        gsi_next (&gsi))
   2921     {
   2922       gphi *phi = gsi.phi ();
   2923 
   2924       if (virtual_operand_p (PHI_RESULT (phi)))
   2925 	return phi;
   2926     }
   2927 
   2928   return NULL;
   2929 }
   2930 
   2931 /* Return the first statement in basic block BB.  */
   2932 
   2933 gimple *
   2934 first_stmt (basic_block bb)
   2935 {
   2936   gimple_stmt_iterator i = gsi_start_bb (bb);
   2937   gimple *stmt = NULL;
   2938 
   2939   while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
   2940     {
   2941       gsi_next (&i);
   2942       stmt = NULL;
   2943     }
   2944   return stmt;
   2945 }
   2946 
   2947 /* Return the first non-label/non-debug statement in basic block BB.  */
   2948 
   2949 static gimple *
   2950 first_non_label_nondebug_stmt (basic_block bb)
   2951 {
   2952   gimple_stmt_iterator i;
   2953   i = gsi_start_nondebug_after_labels_bb (bb);
   2954   return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
   2955 }
   2956 
   2957 /* Return the last statement in basic block BB.  */
   2958 
   2959 gimple *
   2960 last_nondebug_stmt (basic_block bb)
   2961 {
   2962   gimple_stmt_iterator i = gsi_last_bb (bb);
   2963   gimple *stmt = NULL;
   2964 
   2965   while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
   2966     {
   2967       gsi_prev (&i);
   2968       stmt = NULL;
   2969     }
   2970   return stmt;
   2971 }
   2972 
   2973 /* Return the last statement of an otherwise empty block.  Return NULL
   2974    if the block is totally empty, or if it contains more than one
   2975    statement.  */
   2976 
   2977 gimple *
   2978 last_and_only_stmt (basic_block bb)
   2979 {
   2980   gimple_stmt_iterator i = gsi_last_nondebug_bb (bb);
   2981   gimple *last, *prev;
   2982 
   2983   if (gsi_end_p (i))
   2984     return NULL;
   2985 
   2986   last = gsi_stmt (i);
   2987   gsi_prev_nondebug (&i);
   2988   if (gsi_end_p (i))
   2989     return last;
   2990 
   2991   /* Empty statements should no longer appear in the instruction stream.
   2992      Everything that might have appeared before should be deleted by
   2993      remove_useless_stmts, and the optimizers should just gsi_remove
   2994      instead of smashing with build_empty_stmt.
   2995 
   2996      Thus the only thing that should appear here in a block containing
   2997      one executable statement is a label.  */
   2998   prev = gsi_stmt (i);
   2999   if (gimple_code (prev) == GIMPLE_LABEL)
   3000     return last;
   3001   else
   3002     return NULL;
   3003 }
   3004 
   3005 /* Returns the basic block after which the new basic block created
   3006    by splitting edge EDGE_IN should be placed.  Tries to keep the new block
   3007    near its "logical" location.  This is of most help to humans looking
   3008    at debugging dumps.  */
   3009 
   3010 basic_block
   3011 split_edge_bb_loc (edge edge_in)
   3012 {
   3013   basic_block dest = edge_in->dest;
   3014   basic_block dest_prev = dest->prev_bb;
   3015 
   3016   if (dest_prev)
   3017     {
   3018       edge e = find_edge (dest_prev, dest);
   3019       if (e && !(e->flags & EDGE_COMPLEX))
   3020 	return edge_in->src;
   3021     }
   3022   return dest_prev;
   3023 }
   3024 
   3025 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
   3026    Abort on abnormal edges.  */
   3027 
   3028 static basic_block
   3029 gimple_split_edge (edge edge_in)
   3030 {
   3031   basic_block new_bb, after_bb, dest;
   3032   edge new_edge, e;
   3033 
   3034   /* Abnormal edges cannot be split.  */
   3035   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
   3036 
   3037   dest = edge_in->dest;
   3038 
   3039   after_bb = split_edge_bb_loc (edge_in);
   3040 
   3041   new_bb = create_empty_bb (after_bb);
   3042   new_bb->count = edge_in->count ();
   3043 
   3044   /* We want to avoid re-allocating PHIs when we first
   3045      add the fallthru edge from new_bb to dest but we also
   3046      want to avoid changing PHI argument order when
   3047      first redirecting edge_in away from dest.  The former
   3048      avoids changing PHI argument order by adding them
   3049      last and then the redirection swapping it back into
   3050      place by means of unordered remove.
   3051      So hack around things by temporarily removing all PHIs
   3052      from the destination during the edge redirection and then
   3053      making sure the edges stay in order.  */
   3054   gimple_seq saved_phis = phi_nodes (dest);
   3055   unsigned old_dest_idx = edge_in->dest_idx;
   3056   set_phi_nodes (dest, NULL);
   3057   new_edge = make_single_succ_edge (new_bb, dest, EDGE_FALLTHRU);
   3058   e = redirect_edge_and_branch (edge_in, new_bb);
   3059   gcc_assert (e == edge_in && new_edge->dest_idx == old_dest_idx);
   3060   /* set_phi_nodes sets the BB of the PHI nodes, so do it manually here.  */
   3061   dest->il.gimple.phi_nodes = saved_phis;
   3062 
   3063   return new_bb;
   3064 }
   3065 
   3066 
   3067 /* Verify properties of the address expression T whose base should be
   3068    TREE_ADDRESSABLE if VERIFY_ADDRESSABLE is true.  */
   3069 
   3070 static bool
   3071 verify_address (tree t, bool verify_addressable)
   3072 {
   3073   bool old_constant;
   3074   bool old_side_effects;
   3075   bool new_constant;
   3076   bool new_side_effects;
   3077 
   3078   old_constant = TREE_CONSTANT (t);
   3079   old_side_effects = TREE_SIDE_EFFECTS (t);
   3080 
   3081   recompute_tree_invariant_for_addr_expr (t);
   3082   new_side_effects = TREE_SIDE_EFFECTS (t);
   3083   new_constant = TREE_CONSTANT (t);
   3084 
   3085   if (old_constant != new_constant)
   3086     {
   3087       error ("constant not recomputed when %<ADDR_EXPR%> changed");
   3088       return true;
   3089     }
   3090   if (old_side_effects != new_side_effects)
   3091     {
   3092       error ("side effects not recomputed when %<ADDR_EXPR%> changed");
   3093       return true;
   3094     }
   3095 
   3096   tree base = TREE_OPERAND (t, 0);
   3097   while (handled_component_p (base))
   3098     base = TREE_OPERAND (base, 0);
   3099 
   3100   if (!(VAR_P (base)
   3101 	|| TREE_CODE (base) == PARM_DECL
   3102 	|| TREE_CODE (base) == RESULT_DECL))
   3103     return false;
   3104 
   3105   if (verify_addressable && !TREE_ADDRESSABLE (base))
   3106     {
   3107       error ("address taken but %<TREE_ADDRESSABLE%> bit not set");
   3108       return true;
   3109     }
   3110 
   3111   return false;
   3112 }
   3113 
   3114 
   3115 /* Verify if EXPR is a valid GIMPLE reference expression.  If
   3116    REQUIRE_LVALUE is true verifies it is an lvalue.  Returns true
   3117    if there is an error, otherwise false.  */
   3118 
   3119 static bool
   3120 verify_types_in_gimple_reference (tree expr, bool require_lvalue)
   3121 {
   3122   const char *code_name = get_tree_code_name (TREE_CODE (expr));
   3123 
   3124   if (TREE_CODE (expr) == REALPART_EXPR
   3125       || TREE_CODE (expr) == IMAGPART_EXPR
   3126       || TREE_CODE (expr) == BIT_FIELD_REF
   3127       || TREE_CODE (expr) == VIEW_CONVERT_EXPR)
   3128     {
   3129       tree op = TREE_OPERAND (expr, 0);
   3130       if (TREE_CODE (expr) != VIEW_CONVERT_EXPR
   3131 	  && !is_gimple_reg_type (TREE_TYPE (expr)))
   3132 	{
   3133 	  error ("non-scalar %qs", code_name);
   3134 	  return true;
   3135 	}
   3136 
   3137       if (TREE_CODE (expr) == BIT_FIELD_REF)
   3138 	{
   3139 	  tree t1 = TREE_OPERAND (expr, 1);
   3140 	  tree t2 = TREE_OPERAND (expr, 2);
   3141 	  poly_uint64 size, bitpos;
   3142 	  if (!poly_int_tree_p (t1, &size)
   3143 	      || !poly_int_tree_p (t2, &bitpos)
   3144 	      || !types_compatible_p (bitsizetype, TREE_TYPE (t1))
   3145 	      || !types_compatible_p (bitsizetype, TREE_TYPE (t2)))
   3146 	    {
   3147 	      error ("invalid position or size operand to %qs", code_name);
   3148 	      return true;
   3149 	    }
   3150 	  if (INTEGRAL_TYPE_P (TREE_TYPE (expr))
   3151 	      && maybe_ne (TYPE_PRECISION (TREE_TYPE (expr)), size))
   3152 	    {
   3153 	      error ("integral result type precision does not match "
   3154 		     "field size of %qs", code_name);
   3155 	      return true;
   3156 	    }
   3157 	  else if (!INTEGRAL_TYPE_P (TREE_TYPE (expr))
   3158 		   && TYPE_MODE (TREE_TYPE (expr)) != BLKmode
   3159 		   && maybe_ne (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr))),
   3160 				size))
   3161 	    {
   3162 	      error ("mode size of non-integral result does not "
   3163 		     "match field size of %qs",
   3164 		     code_name);
   3165 	      return true;
   3166 	    }
   3167 	  if (INTEGRAL_TYPE_P (TREE_TYPE (op))
   3168 	      && !type_has_mode_precision_p (TREE_TYPE (op)))
   3169 	    {
   3170 	      error ("%qs of non-mode-precision operand", code_name);
   3171 	      return true;
   3172 	    }
   3173 	  if (!AGGREGATE_TYPE_P (TREE_TYPE (op))
   3174 	      && maybe_gt (size + bitpos,
   3175 			   tree_to_poly_uint64 (TYPE_SIZE (TREE_TYPE (op)))))
   3176 	    {
   3177 	      error ("position plus size exceeds size of referenced object in "
   3178 		     "%qs", code_name);
   3179 	      return true;
   3180 	    }
   3181 	}
   3182 
   3183       if ((TREE_CODE (expr) == REALPART_EXPR
   3184 	   || TREE_CODE (expr) == IMAGPART_EXPR)
   3185 	  && !useless_type_conversion_p (TREE_TYPE (expr),
   3186 					 TREE_TYPE (TREE_TYPE (op))))
   3187 	{
   3188 	  error ("type mismatch in %qs reference", code_name);
   3189 	  debug_generic_stmt (TREE_TYPE (expr));
   3190 	  debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
   3191 	  return true;
   3192 	}
   3193 
   3194       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
   3195 	{
   3196 	  /* For VIEW_CONVERT_EXPRs which are allowed here too, we only check
   3197 	     that their operand is not a register an invariant when
   3198 	     requiring an lvalue (this usually means there is a SRA or IPA-SRA
   3199 	     bug).  Otherwise there is nothing to verify, gross mismatches at
   3200 	     most invoke undefined behavior.  */
   3201 	  if (require_lvalue
   3202 	      && (is_gimple_reg (op) || is_gimple_min_invariant (op)))
   3203 	    {
   3204 	      error ("conversion of %qs on the left hand side of %qs",
   3205 		     get_tree_code_name (TREE_CODE (op)), code_name);
   3206 	      debug_generic_stmt (expr);
   3207 	      return true;
   3208 	    }
   3209 	  else if (is_gimple_reg (op)
   3210 		   && TYPE_SIZE (TREE_TYPE (expr)) != TYPE_SIZE (TREE_TYPE (op)))
   3211 	    {
   3212 	      error ("conversion of register to a different size in %qs",
   3213 		     code_name);
   3214 	      debug_generic_stmt (expr);
   3215 	      return true;
   3216 	    }
   3217 	}
   3218 
   3219       expr = op;
   3220     }
   3221 
   3222   bool require_non_reg = false;
   3223   while (handled_component_p (expr))
   3224     {
   3225       require_non_reg = true;
   3226       code_name = get_tree_code_name (TREE_CODE (expr));
   3227 
   3228       if (TREE_CODE (expr) == REALPART_EXPR
   3229 	  || TREE_CODE (expr) == IMAGPART_EXPR
   3230 	  || TREE_CODE (expr) == BIT_FIELD_REF)
   3231 	{
   3232 	  error ("non-top-level %qs", code_name);
   3233 	  return true;
   3234 	}
   3235 
   3236       tree op = TREE_OPERAND (expr, 0);
   3237 
   3238       if (TREE_CODE (expr) == ARRAY_REF
   3239 	  || TREE_CODE (expr) == ARRAY_RANGE_REF)
   3240 	{
   3241 	  if (!is_gimple_val (TREE_OPERAND (expr, 1))
   3242 	      || (TREE_OPERAND (expr, 2)
   3243 		  && !is_gimple_val (TREE_OPERAND (expr, 2)))
   3244 	      || (TREE_OPERAND (expr, 3)
   3245 		  && !is_gimple_val (TREE_OPERAND (expr, 3))))
   3246 	    {
   3247 	      error ("invalid operands to %qs", code_name);
   3248 	      debug_generic_stmt (expr);
   3249 	      return true;
   3250 	    }
   3251 	}
   3252 
   3253       /* Verify if the reference array element types are compatible.  */
   3254       if (TREE_CODE (expr) == ARRAY_REF
   3255 	  && !useless_type_conversion_p (TREE_TYPE (expr),
   3256 					 TREE_TYPE (TREE_TYPE (op))))
   3257 	{
   3258 	  error ("type mismatch in %qs", code_name);
   3259 	  debug_generic_stmt (TREE_TYPE (expr));
   3260 	  debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
   3261 	  return true;
   3262 	}
   3263       if (TREE_CODE (expr) == ARRAY_RANGE_REF
   3264 	  && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
   3265 					 TREE_TYPE (TREE_TYPE (op))))
   3266 	{
   3267 	  error ("type mismatch in %qs", code_name);
   3268 	  debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
   3269 	  debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
   3270 	  return true;
   3271 	}
   3272 
   3273       if (TREE_CODE (expr) == COMPONENT_REF)
   3274 	{
   3275 	  if (TREE_OPERAND (expr, 2)
   3276 	      && !is_gimple_val (TREE_OPERAND (expr, 2)))
   3277 	    {
   3278 	      error ("invalid %qs offset operator", code_name);
   3279 	      return true;
   3280 	    }
   3281 	  if (!useless_type_conversion_p (TREE_TYPE (expr),
   3282 					  TREE_TYPE (TREE_OPERAND (expr, 1))))
   3283 	    {
   3284 	      error ("type mismatch in %qs", code_name);
   3285 	      debug_generic_stmt (TREE_TYPE (expr));
   3286 	      debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
   3287 	      return true;
   3288 	    }
   3289 	}
   3290 
   3291       expr = op;
   3292     }
   3293 
   3294   code_name = get_tree_code_name (TREE_CODE (expr));
   3295 
   3296   if (TREE_CODE (expr) == MEM_REF)
   3297     {
   3298       if (!is_gimple_mem_ref_addr (TREE_OPERAND (expr, 0))
   3299 	  || (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR
   3300 	      && verify_address (TREE_OPERAND (expr, 0), false)))
   3301 	{
   3302 	  error ("invalid address operand in %qs", code_name);
   3303 	  debug_generic_stmt (expr);
   3304 	  return true;
   3305 	}
   3306       if (!poly_int_tree_p (TREE_OPERAND (expr, 1))
   3307 	  || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1))))
   3308 	{
   3309 	  error ("invalid offset operand in %qs", code_name);
   3310 	  debug_generic_stmt (expr);
   3311 	  return true;
   3312 	}
   3313       if (MR_DEPENDENCE_CLIQUE (expr) != 0
   3314 	  && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique)
   3315 	{
   3316 	  error ("invalid clique in %qs", code_name);
   3317 	  debug_generic_stmt (expr);
   3318 	  return true;
   3319 	}
   3320     }
   3321   else if (TREE_CODE (expr) == TARGET_MEM_REF)
   3322     {
   3323       if (!TMR_BASE (expr)
   3324 	  || !is_gimple_mem_ref_addr (TMR_BASE (expr))
   3325 	  || (TREE_CODE (TMR_BASE (expr)) == ADDR_EXPR
   3326 	      && verify_address (TMR_BASE (expr), false)))
   3327 	{
   3328 	  error ("invalid address operand in %qs", code_name);
   3329 	  return true;
   3330 	}
   3331       if (!TMR_OFFSET (expr)
   3332 	  || !poly_int_tree_p (TMR_OFFSET (expr))
   3333 	  || !POINTER_TYPE_P (TREE_TYPE (TMR_OFFSET (expr))))
   3334 	{
   3335 	  error ("invalid offset operand in %qs", code_name);
   3336 	  debug_generic_stmt (expr);
   3337 	  return true;
   3338 	}
   3339       if (MR_DEPENDENCE_CLIQUE (expr) != 0
   3340 	  && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique)
   3341 	{
   3342 	  error ("invalid clique in %qs", code_name);
   3343 	  debug_generic_stmt (expr);
   3344 	  return true;
   3345 	}
   3346     }
   3347   else if (INDIRECT_REF_P (expr))
   3348     {
   3349       error ("%qs in gimple IL", code_name);
   3350       debug_generic_stmt (expr);
   3351       return true;
   3352     }
   3353   else if (require_non_reg
   3354 	   && (is_gimple_reg (expr)
   3355 	       || (is_gimple_min_invariant (expr)
   3356 		   /* STRING_CSTs are representatives of the string table
   3357 		      entry which lives in memory.  */
   3358 		   && TREE_CODE (expr) != STRING_CST)))
   3359     {
   3360       error ("%qs as base where non-register is required", code_name);
   3361       debug_generic_stmt (expr);
   3362       return true;
   3363     }
   3364 
   3365   if (!require_lvalue
   3366       && (is_gimple_reg (expr) || is_gimple_min_invariant (expr)))
   3367     return false;
   3368 
   3369   if (TREE_CODE (expr) != SSA_NAME && is_gimple_id (expr))
   3370     return false;
   3371 
   3372   if (TREE_CODE (expr) != TARGET_MEM_REF
   3373       && TREE_CODE (expr) != MEM_REF)
   3374     {
   3375       error ("invalid expression for min lvalue");
   3376       return true;
   3377     }
   3378 
   3379   return false;
   3380 }
   3381 
   3382 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
   3383    list of pointer-to types that is trivially convertible to DEST.  */
   3384 
   3385 static bool
   3386 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
   3387 {
   3388   tree src;
   3389 
   3390   if (!TYPE_POINTER_TO (src_obj))
   3391     return true;
   3392 
   3393   for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
   3394     if (useless_type_conversion_p (dest, src))
   3395       return true;
   3396 
   3397   return false;
   3398 }
   3399 
   3400 /* Return true if TYPE1 is a fixed-point type and if conversions to and
   3401    from TYPE2 can be handled by FIXED_CONVERT_EXPR.  */
   3402 
   3403 static bool
   3404 valid_fixed_convert_types_p (tree type1, tree type2)
   3405 {
   3406   return (FIXED_POINT_TYPE_P (type1)
   3407 	  && (INTEGRAL_TYPE_P (type2)
   3408 	      || SCALAR_FLOAT_TYPE_P (type2)
   3409 	      || FIXED_POINT_TYPE_P (type2)));
   3410 }
   3411 
   3412 /* Verify the contents of a GIMPLE_CALL STMT.  Returns true when there
   3413    is a problem, otherwise false.  */
   3414 
   3415 static bool
   3416 verify_gimple_call (gcall *stmt)
   3417 {
   3418   tree fn = gimple_call_fn (stmt);
   3419   tree fntype, fndecl;
   3420   unsigned i;
   3421 
   3422   if (gimple_call_internal_p (stmt))
   3423     {
   3424       if (fn)
   3425 	{
   3426 	  error ("gimple call has two targets");
   3427 	  debug_generic_stmt (fn);
   3428 	  return true;
   3429 	}
   3430     }
   3431   else
   3432     {
   3433       if (!fn)
   3434 	{
   3435 	  error ("gimple call has no target");
   3436 	  return true;
   3437 	}
   3438     }
   3439 
   3440   if (fn && !is_gimple_call_addr (fn))
   3441     {
   3442       error ("invalid function in gimple call");
   3443       debug_generic_stmt (fn);
   3444       return true;
   3445     }
   3446 
   3447   if (fn
   3448       && (!POINTER_TYPE_P (TREE_TYPE (fn))
   3449 	  || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
   3450 	      && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE)))
   3451     {
   3452       error ("non-function in gimple call");
   3453       return true;
   3454     }
   3455 
   3456    fndecl = gimple_call_fndecl (stmt);
   3457    if (fndecl
   3458        && TREE_CODE (fndecl) == FUNCTION_DECL
   3459        && DECL_LOOPING_CONST_OR_PURE_P (fndecl)
   3460        && !DECL_PURE_P (fndecl)
   3461        && !TREE_READONLY (fndecl))
   3462      {
   3463        error ("invalid pure const state for function");
   3464        return true;
   3465      }
   3466 
   3467   tree lhs = gimple_call_lhs (stmt);
   3468   if (lhs
   3469       && (!is_gimple_reg (lhs)
   3470 	  && (!is_gimple_lvalue (lhs)
   3471 	      || verify_types_in_gimple_reference
   3472 		   (TREE_CODE (lhs) == WITH_SIZE_EXPR
   3473 		    ? TREE_OPERAND (lhs, 0) : lhs, true))))
   3474     {
   3475       error ("invalid LHS in gimple call");
   3476       return true;
   3477     }
   3478 
   3479   if (gimple_call_ctrl_altering_p (stmt)
   3480       && gimple_call_noreturn_p (stmt)
   3481       && should_remove_lhs_p (lhs))
   3482     {
   3483       error ("LHS in %<noreturn%> call");
   3484       return true;
   3485     }
   3486 
   3487   fntype = gimple_call_fntype (stmt);
   3488   if (fntype
   3489       && lhs
   3490       && !useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (fntype))
   3491       /* ???  At least C++ misses conversions at assignments from
   3492 	 void * call results.
   3493 	 For now simply allow arbitrary pointer type conversions.  */
   3494       && !(POINTER_TYPE_P (TREE_TYPE (lhs))
   3495 	   && POINTER_TYPE_P (TREE_TYPE (fntype))))
   3496     {
   3497       error ("invalid conversion in gimple call");
   3498       debug_generic_stmt (TREE_TYPE (lhs));
   3499       debug_generic_stmt (TREE_TYPE (fntype));
   3500       return true;
   3501     }
   3502 
   3503   if (gimple_call_chain (stmt)
   3504       && !is_gimple_val (gimple_call_chain (stmt)))
   3505     {
   3506       error ("invalid static chain in gimple call");
   3507       debug_generic_stmt (gimple_call_chain (stmt));
   3508       return true;
   3509     }
   3510 
   3511   /* If there is a static chain argument, the call should either be
   3512      indirect, or the decl should have DECL_STATIC_CHAIN set.  */
   3513   if (gimple_call_chain (stmt)
   3514       && fndecl
   3515       && !DECL_STATIC_CHAIN (fndecl))
   3516     {
   3517       error ("static chain with function that doesn%'t use one");
   3518       return true;
   3519     }
   3520 
   3521   if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
   3522     {
   3523       switch (DECL_FUNCTION_CODE (fndecl))
   3524 	{
   3525 	case BUILT_IN_UNREACHABLE:
   3526 	case BUILT_IN_UNREACHABLE_TRAP:
   3527 	case BUILT_IN_TRAP:
   3528 	  if (gimple_call_num_args (stmt) > 0)
   3529 	    {
   3530 	      /* Built-in unreachable with parameters might not be caught by
   3531 		 undefined behavior sanitizer.  Front-ends do check users do not
   3532 		 call them that way but we also produce calls to
   3533 		 __builtin_unreachable internally, for example when IPA figures
   3534 		 out a call cannot happen in a legal program.  In such cases,
   3535 		 we must make sure arguments are stripped off.  */
   3536 	      error ("%<__builtin_unreachable%> or %<__builtin_trap%> call "
   3537 		     "with arguments");
   3538 	      return true;
   3539 	    }
   3540 	  break;
   3541 	default:
   3542 	  break;
   3543 	}
   3544     }
   3545 
   3546   /* For a call to .DEFERRED_INIT,
   3547      LHS = DEFERRED_INIT (SIZE of the DECL, INIT_TYPE, NAME of the DECL)
   3548      we should guarantee that when the 1st argument is a constant, it should
   3549      be the same as the size of the LHS.  */
   3550 
   3551   if (gimple_call_internal_p (stmt, IFN_DEFERRED_INIT))
   3552     {
   3553       tree size_of_arg0 = gimple_call_arg (stmt, 0);
   3554       tree size_of_lhs = TYPE_SIZE_UNIT (TREE_TYPE (lhs));
   3555 
   3556       if (TREE_CODE (lhs) == SSA_NAME)
   3557 	lhs = SSA_NAME_VAR (lhs);
   3558 
   3559       poly_uint64 size_from_arg0, size_from_lhs;
   3560       bool is_constant_size_arg0 = poly_int_tree_p (size_of_arg0,
   3561 						    &size_from_arg0);
   3562       bool is_constant_size_lhs = poly_int_tree_p (size_of_lhs,
   3563 						   &size_from_lhs);
   3564       if (is_constant_size_arg0 && is_constant_size_lhs)
   3565 	if (maybe_ne (size_from_arg0, size_from_lhs))
   3566 	  {
   3567 	    error ("%<DEFERRED_INIT%> calls should have same "
   3568 		   "constant size for the first argument and LHS");
   3569 	    return true;
   3570 	  }
   3571     }
   3572 
   3573   /* ???  The C frontend passes unpromoted arguments in case it
   3574      didn't see a function declaration before the call.  So for now
   3575      leave the call arguments mostly unverified.  Once we gimplify
   3576      unit-at-a-time we have a chance to fix this.  */
   3577   for (i = 0; i < gimple_call_num_args (stmt); ++i)
   3578     {
   3579       tree arg = gimple_call_arg (stmt, i);
   3580       if ((is_gimple_reg_type (TREE_TYPE (arg))
   3581 	   && !is_gimple_val (arg))
   3582 	  || (!is_gimple_reg_type (TREE_TYPE (arg))
   3583 	      && !is_gimple_lvalue (arg)))
   3584 	{
   3585 	  error ("invalid argument to gimple call");
   3586 	  debug_generic_expr (arg);
   3587 	  return true;
   3588 	}
   3589       if (!is_gimple_reg (arg))
   3590 	{
   3591 	  if (TREE_CODE (arg) == WITH_SIZE_EXPR)
   3592 	    arg = TREE_OPERAND (arg, 0);
   3593 	  if (verify_types_in_gimple_reference (arg, false))
   3594 	    return true;
   3595 	}
   3596     }
   3597 
   3598   return false;
   3599 }
   3600 
   3601 /* Verifies the gimple comparison with the result type TYPE and
   3602    the operands OP0 and OP1, comparison code is CODE.  */
   3603 
   3604 static bool
   3605 verify_gimple_comparison (tree type, tree op0, tree op1, enum tree_code code)
   3606 {
   3607   tree op0_type = TREE_TYPE (op0);
   3608   tree op1_type = TREE_TYPE (op1);
   3609 
   3610   if (!is_gimple_val (op0) || !is_gimple_val (op1))
   3611     {
   3612       error ("invalid operands in gimple comparison");
   3613       return true;
   3614     }
   3615 
   3616   /* For comparisons we do not have the operations type as the
   3617      effective type the comparison is carried out in.  Instead
   3618      we require that either the first operand is trivially
   3619      convertible into the second, or the other way around.  */
   3620   if (!useless_type_conversion_p (op0_type, op1_type)
   3621       && !useless_type_conversion_p (op1_type, op0_type))
   3622     {
   3623       error ("mismatching comparison operand types");
   3624       debug_generic_expr (op0_type);
   3625       debug_generic_expr (op1_type);
   3626       return true;
   3627     }
   3628 
   3629   /* The resulting type of a comparison may be an effective boolean type.  */
   3630   if (INTEGRAL_TYPE_P (type)
   3631       && (TREE_CODE (type) == BOOLEAN_TYPE
   3632 	  || TYPE_PRECISION (type) == 1))
   3633     {
   3634       if ((VECTOR_TYPE_P (op0_type)
   3635 	   || VECTOR_TYPE_P (op1_type))
   3636 	  && code != EQ_EXPR && code != NE_EXPR
   3637 	  && !VECTOR_BOOLEAN_TYPE_P (op0_type)
   3638 	  && !VECTOR_INTEGER_TYPE_P (op0_type))
   3639 	{
   3640 	  error ("unsupported operation or type for vector comparison"
   3641 		 " returning a boolean");
   3642 	  debug_generic_expr (op0_type);
   3643 	  debug_generic_expr (op1_type);
   3644 	  return true;
   3645         }
   3646     }
   3647   /* Or a boolean vector type with the same element count
   3648      as the comparison operand types.  */
   3649   else if (VECTOR_TYPE_P (type)
   3650 	   && TREE_CODE (TREE_TYPE (type)) == BOOLEAN_TYPE)
   3651     {
   3652       if (TREE_CODE (op0_type) != VECTOR_TYPE
   3653 	  || TREE_CODE (op1_type) != VECTOR_TYPE)
   3654         {
   3655           error ("non-vector operands in vector comparison");
   3656           debug_generic_expr (op0_type);
   3657           debug_generic_expr (op1_type);
   3658           return true;
   3659         }
   3660 
   3661       if (maybe_ne (TYPE_VECTOR_SUBPARTS (type),
   3662 		    TYPE_VECTOR_SUBPARTS (op0_type)))
   3663         {
   3664           error ("invalid vector comparison resulting type");
   3665           debug_generic_expr (type);
   3666           return true;
   3667         }
   3668     }
   3669   else
   3670     {
   3671       error ("bogus comparison result type");
   3672       debug_generic_expr (type);
   3673       return true;
   3674     }
   3675 
   3676   return false;
   3677 }
   3678 
   3679 /* Verify a gimple assignment statement STMT with an unary rhs.
   3680    Returns true if anything is wrong.  */
   3681 
   3682 static bool
   3683 verify_gimple_assign_unary (gassign *stmt)
   3684 {
   3685   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
   3686   tree lhs = gimple_assign_lhs (stmt);
   3687   tree lhs_type = TREE_TYPE (lhs);
   3688   tree rhs1 = gimple_assign_rhs1 (stmt);
   3689   tree rhs1_type = TREE_TYPE (rhs1);
   3690 
   3691   if (!is_gimple_reg (lhs))
   3692     {
   3693       error ("non-register as LHS of unary operation");
   3694       return true;
   3695     }
   3696 
   3697   if (!is_gimple_val (rhs1))
   3698     {
   3699       error ("invalid operand in unary operation");
   3700       return true;
   3701     }
   3702 
   3703   const char* const code_name = get_tree_code_name (rhs_code);
   3704 
   3705   /* First handle conversions.  */
   3706   switch (rhs_code)
   3707     {
   3708     CASE_CONVERT:
   3709       {
   3710 	/* Allow conversions between vectors with the same number of elements,
   3711 	   provided that the conversion is OK for the element types too.  */
   3712 	if (VECTOR_TYPE_P (lhs_type)
   3713 	    && VECTOR_TYPE_P (rhs1_type)
   3714 	    && known_eq (TYPE_VECTOR_SUBPARTS (lhs_type),
   3715 			 TYPE_VECTOR_SUBPARTS (rhs1_type)))
   3716 	  {
   3717 	    lhs_type = TREE_TYPE (lhs_type);
   3718 	    rhs1_type = TREE_TYPE (rhs1_type);
   3719 	  }
   3720 	else if (VECTOR_TYPE_P (lhs_type) || VECTOR_TYPE_P (rhs1_type))
   3721 	  {
   3722 	    error ("invalid vector types in nop conversion");
   3723 	    debug_generic_expr (lhs_type);
   3724 	    debug_generic_expr (rhs1_type);
   3725 	    return true;
   3726 	  }
   3727 
   3728 	/* Allow conversions from pointer type to integral type only if
   3729 	   there is no sign or zero extension involved.
   3730 	   For targets were the precision of ptrofftype doesn't match that
   3731 	   of pointers we allow conversions to types where
   3732 	   POINTERS_EXTEND_UNSIGNED specifies how that works.  */
   3733 	if ((POINTER_TYPE_P (lhs_type)
   3734 	     && INTEGRAL_TYPE_P (rhs1_type))
   3735 	    || (POINTER_TYPE_P (rhs1_type)
   3736 		&& INTEGRAL_TYPE_P (lhs_type)
   3737 		&& (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
   3738 #if defined(POINTERS_EXTEND_UNSIGNED)
   3739 		    || (TYPE_MODE (rhs1_type) == ptr_mode
   3740 			&& (TYPE_PRECISION (lhs_type)
   3741 			      == BITS_PER_WORD /* word_mode */
   3742 			    || (TYPE_PRECISION (lhs_type)
   3743 				  == GET_MODE_PRECISION (Pmode))))
   3744 #endif
   3745 		   )))
   3746 	  return false;
   3747 
   3748 	/* Allow conversion from integral to offset type and vice versa.  */
   3749 	if ((TREE_CODE (lhs_type) == OFFSET_TYPE
   3750 	     && INTEGRAL_TYPE_P (rhs1_type))
   3751 	    || (INTEGRAL_TYPE_P (lhs_type)
   3752 		&& TREE_CODE (rhs1_type) == OFFSET_TYPE))
   3753 	  return false;
   3754 
   3755 	/* Otherwise assert we are converting between types of the
   3756 	   same kind.  */
   3757 	if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
   3758 	  {
   3759 	    error ("invalid types in nop conversion");
   3760 	    debug_generic_expr (lhs_type);
   3761 	    debug_generic_expr (rhs1_type);
   3762 	    return true;
   3763 	  }
   3764 
   3765 	return false;
   3766       }
   3767 
   3768     case ADDR_SPACE_CONVERT_EXPR:
   3769       {
   3770 	if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type)
   3771 	    || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type))
   3772 		== TYPE_ADDR_SPACE (TREE_TYPE (lhs_type))))
   3773 	  {
   3774 	    error ("invalid types in address space conversion");
   3775 	    debug_generic_expr (lhs_type);
   3776 	    debug_generic_expr (rhs1_type);
   3777 	    return true;
   3778 	  }
   3779 
   3780 	return false;
   3781       }
   3782 
   3783     case FIXED_CONVERT_EXPR:
   3784       {
   3785 	if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
   3786 	    && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
   3787 	  {
   3788 	    error ("invalid types in fixed-point conversion");
   3789 	    debug_generic_expr (lhs_type);
   3790 	    debug_generic_expr (rhs1_type);
   3791 	    return true;
   3792 	  }
   3793 
   3794 	return false;
   3795       }
   3796 
   3797     case FLOAT_EXPR:
   3798       {
   3799 	if ((!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
   3800 	    && (!VECTOR_INTEGER_TYPE_P (rhs1_type)
   3801 	        || !VECTOR_FLOAT_TYPE_P (lhs_type)))
   3802 	  {
   3803 	    error ("invalid types in conversion to floating-point");
   3804 	    debug_generic_expr (lhs_type);
   3805 	    debug_generic_expr (rhs1_type);
   3806 	    return true;
   3807 	  }
   3808 
   3809         return false;
   3810       }
   3811 
   3812     case FIX_TRUNC_EXPR:
   3813       {
   3814         if ((!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
   3815             && (!VECTOR_INTEGER_TYPE_P (lhs_type)
   3816                 || !VECTOR_FLOAT_TYPE_P (rhs1_type)))
   3817 	  {
   3818 	    error ("invalid types in conversion to integer");
   3819 	    debug_generic_expr (lhs_type);
   3820 	    debug_generic_expr (rhs1_type);
   3821 	    return true;
   3822 	  }
   3823 
   3824         return false;
   3825       }
   3826 
   3827     case VEC_UNPACK_HI_EXPR:
   3828     case VEC_UNPACK_LO_EXPR:
   3829     case VEC_UNPACK_FLOAT_HI_EXPR:
   3830     case VEC_UNPACK_FLOAT_LO_EXPR:
   3831     case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
   3832     case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
   3833       if (TREE_CODE (rhs1_type) != VECTOR_TYPE
   3834           || TREE_CODE (lhs_type) != VECTOR_TYPE
   3835           || (!INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
   3836 	      && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type)))
   3837           || (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
   3838 	      && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
   3839 	  || ((rhs_code == VEC_UNPACK_HI_EXPR
   3840 	       || rhs_code == VEC_UNPACK_LO_EXPR)
   3841 	      && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
   3842 		  != INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
   3843 	  || ((rhs_code == VEC_UNPACK_FLOAT_HI_EXPR
   3844 	       || rhs_code == VEC_UNPACK_FLOAT_LO_EXPR)
   3845 	      && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
   3846 		  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))))
   3847 	  || ((rhs_code == VEC_UNPACK_FIX_TRUNC_HI_EXPR
   3848 	       || rhs_code == VEC_UNPACK_FIX_TRUNC_LO_EXPR)
   3849 	      && (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
   3850 		  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type))))
   3851 	  || (maybe_ne (GET_MODE_SIZE (element_mode (lhs_type)),
   3852 			2 * GET_MODE_SIZE (element_mode (rhs1_type)))
   3853 	      && (!VECTOR_BOOLEAN_TYPE_P (lhs_type)
   3854 		  || !VECTOR_BOOLEAN_TYPE_P (rhs1_type)))
   3855 	  || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (lhs_type),
   3856 		       TYPE_VECTOR_SUBPARTS (rhs1_type)))
   3857 	{
   3858 	  error ("type mismatch in %qs expression", code_name);
   3859 	  debug_generic_expr (lhs_type);
   3860 	  debug_generic_expr (rhs1_type);
   3861 	  return true;
   3862         }
   3863 
   3864       return false;
   3865 
   3866     case NEGATE_EXPR:
   3867     case ABS_EXPR:
   3868     case BIT_NOT_EXPR:
   3869     case PAREN_EXPR:
   3870     case CONJ_EXPR:
   3871       /* Disallow pointer and offset types for many of the unary gimple. */
   3872       if (POINTER_TYPE_P (lhs_type)
   3873 	  || TREE_CODE (lhs_type) == OFFSET_TYPE)
   3874 	{
   3875 	  error ("invalid types for %qs", code_name);
   3876 	  debug_generic_expr (lhs_type);
   3877 	  debug_generic_expr (rhs1_type);
   3878 	  return true;
   3879 	}
   3880       break;
   3881 
   3882     case ABSU_EXPR:
   3883       if (!ANY_INTEGRAL_TYPE_P (lhs_type)
   3884 	  || !TYPE_UNSIGNED (lhs_type)
   3885 	  || !ANY_INTEGRAL_TYPE_P (rhs1_type)
   3886 	  || TYPE_UNSIGNED (rhs1_type)
   3887 	  || element_precision (lhs_type) != element_precision (rhs1_type))
   3888 	{
   3889 	  error ("invalid types for %qs", code_name);
   3890 	  debug_generic_expr (lhs_type);
   3891 	  debug_generic_expr (rhs1_type);
   3892 	  return true;
   3893 	}
   3894       return false;
   3895 
   3896     case VEC_DUPLICATE_EXPR:
   3897       if (TREE_CODE (lhs_type) != VECTOR_TYPE
   3898 	  || !useless_type_conversion_p (TREE_TYPE (lhs_type), rhs1_type))
   3899 	{
   3900 	  error ("%qs should be from a scalar to a like vector", code_name);
   3901 	  debug_generic_expr (lhs_type);
   3902 	  debug_generic_expr (rhs1_type);
   3903 	  return true;
   3904 	}
   3905       return false;
   3906 
   3907     default:
   3908       gcc_unreachable ();
   3909     }
   3910 
   3911   /* For the remaining codes assert there is no conversion involved.  */
   3912   if (!useless_type_conversion_p (lhs_type, rhs1_type))
   3913     {
   3914       error ("non-trivial conversion in unary operation");
   3915       debug_generic_expr (lhs_type);
   3916       debug_generic_expr (rhs1_type);
   3917       return true;
   3918     }
   3919 
   3920   return false;
   3921 }
   3922 
   3923 /* Verify a gimple assignment statement STMT with a binary rhs.
   3924    Returns true if anything is wrong.  */
   3925 
   3926 static bool
   3927 verify_gimple_assign_binary (gassign *stmt)
   3928 {
   3929   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
   3930   tree lhs = gimple_assign_lhs (stmt);
   3931   tree lhs_type = TREE_TYPE (lhs);
   3932   tree rhs1 = gimple_assign_rhs1 (stmt);
   3933   tree rhs1_type = TREE_TYPE (rhs1);
   3934   tree rhs2 = gimple_assign_rhs2 (stmt);
   3935   tree rhs2_type = TREE_TYPE (rhs2);
   3936 
   3937   if (!is_gimple_reg (lhs))
   3938     {
   3939       error ("non-register as LHS of binary operation");
   3940       return true;
   3941     }
   3942 
   3943   if (!is_gimple_val (rhs1)
   3944       || !is_gimple_val (rhs2))
   3945     {
   3946       error ("invalid operands in binary operation");
   3947       return true;
   3948     }
   3949 
   3950   const char* const code_name = get_tree_code_name (rhs_code);
   3951 
   3952   /* First handle operations that involve different types.  */
   3953   switch (rhs_code)
   3954     {
   3955     case COMPLEX_EXPR:
   3956       {
   3957 	if (TREE_CODE (lhs_type) != COMPLEX_TYPE
   3958 	    || !(INTEGRAL_TYPE_P (rhs1_type)
   3959 	         || SCALAR_FLOAT_TYPE_P (rhs1_type))
   3960 	    || !(INTEGRAL_TYPE_P (rhs2_type)
   3961 	         || SCALAR_FLOAT_TYPE_P (rhs2_type)))
   3962 	  {
   3963 	    error ("type mismatch in %qs", code_name);
   3964 	    debug_generic_expr (lhs_type);
   3965 	    debug_generic_expr (rhs1_type);
   3966 	    debug_generic_expr (rhs2_type);
   3967 	    return true;
   3968 	  }
   3969 
   3970 	return false;
   3971       }
   3972 
   3973     case LSHIFT_EXPR:
   3974     case RSHIFT_EXPR:
   3975     case LROTATE_EXPR:
   3976     case RROTATE_EXPR:
   3977       {
   3978 	/* Shifts and rotates are ok on integral types, fixed point
   3979 	   types and integer vector types.  */
   3980 	if ((!INTEGRAL_TYPE_P (rhs1_type)
   3981 	     && !FIXED_POINT_TYPE_P (rhs1_type)
   3982 	     && ! (VECTOR_TYPE_P (rhs1_type)
   3983 		  && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
   3984 	    || (!INTEGRAL_TYPE_P (rhs2_type)
   3985 		/* Vector shifts of vectors are also ok.  */
   3986 		&& ! (VECTOR_TYPE_P (rhs1_type)
   3987 		     && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
   3988 		     && VECTOR_TYPE_P (rhs2_type)
   3989 		     && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
   3990 	    || !useless_type_conversion_p (lhs_type, rhs1_type))
   3991 	  {
   3992 	    error ("type mismatch in %qs", code_name);
   3993 	    debug_generic_expr (lhs_type);
   3994 	    debug_generic_expr (rhs1_type);
   3995 	    debug_generic_expr (rhs2_type);
   3996 	    return true;
   3997 	  }
   3998 
   3999 	return false;
   4000       }
   4001 
   4002     case WIDEN_LSHIFT_EXPR:
   4003       {
   4004         if (!INTEGRAL_TYPE_P (lhs_type)
   4005             || !INTEGRAL_TYPE_P (rhs1_type)
   4006             || TREE_CODE (rhs2) != INTEGER_CST
   4007             || (2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)))
   4008           {
   4009 	    error ("type mismatch in %qs", code_name);
   4010             debug_generic_expr (lhs_type);
   4011             debug_generic_expr (rhs1_type);
   4012             debug_generic_expr (rhs2_type);
   4013             return true;
   4014           }
   4015 
   4016         return false;
   4017       }
   4018 
   4019     case VEC_WIDEN_LSHIFT_HI_EXPR:
   4020     case VEC_WIDEN_LSHIFT_LO_EXPR:
   4021       {
   4022         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
   4023             || TREE_CODE (lhs_type) != VECTOR_TYPE
   4024             || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
   4025             || !INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
   4026             || TREE_CODE (rhs2) != INTEGER_CST
   4027             || (2 * TYPE_PRECISION (TREE_TYPE (rhs1_type))
   4028                 > TYPE_PRECISION (TREE_TYPE (lhs_type))))
   4029           {
   4030 	    error ("type mismatch in %qs", code_name);
   4031             debug_generic_expr (lhs_type);
   4032             debug_generic_expr (rhs1_type);
   4033             debug_generic_expr (rhs2_type);
   4034             return true;
   4035           }
   4036 
   4037         return false;
   4038       }
   4039 
   4040     case PLUS_EXPR:
   4041     case MINUS_EXPR:
   4042       {
   4043 	tree lhs_etype = lhs_type;
   4044 	tree rhs1_etype = rhs1_type;
   4045 	tree rhs2_etype = rhs2_type;
   4046 	if (VECTOR_TYPE_P (lhs_type))
   4047 	  {
   4048 	    if (TREE_CODE (rhs1_type) != VECTOR_TYPE
   4049 		|| TREE_CODE (rhs2_type) != VECTOR_TYPE)
   4050 	      {
   4051 		error ("invalid non-vector operands to %qs", code_name);
   4052 		return true;
   4053 	      }
   4054 	    lhs_etype = TREE_TYPE (lhs_type);
   4055 	    rhs1_etype = TREE_TYPE (rhs1_type);
   4056 	    rhs2_etype = TREE_TYPE (rhs2_type);
   4057 	  }
   4058 	if (POINTER_TYPE_P (lhs_etype)
   4059 	    || POINTER_TYPE_P (rhs1_etype)
   4060 	    || POINTER_TYPE_P (rhs2_etype))
   4061 	  {
   4062 	    error ("invalid (pointer) operands %qs", code_name);
   4063 	    return true;
   4064 	  }
   4065 
   4066 	/* Continue with generic binary expression handling.  */
   4067 	break;
   4068       }
   4069 
   4070     case POINTER_PLUS_EXPR:
   4071       {
   4072 	if (!POINTER_TYPE_P (rhs1_type)
   4073 	    || !useless_type_conversion_p (lhs_type, rhs1_type)
   4074 	    || !ptrofftype_p (rhs2_type))
   4075 	  {
   4076 	    error ("type mismatch in %qs", code_name);
   4077 	    debug_generic_stmt (lhs_type);
   4078 	    debug_generic_stmt (rhs1_type);
   4079 	    debug_generic_stmt (rhs2_type);
   4080 	    return true;
   4081 	  }
   4082 
   4083 	return false;
   4084       }
   4085 
   4086     case POINTER_DIFF_EXPR:
   4087       {
   4088 	if (!POINTER_TYPE_P (rhs1_type)
   4089 	    || !POINTER_TYPE_P (rhs2_type)
   4090 	    /* Because we special-case pointers to void we allow difference
   4091 	       of arbitrary pointers with the same mode.  */
   4092 	    || TYPE_MODE (rhs1_type) != TYPE_MODE (rhs2_type)
   4093 	    || !INTEGRAL_TYPE_P (lhs_type)
   4094 	    || TYPE_UNSIGNED (lhs_type)
   4095 	    || TYPE_PRECISION (lhs_type) != TYPE_PRECISION (rhs1_type))
   4096 	  {
   4097 	    error ("type mismatch in %qs", code_name);
   4098 	    debug_generic_stmt (lhs_type);
   4099 	    debug_generic_stmt (rhs1_type);
   4100 	    debug_generic_stmt (rhs2_type);
   4101 	    return true;
   4102 	  }
   4103 
   4104 	return false;
   4105       }
   4106 
   4107     case TRUTH_ANDIF_EXPR:
   4108     case TRUTH_ORIF_EXPR:
   4109     case TRUTH_AND_EXPR:
   4110     case TRUTH_OR_EXPR:
   4111     case TRUTH_XOR_EXPR:
   4112 
   4113       gcc_unreachable ();
   4114 
   4115     case LT_EXPR:
   4116     case LE_EXPR:
   4117     case GT_EXPR:
   4118     case GE_EXPR:
   4119     case EQ_EXPR:
   4120     case NE_EXPR:
   4121     case UNORDERED_EXPR:
   4122     case ORDERED_EXPR:
   4123     case UNLT_EXPR:
   4124     case UNLE_EXPR:
   4125     case UNGT_EXPR:
   4126     case UNGE_EXPR:
   4127     case UNEQ_EXPR:
   4128     case LTGT_EXPR:
   4129       /* Comparisons are also binary, but the result type is not
   4130 	 connected to the operand types.  */
   4131       return verify_gimple_comparison (lhs_type, rhs1, rhs2, rhs_code);
   4132 
   4133     case WIDEN_MULT_EXPR:
   4134       if (TREE_CODE (lhs_type) != INTEGER_TYPE)
   4135 	return true;
   4136       return ((2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type))
   4137 	      || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
   4138 
   4139     case WIDEN_SUM_EXPR:
   4140       {
   4141         if (((TREE_CODE (rhs1_type) != VECTOR_TYPE
   4142 	      || TREE_CODE (lhs_type) != VECTOR_TYPE)
   4143 	     && ((!INTEGRAL_TYPE_P (rhs1_type)
   4144 		  && !SCALAR_FLOAT_TYPE_P (rhs1_type))
   4145 		 || (!INTEGRAL_TYPE_P (lhs_type)
   4146 		     && !SCALAR_FLOAT_TYPE_P (lhs_type))))
   4147 	    || !useless_type_conversion_p (lhs_type, rhs2_type)
   4148 	    || maybe_lt (GET_MODE_SIZE (element_mode (rhs2_type)),
   4149 			 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
   4150           {
   4151 	    error ("type mismatch in %qs", code_name);
   4152             debug_generic_expr (lhs_type);
   4153             debug_generic_expr (rhs1_type);
   4154             debug_generic_expr (rhs2_type);
   4155             return true;
   4156           }
   4157         return false;
   4158       }
   4159 
   4160     case VEC_WIDEN_MULT_HI_EXPR:
   4161     case VEC_WIDEN_MULT_LO_EXPR:
   4162     case VEC_WIDEN_MULT_EVEN_EXPR:
   4163     case VEC_WIDEN_MULT_ODD_EXPR:
   4164       {
   4165         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
   4166             || TREE_CODE (lhs_type) != VECTOR_TYPE
   4167 	    || !types_compatible_p (rhs1_type, rhs2_type)
   4168 	    || maybe_ne (GET_MODE_SIZE (element_mode (lhs_type)),
   4169 			 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
   4170           {
   4171 	    error ("type mismatch in %qs", code_name);
   4172             debug_generic_expr (lhs_type);
   4173             debug_generic_expr (rhs1_type);
   4174             debug_generic_expr (rhs2_type);
   4175             return true;
   4176           }
   4177         return false;
   4178       }
   4179 
   4180     case VEC_PACK_TRUNC_EXPR:
   4181       /* ???  We currently use VEC_PACK_TRUNC_EXPR to simply concat
   4182 	 vector boolean types.  */
   4183       if (VECTOR_BOOLEAN_TYPE_P (lhs_type)
   4184 	  && VECTOR_BOOLEAN_TYPE_P (rhs1_type)
   4185 	  && types_compatible_p (rhs1_type, rhs2_type)
   4186 	  && known_eq (TYPE_VECTOR_SUBPARTS (lhs_type),
   4187 		       2 * TYPE_VECTOR_SUBPARTS (rhs1_type)))
   4188 	return false;
   4189 
   4190       /* Fallthru.  */
   4191     case VEC_PACK_SAT_EXPR:
   4192     case VEC_PACK_FIX_TRUNC_EXPR:
   4193       {
   4194         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
   4195             || TREE_CODE (lhs_type) != VECTOR_TYPE
   4196             || !((rhs_code == VEC_PACK_FIX_TRUNC_EXPR
   4197 		  && SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))
   4198 		  && INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)))
   4199 		 || (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
   4200 		     == INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))))
   4201 	    || !types_compatible_p (rhs1_type, rhs2_type)
   4202 	    || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)),
   4203 			 2 * GET_MODE_SIZE (element_mode (lhs_type)))
   4204 	    || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type),
   4205 			 TYPE_VECTOR_SUBPARTS (lhs_type)))
   4206           {
   4207 	    error ("type mismatch in %qs", code_name);
   4208             debug_generic_expr (lhs_type);
   4209             debug_generic_expr (rhs1_type);
   4210             debug_generic_expr (rhs2_type);
   4211             return true;
   4212           }
   4213 
   4214         return false;
   4215       }
   4216 
   4217     case VEC_PACK_FLOAT_EXPR:
   4218       if (TREE_CODE (rhs1_type) != VECTOR_TYPE
   4219 	  || TREE_CODE (lhs_type) != VECTOR_TYPE
   4220 	  || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
   4221 	  || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type))
   4222 	  || !types_compatible_p (rhs1_type, rhs2_type)
   4223 	  || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)),
   4224 		       2 * GET_MODE_SIZE (element_mode (lhs_type)))
   4225 	  || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type),
   4226 		       TYPE_VECTOR_SUBPARTS (lhs_type)))
   4227 	{
   4228 	  error ("type mismatch in %qs", code_name);
   4229 	  debug_generic_expr (lhs_type);
   4230 	  debug_generic_expr (rhs1_type);
   4231 	  debug_generic_expr (rhs2_type);
   4232 	  return true;
   4233 	}
   4234 
   4235       return false;
   4236 
   4237     case MULT_EXPR:
   4238     case MULT_HIGHPART_EXPR:
   4239     case TRUNC_DIV_EXPR:
   4240     case CEIL_DIV_EXPR:
   4241     case FLOOR_DIV_EXPR:
   4242     case ROUND_DIV_EXPR:
   4243     case TRUNC_MOD_EXPR:
   4244     case CEIL_MOD_EXPR:
   4245     case FLOOR_MOD_EXPR:
   4246     case ROUND_MOD_EXPR:
   4247     case RDIV_EXPR:
   4248     case EXACT_DIV_EXPR:
   4249     case BIT_IOR_EXPR:
   4250     case BIT_XOR_EXPR:
   4251       /* Disallow pointer and offset types for many of the binary gimple. */
   4252       if (POINTER_TYPE_P (lhs_type)
   4253 	  || TREE_CODE (lhs_type) == OFFSET_TYPE)
   4254 	{
   4255 	  error ("invalid types for %qs", code_name);
   4256 	  debug_generic_expr (lhs_type);
   4257 	  debug_generic_expr (rhs1_type);
   4258 	  debug_generic_expr (rhs2_type);
   4259 	  return true;
   4260 	}
   4261       /* Continue with generic binary expression handling.  */
   4262       break;
   4263 
   4264     case MIN_EXPR:
   4265     case MAX_EXPR:
   4266       /* Continue with generic binary expression handling.  */
   4267       break;
   4268 
   4269     case BIT_AND_EXPR:
   4270       if (POINTER_TYPE_P (lhs_type)
   4271 	  && TREE_CODE (rhs2) == INTEGER_CST)
   4272 	break;
   4273       /* Disallow pointer and offset types for many of the binary gimple. */
   4274       if (POINTER_TYPE_P (lhs_type)
   4275 	  || TREE_CODE (lhs_type) == OFFSET_TYPE)
   4276 	{
   4277 	  error ("invalid types for %qs", code_name);
   4278 	  debug_generic_expr (lhs_type);
   4279 	  debug_generic_expr (rhs1_type);
   4280 	  debug_generic_expr (rhs2_type);
   4281 	  return true;
   4282 	}
   4283       /* Continue with generic binary expression handling.  */
   4284       break;
   4285 
   4286     case VEC_SERIES_EXPR:
   4287       if (!useless_type_conversion_p (rhs1_type, rhs2_type))
   4288 	{
   4289 	  error ("type mismatch in %qs", code_name);
   4290 	  debug_generic_expr (rhs1_type);
   4291 	  debug_generic_expr (rhs2_type);
   4292 	  return true;
   4293 	}
   4294       if (TREE_CODE (lhs_type) != VECTOR_TYPE
   4295 	  || !useless_type_conversion_p (TREE_TYPE (lhs_type), rhs1_type))
   4296 	{
   4297 	  error ("vector type expected in %qs", code_name);
   4298 	  debug_generic_expr (lhs_type);
   4299 	  return true;
   4300 	}
   4301       return false;
   4302 
   4303     default:
   4304       gcc_unreachable ();
   4305     }
   4306 
   4307   if (!useless_type_conversion_p (lhs_type, rhs1_type)
   4308       || !useless_type_conversion_p (lhs_type, rhs2_type))
   4309     {
   4310       error ("type mismatch in binary expression");
   4311       debug_generic_stmt (lhs_type);
   4312       debug_generic_stmt (rhs1_type);
   4313       debug_generic_stmt (rhs2_type);
   4314       return true;
   4315     }
   4316 
   4317   return false;
   4318 }
   4319 
   4320 /* Verify a gimple assignment statement STMT with a ternary rhs.
   4321    Returns true if anything is wrong.  */
   4322 
   4323 static bool
   4324 verify_gimple_assign_ternary (gassign *stmt)
   4325 {
   4326   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
   4327   tree lhs = gimple_assign_lhs (stmt);
   4328   tree lhs_type = TREE_TYPE (lhs);
   4329   tree rhs1 = gimple_assign_rhs1 (stmt);
   4330   tree rhs1_type = TREE_TYPE (rhs1);
   4331   tree rhs2 = gimple_assign_rhs2 (stmt);
   4332   tree rhs2_type = TREE_TYPE (rhs2);
   4333   tree rhs3 = gimple_assign_rhs3 (stmt);
   4334   tree rhs3_type = TREE_TYPE (rhs3);
   4335 
   4336   if (!is_gimple_reg (lhs))
   4337     {
   4338       error ("non-register as LHS of ternary operation");
   4339       return true;
   4340     }
   4341 
   4342   if (!is_gimple_val (rhs1)
   4343       || !is_gimple_val (rhs2)
   4344       || !is_gimple_val (rhs3))
   4345     {
   4346       error ("invalid operands in ternary operation");
   4347       return true;
   4348     }
   4349 
   4350   const char* const code_name = get_tree_code_name (rhs_code);
   4351 
   4352   /* First handle operations that involve different types.  */
   4353   switch (rhs_code)
   4354     {
   4355     case WIDEN_MULT_PLUS_EXPR:
   4356     case WIDEN_MULT_MINUS_EXPR:
   4357       if ((!INTEGRAL_TYPE_P (rhs1_type)
   4358 	   && !FIXED_POINT_TYPE_P (rhs1_type))
   4359 	  || !useless_type_conversion_p (rhs1_type, rhs2_type)
   4360 	  || !useless_type_conversion_p (lhs_type, rhs3_type)
   4361 	  || 2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)
   4362 	  || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))
   4363 	{
   4364 	  error ("type mismatch in %qs", code_name);
   4365 	  debug_generic_expr (lhs_type);
   4366 	  debug_generic_expr (rhs1_type);
   4367 	  debug_generic_expr (rhs2_type);
   4368 	  debug_generic_expr (rhs3_type);
   4369 	  return true;
   4370 	}
   4371       break;
   4372 
   4373     case VEC_COND_EXPR:
   4374       if (!VECTOR_BOOLEAN_TYPE_P (rhs1_type)
   4375 	  || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type),
   4376 		       TYPE_VECTOR_SUBPARTS (lhs_type)))
   4377 	{
   4378 	  error ("the first argument of a %qs must be of a "
   4379 		 "boolean vector type of the same number of elements "
   4380 		 "as the result", code_name);
   4381 	  debug_generic_expr (lhs_type);
   4382 	  debug_generic_expr (rhs1_type);
   4383 	  return true;
   4384 	}
   4385       /* Fallthrough.  */
   4386     case COND_EXPR:
   4387       if (!useless_type_conversion_p (lhs_type, rhs2_type)
   4388 	  || !useless_type_conversion_p (lhs_type, rhs3_type))
   4389 	{
   4390 	  error ("type mismatch in %qs", code_name);
   4391 	  debug_generic_expr (lhs_type);
   4392 	  debug_generic_expr (rhs2_type);
   4393 	  debug_generic_expr (rhs3_type);
   4394 	  return true;
   4395 	}
   4396       break;
   4397 
   4398     case VEC_PERM_EXPR:
   4399       /* If permute is constant, then we allow for lhs and rhs
   4400 	 to have different vector types, provided:
   4401 	 (1) lhs, rhs1, rhs2 have same element type.
   4402 	 (2) rhs3 vector is constant and has integer element type.
   4403 	 (3) len(lhs) == len(rhs3) && len(rhs1) == len(rhs2).  */
   4404 
   4405       if (TREE_CODE (lhs_type) != VECTOR_TYPE
   4406 	  || TREE_CODE (rhs1_type) != VECTOR_TYPE
   4407 	  || TREE_CODE (rhs2_type) != VECTOR_TYPE
   4408 	  || TREE_CODE (rhs3_type) != VECTOR_TYPE)
   4409 	{
   4410 	  error ("vector types expected in %qs", code_name);
   4411 	  debug_generic_expr (lhs_type);
   4412 	  debug_generic_expr (rhs1_type);
   4413 	  debug_generic_expr (rhs2_type);
   4414 	  debug_generic_expr (rhs3_type);
   4415 	  return true;
   4416 	}
   4417 
   4418       /* If rhs3 is constant, we allow lhs, rhs1 and rhs2 to be different vector types,
   4419 	 as long as lhs, rhs1 and rhs2 have same element type.  */
   4420       if (TREE_CONSTANT (rhs3)
   4421 	  ? (!useless_type_conversion_p (TREE_TYPE (lhs_type), TREE_TYPE (rhs1_type))
   4422 	     || !useless_type_conversion_p (TREE_TYPE (lhs_type), TREE_TYPE (rhs2_type)))
   4423 	  : (!useless_type_conversion_p (lhs_type, rhs1_type)
   4424 	     || !useless_type_conversion_p (lhs_type, rhs2_type)))
   4425 	{
   4426 	    error ("type mismatch in %qs", code_name);
   4427 	    debug_generic_expr (lhs_type);
   4428 	    debug_generic_expr (rhs1_type);
   4429 	    debug_generic_expr (rhs2_type);
   4430 	    debug_generic_expr (rhs3_type);
   4431 	    return true;
   4432 	}
   4433 
   4434       /* If rhs3 is constant, relax the check len(rhs2) == len(rhs3).  */
   4435       if (maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type),
   4436 		    TYPE_VECTOR_SUBPARTS (rhs2_type))
   4437 	  || (!TREE_CONSTANT(rhs3)
   4438 	      && maybe_ne (TYPE_VECTOR_SUBPARTS (rhs2_type),
   4439 			   TYPE_VECTOR_SUBPARTS (rhs3_type)))
   4440 	  || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs3_type),
   4441 		       TYPE_VECTOR_SUBPARTS (lhs_type)))
   4442 	{
   4443 	  error ("vectors with different element number found in %qs",
   4444 		 code_name);
   4445 	  debug_generic_expr (lhs_type);
   4446 	  debug_generic_expr (rhs1_type);
   4447 	  debug_generic_expr (rhs2_type);
   4448 	  debug_generic_expr (rhs3_type);
   4449 	  return true;
   4450 	}
   4451 
   4452       if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
   4453 	  || (TREE_CODE (rhs3) != VECTOR_CST
   4454 	      && (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE
   4455 				    (TREE_TYPE (rhs3_type)))
   4456 		  != GET_MODE_BITSIZE (SCALAR_TYPE_MODE
   4457 				       (TREE_TYPE (rhs1_type))))))
   4458 	{
   4459 	  error ("invalid mask type in %qs", code_name);
   4460 	  debug_generic_expr (lhs_type);
   4461 	  debug_generic_expr (rhs1_type);
   4462 	  debug_generic_expr (rhs2_type);
   4463 	  debug_generic_expr (rhs3_type);
   4464 	  return true;
   4465 	}
   4466 
   4467       return false;
   4468 
   4469     case SAD_EXPR:
   4470       if (!useless_type_conversion_p (rhs1_type, rhs2_type)
   4471 	  || !useless_type_conversion_p (lhs_type, rhs3_type)
   4472 	  || 2 * GET_MODE_UNIT_BITSIZE (TYPE_MODE (TREE_TYPE (rhs1_type)))
   4473 	       > GET_MODE_UNIT_BITSIZE (TYPE_MODE (TREE_TYPE (lhs_type))))
   4474 	{
   4475 	  error ("type mismatch in %qs", code_name);
   4476 	  debug_generic_expr (lhs_type);
   4477 	  debug_generic_expr (rhs1_type);
   4478 	  debug_generic_expr (rhs2_type);
   4479 	  debug_generic_expr (rhs3_type);
   4480 	  return true;
   4481 	}
   4482 
   4483       if (TREE_CODE (rhs1_type) != VECTOR_TYPE
   4484 	  || TREE_CODE (rhs2_type) != VECTOR_TYPE
   4485 	  || TREE_CODE (rhs3_type) != VECTOR_TYPE)
   4486 	{
   4487 	  error ("vector types expected in %qs", code_name);
   4488 	  debug_generic_expr (lhs_type);
   4489 	  debug_generic_expr (rhs1_type);
   4490 	  debug_generic_expr (rhs2_type);
   4491 	  debug_generic_expr (rhs3_type);
   4492 	  return true;
   4493 	}
   4494 
   4495       return false;
   4496 
   4497     case BIT_INSERT_EXPR:
   4498       if (! useless_type_conversion_p (lhs_type, rhs1_type))
   4499 	{
   4500 	  error ("type mismatch in %qs", code_name);
   4501 	  debug_generic_expr (lhs_type);
   4502 	  debug_generic_expr (rhs1_type);
   4503 	  return true;
   4504 	}
   4505       if (! ((INTEGRAL_TYPE_P (rhs1_type)
   4506 	      && INTEGRAL_TYPE_P (rhs2_type))
   4507 	     /* Vector element insert.  */
   4508 	     || (VECTOR_TYPE_P (rhs1_type)
   4509 		 && types_compatible_p (TREE_TYPE (rhs1_type), rhs2_type))
   4510 	     /* Aligned sub-vector insert.  */
   4511 	     || (VECTOR_TYPE_P (rhs1_type)
   4512 		 && VECTOR_TYPE_P (rhs2_type)
   4513 		 && types_compatible_p (TREE_TYPE (rhs1_type),
   4514 					TREE_TYPE (rhs2_type))
   4515 		 && multiple_p (TYPE_VECTOR_SUBPARTS (rhs1_type),
   4516 				TYPE_VECTOR_SUBPARTS (rhs2_type))
   4517 		 && multiple_p (wi::to_poly_offset (rhs3),
   4518 				wi::to_poly_offset (TYPE_SIZE (rhs2_type))))))
   4519 	{
   4520 	  error ("not allowed type combination in %qs", code_name);
   4521 	  debug_generic_expr (rhs1_type);
   4522 	  debug_generic_expr (rhs2_type);
   4523 	  return true;
   4524 	}
   4525       if (! tree_fits_uhwi_p (rhs3)
   4526 	  || ! types_compatible_p (bitsizetype, TREE_TYPE (rhs3))
   4527 	  || ! tree_fits_uhwi_p (TYPE_SIZE (rhs2_type)))
   4528 	{
   4529 	  error ("invalid position or size in %qs", code_name);
   4530 	  return true;
   4531 	}
   4532       if (INTEGRAL_TYPE_P (rhs1_type)
   4533 	  && !type_has_mode_precision_p (rhs1_type))
   4534 	{
   4535 	  error ("%qs into non-mode-precision operand", code_name);
   4536 	  return true;
   4537 	}
   4538       if (INTEGRAL_TYPE_P (rhs1_type))
   4539 	{
   4540 	  unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (rhs3);
   4541 	  if (bitpos >= TYPE_PRECISION (rhs1_type)
   4542 	      || (bitpos + TYPE_PRECISION (rhs2_type)
   4543 		  > TYPE_PRECISION (rhs1_type)))
   4544 	    {
   4545 	      error ("insertion out of range in %qs", code_name);
   4546 	      return true;
   4547 	    }
   4548 	}
   4549       else if (VECTOR_TYPE_P (rhs1_type))
   4550 	{
   4551 	  unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (rhs3);
   4552 	  unsigned HOST_WIDE_INT bitsize = tree_to_uhwi (TYPE_SIZE (rhs2_type));
   4553 	  if (bitpos % bitsize != 0)
   4554 	    {
   4555 	      error ("%qs not at element boundary", code_name);
   4556 	      return true;
   4557 	    }
   4558 	}
   4559       return false;
   4560 
   4561     case DOT_PROD_EXPR:
   4562       {
   4563         if (((TREE_CODE (rhs1_type) != VECTOR_TYPE
   4564 	      || TREE_CODE (lhs_type) != VECTOR_TYPE)
   4565 	     && ((!INTEGRAL_TYPE_P (rhs1_type)
   4566 		  && !SCALAR_FLOAT_TYPE_P (rhs1_type))
   4567 		 || (!INTEGRAL_TYPE_P (lhs_type)
   4568 		     && !SCALAR_FLOAT_TYPE_P (lhs_type))))
   4569 	    /* rhs1_type and rhs2_type may differ in sign.  */
   4570 	    || !tree_nop_conversion_p (rhs1_type, rhs2_type)
   4571 	    || !useless_type_conversion_p (lhs_type, rhs3_type)
   4572 	    || maybe_lt (GET_MODE_SIZE (element_mode (rhs3_type)),
   4573 			 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
   4574           {
   4575 	    error ("type mismatch in %qs", code_name);
   4576             debug_generic_expr (lhs_type);
   4577             debug_generic_expr (rhs1_type);
   4578             debug_generic_expr (rhs2_type);
   4579             return true;
   4580           }
   4581         return false;
   4582       }
   4583 
   4584     case REALIGN_LOAD_EXPR:
   4585       /* FIXME.  */
   4586       return false;
   4587 
   4588     default:
   4589       gcc_unreachable ();
   4590     }
   4591   return false;
   4592 }
   4593 
   4594 /* Verify a gimple assignment statement STMT with a single rhs.
   4595    Returns true if anything is wrong.  */
   4596 
   4597 static bool
   4598 verify_gimple_assign_single (gassign *stmt)
   4599 {
   4600   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
   4601   tree lhs = gimple_assign_lhs (stmt);
   4602   tree lhs_type = TREE_TYPE (lhs);
   4603   tree rhs1 = gimple_assign_rhs1 (stmt);
   4604   tree rhs1_type = TREE_TYPE (rhs1);
   4605   bool res = false;
   4606 
   4607   const char* const code_name = get_tree_code_name (rhs_code);
   4608 
   4609   if (!useless_type_conversion_p (lhs_type, rhs1_type))
   4610     {
   4611       error ("non-trivial conversion in %qs", code_name);
   4612       debug_generic_expr (lhs_type);
   4613       debug_generic_expr (rhs1_type);
   4614       return true;
   4615     }
   4616 
   4617   if (gimple_clobber_p (stmt)
   4618       && !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF))
   4619     {
   4620       error ("%qs LHS in clobber statement",
   4621 	     get_tree_code_name (TREE_CODE (lhs)));
   4622       debug_generic_expr (lhs);
   4623       return true;
   4624     }
   4625 
   4626   if (TREE_CODE (lhs) == WITH_SIZE_EXPR)
   4627     {
   4628       error ("%qs LHS in assignment statement",
   4629 	     get_tree_code_name (TREE_CODE (lhs)));
   4630       debug_generic_expr (lhs);
   4631       return true;
   4632     }
   4633 
   4634   if (handled_component_p (lhs)
   4635       || TREE_CODE (lhs) == MEM_REF
   4636       || TREE_CODE (lhs) == TARGET_MEM_REF)
   4637     res |= verify_types_in_gimple_reference (lhs, true);
   4638 
   4639   /* Special codes we cannot handle via their class.  */
   4640   switch (rhs_code)
   4641     {
   4642     case ADDR_EXPR:
   4643       {
   4644 	tree op = TREE_OPERAND (rhs1, 0);
   4645 	if (!is_gimple_addressable (op))
   4646 	  {
   4647 	    error ("invalid operand in %qs", code_name);
   4648 	    return true;
   4649 	  }
   4650 
   4651 	/* Technically there is no longer a need for matching types, but
   4652 	   gimple hygiene asks for this check.  In LTO we can end up
   4653 	   combining incompatible units and thus end up with addresses
   4654 	   of globals that change their type to a common one.  */
   4655 	if (!in_lto_p
   4656 	    && !types_compatible_p (TREE_TYPE (op),
   4657 				    TREE_TYPE (TREE_TYPE (rhs1)))
   4658 	    && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
   4659 							  TREE_TYPE (op)))
   4660 	  {
   4661 	    error ("type mismatch in %qs", code_name);
   4662 	    debug_generic_stmt (TREE_TYPE (rhs1));
   4663 	    debug_generic_stmt (TREE_TYPE (op));
   4664 	    return true;
   4665 	  }
   4666 
   4667 	return (verify_address (rhs1, true)
   4668 		|| verify_types_in_gimple_reference (op, true));
   4669       }
   4670 
   4671     /* tcc_reference  */
   4672     case INDIRECT_REF:
   4673       error ("%qs in gimple IL", code_name);
   4674       return true;
   4675 
   4676     case WITH_SIZE_EXPR:
   4677       if (!is_gimple_val (TREE_OPERAND (rhs1, 1)))
   4678 	{
   4679 	  error ("invalid %qs size argument in load", code_name);
   4680 	  debug_generic_stmt (lhs);
   4681 	  debug_generic_stmt (rhs1);
   4682 	  return true;
   4683 	}
   4684       rhs1 = TREE_OPERAND (rhs1, 0);
   4685       /* Fallthru.  */
   4686     case COMPONENT_REF:
   4687     case BIT_FIELD_REF:
   4688     case ARRAY_REF:
   4689     case ARRAY_RANGE_REF:
   4690     case VIEW_CONVERT_EXPR:
   4691     case REALPART_EXPR:
   4692     case IMAGPART_EXPR:
   4693     case TARGET_MEM_REF:
   4694     case MEM_REF:
   4695       if (!is_gimple_reg (lhs)
   4696 	  && is_gimple_reg_type (TREE_TYPE (lhs)))
   4697 	{
   4698 	  error ("invalid RHS for gimple memory store: %qs", code_name);
   4699 	  debug_generic_stmt (lhs);
   4700 	  debug_generic_stmt (rhs1);
   4701 	  return true;
   4702 	}
   4703       return res || verify_types_in_gimple_reference (rhs1, false);
   4704 
   4705     /* tcc_constant  */
   4706     case SSA_NAME:
   4707     case INTEGER_CST:
   4708     case REAL_CST:
   4709     case FIXED_CST:
   4710     case COMPLEX_CST:
   4711     case VECTOR_CST:
   4712     case STRING_CST:
   4713       return res;
   4714 
   4715     /* tcc_declaration  */
   4716     case CONST_DECL:
   4717       return res;
   4718     case VAR_DECL:
   4719     case PARM_DECL:
   4720       if (!is_gimple_reg (lhs)
   4721 	  && !is_gimple_reg (rhs1)
   4722 	  && is_gimple_reg_type (TREE_TYPE (lhs)))
   4723 	{
   4724 	  error ("invalid RHS for gimple memory store: %qs", code_name);
   4725 	  debug_generic_stmt (lhs);
   4726 	  debug_generic_stmt (rhs1);
   4727 	  return true;
   4728 	}
   4729       return res;
   4730 
   4731     case CONSTRUCTOR:
   4732       if (VECTOR_TYPE_P (rhs1_type))
   4733 	{
   4734 	  unsigned int i;
   4735 	  tree elt_i, elt_v, elt_t = NULL_TREE;
   4736 
   4737 	  if (CONSTRUCTOR_NELTS (rhs1) == 0)
   4738 	    return res;
   4739 	  /* For vector CONSTRUCTORs we require that either it is empty
   4740 	     CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements
   4741 	     (then the element count must be correct to cover the whole
   4742 	     outer vector and index must be NULL on all elements, or it is
   4743 	     a CONSTRUCTOR of scalar elements, where we as an exception allow
   4744 	     smaller number of elements (assuming zero filling) and
   4745 	     consecutive indexes as compared to NULL indexes (such
   4746 	     CONSTRUCTORs can appear in the IL from FEs).  */
   4747 	  FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, elt_i, elt_v)
   4748 	    {
   4749 	      if (elt_t == NULL_TREE)
   4750 		{
   4751 		  elt_t = TREE_TYPE (elt_v);
   4752 		  if (VECTOR_TYPE_P (elt_t))
   4753 		    {
   4754 		      tree elt_t = TREE_TYPE (elt_v);
   4755 		      if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
   4756 						      TREE_TYPE (elt_t)))
   4757 			{
   4758 			  error ("incorrect type of vector %qs elements",
   4759 				 code_name);
   4760 			  debug_generic_stmt (rhs1);
   4761 			  return true;
   4762 			}
   4763 		      else if (maybe_ne (CONSTRUCTOR_NELTS (rhs1)
   4764 					 * TYPE_VECTOR_SUBPARTS (elt_t),
   4765 					 TYPE_VECTOR_SUBPARTS (rhs1_type)))
   4766 			{
   4767 			  error ("incorrect number of vector %qs elements",
   4768 				 code_name);
   4769 			  debug_generic_stmt (rhs1);
   4770 			  return true;
   4771 			}
   4772 		    }
   4773 		  else if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
   4774 						       elt_t))
   4775 		    {
   4776 		      error ("incorrect type of vector %qs elements",
   4777 			     code_name);
   4778 		      debug_generic_stmt (rhs1);
   4779 		      return true;
   4780 		    }
   4781 		  else if (maybe_gt (CONSTRUCTOR_NELTS (rhs1),
   4782 				     TYPE_VECTOR_SUBPARTS (rhs1_type)))
   4783 		    {
   4784 		      error ("incorrect number of vector %qs elements",
   4785 			     code_name);
   4786 		      debug_generic_stmt (rhs1);
   4787 		      return true;
   4788 		    }
   4789 		}
   4790 	      else if (!useless_type_conversion_p (elt_t, TREE_TYPE (elt_v)))
   4791 		{
   4792 		  error ("incorrect type of vector CONSTRUCTOR elements");
   4793 		  debug_generic_stmt (rhs1);
   4794 		  return true;
   4795 		}
   4796 	      if (elt_i != NULL_TREE
   4797 		  && (VECTOR_TYPE_P (elt_t)
   4798 		      || TREE_CODE (elt_i) != INTEGER_CST
   4799 		      || compare_tree_int (elt_i, i) != 0))
   4800 		{
   4801 		  error ("vector %qs with non-NULL element index",
   4802 			 code_name);
   4803 		  debug_generic_stmt (rhs1);
   4804 		  return true;
   4805 		}
   4806 	      if (!is_gimple_val (elt_v))
   4807 		{
   4808 		  error ("vector %qs element is not a GIMPLE value",
   4809 			 code_name);
   4810 		  debug_generic_stmt (rhs1);
   4811 		  return true;
   4812 		}
   4813 	    }
   4814 	}
   4815       else if (CONSTRUCTOR_NELTS (rhs1) != 0)
   4816 	{
   4817 	  error ("non-vector %qs with elements", code_name);
   4818 	  debug_generic_stmt (rhs1);
   4819 	  return true;
   4820 	}
   4821       return res;
   4822 
   4823     case OBJ_TYPE_REF:
   4824       /* FIXME.  */
   4825       return res;
   4826 
   4827     default:;
   4828     }
   4829 
   4830   return res;
   4831 }
   4832 
   4833 /* Verify the contents of a GIMPLE_ASSIGN STMT.  Returns true when there
   4834    is a problem, otherwise false.  */
   4835 
   4836 static bool
   4837 verify_gimple_assign (gassign *stmt)
   4838 {
   4839   switch (gimple_assign_rhs_class (stmt))
   4840     {
   4841     case GIMPLE_SINGLE_RHS:
   4842       return verify_gimple_assign_single (stmt);
   4843 
   4844     case GIMPLE_UNARY_RHS:
   4845       return verify_gimple_assign_unary (stmt);
   4846 
   4847     case GIMPLE_BINARY_RHS:
   4848       return verify_gimple_assign_binary (stmt);
   4849 
   4850     case GIMPLE_TERNARY_RHS:
   4851       return verify_gimple_assign_ternary (stmt);
   4852 
   4853     default:
   4854       gcc_unreachable ();
   4855     }
   4856 }
   4857 
   4858 /* Verify the contents of a GIMPLE_RETURN STMT.  Returns true when there
   4859    is a problem, otherwise false.  */
   4860 
   4861 static bool
   4862 verify_gimple_return (greturn *stmt)
   4863 {
   4864   tree op = gimple_return_retval (stmt);
   4865   tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
   4866 
   4867   /* We cannot test for present return values as we do not fix up missing
   4868      return values from the original source.  */
   4869   if (op == NULL)
   4870     return false;
   4871 
   4872   if (!is_gimple_val (op)
   4873       && TREE_CODE (op) != RESULT_DECL)
   4874     {
   4875       error ("invalid operand in return statement");
   4876       debug_generic_stmt (op);
   4877       return true;
   4878     }
   4879 
   4880   if ((TREE_CODE (op) == RESULT_DECL
   4881        && DECL_BY_REFERENCE (op))
   4882       || (TREE_CODE (op) == SSA_NAME
   4883 	  && SSA_NAME_VAR (op)
   4884 	  && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL
   4885 	  && DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
   4886     op = TREE_TYPE (op);
   4887 
   4888   if (!useless_type_conversion_p (restype, TREE_TYPE (op)))
   4889     {
   4890       error ("invalid conversion in return statement");
   4891       debug_generic_stmt (restype);
   4892       debug_generic_stmt (TREE_TYPE (op));
   4893       return true;
   4894     }
   4895 
   4896   return false;
   4897 }
   4898 
   4899 
   4900 /* Verify the contents of a GIMPLE_GOTO STMT.  Returns true when there
   4901    is a problem, otherwise false.  */
   4902 
   4903 static bool
   4904 verify_gimple_goto (ggoto *stmt)
   4905 {
   4906   tree dest = gimple_goto_dest (stmt);
   4907 
   4908   /* ???  We have two canonical forms of direct goto destinations, a
   4909      bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL.  */
   4910   if (TREE_CODE (dest) != LABEL_DECL
   4911       && (!is_gimple_val (dest)
   4912 	  || !POINTER_TYPE_P (TREE_TYPE (dest))))
   4913     {
   4914       error ("goto destination is neither a label nor a pointer");
   4915       return true;
   4916     }
   4917 
   4918   return false;
   4919 }
   4920 
   4921 /* Verify the contents of a GIMPLE_SWITCH STMT.  Returns true when there
   4922    is a problem, otherwise false.  */
   4923 
   4924 static bool
   4925 verify_gimple_switch (gswitch *stmt)
   4926 {
   4927   unsigned int i, n;
   4928   tree elt, prev_upper_bound = NULL_TREE;
   4929   tree index_type, elt_type = NULL_TREE;
   4930 
   4931   if (!is_gimple_val (gimple_switch_index (stmt)))
   4932     {
   4933       error ("invalid operand to switch statement");
   4934       debug_generic_stmt (gimple_switch_index (stmt));
   4935       return true;
   4936     }
   4937 
   4938   index_type = TREE_TYPE (gimple_switch_index (stmt));
   4939   if (! INTEGRAL_TYPE_P (index_type))
   4940     {
   4941       error ("non-integral type switch statement");
   4942       debug_generic_expr (index_type);
   4943       return true;
   4944     }
   4945 
   4946   elt = gimple_switch_label (stmt, 0);
   4947   if (CASE_LOW (elt) != NULL_TREE
   4948       || CASE_HIGH (elt) != NULL_TREE
   4949       || CASE_CHAIN (elt) != NULL_TREE)
   4950     {
   4951       error ("invalid default case label in switch statement");
   4952       debug_generic_expr (elt);
   4953       return true;
   4954     }
   4955 
   4956   n = gimple_switch_num_labels (stmt);
   4957   for (i = 1; i < n; i++)
   4958     {
   4959       elt = gimple_switch_label (stmt, i);
   4960 
   4961       if (CASE_CHAIN (elt))
   4962 	{
   4963 	  error ("invalid %<CASE_CHAIN%>");
   4964 	  debug_generic_expr (elt);
   4965 	  return true;
   4966 	}
   4967       if (! CASE_LOW (elt))
   4968 	{
   4969 	  error ("invalid case label in switch statement");
   4970 	  debug_generic_expr (elt);
   4971 	  return true;
   4972 	}
   4973       if (CASE_HIGH (elt)
   4974 	  && ! tree_int_cst_lt (CASE_LOW (elt), CASE_HIGH (elt)))
   4975 	{
   4976 	  error ("invalid case range in switch statement");
   4977 	  debug_generic_expr (elt);
   4978 	  return true;
   4979 	}
   4980 
   4981       if (! elt_type)
   4982 	{
   4983 	  elt_type = TREE_TYPE (CASE_LOW (elt));
   4984 	  if (TYPE_PRECISION (index_type) < TYPE_PRECISION (elt_type))
   4985 	    {
   4986 	      error ("type precision mismatch in switch statement");
   4987 	      return true;
   4988 	    }
   4989 	}
   4990       if (TREE_TYPE (CASE_LOW (elt)) != elt_type
   4991           || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type))
   4992 	{
   4993 	  error ("type mismatch for case label in switch statement");
   4994 	  debug_generic_expr (elt);
   4995 	  return true;
   4996 	}
   4997 
   4998       if (prev_upper_bound)
   4999 	{
   5000 	  if (! tree_int_cst_lt (prev_upper_bound, CASE_LOW (elt)))
   5001 	    {
   5002 	      error ("case labels not sorted in switch statement");
   5003 	      return true;
   5004 	    }
   5005 	}
   5006 
   5007       prev_upper_bound = CASE_HIGH (elt);
   5008       if (! prev_upper_bound)
   5009 	prev_upper_bound = CASE_LOW (elt);
   5010     }
   5011 
   5012   return false;
   5013 }
   5014 
   5015 /* Verify a gimple debug statement STMT.
   5016    Returns true if anything is wrong.  */
   5017 
   5018 static bool
   5019 verify_gimple_debug (gimple *stmt ATTRIBUTE_UNUSED)
   5020 {
   5021   /* There isn't much that could be wrong in a gimple debug stmt.  A
   5022      gimple debug bind stmt, for example, maps a tree, that's usually
   5023      a VAR_DECL or a PARM_DECL, but that could also be some scalarized
   5024      component or member of an aggregate type, to another tree, that
   5025      can be an arbitrary expression.  These stmts expand into debug
   5026      insns, and are converted to debug notes by var-tracking.cc.  */
   5027   return false;
   5028 }
   5029 
   5030 /* Verify a gimple label statement STMT.
   5031    Returns true if anything is wrong.  */
   5032 
   5033 static bool
   5034 verify_gimple_label (glabel *stmt)
   5035 {
   5036   tree decl = gimple_label_label (stmt);
   5037   int uid;
   5038   bool err = false;
   5039 
   5040   if (TREE_CODE (decl) != LABEL_DECL)
   5041     return true;
   5042   if (!DECL_NONLOCAL (decl) && !FORCED_LABEL (decl)
   5043       && DECL_CONTEXT (decl) != current_function_decl)
   5044     {
   5045       error ("label context is not the current function declaration");
   5046       err |= true;
   5047     }
   5048 
   5049   uid = LABEL_DECL_UID (decl);
   5050   if (cfun->cfg
   5051       && (uid == -1
   5052 	  || (*label_to_block_map_for_fn (cfun))[uid] != gimple_bb (stmt)))
   5053     {
   5054       error ("incorrect entry in %<label_to_block_map%>");
   5055       err |= true;
   5056     }
   5057 
   5058   uid = EH_LANDING_PAD_NR (decl);
   5059   if (uid)
   5060     {
   5061       eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
   5062       if (decl != lp->post_landing_pad)
   5063 	{
   5064 	  error ("incorrect setting of landing pad number");
   5065 	  err |= true;
   5066 	}
   5067     }
   5068 
   5069   return err;
   5070 }
   5071 
   5072 /* Verify a gimple cond statement STMT.
   5073    Returns true if anything is wrong.  */
   5074 
   5075 static bool
   5076 verify_gimple_cond (gcond *stmt)
   5077 {
   5078   if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison)
   5079     {
   5080       error ("invalid comparison code in gimple cond");
   5081       return true;
   5082     }
   5083   if (!(!gimple_cond_true_label (stmt)
   5084 	|| TREE_CODE (gimple_cond_true_label (stmt)) == LABEL_DECL)
   5085       || !(!gimple_cond_false_label (stmt)
   5086 	   || TREE_CODE (gimple_cond_false_label (stmt)) == LABEL_DECL))
   5087     {
   5088       error ("invalid labels in gimple cond");
   5089       return true;
   5090     }
   5091 
   5092   return verify_gimple_comparison (boolean_type_node,
   5093 				   gimple_cond_lhs (stmt),
   5094 				   gimple_cond_rhs (stmt),
   5095 				   gimple_cond_code (stmt));
   5096 }
   5097 
   5098 /* Verify the GIMPLE statement STMT.  Returns true if there is an
   5099    error, otherwise false.  */
   5100 
   5101 static bool
   5102 verify_gimple_stmt (gimple *stmt)
   5103 {
   5104   switch (gimple_code (stmt))
   5105     {
   5106     case GIMPLE_ASSIGN:
   5107       return verify_gimple_assign (as_a <gassign *> (stmt));
   5108 
   5109     case GIMPLE_LABEL:
   5110       return verify_gimple_label (as_a <glabel *> (stmt));
   5111 
   5112     case GIMPLE_CALL:
   5113       return verify_gimple_call (as_a <gcall *> (stmt));
   5114 
   5115     case GIMPLE_COND:
   5116       return verify_gimple_cond (as_a <gcond *> (stmt));
   5117 
   5118     case GIMPLE_GOTO:
   5119       return verify_gimple_goto (as_a <ggoto *> (stmt));
   5120 
   5121     case GIMPLE_SWITCH:
   5122       return verify_gimple_switch (as_a <gswitch *> (stmt));
   5123 
   5124     case GIMPLE_RETURN:
   5125       return verify_gimple_return (as_a <greturn *> (stmt));
   5126 
   5127     case GIMPLE_ASM:
   5128       return false;
   5129 
   5130     case GIMPLE_TRANSACTION:
   5131       return verify_gimple_transaction (as_a <gtransaction *> (stmt));
   5132 
   5133     /* Tuples that do not have tree operands.  */
   5134     case GIMPLE_NOP:
   5135     case GIMPLE_PREDICT:
   5136     case GIMPLE_RESX:
   5137     case GIMPLE_EH_DISPATCH:
   5138     case GIMPLE_EH_MUST_NOT_THROW:
   5139       return false;
   5140 
   5141     CASE_GIMPLE_OMP:
   5142       /* OpenMP directives are validated by the FE and never operated
   5143 	 on by the optimizers.  Furthermore, GIMPLE_OMP_FOR may contain
   5144 	 non-gimple expressions when the main index variable has had
   5145 	 its address taken.  This does not affect the loop itself
   5146 	 because the header of an GIMPLE_OMP_FOR is merely used to determine
   5147 	 how to setup the parallel iteration.  */
   5148       return false;
   5149 
   5150     case GIMPLE_ASSUME:
   5151       return false;
   5152 
   5153     case GIMPLE_DEBUG:
   5154       return verify_gimple_debug (stmt);
   5155 
   5156     default:
   5157       gcc_unreachable ();
   5158     }
   5159 }
   5160 
   5161 /* Verify the contents of a GIMPLE_PHI.  Returns true if there is a problem,
   5162    and false otherwise.  */
   5163 
   5164 static bool
   5165 verify_gimple_phi (gphi *phi)
   5166 {
   5167   bool err = false;
   5168   unsigned i;
   5169   tree phi_result = gimple_phi_result (phi);
   5170   bool virtual_p;
   5171 
   5172   if (!phi_result)
   5173     {
   5174       error ("invalid %<PHI%> result");
   5175       return true;
   5176     }
   5177 
   5178   virtual_p = virtual_operand_p (phi_result);
   5179   if (TREE_CODE (phi_result) != SSA_NAME
   5180       || (virtual_p
   5181 	  && SSA_NAME_VAR (phi_result) != gimple_vop (cfun)))
   5182     {
   5183       error ("invalid %<PHI%> result");
   5184       err = true;
   5185     }
   5186 
   5187   for (i = 0; i < gimple_phi_num_args (phi); i++)
   5188     {
   5189       tree t = gimple_phi_arg_def (phi, i);
   5190 
   5191       if (!t)
   5192 	{
   5193 	  error ("missing %<PHI%> def");
   5194 	  err |= true;
   5195 	  continue;
   5196 	}
   5197       /* Addressable variables do have SSA_NAMEs but they
   5198 	 are not considered gimple values.  */
   5199       else if ((TREE_CODE (t) == SSA_NAME
   5200 		&& virtual_p != virtual_operand_p (t))
   5201 	       || (virtual_p
   5202 		   && (TREE_CODE (t) != SSA_NAME
   5203 		       || SSA_NAME_VAR (t) != gimple_vop (cfun)))
   5204 	       || (!virtual_p
   5205 		   && !is_gimple_val (t)))
   5206 	{
   5207 	  error ("invalid %<PHI%> argument");
   5208 	  debug_generic_expr (t);
   5209 	  err |= true;
   5210 	}
   5211 #ifdef ENABLE_TYPES_CHECKING
   5212       if (!useless_type_conversion_p (TREE_TYPE (phi_result), TREE_TYPE (t)))
   5213 	{
   5214 	  error ("incompatible types in %<PHI%> argument %u", i);
   5215 	  debug_generic_stmt (TREE_TYPE (phi_result));
   5216 	  debug_generic_stmt (TREE_TYPE (t));
   5217 	  err |= true;
   5218 	}
   5219 #endif
   5220     }
   5221 
   5222   return err;
   5223 }
   5224 
   5225 /* Verify the GIMPLE statements inside the sequence STMTS.  */
   5226 
   5227 static bool
   5228 verify_gimple_in_seq_2 (gimple_seq stmts)
   5229 {
   5230   gimple_stmt_iterator ittr;
   5231   bool err = false;
   5232 
   5233   for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
   5234     {
   5235       gimple *stmt = gsi_stmt (ittr);
   5236 
   5237       switch (gimple_code (stmt))
   5238         {
   5239 	case GIMPLE_BIND:
   5240 	  err |= verify_gimple_in_seq_2 (
   5241                    gimple_bind_body (as_a <gbind *> (stmt)));
   5242 	  break;
   5243 
   5244 	case GIMPLE_TRY:
   5245 	  err |= verify_gimple_in_seq_2 (gimple_try_eval (stmt));
   5246 	  err |= verify_gimple_in_seq_2 (gimple_try_cleanup (stmt));
   5247 	  break;
   5248 
   5249 	case GIMPLE_EH_FILTER:
   5250 	  err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt));
   5251 	  break;
   5252 
   5253 	case GIMPLE_EH_ELSE:
   5254 	  {
   5255 	    geh_else *eh_else = as_a <geh_else *> (stmt);
   5256 	    err |= verify_gimple_in_seq_2 (gimple_eh_else_n_body (eh_else));
   5257 	    err |= verify_gimple_in_seq_2 (gimple_eh_else_e_body (eh_else));
   5258 	  }
   5259 	  break;
   5260 
   5261 	case GIMPLE_CATCH:
   5262 	  err |= verify_gimple_in_seq_2 (gimple_catch_handler (
   5263 					   as_a <gcatch *> (stmt)));
   5264 	  break;
   5265 
   5266 	case GIMPLE_ASSUME:
   5267 	  err |= verify_gimple_in_seq_2 (gimple_assume_body (stmt));
   5268 	  break;
   5269 
   5270 	case GIMPLE_TRANSACTION:
   5271 	  err |= verify_gimple_transaction (as_a <gtransaction *> (stmt));
   5272 	  break;
   5273 
   5274 	default:
   5275 	  {
   5276 	    bool err2 = verify_gimple_stmt (stmt);
   5277 	    if (err2)
   5278 	      debug_gimple_stmt (stmt);
   5279 	    err |= err2;
   5280 	  }
   5281 	}
   5282     }
   5283 
   5284   return err;
   5285 }
   5286 
   5287 /* Verify the contents of a GIMPLE_TRANSACTION.  Returns true if there
   5288    is a problem, otherwise false.  */
   5289 
   5290 static bool
   5291 verify_gimple_transaction (gtransaction *stmt)
   5292 {
   5293   tree lab;
   5294 
   5295   lab = gimple_transaction_label_norm (stmt);
   5296   if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
   5297     return true;
   5298   lab = gimple_transaction_label_uninst (stmt);
   5299   if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
   5300     return true;
   5301   lab = gimple_transaction_label_over (stmt);
   5302   if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
   5303     return true;
   5304 
   5305   return verify_gimple_in_seq_2 (gimple_transaction_body (stmt));
   5306 }
   5307 
   5308 
   5309 /* Verify the GIMPLE statements inside the statement list STMTS.  */
   5310 
   5311 DEBUG_FUNCTION bool
   5312 verify_gimple_in_seq (gimple_seq stmts, bool ice)
   5313 {
   5314   timevar_push (TV_TREE_STMT_VERIFY);
   5315   bool res = verify_gimple_in_seq_2 (stmts);
   5316   if (res && ice)
   5317     internal_error ("%<verify_gimple%> failed");
   5318   timevar_pop (TV_TREE_STMT_VERIFY);
   5319   return res;
   5320 }
   5321 
   5322 /* Return true when the T can be shared.  */
   5323 
   5324 static bool
   5325 tree_node_can_be_shared (tree t)
   5326 {
   5327   if (IS_TYPE_OR_DECL_P (t)
   5328       || TREE_CODE (t) == SSA_NAME
   5329       || TREE_CODE (t) == IDENTIFIER_NODE
   5330       || TREE_CODE (t) == CASE_LABEL_EXPR
   5331       || is_gimple_min_invariant (t))
   5332     return true;
   5333 
   5334   if (t == error_mark_node)
   5335     return true;
   5336 
   5337   return false;
   5338 }
   5339 
   5340 /* Called via walk_tree.  Verify tree sharing.  */
   5341 
   5342 static tree
   5343 verify_node_sharing_1 (tree *tp, int *walk_subtrees, void *data)
   5344 {
   5345   hash_set<void *> *visited = (hash_set<void *> *) data;
   5346 
   5347   if (tree_node_can_be_shared (*tp))
   5348     {
   5349       *walk_subtrees = false;
   5350       return NULL;
   5351     }
   5352 
   5353   if (visited->add (*tp))
   5354     return *tp;
   5355 
   5356   return NULL;
   5357 }
   5358 
   5359 /* Called via walk_gimple_stmt.  Verify tree sharing.  */
   5360 
   5361 static tree
   5362 verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
   5363 {
   5364   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
   5365   return verify_node_sharing_1 (tp, walk_subtrees, wi->info);
   5366 }
   5367 
   5368 static bool eh_error_found;
   5369 bool
   5370 verify_eh_throw_stmt_node (gimple *const &stmt, const int &,
   5371 			   hash_set<gimple *> *visited)
   5372 {
   5373   if (!visited->contains (stmt))
   5374     {
   5375       error ("dead statement in EH table");
   5376       debug_gimple_stmt (stmt);
   5377       eh_error_found = true;
   5378     }
   5379   return true;
   5380 }
   5381 
   5382 /* Verify if the location LOCs block is in BLOCKS.  */
   5383 
   5384 static bool
   5385 verify_location (hash_set<tree> *blocks, location_t loc)
   5386 {
   5387   tree block = LOCATION_BLOCK (loc);
   5388   if (block != NULL_TREE
   5389       && !blocks->contains (block))
   5390     {
   5391       error ("location references block not in block tree");
   5392       return true;
   5393     }
   5394   if (block != NULL_TREE)
   5395     return verify_location (blocks, BLOCK_SOURCE_LOCATION (block));
   5396   return false;
   5397 }
   5398 
   5399 /* Called via walk_tree.  Verify that expressions have no blocks.  */
   5400 
   5401 static tree
   5402 verify_expr_no_block (tree *tp, int *walk_subtrees, void *)
   5403 {
   5404   if (!EXPR_P (*tp))
   5405     {
   5406       *walk_subtrees = false;
   5407       return NULL;
   5408     }
   5409 
   5410   location_t loc = EXPR_LOCATION (*tp);
   5411   if (LOCATION_BLOCK (loc) != NULL)
   5412     return *tp;
   5413 
   5414   return NULL;
   5415 }
   5416 
   5417 /* Called via walk_tree.  Verify locations of expressions.  */
   5418 
   5419 static tree
   5420 verify_expr_location_1 (tree *tp, int *walk_subtrees, void *data)
   5421 {
   5422   hash_set<tree> *blocks = (hash_set<tree> *) data;
   5423   tree t = *tp;
   5424 
   5425   /* ???  This doesn't really belong here but there's no good place to
   5426      stick this remainder of old verify_expr.  */
   5427   /* ???  This barfs on debug stmts which contain binds to vars with
   5428      different function context.  */
   5429 #if 0
   5430   if (VAR_P (t)
   5431       || TREE_CODE (t) == PARM_DECL
   5432       || TREE_CODE (t) == RESULT_DECL)
   5433     {
   5434       tree context = decl_function_context (t);
   5435       if (context != cfun->decl
   5436 	  && !SCOPE_FILE_SCOPE_P (context)
   5437 	  && !TREE_STATIC (t)
   5438 	  && !DECL_EXTERNAL (t))
   5439 	{
   5440 	  error ("local declaration from a different function");
   5441 	  return t;
   5442 	}
   5443     }
   5444 #endif
   5445 
   5446   if (VAR_P (t) && DECL_HAS_DEBUG_EXPR_P (t))
   5447     {
   5448       tree x = DECL_DEBUG_EXPR (t);
   5449       tree addr = walk_tree (&x, verify_expr_no_block, NULL, NULL);
   5450       if (addr)
   5451 	return addr;
   5452     }
   5453   if ((VAR_P (t)
   5454        || TREE_CODE (t) == PARM_DECL
   5455        || TREE_CODE (t) == RESULT_DECL)
   5456       && DECL_HAS_VALUE_EXPR_P (t))
   5457     {
   5458       tree x = DECL_VALUE_EXPR (t);
   5459       tree addr = walk_tree (&x, verify_expr_no_block, NULL, NULL);
   5460       if (addr)
   5461 	return addr;
   5462     }
   5463 
   5464   if (!EXPR_P (t))
   5465     {
   5466       *walk_subtrees = false;
   5467       return NULL;
   5468     }
   5469 
   5470   location_t loc = EXPR_LOCATION (t);
   5471   if (verify_location (blocks, loc))
   5472     return t;
   5473 
   5474   return NULL;
   5475 }
   5476 
   5477 /* Called via walk_gimple_op.  Verify locations of expressions.  */
   5478 
   5479 static tree
   5480 verify_expr_location (tree *tp, int *walk_subtrees, void *data)
   5481 {
   5482   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
   5483   return verify_expr_location_1 (tp, walk_subtrees, wi->info);
   5484 }
   5485 
   5486 /* Insert all subblocks of BLOCK into BLOCKS and recurse.  */
   5487 
   5488 static void
   5489 collect_subblocks (hash_set<tree> *blocks, tree block)
   5490 {
   5491   tree t;
   5492   for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
   5493     {
   5494       blocks->add (t);
   5495       collect_subblocks (blocks, t);
   5496     }
   5497 }
   5498 
   5499 /* Disable warnings about missing quoting in GCC diagnostics for
   5500    the verification errors.  Their format strings don't follow
   5501    GCC diagnostic conventions and trigger an ICE in the end.  */
   5502 #if __GNUC__ >= 10
   5503 #  pragma GCC diagnostic push
   5504 #  pragma GCC diagnostic ignored "-Wformat-diag"
   5505 #endif
   5506 
   5507 /* Verify the GIMPLE statements in the CFG of FN.  */
   5508 
   5509 DEBUG_FUNCTION bool
   5510 verify_gimple_in_cfg (struct function *fn, bool verify_nothrow, bool ice)
   5511 {
   5512   basic_block bb;
   5513   bool err = false;
   5514 
   5515   timevar_push (TV_TREE_STMT_VERIFY);
   5516   hash_set<void *> visited;
   5517   hash_set<gimple *> visited_throwing_stmts;
   5518 
   5519   /* Collect all BLOCKs referenced by the BLOCK tree of FN.  */
   5520   hash_set<tree> blocks;
   5521   if (DECL_INITIAL (fn->decl))
   5522     {
   5523       blocks.add (DECL_INITIAL (fn->decl));
   5524       collect_subblocks (&blocks, DECL_INITIAL (fn->decl));
   5525     }
   5526 
   5527   FOR_EACH_BB_FN (bb, fn)
   5528     {
   5529       gimple_stmt_iterator gsi;
   5530       edge_iterator ei;
   5531       edge e;
   5532 
   5533       for (gphi_iterator gpi = gsi_start_phis (bb);
   5534 	   !gsi_end_p (gpi);
   5535 	   gsi_next (&gpi))
   5536 	{
   5537 	  gphi *phi = gpi.phi ();
   5538 	  bool err2 = false;
   5539 	  unsigned i;
   5540 
   5541 	  if (gimple_bb (phi) != bb)
   5542 	    {
   5543 	      error ("gimple_bb (phi) is set to a wrong basic block");
   5544 	      err2 = true;
   5545 	    }
   5546 
   5547 	  err2 |= verify_gimple_phi (phi);
   5548 
   5549 	  /* Only PHI arguments have locations.  */
   5550 	  if (gimple_location (phi) != UNKNOWN_LOCATION)
   5551 	    {
   5552 	      error ("PHI node with location");
   5553 	      err2 = true;
   5554 	    }
   5555 
   5556 	  for (i = 0; i < gimple_phi_num_args (phi); i++)
   5557 	    {
   5558 	      tree arg = gimple_phi_arg_def (phi, i);
   5559 	      tree addr = walk_tree (&arg, verify_node_sharing_1,
   5560 				     &visited, NULL);
   5561 	      if (addr)
   5562 		{
   5563 		  error ("incorrect sharing of tree nodes");
   5564 		  debug_generic_expr (addr);
   5565 		  err2 |= true;
   5566 		}
   5567 	      location_t loc = gimple_phi_arg_location (phi, i);
   5568 	      if (virtual_operand_p (gimple_phi_result (phi))
   5569 		  && loc != UNKNOWN_LOCATION)
   5570 		{
   5571 		  error ("virtual PHI with argument locations");
   5572 		  err2 = true;
   5573 		}
   5574 	      addr = walk_tree (&arg, verify_expr_location_1, &blocks, NULL);
   5575 	      if (addr)
   5576 		{
   5577 		  debug_generic_expr (addr);
   5578 		  err2 = true;
   5579 		}
   5580 	      err2 |= verify_location (&blocks, loc);
   5581 	    }
   5582 
   5583 	  if (err2)
   5584 	    debug_gimple_stmt (phi);
   5585 	  err |= err2;
   5586 	}
   5587 
   5588       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   5589 	{
   5590 	  gimple *stmt = gsi_stmt (gsi);
   5591 	  bool err2 = false;
   5592 	  struct walk_stmt_info wi;
   5593 	  tree addr;
   5594 	  int lp_nr;
   5595 
   5596 	  if (gimple_bb (stmt) != bb)
   5597 	    {
   5598 	      error ("gimple_bb (stmt) is set to a wrong basic block");
   5599 	      err2 = true;
   5600 	    }
   5601 
   5602 	  err2 |= verify_gimple_stmt (stmt);
   5603 	  err2 |= verify_location (&blocks, gimple_location (stmt));
   5604 
   5605 	  memset (&wi, 0, sizeof (wi));
   5606 	  wi.info = (void *) &visited;
   5607 	  addr = walk_gimple_op (stmt, verify_node_sharing, &wi);
   5608 	  if (addr)
   5609 	    {
   5610 	      error ("incorrect sharing of tree nodes");
   5611 	      debug_generic_expr (addr);
   5612 	      err2 |= true;
   5613 	    }
   5614 
   5615 	  memset (&wi, 0, sizeof (wi));
   5616 	  wi.info = (void *) &blocks;
   5617 	  addr = walk_gimple_op (stmt, verify_expr_location, &wi);
   5618 	  if (addr)
   5619 	    {
   5620 	      debug_generic_expr (addr);
   5621 	      err2 |= true;
   5622 	    }
   5623 
   5624 	  /* If the statement is marked as part of an EH region, then it is
   5625 	     expected that the statement could throw.  Verify that when we
   5626 	     have optimizations that simplify statements such that we prove
   5627 	     that they cannot throw, that we update other data structures
   5628 	     to match.  */
   5629 	  lp_nr = lookup_stmt_eh_lp (stmt);
   5630 	  if (lp_nr != 0)
   5631 	    visited_throwing_stmts.add (stmt);
   5632 	  if (lp_nr > 0)
   5633 	    {
   5634 	      if (!stmt_could_throw_p (cfun, stmt))
   5635 		{
   5636 		  if (verify_nothrow)
   5637 		    {
   5638 		      error ("statement marked for throw, but doesn%'t");
   5639 		      err2 |= true;
   5640 		    }
   5641 		}
   5642 	      else if (!gsi_one_before_end_p (gsi))
   5643 		{
   5644 		  error ("statement marked for throw in middle of block");
   5645 		  err2 |= true;
   5646 		}
   5647 	    }
   5648 
   5649 	  if (err2)
   5650 	    debug_gimple_stmt (stmt);
   5651 	  err |= err2;
   5652 	}
   5653 
   5654       FOR_EACH_EDGE (e, ei, bb->succs)
   5655 	if (e->goto_locus != UNKNOWN_LOCATION)
   5656 	  err |= verify_location (&blocks, e->goto_locus);
   5657     }
   5658 
   5659   hash_map<gimple *, int> *eh_table = get_eh_throw_stmt_table (cfun);
   5660   eh_error_found = false;
   5661   if (eh_table)
   5662     eh_table->traverse<hash_set<gimple *> *, verify_eh_throw_stmt_node>
   5663       (&visited_throwing_stmts);
   5664 
   5665   if (ice && (err || eh_error_found))
   5666     internal_error ("verify_gimple failed");
   5667 
   5668   verify_histograms ();
   5669   timevar_pop (TV_TREE_STMT_VERIFY);
   5670 
   5671   return (err || eh_error_found);
   5672 }
   5673 
   5674 
   5675 /* Verifies that the flow information is OK.  */
   5676 
   5677 static bool
   5678 gimple_verify_flow_info (void)
   5679 {
   5680   bool err = false;
   5681   basic_block bb;
   5682   gimple_stmt_iterator gsi;
   5683   gimple *stmt;
   5684   edge e;
   5685   edge_iterator ei;
   5686 
   5687   if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq
   5688       || ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes)
   5689     {
   5690       error ("ENTRY_BLOCK has IL associated with it");
   5691       err = true;
   5692     }
   5693 
   5694   if (EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq
   5695       || EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes)
   5696     {
   5697       error ("EXIT_BLOCK has IL associated with it");
   5698       err = true;
   5699     }
   5700 
   5701   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
   5702     if (e->flags & EDGE_FALLTHRU)
   5703       {
   5704 	error ("fallthru to exit from bb %d", e->src->index);
   5705 	err = true;
   5706       }
   5707   if (cfun->cfg->full_profile
   5708       && !ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ())
   5709     {
   5710       error ("entry block count not initialized");
   5711       err = true;
   5712     }
   5713   if (cfun->cfg->full_profile
   5714       && !EXIT_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ())
   5715     {
   5716       error ("exit block count not initialized");
   5717       err = true;
   5718     }
   5719   if (cfun->cfg->full_profile
   5720       && !single_succ_edge
   5721 	      (ENTRY_BLOCK_PTR_FOR_FN (cfun))->probability.initialized_p ())
   5722     {
   5723       error ("probability of edge from entry block not initialized");
   5724       err = true;
   5725     }
   5726 
   5727 
   5728   FOR_EACH_BB_FN (bb, cfun)
   5729     {
   5730       bool found_ctrl_stmt = false;
   5731 
   5732       stmt = NULL;
   5733 
   5734       if (cfun->cfg->full_profile)
   5735         {
   5736 	  if (!bb->count.initialized_p ())
   5737 	    {
   5738 	      error ("count of bb %d not initialized", bb->index);
   5739 	      err = true;
   5740 	    }
   5741 	  FOR_EACH_EDGE (e, ei, bb->succs)
   5742 	    if (!e->probability.initialized_p ())
   5743 	      {
   5744 		error ("probability of edge %d->%d not initialized",
   5745 		       bb->index, e->dest->index);
   5746 		err = true;
   5747 	      }
   5748         }
   5749 
   5750       /* Skip labels on the start of basic block.  */
   5751       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   5752 	{
   5753 	  tree label;
   5754 	  gimple *prev_stmt = stmt;
   5755 
   5756 	  stmt = gsi_stmt (gsi);
   5757 
   5758 	  if (gimple_code (stmt) != GIMPLE_LABEL)
   5759 	    break;
   5760 
   5761 	  label = gimple_label_label (as_a <glabel *> (stmt));
   5762 	  if (prev_stmt && DECL_NONLOCAL (label))
   5763 	    {
   5764 	      error ("nonlocal label %qD is not first in a sequence "
   5765 		     "of labels in bb %d", label, bb->index);
   5766 	      err = true;
   5767 	    }
   5768 
   5769 	  if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
   5770 	    {
   5771 	      error ("EH landing pad label %qD is not first in a sequence "
   5772 		     "of labels in bb %d", label, bb->index);
   5773 	      err = true;
   5774 	    }
   5775 
   5776 	  if (label_to_block (cfun, label) != bb)
   5777 	    {
   5778 	      error ("label %qD to block does not match in bb %d",
   5779 		     label, bb->index);
   5780 	      err = true;
   5781 	    }
   5782 
   5783 	  if (decl_function_context (label) != current_function_decl)
   5784 	    {
   5785 	      error ("label %qD has incorrect context in bb %d",
   5786 		     label, bb->index);
   5787 	      err = true;
   5788 	    }
   5789 	}
   5790 
   5791       /* Verify that body of basic block BB is free of control flow.  */
   5792       bool seen_nondebug_stmt = false;
   5793       for (; !gsi_end_p (gsi); gsi_next (&gsi))
   5794 	{
   5795 	  gimple *stmt = gsi_stmt (gsi);
   5796 
   5797 	  /* Do NOT disregard debug stmts after found_ctrl_stmt.  */
   5798 	  if (found_ctrl_stmt)
   5799 	    {
   5800 	      error ("control flow in the middle of basic block %d",
   5801 		     bb->index);
   5802 	      err = true;
   5803 	    }
   5804 
   5805 	  if (stmt_ends_bb_p (stmt))
   5806 	    found_ctrl_stmt = true;
   5807 
   5808 	  if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
   5809 	    {
   5810 	      error ("label %qD in the middle of basic block %d",
   5811 		     gimple_label_label (label_stmt), bb->index);
   5812 	      err = true;
   5813 	    }
   5814 
   5815 	  /* Check that no statements appear between a returns_twice call
   5816 	     and its associated abnormal edge.  */
   5817 	  if (gimple_code (stmt) == GIMPLE_CALL
   5818 	      && gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
   5819 	    {
   5820 	      bool misplaced = false;
   5821 	      /* TM is an exception: it points abnormal edges just after the
   5822 		 call that starts a transaction, i.e. it must end the BB.  */
   5823 	      if (gimple_call_builtin_p (stmt, BUILT_IN_TM_START))
   5824 		{
   5825 		  if (single_succ_p (bb)
   5826 		      && bb_has_abnormal_pred (single_succ (bb))
   5827 		      && !gsi_one_nondebug_before_end_p (gsi))
   5828 		    {
   5829 		      error ("returns_twice call is not last in basic block "
   5830 			     "%d", bb->index);
   5831 		      misplaced = true;
   5832 		    }
   5833 		}
   5834 	      else
   5835 		{
   5836 		  if (seen_nondebug_stmt && bb_has_abnormal_pred (bb))
   5837 		    {
   5838 		      error ("returns_twice call is not first in basic block "
   5839 			     "%d", bb->index);
   5840 		      misplaced = true;
   5841 		    }
   5842 		}
   5843 	      if (misplaced)
   5844 		{
   5845 		  print_gimple_stmt (stderr, stmt, 0, TDF_SLIM);
   5846 		  err = true;
   5847 		}
   5848 	    }
   5849 	  if (!is_gimple_debug (stmt))
   5850 	    seen_nondebug_stmt = true;
   5851 	}
   5852 
   5853       gsi = gsi_last_nondebug_bb (bb);
   5854       if (gsi_end_p (gsi))
   5855 	continue;
   5856 
   5857       stmt = gsi_stmt (gsi);
   5858 
   5859       if (gimple_code (stmt) == GIMPLE_LABEL)
   5860 	continue;
   5861 
   5862       if (verify_eh_edges (stmt))
   5863 	err = true;
   5864 
   5865       if (is_ctrl_stmt (stmt))
   5866 	{
   5867 	  FOR_EACH_EDGE (e, ei, bb->succs)
   5868 	    if (e->flags & EDGE_FALLTHRU)
   5869 	      {
   5870 		error ("fallthru edge after a control statement in bb %d",
   5871 		       bb->index);
   5872 		err = true;
   5873 	      }
   5874 	}
   5875 
   5876       if (gimple_code (stmt) != GIMPLE_COND)
   5877 	{
   5878 	  /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
   5879 	     after anything else but if statement.  */
   5880 	  FOR_EACH_EDGE (e, ei, bb->succs)
   5881 	    if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
   5882 	      {
   5883 		error ("true/false edge after a non-GIMPLE_COND in bb %d",
   5884 		       bb->index);
   5885 		err = true;
   5886 	      }
   5887 	}
   5888 
   5889       switch (gimple_code (stmt))
   5890 	{
   5891 	case GIMPLE_COND:
   5892 	  {
   5893 	    edge true_edge;
   5894 	    edge false_edge;
   5895 
   5896 	    extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
   5897 
   5898 	    if (!true_edge
   5899 		|| !false_edge
   5900 		|| !(true_edge->flags & EDGE_TRUE_VALUE)
   5901 		|| !(false_edge->flags & EDGE_FALSE_VALUE)
   5902 		|| (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
   5903 		|| (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
   5904 		|| EDGE_COUNT (bb->succs) >= 3)
   5905 	      {
   5906 		error ("wrong outgoing edge flags at end of bb %d",
   5907 		       bb->index);
   5908 		err = true;
   5909 	      }
   5910 	  }
   5911 	  break;
   5912 
   5913 	case GIMPLE_GOTO:
   5914 	  if (simple_goto_p (stmt))
   5915 	    {
   5916 	      error ("explicit goto at end of bb %d", bb->index);
   5917 	      err = true;
   5918 	    }
   5919 	  else
   5920 	    {
   5921 	      /* FIXME.  We should double check that the labels in the
   5922 		 destination blocks have their address taken.  */
   5923 	      FOR_EACH_EDGE (e, ei, bb->succs)
   5924 		if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
   5925 				 | EDGE_FALSE_VALUE))
   5926 		    || !(e->flags & EDGE_ABNORMAL))
   5927 		  {
   5928 		    error ("wrong outgoing edge flags at end of bb %d",
   5929 			   bb->index);
   5930 		    err = true;
   5931 		  }
   5932 	    }
   5933 	  break;
   5934 
   5935 	case GIMPLE_CALL:
   5936 	  if (!gimple_call_builtin_p (stmt, BUILT_IN_RETURN))
   5937 	    break;
   5938 	  /* fallthru */
   5939 	case GIMPLE_RETURN:
   5940 	  if (!single_succ_p (bb)
   5941 	      || (single_succ_edge (bb)->flags
   5942 		  & (EDGE_FALLTHRU | EDGE_ABNORMAL
   5943 		     | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
   5944 	    {
   5945 	      error ("wrong outgoing edge flags at end of bb %d", bb->index);
   5946 	      err = true;
   5947 	    }
   5948 	  if (single_succ (bb) != EXIT_BLOCK_PTR_FOR_FN (cfun))
   5949 	    {
   5950 	      error ("return edge does not point to exit in bb %d",
   5951 		     bb->index);
   5952 	      err = true;
   5953 	    }
   5954 	  break;
   5955 
   5956 	case GIMPLE_SWITCH:
   5957 	  {
   5958 	    gswitch *switch_stmt = as_a <gswitch *> (stmt);
   5959 	    tree prev;
   5960 	    edge e;
   5961 	    size_t i, n;
   5962 
   5963 	    n = gimple_switch_num_labels (switch_stmt);
   5964 
   5965 	    /* Mark all the destination basic blocks.  */
   5966 	    for (i = 0; i < n; ++i)
   5967 	      {
   5968 		basic_block label_bb = gimple_switch_label_bb (cfun, switch_stmt, i);
   5969 		gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
   5970 		label_bb->aux = (void *)1;
   5971 	      }
   5972 
   5973 	    /* Verify that the case labels are sorted.  */
   5974 	    prev = gimple_switch_label (switch_stmt, 0);
   5975 	    for (i = 1; i < n; ++i)
   5976 	      {
   5977 		tree c = gimple_switch_label (switch_stmt, i);
   5978 		if (!CASE_LOW (c))
   5979 		  {
   5980 		    error ("found default case not at the start of "
   5981 			   "case vector");
   5982 		    err = true;
   5983 		    continue;
   5984 		  }
   5985 		if (CASE_LOW (prev)
   5986 		    && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
   5987 		  {
   5988 		    error ("case labels not sorted: ");
   5989 		    print_generic_expr (stderr, prev);
   5990 		    fprintf (stderr," is greater than ");
   5991 		    print_generic_expr (stderr, c);
   5992 		    fprintf (stderr," but comes before it.\n");
   5993 		    err = true;
   5994 		  }
   5995 		prev = c;
   5996 	      }
   5997 	    /* VRP will remove the default case if it can prove it will
   5998 	       never be executed.  So do not verify there always exists
   5999 	       a default case here.  */
   6000 
   6001 	    FOR_EACH_EDGE (e, ei, bb->succs)
   6002 	      {
   6003 		if (!e->dest->aux)
   6004 		  {
   6005 		    error ("extra outgoing edge %d->%d",
   6006 			   bb->index, e->dest->index);
   6007 		    err = true;
   6008 		  }
   6009 
   6010 		e->dest->aux = (void *)2;
   6011 		if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
   6012 				 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
   6013 		  {
   6014 		    error ("wrong outgoing edge flags at end of bb %d",
   6015 			   bb->index);
   6016 		    err = true;
   6017 		  }
   6018 	      }
   6019 
   6020 	    /* Check that we have all of them.  */
   6021 	    for (i = 0; i < n; ++i)
   6022 	      {
   6023 		basic_block label_bb = gimple_switch_label_bb (cfun,
   6024 							       switch_stmt, i);
   6025 
   6026 		if (label_bb->aux != (void *)2)
   6027 		  {
   6028 		    error ("missing edge %i->%i", bb->index, label_bb->index);
   6029 		    err = true;
   6030 		  }
   6031 	      }
   6032 
   6033 	    FOR_EACH_EDGE (e, ei, bb->succs)
   6034 	      e->dest->aux = (void *)0;
   6035 	  }
   6036 	  break;
   6037 
   6038 	case GIMPLE_EH_DISPATCH:
   6039 	  if (verify_eh_dispatch_edge (as_a <geh_dispatch *> (stmt)))
   6040 	    err = true;
   6041 	  break;
   6042 
   6043 	default:
   6044 	  break;
   6045 	}
   6046     }
   6047 
   6048   if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
   6049     verify_dominators (CDI_DOMINATORS);
   6050 
   6051   return err;
   6052 }
   6053 
   6054 #if __GNUC__ >= 10
   6055 #  pragma GCC diagnostic pop
   6056 #endif
   6057 
   6058 /* Updates phi nodes after creating a forwarder block joined
   6059    by edge FALLTHRU.  */
   6060 
   6061 static void
   6062 gimple_make_forwarder_block (edge fallthru)
   6063 {
   6064   edge e;
   6065   edge_iterator ei;
   6066   basic_block dummy, bb;
   6067   tree var;
   6068   gphi_iterator gsi;
   6069   bool forward_location_p;
   6070 
   6071   dummy = fallthru->src;
   6072   bb = fallthru->dest;
   6073 
   6074   if (single_pred_p (bb))
   6075     return;
   6076 
   6077   /* We can forward location info if we have only one predecessor.  */
   6078   forward_location_p = single_pred_p (dummy);
   6079 
   6080   /* If we redirected a branch we must create new PHI nodes at the
   6081      start of BB.  */
   6082   for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
   6083     {
   6084       gphi *phi, *new_phi;
   6085 
   6086       phi = gsi.phi ();
   6087       var = gimple_phi_result (phi);
   6088       new_phi = create_phi_node (var, bb);
   6089       gimple_phi_set_result (phi, copy_ssa_name (var, phi));
   6090       add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
   6091 		   forward_location_p
   6092 		   ? gimple_phi_arg_location (phi, 0) : UNKNOWN_LOCATION);
   6093     }
   6094 
   6095   /* Add the arguments we have stored on edges.  */
   6096   FOR_EACH_EDGE (e, ei, bb->preds)
   6097     {
   6098       if (e == fallthru)
   6099 	continue;
   6100 
   6101       flush_pending_stmts (e);
   6102     }
   6103 }
   6104 
   6105 
   6106 /* Return a non-special label in the head of basic block BLOCK.
   6107    Create one if it doesn't exist.  */
   6108 
   6109 tree
   6110 gimple_block_label (basic_block bb)
   6111 {
   6112   gimple_stmt_iterator i, s = gsi_start_bb (bb);
   6113   bool first = true;
   6114   tree label;
   6115   glabel *stmt;
   6116 
   6117   for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
   6118     {
   6119       stmt = dyn_cast <glabel *> (gsi_stmt (i));
   6120       if (!stmt)
   6121 	break;
   6122       label = gimple_label_label (stmt);
   6123       if (!DECL_NONLOCAL (label))
   6124 	{
   6125 	  if (!first)
   6126 	    gsi_move_before (&i, &s);
   6127 	  return label;
   6128 	}
   6129     }
   6130 
   6131   label = create_artificial_label (UNKNOWN_LOCATION);
   6132   stmt = gimple_build_label (label);
   6133   gsi_insert_before (&s, stmt, GSI_NEW_STMT);
   6134   return label;
   6135 }
   6136 
   6137 
   6138 /* Attempt to perform edge redirection by replacing a possibly complex
   6139    jump instruction by a goto or by removing the jump completely.
   6140    This can apply only if all edges now point to the same block.  The
   6141    parameters and return values are equivalent to
   6142    redirect_edge_and_branch.  */
   6143 
   6144 static edge
   6145 gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
   6146 {
   6147   basic_block src = e->src;
   6148   gimple_stmt_iterator i;
   6149   gimple *stmt;
   6150 
   6151   /* We can replace or remove a complex jump only when we have exactly
   6152      two edges.  */
   6153   if (EDGE_COUNT (src->succs) != 2
   6154       /* Verify that all targets will be TARGET.  Specifically, the
   6155 	 edge that is not E must also go to TARGET.  */
   6156       || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
   6157     return NULL;
   6158 
   6159   i = gsi_last_bb (src);
   6160   if (gsi_end_p (i))
   6161     return NULL;
   6162 
   6163   stmt = gsi_stmt (i);
   6164 
   6165   if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
   6166     {
   6167       gsi_remove (&i, true);
   6168       e = ssa_redirect_edge (e, target);
   6169       e->flags = EDGE_FALLTHRU;
   6170       return e;
   6171     }
   6172 
   6173   return NULL;
   6174 }
   6175 
   6176 
   6177 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
   6178    edge representing the redirected branch.  */
   6179 
   6180 static edge
   6181 gimple_redirect_edge_and_branch (edge e, basic_block dest)
   6182 {
   6183   basic_block bb = e->src;
   6184   gimple_stmt_iterator gsi;
   6185   edge ret;
   6186   gimple *stmt;
   6187 
   6188   if (e->flags & EDGE_ABNORMAL)
   6189     return NULL;
   6190 
   6191   if (e->dest == dest)
   6192     return NULL;
   6193 
   6194   if (e->flags & EDGE_EH)
   6195     return redirect_eh_edge (e, dest);
   6196 
   6197   if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
   6198     {
   6199       ret = gimple_try_redirect_by_replacing_jump (e, dest);
   6200       if (ret)
   6201 	return ret;
   6202     }
   6203 
   6204   gsi = gsi_last_nondebug_bb (bb);
   6205   stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
   6206 
   6207   switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK)
   6208     {
   6209     case GIMPLE_COND:
   6210       /* For COND_EXPR, we only need to redirect the edge.  */
   6211       break;
   6212 
   6213     case GIMPLE_GOTO:
   6214       /* No non-abnormal edges should lead from a non-simple goto, and
   6215 	 simple ones should be represented implicitly.  */
   6216       gcc_unreachable ();
   6217 
   6218     case GIMPLE_SWITCH:
   6219       {
   6220 	gswitch *switch_stmt = as_a <gswitch *> (stmt);
   6221 	tree label = gimple_block_label (dest);
   6222         tree cases = get_cases_for_edge (e, switch_stmt);
   6223 
   6224 	/* If we have a list of cases associated with E, then use it
   6225 	   as it's a lot faster than walking the entire case vector.  */
   6226 	if (cases)
   6227 	  {
   6228 	    edge e2 = find_edge (e->src, dest);
   6229 	    tree last, first;
   6230 
   6231 	    first = cases;
   6232 	    while (cases)
   6233 	      {
   6234 		last = cases;
   6235 		CASE_LABEL (cases) = label;
   6236 		cases = CASE_CHAIN (cases);
   6237 	      }
   6238 
   6239 	    /* If there was already an edge in the CFG, then we need
   6240 	       to move all the cases associated with E to E2.  */
   6241 	    if (e2)
   6242 	      {
   6243 		tree cases2 = get_cases_for_edge (e2, switch_stmt);
   6244 
   6245 		CASE_CHAIN (last) = CASE_CHAIN (cases2);
   6246 		CASE_CHAIN (cases2) = first;
   6247 	      }
   6248 	    bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index);
   6249 	  }
   6250 	else
   6251 	  {
   6252 	    size_t i, n = gimple_switch_num_labels (switch_stmt);
   6253 
   6254 	    for (i = 0; i < n; i++)
   6255 	      {
   6256 		tree elt = gimple_switch_label (switch_stmt, i);
   6257 		if (label_to_block (cfun, CASE_LABEL (elt)) == e->dest)
   6258 		  CASE_LABEL (elt) = label;
   6259 	      }
   6260 	  }
   6261       }
   6262       break;
   6263 
   6264     case GIMPLE_ASM:
   6265       {
   6266 	gasm *asm_stmt = as_a <gasm *> (stmt);
   6267 	int i, n = gimple_asm_nlabels (asm_stmt);
   6268 	tree label = NULL;
   6269 
   6270 	for (i = 0; i < n; ++i)
   6271 	  {
   6272 	    tree cons = gimple_asm_label_op (asm_stmt, i);
   6273 	    if (label_to_block (cfun, TREE_VALUE (cons)) == e->dest)
   6274 	      {
   6275 		if (!label)
   6276 		  label = gimple_block_label (dest);
   6277 		TREE_VALUE (cons) = label;
   6278 	      }
   6279 	  }
   6280 
   6281 	/* If we didn't find any label matching the former edge in the
   6282 	   asm labels, we must be redirecting the fallthrough
   6283 	   edge.  */
   6284 	gcc_assert (label || (e->flags & EDGE_FALLTHRU));
   6285       }
   6286       break;
   6287 
   6288     case GIMPLE_RETURN:
   6289       gsi_remove (&gsi, true);
   6290       e->flags |= EDGE_FALLTHRU;
   6291       break;
   6292 
   6293     case GIMPLE_OMP_RETURN:
   6294     case GIMPLE_OMP_CONTINUE:
   6295     case GIMPLE_OMP_SECTIONS_SWITCH:
   6296     case GIMPLE_OMP_FOR:
   6297       /* The edges from OMP constructs can be simply redirected.  */
   6298       break;
   6299 
   6300     case GIMPLE_EH_DISPATCH:
   6301       if (!(e->flags & EDGE_FALLTHRU))
   6302 	redirect_eh_dispatch_edge (as_a <geh_dispatch *> (stmt), e, dest);
   6303       break;
   6304 
   6305     case GIMPLE_TRANSACTION:
   6306       if (e->flags & EDGE_TM_ABORT)
   6307 	gimple_transaction_set_label_over (as_a <gtransaction *> (stmt),
   6308 				           gimple_block_label (dest));
   6309       else if (e->flags & EDGE_TM_UNINSTRUMENTED)
   6310 	gimple_transaction_set_label_uninst (as_a <gtransaction *> (stmt),
   6311 				             gimple_block_label (dest));
   6312       else
   6313 	gimple_transaction_set_label_norm (as_a <gtransaction *> (stmt),
   6314 				           gimple_block_label (dest));
   6315       break;
   6316 
   6317     default:
   6318       /* Otherwise it must be a fallthru edge, and we don't need to
   6319 	 do anything besides redirecting it.  */
   6320       gcc_assert (e->flags & EDGE_FALLTHRU);
   6321       break;
   6322     }
   6323 
   6324   /* Update/insert PHI nodes as necessary.  */
   6325 
   6326   /* Now update the edges in the CFG.  */
   6327   e = ssa_redirect_edge (e, dest);
   6328 
   6329   return e;
   6330 }
   6331 
   6332 /* Returns true if it is possible to remove edge E by redirecting
   6333    it to the destination of the other edge from E->src.  */
   6334 
   6335 static bool
   6336 gimple_can_remove_branch_p (const_edge e)
   6337 {
   6338   if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
   6339     return false;
   6340 
   6341   return true;
   6342 }
   6343 
   6344 /* Simple wrapper, as we can always redirect fallthru edges.  */
   6345 
   6346 static basic_block
   6347 gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
   6348 {
   6349   e = gimple_redirect_edge_and_branch (e, dest);
   6350   gcc_assert (e);
   6351 
   6352   return NULL;
   6353 }
   6354 
   6355 
   6356 /* Splits basic block BB after statement STMT (but at least after the
   6357    labels).  If STMT is NULL, BB is split just after the labels.  */
   6358 
   6359 static basic_block
   6360 gimple_split_block (basic_block bb, void *stmt)
   6361 {
   6362   gimple_stmt_iterator gsi;
   6363   gimple_stmt_iterator gsi_tgt;
   6364   gimple_seq list;
   6365   basic_block new_bb;
   6366   edge e;
   6367   edge_iterator ei;
   6368 
   6369   new_bb = create_empty_bb (bb);
   6370 
   6371   /* Redirect the outgoing edges.  */
   6372   new_bb->succs = bb->succs;
   6373   bb->succs = NULL;
   6374   FOR_EACH_EDGE (e, ei, new_bb->succs)
   6375     e->src = new_bb;
   6376 
   6377   /* Get a stmt iterator pointing to the first stmt to move.  */
   6378   if (!stmt || gimple_code ((gimple *) stmt) == GIMPLE_LABEL)
   6379     gsi = gsi_after_labels (bb);
   6380   else
   6381     {
   6382       gsi = gsi_for_stmt ((gimple *) stmt);
   6383       gsi_next (&gsi);
   6384     }
   6385 
   6386   /* Move everything from GSI to the new basic block.  */
   6387   if (gsi_end_p (gsi))
   6388     return new_bb;
   6389 
   6390   /* Split the statement list - avoid re-creating new containers as this
   6391      brings ugly quadratic memory consumption in the inliner.
   6392      (We are still quadratic since we need to update stmt BB pointers,
   6393      sadly.)  */
   6394   gsi_split_seq_before (&gsi, &list);
   6395   set_bb_seq (new_bb, list);
   6396   for (gsi_tgt = gsi_start (list);
   6397        !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
   6398     gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
   6399 
   6400   return new_bb;
   6401 }
   6402 
   6403 
   6404 /* Moves basic block BB after block AFTER.  */
   6405 
   6406 static bool
   6407 gimple_move_block_after (basic_block bb, basic_block after)
   6408 {
   6409   if (bb->prev_bb == after)
   6410     return true;
   6411 
   6412   unlink_block (bb);
   6413   link_block (bb, after);
   6414 
   6415   return true;
   6416 }
   6417 
   6418 
   6419 /* Return TRUE if block BB has no executable statements, otherwise return
   6420    FALSE.  */
   6421 
   6422 static bool
   6423 gimple_empty_block_p (basic_block bb)
   6424 {
   6425   /* BB must have no executable statements.  */
   6426   gimple_stmt_iterator gsi = gsi_after_labels (bb);
   6427   if (phi_nodes (bb))
   6428     return false;
   6429   while (!gsi_end_p (gsi))
   6430     {
   6431       gimple *stmt = gsi_stmt (gsi);
   6432       if (is_gimple_debug (stmt))
   6433 	;
   6434       else if (gimple_code (stmt) == GIMPLE_NOP
   6435 	       || gimple_code (stmt) == GIMPLE_PREDICT)
   6436 	;
   6437       else
   6438 	return false;
   6439       gsi_next (&gsi);
   6440     }
   6441   return true;
   6442 }
   6443 
   6444 
   6445 /* Split a basic block if it ends with a conditional branch and if the
   6446    other part of the block is not empty.  */
   6447 
   6448 static basic_block
   6449 gimple_split_block_before_cond_jump (basic_block bb)
   6450 {
   6451   gimple *last, *split_point;
   6452   gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
   6453   if (gsi_end_p (gsi))
   6454     return NULL;
   6455   last = gsi_stmt (gsi);
   6456   if (gimple_code (last) != GIMPLE_COND
   6457       && gimple_code (last) != GIMPLE_SWITCH)
   6458     return NULL;
   6459   gsi_prev (&gsi);
   6460   split_point = gsi_stmt (gsi);
   6461   return split_block (bb, split_point)->dest;
   6462 }
   6463 
   6464 
   6465 /* Return true if basic_block can be duplicated.  */
   6466 
   6467 static bool
   6468 gimple_can_duplicate_bb_p (const_basic_block bb)
   6469 {
   6470   gimple *last = last_nondebug_stmt (CONST_CAST_BB (bb));
   6471 
   6472   /* Do checks that can only fail for the last stmt, to minimize the work in the
   6473      stmt loop.  */
   6474   if (last) {
   6475     /* A transaction is a single entry multiple exit region.  It
   6476        must be duplicated in its entirety or not at all.  */
   6477     if (gimple_code (last) == GIMPLE_TRANSACTION)
   6478       return false;
   6479 
   6480     /* An IFN_UNIQUE call must be duplicated as part of its group,
   6481        or not at all.  */
   6482     if (is_gimple_call (last)
   6483 	&& gimple_call_internal_p (last)
   6484 	&& gimple_call_internal_unique_p (last))
   6485       return false;
   6486   }
   6487 
   6488   for (gimple_stmt_iterator gsi = gsi_start_bb (CONST_CAST_BB (bb));
   6489        !gsi_end_p (gsi); gsi_next (&gsi))
   6490     {
   6491       gimple *g = gsi_stmt (gsi);
   6492 
   6493       /* Prohibit duplication of returns_twice calls, otherwise associated
   6494 	 abnormal edges also need to be duplicated properly.
   6495 	 An IFN_GOMP_SIMT_ENTER_ALLOC/IFN_GOMP_SIMT_EXIT call must be
   6496 	 duplicated as part of its group, or not at all.
   6497 	 The IFN_GOMP_SIMT_VOTE_ANY and IFN_GOMP_SIMT_XCHG_* are part of such a
   6498 	 group, so the same holds there.  */
   6499       if (is_gimple_call (g)
   6500 	  && (gimple_call_flags (g) & ECF_RETURNS_TWICE
   6501 	      || gimple_call_internal_p (g, IFN_GOMP_SIMT_ENTER_ALLOC)
   6502 	      || gimple_call_internal_p (g, IFN_GOMP_SIMT_EXIT)
   6503 	      || gimple_call_internal_p (g, IFN_GOMP_SIMT_VOTE_ANY)
   6504 	      || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_BFLY)
   6505 	      || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_IDX)))
   6506 	return false;
   6507     }
   6508 
   6509   return true;
   6510 }
   6511 
   6512 /* Create a duplicate of the basic block BB.  NOTE: This does not
   6513    preserve SSA form.  */
   6514 
   6515 static basic_block
   6516 gimple_duplicate_bb (basic_block bb, copy_bb_data *id)
   6517 {
   6518   basic_block new_bb;
   6519   gimple_stmt_iterator gsi_tgt;
   6520 
   6521   new_bb = create_empty_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb);
   6522 
   6523   /* Copy the PHI nodes.  We ignore PHI node arguments here because
   6524      the incoming edges have not been setup yet.  */
   6525   for (gphi_iterator gpi = gsi_start_phis (bb);
   6526        !gsi_end_p (gpi);
   6527        gsi_next (&gpi))
   6528     {
   6529       gphi *phi, *copy;
   6530       phi = gpi.phi ();
   6531       copy = create_phi_node (NULL_TREE, new_bb);
   6532       create_new_def_for (gimple_phi_result (phi), copy,
   6533 			  gimple_phi_result_ptr (copy));
   6534       gimple_set_uid (copy, gimple_uid (phi));
   6535     }
   6536 
   6537   gsi_tgt = gsi_start_bb (new_bb);
   6538   for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
   6539        !gsi_end_p (gsi);
   6540        gsi_next (&gsi))
   6541     {
   6542       def_operand_p def_p;
   6543       ssa_op_iter op_iter;
   6544       tree lhs;
   6545       gimple *stmt, *copy;
   6546 
   6547       stmt = gsi_stmt (gsi);
   6548       if (gimple_code (stmt) == GIMPLE_LABEL)
   6549 	continue;
   6550 
   6551       /* Don't duplicate label debug stmts.  */
   6552       if (gimple_debug_bind_p (stmt)
   6553 	  && TREE_CODE (gimple_debug_bind_get_var (stmt))
   6554 	     == LABEL_DECL)
   6555 	continue;
   6556 
   6557       /* Create a new copy of STMT and duplicate STMT's virtual
   6558 	 operands.  */
   6559       copy = gimple_copy (stmt);
   6560       gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
   6561 
   6562       maybe_duplicate_eh_stmt (copy, stmt);
   6563       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
   6564 
   6565       /* When copying around a stmt writing into a local non-user
   6566 	 aggregate, make sure it won't share stack slot with other
   6567 	 vars.  */
   6568       lhs = gimple_get_lhs (stmt);
   6569       if (lhs && TREE_CODE (lhs) != SSA_NAME)
   6570 	{
   6571 	  tree base = get_base_address (lhs);
   6572 	  if (base
   6573 	      && (VAR_P (base) || TREE_CODE (base) == RESULT_DECL)
   6574 	      && DECL_IGNORED_P (base)
   6575 	      && !TREE_STATIC (base)
   6576 	      && !DECL_EXTERNAL (base)
   6577 	      && (!VAR_P (base) || !DECL_HAS_VALUE_EXPR_P (base)))
   6578 	    DECL_NONSHAREABLE (base) = 1;
   6579 	}
   6580 
   6581       /* If requested remap dependence info of cliques brought in
   6582          via inlining.  */
   6583       if (id)
   6584 	for (unsigned i = 0; i < gimple_num_ops (copy); ++i)
   6585 	  {
   6586 	    tree op = gimple_op (copy, i);
   6587 	    if (!op)
   6588 	      continue;
   6589 	    if (TREE_CODE (op) == ADDR_EXPR
   6590 		|| TREE_CODE (op) == WITH_SIZE_EXPR)
   6591 	      op = TREE_OPERAND (op, 0);
   6592 	    while (handled_component_p (op))
   6593 	      op = TREE_OPERAND (op, 0);
   6594 	    if ((TREE_CODE (op) == MEM_REF
   6595 		 || TREE_CODE (op) == TARGET_MEM_REF)
   6596 		&& MR_DEPENDENCE_CLIQUE (op) > 1
   6597 		&& MR_DEPENDENCE_CLIQUE (op) != bb->loop_father->owned_clique)
   6598 	      {
   6599 		if (!id->dependence_map)
   6600 		  id->dependence_map = new hash_map<dependence_hash,
   6601 						    unsigned short>;
   6602 		bool existed;
   6603 		unsigned short &newc = id->dependence_map->get_or_insert
   6604 		    (MR_DEPENDENCE_CLIQUE (op), &existed);
   6605 		if (!existed)
   6606 		  {
   6607 		    gcc_assert (MR_DEPENDENCE_CLIQUE (op) <= cfun->last_clique);
   6608 		    newc = get_new_clique (cfun);
   6609 		  }
   6610 		MR_DEPENDENCE_CLIQUE (op) = newc;
   6611 	      }
   6612 	  }
   6613 
   6614       /* Create new names for all the definitions created by COPY and
   6615 	 add replacement mappings for each new name.  */
   6616       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
   6617 	create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
   6618     }
   6619 
   6620   return new_bb;
   6621 }
   6622 
   6623 /* Adds phi node arguments for edge E_COPY after basic block duplication.  */
   6624 
   6625 static void
   6626 add_phi_args_after_copy_edge (edge e_copy)
   6627 {
   6628   basic_block bb, bb_copy = e_copy->src, dest;
   6629   edge e;
   6630   edge_iterator ei;
   6631   gphi *phi, *phi_copy;
   6632   tree def;
   6633   gphi_iterator psi, psi_copy;
   6634 
   6635   if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
   6636     return;
   6637 
   6638   bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
   6639 
   6640   if (e_copy->dest->flags & BB_DUPLICATED)
   6641     dest = get_bb_original (e_copy->dest);
   6642   else
   6643     dest = e_copy->dest;
   6644 
   6645   e = find_edge (bb, dest);
   6646   if (!e)
   6647     {
   6648       /* During loop unrolling the target of the latch edge is copied.
   6649 	 In this case we are not looking for edge to dest, but to
   6650 	 duplicated block whose original was dest.  */
   6651       FOR_EACH_EDGE (e, ei, bb->succs)
   6652 	{
   6653 	  if ((e->dest->flags & BB_DUPLICATED)
   6654 	      && get_bb_original (e->dest) == dest)
   6655 	    break;
   6656 	}
   6657 
   6658       gcc_assert (e != NULL);
   6659     }
   6660 
   6661   for (psi = gsi_start_phis (e->dest),
   6662        psi_copy = gsi_start_phis (e_copy->dest);
   6663        !gsi_end_p (psi);
   6664        gsi_next (&psi), gsi_next (&psi_copy))
   6665     {
   6666       phi = psi.phi ();
   6667       phi_copy = psi_copy.phi ();
   6668       def = PHI_ARG_DEF_FROM_EDGE (phi, e);
   6669       add_phi_arg (phi_copy, def, e_copy,
   6670 		   gimple_phi_arg_location_from_edge (phi, e));
   6671     }
   6672 }
   6673 
   6674 
   6675 /* Basic block BB_COPY was created by code duplication.  Add phi node
   6676    arguments for edges going out of BB_COPY.  The blocks that were
   6677    duplicated have BB_DUPLICATED set.  */
   6678 
   6679 void
   6680 add_phi_args_after_copy_bb (basic_block bb_copy)
   6681 {
   6682   edge e_copy;
   6683   edge_iterator ei;
   6684 
   6685   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
   6686     {
   6687       add_phi_args_after_copy_edge (e_copy);
   6688     }
   6689 }
   6690 
   6691 /* Blocks in REGION_COPY array of length N_REGION were created by
   6692    duplication of basic blocks.  Add phi node arguments for edges
   6693    going from these blocks.  If E_COPY is not NULL, also add
   6694    phi node arguments for its destination.*/
   6695 
   6696 void
   6697 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
   6698 			 edge e_copy)
   6699 {
   6700   unsigned i;
   6701 
   6702   for (i = 0; i < n_region; i++)
   6703     region_copy[i]->flags |= BB_DUPLICATED;
   6704 
   6705   for (i = 0; i < n_region; i++)
   6706     add_phi_args_after_copy_bb (region_copy[i]);
   6707   if (e_copy)
   6708     add_phi_args_after_copy_edge (e_copy);
   6709 
   6710   for (i = 0; i < n_region; i++)
   6711     region_copy[i]->flags &= ~BB_DUPLICATED;
   6712 }
   6713 
   6714 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
   6715    important exit edge EXIT.  By important we mean that no SSA name defined
   6716    inside region is live over the other exit edges of the region.  All entry
   6717    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
   6718    to the duplicate of the region.  Dominance and loop information is
   6719    updated if UPDATE_DOMINANCE is true, but not the SSA web.  If
   6720    UPDATE_DOMINANCE is false then we assume that the caller will update the
   6721    dominance information after calling this function.  The new basic
   6722    blocks are stored to REGION_COPY in the same order as they had in REGION,
   6723    provided that REGION_COPY is not NULL.
   6724    The function returns false if it is unable to copy the region,
   6725    true otherwise.
   6726 
   6727    It is callers responsibility to update profile.  */
   6728 
   6729 bool
   6730 gimple_duplicate_seme_region (edge entry, edge exit,
   6731 			      basic_block *region, unsigned n_region,
   6732 			      basic_block *region_copy,
   6733 			      bool update_dominance)
   6734 {
   6735   unsigned i;
   6736   bool free_region_copy = false, copying_header = false;
   6737   class loop *loop = entry->dest->loop_father;
   6738   edge exit_copy;
   6739   edge redirected;
   6740 
   6741   if (!can_copy_bbs_p (region, n_region))
   6742     return false;
   6743 
   6744   /* Some sanity checking.  Note that we do not check for all possible
   6745      missuses of the functions.  I.e. if you ask to copy something weird,
   6746      it will work, but the state of structures probably will not be
   6747      correct.  */
   6748   for (i = 0; i < n_region; i++)
   6749     {
   6750       /* We do not handle subloops, i.e. all the blocks must belong to the
   6751 	 same loop.  */
   6752       if (region[i]->loop_father != loop)
   6753 	return false;
   6754 
   6755       if (region[i] != entry->dest
   6756 	  && region[i] == loop->header)
   6757 	return false;
   6758     }
   6759 
   6760   /* In case the function is used for loop header copying (which is the primary
   6761      use), ensure that EXIT and its copy will be new latch and entry edges.  */
   6762   if (loop->header == entry->dest)
   6763     {
   6764       copying_header = true;
   6765 
   6766       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
   6767 	return false;
   6768 
   6769       for (i = 0; i < n_region; i++)
   6770 	if (region[i] != exit->src
   6771 	    && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
   6772 	  return false;
   6773     }
   6774 
   6775   initialize_original_copy_tables ();
   6776 
   6777   if (copying_header)
   6778     set_loop_copy (loop, loop_outer (loop));
   6779   else
   6780     set_loop_copy (loop, loop);
   6781 
   6782   if (!region_copy)
   6783     {
   6784       region_copy = XNEWVEC (basic_block, n_region);
   6785       free_region_copy = true;
   6786     }
   6787 
   6788   /* Record blocks outside the region that are dominated by something
   6789      inside.  */
   6790   auto_vec<basic_block> doms;
   6791   if (update_dominance)
   6792     doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
   6793 
   6794   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
   6795 	    split_edge_bb_loc (entry), update_dominance);
   6796 
   6797   if (copying_header)
   6798     {
   6799       loop->header = exit->dest;
   6800       loop->latch = exit->src;
   6801     }
   6802 
   6803   /* Redirect the entry and add the phi node arguments.  */
   6804   redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
   6805   gcc_assert (redirected != NULL);
   6806   flush_pending_stmts (entry);
   6807 
   6808   /* Concerning updating of dominators:  We must recount dominators
   6809      for entry block and its copy.  Anything that is outside of the
   6810      region, but was dominated by something inside needs recounting as
   6811      well.  */
   6812   if (update_dominance)
   6813     {
   6814       set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
   6815       doms.safe_push (get_bb_original (entry->dest));
   6816       iterate_fix_dominators (CDI_DOMINATORS, doms, false);
   6817     }
   6818 
   6819   /* Add the other PHI node arguments.  */
   6820   add_phi_args_after_copy (region_copy, n_region, NULL);
   6821 
   6822   if (free_region_copy)
   6823     free (region_copy);
   6824 
   6825   free_original_copy_tables ();
   6826   return true;
   6827 }
   6828 
   6829 /* Checks if BB is part of the region defined by N_REGION BBS.  */
   6830 static bool
   6831 bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region)
   6832 {
   6833   unsigned int n;
   6834 
   6835   for (n = 0; n < n_region; n++)
   6836     {
   6837      if (bb == bbs[n])
   6838        return true;
   6839     }
   6840   return false;
   6841 }
   6842 
   6843 
   6844 /* For each PHI in BB, copy the argument associated with SRC_E to TGT_E.
   6845    Assuming the argument exists, just does not have a value.  */
   6846 
   6847 void
   6848 copy_phi_arg_into_existing_phi (edge src_e, edge tgt_e)
   6849 {
   6850   int src_idx = src_e->dest_idx;
   6851   int tgt_idx = tgt_e->dest_idx;
   6852 
   6853   /* Iterate over each PHI in e->dest.  */
   6854   for (gphi_iterator gsi = gsi_start_phis (src_e->dest),
   6855 			   gsi2 = gsi_start_phis (tgt_e->dest);
   6856        !gsi_end_p (gsi);
   6857        gsi_next (&gsi), gsi_next (&gsi2))
   6858     {
   6859       gphi *src_phi = gsi.phi ();
   6860       gphi *dest_phi = gsi2.phi ();
   6861       tree val = gimple_phi_arg_def (src_phi, src_idx);
   6862       location_t locus = gimple_phi_arg_location (src_phi, src_idx);
   6863 
   6864       SET_PHI_ARG_DEF (dest_phi, tgt_idx, val);
   6865       gimple_phi_arg_set_location (dest_phi, tgt_idx, locus);
   6866     }
   6867 }
   6868 
   6869 /* Duplicates REGION consisting of N_REGION blocks.  The new blocks
   6870    are stored to REGION_COPY in the same order in that they appear
   6871    in REGION, if REGION_COPY is not NULL.  ENTRY is the entry to
   6872    the region, EXIT an exit from it.  The condition guarding EXIT
   6873    is moved to ENTRY.  Returns true if duplication succeeds, false
   6874    otherwise.
   6875 
   6876    For example,
   6877 
   6878    some_code;
   6879    if (cond)
   6880      A;
   6881    else
   6882      B;
   6883 
   6884    is transformed to
   6885 
   6886    if (cond)
   6887      {
   6888        some_code;
   6889        A;
   6890      }
   6891    else
   6892      {
   6893        some_code;
   6894        B;
   6895      }
   6896 */
   6897 
   6898 bool
   6899 gimple_duplicate_sese_tail (edge entry, edge exit,
   6900 			  basic_block *region, unsigned n_region,
   6901 			  basic_block *region_copy)
   6902 {
   6903   unsigned i;
   6904   bool free_region_copy = false;
   6905   class loop *loop = exit->dest->loop_father;
   6906   class loop *orig_loop = entry->dest->loop_father;
   6907   basic_block switch_bb, entry_bb, nentry_bb;
   6908   profile_count total_count = profile_count::uninitialized (),
   6909 		exit_count = profile_count::uninitialized ();
   6910   edge exits[2], nexits[2], e;
   6911   gimple_stmt_iterator gsi;
   6912   edge sorig, snew;
   6913   basic_block exit_bb;
   6914   class loop *target, *aloop, *cloop;
   6915 
   6916   gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
   6917   exits[0] = exit;
   6918   exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
   6919 
   6920   if (!can_copy_bbs_p (region, n_region))
   6921     return false;
   6922 
   6923   initialize_original_copy_tables ();
   6924   set_loop_copy (orig_loop, loop);
   6925 
   6926   target= loop;
   6927   for (aloop = orig_loop->inner; aloop; aloop = aloop->next)
   6928     {
   6929       if (bb_part_of_region_p (aloop->header, region, n_region))
   6930 	{
   6931 	  cloop = duplicate_loop (aloop, target);
   6932 	  duplicate_subloops (aloop, cloop);
   6933 	}
   6934     }
   6935 
   6936   if (!region_copy)
   6937     {
   6938       region_copy = XNEWVEC (basic_block, n_region);
   6939       free_region_copy = true;
   6940     }
   6941 
   6942   gcc_assert (!need_ssa_update_p (cfun));
   6943 
   6944   /* Record blocks outside the region that are dominated by something
   6945      inside.  */
   6946   auto_vec<basic_block> doms = get_dominated_by_region (CDI_DOMINATORS, region,
   6947 							n_region);
   6948 
   6949   total_count = exit->src->count;
   6950   exit_count = exit->count ();
   6951   /* Fix up corner cases, to avoid division by zero or creation of negative
   6952      frequencies.  */
   6953   if (exit_count > total_count)
   6954     exit_count = total_count;
   6955 
   6956   copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
   6957 	    split_edge_bb_loc (exit), true);
   6958   if (total_count.initialized_p () && exit_count.initialized_p ())
   6959     {
   6960       scale_bbs_frequencies_profile_count (region, n_region,
   6961 				           total_count - exit_count,
   6962 				           total_count);
   6963       scale_bbs_frequencies_profile_count (region_copy, n_region, exit_count,
   6964 				           total_count);
   6965     }
   6966 
   6967   /* Create the switch block, and put the exit condition to it.  */
   6968   entry_bb = entry->dest;
   6969   nentry_bb = get_bb_copy (entry_bb);
   6970   if (!*gsi_last_bb (entry->src)
   6971       || !stmt_ends_bb_p (*gsi_last_bb (entry->src)))
   6972     switch_bb = entry->src;
   6973   else
   6974     switch_bb = split_edge (entry);
   6975   set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
   6976 
   6977   gcond *cond_stmt = as_a <gcond *> (*gsi_last_bb (exit->src));
   6978   cond_stmt = as_a <gcond *> (gimple_copy (cond_stmt));
   6979 
   6980   gsi = gsi_last_bb (switch_bb);
   6981   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
   6982 
   6983   sorig = single_succ_edge (switch_bb);
   6984   sorig->flags = exits[1]->flags;
   6985   sorig->probability = exits[1]->probability;
   6986   snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
   6987   snew->probability = exits[0]->probability;
   6988 
   6989 
   6990   /* Register the new edge from SWITCH_BB in loop exit lists.  */
   6991   rescan_loop_exit (snew, true, false);
   6992 
   6993   /* Add the PHI node arguments.  */
   6994   add_phi_args_after_copy (region_copy, n_region, snew);
   6995 
   6996   /* Get rid of now superfluous conditions and associated edges (and phi node
   6997      arguments).  */
   6998   exit_bb = exit->dest;
   6999 
   7000   e = redirect_edge_and_branch (exits[0], exits[1]->dest);
   7001   PENDING_STMT (e) = NULL;
   7002 
   7003   /* The latch of ORIG_LOOP was copied, and so was the backedge
   7004      to the original header.  We redirect this backedge to EXIT_BB.  */
   7005   for (i = 0; i < n_region; i++)
   7006     if (get_bb_original (region_copy[i]) == orig_loop->latch)
   7007       {
   7008 	gcc_assert (single_succ_edge (region_copy[i]));
   7009 	e = redirect_edge_and_branch (single_succ_edge (region_copy[i]), exit_bb);
   7010 	PENDING_STMT (e) = NULL;
   7011 	copy_phi_arg_into_existing_phi (nexits[0], e);
   7012       }
   7013   e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
   7014   PENDING_STMT (e) = NULL;
   7015 
   7016   /* Anything that is outside of the region, but was dominated by something
   7017      inside needs to update dominance info.  */
   7018   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
   7019 
   7020   if (free_region_copy)
   7021     free (region_copy);
   7022 
   7023   free_original_copy_tables ();
   7024   return true;
   7025 }
   7026 
   7027 /* Add all the blocks dominated by ENTRY to the array BBS_P.  Stop
   7028    adding blocks when the dominator traversal reaches EXIT.  This
   7029    function silently assumes that ENTRY strictly dominates EXIT.  */
   7030 
   7031 void
   7032 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
   7033 			      vec<basic_block> *bbs_p)
   7034 {
   7035   basic_block son;
   7036 
   7037   for (son = first_dom_son (CDI_DOMINATORS, entry);
   7038        son;
   7039        son = next_dom_son (CDI_DOMINATORS, son))
   7040     {
   7041       bbs_p->safe_push (son);
   7042       if (son != exit)
   7043 	gather_blocks_in_sese_region (son, exit, bbs_p);
   7044     }
   7045 }
   7046 
   7047 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
   7048    The duplicates are recorded in VARS_MAP.  */
   7049 
   7050 static void
   7051 replace_by_duplicate_decl (tree *tp, hash_map<tree, tree> *vars_map,
   7052 			   tree to_context)
   7053 {
   7054   tree t = *tp, new_t;
   7055   struct function *f = DECL_STRUCT_FUNCTION (to_context);
   7056 
   7057   if (DECL_CONTEXT (t) == to_context)
   7058     return;
   7059 
   7060   bool existed;
   7061   tree &loc = vars_map->get_or_insert (t, &existed);
   7062 
   7063   if (!existed)
   7064     {
   7065       if (SSA_VAR_P (t))
   7066 	{
   7067 	  new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
   7068 	  add_local_decl (f, new_t);
   7069 	}
   7070       else
   7071 	{
   7072 	  gcc_assert (TREE_CODE (t) == CONST_DECL);
   7073 	  new_t = copy_node (t);
   7074 	}
   7075       DECL_CONTEXT (new_t) = to_context;
   7076 
   7077       loc = new_t;
   7078     }
   7079   else
   7080     new_t = loc;
   7081 
   7082   *tp = new_t;
   7083 }
   7084 
   7085 
   7086 /* Creates an ssa name in TO_CONTEXT equivalent to NAME.
   7087    VARS_MAP maps old ssa names and var_decls to the new ones.  */
   7088 
   7089 static tree
   7090 replace_ssa_name (tree name, hash_map<tree, tree> *vars_map,
   7091 		  tree to_context)
   7092 {
   7093   tree new_name;
   7094 
   7095   gcc_assert (!virtual_operand_p (name));
   7096 
   7097   tree *loc = vars_map->get (name);
   7098 
   7099   if (!loc)
   7100     {
   7101       tree decl = SSA_NAME_VAR (name);
   7102       if (decl)
   7103 	{
   7104 	  gcc_assert (!SSA_NAME_IS_DEFAULT_DEF (name));
   7105 	  replace_by_duplicate_decl (&decl, vars_map, to_context);
   7106 	  new_name = make_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
   7107 				       decl, SSA_NAME_DEF_STMT (name));
   7108 	}
   7109       else
   7110 	new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
   7111 				     name, SSA_NAME_DEF_STMT (name));
   7112 
   7113       /* Now that we've used the def stmt to define new_name, make sure it
   7114 	 doesn't define name anymore.  */
   7115       SSA_NAME_DEF_STMT (name) = NULL;
   7116 
   7117       vars_map->put (name, new_name);
   7118     }
   7119   else
   7120     new_name = *loc;
   7121 
   7122   return new_name;
   7123 }
   7124 
   7125 struct move_stmt_d
   7126 {
   7127   tree orig_block;
   7128   tree new_block;
   7129   tree from_context;
   7130   tree to_context;
   7131   hash_map<tree, tree> *vars_map;
   7132   htab_t new_label_map;
   7133   hash_map<void *, void *> *eh_map;
   7134   bool remap_decls_p;
   7135 };
   7136 
   7137 /* Helper for move_block_to_fn.  Set TREE_BLOCK in every expression
   7138    contained in *TP if it has been ORIG_BLOCK previously and change the
   7139    DECL_CONTEXT of every local variable referenced in *TP.  */
   7140 
   7141 static tree
   7142 move_stmt_op (tree *tp, int *walk_subtrees, void *data)
   7143 {
   7144   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
   7145   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
   7146   tree t = *tp;
   7147 
   7148   if (EXPR_P (t))
   7149     {
   7150       tree block = TREE_BLOCK (t);
   7151       if (block == NULL_TREE)
   7152 	;
   7153       else if (block == p->orig_block
   7154 	       || p->orig_block == NULL_TREE)
   7155 	{
   7156 	  /* tree_node_can_be_shared says we can share invariant
   7157 	     addresses but unshare_expr copies them anyways.  Make sure
   7158 	     to unshare before adjusting the block in place - we do not
   7159 	     always see a copy here.  */
   7160 	  if (TREE_CODE (t) == ADDR_EXPR
   7161 	      && is_gimple_min_invariant (t))
   7162 	    *tp = t = unshare_expr (t);
   7163 	  TREE_SET_BLOCK (t, p->new_block);
   7164 	}
   7165       else if (flag_checking)
   7166 	{
   7167 	  while (block && TREE_CODE (block) == BLOCK && block != p->orig_block)
   7168 	    block = BLOCK_SUPERCONTEXT (block);
   7169 	  gcc_assert (block == p->orig_block);
   7170 	}
   7171     }
   7172   else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
   7173     {
   7174       if (TREE_CODE (t) == SSA_NAME)
   7175 	*tp = replace_ssa_name (t, p->vars_map, p->to_context);
   7176       else if (TREE_CODE (t) == PARM_DECL
   7177 	       && gimple_in_ssa_p (cfun))
   7178 	*tp = *(p->vars_map->get (t));
   7179       else if (TREE_CODE (t) == LABEL_DECL)
   7180 	{
   7181 	  if (p->new_label_map)
   7182 	    {
   7183 	      struct tree_map in, *out;
   7184 	      in.base.from = t;
   7185 	      out = (struct tree_map *)
   7186 		htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
   7187 	      if (out)
   7188 		*tp = t = out->to;
   7189 	    }
   7190 
   7191 	  /* For FORCED_LABELs we can end up with references from other
   7192 	     functions if some SESE regions are outlined.  It is UB to
   7193 	     jump in between them, but they could be used just for printing
   7194 	     addresses etc.  In that case, DECL_CONTEXT on the label should
   7195 	     be the function containing the glabel stmt with that LABEL_DECL,
   7196 	     rather than whatever function a reference to the label was seen
   7197 	     last time.  */
   7198 	  if (!FORCED_LABEL (t) && !DECL_NONLOCAL (t))
   7199 	    DECL_CONTEXT (t) = p->to_context;
   7200 	}
   7201       else if (p->remap_decls_p)
   7202 	{
   7203 	  /* Replace T with its duplicate.  T should no longer appear in the
   7204 	     parent function, so this looks wasteful; however, it may appear
   7205 	     in referenced_vars, and more importantly, as virtual operands of
   7206 	     statements, and in alias lists of other variables.  It would be
   7207 	     quite difficult to expunge it from all those places.  ??? It might
   7208 	     suffice to do this for addressable variables.  */
   7209 	  if ((VAR_P (t) && !is_global_var (t))
   7210 	      || TREE_CODE (t) == CONST_DECL)
   7211 	    replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
   7212 	}
   7213       *walk_subtrees = 0;
   7214     }
   7215   else if (TYPE_P (t))
   7216     *walk_subtrees = 0;
   7217 
   7218   return NULL_TREE;
   7219 }
   7220 
   7221 /* Helper for move_stmt_r.  Given an EH region number for the source
   7222    function, map that to the duplicate EH regio number in the dest.  */
   7223 
   7224 static int
   7225 move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
   7226 {
   7227   eh_region old_r, new_r;
   7228 
   7229   old_r = get_eh_region_from_number (old_nr);
   7230   new_r = static_cast<eh_region> (*p->eh_map->get (old_r));
   7231 
   7232   return new_r->index;
   7233 }
   7234 
   7235 /* Similar, but operate on INTEGER_CSTs.  */
   7236 
   7237 static tree
   7238 move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p)
   7239 {
   7240   int old_nr, new_nr;
   7241 
   7242   old_nr = tree_to_shwi (old_t_nr);
   7243   new_nr = move_stmt_eh_region_nr (old_nr, p);
   7244 
   7245   return build_int_cst (integer_type_node, new_nr);
   7246 }
   7247 
   7248 /* Like move_stmt_op, but for gimple statements.
   7249 
   7250    Helper for move_block_to_fn.  Set GIMPLE_BLOCK in every expression
   7251    contained in the current statement in *GSI_P and change the
   7252    DECL_CONTEXT of every local variable referenced in the current
   7253    statement.  */
   7254 
   7255 static tree
   7256 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
   7257 	     struct walk_stmt_info *wi)
   7258 {
   7259   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
   7260   gimple *stmt = gsi_stmt (*gsi_p);
   7261   tree block = gimple_block (stmt);
   7262 
   7263   if (block == p->orig_block
   7264       || (p->orig_block == NULL_TREE
   7265 	  && block != NULL_TREE))
   7266     gimple_set_block (stmt, p->new_block);
   7267 
   7268   switch (gimple_code (stmt))
   7269     {
   7270     case GIMPLE_CALL:
   7271       /* Remap the region numbers for __builtin_eh_{pointer,filter}.  */
   7272       {
   7273 	tree r, fndecl = gimple_call_fndecl (stmt);
   7274 	if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
   7275 	  switch (DECL_FUNCTION_CODE (fndecl))
   7276 	    {
   7277 	    case BUILT_IN_EH_COPY_VALUES:
   7278 	      r = gimple_call_arg (stmt, 1);
   7279 	      r = move_stmt_eh_region_tree_nr (r, p);
   7280 	      gimple_call_set_arg (stmt, 1, r);
   7281 	      /* FALLTHRU */
   7282 
   7283 	    case BUILT_IN_EH_POINTER:
   7284 	    case BUILT_IN_EH_FILTER:
   7285 	      r = gimple_call_arg (stmt, 0);
   7286 	      r = move_stmt_eh_region_tree_nr (r, p);
   7287 	      gimple_call_set_arg (stmt, 0, r);
   7288 	      break;
   7289 
   7290 	    default:
   7291 	      break;
   7292 	    }
   7293       }
   7294       break;
   7295 
   7296     case GIMPLE_RESX:
   7297       {
   7298 	gresx *resx_stmt = as_a <gresx *> (stmt);
   7299 	int r = gimple_resx_region (resx_stmt);
   7300 	r = move_stmt_eh_region_nr (r, p);
   7301 	gimple_resx_set_region (resx_stmt, r);
   7302       }
   7303       break;
   7304 
   7305     case GIMPLE_EH_DISPATCH:
   7306       {
   7307 	geh_dispatch *eh_dispatch_stmt = as_a <geh_dispatch *> (stmt);
   7308 	int r = gimple_eh_dispatch_region (eh_dispatch_stmt);
   7309 	r = move_stmt_eh_region_nr (r, p);
   7310 	gimple_eh_dispatch_set_region (eh_dispatch_stmt, r);
   7311       }
   7312       break;
   7313 
   7314     case GIMPLE_OMP_RETURN:
   7315     case GIMPLE_OMP_CONTINUE:
   7316       break;
   7317 
   7318     case GIMPLE_LABEL:
   7319       {
   7320 	/* For FORCED_LABEL, move_stmt_op doesn't adjust DECL_CONTEXT,
   7321 	   so that such labels can be referenced from other regions.
   7322 	   Make sure to update it when seeing a GIMPLE_LABEL though,
   7323 	   that is the owner of the label.  */
   7324 	walk_gimple_op (stmt, move_stmt_op, wi);
   7325 	*handled_ops_p = true;
   7326 	tree label = gimple_label_label (as_a <glabel *> (stmt));
   7327 	if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
   7328 	  DECL_CONTEXT (label) = p->to_context;
   7329       }
   7330       break;
   7331 
   7332     default:
   7333       if (is_gimple_omp (stmt))
   7334 	{
   7335 	  /* Do not remap variables inside OMP directives.  Variables
   7336 	     referenced in clauses and directive header belong to the
   7337 	     parent function and should not be moved into the child
   7338 	     function.  */
   7339 	  bool save_remap_decls_p = p->remap_decls_p;
   7340 	  p->remap_decls_p = false;
   7341 	  *handled_ops_p = true;
   7342 
   7343 	  walk_gimple_seq_mod (gimple_omp_body_ptr (stmt), move_stmt_r,
   7344 			       move_stmt_op, wi);
   7345 
   7346 	  p->remap_decls_p = save_remap_decls_p;
   7347 	}
   7348       break;
   7349     }
   7350 
   7351   return NULL_TREE;
   7352 }
   7353 
   7354 /* Move basic block BB from function CFUN to function DEST_FN.  The
   7355    block is moved out of the original linked list and placed after
   7356    block AFTER in the new list.  Also, the block is removed from the
   7357    original array of blocks and placed in DEST_FN's array of blocks.
   7358    If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
   7359    updated to reflect the moved edges.
   7360 
   7361    The local variables are remapped to new instances, VARS_MAP is used
   7362    to record the mapping.  */
   7363 
   7364 static void
   7365 move_block_to_fn (struct function *dest_cfun, basic_block bb,
   7366 		  basic_block after, bool update_edge_count_p,
   7367 		  struct move_stmt_d *d)
   7368 {
   7369   struct control_flow_graph *cfg;
   7370   edge_iterator ei;
   7371   edge e;
   7372   gimple_stmt_iterator si;
   7373   unsigned old_len;
   7374 
   7375   /* Remove BB from dominance structures.  */
   7376   delete_from_dominance_info (CDI_DOMINATORS, bb);
   7377 
   7378   /* Move BB from its current loop to the copy in the new function.  */
   7379   if (current_loops)
   7380     {
   7381       class loop *new_loop = (class loop *)bb->loop_father->aux;
   7382       if (new_loop)
   7383 	bb->loop_father = new_loop;
   7384     }
   7385 
   7386   /* Link BB to the new linked list.  */
   7387   move_block_after (bb, after);
   7388 
   7389   /* Update the edge count in the corresponding flowgraphs.  */
   7390   if (update_edge_count_p)
   7391     FOR_EACH_EDGE (e, ei, bb->succs)
   7392       {
   7393 	cfun->cfg->x_n_edges--;
   7394 	dest_cfun->cfg->x_n_edges++;
   7395       }
   7396 
   7397   /* Remove BB from the original basic block array.  */
   7398   (*cfun->cfg->x_basic_block_info)[bb->index] = NULL;
   7399   cfun->cfg->x_n_basic_blocks--;
   7400 
   7401   /* Grow DEST_CFUN's basic block array if needed.  */
   7402   cfg = dest_cfun->cfg;
   7403   cfg->x_n_basic_blocks++;
   7404   if (bb->index >= cfg->x_last_basic_block)
   7405     cfg->x_last_basic_block = bb->index + 1;
   7406 
   7407   old_len = vec_safe_length (cfg->x_basic_block_info);
   7408   if ((unsigned) cfg->x_last_basic_block >= old_len)
   7409     vec_safe_grow_cleared (cfg->x_basic_block_info,
   7410 			   cfg->x_last_basic_block + 1);
   7411 
   7412   (*cfg->x_basic_block_info)[bb->index] = bb;
   7413 
   7414   /* Remap the variables in phi nodes.  */
   7415   for (gphi_iterator psi = gsi_start_phis (bb);
   7416        !gsi_end_p (psi); )
   7417     {
   7418       gphi *phi = psi.phi ();
   7419       use_operand_p use;
   7420       tree op = PHI_RESULT (phi);
   7421       ssa_op_iter oi;
   7422       unsigned i;
   7423 
   7424       if (virtual_operand_p (op))
   7425 	{
   7426 	  /* Remove the phi nodes for virtual operands (alias analysis will be
   7427 	     run for the new function, anyway).  But replace all uses that
   7428 	     might be outside of the region we move.  */
   7429 	  use_operand_p use_p;
   7430 	  imm_use_iterator iter;
   7431 	  gimple *use_stmt;
   7432 	  FOR_EACH_IMM_USE_STMT (use_stmt, iter, op)
   7433 	    FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
   7434 	      SET_USE (use_p, SSA_NAME_VAR (op));
   7435           remove_phi_node (&psi, true);
   7436 	  continue;
   7437 	}
   7438 
   7439       SET_PHI_RESULT (phi,
   7440 		      replace_ssa_name (op, d->vars_map, dest_cfun->decl));
   7441       FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
   7442 	{
   7443 	  op = USE_FROM_PTR (use);
   7444 	  if (TREE_CODE (op) == SSA_NAME)
   7445 	    SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
   7446 	}
   7447 
   7448       for (i = 0; i < EDGE_COUNT (bb->preds); i++)
   7449 	{
   7450 	  location_t locus = gimple_phi_arg_location (phi, i);
   7451 	  tree block = LOCATION_BLOCK (locus);
   7452 
   7453 	  if (locus == UNKNOWN_LOCATION)
   7454 	    continue;
   7455 	  if (d->orig_block == NULL_TREE || block == d->orig_block)
   7456 	    {
   7457 	      locus = set_block (locus, d->new_block);
   7458 	      gimple_phi_arg_set_location (phi, i, locus);
   7459 	    }
   7460 	}
   7461 
   7462       gsi_next (&psi);
   7463     }
   7464 
   7465   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
   7466     {
   7467       gimple *stmt = gsi_stmt (si);
   7468       struct walk_stmt_info wi;
   7469 
   7470       memset (&wi, 0, sizeof (wi));
   7471       wi.info = d;
   7472       walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
   7473 
   7474       if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
   7475 	{
   7476 	  tree label = gimple_label_label (label_stmt);
   7477 	  int uid = LABEL_DECL_UID (label);
   7478 
   7479 	  gcc_assert (uid > -1);
   7480 
   7481 	  old_len = vec_safe_length (cfg->x_label_to_block_map);
   7482 	  if (old_len <= (unsigned) uid)
   7483 	    vec_safe_grow_cleared (cfg->x_label_to_block_map, uid + 1);
   7484 
   7485 	  (*cfg->x_label_to_block_map)[uid] = bb;
   7486 	  (*cfun->cfg->x_label_to_block_map)[uid] = NULL;
   7487 
   7488 	  gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
   7489 
   7490 	  if (uid >= dest_cfun->cfg->last_label_uid)
   7491 	    dest_cfun->cfg->last_label_uid = uid + 1;
   7492 	}
   7493 
   7494       maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0);
   7495       remove_stmt_from_eh_lp_fn (cfun, stmt);
   7496 
   7497       gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
   7498       gimple_remove_stmt_histograms (cfun, stmt);
   7499 
   7500       /* We cannot leave any operands allocated from the operand caches of
   7501 	 the current function.  */
   7502       free_stmt_operands (cfun, stmt);
   7503       push_cfun (dest_cfun);
   7504       update_stmt (stmt);
   7505       if (is_gimple_call (stmt))
   7506 	notice_special_calls (as_a <gcall *> (stmt));
   7507       pop_cfun ();
   7508     }
   7509 
   7510   FOR_EACH_EDGE (e, ei, bb->succs)
   7511     if (e->goto_locus != UNKNOWN_LOCATION)
   7512       {
   7513 	tree block = LOCATION_BLOCK (e->goto_locus);
   7514 	if (d->orig_block == NULL_TREE
   7515 	    || block == d->orig_block)
   7516 	  e->goto_locus = set_block (e->goto_locus, d->new_block);
   7517       }
   7518 }
   7519 
   7520 /* Examine the statements in BB (which is in SRC_CFUN); find and return
   7521    the outermost EH region.  Use REGION as the incoming base EH region.
   7522    If there is no single outermost region, return NULL and set *ALL to
   7523    true.  */
   7524 
   7525 static eh_region
   7526 find_outermost_region_in_block (struct function *src_cfun,
   7527 				basic_block bb, eh_region region,
   7528 				bool *all)
   7529 {
   7530   gimple_stmt_iterator si;
   7531 
   7532   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
   7533     {
   7534       gimple *stmt = gsi_stmt (si);
   7535       eh_region stmt_region;
   7536       int lp_nr;
   7537 
   7538       lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt);
   7539       stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr);
   7540       if (stmt_region)
   7541 	{
   7542 	  if (region == NULL)
   7543 	    region = stmt_region;
   7544 	  else if (stmt_region != region)
   7545 	    {
   7546 	      region = eh_region_outermost (src_cfun, stmt_region, region);
   7547 	      if (region == NULL)
   7548 		{
   7549 		  *all = true;
   7550 		  return NULL;
   7551 		}
   7552 	    }
   7553 	}
   7554     }
   7555 
   7556   return region;
   7557 }
   7558 
   7559 static tree
   7560 new_label_mapper (tree decl, void *data)
   7561 {
   7562   htab_t hash = (htab_t) data;
   7563   struct tree_map *m;
   7564   void **slot;
   7565 
   7566   gcc_assert (TREE_CODE (decl) == LABEL_DECL);
   7567 
   7568   m = XNEW (struct tree_map);
   7569   m->hash = DECL_UID (decl);
   7570   m->base.from = decl;
   7571   m->to = create_artificial_label (UNKNOWN_LOCATION);
   7572   LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
   7573   if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
   7574     cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
   7575 
   7576   slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
   7577   gcc_assert (*slot == NULL);
   7578 
   7579   *slot = m;
   7580 
   7581   return m->to;
   7582 }
   7583 
   7584 /* Tree walker to replace the decls used inside value expressions by
   7585    duplicates.  */
   7586 
   7587 static tree
   7588 replace_block_vars_by_duplicates_1 (tree *tp, int *walk_subtrees, void *data)
   7589 {
   7590   struct replace_decls_d *rd = (struct replace_decls_d *)data;
   7591 
   7592   switch (TREE_CODE (*tp))
   7593     {
   7594     case VAR_DECL:
   7595     case PARM_DECL:
   7596     case RESULT_DECL:
   7597       replace_by_duplicate_decl (tp, rd->vars_map, rd->to_context);
   7598       break;
   7599     default:
   7600       break;
   7601     }
   7602 
   7603   if (IS_TYPE_OR_DECL_P (*tp))
   7604     *walk_subtrees = false;
   7605 
   7606   return NULL;
   7607 }
   7608 
   7609 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
   7610    subblocks.  */
   7611 
   7612 static void
   7613 replace_block_vars_by_duplicates (tree block, hash_map<tree, tree> *vars_map,
   7614 				  tree to_context)
   7615 {
   7616   tree *tp, t;
   7617 
   7618   for (tp = &BLOCK_VARS (block); *tp; tp = &DECL_CHAIN (*tp))
   7619     {
   7620       t = *tp;
   7621       if (!VAR_P (t) && TREE_CODE (t) != CONST_DECL)
   7622 	continue;
   7623       replace_by_duplicate_decl (&t, vars_map, to_context);
   7624       if (t != *tp)
   7625 	{
   7626 	  if (VAR_P (*tp) && DECL_HAS_VALUE_EXPR_P (*tp))
   7627 	    {
   7628 	      tree x = DECL_VALUE_EXPR (*tp);
   7629 	      struct replace_decls_d rd = { vars_map, to_context };
   7630 	      unshare_expr (x);
   7631 	      walk_tree (&x, replace_block_vars_by_duplicates_1, &rd, NULL);
   7632 	      SET_DECL_VALUE_EXPR (t, x);
   7633 	      DECL_HAS_VALUE_EXPR_P (t) = 1;
   7634 	    }
   7635 	  DECL_CHAIN (t) = DECL_CHAIN (*tp);
   7636 	  *tp = t;
   7637 	}
   7638     }
   7639 
   7640   for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
   7641     replace_block_vars_by_duplicates (block, vars_map, to_context);
   7642 }
   7643 
   7644 /* Fixup the loop arrays and numbers after moving LOOP and its subloops
   7645    from FN1 to FN2.  */
   7646 
   7647 static void
   7648 fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2,
   7649 			      class loop *loop)
   7650 {
   7651   /* Discard it from the old loop array.  */
   7652   (*get_loops (fn1))[loop->num] = NULL;
   7653 
   7654   /* Place it in the new loop array, assigning it a new number.  */
   7655   loop->num = number_of_loops (fn2);
   7656   vec_safe_push (loops_for_fn (fn2)->larray, loop);
   7657 
   7658   /* Recurse to children.  */
   7659   for (loop = loop->inner; loop; loop = loop->next)
   7660     fixup_loop_arrays_after_move (fn1, fn2, loop);
   7661 }
   7662 
   7663 /* Verify that the blocks in BBS_P are a single-entry, single-exit region
   7664    delimited by ENTRY_BB and EXIT_BB, possibly containing noreturn blocks.  */
   7665 
   7666 DEBUG_FUNCTION void
   7667 verify_sese (basic_block entry, basic_block exit, vec<basic_block> *bbs_p)
   7668 {
   7669   basic_block bb;
   7670   edge_iterator ei;
   7671   edge e;
   7672   bitmap bbs = BITMAP_ALLOC (NULL);
   7673   int i;
   7674 
   7675   gcc_assert (entry != NULL);
   7676   gcc_assert (entry != exit);
   7677   gcc_assert (bbs_p != NULL);
   7678 
   7679   gcc_assert (bbs_p->length () > 0);
   7680 
   7681   FOR_EACH_VEC_ELT (*bbs_p, i, bb)
   7682     bitmap_set_bit (bbs, bb->index);
   7683 
   7684   gcc_assert (bitmap_bit_p (bbs, entry->index));
   7685   gcc_assert (exit == NULL || bitmap_bit_p (bbs, exit->index));
   7686 
   7687   FOR_EACH_VEC_ELT (*bbs_p, i, bb)
   7688     {
   7689       if (bb == entry)
   7690 	{
   7691 	  gcc_assert (single_pred_p (entry));
   7692 	  gcc_assert (!bitmap_bit_p (bbs, single_pred (entry)->index));
   7693 	}
   7694       else
   7695 	for (ei = ei_start (bb->preds); !ei_end_p (ei); ei_next (&ei))
   7696 	  {
   7697 	    e = ei_edge (ei);
   7698 	    gcc_assert (bitmap_bit_p (bbs, e->src->index));
   7699 	  }
   7700 
   7701       if (bb == exit)
   7702 	{
   7703 	  gcc_assert (single_succ_p (exit));
   7704 	  gcc_assert (!bitmap_bit_p (bbs, single_succ (exit)->index));
   7705 	}
   7706       else
   7707 	for (ei = ei_start (bb->succs); !ei_end_p (ei); ei_next (&ei))
   7708 	  {
   7709 	    e = ei_edge (ei);
   7710 	    gcc_assert (bitmap_bit_p (bbs, e->dest->index));
   7711 	  }
   7712     }
   7713 
   7714   BITMAP_FREE (bbs);
   7715 }
   7716 
   7717 /* If FROM is an SSA_NAME, mark the version in bitmap DATA.  */
   7718 
   7719 bool
   7720 gather_ssa_name_hash_map_from (tree const &from, tree const &, void *data)
   7721 {
   7722   bitmap release_names = (bitmap)data;
   7723 
   7724   if (TREE_CODE (from) != SSA_NAME)
   7725     return true;
   7726 
   7727   bitmap_set_bit (release_names, SSA_NAME_VERSION (from));
   7728   return true;
   7729 }
   7730 
   7731 /* Return LOOP_DIST_ALIAS call if present in BB.  */
   7732 
   7733 static gimple *
   7734 find_loop_dist_alias (basic_block bb)
   7735 {
   7736   gimple_stmt_iterator gsi = gsi_last_bb (bb);
   7737   if (!safe_is_a <gcond *> (*gsi))
   7738     return NULL;
   7739 
   7740   gsi_prev (&gsi);
   7741   if (gsi_end_p (gsi))
   7742     return NULL;
   7743 
   7744   gimple *g = gsi_stmt (gsi);
   7745   if (gimple_call_internal_p (g, IFN_LOOP_DIST_ALIAS))
   7746     return g;
   7747   return NULL;
   7748 }
   7749 
   7750 /* Fold loop internal call G like IFN_LOOP_VECTORIZED/IFN_LOOP_DIST_ALIAS
   7751    to VALUE and update any immediate uses of it's LHS.  */
   7752 
   7753 void
   7754 fold_loop_internal_call (gimple *g, tree value)
   7755 {
   7756   tree lhs = gimple_call_lhs (g);
   7757   use_operand_p use_p;
   7758   imm_use_iterator iter;
   7759   gimple *use_stmt;
   7760   gimple_stmt_iterator gsi = gsi_for_stmt (g);
   7761 
   7762   replace_call_with_value (&gsi, value);
   7763   FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
   7764     {
   7765       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
   7766 	SET_USE (use_p, value);
   7767       update_stmt (use_stmt);
   7768       /* If we turn conditional to constant, scale profile counts.
   7769 	 We know that the conditional was created by loop distribution
   7770 	 and all basic blocks dominated by the taken edge are part of
   7771 	 the loop distributed.  */
   7772       if (gimple_code (use_stmt) == GIMPLE_COND)
   7773 	{
   7774 	  edge true_edge, false_edge;
   7775 	  extract_true_false_edges_from_block (gimple_bb (use_stmt),
   7776 					       &true_edge, &false_edge);
   7777 	  edge taken_edge = NULL, other_edge = NULL;
   7778 	  if (gimple_cond_true_p (as_a <gcond *>(use_stmt)))
   7779 	    {
   7780 	      taken_edge = true_edge;
   7781 	      other_edge = false_edge;
   7782 	    }
   7783 	  else if (gimple_cond_false_p (as_a <gcond *>(use_stmt)))
   7784 	    {
   7785 	      taken_edge = false_edge;
   7786 	      other_edge = true_edge;
   7787 	    }
   7788 	  if (taken_edge
   7789 	      && !(taken_edge->probability == profile_probability::always ()))
   7790 	    {
   7791 	      profile_count old_count = taken_edge->count ();
   7792 	      profile_count new_count = taken_edge->src->count;
   7793 	      taken_edge->probability = profile_probability::always ();
   7794 	      other_edge->probability = profile_probability::never ();
   7795 	      /* If we have multiple predecessors, we can't use the dominance
   7796 		 test.  This should not happen as the guarded code should
   7797 		 start with pre-header.  */
   7798 	      gcc_assert (single_pred_edge (taken_edge->dest));
   7799 	      if (old_count.nonzero_p ())
   7800 		{
   7801 		  taken_edge->dest->count
   7802 		    = taken_edge->dest->count.apply_scale (new_count,
   7803 							   old_count);
   7804 		  scale_strictly_dominated_blocks (taken_edge->dest,
   7805 						   new_count, old_count);
   7806 		}
   7807 	    }
   7808 	}
   7809     }
   7810 }
   7811 
   7812 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
   7813    EXIT_BB to function DEST_CFUN.  The whole region is replaced by a
   7814    single basic block in the original CFG and the new basic block is
   7815    returned.  DEST_CFUN must not have a CFG yet.
   7816 
   7817    Note that the region need not be a pure SESE region.  Blocks inside
   7818    the region may contain calls to abort/exit.  The only restriction
   7819    is that ENTRY_BB should be the only entry point and it must
   7820    dominate EXIT_BB.
   7821 
   7822    Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
   7823    functions outermost BLOCK, move all subblocks of ORIG_BLOCK
   7824    to the new function.
   7825 
   7826    All local variables referenced in the region are assumed to be in
   7827    the corresponding BLOCK_VARS and unexpanded variable lists
   7828    associated with DEST_CFUN.
   7829 
   7830    TODO: investigate whether we can reuse gimple_duplicate_sese_region to
   7831    reimplement move_sese_region_to_fn by duplicating the region rather than
   7832    moving it.  */
   7833 
   7834 basic_block
   7835 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
   7836 		        basic_block exit_bb, tree orig_block)
   7837 {
   7838   vec<basic_block> bbs;
   7839   basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
   7840   basic_block after, bb, *entry_pred, *exit_succ, abb;
   7841   struct function *saved_cfun = cfun;
   7842   int *entry_flag, *exit_flag;
   7843   profile_probability *entry_prob, *exit_prob;
   7844   unsigned i, num_entry_edges, num_exit_edges, num_nodes;
   7845   edge e;
   7846   edge_iterator ei;
   7847   htab_t new_label_map;
   7848   hash_map<void *, void *> *eh_map;
   7849   class loop *loop = entry_bb->loop_father;
   7850   class loop *loop0 = get_loop (saved_cfun, 0);
   7851   struct move_stmt_d d;
   7852 
   7853   /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
   7854      region.  */
   7855   gcc_assert (entry_bb != exit_bb
   7856               && (!exit_bb
   7857 		  || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
   7858 
   7859   /* Collect all the blocks in the region.  Manually add ENTRY_BB
   7860      because it won't be added by dfs_enumerate_from.  */
   7861   bbs.create (0);
   7862   bbs.safe_push (entry_bb);
   7863   gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
   7864 
   7865   if (flag_checking)
   7866     verify_sese (entry_bb, exit_bb, &bbs);
   7867 
   7868   /* The blocks that used to be dominated by something in BBS will now be
   7869      dominated by the new block.  */
   7870   auto_vec<basic_block> dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
   7871 							   bbs.address (),
   7872 							   bbs.length ());
   7873 
   7874   /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG.  We need to remember
   7875      the predecessor edges to ENTRY_BB and the successor edges to
   7876      EXIT_BB so that we can re-attach them to the new basic block that
   7877      will replace the region.  */
   7878   num_entry_edges = EDGE_COUNT (entry_bb->preds);
   7879   entry_pred = XNEWVEC (basic_block, num_entry_edges);
   7880   entry_flag = XNEWVEC (int, num_entry_edges);
   7881   entry_prob = XNEWVEC (profile_probability, num_entry_edges);
   7882   i = 0;
   7883   for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
   7884     {
   7885       entry_prob[i] = e->probability;
   7886       entry_flag[i] = e->flags;
   7887       entry_pred[i++] = e->src;
   7888       remove_edge (e);
   7889     }
   7890 
   7891   if (exit_bb)
   7892     {
   7893       num_exit_edges = EDGE_COUNT (exit_bb->succs);
   7894       exit_succ = XNEWVEC (basic_block, num_exit_edges);
   7895       exit_flag = XNEWVEC (int, num_exit_edges);
   7896       exit_prob = XNEWVEC (profile_probability, num_exit_edges);
   7897       i = 0;
   7898       for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
   7899 	{
   7900 	  exit_prob[i] = e->probability;
   7901 	  exit_flag[i] = e->flags;
   7902 	  exit_succ[i++] = e->dest;
   7903 	  remove_edge (e);
   7904 	}
   7905     }
   7906   else
   7907     {
   7908       num_exit_edges = 0;
   7909       exit_succ = NULL;
   7910       exit_flag = NULL;
   7911       exit_prob = NULL;
   7912     }
   7913 
   7914   /* Switch context to the child function to initialize DEST_FN's CFG.  */
   7915   gcc_assert (dest_cfun->cfg == NULL);
   7916   push_cfun (dest_cfun);
   7917 
   7918   init_empty_tree_cfg ();
   7919 
   7920   /* Initialize EH information for the new function.  */
   7921   eh_map = NULL;
   7922   new_label_map = NULL;
   7923   if (saved_cfun->eh)
   7924     {
   7925       eh_region region = NULL;
   7926       bool all = false;
   7927 
   7928       FOR_EACH_VEC_ELT (bbs, i, bb)
   7929 	{
   7930 	  region = find_outermost_region_in_block (saved_cfun, bb, region, &all);
   7931 	  if (all)
   7932 	    break;
   7933 	}
   7934 
   7935       init_eh_for_function ();
   7936       if (region != NULL || all)
   7937 	{
   7938 	  new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
   7939 	  eh_map = duplicate_eh_regions (saved_cfun, region, 0,
   7940 					 new_label_mapper, new_label_map);
   7941 	}
   7942     }
   7943 
   7944   /* Initialize an empty loop tree.  */
   7945   struct loops *loops = ggc_cleared_alloc<struct loops> ();
   7946   init_loops_structure (dest_cfun, loops, 1);
   7947   loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
   7948   set_loops_for_fn (dest_cfun, loops);
   7949 
   7950   vec<loop_p, va_gc> *larray = get_loops (saved_cfun)->copy ();
   7951 
   7952   /* Move the outlined loop tree part.  */
   7953   num_nodes = bbs.length ();
   7954   FOR_EACH_VEC_ELT (bbs, i, bb)
   7955     {
   7956       if (bb->loop_father->header == bb)
   7957 	{
   7958 	  class loop *this_loop = bb->loop_father;
   7959 	  /* Avoid the need to remap SSA names used in nb_iterations.  */
   7960 	  free_numbers_of_iterations_estimates (this_loop);
   7961 	  class loop *outer = loop_outer (this_loop);
   7962 	  if (outer == loop
   7963 	      /* If the SESE region contains some bbs ending with
   7964 		 a noreturn call, those are considered to belong
   7965 		 to the outermost loop in saved_cfun, rather than
   7966 		 the entry_bb's loop_father.  */
   7967 	      || outer == loop0)
   7968 	    {
   7969 	      if (outer != loop)
   7970 		num_nodes -= this_loop->num_nodes;
   7971 	      flow_loop_tree_node_remove (bb->loop_father);
   7972 	      flow_loop_tree_node_add (get_loop (dest_cfun, 0), this_loop);
   7973 	      fixup_loop_arrays_after_move (saved_cfun, cfun, this_loop);
   7974 	    }
   7975 	}
   7976       else if (bb->loop_father == loop0 && loop0 != loop)
   7977 	num_nodes--;
   7978 
   7979       /* Remove loop exits from the outlined region.  */
   7980       if (loops_for_fn (saved_cfun)->exits)
   7981 	FOR_EACH_EDGE (e, ei, bb->succs)
   7982 	  {
   7983 	    struct loops *l = loops_for_fn (saved_cfun);
   7984 	    loop_exit **slot
   7985 	      = l->exits->find_slot_with_hash (e, htab_hash_pointer (e),
   7986 					       NO_INSERT);
   7987 	    if (slot)
   7988 	      l->exits->clear_slot (slot);
   7989 	  }
   7990     }
   7991 
   7992   /* Adjust the number of blocks in the tree root of the outlined part.  */
   7993   get_loop (dest_cfun, 0)->num_nodes = bbs.length () + 2;
   7994 
   7995   /* Setup a mapping to be used by move_block_to_fn.  */
   7996   loop->aux = current_loops->tree_root;
   7997   loop0->aux = current_loops->tree_root;
   7998 
   7999   /* Fix up orig_loop_num.  If the block referenced in it has been moved
   8000      to dest_cfun, update orig_loop_num field, otherwise clear it.  */
   8001   signed char *moved_orig_loop_num = NULL;
   8002   for (auto dloop : loops_list (dest_cfun, 0))
   8003     if (dloop->orig_loop_num)
   8004       {
   8005 	if (moved_orig_loop_num == NULL)
   8006 	  moved_orig_loop_num
   8007 	    = XCNEWVEC (signed char, vec_safe_length (larray));
   8008 	if ((*larray)[dloop->orig_loop_num] != NULL
   8009 	    && get_loop (saved_cfun, dloop->orig_loop_num) == NULL)
   8010 	  {
   8011 	    if (moved_orig_loop_num[dloop->orig_loop_num] >= 0
   8012 		&& moved_orig_loop_num[dloop->orig_loop_num] < 2)
   8013 	      moved_orig_loop_num[dloop->orig_loop_num]++;
   8014 	    dloop->orig_loop_num = (*larray)[dloop->orig_loop_num]->num;
   8015 	  }
   8016 	else
   8017 	  {
   8018 	    moved_orig_loop_num[dloop->orig_loop_num] = -1;
   8019 	    dloop->orig_loop_num = 0;
   8020 	  }
   8021       }
   8022   pop_cfun ();
   8023 
   8024   if (moved_orig_loop_num)
   8025     {
   8026       FOR_EACH_VEC_ELT (bbs, i, bb)
   8027 	{
   8028 	  gimple *g = find_loop_dist_alias (bb);
   8029 	  if (g == NULL)
   8030 	    continue;
   8031 
   8032 	  int orig_loop_num = tree_to_shwi (gimple_call_arg (g, 0));
   8033 	  gcc_assert (orig_loop_num
   8034 		      && (unsigned) orig_loop_num < vec_safe_length (larray));
   8035 	  if (moved_orig_loop_num[orig_loop_num] == 2)
   8036 	    {
   8037 	      /* If we have moved both loops with this orig_loop_num into
   8038 		 dest_cfun and the LOOP_DIST_ALIAS call is being moved there
   8039 		 too, update the first argument.  */
   8040 	      gcc_assert ((*larray)[orig_loop_num] != NULL
   8041 			  && (get_loop (saved_cfun, orig_loop_num) == NULL));
   8042 	      tree t = build_int_cst (integer_type_node,
   8043 				      (*larray)[orig_loop_num]->num);
   8044 	      gimple_call_set_arg (g, 0, t);
   8045 	      update_stmt (g);
   8046 	      /* Make sure the following loop will not update it.  */
   8047 	      moved_orig_loop_num[orig_loop_num] = 0;
   8048 	    }
   8049 	  else
   8050 	    /* Otherwise at least one of the loops stayed in saved_cfun.
   8051 	       Remove the LOOP_DIST_ALIAS call.  */
   8052 	    fold_loop_internal_call (g, gimple_call_arg (g, 1));
   8053 	}
   8054       FOR_EACH_BB_FN (bb, saved_cfun)
   8055 	{
   8056 	  gimple *g = find_loop_dist_alias (bb);
   8057 	  if (g == NULL)
   8058 	    continue;
   8059 	  int orig_loop_num = tree_to_shwi (gimple_call_arg (g, 0));
   8060 	  gcc_assert (orig_loop_num
   8061 		      && (unsigned) orig_loop_num < vec_safe_length (larray));
   8062 	  if (moved_orig_loop_num[orig_loop_num])
   8063 	    /* LOOP_DIST_ALIAS call remained in saved_cfun, if at least one
   8064 	       of the corresponding loops was moved, remove it.  */
   8065 	    fold_loop_internal_call (g, gimple_call_arg (g, 1));
   8066 	}
   8067       XDELETEVEC (moved_orig_loop_num);
   8068     }
   8069   ggc_free (larray);
   8070 
   8071   /* Move blocks from BBS into DEST_CFUN.  */
   8072   gcc_assert (bbs.length () >= 2);
   8073   after = dest_cfun->cfg->x_entry_block_ptr;
   8074   hash_map<tree, tree> vars_map;
   8075 
   8076   memset (&d, 0, sizeof (d));
   8077   d.orig_block = orig_block;
   8078   d.new_block = DECL_INITIAL (dest_cfun->decl);
   8079   d.from_context = cfun->decl;
   8080   d.to_context = dest_cfun->decl;
   8081   d.vars_map = &vars_map;
   8082   d.new_label_map = new_label_map;
   8083   d.eh_map = eh_map;
   8084   d.remap_decls_p = true;
   8085 
   8086   if (gimple_in_ssa_p (cfun))
   8087     for (tree arg = DECL_ARGUMENTS (d.to_context); arg; arg = DECL_CHAIN (arg))
   8088       {
   8089 	tree narg = make_ssa_name_fn (dest_cfun, arg, gimple_build_nop ());
   8090 	set_ssa_default_def (dest_cfun, arg, narg);
   8091 	vars_map.put (arg, narg);
   8092       }
   8093 
   8094   FOR_EACH_VEC_ELT (bbs, i, bb)
   8095     {
   8096       /* No need to update edge counts on the last block.  It has
   8097 	 already been updated earlier when we detached the region from
   8098 	 the original CFG.  */
   8099       move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d);
   8100       after = bb;
   8101     }
   8102 
   8103   /* Adjust the maximum clique used.  */
   8104   dest_cfun->last_clique = saved_cfun->last_clique;
   8105 
   8106   loop->aux = NULL;
   8107   loop0->aux = NULL;
   8108   /* Loop sizes are no longer correct, fix them up.  */
   8109   loop->num_nodes -= num_nodes;
   8110   for (class loop *outer = loop_outer (loop);
   8111        outer; outer = loop_outer (outer))
   8112     outer->num_nodes -= num_nodes;
   8113   loop0->num_nodes -= bbs.length () - num_nodes;
   8114 
   8115   if (saved_cfun->has_simduid_loops || saved_cfun->has_force_vectorize_loops)
   8116     {
   8117       class loop *aloop;
   8118       for (i = 0; vec_safe_iterate (loops->larray, i, &aloop); i++)
   8119 	if (aloop != NULL)
   8120 	  {
   8121 	    if (aloop->simduid)
   8122 	      {
   8123 		replace_by_duplicate_decl (&aloop->simduid, d.vars_map,
   8124 					   d.to_context);
   8125 		dest_cfun->has_simduid_loops = true;
   8126 	      }
   8127 	    if (aloop->force_vectorize)
   8128 	      dest_cfun->has_force_vectorize_loops = true;
   8129 	  }
   8130     }
   8131 
   8132   /* Rewire BLOCK_SUBBLOCKS of orig_block.  */
   8133   if (orig_block)
   8134     {
   8135       tree block;
   8136       gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
   8137 		  == NULL_TREE);
   8138       BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
   8139 	= BLOCK_SUBBLOCKS (orig_block);
   8140       for (block = BLOCK_SUBBLOCKS (orig_block);
   8141 	   block; block = BLOCK_CHAIN (block))
   8142 	BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
   8143       BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
   8144     }
   8145 
   8146   replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
   8147 				    &vars_map, dest_cfun->decl);
   8148 
   8149   if (new_label_map)
   8150     htab_delete (new_label_map);
   8151   if (eh_map)
   8152     delete eh_map;
   8153 
   8154   /* We need to release ssa-names in a defined order, so first find them,
   8155      and then iterate in ascending version order.  */
   8156   bitmap release_names = BITMAP_ALLOC (NULL);
   8157   vars_map.traverse<void *, gather_ssa_name_hash_map_from> (release_names);
   8158   bitmap_iterator bi;
   8159   EXECUTE_IF_SET_IN_BITMAP (release_names, 0, i, bi)
   8160     release_ssa_name (ssa_name (i));
   8161   BITMAP_FREE (release_names);
   8162 
   8163   /* Rewire the entry and exit blocks.  The successor to the entry
   8164      block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
   8165      the child function.  Similarly, the predecessor of DEST_FN's
   8166      EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR.  We
   8167      need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
   8168      various CFG manipulation function get to the right CFG.
   8169 
   8170      FIXME, this is silly.  The CFG ought to become a parameter to
   8171      these helpers.  */
   8172   push_cfun (dest_cfun);
   8173   ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = entry_bb->count;
   8174   make_single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), entry_bb, EDGE_FALLTHRU);
   8175   if (exit_bb)
   8176     {
   8177       make_single_succ_edge (exit_bb,  EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
   8178       EXIT_BLOCK_PTR_FOR_FN (cfun)->count = exit_bb->count;
   8179     }
   8180   else
   8181     EXIT_BLOCK_PTR_FOR_FN (cfun)->count = profile_count::zero ();
   8182   pop_cfun ();
   8183 
   8184   /* Back in the original function, the SESE region has disappeared,
   8185      create a new basic block in its place.  */
   8186   bb = create_empty_bb (entry_pred[0]);
   8187   if (current_loops)
   8188     add_bb_to_loop (bb, loop);
   8189   profile_count count = profile_count::zero ();
   8190   for (i = 0; i < num_entry_edges; i++)
   8191     {
   8192       e = make_edge (entry_pred[i], bb, entry_flag[i]);
   8193       e->probability = entry_prob[i];
   8194       count += e->count ();
   8195     }
   8196   bb->count = count;
   8197 
   8198   for (i = 0; i < num_exit_edges; i++)
   8199     {
   8200       e = make_edge (bb, exit_succ[i], exit_flag[i]);
   8201       e->probability = exit_prob[i];
   8202     }
   8203 
   8204   set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
   8205   FOR_EACH_VEC_ELT (dom_bbs, i, abb)
   8206     set_immediate_dominator (CDI_DOMINATORS, abb, bb);
   8207 
   8208   if (exit_bb)
   8209     {
   8210       free (exit_prob);
   8211       free (exit_flag);
   8212       free (exit_succ);
   8213     }
   8214   free (entry_prob);
   8215   free (entry_flag);
   8216   free (entry_pred);
   8217   bbs.release ();
   8218 
   8219   return bb;
   8220 }
   8221 
   8222 /* Dump default def DEF to file FILE using FLAGS and indentation
   8223    SPC.  */
   8224 
   8225 static void
   8226 dump_default_def (FILE *file, tree def, int spc, dump_flags_t flags)
   8227 {
   8228   for (int i = 0; i < spc; ++i)
   8229     fprintf (file, " ");
   8230   dump_ssaname_info_to_file (file, def, spc);
   8231 
   8232   print_generic_expr (file, TREE_TYPE (def), flags);
   8233   fprintf (file, " ");
   8234   print_generic_expr (file, def, flags);
   8235   fprintf (file, " = ");
   8236   print_generic_expr (file, SSA_NAME_VAR (def), flags);
   8237   fprintf (file, ";\n");
   8238 }
   8239 
   8240 /* Print no_sanitize attribute to FILE for a given attribute VALUE.  */
   8241 
   8242 static void
   8243 print_no_sanitize_attr_value (FILE *file, tree value)
   8244 {
   8245   unsigned int flags = tree_to_uhwi (value);
   8246   bool first = true;
   8247   for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
   8248     {
   8249       if ((sanitizer_opts[i].flag & flags) == sanitizer_opts[i].flag)
   8250 	{
   8251 	  if (!first)
   8252 	    fprintf (file, " | ");
   8253 	  fprintf (file, "%s", sanitizer_opts[i].name);
   8254 	  first = false;
   8255 	}
   8256     }
   8257 }
   8258 
   8259 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in dumpfile.h)
   8260    */
   8261 
   8262 void
   8263 dump_function_to_file (tree fndecl, FILE *file, dump_flags_t flags)
   8264 {
   8265   tree arg, var, old_current_fndecl = current_function_decl;
   8266   struct function *dsf;
   8267   bool ignore_topmost_bind = false, any_var = false;
   8268   basic_block bb;
   8269   tree chain;
   8270   bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL
   8271 		  && decl_is_tm_clone (fndecl));
   8272   struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
   8273 
   8274   tree fntype = TREE_TYPE (fndecl);
   8275   tree attrs[] = { DECL_ATTRIBUTES (fndecl), TYPE_ATTRIBUTES (fntype) };
   8276 
   8277   for (int i = 0; i != 2; ++i)
   8278     {
   8279       if (!attrs[i])
   8280 	continue;
   8281 
   8282       fprintf (file, "__attribute__((");
   8283 
   8284       bool first = true;
   8285       tree chain;
   8286       for (chain = attrs[i]; chain; first = false, chain = TREE_CHAIN (chain))
   8287 	{
   8288 	  if (!first)
   8289 	    fprintf (file, ", ");
   8290 
   8291 	  tree name = get_attribute_name (chain);
   8292 	  print_generic_expr (file, name, dump_flags);
   8293 	  if (TREE_VALUE (chain) != NULL_TREE)
   8294 	    {
   8295 	      fprintf (file, " (");
   8296 
   8297 	      if (strstr (IDENTIFIER_POINTER (name), "no_sanitize"))
   8298 		print_no_sanitize_attr_value (file, TREE_VALUE (chain));
   8299 	      else if (!strcmp (IDENTIFIER_POINTER (name),
   8300 				"omp declare variant base"))
   8301 		{
   8302 		  tree a = TREE_VALUE (chain);
   8303 		  print_generic_expr (file, TREE_PURPOSE (a), dump_flags);
   8304 		  fprintf (file, " match ");
   8305 		  print_omp_context_selector (file, TREE_VALUE (a),
   8306 					      dump_flags);
   8307 		}
   8308 	      else
   8309 		print_generic_expr (file, TREE_VALUE (chain), dump_flags);
   8310 	      fprintf (file, ")");
   8311 	    }
   8312 	}
   8313 
   8314       fprintf (file, "))\n");
   8315     }
   8316 
   8317   current_function_decl = fndecl;
   8318   if (flags & TDF_GIMPLE)
   8319     {
   8320       static bool hotness_bb_param_printed = false;
   8321       if (profile_info != NULL
   8322 	  && !hotness_bb_param_printed)
   8323 	{
   8324 	  hotness_bb_param_printed = true;
   8325 	  fprintf (file,
   8326 		   "/* --param=gimple-fe-computed-hot-bb-threshold=%" PRId64
   8327 		   " */\n", get_hot_bb_threshold ());
   8328 	}
   8329 
   8330       print_generic_expr (file, TREE_TYPE (TREE_TYPE (fndecl)),
   8331 			  dump_flags | TDF_SLIM);
   8332       fprintf (file, " __GIMPLE (%s",
   8333 	       (fun->curr_properties & PROP_ssa) ? "ssa"
   8334 	       : (fun->curr_properties & PROP_cfg) ? "cfg"
   8335 	       : "");
   8336 
   8337       if (fun && fun->cfg)
   8338 	{
   8339 	  basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (fun);
   8340 	  if (bb->count.initialized_p ())
   8341 	    fprintf (file, ",%s(%" PRIu64 ")",
   8342 		     profile_quality_as_string (bb->count.quality ()),
   8343 		     bb->count.value ());
   8344 	  if (dump_flags & TDF_UID)
   8345 	    fprintf (file, ")\n%sD_%u (", function_name (fun),
   8346 		     DECL_UID (fndecl));
   8347 	  else
   8348 	    fprintf (file, ")\n%s (", function_name (fun));
   8349 	}
   8350     }
   8351   else
   8352     {
   8353       print_generic_expr (file, TREE_TYPE (fntype), dump_flags);
   8354       if (dump_flags & TDF_UID)
   8355 	fprintf (file, " %sD.%u %s(", function_name (fun), DECL_UID (fndecl),
   8356 		 tmclone ? "[tm-clone] " : "");
   8357       else
   8358 	fprintf (file, " %s %s(", function_name (fun),
   8359 		 tmclone ? "[tm-clone] " : "");
   8360     }
   8361 
   8362   arg = DECL_ARGUMENTS (fndecl);
   8363   while (arg)
   8364     {
   8365       print_generic_expr (file, TREE_TYPE (arg), dump_flags);
   8366       fprintf (file, " ");
   8367       print_generic_expr (file, arg, dump_flags);
   8368       if (DECL_CHAIN (arg))
   8369 	fprintf (file, ", ");
   8370       arg = DECL_CHAIN (arg);
   8371     }
   8372   fprintf (file, ")\n");
   8373 
   8374   dsf = DECL_STRUCT_FUNCTION (fndecl);
   8375   if (dsf && (flags & TDF_EH))
   8376     dump_eh_tree (file, dsf);
   8377 
   8378   if (flags & TDF_RAW && !gimple_has_body_p (fndecl))
   8379     {
   8380       dump_node (fndecl, TDF_SLIM | flags, file);
   8381       current_function_decl = old_current_fndecl;
   8382       return;
   8383     }
   8384 
   8385   /* When GIMPLE is lowered, the variables are no longer available in
   8386      BIND_EXPRs, so display them separately.  */
   8387   if (fun && fun->decl == fndecl && (fun->curr_properties & PROP_gimple_lcf))
   8388     {
   8389       unsigned ix;
   8390       ignore_topmost_bind = true;
   8391 
   8392       fprintf (file, "{\n");
   8393       if (gimple_in_ssa_p (fun)
   8394 	  && (flags & TDF_ALIAS))
   8395 	{
   8396 	  for (arg = DECL_ARGUMENTS (fndecl); arg != NULL;
   8397 	       arg = DECL_CHAIN (arg))
   8398 	    {
   8399 	      tree def = ssa_default_def (fun, arg);
   8400 	      if (def)
   8401 		dump_default_def (file, def, 2, flags);
   8402 	    }
   8403 
   8404 	  tree res = DECL_RESULT (fun->decl);
   8405 	  if (res != NULL_TREE
   8406 	      && DECL_BY_REFERENCE (res))
   8407 	    {
   8408 	      tree def = ssa_default_def (fun, res);
   8409 	      if (def)
   8410 		dump_default_def (file, def, 2, flags);
   8411 	    }
   8412 
   8413 	  tree static_chain = fun->static_chain_decl;
   8414 	  if (static_chain != NULL_TREE)
   8415 	    {
   8416 	      tree def = ssa_default_def (fun, static_chain);
   8417 	      if (def)
   8418 		dump_default_def (file, def, 2, flags);
   8419 	    }
   8420 	}
   8421 
   8422       if (!vec_safe_is_empty (fun->local_decls))
   8423 	FOR_EACH_LOCAL_DECL (fun, ix, var)
   8424 	  {
   8425 	    print_generic_decl (file, var, flags);
   8426 	    fprintf (file, "\n");
   8427 
   8428 	    any_var = true;
   8429 	  }
   8430 
   8431       tree name;
   8432 
   8433       if (gimple_in_ssa_p (fun))
   8434 	FOR_EACH_SSA_NAME (ix, name, fun)
   8435 	  {
   8436 	    if (!SSA_NAME_VAR (name)
   8437 		/* SSA name with decls without a name still get
   8438 		   dumped as _N, list those explicitely as well even
   8439 		   though we've dumped the decl declaration as D.xxx
   8440 		   above.  */
   8441 		|| !SSA_NAME_IDENTIFIER (name))
   8442 	      {
   8443 		fprintf (file, "  ");
   8444 		print_generic_expr (file, TREE_TYPE (name), flags);
   8445 		fprintf (file, " ");
   8446 		print_generic_expr (file, name, flags);
   8447 		fprintf (file, ";\n");
   8448 
   8449 		any_var = true;
   8450 	      }
   8451 	  }
   8452     }
   8453 
   8454   if (fun && fun->decl == fndecl
   8455       && fun->cfg
   8456       && basic_block_info_for_fn (fun))
   8457     {
   8458       /* If the CFG has been built, emit a CFG-based dump.  */
   8459       if (!ignore_topmost_bind)
   8460 	fprintf (file, "{\n");
   8461 
   8462       if (any_var && n_basic_blocks_for_fn (fun))
   8463 	fprintf (file, "\n");
   8464 
   8465       FOR_EACH_BB_FN (bb, fun)
   8466 	dump_bb (file, bb, 2, flags);
   8467 
   8468       fprintf (file, "}\n");
   8469     }
   8470   else if (fun && (fun->curr_properties & PROP_gimple_any))
   8471     {
   8472       /* The function is now in GIMPLE form but the CFG has not been
   8473 	 built yet.  Emit the single sequence of GIMPLE statements
   8474 	 that make up its body.  */
   8475       gimple_seq body = gimple_body (fndecl);
   8476 
   8477       if (gimple_seq_first_stmt (body)
   8478 	  && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
   8479 	  && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
   8480 	print_gimple_seq (file, body, 0, flags);
   8481       else
   8482 	{
   8483 	  if (!ignore_topmost_bind)
   8484 	    fprintf (file, "{\n");
   8485 
   8486 	  if (any_var)
   8487 	    fprintf (file, "\n");
   8488 
   8489 	  print_gimple_seq (file, body, 2, flags);
   8490 	  fprintf (file, "}\n");
   8491 	}
   8492     }
   8493   else
   8494     {
   8495       int indent;
   8496 
   8497       /* Make a tree based dump.  */
   8498       chain = DECL_SAVED_TREE (fndecl);
   8499       if (chain && TREE_CODE (chain) == BIND_EXPR)
   8500 	{
   8501 	  if (ignore_topmost_bind)
   8502 	    {
   8503 	      chain = BIND_EXPR_BODY (chain);
   8504 	      indent = 2;
   8505 	    }
   8506 	  else
   8507 	    indent = 0;
   8508 	}
   8509       else
   8510 	{
   8511 	  if (!ignore_topmost_bind)
   8512 	    {
   8513 	      fprintf (file, "{\n");
   8514 	      /* No topmost bind, pretend it's ignored for later.  */
   8515 	      ignore_topmost_bind = true;
   8516 	    }
   8517 	  indent = 2;
   8518 	}
   8519 
   8520       if (any_var)
   8521 	fprintf (file, "\n");
   8522 
   8523       print_generic_stmt_indented (file, chain, flags, indent);
   8524       if (ignore_topmost_bind)
   8525 	fprintf (file, "}\n");
   8526     }
   8527 
   8528   if (flags & TDF_ENUMERATE_LOCALS)
   8529     dump_enumerated_decls (file, flags);
   8530   fprintf (file, "\n\n");
   8531 
   8532   current_function_decl = old_current_fndecl;
   8533 }
   8534 
   8535 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h)  */
   8536 
   8537 DEBUG_FUNCTION void
   8538 debug_function (tree fn, dump_flags_t flags)
   8539 {
   8540   dump_function_to_file (fn, stderr, flags);
   8541 }
   8542 
   8543 
   8544 /* Print on FILE the indexes for the predecessors of basic_block BB.  */
   8545 
   8546 static void
   8547 print_pred_bbs (FILE *file, basic_block bb)
   8548 {
   8549   edge e;
   8550   edge_iterator ei;
   8551 
   8552   FOR_EACH_EDGE (e, ei, bb->preds)
   8553     fprintf (file, "bb_%d ", e->src->index);
   8554 }
   8555 
   8556 
   8557 /* Print on FILE the indexes for the successors of basic_block BB.  */
   8558 
   8559 static void
   8560 print_succ_bbs (FILE *file, basic_block bb)
   8561 {
   8562   edge e;
   8563   edge_iterator ei;
   8564 
   8565   FOR_EACH_EDGE (e, ei, bb->succs)
   8566     fprintf (file, "bb_%d ", e->dest->index);
   8567 }
   8568 
   8569 /* Print to FILE the basic block BB following the VERBOSITY level.  */
   8570 
   8571 void
   8572 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
   8573 {
   8574   char *s_indent = (char *) alloca ((size_t) indent + 1);
   8575   memset ((void *) s_indent, ' ', (size_t) indent);
   8576   s_indent[indent] = '\0';
   8577 
   8578   /* Print basic_block's header.  */
   8579   if (verbosity >= 2)
   8580     {
   8581       fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
   8582       print_pred_bbs (file, bb);
   8583       fprintf (file, "}, succs = {");
   8584       print_succ_bbs (file, bb);
   8585       fprintf (file, "})\n");
   8586     }
   8587 
   8588   /* Print basic_block's body.  */
   8589   if (verbosity >= 3)
   8590     {
   8591       fprintf (file, "%s  {\n", s_indent);
   8592       dump_bb (file, bb, indent + 4, TDF_VOPS|TDF_MEMSYMS);
   8593       fprintf (file, "%s  }\n", s_indent);
   8594     }
   8595 }
   8596 
   8597 /* Print loop information.  */
   8598 
   8599 void
   8600 print_loop_info (FILE *file, const class loop *loop, const char *prefix)
   8601 {
   8602   if (loop->can_be_parallel)
   8603     fprintf (file, ", can_be_parallel");
   8604   if (loop->warned_aggressive_loop_optimizations)
   8605     fprintf (file, ", warned_aggressive_loop_optimizations");
   8606   if (loop->dont_vectorize)
   8607     fprintf (file, ", dont_vectorize");
   8608   if (loop->force_vectorize)
   8609     fprintf (file, ", force_vectorize");
   8610   if (loop->in_oacc_kernels_region)
   8611     fprintf (file, ", in_oacc_kernels_region");
   8612   if (loop->finite_p)
   8613     fprintf (file, ", finite_p");
   8614   if (loop->unroll)
   8615     fprintf (file, "\n%sunroll %d", prefix, loop->unroll);
   8616   if (loop->nb_iterations)
   8617     {
   8618       fprintf (file, "\n%sniter ", prefix);
   8619       print_generic_expr (file, loop->nb_iterations);
   8620     }
   8621 
   8622   if (loop->any_upper_bound)
   8623     {
   8624       fprintf (file, "\n%supper_bound ", prefix);
   8625       print_decu (loop->nb_iterations_upper_bound, file);
   8626     }
   8627   if (loop->any_likely_upper_bound)
   8628     {
   8629       fprintf (file, "\n%slikely_upper_bound ", prefix);
   8630       print_decu (loop->nb_iterations_likely_upper_bound, file);
   8631     }
   8632 
   8633   if (loop->any_estimate)
   8634     {
   8635       fprintf (file, "\n%sestimate ", prefix);
   8636       print_decu (loop->nb_iterations_estimate, file);
   8637     }
   8638   bool reliable;
   8639   sreal iterations;
   8640   if (loop->num && expected_loop_iterations_by_profile (loop, &iterations, &reliable))
   8641     {
   8642       fprintf (file, "\n%siterations by profile: %f (%s%s) entry count:", prefix,
   8643 	       iterations.to_double (), reliable ? "reliable" : "unreliable",
   8644 	       maybe_flat_loop_profile (loop) ? ", maybe flat" : "");
   8645       loop_count_in (loop).dump (file, cfun);
   8646     }
   8647 
   8648 }
   8649 
   8650 static void print_loop_and_siblings (FILE *, class loop *, int, int);
   8651 
   8652 /* Pretty print LOOP on FILE, indented INDENT spaces.  Following
   8653    VERBOSITY level this outputs the contents of the loop, or just its
   8654    structure.  */
   8655 
   8656 static void
   8657 print_loop (FILE *file, class loop *loop, int indent, int verbosity)
   8658 {
   8659   char *s_indent;
   8660   basic_block bb;
   8661 
   8662   if (loop == NULL)
   8663     return;
   8664 
   8665   s_indent = (char *) alloca ((size_t) indent + 1);
   8666   memset ((void *) s_indent, ' ', (size_t) indent);
   8667   s_indent[indent] = '\0';
   8668 
   8669   /* Print loop's header.  */
   8670   fprintf (file, "%sloop_%d (", s_indent, loop->num);
   8671   if (loop->header)
   8672     fprintf (file, "header = %d", loop->header->index);
   8673   else
   8674     {
   8675       fprintf (file, "deleted)\n");
   8676       return;
   8677     }
   8678   if (loop->latch)
   8679     fprintf (file, ", latch = %d", loop->latch->index);
   8680   else
   8681     fprintf (file, ", multiple latches");
   8682   print_loop_info (file, loop, s_indent);
   8683   fprintf (file, ")\n");
   8684 
   8685   /* Print loop's body.  */
   8686   if (verbosity >= 1)
   8687     {
   8688       fprintf (file, "%s{\n", s_indent);
   8689       FOR_EACH_BB_FN (bb, cfun)
   8690 	if (bb->loop_father == loop)
   8691 	  print_loops_bb (file, bb, indent, verbosity);
   8692 
   8693       print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
   8694       fprintf (file, "%s}\n", s_indent);
   8695     }
   8696 }
   8697 
   8698 /* Print the LOOP and its sibling loops on FILE, indented INDENT
   8699    spaces.  Following VERBOSITY level this outputs the contents of the
   8700    loop, or just its structure.  */
   8701 
   8702 static void
   8703 print_loop_and_siblings (FILE *file, class loop *loop, int indent,
   8704 			 int verbosity)
   8705 {
   8706   if (loop == NULL)
   8707     return;
   8708 
   8709   print_loop (file, loop, indent, verbosity);
   8710   print_loop_and_siblings (file, loop->next, indent, verbosity);
   8711 }
   8712 
   8713 /* Follow a CFG edge from the entry point of the program, and on entry
   8714    of a loop, pretty print the loop structure on FILE.  */
   8715 
   8716 void
   8717 print_loops (FILE *file, int verbosity)
   8718 {
   8719   basic_block bb;
   8720 
   8721   bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
   8722   fprintf (file, "\nLoops in function: %s\n", current_function_name ());
   8723   if (bb && bb->loop_father)
   8724     print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
   8725 }
   8726 
   8727 /* Dump a loop.  */
   8728 
   8729 DEBUG_FUNCTION void
   8730 debug (class loop &ref)
   8731 {
   8732   print_loop (stderr, &ref, 0, /*verbosity*/0);
   8733 }
   8734 
   8735 DEBUG_FUNCTION void
   8736 debug (class loop *ptr)
   8737 {
   8738   if (ptr)
   8739     debug (*ptr);
   8740   else
   8741     fprintf (stderr, "<nil>\n");
   8742 }
   8743 
   8744 /* Dump a loop verbosely.  */
   8745 
   8746 DEBUG_FUNCTION void
   8747 debug_verbose (class loop &ref)
   8748 {
   8749   print_loop (stderr, &ref, 0, /*verbosity*/3);
   8750 }
   8751 
   8752 DEBUG_FUNCTION void
   8753 debug_verbose (class loop *ptr)
   8754 {
   8755   if (ptr)
   8756     debug (*ptr);
   8757   else
   8758     fprintf (stderr, "<nil>\n");
   8759 }
   8760 
   8761 
   8762 /* Debugging loops structure at tree level, at some VERBOSITY level.  */
   8763 
   8764 DEBUG_FUNCTION void
   8765 debug_loops (int verbosity)
   8766 {
   8767   print_loops (stderr, verbosity);
   8768 }
   8769 
   8770 /* Print on stderr the code of LOOP, at some VERBOSITY level.  */
   8771 
   8772 DEBUG_FUNCTION void
   8773 debug_loop (class loop *loop, int verbosity)
   8774 {
   8775   print_loop (stderr, loop, 0, verbosity);
   8776 }
   8777 
   8778 /* Print on stderr the code of loop number NUM, at some VERBOSITY
   8779    level.  */
   8780 
   8781 DEBUG_FUNCTION void
   8782 debug_loop_num (unsigned num, int verbosity)
   8783 {
   8784   debug_loop (get_loop (cfun, num), verbosity);
   8785 }
   8786 
   8787 /* Return true if BB ends with a call, possibly followed by some
   8788    instructions that must stay with the call.  Return false,
   8789    otherwise.  */
   8790 
   8791 static bool
   8792 gimple_block_ends_with_call_p (basic_block bb)
   8793 {
   8794   gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
   8795   return !gsi_end_p (gsi) && is_gimple_call (gsi_stmt (gsi));
   8796 }
   8797 
   8798 
   8799 /* Return true if BB ends with a conditional branch.  Return false,
   8800    otherwise.  */
   8801 
   8802 static bool
   8803 gimple_block_ends_with_condjump_p (const_basic_block bb)
   8804 {
   8805   return safe_is_a <gcond *> (*gsi_last_bb (const_cast <basic_block> (bb)));
   8806 }
   8807 
   8808 
   8809 /* Return true if statement T may terminate execution of BB in ways not
   8810    explicitly represtented in the CFG.  */
   8811 
   8812 bool
   8813 stmt_can_terminate_bb_p (gimple *t)
   8814 {
   8815   tree fndecl = NULL_TREE;
   8816   int call_flags = 0;
   8817 
   8818   /* Eh exception not handled internally terminates execution of the whole
   8819      function.  */
   8820   if (stmt_can_throw_external (cfun, t))
   8821     return true;
   8822 
   8823   /* NORETURN and LONGJMP calls already have an edge to exit.
   8824      CONST and PURE calls do not need one.
   8825      We don't currently check for CONST and PURE here, although
   8826      it would be a good idea, because those attributes are
   8827      figured out from the RTL in mark_constant_function, and
   8828      the counter incrementation code from -fprofile-arcs
   8829      leads to different results from -fbranch-probabilities.  */
   8830   if (is_gimple_call (t))
   8831     {
   8832       fndecl = gimple_call_fndecl (t);
   8833       call_flags = gimple_call_flags (t);
   8834     }
   8835 
   8836   if (is_gimple_call (t)
   8837       && fndecl
   8838       && fndecl_built_in_p (fndecl)
   8839       && (call_flags & ECF_NOTHROW)
   8840       && !(call_flags & ECF_RETURNS_TWICE)
   8841       /* fork() doesn't really return twice, but the effect of
   8842 	 wrapping it in __gcov_fork() which calls __gcov_dump() and
   8843 	 __gcov_reset() and clears the counters before forking has the same
   8844 	 effect as returning twice.  Force a fake edge.  */
   8845       && !fndecl_built_in_p (fndecl, BUILT_IN_FORK))
   8846     return false;
   8847 
   8848   if (is_gimple_call (t))
   8849     {
   8850       edge_iterator ei;
   8851       edge e;
   8852       basic_block bb;
   8853 
   8854       if (call_flags & (ECF_PURE | ECF_CONST)
   8855 	  && !(call_flags & ECF_LOOPING_CONST_OR_PURE))
   8856 	return false;
   8857 
   8858       /* Function call may do longjmp, terminate program or do other things.
   8859 	 Special case noreturn that have non-abnormal edges out as in this case
   8860 	 the fact is sufficiently represented by lack of edges out of T.  */
   8861       if (!(call_flags & ECF_NORETURN))
   8862 	return true;
   8863 
   8864       bb = gimple_bb (t);
   8865       FOR_EACH_EDGE (e, ei, bb->succs)
   8866 	if ((e->flags & EDGE_FAKE) == 0)
   8867 	  return true;
   8868     }
   8869 
   8870   if (gasm *asm_stmt = dyn_cast <gasm *> (t))
   8871     if (gimple_asm_volatile_p (asm_stmt) || gimple_asm_input_p (asm_stmt))
   8872       return true;
   8873 
   8874   return false;
   8875 }
   8876 
   8877 
   8878 /* Add fake edges to the function exit for any non constant and non
   8879    noreturn calls (or noreturn calls with EH/abnormal edges),
   8880    volatile inline assembly in the bitmap of blocks specified by BLOCKS
   8881    or to the whole CFG if BLOCKS is zero.  Return the number of blocks
   8882    that were split.
   8883 
   8884    The goal is to expose cases in which entering a basic block does
   8885    not imply that all subsequent instructions must be executed.  */
   8886 
   8887 static int
   8888 gimple_flow_call_edges_add (sbitmap blocks)
   8889 {
   8890   int i;
   8891   int blocks_split = 0;
   8892   int last_bb = last_basic_block_for_fn (cfun);
   8893   bool check_last_block = false;
   8894 
   8895   if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
   8896     return 0;
   8897 
   8898   if (! blocks)
   8899     check_last_block = true;
   8900   else
   8901     check_last_block = bitmap_bit_p (blocks,
   8902 				     EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb->index);
   8903 
   8904   /* In the last basic block, before epilogue generation, there will be
   8905      a fallthru edge to EXIT.  Special care is required if the last insn
   8906      of the last basic block is a call because make_edge folds duplicate
   8907      edges, which would result in the fallthru edge also being marked
   8908      fake, which would result in the fallthru edge being removed by
   8909      remove_fake_edges, which would result in an invalid CFG.
   8910 
   8911      Moreover, we can't elide the outgoing fake edge, since the block
   8912      profiler needs to take this into account in order to solve the minimal
   8913      spanning tree in the case that the call doesn't return.
   8914 
   8915      Handle this by adding a dummy instruction in a new last basic block.  */
   8916   if (check_last_block)
   8917     {
   8918       basic_block bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
   8919       gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
   8920       gimple *t = NULL;
   8921 
   8922       if (!gsi_end_p (gsi))
   8923 	t = gsi_stmt (gsi);
   8924 
   8925       if (t && stmt_can_terminate_bb_p (t))
   8926 	{
   8927 	  edge e;
   8928 
   8929 	  e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
   8930 	  if (e)
   8931 	    {
   8932 	      gsi_insert_on_edge (e, gimple_build_nop ());
   8933 	      gsi_commit_edge_inserts ();
   8934 	    }
   8935 	}
   8936     }
   8937 
   8938   /* Now add fake edges to the function exit for any non constant
   8939      calls since there is no way that we can determine if they will
   8940      return or not...  */
   8941   for (i = 0; i < last_bb; i++)
   8942     {
   8943       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
   8944       gimple_stmt_iterator gsi;
   8945       gimple *stmt, *last_stmt;
   8946 
   8947       if (!bb)
   8948 	continue;
   8949 
   8950       if (blocks && !bitmap_bit_p (blocks, i))
   8951 	continue;
   8952 
   8953       gsi = gsi_last_nondebug_bb (bb);
   8954       if (!gsi_end_p (gsi))
   8955 	{
   8956 	  last_stmt = gsi_stmt (gsi);
   8957 	  do
   8958 	    {
   8959 	      stmt = gsi_stmt (gsi);
   8960 	      if (stmt_can_terminate_bb_p (stmt))
   8961 		{
   8962 		  edge e;
   8963 
   8964 		  /* The handling above of the final block before the
   8965 		     epilogue should be enough to verify that there is
   8966 		     no edge to the exit block in CFG already.
   8967 		     Calling make_edge in such case would cause us to
   8968 		     mark that edge as fake and remove it later.  */
   8969 		  if (flag_checking && stmt == last_stmt)
   8970 		    {
   8971 		      e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
   8972 		      gcc_assert (e == NULL);
   8973 		    }
   8974 
   8975 		  /* Note that the following may create a new basic block
   8976 		     and renumber the existing basic blocks.  */
   8977 		  if (stmt != last_stmt)
   8978 		    {
   8979 		      e = split_block (bb, stmt);
   8980 		      if (e)
   8981 			blocks_split++;
   8982 		    }
   8983 		  e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE);
   8984 		  e->probability = profile_probability::guessed_never ();
   8985 		}
   8986 	      gsi_prev (&gsi);
   8987 	    }
   8988 	  while (!gsi_end_p (gsi));
   8989 	}
   8990     }
   8991 
   8992   if (blocks_split)
   8993     checking_verify_flow_info ();
   8994 
   8995   return blocks_split;
   8996 }
   8997 
   8998 /* Removes edge E and all the blocks dominated by it, and updates dominance
   8999    information.  The IL in E->src needs to be updated separately.
   9000    If dominance info is not available, only the edge E is removed.*/
   9001 
   9002 void
   9003 remove_edge_and_dominated_blocks (edge e)
   9004 {
   9005   vec<basic_block> bbs_to_fix_dom = vNULL;
   9006   edge f;
   9007   edge_iterator ei;
   9008   bool none_removed = false;
   9009   unsigned i;
   9010   basic_block bb, dbb;
   9011   bitmap_iterator bi;
   9012 
   9013   /* If we are removing a path inside a non-root loop that may change
   9014      loop ownership of blocks or remove loops.  Mark loops for fixup.  */
   9015   class loop *src_loop = e->src->loop_father;
   9016   if (current_loops
   9017       && loop_outer (src_loop) != NULL
   9018       && src_loop == e->dest->loop_father)
   9019     {
   9020       loops_state_set (LOOPS_NEED_FIXUP);
   9021       /* If we are removing a backedge clear the number of iterations
   9022 	 and estimates.  */
   9023       class loop *dest_loop = e->dest->loop_father;
   9024       if (e->dest == src_loop->header
   9025 	  || (e->dest == dest_loop->header
   9026 	      && flow_loop_nested_p (dest_loop, src_loop)))
   9027 	{
   9028 	  free_numbers_of_iterations_estimates (dest_loop);
   9029 	  /* If we removed the last backedge mark the loop for removal.  */
   9030 	  FOR_EACH_EDGE (f, ei, dest_loop->header->preds)
   9031 	    if (f != e
   9032 		&& (f->src->loop_father == dest_loop
   9033 		    || flow_loop_nested_p (dest_loop, f->src->loop_father)))
   9034 	      break;
   9035 	  if (!f)
   9036 	    mark_loop_for_removal (dest_loop);
   9037 	}
   9038     }
   9039 
   9040   if (!dom_info_available_p (CDI_DOMINATORS))
   9041     {
   9042       remove_edge (e);
   9043       return;
   9044     }
   9045 
   9046   /* No updating is needed for edges to exit.  */
   9047   if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
   9048     {
   9049       if (cfgcleanup_altered_bbs)
   9050 	bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
   9051       remove_edge (e);
   9052       return;
   9053     }
   9054 
   9055   /* First, we find the basic blocks to remove.  If E->dest has a predecessor
   9056      that is not dominated by E->dest, then this set is empty.  Otherwise,
   9057      all the basic blocks dominated by E->dest are removed.
   9058 
   9059      Also, to DF_IDOM we store the immediate dominators of the blocks in
   9060      the dominance frontier of E (i.e., of the successors of the
   9061      removed blocks, if there are any, and of E->dest otherwise).  */
   9062   FOR_EACH_EDGE (f, ei, e->dest->preds)
   9063     {
   9064       if (f == e)
   9065 	continue;
   9066 
   9067       if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
   9068 	{
   9069 	  none_removed = true;
   9070 	  break;
   9071 	}
   9072     }
   9073 
   9074   auto_bitmap df, df_idom;
   9075   auto_vec<basic_block> bbs_to_remove;
   9076   if (none_removed)
   9077     bitmap_set_bit (df_idom,
   9078 		    get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
   9079   else
   9080     {
   9081       bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
   9082       FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
   9083 	{
   9084 	  FOR_EACH_EDGE (f, ei, bb->succs)
   9085 	    {
   9086 	      if (f->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
   9087 		bitmap_set_bit (df, f->dest->index);
   9088 	    }
   9089 	}
   9090       FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
   9091 	bitmap_clear_bit (df, bb->index);
   9092 
   9093       EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
   9094 	{
   9095 	  bb = BASIC_BLOCK_FOR_FN (cfun, i);
   9096 	  bitmap_set_bit (df_idom,
   9097 			  get_immediate_dominator (CDI_DOMINATORS, bb)->index);
   9098 	}
   9099     }
   9100 
   9101   if (cfgcleanup_altered_bbs)
   9102     {
   9103       /* Record the set of the altered basic blocks.  */
   9104       bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
   9105       bitmap_ior_into (cfgcleanup_altered_bbs, df);
   9106     }
   9107 
   9108   /* Remove E and the cancelled blocks.  */
   9109   if (none_removed)
   9110     remove_edge (e);
   9111   else
   9112     {
   9113       /* Walk backwards so as to get a chance to substitute all
   9114 	 released DEFs into debug stmts.  See
   9115 	 eliminate_unnecessary_stmts() in tree-ssa-dce.cc for more
   9116 	 details.  */
   9117       for (i = bbs_to_remove.length (); i-- > 0; )
   9118 	delete_basic_block (bbs_to_remove[i]);
   9119     }
   9120 
   9121   /* Update the dominance information.  The immediate dominator may change only
   9122      for blocks whose immediate dominator belongs to DF_IDOM:
   9123 
   9124      Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
   9125      removal.  Let Z the arbitrary block such that idom(Z) = Y and
   9126      Z dominates X after the removal.  Before removal, there exists a path P
   9127      from Y to X that avoids Z.  Let F be the last edge on P that is
   9128      removed, and let W = F->dest.  Before removal, idom(W) = Y (since Y
   9129      dominates W, and because of P, Z does not dominate W), and W belongs to
   9130      the dominance frontier of E.  Therefore, Y belongs to DF_IDOM.  */
   9131   EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
   9132     {
   9133       bb = BASIC_BLOCK_FOR_FN (cfun, i);
   9134       for (dbb = first_dom_son (CDI_DOMINATORS, bb);
   9135 	   dbb;
   9136 	   dbb = next_dom_son (CDI_DOMINATORS, dbb))
   9137 	bbs_to_fix_dom.safe_push (dbb);
   9138     }
   9139 
   9140   iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
   9141 
   9142   bbs_to_fix_dom.release ();
   9143 }
   9144 
   9145 /* Purge dead EH edges from basic block BB.  */
   9146 
   9147 bool
   9148 gimple_purge_dead_eh_edges (basic_block bb)
   9149 {
   9150   bool changed = false;
   9151   edge e;
   9152   edge_iterator ei;
   9153   gimple *stmt = *gsi_last_bb (bb);
   9154 
   9155   if (stmt && stmt_can_throw_internal (cfun, stmt))
   9156     return false;
   9157 
   9158   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
   9159     {
   9160       if (e->flags & EDGE_EH)
   9161 	{
   9162 	  remove_edge_and_dominated_blocks (e);
   9163 	  changed = true;
   9164 	}
   9165       else
   9166 	ei_next (&ei);
   9167     }
   9168 
   9169   return changed;
   9170 }
   9171 
   9172 /* Purge dead EH edges from basic block listed in BLOCKS.  */
   9173 
   9174 bool
   9175 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
   9176 {
   9177   bool changed = false;
   9178   unsigned i;
   9179   bitmap_iterator bi;
   9180 
   9181   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
   9182     {
   9183       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
   9184 
   9185       /* Earlier gimple_purge_dead_eh_edges could have removed
   9186 	 this basic block already.  */
   9187       gcc_assert (bb || changed);
   9188       if (bb != NULL)
   9189 	changed |= gimple_purge_dead_eh_edges (bb);
   9190     }
   9191 
   9192   return changed;
   9193 }
   9194 
   9195 /* Purge dead abnormal call edges from basic block BB.  */
   9196 
   9197 bool
   9198 gimple_purge_dead_abnormal_call_edges (basic_block bb)
   9199 {
   9200   bool changed = false;
   9201   edge e;
   9202   edge_iterator ei;
   9203   gimple *stmt = *gsi_last_bb (bb);
   9204 
   9205   if (stmt && stmt_can_make_abnormal_goto (stmt))
   9206     return false;
   9207 
   9208   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
   9209     {
   9210       if (e->flags & EDGE_ABNORMAL)
   9211 	{
   9212 	  if (e->flags & EDGE_FALLTHRU)
   9213 	    e->flags &= ~EDGE_ABNORMAL;
   9214 	  else
   9215 	    remove_edge_and_dominated_blocks (e);
   9216 	  changed = true;
   9217 	}
   9218       else
   9219 	ei_next (&ei);
   9220     }
   9221 
   9222   return changed;
   9223 }
   9224 
   9225 /* Purge dead abnormal call edges from basic block listed in BLOCKS.  */
   9226 
   9227 bool
   9228 gimple_purge_all_dead_abnormal_call_edges (const_bitmap blocks)
   9229 {
   9230   bool changed = false;
   9231   unsigned i;
   9232   bitmap_iterator bi;
   9233 
   9234   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
   9235     {
   9236       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
   9237 
   9238       /* Earlier gimple_purge_dead_abnormal_call_edges could have removed
   9239 	 this basic block already.  */
   9240       gcc_assert (bb || changed);
   9241       if (bb != NULL)
   9242 	changed |= gimple_purge_dead_abnormal_call_edges (bb);
   9243     }
   9244 
   9245   return changed;
   9246 }
   9247 
   9248 /* This function is called whenever a new edge is created or
   9249    redirected.  */
   9250 
   9251 static void
   9252 gimple_execute_on_growing_pred (edge e)
   9253 {
   9254   basic_block bb = e->dest;
   9255 
   9256   if (!gimple_seq_empty_p (phi_nodes (bb)))
   9257     reserve_phi_args_for_new_edge (bb);
   9258 }
   9259 
   9260 /* This function is called immediately before edge E is removed from
   9261    the edge vector E->dest->preds.  */
   9262 
   9263 static void
   9264 gimple_execute_on_shrinking_pred (edge e)
   9265 {
   9266   if (!gimple_seq_empty_p (phi_nodes (e->dest)))
   9267     remove_phi_args (e);
   9268 }
   9269 
   9270 /*---------------------------------------------------------------------------
   9271   Helper functions for Loop versioning
   9272   ---------------------------------------------------------------------------*/
   9273 
   9274 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
   9275    of 'first'. Both of them are dominated by 'new_head' basic block. When
   9276    'new_head' was created by 'second's incoming edge it received phi arguments
   9277    on the edge by split_edge(). Later, additional edge 'e' was created to
   9278    connect 'new_head' and 'first'. Now this routine adds phi args on this
   9279    additional edge 'e' that new_head to second edge received as part of edge
   9280    splitting.  */
   9281 
   9282 static void
   9283 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
   9284 				  basic_block new_head, edge e)
   9285 {
   9286   gphi *phi1, *phi2;
   9287   gphi_iterator psi1, psi2;
   9288   tree def;
   9289   edge e2 = find_edge (new_head, second);
   9290 
   9291   /* Because NEW_HEAD has been created by splitting SECOND's incoming
   9292      edge, we should always have an edge from NEW_HEAD to SECOND.  */
   9293   gcc_assert (e2 != NULL);
   9294 
   9295   /* Browse all 'second' basic block phi nodes and add phi args to
   9296      edge 'e' for 'first' head. PHI args are always in correct order.  */
   9297 
   9298   for (psi2 = gsi_start_phis (second),
   9299        psi1 = gsi_start_phis (first);
   9300        !gsi_end_p (psi2) && !gsi_end_p (psi1);
   9301        gsi_next (&psi2),  gsi_next (&psi1))
   9302     {
   9303       phi1 = psi1.phi ();
   9304       phi2 = psi2.phi ();
   9305       def = PHI_ARG_DEF (phi2, e2->dest_idx);
   9306       add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
   9307     }
   9308 }
   9309 
   9310 
   9311 /* Adds a if else statement to COND_BB with condition COND_EXPR.
   9312    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
   9313    the destination of the ELSE part.  */
   9314 
   9315 static void
   9316 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
   9317 			       basic_block second_head ATTRIBUTE_UNUSED,
   9318 			       basic_block cond_bb, void *cond_e)
   9319 {
   9320   gimple_stmt_iterator gsi;
   9321   gimple *new_cond_expr;
   9322   tree cond_expr = (tree) cond_e;
   9323   edge e0;
   9324 
   9325   /* Build new conditional expr */
   9326   gsi = gsi_last_bb (cond_bb);
   9327 
   9328   cond_expr = force_gimple_operand_gsi_1 (&gsi, cond_expr,
   9329 					  is_gimple_condexpr_for_cond,
   9330 					  NULL_TREE, false,
   9331 					  GSI_CONTINUE_LINKING);
   9332   new_cond_expr = gimple_build_cond_from_tree (cond_expr,
   9333 					       NULL_TREE, NULL_TREE);
   9334 
   9335   /* Add new cond in cond_bb.  */
   9336   gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
   9337 
   9338   /* Adjust edges appropriately to connect new head with first head
   9339      as well as second head.  */
   9340   e0 = single_succ_edge (cond_bb);
   9341   e0->flags &= ~EDGE_FALLTHRU;
   9342   e0->flags |= EDGE_FALSE_VALUE;
   9343 }
   9344 
   9345 
   9346 /* Do book-keeping of basic block BB for the profile consistency checker.
   9347    Store the counting in RECORD.  */
   9348 static void
   9349 gimple_account_profile_record (basic_block bb,
   9350 			       struct profile_record *record)
   9351 {
   9352   gimple_stmt_iterator i;
   9353   for (i = gsi_start_nondebug_after_labels_bb (bb); !gsi_end_p (i);
   9354        gsi_next_nondebug (&i))
   9355     {
   9356       record->size
   9357 	+= estimate_num_insns (gsi_stmt (i), &eni_size_weights);
   9358       if (profile_info)
   9359 	{
   9360 	  if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().initialized_p ()
   9361 	      && ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().nonzero_p ()
   9362 	      && bb->count.ipa ().initialized_p ())
   9363 	    record->time
   9364 	      += estimate_num_insns (gsi_stmt (i),
   9365 				     &eni_time_weights)
   9366 				     * bb->count.ipa ().to_gcov_type ();
   9367 	}
   9368       else if (bb->count.initialized_p ()
   9369 	       && ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ())
   9370 	record->time
   9371 	  += estimate_num_insns
   9372 		(gsi_stmt (i),
   9373 		 &eni_time_weights)
   9374 		 * bb->count.to_sreal_scale
   9375 			(ENTRY_BLOCK_PTR_FOR_FN (cfun)->count).to_double ();
   9376      else
   9377       record->time
   9378 	+= estimate_num_insns (gsi_stmt (i), &eni_time_weights);
   9379     }
   9380 }
   9381 
   9382 struct cfg_hooks gimple_cfg_hooks = {
   9383   "gimple",
   9384   gimple_verify_flow_info,
   9385   gimple_dump_bb,		/* dump_bb  */
   9386   gimple_dump_bb_for_graph,	/* dump_bb_for_graph  */
   9387   create_bb,			/* create_basic_block  */
   9388   gimple_redirect_edge_and_branch, /* redirect_edge_and_branch  */
   9389   gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force  */
   9390   gimple_can_remove_branch_p,	/* can_remove_branch_p  */
   9391   remove_bb,			/* delete_basic_block  */
   9392   gimple_split_block,		/* split_block  */
   9393   gimple_move_block_after,	/* move_block_after  */
   9394   gimple_can_merge_blocks_p,	/* can_merge_blocks_p  */
   9395   gimple_merge_blocks,		/* merge_blocks  */
   9396   gimple_predict_edge,		/* predict_edge  */
   9397   gimple_predicted_by_p,	/* predicted_by_p  */
   9398   gimple_can_duplicate_bb_p,	/* can_duplicate_block_p  */
   9399   gimple_duplicate_bb,		/* duplicate_block  */
   9400   gimple_split_edge,		/* split_edge  */
   9401   gimple_make_forwarder_block,	/* make_forward_block  */
   9402   NULL,				/* tidy_fallthru_edge  */
   9403   NULL,				/* force_nonfallthru */
   9404   gimple_block_ends_with_call_p,/* block_ends_with_call_p */
   9405   gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
   9406   gimple_flow_call_edges_add,   /* flow_call_edges_add */
   9407   gimple_execute_on_growing_pred,	/* execute_on_growing_pred */
   9408   gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
   9409   gimple_duplicate_loop_body_to_header_edge, /* duplicate loop for trees */
   9410   gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
   9411   gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
   9412   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
   9413   flush_pending_stmts, 		/* flush_pending_stmts */
   9414   gimple_empty_block_p,           /* block_empty_p */
   9415   gimple_split_block_before_cond_jump, /* split_block_before_cond_jump */
   9416   gimple_account_profile_record,
   9417 };
   9418 
   9419 
   9420 /* Split all critical edges.  Split some extra (not necessarily critical) edges
   9421    if FOR_EDGE_INSERTION_P is true.  */
   9422 
   9423 unsigned int
   9424 split_critical_edges (bool for_edge_insertion_p /* = false */)
   9425 {
   9426   basic_block bb;
   9427   edge e;
   9428   edge_iterator ei;
   9429 
   9430   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
   9431      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
   9432      mappings around the calls to split_edge.  */
   9433   start_recording_case_labels ();
   9434   FOR_ALL_BB_FN (bb, cfun)
   9435     {
   9436       FOR_EACH_EDGE (e, ei, bb->succs)
   9437         {
   9438 	  if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
   9439 	    split_edge (e);
   9440 	  /* PRE inserts statements to edges and expects that
   9441 	     since split_critical_edges was done beforehand, committing edge
   9442 	     insertions will not split more edges.  In addition to critical
   9443 	     edges we must split edges that have multiple successors and
   9444 	     end by control flow statements, such as RESX.
   9445 	     Go ahead and split them too.  This matches the logic in
   9446 	     gimple_find_edge_insert_loc.  */
   9447 	  else if (for_edge_insertion_p
   9448 		   && (!single_pred_p (e->dest)
   9449 		       || !gimple_seq_empty_p (phi_nodes (e->dest))
   9450 		       || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
   9451 		   && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
   9452 		   && !(e->flags & EDGE_ABNORMAL))
   9453 	    {
   9454 	      gimple_stmt_iterator gsi;
   9455 
   9456 	      gsi = gsi_last_bb (e->src);
   9457 	      if (!gsi_end_p (gsi)
   9458 		  && stmt_ends_bb_p (gsi_stmt (gsi))
   9459 		  && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN
   9460 		      && !gimple_call_builtin_p (gsi_stmt (gsi),
   9461 						 BUILT_IN_RETURN)))
   9462 		split_edge (e);
   9463 	    }
   9464 	}
   9465     }
   9466   end_recording_case_labels ();
   9467   return 0;
   9468 }
   9469 
   9470 namespace {
   9471 
   9472 const pass_data pass_data_split_crit_edges =
   9473 {
   9474   GIMPLE_PASS, /* type */
   9475   "crited", /* name */
   9476   OPTGROUP_NONE, /* optinfo_flags */
   9477   TV_TREE_SPLIT_EDGES, /* tv_id */
   9478   PROP_cfg, /* properties_required */
   9479   PROP_no_crit_edges, /* properties_provided */
   9480   0, /* properties_destroyed */
   9481   0, /* todo_flags_start */
   9482   0, /* todo_flags_finish */
   9483 };
   9484 
   9485 class pass_split_crit_edges : public gimple_opt_pass
   9486 {
   9487 public:
   9488   pass_split_crit_edges (gcc::context *ctxt)
   9489     : gimple_opt_pass (pass_data_split_crit_edges, ctxt)
   9490   {}
   9491 
   9492   /* opt_pass methods: */
   9493   unsigned int execute (function *)  final override
   9494   {
   9495     return split_critical_edges ();
   9496   }
   9497 
   9498   opt_pass * clone () final override
   9499   {
   9500     return new pass_split_crit_edges (m_ctxt);
   9501   }
   9502 }; // class pass_split_crit_edges
   9503 
   9504 } // anon namespace
   9505 
   9506 gimple_opt_pass *
   9507 make_pass_split_crit_edges (gcc::context *ctxt)
   9508 {
   9509   return new pass_split_crit_edges (ctxt);
   9510 }
   9511 
   9512 
   9513 /* Insert COND expression which is GIMPLE_COND after STMT
   9514    in basic block BB with appropriate basic block split
   9515    and creation of a new conditionally executed basic block.
   9516    Update profile so the new bb is visited with probability PROB.
   9517    Return created basic block.  */
   9518 basic_block
   9519 insert_cond_bb (basic_block bb, gimple *stmt, gimple *cond,
   9520 	        profile_probability prob)
   9521 {
   9522   edge fall = split_block (bb, stmt);
   9523   gimple_stmt_iterator iter = gsi_last_bb (bb);
   9524   basic_block new_bb;
   9525 
   9526   /* Insert cond statement.  */
   9527   gcc_assert (gimple_code (cond) == GIMPLE_COND);
   9528   if (gsi_end_p (iter))
   9529     gsi_insert_before (&iter, cond, GSI_CONTINUE_LINKING);
   9530   else
   9531     gsi_insert_after (&iter, cond, GSI_CONTINUE_LINKING);
   9532 
   9533   /* Create conditionally executed block.  */
   9534   new_bb = create_empty_bb (bb);
   9535   edge e = make_edge (bb, new_bb, EDGE_TRUE_VALUE);
   9536   e->probability = prob;
   9537   new_bb->count = e->count ();
   9538   make_single_succ_edge (new_bb, fall->dest, EDGE_FALLTHRU);
   9539 
   9540   /* Fix edge for split bb.  */
   9541   fall->flags = EDGE_FALSE_VALUE;
   9542   fall->probability -= e->probability;
   9543 
   9544   /* Update dominance info.  */
   9545   if (dom_info_available_p (CDI_DOMINATORS))
   9546     {
   9547       set_immediate_dominator (CDI_DOMINATORS, new_bb, bb);
   9548       set_immediate_dominator (CDI_DOMINATORS, fall->dest, bb);
   9549     }
   9550 
   9551   /* Update loop info.  */
   9552   if (current_loops)
   9553     add_bb_to_loop (new_bb, bb->loop_father);
   9554 
   9555   return new_bb;
   9556 }
   9557 
   9558 
   9559 
   9560 /* Given a basic block B which ends with a conditional and has
   9562    precisely two successors, determine which of the edges is taken if
   9563    the conditional is true and which is taken if the conditional is
   9564    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
   9565 
   9566 void
   9567 extract_true_false_edges_from_block (basic_block b,
   9568 				     edge *true_edge,
   9569 				     edge *false_edge)
   9570 {
   9571   edge e = EDGE_SUCC (b, 0);
   9572 
   9573   if (e->flags & EDGE_TRUE_VALUE)
   9574     {
   9575       *true_edge = e;
   9576       *false_edge = EDGE_SUCC (b, 1);
   9577     }
   9578   else
   9579     {
   9580       *false_edge = e;
   9581       *true_edge = EDGE_SUCC (b, 1);
   9582     }
   9583 }
   9584 
   9585 
   9586 /* From a controlling predicate in the immediate dominator DOM of
   9587    PHIBLOCK determine the edges into PHIBLOCK that are chosen if the
   9588    predicate evaluates to true and false and store them to
   9589    *TRUE_CONTROLLED_EDGE and *FALSE_CONTROLLED_EDGE if
   9590    they are non-NULL.  Returns true if the edges can be determined,
   9591    else return false.  */
   9592 
   9593 bool
   9594 extract_true_false_controlled_edges (basic_block dom, basic_block phiblock,
   9595 				     edge *true_controlled_edge,
   9596 				     edge *false_controlled_edge)
   9597 {
   9598   basic_block bb = phiblock;
   9599   edge true_edge, false_edge, tem;
   9600   edge e0 = NULL, e1 = NULL;
   9601 
   9602   /* We have to verify that one edge into the PHI node is dominated
   9603      by the true edge of the predicate block and the other edge
   9604      dominated by the false edge.  This ensures that the PHI argument
   9605      we are going to take is completely determined by the path we
   9606      take from the predicate block.
   9607      We can only use BB dominance checks below if the destination of
   9608      the true/false edges are dominated by their edge, thus only
   9609      have a single predecessor.  */
   9610   extract_true_false_edges_from_block (dom, &true_edge, &false_edge);
   9611   tem = EDGE_PRED (bb, 0);
   9612   if (tem == true_edge
   9613       || (single_pred_p (true_edge->dest)
   9614 	  && (tem->src == true_edge->dest
   9615 	      || dominated_by_p (CDI_DOMINATORS,
   9616 				 tem->src, true_edge->dest))))
   9617     e0 = tem;
   9618   else if (tem == false_edge
   9619 	   || (single_pred_p (false_edge->dest)
   9620 	       && (tem->src == false_edge->dest
   9621 		   || dominated_by_p (CDI_DOMINATORS,
   9622 				      tem->src, false_edge->dest))))
   9623     e1 = tem;
   9624   else
   9625     return false;
   9626   tem = EDGE_PRED (bb, 1);
   9627   if (tem == true_edge
   9628       || (single_pred_p (true_edge->dest)
   9629 	  && (tem->src == true_edge->dest
   9630 	      || dominated_by_p (CDI_DOMINATORS,
   9631 				 tem->src, true_edge->dest))))
   9632     e0 = tem;
   9633   else if (tem == false_edge
   9634 	   || (single_pred_p (false_edge->dest)
   9635 	       && (tem->src == false_edge->dest
   9636 		   || dominated_by_p (CDI_DOMINATORS,
   9637 				      tem->src, false_edge->dest))))
   9638     e1 = tem;
   9639   else
   9640     return false;
   9641   if (!e0 || !e1)
   9642     return false;
   9643 
   9644   if (true_controlled_edge)
   9645     *true_controlled_edge = e0;
   9646   if (false_controlled_edge)
   9647     *false_controlled_edge = e1;
   9648 
   9649   return true;
   9650 }
   9651 
   9652 /* Generate a range test LHS CODE RHS that determines whether INDEX is in the
   9653     range [low, high].  Place associated stmts before *GSI.  */
   9654 
   9655 void
   9656 generate_range_test (basic_block bb, tree index, tree low, tree high,
   9657 		     tree *lhs, tree *rhs)
   9658 {
   9659   tree type = TREE_TYPE (index);
   9660   tree utype = range_check_type (type);
   9661 
   9662   low = fold_convert (utype, low);
   9663   high = fold_convert (utype, high);
   9664 
   9665   gimple_seq seq = NULL;
   9666   index = gimple_convert (&seq, utype, index);
   9667   *lhs = gimple_build (&seq, MINUS_EXPR, utype, index, low);
   9668   *rhs = const_binop (MINUS_EXPR, utype, high, low);
   9669 
   9670   gimple_stmt_iterator gsi = gsi_last_bb (bb);
   9671   gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
   9672 }
   9673 
   9674 /* Return the basic block that belongs to label numbered INDEX
   9675    of a switch statement.  */
   9676 
   9677 basic_block
   9678 gimple_switch_label_bb (function *ifun, gswitch *gs, unsigned index)
   9679 {
   9680   return label_to_block (ifun, CASE_LABEL (gimple_switch_label (gs, index)));
   9681 }
   9682 
   9683 /* Return the default basic block of a switch statement.  */
   9684 
   9685 basic_block
   9686 gimple_switch_default_bb (function *ifun, gswitch *gs)
   9687 {
   9688   return gimple_switch_label_bb (ifun, gs, 0);
   9689 }
   9690 
   9691 /* Return the edge that belongs to label numbered INDEX
   9692    of a switch statement.  */
   9693 
   9694 edge
   9695 gimple_switch_edge (function *ifun, gswitch *gs, unsigned index)
   9696 {
   9697   return find_edge (gimple_bb (gs), gimple_switch_label_bb (ifun, gs, index));
   9698 }
   9699 
   9700 /* Return the default edge of a switch statement.  */
   9701 
   9702 edge
   9703 gimple_switch_default_edge (function *ifun, gswitch *gs)
   9704 {
   9705   return gimple_switch_edge (ifun, gs, 0);
   9706 }
   9707 
   9708 /* Return true if the only executable statement in BB is a GIMPLE_COND.  */
   9709 
   9710 bool
   9711 cond_only_block_p (basic_block bb)
   9712 {
   9713   /* BB must have no executable statements.  */
   9714   gimple_stmt_iterator gsi = gsi_after_labels (bb);
   9715   if (phi_nodes (bb))
   9716     return false;
   9717   while (!gsi_end_p (gsi))
   9718     {
   9719       gimple *stmt = gsi_stmt (gsi);
   9720       if (is_gimple_debug (stmt))
   9721 	;
   9722       else if (gimple_code (stmt) == GIMPLE_NOP
   9723 	       || gimple_code (stmt) == GIMPLE_PREDICT
   9724 	       || gimple_code (stmt) == GIMPLE_COND)
   9725 	;
   9726       else
   9727 	return false;
   9728       gsi_next (&gsi);
   9729     }
   9730   return true;
   9731 }
   9732 
   9733 
   9734 /* Emit return warnings.  */
   9735 
   9736 namespace {
   9737 
   9738 const pass_data pass_data_warn_function_return =
   9739 {
   9740   GIMPLE_PASS, /* type */
   9741   "*warn_function_return", /* name */
   9742   OPTGROUP_NONE, /* optinfo_flags */
   9743   TV_NONE, /* tv_id */
   9744   PROP_cfg, /* properties_required */
   9745   0, /* properties_provided */
   9746   0, /* properties_destroyed */
   9747   0, /* todo_flags_start */
   9748   0, /* todo_flags_finish */
   9749 };
   9750 
   9751 class pass_warn_function_return : public gimple_opt_pass
   9752 {
   9753 public:
   9754   pass_warn_function_return (gcc::context *ctxt)
   9755     : gimple_opt_pass (pass_data_warn_function_return, ctxt)
   9756   {}
   9757 
   9758   /* opt_pass methods: */
   9759   unsigned int execute (function *) final override;
   9760 
   9761 }; // class pass_warn_function_return
   9762 
   9763 unsigned int
   9764 pass_warn_function_return::execute (function *fun)
   9765 {
   9766   location_t location;
   9767   gimple *last;
   9768   edge e;
   9769   edge_iterator ei;
   9770 
   9771   if (!targetm.warn_func_return (fun->decl))
   9772     return 0;
   9773 
   9774   /* If we have a path to EXIT, then we do return.  */
   9775   if (TREE_THIS_VOLATILE (fun->decl)
   9776       && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0)
   9777     {
   9778       location = UNKNOWN_LOCATION;
   9779       for (ei = ei_start (EXIT_BLOCK_PTR_FOR_FN (fun)->preds);
   9780 	   (e = ei_safe_edge (ei)); )
   9781 	{
   9782 	  last = *gsi_last_bb (e->src);
   9783 	  if ((gimple_code (last) == GIMPLE_RETURN
   9784 	       || gimple_call_builtin_p (last, BUILT_IN_RETURN))
   9785 	      && location == UNKNOWN_LOCATION
   9786 	      && ((location = LOCATION_LOCUS (gimple_location (last)))
   9787 		  != UNKNOWN_LOCATION)
   9788 	      && !optimize)
   9789 	    break;
   9790 	  /* When optimizing, replace return stmts in noreturn functions
   9791 	     with __builtin_unreachable () call.  */
   9792 	  if (optimize && gimple_code (last) == GIMPLE_RETURN)
   9793 	    {
   9794 	      location_t loc = gimple_location (last);
   9795 	      gimple *new_stmt = gimple_build_builtin_unreachable (loc);
   9796 	      gimple_stmt_iterator gsi = gsi_for_stmt (last);
   9797 	      gsi_replace (&gsi, new_stmt, true);
   9798 	      remove_edge (e);
   9799 	    }
   9800 	  else
   9801 	    ei_next (&ei);
   9802 	}
   9803       if (location == UNKNOWN_LOCATION)
   9804 	location = cfun->function_end_locus;
   9805 
   9806 #ifdef notyet
   9807       if (warn_missing_noreturn)
   9808         warning_at (location, 0, "%<noreturn%> function does return");
   9809 #endif
   9810     }
   9811 
   9812   /* If we see "return;" in some basic block, then we do reach the end
   9813      without returning a value.  */
   9814   else if (warn_return_type > 0
   9815 	   && !warning_suppressed_p (fun->decl, OPT_Wreturn_type)
   9816 	   && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fun->decl))))
   9817     {
   9818       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (fun)->preds)
   9819 	{
   9820 	  greturn *return_stmt = dyn_cast <greturn *> (*gsi_last_bb (e->src));
   9821 	  if (return_stmt
   9822 	      && gimple_return_retval (return_stmt) == NULL
   9823 	      && !warning_suppressed_p (return_stmt, OPT_Wreturn_type))
   9824 	    {
   9825 	      location = gimple_location (return_stmt);
   9826 	      if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION)
   9827 		location = fun->function_end_locus;
   9828 	      if (warning_at (location, OPT_Wreturn_type,
   9829 			      "control reaches end of non-void function"))
   9830 		suppress_warning (fun->decl, OPT_Wreturn_type);
   9831 	      break;
   9832 	    }
   9833 	}
   9834       /* The C++ FE turns fallthrough from the end of non-void function
   9835 	 into __builtin_unreachable () call with BUILTINS_LOCATION.
   9836 	 Recognize those as well as calls from ubsan_instrument_return.  */
   9837       basic_block bb;
   9838       if (!warning_suppressed_p (fun->decl, OPT_Wreturn_type))
   9839 	FOR_EACH_BB_FN (bb, fun)
   9840 	  if (EDGE_COUNT (bb->succs) == 0)
   9841 	    {
   9842 	      gimple *last = *gsi_last_bb (bb);
   9843 	      const enum built_in_function ubsan_missing_ret
   9844 		= BUILT_IN_UBSAN_HANDLE_MISSING_RETURN;
   9845 	      if (last
   9846 		  && ((LOCATION_LOCUS (gimple_location (last))
   9847 		       == BUILTINS_LOCATION
   9848 		       && (gimple_call_builtin_p (last, BUILT_IN_UNREACHABLE)
   9849 			   || gimple_call_builtin_p (last,
   9850 						     BUILT_IN_UNREACHABLE_TRAP)
   9851 			   || gimple_call_builtin_p (last, BUILT_IN_TRAP)))
   9852 		      || gimple_call_builtin_p (last, ubsan_missing_ret)))
   9853 		{
   9854 		  gimple_stmt_iterator gsi = gsi_for_stmt (last);
   9855 		  gsi_prev_nondebug (&gsi);
   9856 		  gimple *prev = gsi_stmt (gsi);
   9857 		  if (prev == NULL)
   9858 		    location = UNKNOWN_LOCATION;
   9859 		  else
   9860 		    location = gimple_location (prev);
   9861 		  if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION)
   9862 		    location = fun->function_end_locus;
   9863 		  if (warning_at (location, OPT_Wreturn_type,
   9864 				  "control reaches end of non-void function"))
   9865 		    suppress_warning (fun->decl, OPT_Wreturn_type);
   9866 		  break;
   9867 		}
   9868 	    }
   9869     }
   9870   return 0;
   9871 }
   9872 
   9873 } // anon namespace
   9874 
   9875 gimple_opt_pass *
   9876 make_pass_warn_function_return (gcc::context *ctxt)
   9877 {
   9878   return new pass_warn_function_return (ctxt);
   9879 }
   9880 
   9881 /* Walk a gimplified function and warn for functions whose return value is
   9882    ignored and attribute((warn_unused_result)) is set.  This is done before
   9883    inlining, so we don't have to worry about that.  */
   9884 
   9885 static void
   9886 do_warn_unused_result (gimple_seq seq)
   9887 {
   9888   tree fdecl, ftype;
   9889   gimple_stmt_iterator i;
   9890 
   9891   for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
   9892     {
   9893       gimple *g = gsi_stmt (i);
   9894 
   9895       switch (gimple_code (g))
   9896 	{
   9897 	case GIMPLE_BIND:
   9898 	  do_warn_unused_result (gimple_bind_body (as_a <gbind *>(g)));
   9899 	  break;
   9900 	case GIMPLE_TRY:
   9901 	  do_warn_unused_result (gimple_try_eval (g));
   9902 	  do_warn_unused_result (gimple_try_cleanup (g));
   9903 	  break;
   9904 	case GIMPLE_CATCH:
   9905 	  do_warn_unused_result (gimple_catch_handler (
   9906 				   as_a <gcatch *> (g)));
   9907 	  break;
   9908 	case GIMPLE_EH_FILTER:
   9909 	  do_warn_unused_result (gimple_eh_filter_failure (g));
   9910 	  break;
   9911 
   9912 	case GIMPLE_CALL:
   9913 	  if (gimple_call_lhs (g))
   9914 	    break;
   9915 	  if (gimple_call_internal_p (g))
   9916 	    break;
   9917 
   9918 	  /* This is a naked call, as opposed to a GIMPLE_CALL with an
   9919 	     LHS.  All calls whose value is ignored should be
   9920 	     represented like this.  Look for the attribute.  */
   9921 	  fdecl = gimple_call_fndecl (g);
   9922 	  ftype = gimple_call_fntype (g);
   9923 
   9924 	  if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
   9925 	    {
   9926 	      location_t loc = gimple_location (g);
   9927 
   9928 	      if (fdecl)
   9929 		warning_at (loc, OPT_Wunused_result,
   9930 			    "ignoring return value of %qD "
   9931 			    "declared with attribute %<warn_unused_result%>",
   9932 			    fdecl);
   9933 	      else
   9934 		warning_at (loc, OPT_Wunused_result,
   9935 			    "ignoring return value of function "
   9936 			    "declared with attribute %<warn_unused_result%>");
   9937 	    }
   9938 	  break;
   9939 
   9940 	default:
   9941 	  /* Not a container, not a call, or a call whose value is used.  */
   9942 	  break;
   9943 	}
   9944     }
   9945 }
   9946 
   9947 namespace {
   9948 
   9949 const pass_data pass_data_warn_unused_result =
   9950 {
   9951   GIMPLE_PASS, /* type */
   9952   "*warn_unused_result", /* name */
   9953   OPTGROUP_NONE, /* optinfo_flags */
   9954   TV_NONE, /* tv_id */
   9955   PROP_gimple_any, /* properties_required */
   9956   0, /* properties_provided */
   9957   0, /* properties_destroyed */
   9958   0, /* todo_flags_start */
   9959   0, /* todo_flags_finish */
   9960 };
   9961 
   9962 class pass_warn_unused_result : public gimple_opt_pass
   9963 {
   9964 public:
   9965   pass_warn_unused_result (gcc::context *ctxt)
   9966     : gimple_opt_pass (pass_data_warn_unused_result, ctxt)
   9967   {}
   9968 
   9969   /* opt_pass methods: */
   9970   bool gate (function *)  final override { return flag_warn_unused_result; }
   9971   unsigned int execute (function *) final override
   9972     {
   9973       do_warn_unused_result (gimple_body (current_function_decl));
   9974       return 0;
   9975     }
   9976 
   9977 }; // class pass_warn_unused_result
   9978 
   9979 } // anon namespace
   9980 
   9981 gimple_opt_pass *
   9982 make_pass_warn_unused_result (gcc::context *ctxt)
   9983 {
   9984   return new pass_warn_unused_result (ctxt);
   9985 }
   9986 
   9987 /* Maybe Remove stores to variables we marked write-only.
   9988    Return true if a store was removed. */
   9989 static bool
   9990 maybe_remove_writeonly_store (gimple_stmt_iterator &gsi, gimple *stmt,
   9991 			      bitmap dce_ssa_names)
   9992 {
   9993   /* Keep access when store has side effect, i.e. in case when source
   9994      is volatile.  */
   9995   if (!gimple_store_p (stmt)
   9996       || gimple_has_side_effects (stmt)
   9997       || optimize_debug)
   9998     return false;
   9999 
   10000   tree lhs = get_base_address (gimple_get_lhs (stmt));
   10001 
   10002   if (!VAR_P (lhs)
   10003       || (!TREE_STATIC (lhs) && !DECL_EXTERNAL (lhs))
   10004       || !varpool_node::get (lhs)->writeonly)
   10005     return false;
   10006 
   10007   if (dump_file && (dump_flags & TDF_DETAILS))
   10008     {
   10009       fprintf (dump_file, "Removing statement, writes"
   10010 	       " to write only var:\n");
   10011       print_gimple_stmt (dump_file, stmt, 0,
   10012 			 TDF_VOPS|TDF_MEMSYMS);
   10013     }
   10014 
   10015   /* Mark ssa name defining to be checked for simple dce. */
   10016   if (gimple_assign_single_p (stmt))
   10017     {
   10018       tree rhs = gimple_assign_rhs1 (stmt);
   10019       if (TREE_CODE (rhs) == SSA_NAME
   10020 	  && !SSA_NAME_IS_DEFAULT_DEF (rhs))
   10021 	bitmap_set_bit (dce_ssa_names, SSA_NAME_VERSION (rhs));
   10022     }
   10023   unlink_stmt_vdef (stmt);
   10024   gsi_remove (&gsi, true);
   10025   release_defs (stmt);
   10026   return true;
   10027 }
   10028 
   10029 /* IPA passes, compilation of earlier functions or inlining
   10030    might have changed some properties, such as marked functions nothrow,
   10031    pure, const or noreturn.
   10032    Remove redundant edges and basic blocks, and create new ones if necessary. */
   10033 
   10034 unsigned int
   10035 execute_fixup_cfg (void)
   10036 {
   10037   basic_block bb;
   10038   gimple_stmt_iterator gsi;
   10039   int todo = 0;
   10040   cgraph_node *node = cgraph_node::get (current_function_decl);
   10041   /* Same scaling is also done by ipa_merge_profiles.  */
   10042   profile_count num = node->count;
   10043   profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
   10044   bool scale = num.initialized_p () && !(num == den);
   10045   auto_bitmap dce_ssa_names;
   10046 
   10047   if (scale)
   10048     {
   10049       profile_count::adjust_for_ipa_scaling (&num, &den);
   10050       ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count;
   10051       EXIT_BLOCK_PTR_FOR_FN (cfun)->count
   10052         = EXIT_BLOCK_PTR_FOR_FN (cfun)->count.apply_scale (num, den);
   10053     }
   10054 
   10055   FOR_EACH_BB_FN (bb, cfun)
   10056     {
   10057       if (scale)
   10058         bb->count = bb->count.apply_scale (num, den);
   10059       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
   10060 	{
   10061 	  gimple *stmt = gsi_stmt (gsi);
   10062 	  tree decl = is_gimple_call (stmt)
   10063 		      ? gimple_call_fndecl (stmt)
   10064 		      : NULL;
   10065 	  if (decl)
   10066 	    {
   10067 	      int flags = gimple_call_flags (stmt);
   10068 	      if (flags & (ECF_CONST | ECF_PURE | ECF_LOOPING_CONST_OR_PURE))
   10069 		{
   10070 		  if (gimple_in_ssa_p (cfun))
   10071 		    {
   10072 		      todo |= TODO_update_ssa | TODO_cleanup_cfg;
   10073 		      update_stmt (stmt);
   10074 		    }
   10075 		}
   10076 	      if (flags & ECF_NORETURN
   10077 		  && fixup_noreturn_call (stmt))
   10078 		todo |= TODO_cleanup_cfg;
   10079 	     }
   10080 
   10081 	  /* Remove stores to variables we marked write-only. */
   10082 	  if (maybe_remove_writeonly_store (gsi, stmt, dce_ssa_names))
   10083 	    {
   10084 	      todo |= TODO_update_ssa | TODO_cleanup_cfg;
   10085 	      continue;
   10086 	    }
   10087 
   10088 	  /* For calls we can simply remove LHS when it is known
   10089 	     to be write-only.  */
   10090 	  if (is_gimple_call (stmt)
   10091 	      && gimple_get_lhs (stmt))
   10092 	    {
   10093 	      tree lhs = get_base_address (gimple_get_lhs (stmt));
   10094 
   10095 	      if (VAR_P (lhs)
   10096 		  && (TREE_STATIC (lhs) || DECL_EXTERNAL (lhs))
   10097 		  && varpool_node::get (lhs)->writeonly)
   10098 		{
   10099 		  gimple_call_set_lhs (stmt, NULL);
   10100 		  update_stmt (stmt);
   10101 	          todo |= TODO_update_ssa | TODO_cleanup_cfg;
   10102 		}
   10103 	    }
   10104 
   10105 	  gsi_next (&gsi);
   10106 	}
   10107       if (gimple *last = *gsi_last_bb (bb))
   10108 	{
   10109 	  if (maybe_clean_eh_stmt (last)
   10110 	      && gimple_purge_dead_eh_edges (bb))
   10111 	    todo |= TODO_cleanup_cfg;
   10112 	  if (gimple_purge_dead_abnormal_call_edges (bb))
   10113 	    todo |= TODO_cleanup_cfg;
   10114 	}
   10115 
   10116       /* If we have a basic block with no successors that does not
   10117 	 end with a control statement or a noreturn call end it with
   10118 	 a call to __builtin_unreachable.  This situation can occur
   10119 	 when inlining a noreturn call that does in fact return.  */
   10120       if (EDGE_COUNT (bb->succs) == 0)
   10121 	{
   10122 	  gimple *stmt = last_nondebug_stmt (bb);
   10123 	  if (!stmt
   10124 	      || (!is_ctrl_stmt (stmt)
   10125 		  && (!is_gimple_call (stmt)
   10126 		      || !gimple_call_noreturn_p (stmt))))
   10127 	    {
   10128 	      if (stmt && is_gimple_call (stmt))
   10129 		gimple_call_set_ctrl_altering (stmt, false);
   10130 	      stmt = gimple_build_builtin_unreachable (UNKNOWN_LOCATION);
   10131 	      gimple_stmt_iterator gsi = gsi_last_bb (bb);
   10132 	      gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
   10133 	      if (!cfun->after_inlining)
   10134 		if (tree fndecl = gimple_call_fndecl (stmt))
   10135 		  {
   10136 		    gcall *call_stmt = dyn_cast <gcall *> (stmt);
   10137 		    node->create_edge (cgraph_node::get_create (fndecl),
   10138 				       call_stmt, bb->count);
   10139 		  }
   10140 	    }
   10141 	}
   10142     }
   10143   if (scale)
   10144     {
   10145       update_max_bb_count ();
   10146       compute_function_frequency ();
   10147     }
   10148 
   10149   if (current_loops
   10150       && (todo & TODO_cleanup_cfg))
   10151     loops_state_set (LOOPS_NEED_FIXUP);
   10152 
   10153   simple_dce_from_worklist (dce_ssa_names);
   10154 
   10155   return todo;
   10156 }
   10157 
   10158 namespace {
   10159 
   10160 const pass_data pass_data_fixup_cfg =
   10161 {
   10162   GIMPLE_PASS, /* type */
   10163   "fixup_cfg", /* name */
   10164   OPTGROUP_NONE, /* optinfo_flags */
   10165   TV_NONE, /* tv_id */
   10166   PROP_cfg, /* properties_required */
   10167   0, /* properties_provided */
   10168   0, /* properties_destroyed */
   10169   0, /* todo_flags_start */
   10170   0, /* todo_flags_finish */
   10171 };
   10172 
   10173 class pass_fixup_cfg : public gimple_opt_pass
   10174 {
   10175 public:
   10176   pass_fixup_cfg (gcc::context *ctxt)
   10177     : gimple_opt_pass (pass_data_fixup_cfg, ctxt)
   10178   {}
   10179 
   10180   /* opt_pass methods: */
   10181   opt_pass * clone () final override { return new pass_fixup_cfg (m_ctxt); }
   10182   unsigned int execute (function *) final override
   10183   {
   10184     return execute_fixup_cfg ();
   10185   }
   10186 
   10187 }; // class pass_fixup_cfg
   10188 
   10189 } // anon namespace
   10190 
   10191 gimple_opt_pass *
   10192 make_pass_fixup_cfg (gcc::context *ctxt)
   10193 {
   10194   return new pass_fixup_cfg (ctxt);
   10195 }
   10196 
   10197 /* Garbage collection support for edge_def.  */
   10198 
   10199 extern void gt_ggc_mx (tree&);
   10200 extern void gt_ggc_mx (gimple *&);
   10201 extern void gt_ggc_mx (rtx&);
   10202 extern void gt_ggc_mx (basic_block&);
   10203 
   10204 static void
   10205 gt_ggc_mx (rtx_insn *& x)
   10206 {
   10207   if (x)
   10208     gt_ggc_mx_rtx_def ((void *) x);
   10209 }
   10210 
   10211 void
   10212 gt_ggc_mx (edge_def *e)
   10213 {
   10214   tree block = LOCATION_BLOCK (e->goto_locus);
   10215   gt_ggc_mx (e->src);
   10216   gt_ggc_mx (e->dest);
   10217   if (current_ir_type () == IR_GIMPLE)
   10218     gt_ggc_mx (e->insns.g);
   10219   else
   10220     gt_ggc_mx (e->insns.r);
   10221   gt_ggc_mx (block);
   10222 }
   10223 
   10224 /* PCH support for edge_def.  */
   10225 
   10226 extern void gt_pch_nx (tree&);
   10227 extern void gt_pch_nx (gimple *&);
   10228 extern void gt_pch_nx (rtx&);
   10229 extern void gt_pch_nx (basic_block&);
   10230 
   10231 static void
   10232 gt_pch_nx (rtx_insn *& x)
   10233 {
   10234   if (x)
   10235     gt_pch_nx_rtx_def ((void *) x);
   10236 }
   10237 
   10238 void
   10239 gt_pch_nx (edge_def *e)
   10240 {
   10241   tree block = LOCATION_BLOCK (e->goto_locus);
   10242   gt_pch_nx (e->src);
   10243   gt_pch_nx (e->dest);
   10244   if (current_ir_type () == IR_GIMPLE)
   10245     gt_pch_nx (e->insns.g);
   10246   else
   10247     gt_pch_nx (e->insns.r);
   10248   gt_pch_nx (block);
   10249 }
   10250 
   10251 void
   10252 gt_pch_nx (edge_def *e, gt_pointer_operator op, void *cookie)
   10253 {
   10254   tree block = LOCATION_BLOCK (e->goto_locus);
   10255   op (&(e->src), NULL, cookie);
   10256   op (&(e->dest), NULL, cookie);
   10257   if (current_ir_type () == IR_GIMPLE)
   10258     op (&(e->insns.g), NULL, cookie);
   10259   else
   10260     op (&(e->insns.r), NULL, cookie);
   10261   op (&(block), &(block), cookie);
   10262 }
   10263 
   10264 #if CHECKING_P
   10265 
   10266 namespace selftest {
   10267 
   10268 /* Helper function for CFG selftests: create a dummy function decl
   10269    and push it as cfun.  */
   10270 
   10271 static tree
   10272 push_fndecl (const char *name)
   10273 {
   10274   tree fn_type = build_function_type_array (integer_type_node, 0, NULL);
   10275   /* FIXME: this uses input_location: */
   10276   tree fndecl = build_fn_decl (name, fn_type);
   10277   tree retval = build_decl (UNKNOWN_LOCATION, RESULT_DECL,
   10278 			    NULL_TREE, integer_type_node);
   10279   DECL_RESULT (fndecl) = retval;
   10280   push_struct_function (fndecl);
   10281   function *fun = DECL_STRUCT_FUNCTION (fndecl);
   10282   ASSERT_TRUE (fun != NULL);
   10283   init_empty_tree_cfg_for_function (fun);
   10284   ASSERT_EQ (2, n_basic_blocks_for_fn (fun));
   10285   ASSERT_EQ (0, n_edges_for_fn (fun));
   10286   return fndecl;
   10287 }
   10288 
   10289 /* These tests directly create CFGs.
   10290    Compare with the static fns within tree-cfg.cc:
   10291      - build_gimple_cfg
   10292      - make_blocks: calls create_basic_block (seq, bb);
   10293      - make_edges.   */
   10294 
   10295 /* Verify a simple cfg of the form:
   10296      ENTRY -> A -> B -> C -> EXIT.  */
   10297 
   10298 static void
   10299 test_linear_chain ()
   10300 {
   10301   gimple_register_cfg_hooks ();
   10302 
   10303   tree fndecl = push_fndecl ("cfg_test_linear_chain");
   10304   function *fun = DECL_STRUCT_FUNCTION (fndecl);
   10305 
   10306   /* Create some empty blocks.  */
   10307   basic_block bb_a = create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun));
   10308   basic_block bb_b = create_empty_bb (bb_a);
   10309   basic_block bb_c = create_empty_bb (bb_b);
   10310 
   10311   ASSERT_EQ (5, n_basic_blocks_for_fn (fun));
   10312   ASSERT_EQ (0, n_edges_for_fn (fun));
   10313 
   10314   /* Create some edges: a simple linear chain of BBs.  */
   10315   make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), bb_a, EDGE_FALLTHRU);
   10316   make_edge (bb_a, bb_b, 0);
   10317   make_edge (bb_b, bb_c, 0);
   10318   make_edge (bb_c, EXIT_BLOCK_PTR_FOR_FN (fun), 0);
   10319 
   10320   /* Verify the edges.  */
   10321   ASSERT_EQ (4, n_edges_for_fn (fun));
   10322   ASSERT_EQ (NULL, ENTRY_BLOCK_PTR_FOR_FN (fun)->preds);
   10323   ASSERT_EQ (1, ENTRY_BLOCK_PTR_FOR_FN (fun)->succs->length ());
   10324   ASSERT_EQ (1, bb_a->preds->length ());
   10325   ASSERT_EQ (1, bb_a->succs->length ());
   10326   ASSERT_EQ (1, bb_b->preds->length ());
   10327   ASSERT_EQ (1, bb_b->succs->length ());
   10328   ASSERT_EQ (1, bb_c->preds->length ());
   10329   ASSERT_EQ (1, bb_c->succs->length ());
   10330   ASSERT_EQ (1, EXIT_BLOCK_PTR_FOR_FN (fun)->preds->length ());
   10331   ASSERT_EQ (NULL, EXIT_BLOCK_PTR_FOR_FN (fun)->succs);
   10332 
   10333   /* Verify the dominance information
   10334      Each BB in our simple chain should be dominated by the one before
   10335      it.  */
   10336   calculate_dominance_info (CDI_DOMINATORS);
   10337   ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_b));
   10338   ASSERT_EQ (bb_b, get_immediate_dominator (CDI_DOMINATORS, bb_c));
   10339   auto_vec<basic_block> dom_by_b = get_dominated_by (CDI_DOMINATORS, bb_b);
   10340   ASSERT_EQ (1, dom_by_b.length ());
   10341   ASSERT_EQ (bb_c, dom_by_b[0]);
   10342   free_dominance_info (CDI_DOMINATORS);
   10343 
   10344   /* Similarly for post-dominance: each BB in our chain is post-dominated
   10345      by the one after it.  */
   10346   calculate_dominance_info (CDI_POST_DOMINATORS);
   10347   ASSERT_EQ (bb_b, get_immediate_dominator (CDI_POST_DOMINATORS, bb_a));
   10348   ASSERT_EQ (bb_c, get_immediate_dominator (CDI_POST_DOMINATORS, bb_b));
   10349   auto_vec<basic_block> postdom_by_b = get_dominated_by (CDI_POST_DOMINATORS, bb_b);
   10350   ASSERT_EQ (1, postdom_by_b.length ());
   10351   ASSERT_EQ (bb_a, postdom_by_b[0]);
   10352   free_dominance_info (CDI_POST_DOMINATORS);
   10353 
   10354   pop_cfun ();
   10355 }
   10356 
   10357 /* Verify a simple CFG of the form:
   10358      ENTRY
   10359        |
   10360        A
   10361       / \
   10362      /t  \f
   10363     B     C
   10364      \   /
   10365       \ /
   10366        D
   10367        |
   10368       EXIT.  */
   10369 
   10370 static void
   10371 test_diamond ()
   10372 {
   10373   gimple_register_cfg_hooks ();
   10374 
   10375   tree fndecl = push_fndecl ("cfg_test_diamond");
   10376   function *fun = DECL_STRUCT_FUNCTION (fndecl);
   10377 
   10378   /* Create some empty blocks.  */
   10379   basic_block bb_a = create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun));
   10380   basic_block bb_b = create_empty_bb (bb_a);
   10381   basic_block bb_c = create_empty_bb (bb_a);
   10382   basic_block bb_d = create_empty_bb (bb_b);
   10383 
   10384   ASSERT_EQ (6, n_basic_blocks_for_fn (fun));
   10385   ASSERT_EQ (0, n_edges_for_fn (fun));
   10386 
   10387   /* Create the edges.  */
   10388   make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), bb_a, EDGE_FALLTHRU);
   10389   make_edge (bb_a, bb_b, EDGE_TRUE_VALUE);
   10390   make_edge (bb_a, bb_c, EDGE_FALSE_VALUE);
   10391   make_edge (bb_b, bb_d, 0);
   10392   make_edge (bb_c, bb_d, 0);
   10393   make_edge (bb_d, EXIT_BLOCK_PTR_FOR_FN (fun), 0);
   10394 
   10395   /* Verify the edges.  */
   10396   ASSERT_EQ (6, n_edges_for_fn (fun));
   10397   ASSERT_EQ (1, bb_a->preds->length ());
   10398   ASSERT_EQ (2, bb_a->succs->length ());
   10399   ASSERT_EQ (1, bb_b->preds->length ());
   10400   ASSERT_EQ (1, bb_b->succs->length ());
   10401   ASSERT_EQ (1, bb_c->preds->length ());
   10402   ASSERT_EQ (1, bb_c->succs->length ());
   10403   ASSERT_EQ (2, bb_d->preds->length ());
   10404   ASSERT_EQ (1, bb_d->succs->length ());
   10405 
   10406   /* Verify the dominance information.  */
   10407   calculate_dominance_info (CDI_DOMINATORS);
   10408   ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_b));
   10409   ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_c));
   10410   ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_d));
   10411   auto_vec<basic_block> dom_by_a = get_dominated_by (CDI_DOMINATORS, bb_a);
   10412   ASSERT_EQ (3, dom_by_a.length ()); /* B, C, D, in some order.  */
   10413   dom_by_a.release ();
   10414   auto_vec<basic_block> dom_by_b = get_dominated_by (CDI_DOMINATORS, bb_b);
   10415   ASSERT_EQ (0, dom_by_b.length ());
   10416   dom_by_b.release ();
   10417   free_dominance_info (CDI_DOMINATORS);
   10418 
   10419   /* Similarly for post-dominance.  */
   10420   calculate_dominance_info (CDI_POST_DOMINATORS);
   10421   ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_a));
   10422   ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_b));
   10423   ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_c));
   10424   auto_vec<basic_block> postdom_by_d = get_dominated_by (CDI_POST_DOMINATORS, bb_d);
   10425   ASSERT_EQ (3, postdom_by_d.length ()); /* A, B, C in some order.  */
   10426   postdom_by_d.release ();
   10427   auto_vec<basic_block> postdom_by_b = get_dominated_by (CDI_POST_DOMINATORS, bb_b);
   10428   ASSERT_EQ (0, postdom_by_b.length ());
   10429   postdom_by_b.release ();
   10430   free_dominance_info (CDI_POST_DOMINATORS);
   10431 
   10432   pop_cfun ();
   10433 }
   10434 
   10435 /* Verify that we can handle a CFG containing a "complete" aka
   10436    fully-connected subgraph (where A B C D below all have edges
   10437    pointing to each other node, also to themselves).
   10438    e.g.:
   10439      ENTRY  EXIT
   10440        |    ^
   10441        |   /
   10442        |  /
   10443        | /
   10444        V/
   10445        A<--->B
   10446        ^^   ^^
   10447        | \ / |
   10448        |  X  |
   10449        | / \ |
   10450        VV   VV
   10451        C<--->D
   10452 */
   10453 
   10454 static void
   10455 test_fully_connected ()
   10456 {
   10457   gimple_register_cfg_hooks ();
   10458 
   10459   tree fndecl = push_fndecl ("cfg_fully_connected");
   10460   function *fun = DECL_STRUCT_FUNCTION (fndecl);
   10461 
   10462   const int n = 4;
   10463 
   10464   /* Create some empty blocks.  */
   10465   auto_vec <basic_block> subgraph_nodes;
   10466   for (int i = 0; i < n; i++)
   10467     subgraph_nodes.safe_push (create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun)));
   10468 
   10469   ASSERT_EQ (n + 2, n_basic_blocks_for_fn (fun));
   10470   ASSERT_EQ (0, n_edges_for_fn (fun));
   10471 
   10472   /* Create the edges.  */
   10473   make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), subgraph_nodes[0], EDGE_FALLTHRU);
   10474   make_edge (subgraph_nodes[0], EXIT_BLOCK_PTR_FOR_FN (fun), 0);
   10475   for (int i = 0; i < n; i++)
   10476     for (int j = 0; j < n; j++)
   10477       make_edge (subgraph_nodes[i], subgraph_nodes[j], 0);
   10478 
   10479   /* Verify the edges.  */
   10480   ASSERT_EQ (2 + (n * n), n_edges_for_fn (fun));
   10481   /* The first one is linked to ENTRY/EXIT as well as itself and
   10482      everything else.  */
   10483   ASSERT_EQ (n + 1, subgraph_nodes[0]->preds->length ());
   10484   ASSERT_EQ (n + 1, subgraph_nodes[0]->succs->length ());
   10485   /* The other ones in the subgraph are linked to everything in
   10486      the subgraph (including themselves).  */
   10487   for (int i = 1; i < n; i++)
   10488     {
   10489       ASSERT_EQ (n, subgraph_nodes[i]->preds->length ());
   10490       ASSERT_EQ (n, subgraph_nodes[i]->succs->length ());
   10491     }
   10492 
   10493   /* Verify the dominance information.  */
   10494   calculate_dominance_info (CDI_DOMINATORS);
   10495   /* The initial block in the subgraph should be dominated by ENTRY.  */
   10496   ASSERT_EQ (ENTRY_BLOCK_PTR_FOR_FN (fun),
   10497 	     get_immediate_dominator (CDI_DOMINATORS,
   10498 				      subgraph_nodes[0]));
   10499   /* Every other block in the subgraph should be dominated by the
   10500      initial block.  */
   10501   for (int i = 1; i < n; i++)
   10502     ASSERT_EQ (subgraph_nodes[0],
   10503 	       get_immediate_dominator (CDI_DOMINATORS,
   10504 					subgraph_nodes[i]));
   10505   free_dominance_info (CDI_DOMINATORS);
   10506 
   10507   /* Similarly for post-dominance.  */
   10508   calculate_dominance_info (CDI_POST_DOMINATORS);
   10509   /* The initial block in the subgraph should be postdominated by EXIT.  */
   10510   ASSERT_EQ (EXIT_BLOCK_PTR_FOR_FN (fun),
   10511 	     get_immediate_dominator (CDI_POST_DOMINATORS,
   10512 				      subgraph_nodes[0]));
   10513   /* Every other block in the subgraph should be postdominated by the
   10514      initial block, since that leads to EXIT.  */
   10515   for (int i = 1; i < n; i++)
   10516     ASSERT_EQ (subgraph_nodes[0],
   10517 	       get_immediate_dominator (CDI_POST_DOMINATORS,
   10518 					subgraph_nodes[i]));
   10519   free_dominance_info (CDI_POST_DOMINATORS);
   10520 
   10521   pop_cfun ();
   10522 }
   10523 
   10524 /* Run all of the selftests within this file.  */
   10525 
   10526 void
   10527 tree_cfg_cc_tests ()
   10528 {
   10529   test_linear_chain ();
   10530   test_diamond ();
   10531   test_fully_connected ();
   10532 }
   10533 
   10534 } // namespace selftest
   10535 
   10536 /* TODO: test the dominator/postdominator logic with various graphs/nodes:
   10537    - loop
   10538    - nested loops
   10539    - switch statement (a block with many out-edges)
   10540    - something that jumps to itself
   10541    - etc  */
   10542 
   10543 #endif /* CHECKING_P */
   10544