LCOV - code coverage report
Current view: top level - gcc - tree-cfg.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 82.7 % 5032 4160
Test Date: 2025-06-21 16:26:05 Functions: 89.5 % 209 187
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

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

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.