LCOV - code coverage report
Current view: top level - gcc - tree-inline.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 88.5 % 3223 2851
Test Date: 2024-04-20 14:03:02 Functions: 94.4 % 89 84
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Tree inlining.
       2                 :             :    Copyright (C) 2001-2024 Free Software Foundation, Inc.
       3                 :             :    Contributed by Alexandre Oliva <aoliva@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 "tree-pretty-print.h"
      34                 :             : #include "diagnostic-core.h"
      35                 :             : #include "gimple-predict.h"
      36                 :             : #include "fold-const.h"
      37                 :             : #include "stor-layout.h"
      38                 :             : #include "calls.h"
      39                 :             : #include "tree-inline.h"
      40                 :             : #include "langhooks.h"
      41                 :             : #include "cfganal.h"
      42                 :             : #include "tree-iterator.h"
      43                 :             : #include "intl.h"
      44                 :             : #include "gimple-iterator.h"
      45                 :             : #include "gimple-fold.h"
      46                 :             : #include "tree-eh.h"
      47                 :             : #include "gimplify.h"
      48                 :             : #include "gimplify-me.h"
      49                 :             : #include "gimple-walk.h"
      50                 :             : #include "tree-cfg.h"
      51                 :             : #include "tree-into-ssa.h"
      52                 :             : #include "tree-dfa.h"
      53                 :             : #include "tree-ssa.h"
      54                 :             : #include "except.h"
      55                 :             : #include "debug.h"
      56                 :             : #include "value-prof.h"
      57                 :             : #include "cfgloop.h"
      58                 :             : #include "builtins.h"
      59                 :             : #include "stringpool.h"
      60                 :             : #include "attribs.h"
      61                 :             : #include "sreal.h"
      62                 :             : #include "tree-cfgcleanup.h"
      63                 :             : #include "tree-ssa-live.h"
      64                 :             : #include "alloc-pool.h"
      65                 :             : #include "symbol-summary.h"
      66                 :             : #include "symtab-thunks.h"
      67                 :             : #include "symtab-clones.h"
      68                 :             : 
      69                 :             : /* I'm not real happy about this, but we need to handle gimple and
      70                 :             :    non-gimple trees.  */
      71                 :             : 
      72                 :             : /* Inlining, Cloning, Versioning, Parallelization
      73                 :             : 
      74                 :             :    Inlining: a function body is duplicated, but the PARM_DECLs are
      75                 :             :    remapped into VAR_DECLs, and non-void RETURN_EXPRs become
      76                 :             :    MODIFY_EXPRs that store to a dedicated returned-value variable.
      77                 :             :    The duplicated eh_region info of the copy will later be appended
      78                 :             :    to the info for the caller; the eh_region info in copied throwing
      79                 :             :    statements and RESX statements are adjusted accordingly.
      80                 :             : 
      81                 :             :    Cloning: (only in C++) We have one body for a con/de/structor, and
      82                 :             :    multiple function decls, each with a unique parameter list.
      83                 :             :    Duplicate the body, using the given splay tree; some parameters
      84                 :             :    will become constants (like 0 or 1).
      85                 :             : 
      86                 :             :    Versioning: a function body is duplicated and the result is a new
      87                 :             :    function rather than into blocks of an existing function as with
      88                 :             :    inlining.  Some parameters will become constants.
      89                 :             : 
      90                 :             :    Parallelization: a region of a function is duplicated resulting in
      91                 :             :    a new function.  Variables may be replaced with complex expressions
      92                 :             :    to enable shared variable semantics.
      93                 :             : 
      94                 :             :    All of these will simultaneously lookup any callgraph edges.  If
      95                 :             :    we're going to inline the duplicated function body, and the given
      96                 :             :    function has some cloned callgraph nodes (one for each place this
      97                 :             :    function will be inlined) those callgraph edges will be duplicated.
      98                 :             :    If we're cloning the body, those callgraph edges will be
      99                 :             :    updated to point into the new body.  (Note that the original
     100                 :             :    callgraph node and edge list will not be altered.)
     101                 :             : 
     102                 :             :    See the CALL_EXPR handling case in copy_tree_body_r ().  */
     103                 :             : 
     104                 :             : /* To Do:
     105                 :             : 
     106                 :             :    o In order to make inlining-on-trees work, we pessimized
     107                 :             :      function-local static constants.  In particular, they are now
     108                 :             :      always output, even when not addressed.  Fix this by treating
     109                 :             :      function-local static constants just like global static
     110                 :             :      constants; the back-end already knows not to output them if they
     111                 :             :      are not needed.
     112                 :             : 
     113                 :             :    o Provide heuristics to clamp inlining of recursive template
     114                 :             :      calls?  */
     115                 :             : 
     116                 :             : 
     117                 :             : /* Weights that estimate_num_insns uses to estimate the size of the
     118                 :             :    produced code.  */
     119                 :             : 
     120                 :             : eni_weights eni_size_weights;
     121                 :             : 
     122                 :             : /* Weights that estimate_num_insns uses to estimate the time necessary
     123                 :             :    to execute the produced code.  */
     124                 :             : 
     125                 :             : eni_weights eni_time_weights;
     126                 :             : 
     127                 :             : /* Prototypes.  */
     128                 :             : 
     129                 :             : static tree declare_return_variable (copy_body_data *, tree, tree,
     130                 :             :                                      basic_block);
     131                 :             : static void remap_block (tree *, copy_body_data *);
     132                 :             : static void copy_bind_expr (tree *, int *, copy_body_data *);
     133                 :             : static void declare_inline_vars (tree, tree);
     134                 :             : static void remap_save_expr (tree *, hash_map<tree, tree> *, int *);
     135                 :             : static void prepend_lexical_block (tree current_block, tree new_block);
     136                 :             : static tree copy_result_decl_to_var (tree, copy_body_data *);
     137                 :             : static tree copy_decl_maybe_to_var (tree, copy_body_data *);
     138                 :             : static gimple_seq remap_gimple_stmt (gimple *, copy_body_data *);
     139                 :             : static void insert_init_stmt (copy_body_data *, basic_block, gimple *);
     140                 :             : 
     141                 :             : /* Insert a tree->tree mapping for ID.  Despite the name suggests
     142                 :             :    that the trees should be variables, it is used for more than that.  */
     143                 :             : 
     144                 :             : void
     145                 :   374490789 : insert_decl_map (copy_body_data *id, tree key, tree value)
     146                 :             : {
     147                 :   374490789 :   id->decl_map->put (key, value);
     148                 :             : 
     149                 :             :   /* Always insert an identity map as well.  If we see this same new
     150                 :             :      node again, we won't want to duplicate it a second time.  */
     151                 :   374490789 :   if (key != value && value)
     152                 :   122209193 :     id->decl_map->put (value, value);
     153                 :   374490789 : }
     154                 :             : 
     155                 :             : /* If nonzero, we're remapping the contents of inlined debug
     156                 :             :    statements.  If negative, an error has occurred, such as a
     157                 :             :    reference to a variable that isn't available in the inlined
     158                 :             :    context.  */
     159                 :             : static int processing_debug_stmt = 0;
     160                 :             : 
     161                 :             : /* Construct new SSA name for old NAME. ID is the inline context.  */
     162                 :             : 
     163                 :             : static tree
     164                 :    53046766 : remap_ssa_name (tree name, copy_body_data *id)
     165                 :             : {
     166                 :    53046766 :   tree new_tree, var;
     167                 :    53046766 :   tree *n;
     168                 :             : 
     169                 :    53046766 :   gcc_assert (TREE_CODE (name) == SSA_NAME);
     170                 :             : 
     171                 :    53046766 :   n = id->decl_map->get (name);
     172                 :    53046766 :   if (n)
     173                 :             :     {
     174                 :             :       /* When we perform edge redirection as part of CFG copy, IPA-SRA can
     175                 :             :          remove an unused LHS from a call statement.  Such LHS can however
     176                 :             :          still appear in debug statements, but their value is lost in this
     177                 :             :          function and we do not want to map them.  */
     178                 :    38427190 :       if (id->killed_new_ssa_names
     179                 :    38427190 :           && id->killed_new_ssa_names->contains (*n))
     180                 :             :         {
     181                 :         917 :           gcc_assert (processing_debug_stmt);
     182                 :         917 :           processing_debug_stmt = -1;
     183                 :         917 :           return name;
     184                 :             :         }
     185                 :             : 
     186                 :    38426273 :       return unshare_expr (*n);
     187                 :             :     }
     188                 :             : 
     189                 :    14619576 :   if (processing_debug_stmt)
     190                 :             :     {
     191                 :       82701 :       if (SSA_NAME_IS_DEFAULT_DEF (name)
     192                 :       82658 :           && TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL
     193                 :       82609 :           && id->entry_bb == NULL
     194                 :      165309 :           && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
     195                 :             :         {
     196                 :       82608 :           gimple *def_temp;
     197                 :       82608 :           gimple_stmt_iterator gsi;
     198                 :       82608 :           tree val = SSA_NAME_VAR (name);
     199                 :             : 
     200                 :       82608 :           n = id->decl_map->get (val);
     201                 :       82608 :           if (n != NULL)
     202                 :       82608 :             val = *n;
     203                 :       82608 :           if (TREE_CODE (val) != PARM_DECL
     204                 :       82608 :               && !(VAR_P (val) && DECL_ABSTRACT_ORIGIN (val)))
     205                 :             :             {
     206                 :           0 :               processing_debug_stmt = -1;
     207                 :           0 :               return name;
     208                 :             :             }
     209                 :       82608 :           n = id->decl_map->get (val);
     210                 :       82608 :           if (n && TREE_CODE (*n) == DEBUG_EXPR_DECL)
     211                 :             :             return *n;
     212                 :       30295 :           tree vexpr = build_debug_expr_decl (TREE_TYPE (name));
     213                 :             :           /* FIXME: Is setting the mode really necessary? */
     214                 :       30295 :           SET_DECL_MODE (vexpr, DECL_MODE (SSA_NAME_VAR (name)));
     215                 :       30295 :           def_temp = gimple_build_debug_source_bind (vexpr, val, NULL);
     216                 :       30295 :           gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
     217                 :       30295 :           gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
     218                 :       30295 :           insert_decl_map (id, val, vexpr);
     219                 :       30295 :           return vexpr;
     220                 :             :         }
     221                 :             : 
     222                 :          93 :       processing_debug_stmt = -1;
     223                 :          93 :       return name;
     224                 :             :     }
     225                 :             : 
     226                 :             :   /* Remap anonymous SSA names or SSA names of anonymous decls.  */
     227                 :    14536875 :   var = SSA_NAME_VAR (name);
     228                 :     2922290 :   if (!var
     229                 :     2922290 :       || (!SSA_NAME_IS_DEFAULT_DEF (name)
     230                 :     2512770 :           && VAR_P (var)
     231                 :     2364345 :           && !VAR_DECL_IS_VIRTUAL_OPERAND (var)
     232                 :     2364345 :           && DECL_ARTIFICIAL (var)
     233                 :      430140 :           && DECL_IGNORED_P (var)
     234                 :      144053 :           && !DECL_NAME (var)))
     235                 :             :     {
     236                 :    11618878 :       struct ptr_info_def *pi;
     237                 :    11618878 :       new_tree = make_ssa_name (remap_type (TREE_TYPE (name), id));
     238                 :    11618878 :       if (!var && SSA_NAME_IDENTIFIER (name))
     239                 :     1654416 :         SET_SSA_NAME_VAR_OR_IDENTIFIER (new_tree, SSA_NAME_IDENTIFIER (name));
     240                 :    11618878 :       insert_decl_map (id, name, new_tree);
     241                 :    23237756 :       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_tree)
     242                 :    11618878 :         = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name);
     243                 :             :       /* At least IPA points-to info can be directly transferred.  */
     244                 :    11618878 :       if (id->src_cfun->gimple_df
     245                 :    11618878 :           && id->src_cfun->gimple_df->ipa_pta
     246                 :       13049 :           && POINTER_TYPE_P (TREE_TYPE (name))
     247                 :        2003 :           && (pi = SSA_NAME_PTR_INFO (name))
     248                 :    11620876 :           && !pi->pt.anything)
     249                 :             :         {
     250                 :        1974 :           struct ptr_info_def *new_pi = get_ptr_info (new_tree);
     251                 :        1974 :           new_pi->pt = pi->pt;
     252                 :             :         }
     253                 :             :       /* So can range-info.  */
     254                 :    19325890 :       if (!POINTER_TYPE_P (TREE_TYPE (name))
     255                 :    18913810 :           && SSA_NAME_RANGE_INFO (name))
     256                 :     2367256 :         duplicate_ssa_name_range_info (new_tree, name);
     257                 :    11618878 :       return new_tree;
     258                 :             :     }
     259                 :             : 
     260                 :             :   /* Do not set DEF_STMT yet as statement is not copied yet. We do that
     261                 :             :      in copy_bb.  */
     262                 :     2917997 :   new_tree = remap_decl (var, id);
     263                 :             : 
     264                 :             :   /* We might've substituted constant or another SSA_NAME for
     265                 :             :      the variable.
     266                 :             : 
     267                 :             :      Replace the SSA name representing RESULT_DECL by variable during
     268                 :             :      inlining:  this saves us from need to introduce PHI node in a case
     269                 :             :      return value is just partly initialized.  */
     270                 :      310575 :   if ((VAR_P (new_tree) || TREE_CODE (new_tree) == PARM_DECL)
     271                 :     3228572 :       && (!SSA_NAME_VAR (name)
     272                 :     2917997 :           || TREE_CODE (SSA_NAME_VAR (name)) != RESULT_DECL
     273                 :           0 :           || !id->transform_return_to_modify))
     274                 :             :     {
     275                 :     2917997 :       struct ptr_info_def *pi;
     276                 :     2917997 :       new_tree = make_ssa_name (new_tree);
     277                 :     2917997 :       insert_decl_map (id, name, new_tree);
     278                 :     5835994 :       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_tree)
     279                 :     2917997 :         = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name);
     280                 :             :       /* At least IPA points-to info can be directly transferred.  */
     281                 :     2917997 :       if (id->src_cfun->gimple_df
     282                 :     2917997 :           && id->src_cfun->gimple_df->ipa_pta
     283                 :        2066 :           && POINTER_TYPE_P (TREE_TYPE (name))
     284                 :         253 :           && (pi = SSA_NAME_PTR_INFO (name))
     285                 :     2918247 :           && !pi->pt.anything)
     286                 :             :         {
     287                 :         250 :           struct ptr_info_def *new_pi = get_ptr_info (new_tree);
     288                 :         250 :           new_pi->pt = pi->pt;
     289                 :             :         }
     290                 :             :       /* So can range-info.  */
     291                 :     5133260 :       if (!POINTER_TYPE_P (TREE_TYPE (name))
     292                 :     5070367 :           && SSA_NAME_RANGE_INFO (name))
     293                 :      736280 :         duplicate_ssa_name_range_info (new_tree, name);
     294                 :     2917997 :       if (SSA_NAME_IS_DEFAULT_DEF (name))
     295                 :             :         {
     296                 :             :           /* By inlining function having uninitialized variable, we might
     297                 :             :              extend the lifetime (variable might get reused).  This cause
     298                 :             :              ICE in the case we end up extending lifetime of SSA name across
     299                 :             :              abnormal edge, but also increase register pressure.
     300                 :             : 
     301                 :             :              We simply initialize all uninitialized vars by 0 except
     302                 :             :              for case we are inlining to very first BB.  We can avoid
     303                 :             :              this for all BBs that are not inside strongly connected
     304                 :             :              regions of the CFG, but this is expensive to test.  */
     305                 :      409520 :           if (id->entry_bb
     306                 :      122268 :               && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name)
     307                 :           0 :               && (!SSA_NAME_VAR (name)
     308                 :           0 :                   || TREE_CODE (SSA_NAME_VAR (name)) != PARM_DECL)
     309                 :      409520 :               && (id->entry_bb != EDGE_SUCC (ENTRY_BLOCK_PTR_FOR_FN (cfun),
     310                 :           0 :                                              0)->dest
     311                 :           0 :                   || EDGE_COUNT (id->entry_bb->preds) != 1))
     312                 :             :             {
     313                 :           0 :               gimple_stmt_iterator gsi = gsi_last_bb (id->entry_bb);
     314                 :           0 :               gimple *init_stmt;
     315                 :           0 :               tree zero = build_zero_cst (TREE_TYPE (new_tree));
     316                 :             : 
     317                 :           0 :               init_stmt = gimple_build_assign (new_tree, zero);
     318                 :           0 :               gsi_insert_after (&gsi, init_stmt, GSI_NEW_STMT);
     319                 :           0 :               SSA_NAME_IS_DEFAULT_DEF (new_tree) = 0;
     320                 :             :             }
     321                 :             :           else
     322                 :             :             {
     323                 :      409520 :               SSA_NAME_DEF_STMT (new_tree) = gimple_build_nop ();
     324                 :      409520 :               set_ssa_default_def (cfun, SSA_NAME_VAR (new_tree), new_tree);
     325                 :             :             }
     326                 :             :         }
     327                 :             :     }
     328                 :             :   else
     329                 :           0 :     insert_decl_map (id, name, new_tree);
     330                 :             :   return new_tree;
     331                 :             : }
     332                 :             : 
     333                 :             : /* Remap DECL during the copying of the BLOCK tree for the function.  */
     334                 :             : 
     335                 :             : tree
     336                 :   183102671 : remap_decl (tree decl, copy_body_data *id)
     337                 :             : {
     338                 :   183102671 :   tree *n;
     339                 :             : 
     340                 :             :   /* We only remap local variables in the current function.  */
     341                 :             : 
     342                 :             :   /* See if we have remapped this declaration.  */
     343                 :             : 
     344                 :   183102671 :   n = id->decl_map->get (decl);
     345                 :             : 
     346                 :   183102671 :   if (!n && processing_debug_stmt)
     347                 :             :     {
     348                 :      543760 :       processing_debug_stmt = -1;
     349                 :      543760 :       return decl;
     350                 :             :     }
     351                 :             : 
     352                 :             :   /* When remapping a type within copy_gimple_seq_and_replace_locals, all
     353                 :             :      necessary DECLs have already been remapped and we do not want to duplicate
     354                 :             :      a decl coming from outside of the sequence we are copying.  */
     355                 :    63981125 :   if (!n
     356                 :    63981125 :       && id->prevent_decl_creation_for_types
     357                 :           0 :       && id->remapping_type_depth > 0
     358                 :           0 :       && (VAR_P (decl) || TREE_CODE (decl) == PARM_DECL))
     359                 :             :     return decl;
     360                 :             : 
     361                 :             :   /* If we didn't already have an equivalent for this declaration, create one
     362                 :             :      now.  */
     363                 :   182558911 :   if (!n)
     364                 :             :     {
     365                 :             :       /* Make a copy of the variable or label.  */
     366                 :    63981125 :       tree t = id->copy_decl (decl, id);
     367                 :             : 
     368                 :             :       /* Remember it, so that if we encounter this local entity again
     369                 :             :          we can reuse this copy.  Do this early because remap_type may
     370                 :             :          need this decl for TYPE_STUB_DECL.  */
     371                 :    63981125 :       insert_decl_map (id, decl, t);
     372                 :             : 
     373                 :    63981125 :       if (!DECL_P (t) || t == decl)
     374                 :             :         return t;
     375                 :             : 
     376                 :             :       /* Remap types, if necessary.  */
     377                 :    62761995 :       TREE_TYPE (t) = remap_type (TREE_TYPE (t), id);
     378                 :    62761995 :       if (TREE_CODE (t) == TYPE_DECL)
     379                 :             :         {
     380                 :      706437 :           DECL_ORIGINAL_TYPE (t) = remap_type (DECL_ORIGINAL_TYPE (t), id);
     381                 :             : 
     382                 :             :           /* Preserve the invariant that DECL_ORIGINAL_TYPE != TREE_TYPE,
     383                 :             :              which is enforced in gen_typedef_die when DECL_ABSTRACT_ORIGIN
     384                 :             :              is not set on the TYPE_DECL, for example in LTO mode.  */
     385                 :      706437 :           if (DECL_ORIGINAL_TYPE (t) == TREE_TYPE (t))
     386                 :             :             {
     387                 :          10 :               tree x = build_variant_type_copy (TREE_TYPE (t));
     388                 :          10 :               TYPE_STUB_DECL (x) = TYPE_STUB_DECL (TREE_TYPE (t));
     389                 :          10 :               TYPE_NAME (x) = TYPE_NAME (TREE_TYPE (t));
     390                 :          10 :               DECL_ORIGINAL_TYPE (t) = x;
     391                 :             :             }
     392                 :             :         }
     393                 :             : 
     394                 :             :       /* Remap sizes as necessary.  */
     395                 :    62761995 :       walk_tree (&DECL_SIZE (t), copy_tree_body_r, id, NULL);
     396                 :    62761995 :       walk_tree (&DECL_SIZE_UNIT (t), copy_tree_body_r, id, NULL);
     397                 :             : 
     398                 :             :       /* If fields, do likewise for offset and qualifier.  */
     399                 :    62761995 :       if (TREE_CODE (t) == FIELD_DECL)
     400                 :             :         {
     401                 :         739 :           walk_tree (&DECL_FIELD_OFFSET (t), copy_tree_body_r, id, NULL);
     402                 :         739 :           if (TREE_CODE (DECL_CONTEXT (t)) == QUAL_UNION_TYPE)
     403                 :           0 :             walk_tree (&DECL_QUALIFIER (t), copy_tree_body_r, id, NULL);
     404                 :             :         }
     405                 :             : 
     406                 :    62761995 :       return t;
     407                 :             :     }
     408                 :             : 
     409                 :   118577786 :   if (id->do_not_unshare)
     410                 :    56791068 :     return *n;
     411                 :             :   else
     412                 :    61786718 :     return unshare_expr (*n);
     413                 :             : }
     414                 :             : 
     415                 :             : static tree
     416                 :       72902 : remap_type_1 (tree type, copy_body_data *id)
     417                 :             : {
     418                 :       72902 :   tree new_tree, t;
     419                 :             : 
     420                 :             :   /* We do need a copy.  build and register it now.  If this is a pointer or
     421                 :             :      reference type, remap the designated type and make a new pointer or
     422                 :             :      reference type.  */
     423                 :       72902 :   if (TREE_CODE (type) == POINTER_TYPE)
     424                 :             :     {
     425                 :       19394 :       new_tree = build_pointer_type_for_mode (remap_type (TREE_TYPE (type), id),
     426                 :       19394 :                                          TYPE_MODE (type),
     427                 :       19394 :                                          TYPE_REF_CAN_ALIAS_ALL (type));
     428                 :       19394 :       if (TYPE_ATTRIBUTES (type) || TYPE_QUALS (type))
     429                 :        9454 :         new_tree = build_type_attribute_qual_variant (new_tree,
     430                 :        9454 :                                                       TYPE_ATTRIBUTES (type),
     431                 :        9454 :                                                       TYPE_QUALS (type));
     432                 :       19394 :       insert_decl_map (id, type, new_tree);
     433                 :       19394 :       return new_tree;
     434                 :             :     }
     435                 :       53508 :   else if (TREE_CODE (type) == REFERENCE_TYPE)
     436                 :             :     {
     437                 :        6330 :       new_tree = build_reference_type_for_mode (remap_type (TREE_TYPE (type), id),
     438                 :        6330 :                                             TYPE_MODE (type),
     439                 :        6330 :                                             TYPE_REF_CAN_ALIAS_ALL (type));
     440                 :        6330 :       if (TYPE_ATTRIBUTES (type) || TYPE_QUALS (type))
     441                 :        4441 :         new_tree = build_type_attribute_qual_variant (new_tree,
     442                 :        4441 :                                                       TYPE_ATTRIBUTES (type),
     443                 :        4441 :                                                       TYPE_QUALS (type));
     444                 :        6330 :       insert_decl_map (id, type, new_tree);
     445                 :        6330 :       return new_tree;
     446                 :             :     }
     447                 :             :   else
     448                 :       47178 :     new_tree = copy_node (type);
     449                 :             : 
     450                 :       47178 :   insert_decl_map (id, type, new_tree);
     451                 :             : 
     452                 :             :   /* This is a new type, not a copy of an old type.  Need to reassociate
     453                 :             :      variants.  We can handle everything except the main variant lazily.  */
     454                 :       47178 :   t = TYPE_MAIN_VARIANT (type);
     455                 :       47178 :   if (type != t)
     456                 :             :     {
     457                 :          56 :       t = remap_type (t, id);
     458                 :          56 :       TYPE_MAIN_VARIANT (new_tree) = t;
     459                 :          56 :       TYPE_NEXT_VARIANT (new_tree) = TYPE_NEXT_VARIANT (t);
     460                 :          56 :       TYPE_NEXT_VARIANT (t) = new_tree;
     461                 :             :     }
     462                 :             :   else
     463                 :             :     {
     464                 :       47122 :       TYPE_MAIN_VARIANT (new_tree) = new_tree;
     465                 :       47122 :       TYPE_NEXT_VARIANT (new_tree) = NULL;
     466                 :             :     }
     467                 :             : 
     468                 :       47178 :   if (TYPE_STUB_DECL (type))
     469                 :         167 :     TYPE_STUB_DECL (new_tree) = remap_decl (TYPE_STUB_DECL (type), id);
     470                 :             : 
     471                 :             :   /* Lazily create pointer and reference types.  */
     472                 :       47178 :   TYPE_POINTER_TO (new_tree) = NULL;
     473                 :       47178 :   TYPE_REFERENCE_TO (new_tree) = NULL;
     474                 :             : 
     475                 :             :   /* Copy all types that may contain references to local variables; be sure to
     476                 :             :      preserve sharing in between type and its main variant when possible.  */
     477                 :       47178 :   switch (TREE_CODE (new_tree))
     478                 :             :     {
     479                 :       22783 :     case INTEGER_TYPE:
     480                 :       22783 :     case REAL_TYPE:
     481                 :       22783 :     case FIXED_POINT_TYPE:
     482                 :       22783 :     case ENUMERAL_TYPE:
     483                 :       22783 :     case BOOLEAN_TYPE:
     484                 :       22783 :       if (TYPE_MAIN_VARIANT (new_tree) != new_tree)
     485                 :             :         {
     486                 :           0 :           gcc_checking_assert (TYPE_MIN_VALUE (type) == TYPE_MIN_VALUE (TYPE_MAIN_VARIANT (type)));
     487                 :           0 :           gcc_checking_assert (TYPE_MAX_VALUE (type) == TYPE_MAX_VALUE (TYPE_MAIN_VARIANT (type)));
     488                 :             : 
     489                 :           0 :           TYPE_MIN_VALUE (new_tree) = TYPE_MIN_VALUE (TYPE_MAIN_VARIANT (new_tree));
     490                 :           0 :           TYPE_MAX_VALUE (new_tree) = TYPE_MAX_VALUE (TYPE_MAIN_VARIANT (new_tree));
     491                 :             :         }
     492                 :             :       else
     493                 :             :         {
     494                 :       22783 :           t = TYPE_MIN_VALUE (new_tree);
     495                 :       22783 :           if (t && TREE_CODE (t) != INTEGER_CST)
     496                 :           0 :             walk_tree (&TYPE_MIN_VALUE (new_tree), copy_tree_body_r, id, NULL);
     497                 :             : 
     498                 :       22783 :           t = TYPE_MAX_VALUE (new_tree);
     499                 :       22783 :           if (t && TREE_CODE (t) != INTEGER_CST)
     500                 :       22358 :             walk_tree (&TYPE_MAX_VALUE (new_tree), copy_tree_body_r, id, NULL);
     501                 :             :         }
     502                 :             :       return new_tree;
     503                 :             : 
     504                 :          18 :     case FUNCTION_TYPE:
     505                 :          18 :       if (TYPE_MAIN_VARIANT (new_tree) != new_tree
     506                 :          18 :           && TREE_TYPE (type) == TREE_TYPE (TYPE_MAIN_VARIANT (type)))
     507                 :           0 :         TREE_TYPE (new_tree) = TREE_TYPE (TYPE_MAIN_VARIANT (new_tree));
     508                 :             :       else
     509                 :          18 :         TREE_TYPE (new_tree) = remap_type (TREE_TYPE (new_tree), id);
     510                 :          18 :       if (TYPE_MAIN_VARIANT (new_tree) != new_tree
     511                 :          18 :           && TYPE_ARG_TYPES (type) == TYPE_ARG_TYPES (TYPE_MAIN_VARIANT (type)))
     512                 :           0 :         TYPE_ARG_TYPES (new_tree) = TYPE_ARG_TYPES (TYPE_MAIN_VARIANT (new_tree));
     513                 :             :       else
     514                 :          18 :         walk_tree (&TYPE_ARG_TYPES (new_tree), copy_tree_body_r, id, NULL);
     515                 :             :       return new_tree;
     516                 :             : 
     517                 :       24165 :     case ARRAY_TYPE:
     518                 :       24165 :       if (TYPE_MAIN_VARIANT (new_tree) != new_tree
     519                 :       24165 :           && TREE_TYPE (type) == TREE_TYPE (TYPE_MAIN_VARIANT (type)))
     520                 :          28 :         TREE_TYPE (new_tree) = TREE_TYPE (TYPE_MAIN_VARIANT (new_tree));
     521                 :             :       else
     522                 :       24137 :         TREE_TYPE (new_tree) = remap_type (TREE_TYPE (new_tree), id);
     523                 :             : 
     524                 :       24165 :       if (TYPE_MAIN_VARIANT (new_tree) != new_tree)
     525                 :             :         {
     526                 :          39 :           gcc_checking_assert (TYPE_DOMAIN (type)
     527                 :             :                                == TYPE_DOMAIN (TYPE_MAIN_VARIANT (type)));
     528                 :          39 :           TYPE_DOMAIN (new_tree) = TYPE_DOMAIN (TYPE_MAIN_VARIANT (new_tree));
     529                 :             :         }
     530                 :             :       else
     531                 :             :         {
     532                 :       24126 :           TYPE_DOMAIN (new_tree) = remap_type (TYPE_DOMAIN (new_tree), id);
     533                 :             :           /* For array bounds where we have decided not to copy over the bounds
     534                 :             :              variable which isn't used in OpenMP/OpenACC region, change them to
     535                 :             :              an uninitialized VAR_DECL temporary.  */
     536                 :       24126 :           if (id->adjust_array_error_bounds
     537                 :        3404 :               && TYPE_DOMAIN (new_tree)
     538                 :        3404 :               && TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) == error_mark_node
     539                 :       26793 :               && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != error_mark_node)
     540                 :             :             {
     541                 :        2667 :               tree v = create_tmp_var (TREE_TYPE (TYPE_DOMAIN (new_tree)));
     542                 :        2667 :               DECL_ATTRIBUTES (v)
     543                 :        2667 :                 = tree_cons (get_identifier ("omp dummy var"), NULL_TREE,
     544                 :        2667 :                              DECL_ATTRIBUTES (v));
     545                 :        2667 :               TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) = v;
     546                 :             :             }
     547                 :             :         }
     548                 :             :       break;
     549                 :             : 
     550                 :         212 :     case RECORD_TYPE:
     551                 :         212 :     case UNION_TYPE:
     552                 :         212 :     case QUAL_UNION_TYPE:
     553                 :         212 :       if (TYPE_MAIN_VARIANT (type) != type
     554                 :         212 :           && TYPE_FIELDS (type) == TYPE_FIELDS (TYPE_MAIN_VARIANT (type)))
     555                 :          17 :         TYPE_FIELDS (new_tree) = TYPE_FIELDS (TYPE_MAIN_VARIANT (new_tree));
     556                 :             :       else
     557                 :             :         {
     558                 :         195 :           tree f, nf = NULL;
     559                 :             : 
     560                 :         934 :           for (f = TYPE_FIELDS (new_tree); f ; f = DECL_CHAIN (f))
     561                 :             :             {
     562                 :         739 :               t = remap_decl (f, id);
     563                 :         739 :               DECL_CONTEXT (t) = new_tree;
     564                 :         739 :               DECL_CHAIN (t) = nf;
     565                 :         739 :               nf = t;
     566                 :             :             }
     567                 :         195 :           TYPE_FIELDS (new_tree) = nreverse (nf);
     568                 :             :         }
     569                 :             :       break;
     570                 :             : 
     571                 :           0 :     case OFFSET_TYPE:
     572                 :           0 :     default:
     573                 :             :       /* Shouldn't have been thought variable sized.  */
     574                 :           0 :       gcc_unreachable ();
     575                 :             :     }
     576                 :             : 
     577                 :             :   /* All variants of type share the same size, so use the already remaped data.  */
     578                 :       24377 :   if (TYPE_MAIN_VARIANT (new_tree) != new_tree)
     579                 :             :     {
     580                 :          56 :       tree s = TYPE_SIZE (type);
     581                 :          56 :       tree mvs = TYPE_SIZE (TYPE_MAIN_VARIANT (type));
     582                 :          56 :       tree su = TYPE_SIZE_UNIT (type);
     583                 :          56 :       tree mvsu = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type));
     584                 :          56 :       gcc_checking_assert ((TREE_CODE (s) == PLACEHOLDER_EXPR
     585                 :             :                             && (TREE_CODE (mvs) == PLACEHOLDER_EXPR))
     586                 :             :                            || s == mvs);
     587                 :          56 :       gcc_checking_assert ((TREE_CODE (su) == PLACEHOLDER_EXPR
     588                 :             :                             && (TREE_CODE (mvsu) == PLACEHOLDER_EXPR))
     589                 :             :                            || su == mvsu);
     590                 :          56 :       TYPE_SIZE (new_tree) = TYPE_SIZE (TYPE_MAIN_VARIANT (new_tree));
     591                 :          56 :       TYPE_SIZE_UNIT (new_tree) = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (new_tree));
     592                 :             :     }
     593                 :             :   else
     594                 :             :     {
     595                 :       24321 :       walk_tree (&TYPE_SIZE (new_tree), copy_tree_body_r, id, NULL);
     596                 :       24321 :       walk_tree (&TYPE_SIZE_UNIT (new_tree), copy_tree_body_r, id, NULL);
     597                 :             :     }
     598                 :             : 
     599                 :             :   return new_tree;
     600                 :             : }
     601                 :             : 
     602                 :             : /* Helper function for remap_type_2, called through walk_tree.  */
     603                 :             : 
     604                 :             : static tree
     605                 :       28406 : remap_type_3 (tree *tp, int *walk_subtrees, void *data)
     606                 :             : {
     607                 :       28406 :   copy_body_data *id = (copy_body_data *) data;
     608                 :             : 
     609                 :       28406 :   if (TYPE_P (*tp))
     610                 :           0 :     *walk_subtrees = 0;
     611                 :             : 
     612                 :       28406 :   else if (DECL_P (*tp) && remap_decl (*tp, id) != *tp)
     613                 :             :     return *tp;
     614                 :             : 
     615                 :             :   return NULL_TREE;
     616                 :             : }
     617                 :             : 
     618                 :             : /* Return true if TYPE needs to be remapped because remap_decl on any
     619                 :             :    needed embedded decl returns something other than that decl.  */
     620                 :             : 
     621                 :             : static bool
     622                 :       48720 : remap_type_2 (tree type, copy_body_data *id)
     623                 :             : {
     624                 :       58673 :   tree t;
     625                 :             : 
     626                 :             : #define RETURN_TRUE_IF_VAR(T) \
     627                 :             :   do                                                            \
     628                 :             :     {                                                           \
     629                 :             :       tree _t = (T);                                            \
     630                 :             :       if (_t)                                                   \
     631                 :             :         {                                                       \
     632                 :             :           if (DECL_P (_t) && remap_decl (_t, id) != _t)         \
     633                 :             :             return true;                                        \
     634                 :             :           if (!TYPE_SIZES_GIMPLIFIED (type)                     \
     635                 :             :               && walk_tree (&_t, remap_type_3, id, NULL))   \
     636                 :             :             return true;                                        \
     637                 :             :         }                                                       \
     638                 :             :     }                                                           \
     639                 :             :   while (0)
     640                 :             : 
     641                 :       58673 :   switch (TREE_CODE (type))
     642                 :             :     {
     643                 :        9953 :     case POINTER_TYPE:
     644                 :        9953 :     case REFERENCE_TYPE:
     645                 :        9953 :     case FUNCTION_TYPE:
     646                 :        9953 :     case METHOD_TYPE:
     647                 :        9953 :       return remap_type_2 (TREE_TYPE (type), id);
     648                 :             : 
     649                 :       32704 :     case INTEGER_TYPE:
     650                 :       32704 :     case REAL_TYPE:
     651                 :       32704 :     case FIXED_POINT_TYPE:
     652                 :       32704 :     case ENUMERAL_TYPE:
     653                 :       32704 :     case BOOLEAN_TYPE:
     654                 :       32704 :       RETURN_TRUE_IF_VAR (TYPE_MIN_VALUE (type));
     655                 :       32704 :       RETURN_TRUE_IF_VAR (TYPE_MAX_VALUE (type));
     656                 :       21865 :       return false;
     657                 :             : 
     658                 :       15549 :     case ARRAY_TYPE:
     659                 :       15549 :       if (remap_type_2 (TREE_TYPE (type), id)
     660                 :       30492 :           || (TYPE_DOMAIN (type) && remap_type_2 (TYPE_DOMAIN (type), id)))
     661                 :        8271 :         return true;
     662                 :             :       break;
     663                 :             : 
     664                 :         353 :     case RECORD_TYPE:
     665                 :         353 :     case UNION_TYPE:
     666                 :         353 :     case QUAL_UNION_TYPE:
     667                 :        3589 :       for (t = TYPE_FIELDS (type); t; t = DECL_CHAIN (t))
     668                 :        3236 :         if (TREE_CODE (t) == FIELD_DECL)
     669                 :             :           {
     670                 :        1222 :             RETURN_TRUE_IF_VAR (DECL_FIELD_OFFSET (t));
     671                 :        1222 :             RETURN_TRUE_IF_VAR (DECL_SIZE (t));
     672                 :        1222 :             RETURN_TRUE_IF_VAR (DECL_SIZE_UNIT (t));
     673                 :        1222 :             if (TREE_CODE (type) == QUAL_UNION_TYPE)
     674                 :           0 :               RETURN_TRUE_IF_VAR (DECL_QUALIFIER (t));
     675                 :             :           }
     676                 :             :       break;
     677                 :             : 
     678                 :             :     default:
     679                 :             :       return false;
     680                 :             :     }
     681                 :             : 
     682                 :        7631 :   RETURN_TRUE_IF_VAR (TYPE_SIZE (type));
     683                 :        7630 :   RETURN_TRUE_IF_VAR (TYPE_SIZE_UNIT (type));
     684                 :        7025 :   return false;
     685                 :             : #undef RETURN_TRUE_IF_VAR
     686                 :             : }
     687                 :             : 
     688                 :             : tree
     689                 :   739739013 : remap_type (tree type, copy_body_data *id)
     690                 :             : {
     691                 :   739739013 :   tree *node;
     692                 :   739739013 :   tree tmp;
     693                 :             : 
     694                 :   739739013 :   if (type == NULL)
     695                 :             :     return type;
     696                 :             : 
     697                 :             :   /* See if we have remapped this type.  */
     698                 :   739659023 :   node = id->decl_map->get (type);
     699                 :   739659023 :   if (node)
     700                 :   489033446 :     return *node;
     701                 :             : 
     702                 :             :   /* The type only needs remapping if it's variably modified.  */
     703                 :   250625577 :   if (! variably_modified_type_p (type, id->src_fn)
     704                 :             :       /* Don't remap if copy_decl method doesn't always return a new
     705                 :             :          decl and for all embedded decls returns the passed in decl.  */
     706                 :   250625577 :       || (id->dont_remap_vla_if_no_change && !remap_type_2 (type, id)))
     707                 :             :     {
     708                 :   250553162 :       insert_decl_map (id, type, type);
     709                 :   250553162 :       return type;
     710                 :             :     }
     711                 :             : 
     712                 :       72415 :   id->remapping_type_depth++;
     713                 :       72415 :   tmp = remap_type_1 (type, id);
     714                 :       72415 :   id->remapping_type_depth--;
     715                 :             : 
     716                 :       72415 :   return tmp;
     717                 :             : }
     718                 :             : 
     719                 :             : /* Decide if DECL can be put into BLOCK_NONLOCAL_VARs.  */
     720                 :             : 
     721                 :             : static bool
     722                 :    27274875 : can_be_nonlocal (tree decl, copy_body_data *id)
     723                 :             : {
     724                 :             :   /* We cannot duplicate function decls.  */
     725                 :    27274875 :   if (TREE_CODE (decl) == FUNCTION_DECL)
     726                 :             :     return true;
     727                 :             : 
     728                 :             :   /* Local static vars must be non-local or we get multiple declaration
     729                 :             :      problems.  */
     730                 :    27261086 :   if (VAR_P (decl) && !auto_var_in_fn_p (decl, id->src_fn))
     731                 :             :     return true;
     732                 :             : 
     733                 :             :   return false;
     734                 :             : }
     735                 :             : 
     736                 :             : static tree
     737                 :    32513397 : remap_decls (tree decls, vec<tree, va_gc> **nonlocalized_list,
     738                 :             :              copy_body_data *id)
     739                 :             : {
     740                 :    32513397 :   tree old_var;
     741                 :    32513397 :   tree new_decls = NULL_TREE;
     742                 :             : 
     743                 :             :   /* Remap its variables.  */
     744                 :    56160544 :   for (old_var = decls; old_var; old_var = DECL_CHAIN (old_var))
     745                 :             :     {
     746                 :    23647147 :       tree new_var;
     747                 :             : 
     748                 :    23647147 :       if (can_be_nonlocal (old_var, id))
     749                 :             :         {
     750                 :             :           /* We need to add this variable to the local decls as otherwise
     751                 :             :              nothing else will do so.  */
     752                 :       58636 :           if (VAR_P (old_var) && ! DECL_EXTERNAL (old_var) && cfun)
     753                 :       44738 :             add_local_decl (cfun, old_var);
     754                 :       56357 :           if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
     755                 :       37508 :               && !DECL_IGNORED_P (old_var)
     756                 :       96081 :               && nonlocalized_list)
     757                 :       33959 :             vec_safe_push (*nonlocalized_list, old_var);
     758                 :       58636 :           continue;
     759                 :             :         }
     760                 :             : 
     761                 :             :       /* Remap the variable.  */
     762                 :    23588511 :       new_var = remap_decl (old_var, id);
     763                 :             : 
     764                 :             :       /* If we didn't remap this variable, we can't mess with its
     765                 :             :          TREE_CHAIN.  If we remapped this variable to the return slot, it's
     766                 :             :          already declared somewhere else, so don't declare it here.  */
     767                 :             : 
     768                 :    23588511 :       if (new_var == old_var || new_var == id->retvar)
     769                 :             :         ;
     770                 :    21567011 :       else if (!new_var)
     771                 :             :         {
     772                 :           0 :           if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
     773                 :           0 :               && !DECL_IGNORED_P (old_var)
     774                 :           0 :               && nonlocalized_list)
     775                 :           0 :             vec_safe_push (*nonlocalized_list, old_var);
     776                 :             :         }
     777                 :             :       else
     778                 :             :         {
     779                 :    21567011 :           gcc_assert (DECL_P (new_var));
     780                 :    21567011 :           DECL_CHAIN (new_var) = new_decls;
     781                 :    21567011 :           new_decls = new_var;
     782                 :             :  
     783                 :             :           /* Also copy value-expressions.  */
     784                 :    21567011 :           if (VAR_P (new_var) && DECL_HAS_VALUE_EXPR_P (new_var))
     785                 :             :             {
     786                 :      631896 :               tree tem = DECL_VALUE_EXPR (new_var);
     787                 :      631896 :               bool old_regimplify = id->regimplify;
     788                 :      631896 :               id->remapping_type_depth++;
     789                 :      631896 :               walk_tree (&tem, copy_tree_body_r, id, NULL);
     790                 :      631896 :               id->remapping_type_depth--;
     791                 :      631896 :               id->regimplify = old_regimplify;
     792                 :      631896 :               SET_DECL_VALUE_EXPR (new_var, tem);
     793                 :             :             }
     794                 :             :         }
     795                 :             :     }
     796                 :             : 
     797                 :    32513397 :   return nreverse (new_decls);
     798                 :             : }
     799                 :             : 
     800                 :             : /* Copy the BLOCK to contain remapped versions of the variables
     801                 :             :    therein.  And hook the new block into the block-tree.  */
     802                 :             : 
     803                 :             : static void
     804                 :    30626625 : remap_block (tree *block, copy_body_data *id)
     805                 :             : {
     806                 :    30626625 :   tree old_block;
     807                 :    30626625 :   tree new_block;
     808                 :             : 
     809                 :             :   /* Make the new block.  */
     810                 :    30626625 :   old_block = *block;
     811                 :    30626625 :   new_block = make_node (BLOCK);
     812                 :    30626625 :   TREE_USED (new_block) = TREE_USED (old_block);
     813                 :    30626625 :   BLOCK_ABSTRACT_ORIGIN (new_block) = BLOCK_ORIGIN (old_block);
     814                 :    30626625 :   BLOCK_SOURCE_LOCATION (new_block) = BLOCK_SOURCE_LOCATION (old_block);
     815                 :    30626625 :   BLOCK_NONLOCALIZED_VARS (new_block)
     816                 :    30678637 :     = vec_safe_copy (BLOCK_NONLOCALIZED_VARS (old_block));
     817                 :    30626625 :   *block = new_block;
     818                 :             : 
     819                 :             :   /* Remap its variables.  */
     820                 :    61253250 :   BLOCK_VARS (new_block) = remap_decls (BLOCK_VARS (old_block),
     821                 :    30626625 :                                         &BLOCK_NONLOCALIZED_VARS (new_block),
     822                 :             :                                         id);
     823                 :             : 
     824                 :             :   /* Remember the remapped block.  */
     825                 :    30626625 :   insert_decl_map (id, old_block, new_block);
     826                 :    30626625 : }
     827                 :             : 
     828                 :             : /* Copy the whole block tree and root it in id->block.  */
     829                 :             : 
     830                 :             : static tree
     831                 :    19403374 : remap_blocks (tree block, copy_body_data *id)
     832                 :             : {
     833                 :    19403374 :   tree t;
     834                 :    19403374 :   tree new_tree = block;
     835                 :             : 
     836                 :    19403374 :   if (!block)
     837                 :             :     return NULL;
     838                 :             : 
     839                 :    19403374 :   remap_block (&new_tree, id);
     840                 :    19403374 :   gcc_assert (new_tree != block);
     841                 :    34964041 :   for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
     842                 :    15560667 :     prepend_lexical_block (new_tree, remap_blocks (t, id));
     843                 :             :   /* Blocks are in arbitrary order, but make things slightly prettier and do
     844                 :             :      not swap order when producing a copy.  */
     845                 :    19403374 :   BLOCK_SUBBLOCKS (new_tree) = blocks_nreverse (BLOCK_SUBBLOCKS (new_tree));
     846                 :    19403374 :   return new_tree;
     847                 :             : }
     848                 :             : 
     849                 :             : /* Remap the block tree rooted at BLOCK to nothing.  */
     850                 :             : 
     851                 :             : static void
     852                 :       82431 : remap_blocks_to_null (tree block, copy_body_data *id)
     853                 :             : {
     854                 :       82431 :   tree t;
     855                 :       82431 :   insert_decl_map (id, block, NULL_TREE);
     856                 :      139771 :   for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
     857                 :       57340 :     remap_blocks_to_null (t, id);
     858                 :       82431 : }
     859                 :             : 
     860                 :             : /* Remap the location info pointed to by LOCUS.  */
     861                 :             : 
     862                 :             : static location_t
     863                 :    20059903 : remap_location (location_t locus, copy_body_data *id)
     864                 :             : {
     865                 :    20059903 :   if (LOCATION_BLOCK (locus))
     866                 :             :     {
     867                 :    13229271 :       tree *n = id->decl_map->get (LOCATION_BLOCK (locus));
     868                 :    13229271 :       gcc_assert (n);
     869                 :    13229271 :       if (*n)
     870                 :    13185638 :         return set_block (locus, *n);
     871                 :             :     }
     872                 :             : 
     873                 :     6874265 :   locus = LOCATION_LOCUS (locus);
     874                 :             : 
     875                 :     6874265 :   if (locus != UNKNOWN_LOCATION && id->block)
     876                 :          32 :     return set_block (locus, id->block);
     877                 :             : 
     878                 :             :   return locus;
     879                 :             : }
     880                 :             : 
     881                 :             : static void
     882                 :    26380016 : copy_statement_list (tree *tp)
     883                 :             : {
     884                 :    26380016 :   tree_stmt_iterator oi, ni;
     885                 :    26380016 :   tree new_tree;
     886                 :             : 
     887                 :    26380016 :   new_tree = alloc_stmt_list ();
     888                 :    26380016 :   ni = tsi_start (new_tree);
     889                 :    26380016 :   oi = tsi_start (*tp);
     890                 :    26380016 :   TREE_TYPE (new_tree) = TREE_TYPE (*tp);
     891                 :    26380016 :   *tp = new_tree;
     892                 :             : 
     893                 :    80739457 :   for (; !tsi_end_p (oi); tsi_next (&oi))
     894                 :             :     {
     895                 :    54359441 :       tree stmt = tsi_stmt (oi);
     896                 :    54359441 :       if (TREE_CODE (stmt) == STATEMENT_LIST)
     897                 :             :         /* This copy is not redundant; tsi_link_after will smash this
     898                 :             :            STATEMENT_LIST into the end of the one we're building, and we
     899                 :             :            don't want to do that with the original.  */
     900                 :       36815 :         copy_statement_list (&stmt);
     901                 :    54359441 :       tsi_link_after (&ni, stmt, TSI_CONTINUE_LINKING);
     902                 :             :     }
     903                 :    26380016 : }
     904                 :             : 
     905                 :             : static void
     906                 :    11223425 : copy_bind_expr (tree *tp, int *walk_subtrees, copy_body_data *id)
     907                 :             : {
     908                 :    11223425 :   tree block = BIND_EXPR_BLOCK (*tp);
     909                 :             :   /* Copy (and replace) the statement.  */
     910                 :    11223425 :   copy_tree_r (tp, walk_subtrees, NULL);
     911                 :    11223425 :   if (block)
     912                 :             :     {
     913                 :    11222956 :       remap_block (&block, id);
     914                 :    11222956 :       BIND_EXPR_BLOCK (*tp) = block;
     915                 :             :     }
     916                 :             : 
     917                 :    11223425 :   if (BIND_EXPR_VARS (*tp))
     918                 :             :     /* This will remap a lot of the same decls again, but this should be
     919                 :             :        harmless.  */
     920                 :     1886604 :     BIND_EXPR_VARS (*tp) = remap_decls (BIND_EXPR_VARS (*tp), NULL, id);
     921                 :    11223425 : }
     922                 :             : 
     923                 :             : 
     924                 :             : /* Create a new gimple_seq by remapping all the statements in BODY
     925                 :             :    using the inlining information in ID.  */
     926                 :             : 
     927                 :             : static gimple_seq
     928                 :          43 : remap_gimple_seq (gimple_seq body, copy_body_data *id)
     929                 :             : {
     930                 :          43 :   gimple_stmt_iterator si;
     931                 :          43 :   gimple_seq new_body = NULL;
     932                 :             : 
     933                 :          43 :   for (si = gsi_start (body); !gsi_end_p (si); gsi_next (&si))
     934                 :             :     {
     935                 :           0 :       gimple_seq new_stmts = remap_gimple_stmt (gsi_stmt (si), id);
     936                 :           0 :       gimple_seq_add_seq (&new_body, new_stmts);
     937                 :             :     }
     938                 :             : 
     939                 :          43 :   return new_body;
     940                 :             : }
     941                 :             : 
     942                 :             : 
     943                 :             : /* Copy a GIMPLE_BIND statement STMT, remapping all the symbols in its
     944                 :             :    block using the mapping information in ID.  */
     945                 :             : 
     946                 :             : static gimple *
     947                 :           0 : copy_gimple_bind (gbind *stmt, copy_body_data *id)
     948                 :             : {
     949                 :           0 :   gimple *new_bind;
     950                 :           0 :   tree new_block, new_vars;
     951                 :           0 :   gimple_seq body, new_body;
     952                 :             : 
     953                 :             :   /* Copy the statement.  Note that we purposely don't use copy_stmt
     954                 :             :      here because we need to remap statements as we copy.  */
     955                 :           0 :   body = gimple_bind_body (stmt);
     956                 :           0 :   new_body = remap_gimple_seq (body, id);
     957                 :             : 
     958                 :           0 :   new_block = gimple_bind_block (stmt);
     959                 :           0 :   if (new_block)
     960                 :           0 :     remap_block (&new_block, id);
     961                 :             : 
     962                 :             :   /* This will remap a lot of the same decls again, but this should be
     963                 :             :      harmless.  */
     964                 :           0 :   new_vars = gimple_bind_vars (stmt);
     965                 :           0 :   if (new_vars)
     966                 :           0 :     new_vars = remap_decls (new_vars, NULL, id);
     967                 :             : 
     968                 :           0 :   new_bind = gimple_build_bind (new_vars, new_body, new_block);
     969                 :             : 
     970                 :           0 :   return new_bind;
     971                 :             : }
     972                 :             : 
     973                 :             : /* Return true if DECL is a parameter or a SSA_NAME for a parameter.  */
     974                 :             : 
     975                 :             : static bool
     976                 :       27470 : is_parm (tree decl)
     977                 :             : {
     978                 :       27470 :   if (TREE_CODE (decl) == SSA_NAME)
     979                 :             :     {
     980                 :       25685 :       decl = SSA_NAME_VAR (decl);
     981                 :             :       if (!decl)
     982                 :             :         return false;
     983                 :             :     }
     984                 :             : 
     985                 :       15500 :   return (TREE_CODE (decl) == PARM_DECL);
     986                 :             : }
     987                 :             : 
     988                 :             : /* Remap the dependence CLIQUE from the source to the destination function
     989                 :             :    as specified in ID.  */
     990                 :             : 
     991                 :             : static unsigned short
     992                 :     2689178 : remap_dependence_clique (copy_body_data *id, unsigned short clique)
     993                 :             : {
     994                 :     2689178 :   if (clique == 0 || processing_debug_stmt)
     995                 :             :     return 0;
     996                 :     2676657 :   if (!id->dependence_map)
     997                 :      570601 :     id->dependence_map = new hash_map<dependence_hash, unsigned short>;
     998                 :     2676657 :   bool existed;
     999                 :     2676657 :   unsigned short &newc = id->dependence_map->get_or_insert (clique, &existed);
    1000                 :     2676657 :   if (!existed)
    1001                 :             :     {
    1002                 :             :       /* Clique 1 is reserved for local ones set by PTA.  */
    1003                 :      861810 :       if (cfun->last_clique == 0)
    1004                 :      268162 :         cfun->last_clique = 1;
    1005                 :     1723620 :       newc = get_new_clique (cfun);
    1006                 :             :     }
    1007                 :     2676657 :   return newc;
    1008                 :             : }
    1009                 :             : 
    1010                 :             : /* Remap the GIMPLE operand pointed to by *TP.  DATA is really a
    1011                 :             :    'struct walk_stmt_info *'.  DATA->INFO is a 'copy_body_data *'.
    1012                 :             :    WALK_SUBTREES is used to indicate walk_gimple_op whether to keep
    1013                 :             :    recursing into the children nodes of *TP.  */
    1014                 :             : 
    1015                 :             : static tree
    1016                 :   145786396 : remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
    1017                 :             : {
    1018                 :   145786396 :   struct walk_stmt_info *wi_p = (struct walk_stmt_info *) data;
    1019                 :   145786396 :   copy_body_data *id = (copy_body_data *) wi_p->info;
    1020                 :   145786396 :   tree fn = id->src_fn;
    1021                 :             : 
    1022                 :             :   /* For recursive invocations this is no longer the LHS itself.  */
    1023                 :   145786396 :   bool is_lhs = wi_p->is_lhs;
    1024                 :   145786396 :   wi_p->is_lhs = false;
    1025                 :             : 
    1026                 :   145786396 :   if (TREE_CODE (*tp) == SSA_NAME)
    1027                 :             :     {
    1028                 :    49805187 :       *tp = remap_ssa_name (*tp, id);
    1029                 :    49805187 :       *walk_subtrees = 0;
    1030                 :    49805187 :       if (is_lhs)
    1031                 :    12785151 :         SSA_NAME_DEF_STMT (*tp) = wi_p->stmt;
    1032                 :    49805187 :       return NULL;
    1033                 :             :     }
    1034                 :    95981209 :   else if (auto_var_in_fn_p (*tp, fn))
    1035                 :             :     {
    1036                 :             :       /* Local variables and labels need to be replaced by equivalent
    1037                 :             :          variables.  We don't want to copy static variables; there's
    1038                 :             :          only one of those, no matter how many times we inline the
    1039                 :             :          containing function.  Similarly for globals from an outer
    1040                 :             :          function.  */
    1041                 :    29677715 :       tree new_decl;
    1042                 :             : 
    1043                 :             :       /* Remap the declaration.  */
    1044                 :    29677715 :       new_decl = remap_decl (*tp, id);
    1045                 :    29677715 :       gcc_assert (new_decl);
    1046                 :             :       /* Replace this variable with the copy.  */
    1047                 :    29677715 :       STRIP_TYPE_NOPS (new_decl);
    1048                 :             :       /* ???  The C++ frontend uses void * pointer zero to initialize
    1049                 :             :          any other type.  This confuses the middle-end type verification.
    1050                 :             :          As cloned bodies do not go through gimplification again the fixup
    1051                 :             :          there doesn't trigger.  */
    1052                 :    29677715 :       if (TREE_CODE (new_decl) == INTEGER_CST
    1053                 :    29677715 :           && !useless_type_conversion_p (TREE_TYPE (*tp), TREE_TYPE (new_decl)))
    1054                 :           0 :         new_decl = fold_convert (TREE_TYPE (*tp), new_decl);
    1055                 :    29677715 :       *tp = new_decl;
    1056                 :    29677715 :       *walk_subtrees = 0;
    1057                 :             :     }
    1058                 :    66303494 :   else if (TREE_CODE (*tp) == STATEMENT_LIST)
    1059                 :           0 :     gcc_unreachable ();
    1060                 :    66303494 :   else if (TREE_CODE (*tp) == SAVE_EXPR)
    1061                 :           0 :     gcc_unreachable ();
    1062                 :    66303494 :   else if (TREE_CODE (*tp) == LABEL_DECL
    1063                 :    66303494 :            && (!DECL_CONTEXT (*tp)
    1064                 :         441 :                || decl_function_context (*tp) == id->src_fn))
    1065                 :             :     /* These may need to be remapped for EH handling.  */
    1066                 :           0 :     *tp = remap_decl (*tp, id);
    1067                 :    66303494 :   else if (TREE_CODE (*tp) == FIELD_DECL)
    1068                 :             :     {
    1069                 :             :       /* If the enclosing record type is variably_modified_type_p, the field
    1070                 :             :          has already been remapped.  Otherwise, it need not be.  */
    1071                 :    11661331 :       tree *n = id->decl_map->get (*tp);
    1072                 :    11661331 :       if (n)
    1073                 :          30 :         *tp = *n;
    1074                 :    11661331 :       *walk_subtrees = 0;
    1075                 :             :     }
    1076                 :    54642163 :   else if (TYPE_P (*tp))
    1077                 :             :     /* Types may need remapping as well.  */
    1078                 :           0 :     *tp = remap_type (*tp, id);
    1079                 :    54642163 :   else if (CONSTANT_CLASS_P (*tp))
    1080                 :             :     {
    1081                 :             :       /* If this is a constant, we have to copy the node iff the type
    1082                 :             :          will be remapped.  copy_tree_r will not copy a constant.  */
    1083                 :     9140472 :       tree new_type = remap_type (TREE_TYPE (*tp), id);
    1084                 :             : 
    1085                 :     9140472 :       if (new_type == TREE_TYPE (*tp))
    1086                 :     9137745 :         *walk_subtrees = 0;
    1087                 :             : 
    1088                 :        2727 :       else if (TREE_CODE (*tp) == INTEGER_CST)
    1089                 :        2727 :         *tp = wide_int_to_tree (new_type, wi::to_wide (*tp));
    1090                 :             :       else
    1091                 :             :         {
    1092                 :           0 :           *tp = copy_node (*tp);
    1093                 :           0 :           TREE_TYPE (*tp) = new_type;
    1094                 :             :         }
    1095                 :             :     }
    1096                 :             :   else
    1097                 :             :     {
    1098                 :             :       /* Otherwise, just copy the node.  Note that copy_tree_r already
    1099                 :             :          knows not to copy VAR_DECLs, etc., so this is safe.  */
    1100                 :             : 
    1101                 :    45501691 :       if (TREE_CODE (*tp) == MEM_REF && !id->do_not_fold)
    1102                 :             :         {
    1103                 :             :           /* We need to re-canonicalize MEM_REFs from inline substitutions
    1104                 :             :              that can happen when a pointer argument is an ADDR_EXPR.
    1105                 :             :              Recurse here manually to allow that.  */
    1106                 :    10563149 :           tree ptr = TREE_OPERAND (*tp, 0);
    1107                 :    10563149 :           tree type = remap_type (TREE_TYPE (*tp), id);
    1108                 :    10563149 :           tree old = *tp;
    1109                 :    10563149 :           walk_tree (&ptr, remap_gimple_op_r, data, NULL);
    1110                 :    10563149 :           *tp = fold_build2 (MEM_REF, type, ptr, TREE_OPERAND (*tp, 1));
    1111                 :    10563149 :           TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
    1112                 :    10563149 :           TREE_SIDE_EFFECTS (*tp) = TREE_SIDE_EFFECTS (old);
    1113                 :    10563149 :           copy_warning (*tp, old);
    1114                 :    10563149 :           if (MR_DEPENDENCE_CLIQUE (old) != 0)
    1115                 :             :             {
    1116                 :     2634492 :               MR_DEPENDENCE_CLIQUE (*tp)
    1117                 :     2634492 :                 = remap_dependence_clique (id, MR_DEPENDENCE_CLIQUE (old));
    1118                 :     2634492 :               MR_DEPENDENCE_BASE (*tp) = MR_DEPENDENCE_BASE (old);
    1119                 :             :             }
    1120                 :             :           /* We cannot propagate the TREE_THIS_NOTRAP flag if we have
    1121                 :             :              remapped a parameter as the property might be valid only
    1122                 :             :              for the parameter itself.  */
    1123                 :    10563149 :           if (TREE_THIS_NOTRAP (old)
    1124                 :    10563149 :               && (!is_parm (TREE_OPERAND (old, 0))
    1125                 :       10162 :                   || (!id->transform_parameter && is_parm (ptr))))
    1126                 :       15527 :             TREE_THIS_NOTRAP (*tp) = 1;
    1127                 :    10563149 :           REF_REVERSE_STORAGE_ORDER (*tp) = REF_REVERSE_STORAGE_ORDER (old);
    1128                 :    10563149 :           *walk_subtrees = 0;
    1129                 :    10563149 :           return NULL;
    1130                 :             :         }
    1131                 :             : 
    1132                 :             :       /* Here is the "usual case".  Copy this tree node, and then
    1133                 :             :          tweak some special cases.  */
    1134                 :    34938542 :       copy_tree_r (tp, walk_subtrees, NULL);
    1135                 :             : 
    1136                 :    34938542 :       if (TREE_CODE (*tp) != OMP_CLAUSE)
    1137                 :    34938542 :         TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id);
    1138                 :             : 
    1139                 :    34938542 :       if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
    1140                 :             :         {
    1141                 :             :           /* The copied TARGET_EXPR has never been expanded, even if the
    1142                 :             :              original node was expanded already.  */
    1143                 :           0 :           TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
    1144                 :           0 :           TREE_OPERAND (*tp, 3) = NULL_TREE;
    1145                 :             :         }
    1146                 :    34938542 :       else if (TREE_CODE (*tp) == ADDR_EXPR)
    1147                 :             :         {
    1148                 :             :           /* Variable substitution need not be simple.  In particular,
    1149                 :             :              the MEM_REF substitution above.  Make sure that
    1150                 :             :              TREE_CONSTANT and friends are up-to-date.  */
    1151                 :    10705986 :           int invariant = is_gimple_min_invariant (*tp);
    1152                 :    10705986 :           walk_tree (&TREE_OPERAND (*tp, 0), remap_gimple_op_r, data, NULL);
    1153                 :    10705986 :           recompute_tree_invariant_for_addr_expr (*tp);
    1154                 :             : 
    1155                 :             :           /* If this used to be invariant, but is not any longer,
    1156                 :             :              then regimplification is probably needed.  */
    1157                 :    10705986 :           if (invariant && !is_gimple_min_invariant (*tp))
    1158                 :         125 :             id->regimplify = true;
    1159                 :             : 
    1160                 :    10705986 :           *walk_subtrees = 0;
    1161                 :             :         }
    1162                 :             :     }
    1163                 :             : 
    1164                 :             :   /* Update the TREE_BLOCK for the cloned expr.  */
    1165                 :    85418060 :   if (EXPR_P (*tp))
    1166                 :             :     {
    1167                 :    23210905 :       tree new_block = id->remapping_type_depth == 0 ? id->block : NULL;
    1168                 :    23210905 :       tree old_block = TREE_BLOCK (*tp);
    1169                 :    23210905 :       if (old_block)
    1170                 :             :         {
    1171                 :    11928403 :           tree *n;
    1172                 :    11928403 :           n = id->decl_map->get (TREE_BLOCK (*tp));
    1173                 :    11928403 :           if (n)
    1174                 :    11927821 :             new_block = *n;
    1175                 :             :         }
    1176                 :    23210905 :       TREE_SET_BLOCK (*tp, new_block);
    1177                 :             :     }
    1178                 :             : 
    1179                 :             :   /* Keep iterating.  */
    1180                 :             :   return NULL_TREE;
    1181                 :             : }
    1182                 :             : 
    1183                 :             : 
    1184                 :             : /* Called from copy_body_id via walk_tree.  DATA is really a
    1185                 :             :    `copy_body_data *'.  */
    1186                 :             : 
    1187                 :             : tree
    1188                 :   734505746 : copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
    1189                 :             : {
    1190                 :   734505746 :   copy_body_data *id = (copy_body_data *) data;
    1191                 :   734505746 :   tree fn = id->src_fn;
    1192                 :   734505746 :   tree new_block;
    1193                 :             : 
    1194                 :             :   /* Begin by recognizing trees that we'll completely rewrite for the
    1195                 :             :      inlining context.  Our output for these trees is completely
    1196                 :             :      different from out input (e.g. RETURN_EXPR is deleted, and morphs
    1197                 :             :      into an edge).  Further down, we'll handle trees that get
    1198                 :             :      duplicated and/or tweaked.  */
    1199                 :             : 
    1200                 :             :   /* When requested, RETURN_EXPRs should be transformed to just the
    1201                 :             :      contained MODIFY_EXPR.  The branch semantics of the return will
    1202                 :             :      be handled elsewhere by manipulating the CFG rather than a statement.  */
    1203                 :   734505746 :   if (TREE_CODE (*tp) == RETURN_EXPR && id->transform_return_to_modify)
    1204                 :             :     {
    1205                 :           0 :       tree assignment = TREE_OPERAND (*tp, 0);
    1206                 :             : 
    1207                 :             :       /* If we're returning something, just turn that into an
    1208                 :             :          assignment into the equivalent of the original RESULT_DECL.
    1209                 :             :          If the "assignment" is just the result decl, the result
    1210                 :             :          decl has already been set (e.g. a recent "foo (&result_decl,
    1211                 :             :          ...)"); just toss the entire RETURN_EXPR.  */
    1212                 :           0 :       if (assignment && TREE_CODE (assignment) == MODIFY_EXPR)
    1213                 :             :         {
    1214                 :             :           /* Replace the RETURN_EXPR with (a copy of) the
    1215                 :             :              MODIFY_EXPR hanging underneath.  */
    1216                 :           0 :           *tp = copy_node (assignment);
    1217                 :             :         }
    1218                 :             :       else /* Else the RETURN_EXPR returns no value.  */
    1219                 :             :         {
    1220                 :           0 :           *tp = NULL;
    1221                 :           0 :           return (tree) (void *)1;
    1222                 :             :         }
    1223                 :           0 :     }
    1224                 :   734505746 :   else if (TREE_CODE (*tp) == SSA_NAME)
    1225                 :             :     {
    1226                 :     3121376 :       *tp = remap_ssa_name (*tp, id);
    1227                 :     3121376 :       *walk_subtrees = 0;
    1228                 :     3121376 :       return NULL;
    1229                 :             :     }
    1230                 :             : 
    1231                 :             :   /* Local variables and labels need to be replaced by equivalent
    1232                 :             :      variables.  We don't want to copy static variables; there's only
    1233                 :             :      one of those, no matter how many times we inline the containing
    1234                 :             :      function.  Similarly for globals from an outer function.  */
    1235                 :   731384370 :   else if (auto_var_in_fn_p (*tp, fn))
    1236                 :             :     {
    1237                 :    85876840 :       tree new_decl;
    1238                 :             : 
    1239                 :             :       /* Remap the declaration.  */
    1240                 :    85876840 :       new_decl = remap_decl (*tp, id);
    1241                 :    85876840 :       gcc_assert (new_decl);
    1242                 :             :       /* Replace this variable with the copy.  */
    1243                 :    85876840 :       STRIP_TYPE_NOPS (new_decl);
    1244                 :    85876840 :       *tp = new_decl;
    1245                 :    85876840 :       *walk_subtrees = 0;
    1246                 :             :     }
    1247                 :   645507530 :   else if (TREE_CODE (*tp) == STATEMENT_LIST)
    1248                 :    26343179 :     copy_statement_list (tp);
    1249                 :   619164351 :   else if (TREE_CODE (*tp) == SAVE_EXPR
    1250                 :   618768553 :            || TREE_CODE (*tp) == TARGET_EXPR)
    1251                 :     5624117 :     remap_save_expr (tp, id->decl_map, walk_subtrees);
    1252                 :   613540234 :   else if (TREE_CODE (*tp) == LABEL_DECL
    1253                 :   613540234 :            && (! DECL_CONTEXT (*tp)
    1254                 :          14 :                || decl_function_context (*tp) == id->src_fn))
    1255                 :             :     /* These may need to be remapped for EH handling.  */
    1256                 :           0 :     *tp = remap_decl (*tp, id);
    1257                 :   613540234 :   else if (TREE_CODE (*tp) == BIND_EXPR)
    1258                 :    11223425 :     copy_bind_expr (tp, walk_subtrees, id);
    1259                 :             :   /* Types may need remapping as well.  */
    1260                 :   602316809 :   else if (TYPE_P (*tp))
    1261                 :      143990 :     *tp = remap_type (*tp, id);
    1262                 :             : 
    1263                 :             :   /* If this is a constant, we have to copy the node iff the type will be
    1264                 :             :      remapped.  copy_tree_r will not copy a constant.  */
    1265                 :   602172819 :   else if (CONSTANT_CLASS_P (*tp))
    1266                 :             :     {
    1267                 :   172434098 :       tree new_type = remap_type (TREE_TYPE (*tp), id);
    1268                 :             : 
    1269                 :   172434098 :       if (new_type == TREE_TYPE (*tp))
    1270                 :   172433578 :         *walk_subtrees = 0;
    1271                 :             : 
    1272                 :         520 :       else if (TREE_CODE (*tp) == INTEGER_CST)
    1273                 :         520 :         *tp = wide_int_to_tree (new_type, wi::to_wide (*tp));
    1274                 :             :       else
    1275                 :             :         {
    1276                 :           0 :           *tp = copy_node (*tp);
    1277                 :           0 :           TREE_TYPE (*tp) = new_type;
    1278                 :             :         }
    1279                 :             :     }
    1280                 :             : 
    1281                 :             :   /* Otherwise, just copy the node.  Note that copy_tree_r already
    1282                 :             :      knows not to copy VAR_DECLs, etc., so this is safe.  */
    1283                 :             :   else
    1284                 :             :     {
    1285                 :             :       /* Here we handle trees that are not completely rewritten.
    1286                 :             :          First we detect some inlining-induced bogosities for
    1287                 :             :          discarding.  */
    1288                 :   429738721 :       if (TREE_CODE (*tp) == MODIFY_EXPR
    1289                 :    10923867 :           && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1)
    1290                 :   429738721 :           && (auto_var_in_fn_p (TREE_OPERAND (*tp, 0), fn)))
    1291                 :             :         {
    1292                 :             :           /* Some assignments VAR = VAR; don't generate any rtl code
    1293                 :             :              and thus don't count as variable modification.  Avoid
    1294                 :             :              keeping bogosities like 0 = 0.  */
    1295                 :           0 :           tree decl = TREE_OPERAND (*tp, 0), value;
    1296                 :           0 :           tree *n;
    1297                 :             : 
    1298                 :           0 :           n = id->decl_map->get (decl);
    1299                 :           0 :           if (n)
    1300                 :             :             {
    1301                 :           0 :               value = *n;
    1302                 :           0 :               STRIP_TYPE_NOPS (value);
    1303                 :           0 :               if (TREE_CONSTANT (value) || TREE_READONLY (value))
    1304                 :             :                 {
    1305                 :           0 :                   *tp = build_empty_stmt (EXPR_LOCATION (*tp));
    1306                 :           0 :                   return copy_tree_body_r (tp, walk_subtrees, data);
    1307                 :             :                 }
    1308                 :             :             }
    1309                 :             :         }
    1310                 :   429738721 :       else if (INDIRECT_REF_P (*tp))
    1311                 :             :         {
    1312                 :             :           /* Get rid of *& from inline substitutions that can happen when a
    1313                 :             :              pointer argument is an ADDR_EXPR.  */
    1314                 :    30508077 :           tree decl = TREE_OPERAND (*tp, 0);
    1315                 :    30508077 :           tree *n = id->decl_map->get (decl);
    1316                 :    30508077 :           if (n)
    1317                 :             :             {
    1318                 :             :               /* If we happen to get an ADDR_EXPR in n->value, strip
    1319                 :             :                  it manually here as we'll eventually get ADDR_EXPRs
    1320                 :             :                  which lie about their types pointed to.  In this case
    1321                 :             :                  build_fold_indirect_ref wouldn't strip the INDIRECT_REF,
    1322                 :             :                  but we absolutely rely on that.  As fold_indirect_ref
    1323                 :             :                  does other useful transformations, try that first, though.  */
    1324                 :     4341193 :               tree type = TREE_TYPE (*tp);
    1325                 :     4341193 :               tree ptr = id->do_not_unshare ? *n : unshare_expr (*n);
    1326                 :     4341193 :               tree old = *tp;
    1327                 :     4341193 :               *tp = id->do_not_fold ? NULL : gimple_fold_indirect_ref (ptr);
    1328                 :     4341193 :               if (! *tp)
    1329                 :             :                 {
    1330                 :     4341131 :                   type = remap_type (type, id);
    1331                 :     4341131 :                   if (TREE_CODE (ptr) == ADDR_EXPR && !id->do_not_fold)
    1332                 :             :                     {
    1333                 :           0 :                       *tp
    1334                 :           0 :                         = fold_indirect_ref_1 (EXPR_LOCATION (ptr), type, ptr);
    1335                 :             :                       /* ???  We should either assert here or build
    1336                 :             :                          a VIEW_CONVERT_EXPR instead of blindly leaking
    1337                 :             :                          incompatible types to our IL.  */
    1338                 :           0 :                       if (! *tp)
    1339                 :           0 :                         *tp = TREE_OPERAND (ptr, 0);
    1340                 :             :                     }
    1341                 :             :                   else
    1342                 :             :                     {
    1343                 :     4341131 :                       *tp = build1 (INDIRECT_REF, type, ptr);
    1344                 :     4341131 :                       TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
    1345                 :     4341131 :                       TREE_SIDE_EFFECTS (*tp) = TREE_SIDE_EFFECTS (old);
    1346                 :     4341131 :                       TREE_READONLY (*tp) = TREE_READONLY (old);
    1347                 :             :                       /* We cannot propagate the TREE_THIS_NOTRAP flag if we
    1348                 :             :                          have remapped a parameter as the property might be
    1349                 :             :                          valid only for the parameter itself.  */
    1350                 :     4341131 :                       if (TREE_THIS_NOTRAP (old)
    1351                 :     4341131 :                           && (!is_parm (TREE_OPERAND (old, 0))
    1352                 :           0 :                               || (!id->transform_parameter && is_parm (ptr))))
    1353                 :        1190 :                         TREE_THIS_NOTRAP (*tp) = 1;
    1354                 :             :                     }
    1355                 :             :                 }
    1356                 :     4341193 :               *walk_subtrees = 0;
    1357                 :     4341193 :               return NULL;
    1358                 :             :             }
    1359                 :             :         }
    1360                 :   399230644 :       else if (TREE_CODE (*tp) == MEM_REF && !id->do_not_fold)
    1361                 :             :         {
    1362                 :             :           /* We need to re-canonicalize MEM_REFs from inline substitutions
    1363                 :             :              that can happen when a pointer argument is an ADDR_EXPR.
    1364                 :             :              Recurse here manually to allow that.  */
    1365                 :       47649 :           tree ptr = TREE_OPERAND (*tp, 0);
    1366                 :       47649 :           tree type = remap_type (TREE_TYPE (*tp), id);
    1367                 :       47649 :           tree old = *tp;
    1368                 :       47649 :           walk_tree (&ptr, copy_tree_body_r, data, NULL);
    1369                 :       47649 :           *tp = fold_build2 (MEM_REF, type, ptr, TREE_OPERAND (*tp, 1));
    1370                 :       47649 :           TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
    1371                 :       47649 :           TREE_SIDE_EFFECTS (*tp) = TREE_SIDE_EFFECTS (old);
    1372                 :       47649 :           copy_warning (*tp, old);
    1373                 :       47649 :           if (MR_DEPENDENCE_CLIQUE (old) != 0)
    1374                 :             :             {
    1375                 :        4277 :               MR_DEPENDENCE_CLIQUE (*tp)
    1376                 :        4277 :                 = remap_dependence_clique (id, MR_DEPENDENCE_CLIQUE (old));
    1377                 :        4277 :               MR_DEPENDENCE_BASE (*tp) = MR_DEPENDENCE_BASE (old);
    1378                 :             :             }
    1379                 :             :           /* We cannot propagate the TREE_THIS_NOTRAP flag if we have
    1380                 :             :              remapped a parameter as the property might be valid only
    1381                 :             :              for the parameter itself.  */
    1382                 :       47649 :           if (TREE_THIS_NOTRAP (old)
    1383                 :       47649 :               && (!is_parm (TREE_OPERAND (old, 0))
    1384                 :         529 :                   || (!id->transform_parameter && is_parm (ptr))))
    1385                 :          62 :             TREE_THIS_NOTRAP (*tp) = 1;
    1386                 :       47649 :           REF_REVERSE_STORAGE_ORDER (*tp) = REF_REVERSE_STORAGE_ORDER (old);
    1387                 :       47649 :           *walk_subtrees = 0;
    1388                 :       47649 :           return NULL;
    1389                 :             :         }
    1390                 :             : 
    1391                 :             :       /* Here is the "usual case".  Copy this tree node, and then
    1392                 :             :          tweak some special cases.  */
    1393                 :   425349879 :       copy_tree_r (tp, walk_subtrees, NULL);
    1394                 :             : 
    1395                 :             :       /* If EXPR has block defined, map it to newly constructed block.
    1396                 :             :          When inlining we want EXPRs without block appear in the block
    1397                 :             :          of function call if we are not remapping a type.  */
    1398                 :   425349879 :       if (EXPR_P (*tp))
    1399                 :             :         {
    1400                 :   366656665 :           new_block = id->remapping_type_depth == 0 ? id->block : NULL;
    1401                 :   366656665 :           if (TREE_BLOCK (*tp))
    1402                 :             :             {
    1403                 :       12473 :               tree *n;
    1404                 :       12473 :               n = id->decl_map->get (TREE_BLOCK (*tp));
    1405                 :       12473 :               if (n)
    1406                 :       12473 :                 new_block = *n;
    1407                 :             :             }
    1408                 :   366656665 :           TREE_SET_BLOCK (*tp, new_block);
    1409                 :             :         }
    1410                 :             : 
    1411                 :   425349879 :       if (TREE_CODE (*tp) != OMP_CLAUSE)
    1412                 :   425349760 :         TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id);
    1413                 :             : 
    1414                 :             :       /* The copied TARGET_EXPR has never been expanded, even if the
    1415                 :             :          original node was expanded already.  */
    1416                 :   425349879 :       if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
    1417                 :             :         {
    1418                 :           0 :           TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
    1419                 :           0 :           TREE_OPERAND (*tp, 3) = NULL_TREE;
    1420                 :             :         }
    1421                 :             : 
    1422                 :             :       /* Variable substitution need not be simple.  In particular, the
    1423                 :             :          INDIRECT_REF substitution above.  Make sure that TREE_CONSTANT
    1424                 :             :          and friends are up-to-date.  */
    1425                 :   425349879 :       else if (TREE_CODE (*tp) == ADDR_EXPR)
    1426                 :             :         {
    1427                 :    37417032 :           int invariant = is_gimple_min_invariant (*tp);
    1428                 :    37417032 :           walk_tree (&TREE_OPERAND (*tp, 0), copy_tree_body_r, id, NULL);
    1429                 :             : 
    1430                 :             :           /* Handle the case where we substituted an INDIRECT_REF
    1431                 :             :              into the operand of the ADDR_EXPR.  */
    1432                 :    37417032 :           if (INDIRECT_REF_P (TREE_OPERAND (*tp, 0))
    1433                 :    37417032 :               && !id->do_not_fold)
    1434                 :             :             {
    1435                 :         146 :               tree t = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0);
    1436                 :         146 :               if (TREE_TYPE (t) != TREE_TYPE (*tp))
    1437                 :         146 :                 t = fold_convert (remap_type (TREE_TYPE (*tp), id), t);
    1438                 :         146 :               *tp = t;
    1439                 :             :             }
    1440                 :             :           else
    1441                 :    37416886 :             recompute_tree_invariant_for_addr_expr (*tp);
    1442                 :             : 
    1443                 :             :           /* If this used to be invariant, but is not any longer,
    1444                 :             :              then regimplification is probably needed.  */
    1445                 :    37417032 :           if (invariant && !is_gimple_min_invariant (*tp))
    1446                 :          17 :             id->regimplify = true;
    1447                 :             : 
    1448                 :    37417032 :           *walk_subtrees = 0;
    1449                 :             :         }
    1450                 :   387932847 :       else if (TREE_CODE (*tp) == OMP_CLAUSE
    1451                 :   387932847 :                && (OMP_CLAUSE_CODE (*tp) == OMP_CLAUSE_AFFINITY
    1452                 :          99 :                    || OMP_CLAUSE_CODE (*tp) == OMP_CLAUSE_DEPEND))
    1453                 :             :         {
    1454                 :          40 :           tree t = OMP_CLAUSE_DECL (*tp);
    1455                 :          40 :           if (t
    1456                 :          40 :               && TREE_CODE (t) == TREE_LIST
    1457                 :          24 :               && TREE_PURPOSE (t)
    1458                 :          64 :               && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
    1459                 :             :             {
    1460                 :          24 :               *walk_subtrees = 0;
    1461                 :          24 :               OMP_CLAUSE_DECL (*tp) = copy_node (t);
    1462                 :          24 :               t = OMP_CLAUSE_DECL (*tp);
    1463                 :          24 :               TREE_PURPOSE (t) = copy_node (TREE_PURPOSE (t));
    1464                 :         144 :               for (int i = 0; i <= 4; i++)
    1465                 :         120 :                 walk_tree (&TREE_VEC_ELT (TREE_PURPOSE (t), i),
    1466                 :             :                            copy_tree_body_r, id, NULL);
    1467                 :          24 :               if (TREE_VEC_ELT (TREE_PURPOSE (t), 5))
    1468                 :          24 :                 remap_block (&TREE_VEC_ELT (TREE_PURPOSE (t), 5), id);
    1469                 :          24 :               walk_tree (&TREE_VALUE (t), copy_tree_body_r, id, NULL);
    1470                 :             :             }
    1471                 :             :         }
    1472                 :             :     }
    1473                 :             : 
    1474                 :             :   /* Keep iterating.  */
    1475                 :             :   return NULL_TREE;
    1476                 :             : }
    1477                 :             : 
    1478                 :             : /* Helper for remap_gimple_stmt.  Given an EH region number for the
    1479                 :             :    source function, map that to the duplicate EH region number in
    1480                 :             :    the destination function.  */
    1481                 :             : 
    1482                 :             : static int
    1483                 :       97178 : remap_eh_region_nr (int old_nr, copy_body_data *id)
    1484                 :             : {
    1485                 :       97178 :   eh_region old_r, new_r;
    1486                 :             : 
    1487                 :       97178 :   old_r = get_eh_region_from_number_fn (id->src_cfun, old_nr);
    1488                 :       97178 :   new_r = static_cast<eh_region> (*id->eh_map->get (old_r));
    1489                 :             : 
    1490                 :       97178 :   return new_r->index;
    1491                 :             : }
    1492                 :             : 
    1493                 :             : /* Similar, but operate on INTEGER_CSTs.  */
    1494                 :             : 
    1495                 :             : static tree
    1496                 :        7571 : remap_eh_region_tree_nr (tree old_t_nr, copy_body_data *id)
    1497                 :             : {
    1498                 :        7571 :   int old_nr, new_nr;
    1499                 :             : 
    1500                 :        7571 :   old_nr = tree_to_shwi (old_t_nr);
    1501                 :        7571 :   new_nr = remap_eh_region_nr (old_nr, id);
    1502                 :             : 
    1503                 :        7571 :   return build_int_cst (integer_type_node, new_nr);
    1504                 :             : }
    1505                 :             : 
    1506                 :             : /* Helper for copy_bb.  Remap statement STMT using the inlining
    1507                 :             :    information in ID.  Return the new statement copy.  */
    1508                 :             : 
    1509                 :             : static gimple_seq
    1510                 :    65577644 : remap_gimple_stmt (gimple *stmt, copy_body_data *id)
    1511                 :             : {
    1512                 :    65577644 :   gimple *copy = NULL;
    1513                 :    65577644 :   struct walk_stmt_info wi;
    1514                 :    65577644 :   bool skip_first = false;
    1515                 :    65577644 :   gimple_seq stmts = NULL;
    1516                 :             : 
    1517                 :    65577644 :   if (is_gimple_debug (stmt)
    1518                 :    65577644 :       && (gimple_debug_nonbind_marker_p (stmt)
    1519                 :     9508160 :           ? !DECL_STRUCT_FUNCTION (id->dst_fn)->debug_nonbind_markers
    1520                 :    28392347 :           : !opt_for_fn (id->dst_fn, flag_var_tracking_assignments)))
    1521                 :             :     return NULL;
    1522                 :             : 
    1523                 :    65552649 :   if (!is_gimple_debug (stmt)
    1524                 :    27677137 :       && id->param_body_adjs
    1525                 :    68176334 :       && id->param_body_adjs->m_dead_stmts.contains (stmt))
    1526                 :             :     {
    1527                 :        2136 :       tree *dval = id->param_body_adjs->m_dead_stmt_debug_equiv.get (stmt);
    1528                 :        2136 :       if (!dval)
    1529                 :             :         return NULL;
    1530                 :             : 
    1531                 :         938 :       gcc_assert (is_gimple_assign (stmt));
    1532                 :         938 :       tree lhs = gimple_assign_lhs (stmt);
    1533                 :         938 :       tree *dvar = id->param_body_adjs->m_dead_ssa_debug_equiv.get (lhs);
    1534                 :         938 :       gdebug *bind = gimple_build_debug_bind (*dvar, *dval, stmt);
    1535                 :         938 :       if (id->reset_location)
    1536                 :           0 :         gimple_set_location (bind, input_location);
    1537                 :         938 :       id->debug_stmts.safe_push (bind);
    1538                 :         938 :       gimple_seq_add_stmt_without_update (&stmts, bind);
    1539                 :         938 :       return stmts;
    1540                 :             :     }
    1541                 :             : 
    1542                 :             :   /* Begin by recognizing trees that we'll completely rewrite for the
    1543                 :             :      inlining context.  Our output for these trees is completely
    1544                 :             :      different from our input (e.g. RETURN_EXPR is deleted and morphs
    1545                 :             :      into an edge).  Further down, we'll handle trees that get
    1546                 :             :      duplicated and/or tweaked.  */
    1547                 :             : 
    1548                 :             :   /* When requested, GIMPLE_RETURN should be transformed to just the
    1549                 :             :      contained GIMPLE_ASSIGN.  The branch semantics of the return will
    1550                 :             :      be handled elsewhere by manipulating the CFG rather than the
    1551                 :             :      statement.  */
    1552                 :    65550513 :   if (gimple_code (stmt) == GIMPLE_RETURN && id->transform_return_to_modify)
    1553                 :             :     {
    1554                 :     3623035 :       tree retval = gimple_return_retval (as_a <greturn *> (stmt));
    1555                 :             : 
    1556                 :             :       /* If we're returning something, just turn that into an
    1557                 :             :          assignment to the equivalent of the original RESULT_DECL.
    1558                 :             :          If RETVAL is just the result decl, the result decl has
    1559                 :             :          already been set (e.g. a recent "foo (&result_decl, ...)");
    1560                 :             :          just toss the entire GIMPLE_RETURN.  Likewise for when the
    1561                 :             :          call doesn't want the return value.  */
    1562                 :     3623035 :       if (retval
    1563                 :     3623035 :           && (TREE_CODE (retval) != RESULT_DECL
    1564                 :     1854575 :               && (!id->call_stmt
    1565                 :     1854575 :                   || gimple_call_lhs (id->call_stmt) != NULL_TREE)
    1566                 :     1755592 :               && (TREE_CODE (retval) != SSA_NAME
    1567                 :     1449618 :                   || ! SSA_NAME_VAR (retval)
    1568                 :      303854 :                   || TREE_CODE (SSA_NAME_VAR (retval)) != RESULT_DECL)))
    1569                 :             :         {
    1570                 :     3411748 :           copy = gimple_build_assign (id->do_not_unshare
    1571                 :     1705874 :                                       ? id->retvar : unshare_expr (id->retvar),
    1572                 :             :                                       retval);
    1573                 :             :           /* id->retvar is already substituted.  Skip it on later remapping.  */
    1574                 :     1705874 :           skip_first = true;
    1575                 :             :         }
    1576                 :             :       else
    1577                 :             :         return NULL;
    1578                 :             :     }
    1579                 :    61927478 :   else if (gimple_has_substatements (stmt))
    1580                 :             :     {
    1581                 :          43 :       gimple_seq s1, s2;
    1582                 :             : 
    1583                 :             :       /* When cloning bodies from the C++ front end, we will be handed bodies
    1584                 :             :          in High GIMPLE form.  Handle here all the High GIMPLE statements that
    1585                 :             :          have embedded statements.  */
    1586                 :          43 :       switch (gimple_code (stmt))
    1587                 :             :         {
    1588                 :           0 :         case GIMPLE_BIND:
    1589                 :           0 :           copy = copy_gimple_bind (as_a <gbind *> (stmt), id);
    1590                 :           0 :           break;
    1591                 :             : 
    1592                 :           0 :         case GIMPLE_CATCH:
    1593                 :           0 :           {
    1594                 :           0 :             gcatch *catch_stmt = as_a <gcatch *> (stmt);
    1595                 :           0 :             s1 = remap_gimple_seq (gimple_catch_handler (catch_stmt), id);
    1596                 :           0 :             copy = gimple_build_catch (gimple_catch_types (catch_stmt), s1);
    1597                 :             :           }
    1598                 :           0 :           break;
    1599                 :             : 
    1600                 :           0 :         case GIMPLE_EH_FILTER:
    1601                 :           0 :           s1 = remap_gimple_seq (gimple_eh_filter_failure (stmt), id);
    1602                 :           0 :           copy = gimple_build_eh_filter (gimple_eh_filter_types (stmt), s1);
    1603                 :           0 :           break;
    1604                 :             : 
    1605                 :           0 :         case GIMPLE_TRY:
    1606                 :           0 :           s1 = remap_gimple_seq (gimple_try_eval (stmt), id);
    1607                 :           0 :           s2 = remap_gimple_seq (gimple_try_cleanup (stmt), id);
    1608                 :           0 :           copy = gimple_build_try (s1, s2, gimple_try_kind (stmt));
    1609                 :           0 :           break;
    1610                 :             : 
    1611                 :           0 :         case GIMPLE_WITH_CLEANUP_EXPR:
    1612                 :           0 :           s1 = remap_gimple_seq (gimple_wce_cleanup (stmt), id);
    1613                 :           0 :           copy = gimple_build_wce (s1);
    1614                 :           0 :           break;
    1615                 :             : 
    1616                 :           0 :         case GIMPLE_OMP_PARALLEL:
    1617                 :           0 :           {
    1618                 :           0 :             gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt);
    1619                 :           0 :             s1 = remap_gimple_seq (gimple_omp_body (omp_par_stmt), id);
    1620                 :           0 :             copy = gimple_build_omp_parallel
    1621                 :           0 :                      (s1,
    1622                 :             :                       gimple_omp_parallel_clauses (omp_par_stmt),
    1623                 :             :                       gimple_omp_parallel_child_fn (omp_par_stmt),
    1624                 :             :                       gimple_omp_parallel_data_arg (omp_par_stmt));
    1625                 :             :           }
    1626                 :           0 :           break;
    1627                 :             : 
    1628                 :           0 :         case GIMPLE_OMP_TASK:
    1629                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1630                 :           0 :           copy = gimple_build_omp_task
    1631                 :           0 :                    (s1,
    1632                 :             :                     gimple_omp_task_clauses (stmt),
    1633                 :             :                     gimple_omp_task_child_fn (stmt),
    1634                 :             :                     gimple_omp_task_data_arg (stmt),
    1635                 :             :                     gimple_omp_task_copy_fn (stmt),
    1636                 :             :                     gimple_omp_task_arg_size (stmt),
    1637                 :             :                     gimple_omp_task_arg_align (stmt));
    1638                 :           0 :           break;
    1639                 :             : 
    1640                 :           0 :         case GIMPLE_OMP_FOR:
    1641                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1642                 :           0 :           s2 = remap_gimple_seq (gimple_omp_for_pre_body (stmt), id);
    1643                 :           0 :           copy = gimple_build_omp_for (s1, gimple_omp_for_kind (stmt),
    1644                 :             :                                        gimple_omp_for_clauses (stmt),
    1645                 :             :                                        gimple_omp_for_collapse (stmt), s2);
    1646                 :           0 :           {
    1647                 :           0 :             size_t i;
    1648                 :           0 :             for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
    1649                 :             :               {
    1650                 :           0 :                 gimple_omp_for_set_index (copy, i,
    1651                 :             :                                           gimple_omp_for_index (stmt, i));
    1652                 :           0 :                 gimple_omp_for_set_initial (copy, i,
    1653                 :             :                                             gimple_omp_for_initial (stmt, i));
    1654                 :           0 :                 gimple_omp_for_set_final (copy, i,
    1655                 :             :                                           gimple_omp_for_final (stmt, i));
    1656                 :           0 :                 gimple_omp_for_set_incr (copy, i,
    1657                 :             :                                          gimple_omp_for_incr (stmt, i));
    1658                 :           0 :                 gimple_omp_for_set_cond (copy, i,
    1659                 :             :                                          gimple_omp_for_cond (stmt, i));
    1660                 :             :               }
    1661                 :             :           }
    1662                 :             :           break;
    1663                 :             : 
    1664                 :           0 :         case GIMPLE_OMP_MASTER:
    1665                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1666                 :           0 :           copy = gimple_build_omp_master (s1);
    1667                 :           0 :           break;
    1668                 :             : 
    1669                 :           0 :         case GIMPLE_OMP_MASKED:
    1670                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1671                 :           0 :           copy = gimple_build_omp_masked
    1672                 :           0 :                    (s1, gimple_omp_masked_clauses (stmt));
    1673                 :           0 :           break;
    1674                 :             : 
    1675                 :           0 :         case GIMPLE_OMP_SCOPE:
    1676                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1677                 :           0 :           copy = gimple_build_omp_scope
    1678                 :           0 :                    (s1, gimple_omp_scope_clauses (stmt));
    1679                 :           0 :           break;
    1680                 :             : 
    1681                 :           0 :         case GIMPLE_OMP_TASKGROUP:
    1682                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1683                 :           0 :           copy = gimple_build_omp_taskgroup
    1684                 :           0 :                    (s1, gimple_omp_taskgroup_clauses (stmt));
    1685                 :           0 :           break;
    1686                 :             : 
    1687                 :           0 :         case GIMPLE_OMP_ORDERED:
    1688                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1689                 :           0 :           copy = gimple_build_omp_ordered
    1690                 :           0 :                    (s1,
    1691                 :           0 :                     gimple_omp_ordered_clauses (as_a <gomp_ordered *> (stmt)));
    1692                 :           0 :           break;
    1693                 :             : 
    1694                 :           0 :         case GIMPLE_OMP_SCAN:
    1695                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1696                 :           0 :           copy = gimple_build_omp_scan
    1697                 :           0 :                    (s1, gimple_omp_scan_clauses (as_a <gomp_scan *> (stmt)));
    1698                 :           0 :           break;
    1699                 :             : 
    1700                 :           0 :         case GIMPLE_OMP_SECTION:
    1701                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1702                 :           0 :           copy = gimple_build_omp_section (s1);
    1703                 :           0 :           break;
    1704                 :             : 
    1705                 :           0 :         case GIMPLE_OMP_SECTIONS:
    1706                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1707                 :           0 :           copy = gimple_build_omp_sections
    1708                 :           0 :                    (s1, gimple_omp_sections_clauses (stmt));
    1709                 :           0 :           break;
    1710                 :             : 
    1711                 :           0 :         case GIMPLE_OMP_STRUCTURED_BLOCK:
    1712                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1713                 :           0 :           copy = gimple_build_omp_structured_block (s1);
    1714                 :           0 :           break;
    1715                 :             : 
    1716                 :           0 :         case GIMPLE_OMP_SINGLE:
    1717                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1718                 :           0 :           copy = gimple_build_omp_single
    1719                 :           0 :                    (s1, gimple_omp_single_clauses (stmt));
    1720                 :           0 :           break;
    1721                 :             : 
    1722                 :           0 :         case GIMPLE_OMP_TARGET:
    1723                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1724                 :           0 :           copy = gimple_build_omp_target
    1725                 :           0 :                    (s1, gimple_omp_target_kind (stmt),
    1726                 :             :                     gimple_omp_target_clauses (stmt));
    1727                 :           0 :           break;
    1728                 :             : 
    1729                 :           0 :         case GIMPLE_OMP_TEAMS:
    1730                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1731                 :           0 :           copy = gimple_build_omp_teams
    1732                 :           0 :                    (s1, gimple_omp_teams_clauses (stmt));
    1733                 :           0 :           break;
    1734                 :             : 
    1735                 :           0 :         case GIMPLE_OMP_CRITICAL:
    1736                 :           0 :           s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
    1737                 :           0 :           copy = gimple_build_omp_critical (s1,
    1738                 :             :                                             gimple_omp_critical_name
    1739                 :           0 :                                               (as_a <gomp_critical *> (stmt)),
    1740                 :             :                                             gimple_omp_critical_clauses
    1741                 :           0 :                                               (as_a <gomp_critical *> (stmt)));
    1742                 :           0 :           break;
    1743                 :             : 
    1744                 :           0 :         case GIMPLE_ASSUME:
    1745                 :           0 :           s1 = remap_gimple_seq (gimple_assume_body (stmt), id);
    1746                 :           0 :           copy = gimple_build_assume (gimple_assume_guard (stmt), s1);
    1747                 :           0 :           break;
    1748                 :             : 
    1749                 :          43 :         case GIMPLE_TRANSACTION:
    1750                 :          43 :           {
    1751                 :          43 :             gtransaction *old_trans_stmt = as_a <gtransaction *> (stmt);
    1752                 :          43 :             gtransaction *new_trans_stmt;
    1753                 :          43 :             s1 = remap_gimple_seq (gimple_transaction_body (old_trans_stmt),
    1754                 :             :                                    id);
    1755                 :          43 :             copy = new_trans_stmt = gimple_build_transaction (s1);
    1756                 :          43 :             gimple_transaction_set_subcode (new_trans_stmt,
    1757                 :             :               gimple_transaction_subcode (old_trans_stmt));
    1758                 :          43 :             gimple_transaction_set_label_norm (new_trans_stmt,
    1759                 :             :               gimple_transaction_label_norm (old_trans_stmt));
    1760                 :          43 :             gimple_transaction_set_label_uninst (new_trans_stmt,
    1761                 :             :               gimple_transaction_label_uninst (old_trans_stmt));
    1762                 :          43 :             gimple_transaction_set_label_over (new_trans_stmt,
    1763                 :             :               gimple_transaction_label_over (old_trans_stmt));
    1764                 :             :           }
    1765                 :          43 :           break;
    1766                 :             : 
    1767                 :           0 :         default:
    1768                 :           0 :           gcc_unreachable ();
    1769                 :             :         }
    1770                 :             :     }
    1771                 :             :   else
    1772                 :             :     {
    1773                 :    61927435 :       if (gimple_assign_single_p (stmt)
    1774                 :    10767954 :           && gimple_assign_lhs (stmt) == gimple_assign_rhs1 (stmt)
    1775                 :    61927435 :           && auto_var_in_fn_p (gimple_assign_lhs (stmt), id->src_fn))
    1776                 :             :         {
    1777                 :             :           /* Here we handle statements that are not completely rewritten.
    1778                 :             :              First we detect some inlining-induced bogosities for
    1779                 :             :              discarding.  */
    1780                 :             : 
    1781                 :             :           /* Some assignments VAR = VAR; don't generate any rtl code
    1782                 :             :              and thus don't count as variable modification.  Avoid
    1783                 :             :              keeping bogosities like 0 = 0.  */
    1784                 :           0 :           tree decl = gimple_assign_lhs (stmt), value;
    1785                 :           0 :           tree *n;
    1786                 :             : 
    1787                 :           0 :           n = id->decl_map->get (decl);
    1788                 :           0 :           if (n)
    1789                 :             :             {
    1790                 :           0 :               value = *n;
    1791                 :           0 :               STRIP_TYPE_NOPS (value);
    1792                 :           0 :               if (TREE_CONSTANT (value) || TREE_READONLY (value))
    1793                 :           0 :                 return NULL;
    1794                 :             :             }
    1795                 :             :         }
    1796                 :             : 
    1797                 :             :       /* For *ptr_N ={v} {CLOBBER}, if ptr_N is SSA_NAME defined
    1798                 :             :          in a block that we aren't copying during tree_function_versioning,
    1799                 :             :          just drop the clobber stmt.  */
    1800                 :    61927435 :       if (id->blocks_to_copy && gimple_clobber_p (stmt))
    1801                 :             :         {
    1802                 :       20567 :           tree lhs = gimple_assign_lhs (stmt);
    1803                 :       20567 :           if (TREE_CODE (lhs) == MEM_REF
    1804                 :       20567 :               && TREE_CODE (TREE_OPERAND (lhs, 0)) == SSA_NAME)
    1805                 :             :             {
    1806                 :         942 :               gimple *def_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (lhs, 0));
    1807                 :         942 :               if (gimple_bb (def_stmt)
    1808                 :        1375 :                   && !bitmap_bit_p (id->blocks_to_copy,
    1809                 :         433 :                                     gimple_bb (def_stmt)->index))
    1810                 :             :                 return NULL;
    1811                 :             :             }
    1812                 :             :         }
    1813                 :             :      
    1814                 :             :       /* We do not allow CLOBBERs of handled components.  In case
    1815                 :             :          returned value is stored via such handled component, remove
    1816                 :             :          the clobber so stmt verifier is happy.  */
    1817                 :    61927432 :       if (gimple_clobber_p (stmt)
    1818                 :    61927432 :           && TREE_CODE (gimple_assign_lhs (stmt)) == RESULT_DECL)
    1819                 :             :         {
    1820                 :          10 :           tree remapped = remap_decl (gimple_assign_lhs (stmt), id);
    1821                 :          10 :           if (!DECL_P (remapped)
    1822                 :           0 :               && TREE_CODE (remapped) != MEM_REF)
    1823                 :             :             return NULL;
    1824                 :             :         }
    1825                 :             : 
    1826                 :    61927432 :       if (gimple_debug_bind_p (stmt))
    1827                 :             :         {
    1828                 :    28013537 :           tree var = gimple_debug_bind_get_var (stmt);
    1829                 :    28013537 :           tree value = gimple_debug_bind_get_value (stmt);
    1830                 :    28013537 :           if (id->param_body_adjs
    1831                 :    28013537 :               && id->param_body_adjs->m_dead_stmts.contains (stmt))
    1832                 :             :             {
    1833                 :        7576 :               value = unshare_expr_without_location (value);
    1834                 :        7576 :               id->param_body_adjs->remap_with_debug_expressions (&value);
    1835                 :             :             }
    1836                 :             : 
    1837                 :    28013537 :           gdebug *copy = gimple_build_debug_bind (var, value, stmt);
    1838                 :    28013537 :           if (id->reset_location)
    1839                 :           3 :             gimple_set_location (copy, input_location);
    1840                 :    28013537 :           id->debug_stmts.safe_push (copy);
    1841                 :    28013537 :           gimple_seq_add_stmt_without_update (&stmts, copy);
    1842                 :    28013537 :           return stmts;
    1843                 :             :         }
    1844                 :    33913895 :       if (gimple_debug_source_bind_p (stmt))
    1845                 :             :         {
    1846                 :      378810 :           gdebug *copy = gimple_build_debug_source_bind
    1847                 :      378810 :                            (gimple_debug_source_bind_get_var (stmt),
    1848                 :             :                             gimple_debug_source_bind_get_value (stmt),
    1849                 :      378810 :                             stmt);
    1850                 :      378810 :           if (id->reset_location)
    1851                 :           0 :             gimple_set_location (copy, input_location);
    1852                 :      378810 :           id->debug_stmts.safe_push (copy);
    1853                 :      378810 :           gimple_seq_add_stmt_without_update (&stmts, copy);
    1854                 :      378810 :           return stmts;
    1855                 :             :         }
    1856                 :    33535085 :       if (gimple_debug_nonbind_marker_p (stmt))
    1857                 :             :         {
    1858                 :             :           /* If the inlined function has too many debug markers,
    1859                 :             :              don't copy them.  */
    1860                 :     9483165 :           if (id->src_cfun->debug_marker_count
    1861                 :     9483165 :               > param_max_debug_marker_count
    1862                 :     9483165 :               || id->reset_location)
    1863                 :           0 :             return stmts;
    1864                 :             : 
    1865                 :     9483165 :           gdebug *copy = as_a <gdebug *> (gimple_copy (stmt));
    1866                 :     9483165 :           id->debug_stmts.safe_push (copy);
    1867                 :     9483165 :           gimple_seq_add_stmt_without_update (&stmts, copy);
    1868                 :     9483165 :           return stmts;
    1869                 :             :         }
    1870                 :             : 
    1871                 :             :       /* Create a new deep copy of the statement.  */
    1872                 :    24051920 :       copy = gimple_copy (stmt);
    1873                 :             : 
    1874                 :             :       /* Clear flags that need revisiting.  */
    1875                 :    24051920 :       if (gcall *call_stmt = dyn_cast <gcall *> (copy))
    1876                 :             :         {
    1877                 :     3770342 :           if (gimple_call_tail_p (call_stmt))
    1878                 :          96 :             gimple_call_set_tail (call_stmt, false);
    1879                 :     3770342 :           if (gimple_call_from_thunk_p (call_stmt))
    1880                 :         119 :             gimple_call_set_from_thunk (call_stmt, false);
    1881                 :     3770342 :           if (gimple_call_internal_p (call_stmt))
    1882                 :       26908 :             switch (gimple_call_internal_fn (call_stmt))
    1883                 :             :               {
    1884                 :         128 :               case IFN_GOMP_SIMD_LANE:
    1885                 :         128 :               case IFN_GOMP_SIMD_VF:
    1886                 :         128 :               case IFN_GOMP_SIMD_LAST_LANE:
    1887                 :         128 :               case IFN_GOMP_SIMD_ORDERED_START:
    1888                 :         128 :               case IFN_GOMP_SIMD_ORDERED_END:
    1889                 :         128 :                 DECL_STRUCT_FUNCTION (id->dst_fn)->has_simduid_loops = true;
    1890                 :         128 :                 break;
    1891                 :             :               default:
    1892                 :             :                 break;
    1893                 :             :               }
    1894                 :             :         }
    1895                 :             : 
    1896                 :             :       /* Remap the region numbers for __builtin_eh_{pointer,filter},
    1897                 :             :          RESX and EH_DISPATCH.  */
    1898                 :    24051920 :       if (id->eh_map)
    1899                 :    24051920 :         switch (gimple_code (copy))
    1900                 :             :           {
    1901                 :     3770342 :           case GIMPLE_CALL:
    1902                 :     3770342 :             {
    1903                 :     3770342 :               tree r, fndecl = gimple_call_fndecl (copy);
    1904                 :     3770342 :               if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
    1905                 :      869693 :                 switch (DECL_FUNCTION_CODE (fndecl))
    1906                 :             :                   {
    1907                 :           0 :                   case BUILT_IN_EH_COPY_VALUES:
    1908                 :           0 :                     r = gimple_call_arg (copy, 1);
    1909                 :           0 :                     r = remap_eh_region_tree_nr (r, id);
    1910                 :           0 :                     gimple_call_set_arg (copy, 1, r);
    1911                 :             :                     /* FALLTHRU */
    1912                 :             : 
    1913                 :        7571 :                   case BUILT_IN_EH_POINTER:
    1914                 :        7571 :                   case BUILT_IN_EH_FILTER:
    1915                 :        7571 :                     r = gimple_call_arg (copy, 0);
    1916                 :        7571 :                     r = remap_eh_region_tree_nr (r, id);
    1917                 :        7571 :                     gimple_call_set_arg (copy, 0, r);
    1918                 :        7571 :                     break;
    1919                 :             : 
    1920                 :             :                   default:
    1921                 :             :                     break;
    1922                 :             :                   }
    1923                 :             : 
    1924                 :             :               /* Reset alias info if we didn't apply measures to
    1925                 :             :                  keep it valid over inlining by setting DECL_PT_UID.  */
    1926                 :     3770342 :               if (!id->src_cfun->gimple_df
    1927                 :     3770342 :                   || !id->src_cfun->gimple_df->ipa_pta)
    1928                 :     3764388 :                 gimple_call_reset_alias_info (as_a <gcall *> (copy));
    1929                 :             :             }
    1930                 :             :             break;
    1931                 :             : 
    1932                 :       80744 :           case GIMPLE_RESX:
    1933                 :       80744 :             {
    1934                 :       80744 :               gresx *resx_stmt = as_a <gresx *> (copy);
    1935                 :       80744 :               int r = gimple_resx_region (resx_stmt);
    1936                 :       80744 :               r = remap_eh_region_nr (r, id);
    1937                 :       80744 :               gimple_resx_set_region (resx_stmt, r);
    1938                 :             :             }
    1939                 :       80744 :             break;
    1940                 :             : 
    1941                 :        8863 :           case GIMPLE_EH_DISPATCH:
    1942                 :        8863 :             {
    1943                 :        8863 :               geh_dispatch *eh_dispatch = as_a <geh_dispatch *> (copy);
    1944                 :        8863 :               int r = gimple_eh_dispatch_region (eh_dispatch);
    1945                 :        8863 :               r = remap_eh_region_nr (r, id);
    1946                 :        8863 :               gimple_eh_dispatch_set_region (eh_dispatch, r);
    1947                 :             :             }
    1948                 :        8863 :             break;
    1949                 :             : 
    1950                 :             :           default:
    1951                 :             :             break;
    1952                 :             :           }
    1953                 :             :     }
    1954                 :             : 
    1955                 :             :   /* If STMT has a block defined, map it to the newly constructed block.  */
    1956                 :    25757837 :   if (tree block = gimple_block (copy))
    1957                 :             :     {
    1958                 :    23309678 :       tree *n;
    1959                 :    23309678 :       n = id->decl_map->get (block);
    1960                 :    23309678 :       gcc_assert (n);
    1961                 :    23309678 :       gimple_set_block (copy, *n);
    1962                 :             :     }
    1963                 :    25757837 :   if (id->param_body_adjs)
    1964                 :             :     {
    1965                 :     2621549 :       gimple_seq extra_stmts = NULL;
    1966                 :     2621549 :       id->param_body_adjs->modify_gimple_stmt (&copy, &extra_stmts, stmt);
    1967                 :     2621549 :       if (!gimple_seq_empty_p (extra_stmts))
    1968                 :             :         {
    1969                 :           5 :           memset (&wi, 0, sizeof (wi));
    1970                 :           5 :           wi.info = id;
    1971                 :           5 :           for (gimple_stmt_iterator egsi = gsi_start (extra_stmts);
    1972                 :          10 :                !gsi_end_p (egsi);
    1973                 :           5 :                gsi_next (&egsi))
    1974                 :           5 :             walk_gimple_op (gsi_stmt (egsi), remap_gimple_op_r, &wi);
    1975                 :           5 :           gimple_seq_add_seq_without_update (&stmts, extra_stmts);
    1976                 :             :         }
    1977                 :             :     }
    1978                 :             : 
    1979                 :    25757837 :   if (id->reset_location)
    1980                 :         492 :     gimple_set_location (copy, input_location);
    1981                 :             : 
    1982                 :             :   /* Debug statements ought to be rebuilt and not copied.  */
    1983                 :    25757837 :   gcc_checking_assert (!is_gimple_debug (copy));
    1984                 :             : 
    1985                 :             :   /* Remap all the operands in COPY.  */
    1986                 :    25757837 :   memset (&wi, 0, sizeof (wi));
    1987                 :    25757837 :   wi.info = id;
    1988                 :    25757837 :   if (skip_first)
    1989                 :     1705874 :     walk_tree (gimple_op_ptr (copy, 1), remap_gimple_op_r, &wi, NULL);
    1990                 :             :   else
    1991                 :    24051963 :     walk_gimple_op (copy, remap_gimple_op_r, &wi);
    1992                 :             : 
    1993                 :             :   /* Clear the copied virtual operands.  We are not remapping them here
    1994                 :             :      but are going to recreate them from scratch.  */
    1995                 :    25757837 :   if (gimple_has_mem_ops (copy))
    1996                 :             :     {
    1997                 :    22334596 :       gimple_set_vdef (copy, NULL_TREE);
    1998                 :    22334596 :       gimple_set_vuse (copy, NULL_TREE);
    1999                 :             :     }
    2000                 :             : 
    2001                 :    25757837 :   if (cfun->can_throw_non_call_exceptions)
    2002                 :             :     {
    2003                 :             :       /* When inlining a function which does not have non-call exceptions
    2004                 :             :          enabled into a function that has (which only happens with
    2005                 :             :          always-inline) we have to fixup stmts that cannot throw.  */
    2006                 :     1752982 :       if (gcond *cond = dyn_cast <gcond *> (copy))
    2007                 :      195506 :         if (gimple_could_trap_p (cond))
    2008                 :             :           {
    2009                 :           1 :             gassign *cmp
    2010                 :           1 :               = gimple_build_assign (make_ssa_name (boolean_type_node),
    2011                 :             :                                      gimple_cond_code (cond),
    2012                 :             :                                      gimple_cond_lhs (cond),
    2013                 :             :                                      gimple_cond_rhs (cond));
    2014                 :           1 :             gimple_seq_add_stmt_without_update (&stmts, cmp);
    2015                 :           1 :             gimple_cond_set_code (cond, NE_EXPR);
    2016                 :           1 :             gimple_cond_set_lhs (cond, gimple_assign_lhs (cmp));
    2017                 :           1 :             gimple_cond_set_rhs (cond, boolean_false_node);
    2018                 :             :           }
    2019                 :             :     }
    2020                 :             : 
    2021                 :    25757837 :   gimple_seq_add_stmt_without_update (&stmts, copy);
    2022                 :    25757837 :   return stmts;
    2023                 :             : }
    2024                 :             : 
    2025                 :             : 
    2026                 :             : /* Copy basic block, scale profile accordingly.  Edges will be taken care of
    2027                 :             :    later  */
    2028                 :             : 
    2029                 :             : static basic_block
    2030                 :    10987765 : copy_bb (copy_body_data *id, basic_block bb,
    2031                 :             :          profile_count num, profile_count den)
    2032                 :             : {
    2033                 :    10987765 :   gimple_stmt_iterator gsi, copy_gsi, seq_gsi;
    2034                 :    10987765 :   basic_block copy_basic_block;
    2035                 :    10987765 :   tree decl;
    2036                 :    10987765 :   basic_block prev;
    2037                 :             : 
    2038                 :    10987765 :   profile_count::adjust_for_ipa_scaling (&num, &den);
    2039                 :             : 
    2040                 :             :   /* Search for previous copied basic block.  */
    2041                 :    10987765 :   prev = bb->prev_bb;
    2042                 :    11121212 :   while (!prev->aux)
    2043                 :      133447 :     prev = prev->prev_bb;
    2044                 :             : 
    2045                 :             :   /* create_basic_block() will append every new block to
    2046                 :             :      basic_block_info automatically.  */
    2047                 :    10987765 :   copy_basic_block = create_basic_block (NULL, (basic_block) prev->aux);
    2048                 :    10987765 :   copy_basic_block->count = bb->count.apply_scale (num, den);
    2049                 :             : 
    2050                 :    10987765 :   copy_gsi = gsi_start_bb (copy_basic_block);
    2051                 :             : 
    2052                 :    10987765 :   unsigned min_cond_uid = 0;
    2053                 :    10987765 :   if (id->src_cfun->cond_uids)
    2054                 :             :     {
    2055                 :          23 :       if (!cfun->cond_uids)
    2056                 :           3 :         cfun->cond_uids = new hash_map <gcond*, unsigned> ();
    2057                 :             : 
    2058                 :          92 :       for (auto itr : *id->src_cfun->cond_uids)
    2059                 :          23 :         if (itr.second >= min_cond_uid)
    2060                 :          23 :           min_cond_uid = itr.second + 1;
    2061                 :             :     }
    2062                 :             : 
    2063                 :    87553174 :   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
    2064                 :             :     {
    2065                 :    65577644 :       gimple_seq stmts;
    2066                 :    65577644 :       gimple *stmt = gsi_stmt (gsi);
    2067                 :    65577644 :       gimple *orig_stmt = stmt;
    2068                 :    65577644 :       gimple_stmt_iterator stmts_gsi;
    2069                 :    65577644 :       bool stmt_added = false;
    2070                 :             : 
    2071                 :    65577644 :       id->regimplify = false;
    2072                 :    65577644 :       stmts = remap_gimple_stmt (stmt, id);
    2073                 :             : 
    2074                 :    65577644 :       if (gimple_seq_empty_p (stmts))
    2075                 :     1943676 :         continue;
    2076                 :             : 
    2077                 :    63634287 :       seq_gsi = copy_gsi;
    2078                 :             : 
    2079                 :    63634287 :       for (stmts_gsi = gsi_start (stmts);
    2080                 :   127268580 :            !gsi_end_p (stmts_gsi); )
    2081                 :             :         {
    2082                 :    63634293 :           stmt = gsi_stmt (stmts_gsi);
    2083                 :             : 
    2084                 :             :           /* Advance iterator now before stmt is moved to seq_gsi.  */
    2085                 :    63634293 :           gsi_next (&stmts_gsi);
    2086                 :             : 
    2087                 :    63634293 :           if (gimple_nop_p (stmt))
    2088                 :         319 :               continue;
    2089                 :             : 
    2090                 :             :           /* If -fcondition-coverage is used, register the inlined conditions
    2091                 :             :              in the cond->expression mapping of the caller.  The expression tag
    2092                 :             :              is shifted conditions from the two bodies are not mixed.  */
    2093                 :    63633974 :           if (id->src_cfun->cond_uids && is_a <gcond*> (stmt))
    2094                 :             :             {
    2095                 :           5 :               gcond *orig_cond = as_a <gcond*> (orig_stmt);
    2096                 :           5 :               gcond *cond = as_a <gcond*> (stmt);
    2097                 :           5 :               unsigned *v = id->src_cfun->cond_uids->get (orig_cond);
    2098                 :           5 :               if (v)
    2099                 :           5 :                 cfun->cond_uids->put (cond, *v + min_cond_uid);
    2100                 :             :             }
    2101                 :             : 
    2102                 :    63633974 :           gimple_duplicate_stmt_histograms (cfun, stmt, id->src_cfun,
    2103                 :             :                                             orig_stmt);
    2104                 :             : 
    2105                 :    63633974 :           gsi_insert_after (&seq_gsi, stmt, GSI_NEW_STMT);
    2106                 :             : 
    2107                 :    63633974 :           if (id->regimplify)
    2108                 :          81 :             gimple_regimplify_operands (stmt, &seq_gsi);
    2109                 :             : 
    2110                 :             :           stmt_added = true;
    2111                 :             :         }
    2112                 :             : 
    2113                 :    63634287 :       if (!stmt_added)
    2114                 :         319 :         continue;
    2115                 :             : 
    2116                 :             :       /* If copy_basic_block has been empty at the start of this iteration,
    2117                 :             :          call gsi_start_bb again to get at the newly added statements.  */
    2118                 :    63633968 :       if (gsi_end_p (copy_gsi))
    2119                 :    19274950 :         copy_gsi = gsi_start_bb (copy_basic_block);
    2120                 :             :       else
    2121                 :    53996493 :         gsi_next (&copy_gsi);
    2122                 :             : 
    2123                 :             :       /* Process the new statement.  The call to gimple_regimplify_operands
    2124                 :             :          possibly turned the statement into multiple statements, we
    2125                 :             :          need to process all of them.  */
    2126                 :    63633983 :       do
    2127                 :             :         {
    2128                 :    63633983 :           tree fn;
    2129                 :    63633983 :           gcall *call_stmt;
    2130                 :             : 
    2131                 :    63633983 :           stmt = gsi_stmt (copy_gsi);
    2132                 :    63633983 :           call_stmt = dyn_cast <gcall *> (stmt);
    2133                 :     3770342 :           if (call_stmt
    2134                 :     3770342 :               && gimple_call_va_arg_pack_p (call_stmt)
    2135                 :         347 :               && id->call_stmt
    2136                 :         345 :               && ! gimple_call_va_arg_pack_p (id->call_stmt))
    2137                 :             :             {
    2138                 :             :               /* __builtin_va_arg_pack () should be replaced by
    2139                 :             :                  all arguments corresponding to ... in the caller.  */
    2140                 :         331 :               tree p;
    2141                 :         331 :               gcall *new_call;
    2142                 :         331 :               vec<tree> argarray;
    2143                 :         331 :               size_t nargs_caller = gimple_call_num_args (id->call_stmt);
    2144                 :         331 :               size_t nargs = nargs_caller;
    2145                 :             : 
    2146                 :         834 :               for (p = DECL_ARGUMENTS (id->src_fn); p; p = DECL_CHAIN (p))
    2147                 :             :                 {
    2148                 :             :                   /* Avoid crashing on invalid IL that doesn't have a
    2149                 :             :                      varargs function or that passes not enough arguments.  */
    2150                 :         519 :                   if (nargs == 0)
    2151                 :             :                     break;
    2152                 :         503 :                   nargs--;
    2153                 :             :                 }
    2154                 :             : 
    2155                 :             :               /* Create the new array of arguments.  */
    2156                 :         331 :               size_t nargs_callee = gimple_call_num_args (call_stmt);
    2157                 :         331 :               size_t n = nargs + nargs_callee;
    2158                 :         331 :               argarray.create (n);
    2159                 :         331 :               argarray.safe_grow_cleared (n, true);
    2160                 :             : 
    2161                 :             :               /* Copy all the arguments before '...'  */
    2162                 :         331 :               if (nargs_callee)
    2163                 :         662 :                 memcpy (argarray.address (),
    2164                 :         331 :                         gimple_call_arg_ptr (call_stmt, 0),
    2165                 :             :                         nargs_callee * sizeof (tree));
    2166                 :             : 
    2167                 :             :               /* Append the arguments passed in '...'  */
    2168                 :         331 :               if (nargs)
    2169                 :         182 :                 memcpy (argarray.address () + nargs_callee,
    2170                 :         182 :                         gimple_call_arg_ptr (id->call_stmt, 0)
    2171                 :         182 :                         + (nargs_caller - nargs), nargs * sizeof (tree));
    2172                 :             : 
    2173                 :         331 :               new_call = gimple_build_call_vec (gimple_call_fn (call_stmt),
    2174                 :             :                                                 argarray);
    2175                 :             : 
    2176                 :         331 :               argarray.release ();
    2177                 :             : 
    2178                 :             :               /* Copy all GIMPLE_CALL flags, location and block, except
    2179                 :             :                  GF_CALL_VA_ARG_PACK.  */
    2180                 :         331 :               gimple_call_copy_flags (new_call, call_stmt);
    2181                 :         331 :               gimple_call_set_va_arg_pack (new_call, false);
    2182                 :         662 :               gimple_call_set_fntype (new_call, gimple_call_fntype (call_stmt));
    2183                 :             :               /* location includes block.  */
    2184                 :         331 :               gimple_set_location (new_call, gimple_location (stmt));
    2185                 :         331 :               gimple_call_set_lhs (new_call, gimple_call_lhs (call_stmt));
    2186                 :             : 
    2187                 :         331 :               gsi_replace (&copy_gsi, new_call, false);
    2188                 :         331 :               stmt = new_call;
    2189                 :             :             }
    2190                 :    63633652 :           else if (call_stmt
    2191                 :     3770011 :                    && id->call_stmt
    2192                 :     3003367 :                    && (decl = gimple_call_fndecl (stmt))
    2193                 :    66531371 :                    && fndecl_built_in_p (decl, BUILT_IN_VA_ARG_PACK_LEN))
    2194                 :             :             {
    2195                 :             :               /* __builtin_va_arg_pack_len () should be replaced by
    2196                 :             :                  the number of anonymous arguments.  */
    2197                 :         174 :               size_t nargs = gimple_call_num_args (id->call_stmt);
    2198                 :         174 :               tree count, p;
    2199                 :         174 :               gimple *new_stmt;
    2200                 :             : 
    2201                 :         504 :               for (p = DECL_ARGUMENTS (id->src_fn); p; p = DECL_CHAIN (p))
    2202                 :         330 :                 nargs--;
    2203                 :             : 
    2204                 :         174 :               if (!gimple_call_lhs (stmt))
    2205                 :             :                 {
    2206                 :             :                   /* Drop unused calls.  */
    2207                 :           1 :                   gsi_remove (&copy_gsi, false);
    2208                 :           1 :                   continue;
    2209                 :             :                 }
    2210                 :         173 :               else if (!gimple_call_va_arg_pack_p (id->call_stmt))
    2211                 :             :                 {
    2212                 :         151 :                   count = build_int_cst (integer_type_node, nargs);
    2213                 :         151 :                   new_stmt = gimple_build_assign (gimple_call_lhs (stmt), count);
    2214                 :         151 :                   gsi_replace (&copy_gsi, new_stmt, false);
    2215                 :         151 :                   stmt = new_stmt;
    2216                 :             :                 }
    2217                 :          22 :               else if (nargs != 0)
    2218                 :             :                 {
    2219                 :           7 :                   tree newlhs = create_tmp_reg_or_ssa_name (integer_type_node);
    2220                 :           7 :                   count = build_int_cst (integer_type_node, nargs);
    2221                 :           7 :                   new_stmt = gimple_build_assign (gimple_call_lhs (stmt),
    2222                 :             :                                                   PLUS_EXPR, newlhs, count);
    2223                 :           7 :                   gimple_call_set_lhs (stmt, newlhs);
    2224                 :           7 :                   gsi_insert_after (&copy_gsi, new_stmt, GSI_NEW_STMT);
    2225                 :             :                 }
    2226                 :             :             }
    2227                 :    63633579 :           else if (call_stmt
    2228                 :     3769837 :                    && id->call_stmt
    2229                 :     3003193 :                    && gimple_call_internal_p (stmt)
    2230                 :    63655833 :                    && gimple_call_internal_fn (stmt) == IFN_TSAN_FUNC_EXIT)
    2231                 :             :             {
    2232                 :             :               /* Drop TSAN_FUNC_EXIT () internal calls during inlining.  */
    2233                 :         101 :               gsi_remove (&copy_gsi, false);
    2234                 :         101 :               continue;
    2235                 :             :             }
    2236                 :             : 
    2237                 :             :           /* Statements produced by inlining can be unfolded, especially
    2238                 :             :              when we constant propagated some operands.  We can't fold
    2239                 :             :              them right now for two reasons:
    2240                 :             :              1) folding require SSA_NAME_DEF_STMTs to be correct
    2241                 :             :              2) we can't change function calls to builtins.
    2242                 :             :              So we just mark statement for later folding.  We mark
    2243                 :             :              all new statements, instead just statements that has changed
    2244                 :             :              by some nontrivial substitution so even statements made
    2245                 :             :              foldable indirectly are updated.  If this turns out to be
    2246                 :             :              expensive, copy_body can be told to watch for nontrivial
    2247                 :             :              changes.  */
    2248                 :    63633881 :           if (id->statements_to_fold)
    2249                 :    63633881 :             id->statements_to_fold->add (stmt);
    2250                 :             : 
    2251                 :             :           /* We're duplicating a CALL_EXPR.  Find any corresponding
    2252                 :             :              callgraph edges and update or duplicate them.  */
    2253                 :    63633881 :           if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
    2254                 :             :             {
    2255                 :     3770089 :               struct cgraph_edge *edge;
    2256                 :             : 
    2257                 :     3770089 :               switch (id->transform_call_graph_edges)
    2258                 :             :                 {
    2259                 :     3003445 :                 case CB_CGE_DUPLICATE:
    2260                 :     3003445 :                   edge = id->src_node->get_edge (orig_stmt);
    2261                 :     3003445 :                   if (edge)
    2262                 :             :                     {
    2263                 :     2981191 :                       struct cgraph_edge *old_edge = edge;
    2264                 :             : 
    2265                 :             :                       /* A speculative call is consist of multiple
    2266                 :             :                          edges - indirect edge and one or more direct edges
    2267                 :             :                          Duplicate the whole thing and distribute frequencies
    2268                 :             :                          accordingly.  */
    2269                 :     2981191 :                       if (edge->speculative)
    2270                 :             :                         {
    2271                 :       12197 :                           int n = 0;
    2272                 :       12197 :                           profile_count direct_cnt
    2273                 :       12197 :                                  = profile_count::zero ();
    2274                 :             : 
    2275                 :             :                           /* First figure out the distribution of counts
    2276                 :             :                              so we can re-scale BB profile accordingly.  */
    2277                 :       24395 :                           for (cgraph_edge *e = old_edge; e;
    2278                 :       12198 :                                e = e->next_speculative_call_target ())
    2279                 :       12198 :                             direct_cnt = direct_cnt + e->count;
    2280                 :             : 
    2281                 :       12197 :                           cgraph_edge *indirect
    2282                 :       12197 :                                  = old_edge->speculative_call_indirect_edge ();
    2283                 :       12197 :                           profile_count indir_cnt = indirect->count;
    2284                 :             : 
    2285                 :             :                           /* Next iterate all direct edges, clone it and its
    2286                 :             :                              corresponding reference and update profile.  */
    2287                 :       12197 :                           for (cgraph_edge *e = old_edge;
    2288                 :       24395 :                                e;
    2289                 :       12198 :                                e = e->next_speculative_call_target ())
    2290                 :             :                             {
    2291                 :       12198 :                               profile_count cnt = e->count;
    2292                 :             : 
    2293                 :       12198 :                               id->dst_node->clone_reference
    2294                 :       12198 :                                  (e->speculative_call_target_ref (), stmt);
    2295                 :       12198 :                               edge = e->clone (id->dst_node, call_stmt,
    2296                 :             :                                                gimple_uid (stmt), num, den,
    2297                 :             :                                                true);
    2298                 :       12198 :                               profile_probability prob
    2299                 :       12198 :                                  = cnt.probability_in (direct_cnt
    2300                 :             :                                                        + indir_cnt);
    2301                 :       12198 :                               edge->count
    2302                 :             :                                  = copy_basic_block->count.apply_probability
    2303                 :       12198 :                                          (prob);
    2304                 :       12198 :                               n++;
    2305                 :             :                             }
    2306                 :       12197 :                           gcc_checking_assert
    2307                 :             :                                  (indirect->num_speculative_call_targets_p ()
    2308                 :             :                                   == n);
    2309                 :             : 
    2310                 :             :                           /* Duplicate the indirect edge after all direct edges
    2311                 :             :                              cloned.  */
    2312                 :       12197 :                           indirect = indirect->clone (id->dst_node, call_stmt,
    2313                 :             :                                                       gimple_uid (stmt),
    2314                 :             :                                                       num, den,
    2315                 :             :                                                       true);
    2316                 :             : 
    2317                 :       12197 :                           profile_probability prob
    2318                 :       12197 :                              = indir_cnt.probability_in (direct_cnt
    2319                 :             :                                                          + indir_cnt);
    2320                 :       12197 :                           indirect->count
    2321                 :       12197 :                              = copy_basic_block->count.apply_probability (prob);
    2322                 :             :                         }
    2323                 :             :                       else
    2324                 :             :                         {
    2325                 :     2968994 :                           edge = edge->clone (id->dst_node, call_stmt,
    2326                 :             :                                               gimple_uid (stmt),
    2327                 :             :                                               num, den,
    2328                 :             :                                               true);
    2329                 :     2968994 :                           edge->count = copy_basic_block->count;
    2330                 :             :                         }
    2331                 :             :                     }
    2332                 :             :                   break;
    2333                 :             : 
    2334                 :      575675 :                 case CB_CGE_MOVE_CLONES:
    2335                 :      575675 :                   id->dst_node->set_call_stmt_including_clones (orig_stmt,
    2336                 :             :                                                                 call_stmt);
    2337                 :      575675 :                   edge = id->dst_node->get_edge (stmt);
    2338                 :      575675 :                   break;
    2339                 :             : 
    2340                 :      190969 :                 case CB_CGE_MOVE:
    2341                 :      190969 :                   edge = id->dst_node->get_edge (orig_stmt);
    2342                 :      190969 :                   if (edge)
    2343                 :      190799 :                     edge = cgraph_edge::set_call_stmt (edge, call_stmt);
    2344                 :             :                   break;
    2345                 :             : 
    2346                 :           0 :                 default:
    2347                 :           0 :                   gcc_unreachable ();
    2348                 :             :                 }
    2349                 :             : 
    2350                 :             :               /* Constant propagation on argument done during inlining
    2351                 :             :                  may create new direct call.  Produce an edge for it.  */
    2352                 :     2968994 :               if ((!edge
    2353                 :     3648662 :                    || (edge->indirect_inlining_edge
    2354                 :        2348 :                        && id->transform_call_graph_edges == CB_CGE_MOVE_CLONES))
    2355                 :      121707 :                   && id->dst_node->definition
    2356                 :      805360 :                   && (fn = gimple_call_fndecl (stmt)) != NULL)
    2357                 :             :                 {
    2358                 :           0 :                   struct cgraph_node *dest = cgraph_node::get_create (fn);
    2359                 :             : 
    2360                 :             :                   /* We have missing edge in the callgraph.  This can happen
    2361                 :             :                      when previous inlining turned an indirect call into a
    2362                 :             :                      direct call by constant propagating arguments or we are
    2363                 :             :                      producing dead clone (for further cloning).  In all
    2364                 :             :                      other cases we hit a bug (incorrect node sharing is the
    2365                 :             :                      most common reason for missing edges).  */
    2366                 :           0 :                   gcc_assert (!dest->definition
    2367                 :             :                               || dest->address_taken
    2368                 :             :                               || !id->src_node->definition
    2369                 :             :                               || !id->dst_node->definition);
    2370                 :           0 :                   if (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES)
    2371                 :           0 :                     id->dst_node->create_edge_including_clones
    2372                 :           0 :                       (dest, orig_stmt, call_stmt, bb->count,
    2373                 :             :                        CIF_ORIGINALLY_INDIRECT_CALL);
    2374                 :             :                   else
    2375                 :           0 :                     id->dst_node->create_edge (dest, call_stmt,
    2376                 :             :                                         bb->count)->inline_failed
    2377                 :           0 :                       = CIF_ORIGINALLY_INDIRECT_CALL;
    2378                 :           0 :                   if (dump_file)
    2379                 :             :                     {
    2380                 :           0 :                       fprintf (dump_file, "Created new direct edge to %s\n",
    2381                 :             :                                dest->dump_name ());
    2382                 :             :                     }
    2383                 :             :                 }
    2384                 :             : 
    2385                 :     3770089 :               notice_special_calls (as_a <gcall *> (stmt));
    2386                 :             :             }
    2387                 :             : 
    2388                 :    63633881 :           maybe_duplicate_eh_stmt_fn (cfun, stmt, id->src_cfun, orig_stmt,
    2389                 :             :                                       id->eh_map, id->eh_lp_nr);
    2390                 :             : 
    2391                 :    63633881 :           gsi_next (&copy_gsi);
    2392                 :             :         }
    2393                 :    63633983 :       while (!gsi_end_p (copy_gsi));
    2394                 :             : 
    2395                 :   127267936 :       copy_gsi = gsi_last_bb (copy_basic_block);
    2396                 :             :     }
    2397                 :             : 
    2398                 :    10987765 :   return copy_basic_block;
    2399                 :             : }
    2400                 :             : 
    2401                 :             : /* Inserting Single Entry Multiple Exit region in SSA form into code in SSA
    2402                 :             :    form is quite easy, since dominator relationship for old basic blocks does
    2403                 :             :    not change.
    2404                 :             : 
    2405                 :             :    There is however exception where inlining might change dominator relation
    2406                 :             :    across EH edges from basic block within inlined functions destinating
    2407                 :             :    to landing pads in function we inline into.
    2408                 :             : 
    2409                 :             :    The function fills in PHI_RESULTs of such PHI nodes if they refer
    2410                 :             :    to gimple regs.  Otherwise, the function mark PHI_RESULT of such
    2411                 :             :    PHI nodes for renaming.  For non-gimple regs, renaming is safe: the
    2412                 :             :    EH edges are abnormal and SSA_NAME_OCCURS_IN_ABNORMAL_PHI must be
    2413                 :             :    set, and this means that there will be no overlapping live ranges
    2414                 :             :    for the underlying symbol.
    2415                 :             : 
    2416                 :             :    This might change in future if we allow redirecting of EH edges and
    2417                 :             :    we might want to change way build CFG pre-inlining to include
    2418                 :             :    all the possible edges then.  */
    2419                 :             : static void
    2420                 :      621975 : update_ssa_across_abnormal_edges (basic_block bb, basic_block ret_bb,
    2421                 :             :                                   bool can_throw, bool nonlocal_goto)
    2422                 :             : {
    2423                 :      621975 :   edge e;
    2424                 :      621975 :   edge_iterator ei;
    2425                 :             : 
    2426                 :     1727203 :   FOR_EACH_EDGE (e, ei, bb->succs)
    2427                 :     1105228 :     if (!e->dest->aux
    2428                 :      632632 :         || ((basic_block)e->dest->aux)->index == ENTRY_BLOCK)
    2429                 :             :       {
    2430                 :      472596 :         gphi *phi;
    2431                 :      472596 :         gphi_iterator si;
    2432                 :             : 
    2433                 :      472596 :         if (!nonlocal_goto)
    2434                 :      472394 :           gcc_assert (e->flags & EDGE_EH);
    2435                 :             : 
    2436                 :      472596 :         if (!can_throw)
    2437                 :         168 :           gcc_assert (!(e->flags & EDGE_EH));
    2438                 :             : 
    2439                 :      797274 :         for (si = gsi_start_phis (e->dest); !gsi_end_p (si); gsi_next (&si))
    2440                 :             :           {
    2441                 :      324678 :             edge re;
    2442                 :             : 
    2443                 :      324678 :             phi = si.phi ();
    2444                 :             : 
    2445                 :             :             /* For abnormal goto/call edges the receiver can be the
    2446                 :             :                ENTRY_BLOCK.  Do not assert this cannot happen.  */
    2447                 :             : 
    2448                 :      324678 :             gcc_assert ((e->flags & EDGE_EH)
    2449                 :             :                         || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)));
    2450                 :             : 
    2451                 :      324678 :             re = find_edge (ret_bb, e->dest);
    2452                 :      324678 :             gcc_checking_assert (re);
    2453                 :      324678 :             gcc_assert ((re->flags & (EDGE_EH | EDGE_ABNORMAL))
    2454                 :             :                         == (e->flags & (EDGE_EH | EDGE_ABNORMAL)));
    2455                 :             : 
    2456                 :      324678 :             SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
    2457                 :             :                      USE_FROM_PTR (PHI_ARG_DEF_PTR_FROM_EDGE (phi, re)));
    2458                 :             :           }
    2459                 :             :       }
    2460                 :      621975 : }
    2461                 :             : 
    2462                 :             : /* Insert clobbers for automatic variables of inlined ID->src_fn
    2463                 :             :    function at the start of basic block ID->eh_landing_pad_dest.  */
    2464                 :             : 
    2465                 :             : static void
    2466                 :      345239 : add_clobbers_to_eh_landing_pad (copy_body_data *id)
    2467                 :             : {
    2468                 :      345239 :   tree var;
    2469                 :      345239 :   basic_block bb = id->eh_landing_pad_dest;
    2470                 :      345239 :   live_vars_map *vars = NULL;
    2471                 :      345239 :   unsigned int cnt = 0;
    2472                 :      345239 :   unsigned int i;
    2473                 :      772638 :   FOR_EACH_VEC_SAFE_ELT (id->src_cfun->local_decls, i, var)
    2474                 :      427399 :     if (VAR_P (var)
    2475                 :      427399 :         && !DECL_HARD_REGISTER (var)
    2476                 :      427399 :         && !TREE_THIS_VOLATILE (var)
    2477                 :      427387 :         && !DECL_HAS_VALUE_EXPR_P (var)
    2478                 :      424837 :         && !is_gimple_reg (var)
    2479                 :      192684 :         && auto_var_in_fn_p (var, id->src_fn)
    2480                 :      618086 :         && !lookup_attribute ("omp simd array", DECL_ATTRIBUTES (var)))
    2481                 :             :       {
    2482                 :      190687 :         tree *t = id->decl_map->get (var);
    2483                 :      190687 :         if (!t)
    2484                 :           0 :           continue;
    2485                 :      190687 :         tree new_var = *t;
    2486                 :      190687 :         if (VAR_P (new_var)
    2487                 :      190687 :             && !DECL_HARD_REGISTER (new_var)
    2488                 :      190687 :             && !TREE_THIS_VOLATILE (new_var)
    2489                 :      190687 :             && !DECL_HAS_VALUE_EXPR_P (new_var)
    2490                 :      190687 :             && !is_gimple_reg (new_var)
    2491                 :      381374 :             && auto_var_in_fn_p (new_var, id->dst_fn))
    2492                 :             :           {
    2493                 :      190687 :             if (vars == NULL)
    2494                 :      101497 :               vars = new live_vars_map;
    2495                 :      190687 :             vars->put (DECL_UID (var), cnt++);
    2496                 :             :           }
    2497                 :             :       }
    2498                 :      345239 :   if (vars == NULL)
    2499                 :      243742 :     return;
    2500                 :             : 
    2501                 :      101497 :   vec<bitmap_head> live = compute_live_vars (id->src_cfun, vars);
    2502                 :      395763 :   FOR_EACH_VEC_SAFE_ELT (id->src_cfun->local_decls, i, var)
    2503                 :      294266 :     if (VAR_P (var))
    2504                 :             :       {
    2505                 :      294266 :         edge e;
    2506                 :      294266 :         edge_iterator ei;
    2507                 :      294266 :         bool needed = false;
    2508                 :      294266 :         unsigned int *v = vars->get (DECL_UID (var));
    2509                 :      294266 :         if (v == NULL)
    2510                 :      103579 :           continue;
    2511                 :     5209733 :         FOR_EACH_EDGE (e, ei, bb->preds)
    2512                 :     5137047 :           if ((e->flags & EDGE_EH) != 0
    2513                 :     5137047 :               && e->src->index >= id->add_clobbers_to_eh_landing_pads)
    2514                 :             :             {
    2515                 :      409656 :               basic_block src_bb = (basic_block) e->src->aux;
    2516                 :             : 
    2517                 :      409656 :               if (bitmap_bit_p (&live[src_bb->index], *v))
    2518                 :             :                 {
    2519                 :             :                   needed = true;
    2520                 :             :                   break;
    2521                 :             :                 }
    2522                 :             :             }
    2523                 :      190687 :         if (needed)
    2524                 :             :           {
    2525                 :      118001 :             tree new_var = *id->decl_map->get (var);
    2526                 :      118001 :             gimple_stmt_iterator gsi = gsi_after_labels (bb);
    2527                 :      118001 :             tree clobber = build_clobber (TREE_TYPE (new_var));
    2528                 :      118001 :             gimple *clobber_stmt = gimple_build_assign (new_var, clobber);
    2529                 :      118001 :             gsi_insert_before (&gsi, clobber_stmt, GSI_NEW_STMT);
    2530                 :             :           }
    2531                 :             :       }
    2532                 :      101497 :   destroy_live_vars (live);
    2533                 :      101497 :   delete vars;
    2534                 :             : }
    2535                 :             : 
    2536                 :             : /* Copy edges from BB into its copy constructed earlier, scale profile
    2537                 :             :    accordingly.  Edges will be taken care of later.  Assume aux
    2538                 :             :    pointers to point to the copies of each BB.  Return true if any
    2539                 :             :    debug stmts are left after a statement that must end the basic block.  */
    2540                 :             : 
    2541                 :             : static bool
    2542                 :    18636349 : copy_edges_for_bb (basic_block bb, profile_count num, profile_count den,
    2543                 :             :                    basic_block ret_bb, basic_block abnormal_goto_dest,
    2544                 :             :                    copy_body_data *id)
    2545                 :             : {
    2546                 :    18636349 :   basic_block new_bb = (basic_block) bb->aux;
    2547                 :    18636349 :   edge_iterator ei;
    2548                 :    18636349 :   edge old_edge;
    2549                 :    18636349 :   gimple_stmt_iterator si;
    2550                 :    18636349 :   bool need_debug_cleanup = false;
    2551                 :             : 
    2552                 :             :   /* Use the indices from the original blocks to create edges for the
    2553                 :             :      new ones.  */
    2554                 :    35836970 :   FOR_EACH_EDGE (old_edge, ei, bb->succs)
    2555                 :    17200621 :     if (!(old_edge->flags & EDGE_EH))
    2556                 :             :       {
    2557                 :    17051075 :         edge new_edge;
    2558                 :    17051075 :         int flags = old_edge->flags;
    2559                 :    17051075 :         location_t locus = old_edge->goto_locus;
    2560                 :             : 
    2561                 :             :         /* Return edges do get a FALLTHRU flag when they get inlined.  */
    2562                 :    17051075 :         if (old_edge->dest->index == EXIT_BLOCK
    2563                 :     3811092 :             && !(flags & (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE|EDGE_FAKE))
    2564                 :     3811092 :             && old_edge->dest->aux != EXIT_BLOCK_PTR_FOR_FN (cfun))
    2565                 :     3623035 :           flags |= EDGE_FALLTHRU;
    2566                 :             : 
    2567                 :    17051075 :         new_edge
    2568                 :    17051075 :           = make_edge (new_bb, (basic_block) old_edge->dest->aux, flags);
    2569                 :    17051075 :         new_edge->probability = old_edge->probability;
    2570                 :    17051075 :         if (!id->reset_location)
    2571                 :    17050776 :           new_edge->goto_locus = remap_location (locus, id);
    2572                 :             :       }
    2573                 :             : 
    2574                 :    18636349 :   if (bb->index == ENTRY_BLOCK || bb->index == EXIT_BLOCK)
    2575                 :             :     return false;
    2576                 :             : 
    2577                 :             :   /* When doing function splitting, we must decrease count of the return block
    2578                 :             :      which was previously reachable by block we did not copy.  */
    2579                 :    10987765 :   if (single_succ_p (bb) && single_succ_edge (bb)->dest->index == EXIT_BLOCK)
    2580                 :     9023178 :     FOR_EACH_EDGE (old_edge, ei, bb->preds)
    2581                 :     5212086 :       if (old_edge->src->index != ENTRY_BLOCK
    2582                 :     2848530 :           && !old_edge->src->aux)
    2583                 :       40932 :         new_bb->count -= old_edge->count ().apply_scale (num, den);
    2584                 :             : 
    2585                 :             :   /* Walk stmts from end to start so that splitting will adjust the BB
    2586                 :             :      pointer for each stmt at most once, even when we split the block
    2587                 :             :      multiple times.  */
    2588                 :    10987765 :   bool seen_nondebug = false;
    2589                 :    10987765 :   for (si = gsi_last_bb (new_bb); !gsi_end_p (si);)
    2590                 :             :     {
    2591                 :    63633888 :       bool can_throw, nonlocal_goto;
    2592                 :    63633888 :       gimple *copy_stmt = gsi_stmt (si);
    2593                 :             : 
    2594                 :             :       /* Do this before the possible split_block.  */
    2595                 :    63633888 :       gsi_prev (&si);
    2596                 :             : 
    2597                 :             :       /* If this tree could throw an exception, there are two
    2598                 :             :          cases where we need to add abnormal edge(s): the
    2599                 :             :          tree wasn't in a region and there is a "current
    2600                 :             :          region" in the caller; or the original tree had
    2601                 :             :          EH edges.  In both cases split the block after the tree,
    2602                 :             :          and add abnormal edge(s) as needed; we need both
    2603                 :             :          those from the callee and the caller.
    2604                 :             :          We check whether the copy can throw, because the const
    2605                 :             :          propagation can change an INDIRECT_REF which throws
    2606                 :             :          into a COMPONENT_REF which doesn't.  If the copy
    2607                 :             :          can throw, the original could also throw.  */
    2608                 :    63633888 :       can_throw = stmt_can_throw_internal (cfun, copy_stmt);
    2609                 :    63633888 :       nonlocal_goto
    2610                 :    63633888 :         = (stmt_can_make_abnormal_goto (copy_stmt)
    2611                 :    63633888 :            && !computed_goto_p (copy_stmt));
    2612                 :             : 
    2613                 :    63633888 :       if (can_throw || nonlocal_goto)
    2614                 :             :         {
    2615                 :             :           /* If there's only debug insns after copy_stmt don't split
    2616                 :             :              the block but instead mark the block for cleanup.  */
    2617                 :      622046 :           if (!seen_nondebug)
    2618                 :             :             need_debug_cleanup = true;
    2619                 :             :           else
    2620                 :             :             {
    2621                 :             :               /* Note that bb's predecessor edges aren't necessarily
    2622                 :             :                  right at this point; split_block doesn't care.  */
    2623                 :      194779 :               edge e = split_block (new_bb, copy_stmt);
    2624                 :      194779 :               e->dest->aux = new_bb->aux;
    2625                 :      194779 :               seen_nondebug = false;
    2626                 :             :             }
    2627                 :             :         }
    2628                 :             : 
    2629                 :    63633888 :       if (!is_gimple_debug (copy_stmt))
    2630                 :    25757438 :         seen_nondebug = true;
    2631                 :             : 
    2632                 :    63633888 :       bool update_probs = false;
    2633                 :             : 
    2634                 :    63633888 :       if (gimple_code (copy_stmt) == GIMPLE_EH_DISPATCH)
    2635                 :             :         {
    2636                 :        8863 :           make_eh_dispatch_edges (as_a <geh_dispatch *> (copy_stmt));
    2637                 :        8863 :           update_probs = true;
    2638                 :             :         }
    2639                 :    63625025 :       else if (can_throw)
    2640                 :             :         {
    2641                 :      621807 :           make_eh_edge (copy_stmt);
    2642                 :      621807 :           update_probs = true;
    2643                 :             :         }
    2644                 :             : 
    2645                 :             :       /* EH edges may not match old edges.  Copy as much as possible.  */
    2646                 :      630670 :       if (update_probs)
    2647                 :             :         {
    2648                 :      630670 :           edge e;
    2649                 :      630670 :           edge_iterator ei;
    2650                 :      630670 :           basic_block copy_stmt_bb = gimple_bb (copy_stmt);
    2651                 :             : 
    2652                 :     1313152 :           FOR_EACH_EDGE (old_edge, ei, bb->succs)
    2653                 :      682482 :             if ((old_edge->flags & EDGE_EH)
    2654                 :      165274 :                 && (e = find_edge (copy_stmt_bb,
    2655                 :      165274 :                                    (basic_block) old_edge->dest->aux))
    2656                 :      831883 :                 && (e->flags & EDGE_EH))
    2657                 :      149401 :               e->probability = old_edge->probability;
    2658                 :             :             
    2659                 :     1745286 :           FOR_EACH_EDGE (e, ei, copy_stmt_bb->succs)
    2660                 :     1114616 :             if (e->flags & EDGE_EH)
    2661                 :             :               {
    2662                 :      621807 :                 if (!e->probability.initialized_p ())
    2663                 :      472632 :                   e->probability = profile_probability::never ();
    2664                 :      621807 :                 if (e->dest->index < id->add_clobbers_to_eh_landing_pads)
    2665                 :             :                   {
    2666                 :      471714 :                     if (id->eh_landing_pad_dest == NULL)
    2667                 :      345239 :                       id->eh_landing_pad_dest = e->dest;
    2668                 :             :                     else
    2669                 :      126475 :                       gcc_assert (id->eh_landing_pad_dest == e->dest);
    2670                 :             :                   }
    2671                 :             :               }
    2672                 :             :         }
    2673                 :             : 
    2674                 :             : 
    2675                 :             :       /* If the call we inline cannot make abnormal goto do not add
    2676                 :             :          additional abnormal edges but only retain those already present
    2677                 :             :          in the original function body.  */
    2678                 :    63633888 :       if (abnormal_goto_dest == NULL)
    2679                 :             :         nonlocal_goto = false;
    2680                 :         634 :       if (nonlocal_goto)
    2681                 :             :         {
    2682                 :         190 :           basic_block copy_stmt_bb = gimple_bb (copy_stmt);
    2683                 :             : 
    2684                 :         190 :           if (get_abnormal_succ_dispatcher (copy_stmt_bb))
    2685                 :             :             nonlocal_goto = false;
    2686                 :             :           /* ABNORMAL_DISPATCHER (1) is for longjmp/setjmp or nonlocal gotos
    2687                 :             :              in OpenMP regions which aren't allowed to be left abnormally.
    2688                 :             :              So, no need to add abnormal edge in that case.  */
    2689                 :         190 :           else if (is_gimple_call (copy_stmt)
    2690                 :         190 :                    && gimple_call_internal_p (copy_stmt)
    2691                 :           0 :                    && (gimple_call_internal_fn (copy_stmt)
    2692                 :             :                        == IFN_ABNORMAL_DISPATCHER)
    2693                 :         190 :                    && gimple_call_arg (copy_stmt, 0) == boolean_true_node)
    2694                 :             :             nonlocal_goto = false;
    2695                 :             :           else
    2696                 :         190 :             make_single_succ_edge (copy_stmt_bb, abnormal_goto_dest,
    2697                 :             :                                    EDGE_ABNORMAL);
    2698                 :             :         }
    2699                 :             : 
    2700                 :    63633888 :       if ((can_throw || nonlocal_goto)
    2701                 :   138255541 :           && gimple_in_ssa_p (cfun))
    2702                 :      621975 :         update_ssa_across_abnormal_edges (gimple_bb (copy_stmt), ret_bb,
    2703                 :             :                                           can_throw, nonlocal_goto);
    2704                 :             :     }
    2705                 :             :   return need_debug_cleanup;
    2706                 :             : }
    2707                 :             : 
    2708                 :             : /* Copy the PHIs.  All blocks and edges are copied, some blocks
    2709                 :             :    was possibly split and new outgoing EH edges inserted.
    2710                 :             :    BB points to the block of original function and AUX pointers links
    2711                 :             :    the original and newly copied blocks.  */
    2712                 :             : 
    2713                 :             : static void
    2714                 :    18636349 : copy_phis_for_bb (basic_block bb, copy_body_data *id)
    2715                 :             : {
    2716                 :    18636349 :   basic_block const new_bb = (basic_block) bb->aux;
    2717                 :    18636349 :   edge_iterator ei;
    2718                 :    18636349 :   gphi *phi;
    2719                 :    18636349 :   gphi_iterator si;
    2720                 :    18636349 :   edge new_edge;
    2721                 :    18636349 :   bool inserted = false;
    2722                 :             : 
    2723                 :    21052811 :   for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
    2724                 :             :     {
    2725                 :     2416462 :       tree res, new_res;
    2726                 :     2416462 :       gphi *new_phi;
    2727                 :             : 
    2728                 :     2416462 :       phi = si.phi ();
    2729                 :     2416462 :       res = PHI_RESULT (phi);
    2730                 :     2416462 :       new_res = res;
    2731                 :     2416462 :       if (!virtual_operand_p (res)
    2732                 :     2416462 :           && (!id->param_body_adjs
    2733                 :     1234631 :               || !id->param_body_adjs->m_dead_stmts.contains (phi)))
    2734                 :             :         {
    2735                 :     1335115 :           walk_tree (&new_res, copy_tree_body_r, id, NULL);
    2736                 :     1335115 :           if (EDGE_COUNT (new_bb->preds) == 0)
    2737                 :             :             {
    2738                 :             :               /* Technically we'd want a SSA_DEFAULT_DEF here... */
    2739                 :           4 :               SSA_NAME_DEF_STMT (new_res) = gimple_build_nop ();
    2740                 :             :             }
    2741                 :             :           else
    2742                 :             :             {
    2743                 :     1335111 :               new_phi = create_phi_node (new_res, new_bb);
    2744                 :     4344238 :               FOR_EACH_EDGE (new_edge, ei, new_bb->preds)
    2745                 :             :                 {
    2746                 :     3009127 :                   edge old_edge = find_edge ((basic_block) new_edge->src->aux,
    2747                 :     3009127 :                                              bb);
    2748                 :     3009127 :                   tree arg;
    2749                 :     3009127 :                   tree new_arg;
    2750                 :     3009127 :                   edge_iterator ei2;
    2751                 :     3009127 :                   location_t locus;
    2752                 :             : 
    2753                 :             :                   /* When doing partial cloning, we allow PHIs on the entry
    2754                 :             :                      block as long as all the arguments are the same.
    2755                 :             :                      Find any input edge to see argument to copy.  */
    2756                 :     3009127 :                   if (!old_edge)
    2757                 :        1770 :                     FOR_EACH_EDGE (old_edge, ei2, bb->preds)
    2758                 :        1770 :                       if (!old_edge->src->aux)
    2759                 :             :                         break;
    2760                 :             : 
    2761                 :     3009127 :                   arg = PHI_ARG_DEF_FROM_EDGE (phi, old_edge);
    2762                 :     3009127 :                   new_arg = arg;
    2763                 :     3009127 :                   walk_tree (&new_arg, copy_tree_body_r, id, NULL);
    2764                 :     3009127 :                   gcc_assert (new_arg);
    2765                 :             :                   /* With return slot optimization we can end up with
    2766                 :             :                      non-gimple (foo *)&this->m, fix that here.  */
    2767                 :     3009127 :                   if (TREE_CODE (new_arg) != SSA_NAME
    2768                 :     1260082 :                       && TREE_CODE (new_arg) != FUNCTION_DECL
    2769                 :     4269209 :                       && !is_gimple_val (new_arg))
    2770                 :             :                     {
    2771                 :          13 :                       gimple_seq stmts = NULL;
    2772                 :          13 :                       new_arg = force_gimple_operand (new_arg, &stmts, true,
    2773                 :             :                                                       NULL);
    2774                 :          13 :                       gsi_insert_seq_on_edge (new_edge, stmts);
    2775                 :          13 :                       inserted = true;
    2776                 :             :                     }
    2777                 :     3009127 :                   locus = gimple_phi_arg_location_from_edge (phi, old_edge);
    2778                 :     3009127 :                   if (id->reset_location)
    2779                 :           0 :                     locus = input_location;
    2780                 :             :                   else
    2781                 :     3009127 :                     locus = remap_location (locus, id);
    2782                 :     3009127 :                   add_phi_arg (new_phi, new_arg, new_edge, locus);
    2783                 :             :                 }
    2784                 :             :             }
    2785                 :             :         }
    2786                 :             :     }
    2787                 :             : 
    2788                 :             :   /* Commit the delayed edge insertions.  */
    2789                 :    18636349 :   if (inserted)
    2790                 :          39 :     FOR_EACH_EDGE (new_edge, ei, new_bb->preds)
    2791                 :          26 :       gsi_commit_one_edge_insert (new_edge, NULL);
    2792                 :    18636349 : }
    2793                 :             : 
    2794                 :             : 
    2795                 :             : /* Wrapper for remap_decl so it can be used as a callback.  */
    2796                 :             : 
    2797                 :             : static tree
    2798                 :       99141 : remap_decl_1 (tree decl, void *data)
    2799                 :             : {
    2800                 :       99141 :   return remap_decl (decl, (copy_body_data *) data);
    2801                 :             : }
    2802                 :             : 
    2803                 :             : /* Build struct function and associated datastructures for the new clone
    2804                 :             :    NEW_FNDECL to be build.  CALLEE_FNDECL is the original.  Function changes
    2805                 :             :    the cfun to the function of new_fndecl (and current_function_decl too).  */
    2806                 :             : 
    2807                 :             : static void
    2808                 :      200581 : initialize_cfun (tree new_fndecl, tree callee_fndecl, profile_count count)
    2809                 :             : {
    2810                 :      200581 :   struct function *src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
    2811                 :             : 
    2812                 :             :   /* Register specific tree functions.  */
    2813                 :      200581 :   gimple_register_cfg_hooks ();
    2814                 :             : 
    2815                 :             :   /* Get clean struct function.  */
    2816                 :      200581 :   push_struct_function (new_fndecl, true);
    2817                 :      200581 :   targetm.target_option.relayout_function (new_fndecl);
    2818                 :             : 
    2819                 :             :   /* We will rebuild these, so just sanity check that they are empty.  */
    2820                 :      200581 :   gcc_assert (VALUE_HISTOGRAMS (cfun) == NULL);
    2821                 :      200581 :   gcc_assert (cfun->local_decls == NULL);
    2822                 :      200581 :   gcc_assert (cfun->cfg == NULL);
    2823                 :      200581 :   gcc_assert (cfun->decl == new_fndecl);
    2824                 :             : 
    2825                 :             :   /* Copy items we preserve during cloning.  */
    2826                 :      200581 :   cfun->static_chain_decl = src_cfun->static_chain_decl;
    2827                 :      200581 :   cfun->nonlocal_goto_save_area = src_cfun->nonlocal_goto_save_area;
    2828                 :      200581 :   cfun->function_end_locus = src_cfun->function_end_locus;
    2829                 :      200581 :   cfun->curr_properties = src_cfun->curr_properties;
    2830                 :      200581 :   cfun->last_verified = src_cfun->last_verified;
    2831                 :      200581 :   cfun->va_list_gpr_size = src_cfun->va_list_gpr_size;
    2832                 :      200581 :   cfun->va_list_fpr_size = src_cfun->va_list_fpr_size;
    2833                 :      200581 :   cfun->has_nonlocal_label = src_cfun->has_nonlocal_label;
    2834                 :      200581 :   cfun->calls_eh_return = src_cfun->calls_eh_return;
    2835                 :      200581 :   cfun->stdarg = src_cfun->stdarg;
    2836                 :      200581 :   cfun->after_inlining = src_cfun->after_inlining;
    2837                 :      200581 :   cfun->can_throw_non_call_exceptions
    2838                 :      200581 :     = src_cfun->can_throw_non_call_exceptions;
    2839                 :      200581 :   cfun->can_delete_dead_exceptions = src_cfun->can_delete_dead_exceptions;
    2840                 :      200581 :   cfun->returns_struct = src_cfun->returns_struct;
    2841                 :      200581 :   cfun->returns_pcc_struct = src_cfun->returns_pcc_struct;
    2842                 :             : 
    2843                 :      200581 :   init_empty_tree_cfg ();
    2844                 :             : 
    2845                 :      200581 :   profile_status_for_fn (cfun) = profile_status_for_fn (src_cfun);
    2846                 :      200581 :   cfun->cfg->full_profile = src_cfun->cfg->full_profile;
    2847                 :             : 
    2848                 :      200581 :   profile_count num = count;
    2849                 :      200581 :   profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count;
    2850                 :      200581 :   profile_count::adjust_for_ipa_scaling (&num, &den);
    2851                 :             : 
    2852                 :      200581 :   ENTRY_BLOCK_PTR_FOR_FN (cfun)->count =
    2853                 :      200581 :     ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count.apply_scale (count,
    2854                 :             :                                 ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count);
    2855                 :      200581 :   EXIT_BLOCK_PTR_FOR_FN (cfun)->count =
    2856                 :      200581 :     EXIT_BLOCK_PTR_FOR_FN (src_cfun)->count.apply_scale (count,
    2857                 :      200581 :                                 ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count);
    2858                 :      200581 :   if (src_cfun->eh)
    2859                 :      200581 :     init_eh_for_function ();
    2860                 :             : 
    2861                 :      200581 :   if (src_cfun->gimple_df)
    2862                 :             :     {
    2863                 :      200581 :       init_tree_ssa (cfun);
    2864                 :      200581 :       cfun->gimple_df->in_ssa_p = src_cfun->gimple_df->in_ssa_p;
    2865                 :      200581 :       if (cfun->gimple_df->in_ssa_p)
    2866                 :      200581 :         init_ssa_operands (cfun);
    2867                 :             :     }
    2868                 :      200581 : }
    2869                 :             : 
    2870                 :             : /* Helper function for copy_cfg_body.  Move debug stmts from the end
    2871                 :             :    of NEW_BB to the beginning of successor basic blocks when needed.  If the
    2872                 :             :    successor has multiple predecessors, reset them, otherwise keep
    2873                 :             :    their value.  */
    2874                 :             : 
    2875                 :             : static void
    2876                 :     1155534 : maybe_move_debug_stmts_to_successors (copy_body_data *id, basic_block new_bb)
    2877                 :             : {
    2878                 :     1155534 :   edge e;
    2879                 :     1155534 :   edge_iterator ei;
    2880                 :     1155534 :   gimple_stmt_iterator si = gsi_last_nondebug_bb (new_bb);
    2881                 :             : 
    2882                 :     1155534 :   if (gsi_end_p (si)
    2883                 :     1210897 :       || gsi_one_before_end_p (si)
    2884                 :     1291244 :       || !(stmt_can_throw_internal (cfun, gsi_stmt (si))
    2885                 :       55363 :            || stmt_can_make_abnormal_goto (gsi_stmt (si))))
    2886                 :     1130550 :     return;
    2887                 :             : 
    2888                 :       74953 :   FOR_EACH_EDGE (e, ei, new_bb->succs)
    2889                 :             :     {
    2890                 :       49969 :       gimple_stmt_iterator ssi = gsi_last_bb (new_bb);
    2891                 :       49969 :       gimple_stmt_iterator dsi = gsi_after_labels (e->dest);
    2892                 :      167493 :       while (is_gimple_debug (gsi_stmt (ssi)))
    2893                 :             :         {
    2894                 :      117524 :           gimple *stmt = gsi_stmt (ssi);
    2895                 :      117524 :           gdebug *new_stmt;
    2896                 :      117524 :           tree var;
    2897                 :      117524 :           tree value;
    2898                 :             : 
    2899                 :             :           /* For the last edge move the debug stmts instead of copying
    2900                 :             :              them.  */
    2901                 :      117524 :           if (ei_one_before_end_p (ei))
    2902                 :             :             {
    2903                 :       58761 :               si = ssi;
    2904                 :       58761 :               gsi_prev (&ssi);
    2905                 :      117522 :               if (!single_pred_p (e->dest) && gimple_debug_bind_p (stmt))
    2906                 :             :                 {
    2907                 :       57506 :                   gimple_debug_bind_reset_value (stmt);
    2908                 :      114569 :                   gimple_set_location (stmt, UNKNOWN_LOCATION);
    2909                 :             :                 }
    2910                 :       58761 :               gsi_remove (&si, false);
    2911                 :       58761 :               gsi_insert_before (&dsi, stmt, GSI_NEW_STMT);
    2912                 :       58761 :               continue;
    2913                 :             :             }
    2914                 :             : 
    2915                 :       58763 :           if (gimple_debug_bind_p (stmt))
    2916                 :             :             {
    2917                 :       57508 :               var = gimple_debug_bind_get_var (stmt);
    2918                 :       57508 :               if (single_pred_p (e->dest))
    2919                 :             :                 {
    2920                 :       45531 :                   value = gimple_debug_bind_get_value (stmt);
    2921                 :       45531 :                   value = unshare_expr (value);
    2922                 :       45531 :                   new_stmt = gimple_build_debug_bind (var, value, stmt);
    2923                 :             :                 }
    2924                 :             :               else
    2925                 :       11977 :                 new_stmt = gimple_build_debug_bind (var, NULL_TREE, NULL);
    2926                 :             :             }
    2927                 :        1255 :           else if (gimple_debug_source_bind_p (stmt))
    2928                 :             :             {
    2929                 :           0 :               var = gimple_debug_source_bind_get_var (stmt);
    2930                 :           0 :               value = gimple_debug_source_bind_get_value (stmt);
    2931                 :           0 :               new_stmt = gimple_build_debug_source_bind (var, value, stmt);
    2932                 :             :             }
    2933                 :        1255 :           else if (gimple_debug_nonbind_marker_p (stmt))
    2934                 :        1255 :             new_stmt = as_a <gdebug *> (gimple_copy (stmt));
    2935                 :             :           else
    2936                 :           0 :             gcc_unreachable ();
    2937                 :       58763 :           gsi_insert_before (&dsi, new_stmt, GSI_NEW_STMT);
    2938                 :       58763 :           id->debug_stmts.safe_push (new_stmt);
    2939                 :       58763 :           gsi_prev (&ssi);
    2940                 :             :         }
    2941                 :             :     }
    2942                 :             : }
    2943                 :             : 
    2944                 :             : /* Make a copy of the sub-loops of SRC_PARENT and place them
    2945                 :             :    as siblings of DEST_PARENT.  */
    2946                 :             : 
    2947                 :             : static void
    2948                 :     4378222 : copy_loops (copy_body_data *id,
    2949                 :             :             class loop *dest_parent, class loop *src_parent)
    2950                 :             : {
    2951                 :     4378222 :   class loop *src_loop = src_parent->inner;
    2952                 :     4892168 :   while (src_loop)
    2953                 :             :     {
    2954                 :      513946 :       if (!id->blocks_to_copy
    2955                 :      513946 :           || bitmap_bit_p (id->blocks_to_copy, src_loop->header->index))
    2956                 :             :         {
    2957                 :      510424 :           class loop *dest_loop = alloc_loop ();
    2958                 :             : 
    2959                 :             :           /* Assign the new loop its header and latch and associate
    2960                 :             :              those with the new loop.  */
    2961                 :      510424 :           dest_loop->header = (basic_block)src_loop->header->aux;
    2962                 :      510424 :           dest_loop->header->loop_father = dest_loop;
    2963                 :      510424 :           if (src_loop->latch != NULL)
    2964                 :             :             {
    2965                 :      510424 :               dest_loop->latch = (basic_block)src_loop->latch->aux;
    2966                 :      510424 :               dest_loop->latch->loop_father = dest_loop;
    2967                 :             :             }
    2968                 :             : 
    2969                 :             :           /* Copy loop meta-data.  */
    2970                 :      510424 :           copy_loop_info (src_loop, dest_loop);
    2971                 :      510424 :           if (dest_loop->unroll)
    2972                 :          50 :             cfun->has_unroll = true;
    2973                 :      510424 :           if (dest_loop->force_vectorize)
    2974                 :          73 :             cfun->has_force_vectorize_loops = true;
    2975                 :      510424 :           if (id->src_cfun->last_clique != 0)
    2976                 :       50409 :             dest_loop->owned_clique
    2977                 :       50409 :               = remap_dependence_clique (id,
    2978                 :       50409 :                                          src_loop->owned_clique
    2979                 :             :                                          ? src_loop->owned_clique : 1);
    2980                 :             : 
    2981                 :             :           /* Finally place it into the loop array and the loop tree.  */
    2982                 :      510424 :           place_new_loop (cfun, dest_loop);
    2983                 :      510424 :           flow_loop_tree_node_add (dest_parent, dest_loop);
    2984                 :             : 
    2985                 :      510424 :           if (src_loop->simduid)
    2986                 :             :             {
    2987                 :          49 :               dest_loop->simduid = remap_decl (src_loop->simduid, id);
    2988                 :          49 :               cfun->has_simduid_loops = true;
    2989                 :             :             }
    2990                 :             : 
    2991                 :             :           /* Recurse.  */
    2992                 :      510424 :           copy_loops (id, dest_loop, src_loop);
    2993                 :             :         }
    2994                 :      513946 :       src_loop = src_loop->next;
    2995                 :             :     }
    2996                 :     4378222 : }
    2997                 :             : 
    2998                 :             : /* Call redirect_call_stmt_to_callee on all calls in BB.  */
    2999                 :             : 
    3000                 :             : void
    3001                 :     9686331 : redirect_all_calls (copy_body_data * id, basic_block bb)
    3002                 :             : {
    3003                 :     9686331 :   gimple_stmt_iterator si;
    3004                 :     9686331 :   gimple *last = last_nondebug_stmt (bb);
    3005                 :    74499913 :   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
    3006                 :             :     {
    3007                 :    55127251 :       gimple *stmt = gsi_stmt (si);
    3008                 :    55127251 :       if (is_gimple_call (stmt))
    3009                 :             :         {
    3010                 :     3027841 :           struct cgraph_edge *edge = id->dst_node->get_edge (stmt);
    3011                 :     3027841 :           if (edge)
    3012                 :             :             {
    3013                 :     3005587 :               if (!id->killed_new_ssa_names)
    3014                 :     1696195 :                 id->killed_new_ssa_names = new hash_set<tree> (16);
    3015                 :     3005587 :               cgraph_edge::redirect_call_stmt_to_callee (edge,
    3016                 :             :                 id->killed_new_ssa_names);
    3017                 :             : 
    3018                 :     3005587 :               if (stmt == last && id->call_stmt && maybe_clean_eh_stmt (stmt))
    3019                 :       14721 :                 gimple_purge_dead_eh_edges (bb);
    3020                 :             :             }
    3021                 :             :         }
    3022                 :             :     }
    3023                 :     9686331 : }
    3024                 :             : 
    3025                 :             : /* Make a copy of the body of FN so that it can be inserted inline in
    3026                 :             :    another function.  Walks FN via CFG, returns new fndecl.  */
    3027                 :             : 
    3028                 :             : static tree
    3029                 :     3867798 : copy_cfg_body (copy_body_data * id,
    3030                 :             :                basic_block entry_block_map, basic_block exit_block_map,
    3031                 :             :                basic_block new_entry)
    3032                 :             : {
    3033                 :     3867798 :   tree callee_fndecl = id->src_fn;
    3034                 :             :   /* Original cfun for the callee, doesn't change.  */
    3035                 :     3867798 :   struct function *src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
    3036                 :     3867798 :   struct function *cfun_to_copy;
    3037                 :     3867798 :   basic_block bb;
    3038                 :     3867798 :   tree new_fndecl = NULL;
    3039                 :     3867798 :   bool need_debug_cleanup = false;
    3040                 :     3867798 :   int last;
    3041                 :     3867798 :   profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count;
    3042                 :     3867798 :   profile_count num = entry_block_map->count;
    3043                 :             : 
    3044                 :     3867798 :   cfun_to_copy = id->src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
    3045                 :             : 
    3046                 :             :   /* Register specific tree functions.  */
    3047                 :     3867798 :   gimple_register_cfg_hooks ();
    3048                 :             : 
    3049                 :             :   /* If we are inlining just region of the function, make sure to connect
    3050                 :             :      new entry to ENTRY_BLOCK_PTR_FOR_FN (cfun).  Since new entry can be
    3051                 :             :      part of loop, we must compute frequency and probability of
    3052                 :             :      ENTRY_BLOCK_PTR_FOR_FN (cfun) based on the frequencies and
    3053                 :             :      probabilities of edges incoming from nonduplicated region.  */
    3054                 :     3867798 :   if (new_entry)
    3055                 :             :     {
    3056                 :       43506 :       edge e;
    3057                 :       43506 :       edge_iterator ei;
    3058                 :       43506 :       den = profile_count::zero ();
    3059                 :             : 
    3060                 :       92970 :       FOR_EACH_EDGE (e, ei, new_entry->preds)
    3061                 :       49464 :         if (!e->src->aux)
    3062                 :       49464 :           den += e->count ();
    3063                 :       43506 :       ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = den;
    3064                 :             :     }
    3065                 :             : 
    3066                 :     3867798 :   profile_count::adjust_for_ipa_scaling (&num, &den);
    3067                 :             : 
    3068                 :             :   /* Must have a CFG here at this point.  */
    3069                 :     3867798 :   gcc_assert (ENTRY_BLOCK_PTR_FOR_FN
    3070                 :             :               (DECL_STRUCT_FUNCTION (callee_fndecl)));
    3071                 :             : 
    3072                 :             : 
    3073                 :     3867798 :   ENTRY_BLOCK_PTR_FOR_FN (cfun_to_copy)->aux = entry_block_map;
    3074                 :     3867798 :   EXIT_BLOCK_PTR_FOR_FN (cfun_to_copy)->aux = exit_block_map;
    3075                 :     3867798 :   entry_block_map->aux = ENTRY_BLOCK_PTR_FOR_FN (cfun_to_copy);
    3076                 :     3867798 :   exit_block_map->aux = EXIT_BLOCK_PTR_FOR_FN (cfun_to_copy);
    3077                 :             : 
    3078                 :             :   /* Duplicate any exception-handling regions.  */
    3079                 :     3867798 :   if (cfun->eh)
    3080                 :     3867798 :     id->eh_map = duplicate_eh_regions (cfun_to_copy, NULL, id->eh_lp_nr,
    3081                 :             :                                        remap_decl_1, id);
    3082                 :             : 
    3083                 :             :   /* Use aux pointers to map the original blocks to copy.  */
    3084                 :    15004384 :   FOR_EACH_BB_FN (bb, cfun_to_copy)
    3085                 :    11136586 :     if (!id->blocks_to_copy || bitmap_bit_p (id->blocks_to_copy, bb->index))
    3086                 :             :       {
    3087                 :    10987765 :         basic_block new_bb = copy_bb (id, bb, num, den);
    3088                 :    10987765 :         bb->aux = new_bb;
    3089                 :    10987765 :         new_bb->aux = bb;
    3090                 :    10987765 :         new_bb->loop_father = entry_block_map->loop_father;
    3091                 :             :       }
    3092                 :             : 
    3093                 :     3867798 :   last = last_basic_block_for_fn (cfun);
    3094                 :             : 
    3095                 :             :   /* Now that we've duplicated the blocks, duplicate their edges.  */
    3096                 :     3867798 :   basic_block abnormal_goto_dest = NULL;
    3097                 :     3867798 :   if (id->call_stmt
    3098                 :     3867798 :       && stmt_can_make_abnormal_goto (id->call_stmt))
    3099                 :             :     {
    3100                 :         221 :       gimple_stmt_iterator gsi = gsi_for_stmt (id->call_stmt);
    3101                 :             : 
    3102                 :         221 :       bb = gimple_bb (id->call_stmt);
    3103                 :         221 :       gsi_next (&gsi);
    3104                 :         221 :       if (gsi_end_p (gsi))
    3105                 :         221 :         abnormal_goto_dest = get_abnormal_succ_dispatcher (bb);
    3106                 :             :     }
    3107                 :    22739980 :   FOR_ALL_BB_FN (bb, cfun_to_copy)
    3108                 :    18872182 :     if (!id->blocks_to_copy
    3109                 :    18872182 :         || (bb->index > 0 && bitmap_bit_p (id->blocks_to_copy, bb->index)))
    3110                 :    18636349 :       need_debug_cleanup |= copy_edges_for_bb (bb, num, den, exit_block_map,
    3111                 :             :                                                abnormal_goto_dest, id);
    3112                 :             : 
    3113                 :     3867798 :   if (id->eh_landing_pad_dest)
    3114                 :             :     {
    3115                 :      345239 :       add_clobbers_to_eh_landing_pad (id);
    3116                 :      345239 :       id->eh_landing_pad_dest = NULL;
    3117                 :             :     }
    3118                 :             : 
    3119                 :     3867798 :   if (new_entry)
    3120                 :             :     {
    3121                 :       43506 :       edge e = make_edge (entry_block_map, (basic_block)new_entry->aux,
    3122                 :             :                           EDGE_FALLTHRU);
    3123                 :       43506 :       e->probability = profile_probability::always ();
    3124                 :             :     }
    3125                 :             : 
    3126                 :             :   /* Duplicate the loop tree, if available and wanted.  */
    3127                 :     3867798 :   if (loops_for_fn (src_cfun) != NULL
    3128                 :     3867798 :       && current_loops != NULL)
    3129                 :             :     {
    3130                 :     3867798 :       copy_loops (id, entry_block_map->loop_father,
    3131                 :             :                   get_loop (src_cfun, 0));
    3132                 :             :       /* Defer to cfgcleanup to update loop-father fields of basic-blocks.  */
    3133                 :     3867798 :       loops_state_set (LOOPS_NEED_FIXUP);
    3134                 :             :     }
    3135                 :             : 
    3136                 :             :   /* If the loop tree in the source function needed fixup, mark the
    3137                 :             :      destination loop tree for fixup, too.  */
    3138                 :     3867798 :   if (loops_for_fn (src_cfun)->state & LOOPS_NEED_FIXUP)
    3139                 :           0 :     loops_state_set (LOOPS_NEED_FIXUP);
    3140                 :             : 
    3141                 :     3867798 :   if (gimple_in_ssa_p (cfun))
    3142                 :    22739980 :     FOR_ALL_BB_FN (bb, cfun_to_copy)
    3143                 :    18872182 :       if (!id->blocks_to_copy
    3144                 :    18872182 :           || (bb->index > 0 && bitmap_bit_p (id->blocks_to_copy, bb->index)))
    3145                 :    18636349 :         copy_phis_for_bb (bb, id);
    3146                 :             : 
    3147                 :    22739980 :   FOR_ALL_BB_FN (bb, cfun_to_copy)
    3148                 :    18872182 :     if (bb->aux)
    3149                 :             :       {
    3150                 :    18723361 :         if (need_debug_cleanup
    3151                 :     1600081 :             && bb->index != ENTRY_BLOCK
    3152                 :     1333215 :             && bb->index != EXIT_BLOCK)
    3153                 :     1066349 :           maybe_move_debug_stmts_to_successors (id, (basic_block) bb->aux);
    3154                 :             :         /* Update call edge destinations.  This cannot be done before loop
    3155                 :             :            info is updated, because we may split basic blocks.  */
    3156                 :    18723361 :         if (id->transform_call_graph_edges == CB_CGE_DUPLICATE
    3157                 :    16789392 :             && bb->index != ENTRY_BLOCK
    3158                 :    13122175 :             && bb->index != EXIT_BLOCK)
    3159                 :     9454958 :           redirect_all_calls (id, (basic_block)bb->aux);
    3160                 :    18723361 :         ((basic_block)bb->aux)->aux = NULL;
    3161                 :    18723361 :         bb->aux = NULL;
    3162                 :             :       }
    3163                 :             : 
    3164                 :             :   /* Zero out AUX fields of newly created block during EH edge
    3165                 :             :      insertion. */
    3166                 :     4099171 :   for (; last < last_basic_block_for_fn (cfun); last++)
    3167                 :             :     {
    3168                 :      231373 :       if (need_debug_cleanup)
    3169                 :       89185 :         maybe_move_debug_stmts_to_successors (id,
    3170                 :       89185 :                                               BASIC_BLOCK_FOR_FN (cfun, last));
    3171                 :      231373 :       BASIC_BLOCK_FOR_FN (cfun, last)->aux = NULL;
    3172                 :             :       /* Update call edge destinations.  This cannot be done before loop
    3173                 :             :          info is updated, because we may split basic blocks.  */
    3174                 :      231373 :       if (id->transform_call_graph_edges == CB_CGE_DUPLICATE)
    3175                 :      231373 :         redirect_all_calls (id, BASIC_BLOCK_FOR_FN (cfun, last));
    3176                 :             :     }
    3177                 :     3867798 :   entry_block_map->aux = NULL;
    3178                 :     3867798 :   exit_block_map->aux = NULL;
    3179                 :             : 
    3180                 :     3867798 :   if (id->eh_map)
    3181                 :             :     {
    3182                 :     3867798 :       delete id->eh_map;
    3183                 :     3867798 :       id->eh_map = NULL;
    3184                 :             :     }
    3185                 :     3867798 :   if (id->dependence_map)
    3186                 :             :     {
    3187                 :      570601 :       delete id->dependence_map;
    3188                 :      570601 :       id->dependence_map = NULL;
    3189                 :             :     }
    3190                 :             : 
    3191                 :     3867798 :   return new_fndecl;
    3192                 :             : }
    3193                 :             : 
    3194                 :             : /* Copy the debug STMT using ID.  We deal with these statements in a
    3195                 :             :    special way: if any variable in their VALUE expression wasn't
    3196                 :             :    remapped yet, we won't remap it, because that would get decl uids
    3197                 :             :    out of sync, causing codegen differences between -g and -g0.  If
    3198                 :             :    this arises, we drop the VALUE expression altogether.  */
    3199                 :             : 
    3200                 :             : static void
    3201                 :    37935213 : copy_debug_stmt (gdebug *stmt, copy_body_data *id)
    3202                 :             : {
    3203                 :    37935213 :   tree t, *n;
    3204                 :    37935213 :   struct walk_stmt_info wi;
    3205                 :             : 
    3206                 :    37935213 :   if (tree block = gimple_block (stmt))
    3207                 :             :     {
    3208                 :    25912025 :       n = id->decl_map->get (block);
    3209                 :    25912025 :       gimple_set_block (stmt, n ? *n : id->block);
    3210                 :             :     }
    3211                 :             : 
    3212                 :    37935213 :   if (gimple_debug_nonbind_marker_p (stmt))
    3213                 :             :     {
    3214                 :     9484420 :       if (id->call_stmt && !gimple_block (stmt))
    3215                 :             :         {
    3216                 :       41954 :           gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
    3217                 :       41954 :           gsi_remove (&gsi, true);
    3218                 :             :         }
    3219                 :     9484420 :       return;
    3220                 :             :     }
    3221                 :             : 
    3222                 :             :   /* Remap all the operands in COPY.  */
    3223                 :    28450793 :   memset (&wi, 0, sizeof (wi));
    3224                 :    28450793 :   wi.info = id;
    3225                 :             : 
    3226                 :    28450793 :   processing_debug_stmt = 1;
    3227                 :             : 
    3228                 :    28450793 :   if (gimple_debug_source_bind_p (stmt))
    3229                 :      378810 :     t = gimple_debug_source_bind_get_var (stmt);
    3230                 :    28071983 :   else if (gimple_debug_bind_p (stmt))
    3231                 :    28071983 :     t = gimple_debug_bind_get_var (stmt);
    3232                 :             :   else
    3233                 :           0 :     gcc_unreachable ();
    3234                 :             : 
    3235                 :    28450793 :   if (TREE_CODE (t) == PARM_DECL
    3236                 :      147942 :       && id->debug_map
    3237                 :    28452123 :       && (n = id->debug_map->get (t)))
    3238                 :             :     {
    3239                 :           0 :       gcc_assert (VAR_P (*n));
    3240                 :           0 :       t = *n;
    3241                 :             :     }
    3242                 :    28450793 :   else if (VAR_P (t) && !is_global_var (t) && !id->decl_map->get (t))
    3243                 :             :     /* T is a non-localized variable.  */;
    3244                 :             :   else
    3245                 :    25864793 :     walk_tree (&t, remap_gimple_op_r, &wi, NULL);
    3246                 :             : 
    3247                 :    28450793 :   if (gimple_debug_bind_p (stmt))
    3248                 :             :     {
    3249                 :    28071983 :       gimple_debug_bind_set_var (stmt, t);
    3250                 :             : 
    3251                 :    28071983 :       if (gimple_debug_bind_has_value_p (stmt))
    3252                 :    15738197 :         walk_tree (gimple_debug_bind_get_value_ptr (stmt),
    3253                 :             :                    remap_gimple_op_r, &wi, NULL);
    3254                 :             : 
    3255                 :             :       /* Punt if any decl couldn't be remapped.  */
    3256                 :    28071983 :       if (processing_debug_stmt < 0)
    3257                 :      544749 :         gimple_debug_bind_reset_value (stmt);
    3258                 :             :     }
    3259                 :      378810 :   else if (gimple_debug_source_bind_p (stmt))
    3260                 :             :     {
    3261                 :      378810 :       gimple_debug_source_bind_set_var (stmt, t);
    3262                 :             :       /* When inlining and source bind refers to one of the optimized
    3263                 :             :          away parameters, change the source bind into normal debug bind
    3264                 :             :          referring to the corresponding DEBUG_EXPR_DECL that should have
    3265                 :             :          been bound before the call stmt.  */
    3266                 :      378810 :       t = gimple_debug_source_bind_get_value (stmt);
    3267                 :      378810 :       if (t != NULL_TREE
    3268                 :      378810 :           && TREE_CODE (t) == PARM_DECL
    3269                 :      289757 :           && id->call_stmt)
    3270                 :             :         {
    3271                 :      285665 :           vec<tree, va_gc> **debug_args = decl_debug_args_lookup (id->src_fn);
    3272                 :      285665 :           unsigned int i;
    3273                 :      285665 :           if (debug_args != NULL)
    3274                 :             :             {
    3275                 :      744468 :               for (i = 0; i < vec_safe_length (*debug_args); i += 2)
    3276                 :      372233 :                 if ((**debug_args)[i] == DECL_ORIGIN (t)
    3277                 :      372233 :                     && TREE_CODE ((**debug_args)[i + 1]) == DEBUG_EXPR_DECL)
    3278                 :             :                   {
    3279                 :      284669 :                     t = (**debug_args)[i + 1];
    3280                 :      284669 :                     stmt->subcode = GIMPLE_DEBUG_BIND;
    3281                 :      284669 :                     gimple_debug_bind_set_value (stmt, t);
    3282                 :      284669 :                     break;
    3283                 :             :                   }
    3284                 :             :             }
    3285                 :             :         }
    3286                 :      378810 :       if (gimple_debug_source_bind_p (stmt))
    3287                 :       94141 :         walk_tree (gimple_debug_source_bind_get_value_ptr (stmt),
    3288                 :             :                    remap_gimple_op_r, &wi, NULL);
    3289                 :             :     }
    3290                 :             : 
    3291                 :    28450793 :   processing_debug_stmt = 0;
    3292                 :             : 
    3293                 :    28450793 :   update_stmt (stmt);
    3294                 :             : }
    3295                 :             : 
    3296                 :             : /* Process deferred debug stmts.  In order to give values better odds
    3297                 :             :    of being successfully remapped, we delay the processing of debug
    3298                 :             :    stmts until all other stmts that might require remapping are
    3299                 :             :    processed.  */
    3300                 :             : 
    3301                 :             : static void
    3302                 :     3867798 : copy_debug_stmts (copy_body_data *id)
    3303                 :             : {
    3304                 :     3867798 :   if (!id->debug_stmts.exists ())
    3305                 :             :     return;
    3306                 :             : 
    3307                 :    40334937 :   for (gdebug *stmt : id->debug_stmts)
    3308                 :    37935213 :     copy_debug_stmt (stmt, id);
    3309                 :             : 
    3310                 :     2399724 :   id->debug_stmts.release ();
    3311                 :             : }
    3312                 :             : 
    3313                 :             : /* Make a copy of the body of SRC_FN so that it can be inserted inline in
    3314                 :             :    another function.  */
    3315                 :             : 
    3316                 :             : static tree
    3317                 :    15418396 : copy_tree_body (copy_body_data *id)
    3318                 :             : {
    3319                 :    15418396 :   tree fndecl = id->src_fn;
    3320                 :    15418396 :   tree body = DECL_SAVED_TREE (fndecl);
    3321                 :             : 
    3322                 :    15418396 :   walk_tree (&body, copy_tree_body_r, id, NULL);
    3323                 :             : 
    3324                 :    15418396 :   return body;
    3325                 :             : }
    3326                 :             : 
    3327                 :             : /* Make a copy of the body of FN so that it can be inserted inline in
    3328                 :             :    another function.  */
    3329                 :             : 
    3330                 :             : static tree
    3331                 :     3867798 : copy_body (copy_body_data *id,
    3332                 :             :            basic_block entry_block_map, basic_block exit_block_map,
    3333                 :             :            basic_block new_entry)
    3334                 :             : {
    3335                 :     3867798 :   tree fndecl = id->src_fn;
    3336                 :     3867798 :   tree body;
    3337                 :             : 
    3338                 :             :   /* If this body has a CFG, walk CFG and copy.  */
    3339                 :     3867798 :   gcc_assert (ENTRY_BLOCK_PTR_FOR_FN (DECL_STRUCT_FUNCTION (fndecl)));
    3340                 :     3867798 :   body = copy_cfg_body (id, entry_block_map, exit_block_map,
    3341                 :             :                         new_entry);
    3342                 :     3867798 :   copy_debug_stmts (id);
    3343                 :     3867798 :   if (id->killed_new_ssa_names)
    3344                 :             :     {
    3345                 :     1696195 :       ipa_release_ssas_in_hash (id->killed_new_ssa_names);
    3346                 :     3392390 :       delete id->killed_new_ssa_names;
    3347                 :     1696195 :       id->killed_new_ssa_names = NULL;
    3348                 :             :     }
    3349                 :             : 
    3350                 :     3867798 :   return body;
    3351                 :             : }
    3352                 :             : 
    3353                 :             : /* Return true if VALUE is an ADDR_EXPR of an automatic variable
    3354                 :             :    defined in function FN, or of a data member thereof.  */
    3355                 :             : 
    3356                 :             : static bool
    3357                 :       60858 : self_inlining_addr_expr (tree value, tree fn)
    3358                 :             : {
    3359                 :       60858 :   tree var;
    3360                 :             : 
    3361                 :       60858 :   if (TREE_CODE (value) != ADDR_EXPR)
    3362                 :             :     return false;
    3363                 :             : 
    3364                 :       55904 :   var = get_base_address (TREE_OPERAND (value, 0));
    3365                 :             : 
    3366                 :       55904 :   return var && auto_var_in_fn_p (var, fn);
    3367                 :             : }
    3368                 :             : 
    3369                 :             : /* Append to BB a debug annotation that binds VAR to VALUE, inheriting
    3370                 :             :    lexical block and line number information from base_stmt, if given,
    3371                 :             :    or from the last stmt of the block otherwise.  */
    3372                 :             : 
    3373                 :             : static gimple *
    3374                 :     6155307 : insert_init_debug_bind (copy_body_data *id,
    3375                 :             :                         basic_block bb, tree var, tree value,
    3376                 :             :                         gimple *base_stmt)
    3377                 :             : {
    3378                 :     6155307 :   gimple *note;
    3379                 :     6155307 :   gimple_stmt_iterator gsi;
    3380                 :     6155307 :   tree tracked_var;
    3381                 :             : 
    3382                 :     7385086 :   if (!gimple_in_ssa_p (id->src_cfun))
    3383                 :             :     return NULL;
    3384                 :             : 
    3385                 :     6155307 :   if (!opt_for_fn (id->dst_fn, flag_var_tracking_assignments))
    3386                 :             :     return NULL;
    3387                 :             : 
    3388                 :     5408197 :   tracked_var = target_for_debug_bind (var);
    3389                 :     5408197 :   if (!tracked_var)
    3390                 :             :     return NULL;
    3391                 :             : 
    3392                 :     4925528 :   if (bb)
    3393                 :             :     {
    3394                 :     4919994 :       gsi = gsi_last_bb (bb);
    3395                 :     4919994 :       if (!base_stmt && !gsi_end_p (gsi))
    3396                 :     4925528 :         base_stmt = gsi_stmt (gsi);
    3397                 :             :     }
    3398                 :             : 
    3399                 :     4925528 :   note = gimple_build_debug_bind (tracked_var,
    3400                 :     4925528 :                                   value == error_mark_node
    3401                 :     4925528 :                                   ? NULL_TREE : unshare_expr (value),
    3402                 :             :                                   base_stmt);
    3403                 :             : 
    3404                 :     4925528 :   if (bb)
    3405                 :             :     {
    3406                 :     4919994 :       if (!gsi_end_p (gsi))
    3407                 :     4195703 :         gsi_insert_after (&gsi, note, GSI_SAME_STMT);
    3408                 :             :       else
    3409                 :      724291 :         gsi_insert_before (&gsi, note, GSI_SAME_STMT);
    3410                 :             :     }
    3411                 :             : 
    3412                 :             :   return note;
    3413                 :             : }
    3414                 :             : 
    3415                 :             : static void
    3416                 :      421283 : insert_init_stmt (copy_body_data *id, basic_block bb, gimple *init_stmt)
    3417                 :             : {
    3418                 :             :   /* If VAR represents a zero-sized variable, it's possible that the
    3419                 :             :      assignment statement may result in no gimple statements.  */
    3420                 :      421283 :   if (init_stmt)
    3421                 :             :     {
    3422                 :      421283 :       gimple_stmt_iterator si = gsi_last_bb (bb);
    3423                 :             : 
    3424                 :             :       /* We can end up with init statements that store to a non-register
    3425                 :             :          from a rhs with a conversion.  Handle that here by forcing the
    3426                 :             :          rhs into a temporary.  gimple_regimplify_operands is not
    3427                 :             :          prepared to do this for us.  */
    3428                 :      421283 :       if (!is_gimple_debug (init_stmt)
    3429                 :      415749 :           && !is_gimple_reg (gimple_assign_lhs (init_stmt))
    3430                 :      257583 :           && is_gimple_reg_type (TREE_TYPE (gimple_assign_lhs (init_stmt)))
    3431                 :      442293 :           && gimple_assign_rhs_class (init_stmt) == GIMPLE_UNARY_RHS)
    3432                 :             :         {
    3433                 :        3440 :           tree rhs = build1 (gimple_assign_rhs_code (init_stmt),
    3434                 :        1720 :                              TREE_TYPE (gimple_assign_lhs (init_stmt)),
    3435                 :             :                              gimple_assign_rhs1 (init_stmt));
    3436                 :        1720 :           rhs = force_gimple_operand_gsi (&si, rhs, true, NULL_TREE, false,
    3437                 :             :                                           GSI_NEW_STMT);
    3438                 :        1720 :           gimple_assign_set_rhs_code (init_stmt, TREE_CODE (rhs));
    3439                 :        1720 :           gimple_assign_set_rhs1 (init_stmt, rhs);
    3440                 :             :         }
    3441                 :      421283 :       gsi_insert_after (&si, init_stmt, GSI_NEW_STMT);
    3442                 :      421283 :       if (!is_gimple_debug (init_stmt))
    3443                 :             :         {
    3444                 :      415749 :           gimple_regimplify_operands (init_stmt, &si);
    3445                 :             : 
    3446                 :      415749 :           tree def = gimple_assign_lhs (init_stmt);
    3447                 :      415749 :           insert_init_debug_bind (id, bb, def, def, init_stmt);
    3448                 :             :         }
    3449                 :             :     }
    3450                 :      421283 : }
    3451                 :             : 
    3452                 :             : /* Deal with mismatched formal/actual parameters, in a rather brute-force way
    3453                 :             :    if need be (which should only be necessary for invalid programs).  Attempt
    3454                 :             :    to convert VAL to TYPE and return the result if it is possible, just return
    3455                 :             :    a zero constant of the given type if it fails.  */
    3456                 :             : 
    3457                 :             : tree
    3458                 :      161022 : force_value_to_type (tree type, tree value)
    3459                 :             : {
    3460                 :             :   /* If we can match up types by promotion/demotion do so.  */
    3461                 :      161022 :   if (fold_convertible_p (type, value))
    3462                 :      160568 :     return fold_convert (type, value);
    3463                 :             : 
    3464                 :             :   /* ???  For valid programs we should not end up here.
    3465                 :             :      Still if we end up with truly mismatched types here, fall back
    3466                 :             :      to using a VIEW_CONVERT_EXPR or a literal zero to not leak invalid
    3467                 :             :      GIMPLE to the following passes.  */
    3468                 :         454 :   if (TREE_CODE (value) == WITH_SIZE_EXPR)
    3469                 :           0 :     return error_mark_node;
    3470                 :         454 :   else if (!is_gimple_reg_type (TREE_TYPE (value))
    3471                 :         454 :            || TYPE_SIZE (type) == TYPE_SIZE (TREE_TYPE (value)))
    3472                 :         163 :     return fold_build1 (VIEW_CONVERT_EXPR, type, value);
    3473                 :             :   else
    3474                 :         291 :     return build_zero_cst (type);
    3475                 :             : }
    3476                 :             : 
    3477                 :             : /* Initialize parameter P with VALUE.  If needed, produce init statement
    3478                 :             :    at the end of BB.  When BB is NULL, we return init statement to be
    3479                 :             :    output later.  */
    3480                 :             : static gimple *
    3481                 :     6148447 : setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn,
    3482                 :             :                      basic_block bb, tree *vars)
    3483                 :             : {
    3484                 :     6148447 :   gimple *init_stmt = NULL;
    3485                 :     6148447 :   tree var;
    3486                 :     6148447 :   tree def = (gimple_in_ssa_p (cfun)
    3487                 :     6148447 :               ? ssa_default_def (id->src_cfun, p) : NULL);
    3488                 :             : 
    3489                 :             :   /* Make an equivalent VAR_DECL.  Note that we must NOT remap the type
    3490                 :             :      here since the type of this decl must be visible to the calling
    3491                 :             :      function.  */
    3492                 :     6148447 :   var = copy_decl_to_var (p, id);
    3493                 :             : 
    3494                 :             :   /* Declare this new variable.  */
    3495                 :     6148447 :   DECL_CHAIN (var) = *vars;
    3496                 :     6148447 :   *vars = var;
    3497                 :             : 
    3498                 :             :   /* Make gimplifier happy about this variable.  */
    3499                 :     6148447 :   DECL_SEEN_IN_BIND_EXPR_P (var) = 1;
    3500                 :             : 
    3501                 :             :   /* If the parameter is never assigned to, has no SSA_NAMEs created,
    3502                 :             :      we would not need to create a new variable here at all, if it
    3503                 :             :      weren't for debug info.  Still, we can just use the argument
    3504                 :             :      value.  */
    3505                 :     6148447 :   if (TREE_READONLY (p)
    3506                 :     3247177 :       && !TREE_ADDRESSABLE (p)
    3507                 :     3246129 :       && value
    3508                 :     3246128 :       && !TREE_SIDE_EFFECTS (value)
    3509                 :     9394569 :       && !def)
    3510                 :             :     {
    3511                 :             :       /* We may produce non-gimple trees by adding NOPs or introduce invalid
    3512                 :             :          sharing when the value is not constant or DECL.  And we need to make
    3513                 :             :          sure that it cannot be modified from another path in the callee.  */
    3514                 :      230703 :       if (((is_gimple_min_invariant (value)
    3515                 :             :             /* When the parameter is used in a context that forces it to
    3516                 :             :                not be a GIMPLE register avoid substituting something that
    3517                 :             :                is not a decl there.  */
    3518                 :       60756 :             && ! DECL_NOT_GIMPLE_REG_P (p))
    3519                 :      169958 :            || (DECL_P (value) && TREE_READONLY (value))
    3520                 :      169905 :            || (auto_var_in_fn_p (value, id->dst_fn)
    3521                 :          67 :                && !TREE_ADDRESSABLE (value)))
    3522                 :       60861 :           && useless_type_conversion_p (TREE_TYPE (p), TREE_TYPE (value))
    3523                 :             :           /* We have to be very careful about ADDR_EXPR.  Make sure
    3524                 :             :              the base variable isn't a local variable of the inlined
    3525                 :             :              function, e.g., when doing recursive inlining, direct or
    3526                 :             :              mutually-recursive or whatever, which is why we don't
    3527                 :             :              just test whether fn == current_function_decl.  */
    3528                 :      291561 :           && ! self_inlining_addr_expr (value, fn))
    3529                 :             :         {
    3530                 :       60858 :           insert_decl_map (id, p, value);
    3531                 :       60858 :           if (!id->debug_map)
    3532                 :       58481 :             id->debug_map = new hash_map<tree, tree>;
    3533                 :       60858 :           id->debug_map->put (p, var);
    3534                 :       60858 :           return insert_init_debug_bind (id, bb, var, value, NULL);
    3535                 :             :         }
    3536                 :             :     }
    3537                 :             : 
    3538                 :             :   /* Register the VAR_DECL as the equivalent for the PARM_DECL;
    3539                 :             :      that way, when the PARM_DECL is encountered, it will be
    3540                 :             :      automatically replaced by the VAR_DECL.  */
    3541                 :     6087589 :   insert_decl_map (id, p, var);
    3542                 :             : 
    3543                 :             :   /* Even if P was TREE_READONLY, the new VAR should not be.  In the original
    3544                 :             :      code, we would have constructed a temporary, and then the function body
    3545                 :             :      would have never changed the value of P.  However, now, we will be
    3546                 :             :      constructing VAR directly.  Therefore, it must not be TREE_READONLY.  */
    3547                 :     6087589 :   TREE_READONLY (var) = 0;
    3548                 :             : 
    3549                 :     6087589 :   tree rhs = value;
    3550                 :     6087589 :   if (value
    3551                 :     6086687 :       && value != error_mark_node
    3552                 :    12174276 :       && !useless_type_conversion_p (TREE_TYPE (p), TREE_TYPE (value)))
    3553                 :      161004 :     rhs = force_value_to_type (TREE_TYPE (p), value);
    3554                 :             : 
    3555                 :             :   /* If there is no setup required and we are in SSA, take the easy route
    3556                 :             :      replacing all SSA names representing the function parameter by the
    3557                 :             :      SSA name passed to function.
    3558                 :             : 
    3559                 :             :      We need to construct map for the variable anyway as it might be used
    3560                 :             :      in different SSA names when parameter is set in function.
    3561                 :             : 
    3562                 :             :      Do replacement at -O0 for const arguments replaced by constant.
    3563                 :             :      This is important for builtin_constant_p and other construct requiring
    3564                 :             :      constant argument to be visible in inlined function body.  */
    3565                 :    12175178 :   if (gimple_in_ssa_p (cfun) && rhs && def && is_gimple_reg (p)
    3566                 :     5535707 :       && (optimize
    3567                 :       16002 :           || (TREE_READONLY (p)
    3568                 :        5714 :               && is_gimple_min_invariant (rhs)))
    3569                 :     5522142 :       && (TREE_CODE (rhs) == SSA_NAME
    3570                 :     2161657 :           || is_gimple_min_invariant (rhs))
    3571                 :     5429682 :       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
    3572                 :             :     {
    3573                 :     5429682 :       insert_decl_map (id, def, rhs);
    3574                 :     5429682 :       return insert_init_debug_bind (id, bb, var, rhs, NULL);
    3575                 :             :     }
    3576                 :             : 
    3577                 :             :   /* If the value of argument is never used, don't care about initializing
    3578                 :             :      it.  */
    3579                 :     1299354 :   if (optimize && gimple_in_ssa_p (cfun) && !def && is_gimple_reg (p))
    3580                 :             :     {
    3581                 :             :       /* When there's a gross type mismatch between the passed value
    3582                 :             :          and the declared argument type drop it on the floor and do
    3583                 :             :          not bother to insert a debug bind.  */
    3584                 :      249032 :       if (value && !is_gimple_reg_type (TREE_TYPE (value)))
    3585                 :             :         return NULL;
    3586                 :      249018 :       return insert_init_debug_bind (id, bb, var, rhs, NULL);
    3587                 :             :     }
    3588                 :             : 
    3589                 :             :   /* Initialize this VAR_DECL from the equivalent argument.  Convert
    3590                 :             :      the argument to the proper type in case it was promoted.  */
    3591                 :      408875 :   if (value)
    3592                 :             :     {
    3593                 :      408796 :       if (rhs == error_mark_node)
    3594                 :             :         {
    3595                 :           0 :           insert_decl_map (id, p, var);
    3596                 :           0 :           return insert_init_debug_bind (id, bb, var, rhs, NULL);
    3597                 :             :         }
    3598                 :             : 
    3599                 :      408796 :       STRIP_USELESS_TYPE_CONVERSION (rhs);
    3600                 :             : 
    3601                 :             :       /* If we are in SSA form properly remap the default definition.  */
    3602                 :      817592 :       if (gimple_in_ssa_p (cfun) && is_gimple_reg (p))
    3603                 :             :         {
    3604                 :      108391 :           if (def)
    3605                 :             :             {
    3606                 :      106025 :               def = remap_ssa_name (def, id);
    3607                 :      106025 :               init_stmt = gimple_build_assign (def, rhs);
    3608                 :      106025 :               SSA_NAME_IS_DEFAULT_DEF (def) = 0;
    3609                 :      106025 :               set_ssa_default_def (cfun, var, NULL);
    3610                 :             :             }
    3611                 :             :         }
    3612                 :      300405 :       else if (!is_empty_type (TREE_TYPE (var)))
    3613                 :      257583 :         init_stmt = gimple_build_assign (var, rhs);
    3614                 :             : 
    3615                 :      408796 :       if (bb && init_stmt)
    3616                 :      363205 :         insert_init_stmt (id, bb, init_stmt);
    3617                 :             :     }
    3618                 :             :   return init_stmt;
    3619                 :             : }
    3620                 :             : 
    3621                 :             : /* Generate code to initialize the parameters of the function at the
    3622                 :             :    top of the stack in ID from the GIMPLE_CALL STMT.  */
    3623                 :             : 
    3624                 :             : static void
    3625                 :     3667217 : initialize_inlined_parameters (copy_body_data *id, gimple *stmt,
    3626                 :             :                                tree fn, basic_block bb)
    3627                 :             : {
    3628                 :     3667217 :   tree parms;
    3629                 :     3667217 :   size_t i;
    3630                 :     3667217 :   tree p;
    3631                 :     3667217 :   tree vars = NULL_TREE;
    3632                 :     3667217 :   tree static_chain = gimple_call_chain (stmt);
    3633                 :             : 
    3634                 :             :   /* Figure out what the parameters are.  */
    3635                 :     3667217 :   parms = DECL_ARGUMENTS (fn);
    3636                 :             : 
    3637                 :             :   /* Loop through the parameter declarations, replacing each with an
    3638                 :             :      equivalent VAR_DECL, appropriately initialized.  */
    3639                 :     9794727 :   for (p = parms, i = 0; p; p = DECL_CHAIN (p), i++)
    3640                 :             :     {
    3641                 :     6127510 :       tree val;
    3642                 :     6127510 :       val = i < gimple_call_num_args (stmt) ? gimple_call_arg (stmt, i) : NULL;
    3643                 :     6127510 :       setup_one_parameter (id, p, val, fn, bb, &vars);
    3644                 :             :     }
    3645                 :             :   /* After remapping parameters remap their types.  This has to be done
    3646                 :             :      in a second loop over all parameters to appropriately remap
    3647                 :             :      variable sized arrays when the size is specified in a
    3648                 :             :      parameter following the array.  */
    3649                 :     9794727 :   for (p = parms, i = 0; p; p = DECL_CHAIN (p), i++)
    3650                 :             :     {
    3651                 :     6127510 :       tree *varp = id->decl_map->get (p);
    3652                 :     6127510 :       if (varp && VAR_P (*varp))
    3653                 :             :         {
    3654                 :    12136270 :           tree def = (gimple_in_ssa_p (cfun) && is_gimple_reg (p)
    3655                 :     5768039 :                       ? ssa_default_def (id->src_cfun, p) : NULL);
    3656                 :     6068135 :           tree var = *varp;
    3657                 :     6068135 :           TREE_TYPE (var) = remap_type (TREE_TYPE (var), id);
    3658                 :             :           /* Also remap the default definition if it was remapped
    3659                 :             :              to the default definition of the parameter replacement
    3660                 :             :              by the parameter setup.  */
    3661                 :     6068135 :           if (def)
    3662                 :             :             {
    3663                 :     5517725 :               tree *defp = id->decl_map->get (def);
    3664                 :     5517725 :               if (defp
    3665                 :     5517647 :                   && TREE_CODE (*defp) == SSA_NAME
    3666                 :    10778120 :                   && SSA_NAME_VAR (*defp) == var)
    3667                 :      106025 :                 TREE_TYPE (*defp) = TREE_TYPE (var);
    3668                 :             :             }
    3669                 :             :           /* When not optimizing and the parameter is unused, assign to
    3670                 :             :              a dummy SSA name.  Do this after remapping the type above.  */
    3671                 :      550410 :           else if (!optimize
    3672                 :        2895 :                    && is_gimple_reg (p)
    3673                 :      552776 :                    && i < gimple_call_num_args (stmt))
    3674                 :             :             {
    3675                 :        2366 :               tree val = gimple_call_arg (stmt, i);
    3676                 :        2366 :               if (val != error_mark_node)
    3677                 :             :                 {
    3678                 :        2366 :                   if (!useless_type_conversion_p (TREE_TYPE (p),
    3679                 :        2366 :                                                   TREE_TYPE (val)))
    3680                 :           7 :                     val = force_value_to_type (TREE_TYPE (p), val);
    3681                 :        2366 :                   def = make_ssa_name (var);
    3682                 :        2366 :                   gimple *init_stmt = gimple_build_assign (def, val);
    3683                 :        2366 :                   insert_init_stmt (id, bb, init_stmt);
    3684                 :             :                 }
    3685                 :             :             }
    3686                 :             :         }
    3687                 :             :     }
    3688                 :             : 
    3689                 :             :   /* Initialize the static chain.  */
    3690                 :     3667217 :   p = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
    3691                 :     3667217 :   gcc_assert (fn != current_function_decl);
    3692                 :     3667217 :   if (p)
    3693                 :             :     {
    3694                 :             :       /* No static chain?  Seems like a bug in tree-nested.cc.  */
    3695                 :        1741 :       gcc_assert (static_chain);
    3696                 :             : 
    3697                 :        1741 :       setup_one_parameter (id, p, static_chain, fn, bb, &vars);
    3698                 :             :     }
    3699                 :             : 
    3700                 :             :   /* Reverse so the variables appear in the correct order in DWARF
    3701                 :             :      debug info.  */
    3702                 :     3667217 :   vars = nreverse (vars);
    3703                 :             : 
    3704                 :     3667217 :   declare_inline_vars (id->block, vars);
    3705                 :     3667217 : }
    3706                 :             : 
    3707                 :             : 
    3708                 :             : /* Declare a return variable to replace the RESULT_DECL for the
    3709                 :             :    function we are calling.  An appropriate DECL_STMT is returned.
    3710                 :             :    The USE_STMT is filled to contain a use of the declaration to
    3711                 :             :    indicate the return value of the function.
    3712                 :             : 
    3713                 :             :    RETURN_SLOT, if non-null is place where to store the result.  It
    3714                 :             :    is set only for CALL_EXPR_RETURN_SLOT_OPT.  MODIFY_DEST, if non-null,
    3715                 :             :    was the LHS of the MODIFY_EXPR to which this call is the RHS.
    3716                 :             : 
    3717                 :             :    The return value is a (possibly null) value that holds the result
    3718                 :             :    as seen by the caller.  */
    3719                 :             : 
    3720                 :             : static tree
    3721                 :     3667217 : declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest,
    3722                 :             :                          basic_block entry_bb)
    3723                 :             : {
    3724                 :     3667217 :   tree callee = id->src_fn;
    3725                 :     3667217 :   tree result = DECL_RESULT (callee);
    3726                 :     3667217 :   tree callee_type = TREE_TYPE (result);
    3727                 :     3667217 :   tree caller_type;
    3728                 :     3667217 :   tree var, use;
    3729                 :             : 
    3730                 :             :   /* Handle type-mismatches in the function declaration return type
    3731                 :             :      vs. the call expression.  */
    3732                 :     3667217 :   if (modify_dest)
    3733                 :     1691632 :     caller_type = TREE_TYPE (modify_dest);
    3734                 :     1975585 :   else if (return_slot)
    3735                 :       89601 :     caller_type = TREE_TYPE (return_slot);
    3736                 :             :   else /* No LHS on the call.  */
    3737                 :     1885984 :     caller_type = TREE_TYPE (TREE_TYPE (callee));
    3738                 :             : 
    3739                 :             :   /* We don't need to do anything for functions that don't return anything.  */
    3740                 :     3667217 :   if (VOID_TYPE_P (callee_type))
    3741                 :             :     return NULL_TREE;
    3742                 :             : 
    3743                 :             :   /* If there was a return slot, then the return value is the
    3744                 :             :      dereferenced address of that object.  */
    3745                 :     1910951 :   if (return_slot)
    3746                 :             :     {
    3747                 :             :       /* The front end shouldn't have used both return_slot and
    3748                 :             :          a modify expression.  */
    3749                 :       89601 :       gcc_assert (!modify_dest);
    3750                 :       89601 :       if (DECL_BY_REFERENCE (result))
    3751                 :             :         {
    3752                 :       49775 :           tree return_slot_addr = build_fold_addr_expr (return_slot);
    3753                 :       49775 :           STRIP_USELESS_TYPE_CONVERSION (return_slot_addr);
    3754                 :             : 
    3755                 :             :           /* We are going to construct *&return_slot and we can't do that
    3756                 :             :              for variables believed to be not addressable.
    3757                 :             : 
    3758                 :             :              FIXME: This check possibly can match, because values returned
    3759                 :             :              via return slot optimization are not believed to have address
    3760                 :             :              taken by alias analysis.  */
    3761                 :       49775 :           gcc_assert (TREE_CODE (return_slot) != SSA_NAME);
    3762                 :       49775 :           var = return_slot_addr;
    3763                 :       49775 :           mark_addressable (return_slot);
    3764                 :             :         }
    3765                 :             :       else
    3766                 :             :         {
    3767                 :       39826 :           var = return_slot;
    3768                 :       39826 :           gcc_assert (TREE_CODE (var) != SSA_NAME);
    3769                 :       39826 :           if (TREE_ADDRESSABLE (result))
    3770                 :        9431 :             mark_addressable (var);
    3771                 :             :         }
    3772                 :       89601 :       if (DECL_NOT_GIMPLE_REG_P (result)
    3773                 :       89601 :           && DECL_P (var))
    3774                 :           0 :         DECL_NOT_GIMPLE_REG_P (var) = 1;
    3775                 :             : 
    3776                 :       89601 :       if (!useless_type_conversion_p (callee_type, caller_type))
    3777                 :       49777 :         var = build1 (VIEW_CONVERT_EXPR, callee_type, var);
    3778                 :             : 
    3779                 :       89601 :       use = NULL;
    3780                 :       89601 :       goto done;
    3781                 :             :     }
    3782                 :             : 
    3783                 :             :   /* All types requiring non-trivial constructors should have been handled.  */
    3784                 :     1821350 :   gcc_assert (!TREE_ADDRESSABLE (callee_type));
    3785                 :             : 
    3786                 :             :   /* Attempt to avoid creating a new temporary variable.  */
    3787                 :     1821350 :   if (modify_dest
    3788                 :     1691611 :       && TREE_CODE (modify_dest) != SSA_NAME)
    3789                 :             :     {
    3790                 :      229382 :       bool use_it = false;
    3791                 :             : 
    3792                 :             :       /* We can't use MODIFY_DEST if there's type promotion involved.  */
    3793                 :      229382 :       if (!useless_type_conversion_p (callee_type, caller_type))
    3794                 :             :         use_it = false;
    3795                 :             : 
    3796                 :             :       /* ??? If we're assigning to a variable sized type, then we must
    3797                 :             :          reuse the destination variable, because we've no good way to
    3798                 :             :          create variable sized temporaries at this point.  */
    3799                 :      229380 :       else if (!poly_int_tree_p (TYPE_SIZE_UNIT (caller_type)))
    3800                 :             :         use_it = true;
    3801                 :             : 
    3802                 :             :       /* If the callee cannot possibly modify MODIFY_DEST, then we can
    3803                 :             :          reuse it as the result of the call directly.  Don't do this if
    3804                 :             :          it would promote MODIFY_DEST to addressable.  */
    3805                 :      229380 :       else if (TREE_ADDRESSABLE (result))
    3806                 :             :         use_it = false;
    3807                 :             :       else
    3808                 :             :         {
    3809                 :      228639 :           tree base_m = get_base_address (modify_dest);
    3810                 :             : 
    3811                 :             :           /* If the base isn't a decl, then it's a pointer, and we don't
    3812                 :             :              know where that's going to go.  */
    3813                 :      228639 :           if (!DECL_P (base_m))
    3814                 :             :             use_it = false;
    3815                 :      223849 :           else if (is_global_var (base_m))
    3816                 :             :             use_it = false;
    3817                 :      223569 :           else if (DECL_NOT_GIMPLE_REG_P (result)
    3818                 :      223569 :                    && !DECL_NOT_GIMPLE_REG_P (base_m))
    3819                 :             :             use_it = false;
    3820                 :      223569 :           else if (!TREE_ADDRESSABLE (base_m))
    3821                 :             :             use_it = true;
    3822                 :             :         }
    3823                 :             : 
    3824                 :             :       if (use_it)
    3825                 :             :         {
    3826                 :      148735 :           var = modify_dest;
    3827                 :      148735 :           use = NULL;
    3828                 :      148735 :           goto done;
    3829                 :             :         }
    3830                 :             :     }
    3831                 :             : 
    3832                 :     1672615 :   gcc_assert (poly_int_tree_p (TYPE_SIZE_UNIT (callee_type)));
    3833                 :             : 
    3834                 :     1672615 :   var = copy_result_decl_to_var (result, id);
    3835                 :     1672615 :   DECL_SEEN_IN_BIND_EXPR_P (var) = 1;
    3836                 :             : 
    3837                 :             :   /* Do not have the rest of GCC warn about this variable as it should
    3838                 :             :      not be visible to the user.  */
    3839                 :     1672615 :   suppress_warning (var /* OPT_Wuninitialized? */);
    3840                 :             : 
    3841                 :     1672615 :   declare_inline_vars (id->block, var);
    3842                 :             : 
    3843                 :             :   /* Build the use expr.  If the return type of the function was
    3844                 :             :      promoted, convert it back to the expected type.  */
    3845                 :     1672615 :   use = var;
    3846                 :     1672615 :   if (!useless_type_conversion_p (caller_type, TREE_TYPE (var)))
    3847                 :             :     {
    3848                 :             :       /* If we can match up types by promotion/demotion do so.  */
    3849                 :           7 :       if (fold_convertible_p (caller_type, var))
    3850                 :           0 :         use = fold_convert (caller_type, var);
    3851                 :             :       else
    3852                 :             :         {
    3853                 :             :           /* ???  For valid programs we should not end up here.
    3854                 :             :              Still if we end up with truly mismatched types here, fall back
    3855                 :             :              to using a MEM_REF to not leak invalid GIMPLE to the following
    3856                 :             :              passes.  */
    3857                 :             :           /* Prevent var from being written into SSA form.  */
    3858                 :           7 :           if (is_gimple_reg_type (TREE_TYPE (var)))
    3859                 :           7 :             DECL_NOT_GIMPLE_REG_P (var) = true;
    3860                 :           7 :           use = fold_build2 (MEM_REF, caller_type,
    3861                 :             :                              build_fold_addr_expr (var),
    3862                 :             :                              build_int_cst (ptr_type_node, 0));
    3863                 :             :         }
    3864                 :             :     }
    3865                 :             : 
    3866                 :     1672615 :   STRIP_USELESS_TYPE_CONVERSION (use);
    3867                 :             : 
    3868                 :     1672615 :   if (DECL_BY_REFERENCE (result))
    3869                 :             :     {
    3870                 :           0 :       TREE_ADDRESSABLE (var) = 1;
    3871                 :           0 :       var = build_fold_addr_expr (var);
    3872                 :             :     }
    3873                 :             : 
    3874                 :     1672615 :  done:
    3875                 :             :   /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
    3876                 :             :      way, when the RESULT_DECL is encountered, it will be
    3877                 :             :      automatically replaced by the VAR_DECL.  
    3878                 :             : 
    3879                 :             :      When returning by reference, ensure that RESULT_DECL remaps to
    3880                 :             :      gimple_val.  */
    3881                 :     1910951 :   if (DECL_BY_REFERENCE (result)
    3882                 :     1910951 :       && !is_gimple_val (var))
    3883                 :             :     {
    3884                 :       49775 :       tree temp = create_tmp_var (TREE_TYPE (result), "retvalptr");
    3885                 :       49775 :       insert_decl_map (id, result, temp);
    3886                 :             :       /* When RESULT_DECL is in SSA form, we need to remap and initialize
    3887                 :             :          it's default_def SSA_NAME.  */
    3888                 :       49775 :       if (gimple_in_ssa_p (id->src_cfun)
    3889                 :       49775 :           && is_gimple_reg (result))
    3890                 :       49775 :         if (tree default_def = ssa_default_def (id->src_cfun, result))
    3891                 :             :           {
    3892                 :       49736 :             temp = make_ssa_name (temp);
    3893                 :       49736 :             insert_decl_map (id, default_def, temp);
    3894                 :             :           }
    3895                 :       49775 :       insert_init_stmt (id, entry_bb, gimple_build_assign (temp, var));
    3896                 :             :     }
    3897                 :             :   else
    3898                 :     1861176 :     insert_decl_map (id, result, var);
    3899                 :             : 
    3900                 :             :   /* Remember this so we can ignore it in remap_decls.  */
    3901                 :     1910951 :   id->retvar = var;
    3902                 :     1910951 :   return use;
    3903                 :             : }
    3904                 :             : 
    3905                 :             : /* Determine if the function can be copied.  If so return NULL.  If
    3906                 :             :    not return a string describng the reason for failure.  */
    3907                 :             : 
    3908                 :             : const char *
    3909                 :    15645690 : copy_forbidden (struct function *fun)
    3910                 :             : {
    3911                 :    15645690 :   const char *reason = fun->cannot_be_copied_reason;
    3912                 :             : 
    3913                 :             :   /* Only examine the function once.  */
    3914                 :    15645690 :   if (fun->cannot_be_copied_set)
    3915                 :             :     return reason;
    3916                 :             : 
    3917                 :             :   /* We cannot copy a function that receives a non-local goto
    3918                 :             :      because we cannot remap the destination label used in the
    3919                 :             :      function that is performing the non-local goto.  */
    3920                 :             :   /* ??? Actually, this should be possible, if we work at it.
    3921                 :             :      No doubt there's just a handful of places that simply
    3922                 :             :      assume it doesn't happen and don't substitute properly.  */
    3923                 :     8988798 :   if (fun->has_nonlocal_label)
    3924                 :             :     {
    3925                 :         778 :       reason = G_("function %q+F can never be copied "
    3926                 :             :                   "because it receives a non-local goto");
    3927                 :         778 :       goto fail;
    3928                 :             :     }
    3929                 :             : 
    3930                 :     8988020 :   if (fun->has_forced_label_in_static)
    3931                 :             :     {
    3932                 :         229 :       reason = G_("function %q+F can never be copied because it saves "
    3933                 :             :                   "address of local label in a static variable");
    3934                 :         229 :       goto fail;
    3935                 :             :     }
    3936                 :             : 
    3937                 :     8987791 :  fail:
    3938                 :     8988798 :   fun->cannot_be_copied_reason = reason;
    3939                 :     8988798 :   fun->cannot_be_copied_set = true;
    3940                 :     8988798 :   return reason;
    3941                 :             : }
    3942                 :             : 
    3943                 :             : 
    3944                 :             : static const char *inline_forbidden_reason;
    3945                 :             : 
    3946                 :             : /* A callback for walk_gimple_seq to handle statements.  Returns non-null
    3947                 :             :    iff a function cannot be inlined.  Also sets the reason why. */
    3948                 :             : 
    3949                 :             : static tree
    3950                 :   146798160 : inline_forbidden_p_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
    3951                 :             :                          struct walk_stmt_info *wip)
    3952                 :             : {
    3953                 :   146798160 :   tree fn = (tree) wip->info;
    3954                 :   146798160 :   tree t;
    3955                 :   146798160 :   gimple *stmt = gsi_stmt (*gsi);
    3956                 :             : 
    3957                 :   146798160 :   switch (gimple_code (stmt))
    3958                 :             :     {
    3959                 :    16630889 :     case GIMPLE_CALL:
    3960                 :             :       /* Refuse to inline alloca call unless user explicitly forced so as
    3961                 :             :          this may change program's memory overhead drastically when the
    3962                 :             :          function using alloca is called in loop.  In GCC present in
    3963                 :             :          SPEC2000 inlining into schedule_block cause it to require 2GB of
    3964                 :             :          RAM instead of 256MB.  Don't do so for alloca calls emitted for
    3965                 :             :          VLA objects as those can't cause unbounded growth (they're always
    3966                 :             :          wrapped inside stack_save/stack_restore regions.  */
    3967                 :    16630889 :       if (gimple_maybe_alloca_call_p (stmt)
    3968                 :        8794 :           && !gimple_call_alloca_for_var_p (as_a <gcall *> (stmt))
    3969                 :    16635000 :           && !lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
    3970                 :             :         {
    3971                 :        3987 :           inline_forbidden_reason
    3972                 :        3987 :             = G_("function %q+F can never be inlined because it uses "
    3973                 :             :                  "alloca (override using the always_inline attribute)");
    3974                 :        3987 :           *handled_ops_p = true;
    3975                 :        3987 :           return fn;
    3976                 :             :         }
    3977                 :             : 
    3978                 :    16626902 :       t = gimple_call_fndecl (stmt);
    3979                 :    16626902 :       if (t == NULL_TREE)
    3980                 :             :         break;
    3981                 :             : 
    3982                 :             :       /* We cannot inline functions that call setjmp.  */
    3983                 :    16155925 :       if (setjmp_call_p (t))
    3984                 :             :         {
    3985                 :         854 :           inline_forbidden_reason
    3986                 :         854 :             = G_("function %q+F can never be inlined because it uses setjmp");
    3987                 :         854 :           *handled_ops_p = true;
    3988                 :         854 :           return t;
    3989                 :             :         }
    3990                 :             : 
    3991                 :    16155071 :       if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL)
    3992                 :     3152650 :         switch (DECL_FUNCTION_CODE (t))
    3993                 :             :           {
    3994                 :             :             /* We cannot inline functions that take a variable number of
    3995                 :             :                arguments.  */
    3996                 :        2698 :           case BUILT_IN_VA_START:
    3997                 :        2698 :           case BUILT_IN_NEXT_ARG:
    3998                 :        2698 :           case BUILT_IN_VA_END:
    3999                 :        2698 :             inline_forbidden_reason
    4000                 :        2698 :               = G_("function %q+F can never be inlined because it "
    4001                 :             :                    "uses variable argument lists");
    4002                 :        2698 :             *handled_ops_p = true;
    4003                 :        2698 :             return t;
    4004                 :             : 
    4005                 :         226 :           case BUILT_IN_LONGJMP:
    4006                 :             :             /* We can't inline functions that call __builtin_longjmp at
    4007                 :             :                all.  The non-local goto machinery really requires the
    4008                 :             :                destination be in a different function.  If we allow the
    4009                 :             :                function calling __builtin_longjmp to be inlined into the
    4010                 :             :                function calling __builtin_setjmp, Things will Go Awry.  */
    4011                 :         226 :             inline_forbidden_reason
    4012                 :         226 :               = G_("function %q+F can never be inlined because "
    4013                 :             :                    "it uses setjmp-longjmp exception handling");
    4014                 :         226 :             *handled_ops_p = true;
    4015                 :         226 :             return t;
    4016                 :             : 
    4017                 :         269 :           case BUILT_IN_NONLOCAL_GOTO:
    4018                 :             :             /* Similarly.  */
    4019                 :         269 :             inline_forbidden_reason
    4020                 :         269 :               = G_("function %q+F can never be inlined because "
    4021                 :             :                    "it uses non-local goto");
    4022                 :         269 :             *handled_ops_p = true;
    4023                 :         269 :             return t;
    4024                 :             : 
    4025                 :         385 :           case BUILT_IN_RETURN:
    4026                 :         385 :           case BUILT_IN_APPLY_ARGS:
    4027                 :             :             /* If a __builtin_apply_args caller would be inlined,
    4028                 :             :                it would be saving arguments of the function it has
    4029                 :             :                been inlined into.  Similarly __builtin_return would
    4030                 :             :                return from the function the inline has been inlined into.  */
    4031                 :         385 :             inline_forbidden_reason
    4032                 :         385 :               = G_("function %q+F can never be inlined because "
    4033                 :             :                    "it uses %<__builtin_return%> or %<__builtin_apply_args%>");
    4034                 :         385 :             *handled_ops_p = true;
    4035                 :         385 :             return t;
    4036                 :             : 
    4037                 :             :           default:
    4038                 :             :             break;
    4039                 :             :           }
    4040                 :             :       break;
    4041                 :             : 
    4042                 :         285 :     case GIMPLE_GOTO:
    4043                 :         285 :       t = gimple_goto_dest (stmt);
    4044                 :             : 
    4045                 :             :       /* We will not inline a function which uses computed goto.  The
    4046                 :             :          addresses of its local labels, which may be tucked into
    4047                 :             :          global storage, are of course not constant across
    4048                 :             :          instantiations, which causes unexpected behavior.  */
    4049                 :         285 :       if (TREE_CODE (t) != LABEL_DECL)
    4050                 :             :         {
    4051                 :         285 :           inline_forbidden_reason
    4052                 :         285 :             = G_("function %q+F can never be inlined "
    4053                 :             :                  "because it contains a computed goto");
    4054                 :         285 :           *handled_ops_p = true;
    4055                 :         285 :           return t;
    4056                 :             :         }
    4057                 :             :       break;
    4058                 :             : 
    4059                 :             :     default:
    4060                 :             :       break;
    4061                 :             :     }
    4062                 :             : 
    4063                 :   146789456 :   *handled_ops_p = false;
    4064                 :   146789456 :   return NULL_TREE;
    4065                 :             : }
    4066                 :             : 
    4067                 :             : /* Return true if FNDECL is a function that cannot be inlined into
    4068                 :             :    another one.  */
    4069                 :             : 
    4070                 :             : static bool
    4071                 :     5212743 : inline_forbidden_p (tree fndecl)
    4072                 :             : {
    4073                 :     5212743 :   struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
    4074                 :     5212743 :   struct walk_stmt_info wi;
    4075                 :     5212743 :   basic_block bb;
    4076                 :     5212743 :   bool forbidden_p = false;
    4077                 :             : 
    4078                 :             :   /* First check for shared reasons not to copy the code.  */
    4079                 :     5212743 :   inline_forbidden_reason = copy_forbidden (fun);
    4080                 :     5212743 :   if (inline_forbidden_reason != NULL)
    4081                 :             :     return true;
    4082                 :             : 
    4083                 :             :   /* Next, walk the statements of the function looking for
    4084                 :             :      constraucts we can't handle, or are non-optimal for inlining.  */
    4085                 :     5212046 :   hash_set<tree> visited_nodes;
    4086                 :     5212046 :   memset (&wi, 0, sizeof (wi));
    4087                 :     5212046 :   wi.info = (void *) fndecl;
    4088                 :     5212046 :   wi.pset = &visited_nodes;
    4089                 :             : 
    4090                 :             :   /* We cannot inline a function with a variable-sized parameter because we
    4091                 :             :      cannot materialize a temporary of such a type in the caller if need be.
    4092                 :             :      Note that the return case is not symmetrical because we can guarantee
    4093                 :             :      that a temporary is not needed by means of CALL_EXPR_RETURN_SLOT_OPT.  */
    4094                 :    16677268 :   for (tree parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
    4095                 :    11465224 :     if (!poly_int_tree_p (DECL_SIZE (parm)))
    4096                 :             :       {
    4097                 :           2 :         inline_forbidden_reason
    4098                 :           2 :           = G_("function %q+F can never be inlined because "
    4099                 :             :                "it has a VLA argument");
    4100                 :           2 :         return true;
    4101                 :             :       }
    4102                 :             : 
    4103                 :    33813796 :   FOR_EACH_BB_FN (bb, fun)
    4104                 :             :     {
    4105                 :    28610456 :       gimple *ret;
    4106                 :    28610456 :       gimple_seq seq = bb_seq (bb);
    4107                 :    28610456 :       ret = walk_gimple_seq (seq, inline_forbidden_p_stmt, NULL, &wi);
    4108                 :    28610456 :       forbidden_p = (ret != NULL);
    4109                 :    28610456 :       if (forbidden_p)
    4110                 :             :         break;
    4111                 :             :     }
    4112                 :             : 
    4113                 :             :   return forbidden_p;
    4114                 :     5212046 : }
    4115                 :             : 
    4116                 :             : /* Return false if the function FNDECL cannot be inlined on account of its
    4117                 :             :    attributes, true otherwise.  */
    4118                 :             : static bool
    4119                 :     5212743 : function_attribute_inlinable_p (const_tree fndecl)
    4120                 :             : {
    4121                 :    10410139 :   for (auto scoped_attributes : targetm.attribute_table)
    4122                 :             :     {
    4123                 :     5212743 :       const_tree a;
    4124                 :             : 
    4125                 :     6599856 :       for (a = DECL_ATTRIBUTES (fndecl); a; a = TREE_CHAIN (a))
    4126                 :             :         {
    4127                 :     1402460 :           const_tree name = get_attribute_name (a);
    4128                 :             : 
    4129                 :    38902161 :           for (const attribute_spec &attribute : scoped_attributes->attributes)
    4130                 :    37515048 :             if (is_attribute_p (attribute.name, name))
    4131                 :       15347 :               return targetm.function_attribute_inlinable_p (fndecl);
    4132                 :             :         }
    4133                 :             :     }
    4134                 :             : 
    4135                 :             :   return true;
    4136                 :             : }
    4137                 :             : 
    4138                 :             : /* Returns nonzero if FN is a function that does not have any
    4139                 :             :    fundamental inline blocking properties.  */
    4140                 :             : 
    4141                 :             : bool
    4142                 :     5833520 : tree_inlinable_function_p (tree fn)
    4143                 :             : {
    4144                 :     5833520 :   bool inlinable = true;
    4145                 :     5833520 :   bool do_warning;
    4146                 :     5833520 :   tree always_inline;
    4147                 :             : 
    4148                 :             :   /* If we've already decided this function shouldn't be inlined,
    4149                 :             :      there's no need to check again.  */
    4150                 :     5833520 :   if (DECL_UNINLINABLE (fn))
    4151                 :             :     return false;
    4152                 :             : 
    4153                 :             :   /* We only warn for functions declared `inline' by the user.  */
    4154                 :     5244794 :   do_warning = (opt_for_fn (fn, warn_inline)
    4155                 :         730 :                 && DECL_DECLARED_INLINE_P (fn)
    4156                 :         568 :                 && !DECL_NO_INLINE_WARNING_P (fn)
    4157                 :     5245052 :                 && !DECL_IN_SYSTEM_HEADER (fn));
    4158                 :             : 
    4159                 :     5244794 :   always_inline = lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn));
    4160                 :             : 
    4161                 :     5244794 :   if (flag_no_inline
    4162                 :       93853 :       && always_inline == NULL)
    4163                 :             :     {
    4164                 :       32051 :       if (do_warning)
    4165                 :           0 :         warning (OPT_Winline, "function %q+F can never be inlined because it "
    4166                 :             :                  "is suppressed using %<-fno-inline%>", fn);
    4167                 :             :       inlinable = false;
    4168                 :             :     }
    4169                 :             : 
    4170                 :     5212743 :   else if (!function_attribute_inlinable_p (fn))
    4171                 :             :     {
    4172                 :           0 :       if (do_warning)
    4173                 :           0 :         warning (OPT_Winline, "function %q+F can never be inlined because it "
    4174                 :             :                  "uses attributes conflicting with inlining", fn);
    4175                 :             :       inlinable = false;
    4176                 :             :     }
    4177                 :             : 
    4178                 :     5212743 :   else if (inline_forbidden_p (fn))
    4179                 :             :     {
    4180                 :             :       /* See if we should warn about uninlinable functions.  Previously,
    4181                 :             :          some of these warnings would be issued while trying to expand
    4182                 :             :          the function inline, but that would cause multiple warnings
    4183                 :             :          about functions that would for example call alloca.  But since
    4184                 :             :          this a property of the function, just one warning is enough.
    4185                 :             :          As a bonus we can now give more details about the reason why a
    4186                 :             :          function is not inlinable.  */
    4187                 :        9403 :       if (always_inline)
    4188                 :           2 :         error (inline_forbidden_reason, fn);
    4189                 :        9401 :       else if (do_warning)
    4190                 :           2 :         warning (OPT_Winline, inline_forbidden_reason, fn);
    4191                 :             : 
    4192                 :             :       inlinable = false;
    4193                 :             :     }
    4194                 :             : 
    4195                 :             :   /* Squirrel away the result so that we don't have to check again.  */
    4196                 :     5244794 :   DECL_UNINLINABLE (fn) = !inlinable;
    4197                 :             : 
    4198                 :     5244794 :   return inlinable;
    4199                 :             : }
    4200                 :             : 
    4201                 :             : /* Estimate the cost of a memory move of type TYPE.  Use machine dependent
    4202                 :             :    word size and take possible memcpy call into account and return
    4203                 :             :    cost based on whether optimizing for size or speed according to SPEED_P.  */
    4204                 :             : 
    4205                 :             : int
    4206                 :   303132607 : estimate_move_cost (tree type, bool ARG_UNUSED (speed_p))
    4207                 :             : {
    4208                 :   303132607 :   HOST_WIDE_INT size;
    4209                 :             : 
    4210                 :   303132607 :   gcc_assert (!VOID_TYPE_P (type));
    4211                 :             : 
    4212                 :   303132607 :   if (VECTOR_TYPE_P (type))
    4213                 :             :     {
    4214                 :     3643219 :       scalar_mode inner = SCALAR_TYPE_MODE (TREE_TYPE (type));
    4215                 :     3643219 :       machine_mode simd = targetm.vectorize.preferred_simd_mode (inner);
    4216                 :     3643219 :       int orig_mode_size
    4217                 :     7286438 :         = estimated_poly_value (GET_MODE_SIZE (TYPE_MODE (type)));
    4218                 :     7286438 :       int simd_mode_size = estimated_poly_value (GET_MODE_SIZE (simd));
    4219                 :     3643219 :       return ((orig_mode_size + simd_mode_size - 1)
    4220                 :     3643219 :               / simd_mode_size);
    4221                 :             :     }
    4222                 :             : 
    4223                 :   299489388 :   size = int_size_in_bytes (type);
    4224                 :             : 
    4225                 :   299491892 :   if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO (speed_p))
    4226                 :             :     /* Cost of a memcpy call, 3 arguments and the call.  */
    4227                 :             :     return 4;
    4228                 :             :   else
    4229                 :   298601838 :     return ((size + MOVE_MAX_PIECES - 1) / MOVE_MAX_PIECES);
    4230                 :             : }
    4231                 :             : 
    4232                 :             : /* Returns cost of operation CODE, according to WEIGHTS  */
    4233                 :             : 
    4234                 :             : static int
    4235                 :   401022439 : estimate_operator_cost (enum tree_code code, eni_weights *weights,
    4236                 :             :                         tree op1 ATTRIBUTE_UNUSED, tree op2)
    4237                 :             : {
    4238                 :   401022439 :   switch (code)
    4239                 :             :     {
    4240                 :             :     /* These are "free" conversions, or their presumed cost
    4241                 :             :        is folded into other operations.  */
    4242                 :             :     case RANGE_EXPR:
    4243                 :             :     CASE_CONVERT:
    4244                 :             :     case COMPLEX_EXPR:
    4245                 :             :     case PAREN_EXPR:
    4246                 :             :     case VIEW_CONVERT_EXPR:
    4247                 :             :       return 0;
    4248                 :             : 
    4249                 :             :     /* Assign cost of 1 to usual operations.
    4250                 :             :        ??? We may consider mapping RTL costs to this.  */
    4251                 :             :     case COND_EXPR:
    4252                 :             :     case VEC_COND_EXPR:
    4253                 :             :     case VEC_PERM_EXPR:
    4254                 :             : 
    4255                 :             :     case PLUS_EXPR:
    4256                 :             :     case POINTER_PLUS_EXPR:
    4257                 :             :     case POINTER_DIFF_EXPR:
    4258                 :             :     case MINUS_EXPR:
    4259                 :             :     case MULT_EXPR:
    4260                 :             :     case MULT_HIGHPART_EXPR:
    4261                 :             : 
    4262                 :             :     case ADDR_SPACE_CONVERT_EXPR:
    4263                 :             :     case FIXED_CONVERT_EXPR:
    4264                 :             :     case FIX_TRUNC_EXPR:
    4265                 :             : 
    4266                 :             :     case NEGATE_EXPR:
    4267                 :             :     case FLOAT_EXPR:
    4268                 :             :     case MIN_EXPR:
    4269                 :             :     case MAX_EXPR:
    4270                 :             :     case ABS_EXPR:
    4271                 :             :     case ABSU_EXPR:
    4272                 :             : 
    4273                 :             :     case LSHIFT_EXPR:
    4274                 :             :     case RSHIFT_EXPR:
    4275                 :             :     case LROTATE_EXPR:
    4276                 :             :     case RROTATE_EXPR:
    4277                 :             : 
    4278                 :             :     case BIT_IOR_EXPR:
    4279                 :             :     case BIT_XOR_EXPR:
    4280                 :             :     case BIT_AND_EXPR:
    4281                 :             :     case BIT_NOT_EXPR:
    4282                 :             : 
    4283                 :             :     case TRUTH_ANDIF_EXPR:
    4284                 :             :     case TRUTH_ORIF_EXPR:
    4285                 :             :     case TRUTH_AND_EXPR:
    4286                 :             :     case TRUTH_OR_EXPR:
    4287                 :             :     case TRUTH_XOR_EXPR:
    4288                 :             :     case TRUTH_NOT_EXPR:
    4289                 :             : 
    4290                 :             :     case LT_EXPR:
    4291                 :             :     case LE_EXPR:
    4292                 :             :     case GT_EXPR:
    4293                 :             :     case GE_EXPR:
    4294                 :             :     case EQ_EXPR:
    4295                 :             :     case NE_EXPR:
    4296                 :             :     case ORDERED_EXPR:
    4297                 :             :     case UNORDERED_EXPR:
    4298                 :             : 
    4299                 :             :     case UNLT_EXPR:
    4300                 :             :     case UNLE_EXPR:
    4301                 :             :     case UNGT_EXPR:
    4302                 :             :     case UNGE_EXPR:
    4303                 :             :     case UNEQ_EXPR:
    4304                 :             :     case LTGT_EXPR:
    4305                 :             : 
    4306                 :             :     case CONJ_EXPR:
    4307                 :             : 
    4308                 :             :     case PREDECREMENT_EXPR:
    4309                 :             :     case PREINCREMENT_EXPR:
    4310                 :             :     case POSTDECREMENT_EXPR:
    4311                 :             :     case POSTINCREMENT_EXPR:
    4312                 :             : 
    4313                 :             :     case REALIGN_LOAD_EXPR:
    4314                 :             : 
    4315                 :             :     case WIDEN_SUM_EXPR:
    4316                 :             :     case WIDEN_MULT_EXPR:
    4317                 :             :     case DOT_PROD_EXPR:
    4318                 :             :     case SAD_EXPR:
    4319                 :             :     case WIDEN_MULT_PLUS_EXPR:
    4320                 :             :     case WIDEN_MULT_MINUS_EXPR:
    4321                 :             :     case WIDEN_LSHIFT_EXPR:
    4322                 :             : 
    4323                 :             :     case VEC_WIDEN_MULT_HI_EXPR:
    4324                 :             :     case VEC_WIDEN_MULT_LO_EXPR:
    4325                 :             :     case VEC_WIDEN_MULT_EVEN_EXPR:
    4326                 :             :     case VEC_WIDEN_MULT_ODD_EXPR:
    4327                 :             :     case VEC_UNPACK_HI_EXPR:
    4328                 :             :     case VEC_UNPACK_LO_EXPR:
    4329                 :             :     case VEC_UNPACK_FLOAT_HI_EXPR:
    4330                 :             :     case VEC_UNPACK_FLOAT_LO_EXPR:
    4331                 :             :     case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
    4332                 :             :     case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
    4333                 :             :     case VEC_PACK_TRUNC_EXPR:
    4334                 :             :     case VEC_PACK_SAT_EXPR:
    4335                 :             :     case VEC_PACK_FIX_TRUNC_EXPR:
    4336                 :             :     case VEC_PACK_FLOAT_EXPR:
    4337                 :             :     case VEC_WIDEN_LSHIFT_HI_EXPR:
    4338                 :             :     case VEC_WIDEN_LSHIFT_LO_EXPR:
    4339                 :             :     case VEC_DUPLICATE_EXPR:
    4340                 :             :     case VEC_SERIES_EXPR:
    4341                 :             : 
    4342                 :             :       return 1;
    4343                 :             : 
    4344                 :             :     /* Few special cases of expensive operations.  This is useful
    4345                 :             :        to avoid inlining on functions having too many of these.  */
    4346                 :     2612900 :     case TRUNC_DIV_EXPR:
    4347                 :     2612900 :     case CEIL_DIV_EXPR:
    4348                 :     2612900 :     case FLOOR_DIV_EXPR:
    4349                 :     2612900 :     case ROUND_DIV_EXPR:
    4350                 :     2612900 :     case EXACT_DIV_EXPR:
    4351                 :     2612900 :     case TRUNC_MOD_EXPR:
    4352                 :     2612900 :     case CEIL_MOD_EXPR:
    4353                 :     2612900 :     case FLOOR_MOD_EXPR:
    4354                 :     2612900 :     case ROUND_MOD_EXPR:
    4355                 :     2612900 :     case RDIV_EXPR:
    4356                 :     2612900 :       if (TREE_CODE (op2) != INTEGER_CST)
    4357                 :     1166277 :         return weights->div_mod_cost;
    4358                 :             :       return 1;
    4359                 :             : 
    4360                 :             :     /* Bit-field insertion needs several shift and mask operations.  */
    4361                 :             :     case BIT_INSERT_EXPR:
    4362                 :             :       return 3;
    4363                 :             : 
    4364                 :   170363459 :     default:
    4365                 :             :       /* We expect a copy assignment with no operator.  */
    4366                 :   170363459 :       gcc_assert (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS);
    4367                 :             :       return 0;
    4368                 :             :     }
    4369                 :             : }
    4370                 :             : 
    4371                 :             : 
    4372                 :             : /* Estimate number of instructions that will be created by expanding
    4373                 :             :    the statements in the statement sequence STMTS.
    4374                 :             :    WEIGHTS contains weights attributed to various constructs.  */
    4375                 :             : 
    4376                 :             : int
    4377                 :      222417 : estimate_num_insns_seq (gimple_seq stmts, eni_weights *weights)
    4378                 :             : {
    4379                 :      222417 :   int cost;
    4380                 :      222417 :   gimple_stmt_iterator gsi;
    4381                 :             : 
    4382                 :      222417 :   cost = 0;
    4383                 :      569245 :   for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
    4384                 :      346828 :     cost += estimate_num_insns (gsi_stmt (gsi), weights);
    4385                 :             : 
    4386                 :      222417 :   return cost;
    4387                 :             : }
    4388                 :             : 
    4389                 :             : 
    4390                 :             : /* Estimate number of instructions that will be created by expanding STMT.
    4391                 :             :    WEIGHTS contains weights attributed to various constructs.  */
    4392                 :             : 
    4393                 :             : int
    4394                 :   550819809 : estimate_num_insns (gimple *stmt, eni_weights *weights)
    4395                 :             : {
    4396                 :   550819809 :   unsigned cost, i;
    4397                 :   550819809 :   enum gimple_code code = gimple_code (stmt);
    4398                 :   550819809 :   tree lhs;
    4399                 :   550819809 :   tree rhs;
    4400                 :             : 
    4401                 :   550819809 :   switch (code)
    4402                 :             :     {
    4403                 :   313729311 :     case GIMPLE_ASSIGN:
    4404                 :             :       /* Try to estimate the cost of assignments.  We have three cases to
    4405                 :             :          deal with:
    4406                 :             :          1) Simple assignments to registers;
    4407                 :             :          2) Stores to things that must live in memory.  This includes
    4408                 :             :             "normal" stores to scalars, but also assignments of large
    4409                 :             :             structures, or constructors of big arrays;
    4410                 :             : 
    4411                 :             :          Let us look at the first two cases, assuming we have "a = b + C":
    4412                 :             :          <GIMPLE_ASSIGN <var_decl "a">
    4413                 :             :                 <plus_expr <var_decl "b"> <constant C>>
    4414                 :             :          If "a" is a GIMPLE register, the assignment to it is free on almost
    4415                 :             :          any target, because "a" usually ends up in a real register.  Hence
    4416                 :             :          the only cost of this expression comes from the PLUS_EXPR, and we
    4417                 :             :          can ignore the GIMPLE_ASSIGN.
    4418                 :             :          If "a" is not a GIMPLE register, the assignment to "a" will most
    4419                 :             :          likely be a real store, so the cost of the GIMPLE_ASSIGN is the cost
    4420                 :             :          of moving something into "a", which we compute using the function
    4421                 :             :          estimate_move_cost.  */
    4422                 :   313729311 :       if (gimple_clobber_p (stmt))
    4423                 :             :         return 0;       /* ={v} {CLOBBER} stmt expands to nothing.  */
    4424                 :             : 
    4425                 :   296267007 :       lhs = gimple_assign_lhs (stmt);
    4426                 :   296267007 :       rhs = gimple_assign_rhs1 (stmt);
    4427                 :             : 
    4428                 :   296267007 :       cost = 0;
    4429                 :             : 
    4430                 :             :       /* Account for the cost of moving to / from memory.  */
    4431                 :   296267007 :       if (gimple_store_p (stmt))
    4432                 :    68893899 :         cost += estimate_move_cost (TREE_TYPE (lhs), weights->time_based);
    4433                 :   296267007 :       if (gimple_assign_load_p (stmt))
    4434                 :    80545489 :         cost += estimate_move_cost (TREE_TYPE (rhs), weights->time_based);
    4435                 :             : 
    4436                 :   385205471 :       cost += estimate_operator_cost (gimple_assign_rhs_code (stmt), weights,
    4437                 :             :                                       gimple_assign_rhs1 (stmt),
    4438                 :   296267007 :                                       get_gimple_rhs_class (gimple_assign_rhs_code (stmt))
    4439                 :             :                                       == GIMPLE_BINARY_RHS
    4440                 :    88938464 :                                       ? gimple_assign_rhs2 (stmt) : NULL);
    4441                 :   296267007 :       break;
    4442                 :             : 
    4443                 :   104755432 :     case GIMPLE_COND:
    4444                 :   104755432 :       cost = 1 + estimate_operator_cost (gimple_cond_code (stmt), weights,
    4445                 :             :                                          gimple_op (stmt, 0),
    4446                 :             :                                          gimple_op (stmt, 1));
    4447                 :   104755432 :       break;
    4448                 :             : 
    4449                 :      734064 :     case GIMPLE_SWITCH:
    4450                 :      734064 :       {
    4451                 :      734064 :         gswitch *switch_stmt = as_a <gswitch *> (stmt);
    4452                 :             :         /* Take into account cost of the switch + guess 2 conditional jumps for
    4453                 :             :            each case label.
    4454                 :             : 
    4455                 :             :            TODO: once the switch expansion logic is sufficiently separated, we can
    4456                 :             :            do better job on estimating cost of the switch.  */
    4457                 :      734064 :         if (weights->time_based)
    4458                 :      242064 :           cost = floor_log2 (gimple_switch_num_labels (switch_stmt)) * 2;
    4459                 :             :         else
    4460                 :      613032 :           cost = gimple_switch_num_labels (switch_stmt) * 2;
    4461                 :             :       }
    4462                 :             :       break;
    4463                 :             : 
    4464                 :    64408295 :     case GIMPLE_CALL:
    4465                 :    64408295 :       {
    4466                 :    64408295 :         tree decl;
    4467                 :             : 
    4468                 :    64408295 :         if (gimple_call_internal_p (stmt))
    4469                 :             :           return 0;
    4470                 :    62283242 :         else if ((decl = gimple_call_fndecl (stmt))
    4471                 :    62283242 :                  && fndecl_built_in_p (decl))
    4472                 :             :           {
    4473                 :             :             /* Do not special case builtins where we see the body.
    4474                 :             :                This just confuse inliner.  */
    4475                 :    15350858 :             struct cgraph_node *node;
    4476                 :    15350858 :             if ((node = cgraph_node::get (decl))
    4477                 :    15350858 :                 && node->definition)
    4478                 :             :               ;
    4479                 :             :             /* For buitins that are likely expanded to nothing or
    4480                 :             :                inlined do not account operand costs.  */
    4481                 :    15321068 :             else if (is_simple_builtin (decl))
    4482                 :             :               return 0;
    4483                 :    13726273 :             else if (is_inexpensive_builtin (decl))
    4484                 :     1817912 :               return weights->target_builtin_call_cost;
    4485                 :    11908361 :             else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
    4486                 :             :               {
    4487                 :             :                 /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so
    4488                 :             :                    specialize the cheap expansion we do here.
    4489                 :             :                    ???  This asks for a more general solution.  */
    4490                 :    11692974 :                 switch (DECL_FUNCTION_CODE (decl))
    4491                 :             :                   {
    4492                 :        8849 :                     case BUILT_IN_POW:
    4493                 :        8849 :                     case BUILT_IN_POWF:
    4494                 :        8849 :                     case BUILT_IN_POWL:
    4495                 :        8849 :                       if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST
    4496                 :       12572 :                           && (real_equal
    4497                 :        3723 :                               (&TREE_REAL_CST (gimple_call_arg (stmt, 1)),
    4498                 :             :                                &dconst2)))
    4499                 :         444 :                         return estimate_operator_cost
    4500                 :         444 :                             (MULT_EXPR, weights, gimple_call_arg (stmt, 0),
    4501                 :         444 :                              gimple_call_arg (stmt, 0));
    4502                 :             :                       break;
    4503                 :             : 
    4504                 :             :                     default:
    4505                 :             :                       break;
    4506                 :             :                   }
    4507                 :             :               }
    4508                 :             :           }
    4509                 :             : 
    4510                 :    58870091 :         cost = decl ? weights->call_cost : weights->indirect_call_cost;
    4511                 :    58870091 :         if (gimple_call_lhs (stmt))
    4512                 :    23073070 :           cost += estimate_move_cost (TREE_TYPE (gimple_call_lhs (stmt)),
    4513                 :    23073070 :                                       weights->time_based);
    4514                 :   176710689 :         for (i = 0; i < gimple_call_num_args (stmt); i++)
    4515                 :             :           {
    4516                 :   117840598 :             tree arg = gimple_call_arg (stmt, i);
    4517                 :   117840598 :             cost += estimate_move_cost (TREE_TYPE (arg),
    4518                 :   117840598 :                                         weights->time_based);
    4519                 :             :           }
    4520                 :             :         break;
    4521                 :             :       }
    4522                 :             : 
    4523                 :    16443374 :     case GIMPLE_RETURN:
    4524                 :    16443374 :       return weights->return_cost;
    4525                 :             : 
    4526                 :             :     case GIMPLE_GOTO:
    4527                 :             :     case GIMPLE_LABEL:
    4528                 :             :     case GIMPLE_NOP:
    4529                 :             :     case GIMPLE_PHI:
    4530                 :             :     case GIMPLE_PREDICT:
    4531                 :             :     case GIMPLE_DEBUG:
    4532                 :             :       return 0;
    4533                 :             : 
    4534                 :      814334 :     case GIMPLE_ASM:
    4535                 :      814334 :       {
    4536                 :      814334 :         int count = asm_str_count (gimple_asm_string (as_a <gasm *> (stmt)));
    4537                 :             :         /* 1000 means infinity. This avoids overflows later
    4538                 :             :            with very long asm statements.  */
    4539                 :      814334 :         if (count > 1000)
    4540                 :             :           count = 1000;
    4541                 :             :         /* If this asm is asm inline, count anything as minimum size.  */
    4542                 :      814334 :         if (gimple_asm_inline_p (as_a <gasm *> (stmt)))
    4543                 :         520 :           count = MIN (1, count);
    4544                 :      814334 :         return MAX (1, count);
    4545                 :             :       }
    4546                 :             : 
    4547                 :             :     case GIMPLE_RESX:
    4548                 :             :       /* This is either going to be an external function call with one
    4549                 :             :          argument, or two register copy statements plus a goto.  */
    4550                 :             :       return 2;
    4551                 :             : 
    4552                 :      240800 :     case GIMPLE_EH_DISPATCH:
    4553                 :             :       /* ??? This is going to turn into a switch statement.  Ideally
    4554                 :             :          we'd have a look at the eh region and estimate the number of
    4555                 :             :          edges involved.  */
    4556                 :      240800 :       return 10;
    4557                 :             : 
    4558                 :           0 :     case GIMPLE_BIND:
    4559                 :           0 :       return estimate_num_insns_seq (
    4560                 :           0 :                gimple_bind_body (as_a <gbind *> (stmt)),
    4561                 :           0 :                weights);
    4562                 :             : 
    4563                 :           0 :     case GIMPLE_EH_FILTER:
    4564                 :           0 :       return estimate_num_insns_seq (gimple_eh_filter_failure (stmt), weights);
    4565                 :             : 
    4566                 :        8292 :     case GIMPLE_CATCH:
    4567                 :        8292 :       return estimate_num_insns_seq (gimple_catch_handler (
    4568                 :        8292 :                                        as_a <gcatch *> (stmt)),
    4569                 :        8292 :                                      weights);
    4570                 :             : 
    4571                 :        8297 :     case GIMPLE_TRY:
    4572                 :        8297 :       return (estimate_num_insns_seq (gimple_try_eval (stmt), weights)
    4573                 :        8297 :               + estimate_num_insns_seq (gimple_try_cleanup (stmt), weights));
    4574                 :             : 
    4575                 :             :     /* OMP directives are generally very expensive.  */
    4576                 :             : 
    4577                 :             :     case GIMPLE_OMP_RETURN:
    4578                 :             :     case GIMPLE_OMP_SECTIONS_SWITCH:
    4579                 :             :     case GIMPLE_OMP_ATOMIC_STORE:
    4580                 :             :     case GIMPLE_OMP_CONTINUE:
    4581                 :             :       /* ...except these, which are cheap.  */
    4582                 :             :       return 0;
    4583                 :             : 
    4584                 :           0 :     case GIMPLE_OMP_ATOMIC_LOAD:
    4585                 :           0 :       return weights->omp_cost;
    4586                 :             : 
    4587                 :           0 :     case GIMPLE_OMP_FOR:
    4588                 :           0 :       return (weights->omp_cost
    4589                 :           0 :               + estimate_num_insns_seq (gimple_omp_body (stmt), weights)
    4590                 :           0 :               + estimate_num_insns_seq (gimple_omp_for_pre_body (stmt), weights));
    4591                 :             : 
    4592                 :           0 :     case GIMPLE_OMP_PARALLEL:
    4593                 :           0 :     case GIMPLE_OMP_TASK:
    4594                 :           0 :     case GIMPLE_OMP_CRITICAL:
    4595                 :           0 :     case GIMPLE_OMP_MASTER:
    4596                 :           0 :     case GIMPLE_OMP_MASKED:
    4597                 :           0 :     case GIMPLE_OMP_SCOPE:
    4598                 :           0 :     case GIMPLE_OMP_TASKGROUP:
    4599                 :           0 :     case GIMPLE_OMP_ORDERED:
    4600                 :           0 :     case GIMPLE_OMP_SCAN:
    4601                 :           0 :     case GIMPLE_OMP_SECTION:
    4602                 :           0 :     case GIMPLE_OMP_SECTIONS:
    4603                 :           0 :     case GIMPLE_OMP_STRUCTURED_BLOCK:
    4604                 :           0 :     case GIMPLE_OMP_SINGLE:
    4605                 :           0 :     case GIMPLE_OMP_TARGET:
    4606                 :           0 :     case GIMPLE_OMP_TEAMS:
    4607                 :           0 :       return (weights->omp_cost
    4608                 :           0 :               + estimate_num_insns_seq (gimple_omp_body (stmt), weights));
    4609                 :             : 
    4610                 :        2133 :     case GIMPLE_TRANSACTION:
    4611                 :        2133 :       return (weights->tm_cost
    4612                 :        2133 :               + estimate_num_insns_seq (gimple_transaction_body (
    4613                 :        2133 :                                           as_a <gtransaction *> (stmt)),
    4614                 :        2133 :                                         weights));
    4615                 :             : 
    4616                 :           0 :     default:
    4617                 :           0 :       gcc_unreachable ();
    4618                 :             :     }
    4619                 :             : 
    4620                 :   460626594 :   return cost;
    4621                 :             : }
    4622                 :             : 
    4623                 :             : /* Estimate number of instructions that will be created by expanding
    4624                 :             :    function FNDECL.  WEIGHTS contains weights attributed to various
    4625                 :             :    constructs.  */
    4626                 :             : 
    4627                 :             : int
    4628                 :           0 : estimate_num_insns_fn (tree fndecl, eni_weights *weights)
    4629                 :             : {
    4630                 :           0 :   struct function *my_function = DECL_STRUCT_FUNCTION (fndecl);
    4631                 :           0 :   gimple_stmt_iterator bsi;
    4632                 :           0 :   basic_block bb;
    4633                 :           0 :   int n = 0;
    4634                 :             : 
    4635                 :           0 :   gcc_assert (my_function && my_function->cfg);
    4636                 :           0 :   FOR_EACH_BB_FN (bb, my_function)
    4637                 :             :     {
    4638                 :           0 :       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
    4639                 :           0 :         n += estimate_num_insns (gsi_stmt (bsi), weights);
    4640                 :             :     }
    4641                 :             : 
    4642                 :           0 :   return n;
    4643                 :             : }
    4644                 :             : 
    4645                 :             : 
    4646                 :             : /* Initializes weights used by estimate_num_insns.  */
    4647                 :             : 
    4648                 :             : void
    4649                 :      275833 : init_inline_once (void)
    4650                 :             : {
    4651                 :      275833 :   eni_size_weights.call_cost = 1;
    4652                 :      275833 :   eni_size_weights.indirect_call_cost = 3;
    4653                 :      275833 :   eni_size_weights.target_builtin_call_cost = 1;
    4654                 :      275833 :   eni_size_weights.div_mod_cost = 1;
    4655                 :      275833 :   eni_size_weights.omp_cost = 40;
    4656                 :      275833 :   eni_size_weights.tm_cost = 10;
    4657                 :      275833 :   eni_size_weights.time_based = false;
    4658                 :      275833 :   eni_size_weights.return_cost = 1;
    4659                 :             : 
    4660                 :             :   /* Estimating time for call is difficult, since we have no idea what the
    4661                 :             :      called function does.  In the current uses of eni_time_weights,
    4662                 :             :      underestimating the cost does less harm than overestimating it, so
    4663                 :             :      we choose a rather small value here.  */
    4664                 :      275833 :   eni_time_weights.call_cost = 10;
    4665                 :      275833 :   eni_time_weights.indirect_call_cost = 15;
    4666                 :      275833 :   eni_time_weights.target_builtin_call_cost = 1;
    4667                 :      275833 :   eni_time_weights.div_mod_cost = 10;
    4668                 :      275833 :   eni_time_weights.omp_cost = 40;
    4669                 :      275833 :   eni_time_weights.tm_cost = 40;
    4670                 :      275833 :   eni_time_weights.time_based = true;
    4671                 :      275833 :   eni_time_weights.return_cost = 2;
    4672                 :      275833 : }
    4673                 :             : 
    4674                 :             : 
    4675                 :             : /* Install new lexical TREE_BLOCK underneath 'current_block'.  */
    4676                 :             : 
    4677                 :             : static void
    4678                 :    22844919 : prepend_lexical_block (tree current_block, tree new_block)
    4679                 :             : {
    4680                 :    22844919 :   BLOCK_CHAIN (new_block) = BLOCK_SUBBLOCKS (current_block);
    4681                 :    22844919 :   BLOCK_SUBBLOCKS (current_block) = new_block;
    4682                 :    22844919 :   BLOCK_SUPERCONTEXT (new_block) = current_block;
    4683                 :    22844919 : }
    4684                 :             : 
    4685                 :             : /* Add local variables from CALLEE to CALLER.  */
    4686                 :             : 
    4687                 :             : static inline void
    4688                 :     3785841 : add_local_variables (struct function *callee, struct function *caller,
    4689                 :             :                      copy_body_data *id)
    4690                 :             : {
    4691                 :     3785841 :   tree var;
    4692                 :     3785841 :   unsigned ix;
    4693                 :             : 
    4694                 :    10620269 :   FOR_EACH_LOCAL_DECL (callee, ix, var)
    4695                 :     3627368 :     if (!can_be_nonlocal (var, id))
    4696                 :             :       {
    4697                 :     3555218 :         tree new_var = remap_decl (var, id);
    4698                 :             : 
    4699                 :             :         /* Remap debug-expressions.  */
    4700                 :     3555218 :         if (VAR_P (new_var)
    4701                 :     3555218 :             && DECL_HAS_DEBUG_EXPR_P (var)
    4702                 :     3793420 :             && new_var != var)
    4703                 :             :           {
    4704                 :      238202 :             tree tem = DECL_DEBUG_EXPR (var);
    4705                 :      238202 :             bool old_regimplify = id->regimplify;
    4706                 :      238202 :             id->remapping_type_depth++;
    4707                 :      238202 :             walk_tree (&tem, copy_tree_body_r, id, NULL);
    4708                 :      238202 :             id->remapping_type_depth--;
    4709                 :      238202 :             id->regimplify = old_regimplify;
    4710                 :      238202 :             SET_DECL_DEBUG_EXPR (new_var, tem);
    4711                 :      238202 :             DECL_HAS_DEBUG_EXPR_P (new_var) = 1;
    4712                 :             :           }
    4713                 :     3555218 :         add_local_decl (caller, new_var);
    4714                 :             :       }
    4715                 :     3785841 : }
    4716                 :             : 
    4717                 :             : /* Add to BINDINGS a debug stmt resetting SRCVAR if inlining might
    4718                 :             :    have brought in or introduced any debug stmts for SRCVAR.  */
    4719                 :             : 
    4720                 :             : static inline void
    4721                 :     7535680 : reset_debug_binding (copy_body_data *id, tree srcvar, gimple_seq *bindings)
    4722                 :             : {
    4723                 :     7535680 :   tree *remappedvarp = id->decl_map->get (srcvar);
    4724                 :             : 
    4725                 :     7535680 :   if (!remappedvarp)
    4726                 :             :     return;
    4727                 :             : 
    4728                 :     7489987 :   if (!VAR_P (*remappedvarp))
    4729                 :             :     return;
    4730                 :             : 
    4731                 :     7440352 :   if (*remappedvarp == id->retvar)
    4732                 :             :     return;
    4733                 :             : 
    4734                 :     7440352 :   tree tvar = target_for_debug_bind (*remappedvarp);
    4735                 :     7440352 :   if (!tvar)
    4736                 :             :     return;
    4737                 :             : 
    4738                 :    11846782 :   gdebug *stmt = gimple_build_debug_bind (tvar, NULL_TREE,
    4739                 :     5923391 :                                           id->call_stmt);
    4740                 :     5923391 :   gimple_seq_add_stmt (bindings, stmt);
    4741                 :             : }
    4742                 :             : 
    4743                 :             : /* For each inlined variable for which we may have debug bind stmts,
    4744                 :             :    add before GSI a final debug stmt resetting it, marking the end of
    4745                 :             :    its life, so that var-tracking knows it doesn't have to compute
    4746                 :             :    further locations for it.  */
    4747                 :             : 
    4748                 :             : static inline void
    4749                 :     3667217 : reset_debug_bindings (copy_body_data *id, gimple_stmt_iterator gsi)
    4750                 :             : {
    4751                 :     3667217 :   tree var;
    4752                 :     3667217 :   unsigned ix;
    4753                 :     3667217 :   gimple_seq bindings = NULL;
    4754                 :             : 
    4755                 :     3667217 :   if (!gimple_in_ssa_p (id->src_cfun))
    4756                 :      451871 :     return;
    4757                 :             : 
    4758                 :     3667217 :   if (!opt_for_fn (id->dst_fn, flag_var_tracking_assignments))
    4759                 :             :     return;
    4760                 :             : 
    4761                 :     3215346 :   for (var = DECL_ARGUMENTS (id->src_fn);
    4762                 :     8611337 :        var; var = DECL_CHAIN (var))
    4763                 :     5395991 :     reset_debug_binding (id, var, &bindings);
    4764                 :             : 
    4765                 :     8074211 :   FOR_EACH_LOCAL_DECL (id->src_cfun, ix, var)
    4766                 :     2139689 :     reset_debug_binding (id, var, &bindings);
    4767                 :             : 
    4768                 :     3215346 :   gsi_insert_seq_before_without_update (&gsi, bindings, GSI_SAME_STMT);
    4769                 :             : }
    4770                 :             : 
    4771                 :             : /* If STMT is a GIMPLE_CALL, replace it with its inline expansion.  */
    4772                 :             : 
    4773                 :             : static bool
    4774                 :    12760216 : expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id,
    4775                 :             :                     bitmap to_purge)
    4776                 :             : {
    4777                 :    12760216 :   tree use_retvar;
    4778                 :    12760216 :   tree fn;
    4779                 :    12760216 :   hash_map<tree, tree> *dst;
    4780                 :    12760216 :   hash_map<tree, tree> *st = NULL;
    4781                 :    12760216 :   tree return_slot;
    4782                 :    12760216 :   tree modify_dest;
    4783                 :    12760216 :   struct cgraph_edge *cg_edge;
    4784                 :    12760216 :   cgraph_inline_failed_t reason;
    4785                 :    12760216 :   basic_block return_block;
    4786                 :    12760216 :   edge e;
    4787                 :    12760216 :   gimple_stmt_iterator gsi, stmt_gsi;
    4788                 :    12760216 :   bool successfully_inlined = false;
    4789                 :    12760216 :   bool purge_dead_abnormal_edges;
    4790                 :    12760216 :   gcall *call_stmt;
    4791                 :    12760216 :   unsigned int prop_mask, src_properties;
    4792                 :    12760216 :   struct function *dst_cfun;
    4793                 :    12760216 :   tree simduid;
    4794                 :    12760216 :   use_operand_p use;
    4795                 :    12760216 :   gimple *simtenter_stmt = NULL;
    4796                 :    12760216 :   vec<tree> *simtvars_save;
    4797                 :             : 
    4798                 :             :   /* The gimplifier uses input_location in too many places, such as
    4799                 :             :      internal_get_tmp_var ().  */
    4800                 :    12760216 :   location_t saved_location = input_location;
    4801                 :    12760216 :   input_location = gimple_location (stmt);
    4802                 :             : 
    4803                 :             :   /* From here on, we're only interested in CALL_EXPRs.  */
    4804                 :    12760216 :   call_stmt = dyn_cast <gcall *> (stmt);
    4805                 :    12760216 :   if (!call_stmt)
    4806                 :           0 :     goto egress;
    4807                 :             : 
    4808                 :    12760216 :   cg_edge = id->dst_node->get_edge (stmt);
    4809                 :    12760216 :   gcc_checking_assert (cg_edge);
    4810                 :             :   /* First, see if we can figure out what function is being called.
    4811                 :             :      If we cannot, then there is no hope of inlining the function.  */
    4812                 :    12760216 :   if (cg_edge->indirect_unknown_callee)
    4813                 :      229992 :     goto egress;
    4814                 :    12530224 :   fn = cg_edge->callee->decl;
    4815                 :    12530224 :   gcc_checking_assert (fn);
    4816                 :             : 
    4817                 :             :   /* If FN is a declaration of a function in a nested scope that was
    4818                 :             :      globally declared inline, we don't set its DECL_INITIAL.
    4819                 :             :      However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
    4820                 :             :      C++ front-end uses it for cdtors to refer to their internal
    4821                 :             :      declarations, that are not real functions.  Fortunately those
    4822                 :             :      don't have trees to be saved, so we can tell by checking their
    4823                 :             :      gimple_body.  */
    4824                 :    12530224 :   if (!DECL_INITIAL (fn)
    4825                 :     5653126 :       && DECL_ABSTRACT_ORIGIN (fn)
    4826                 :    12678718 :       && gimple_has_body_p (DECL_ABSTRACT_ORIGIN (fn)))
    4827                 :         280 :     fn = DECL_ABSTRACT_ORIGIN (fn);
    4828                 :             : 
    4829                 :             :   /* Don't try to inline functions that are not well-suited to inlining.  */
    4830                 :    12530224 :   if (cg_edge->inline_failed)
    4831                 :             :     {
    4832                 :     8862650 :       reason = cg_edge->inline_failed;
    4833                 :             :       /* If this call was originally indirect, we do not want to emit any
    4834                 :             :          inlining related warnings or sorry messages because there are no
    4835                 :             :          guarantees regarding those.  */
    4836                 :     8862650 :       if (cg_edge->indirect_inlining_edge)
    4837                 :        1309 :         goto egress;
    4838                 :             : 
    4839                 :     8861341 :       if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn))
    4840                 :             :           /* For extern inline functions that get redefined we always
    4841                 :             :              silently ignored always_inline flag. Better behavior would
    4842                 :             :              be to be able to keep both bodies and use extern inline body
    4843                 :             :              for inlining, but we can't do that because frontends overwrite
    4844                 :             :              the body.  */
    4845                 :          53 :           && !cg_edge->callee->redefined_extern_inline
    4846                 :             :           /* During early inline pass, report only when optimization is
    4847                 :             :              not turned on.  */
    4848                 :          53 :           && (symtab->global_info_ready
    4849                 :          51 :               || !optimize
    4850                 :          42 :               || cgraph_inline_failed_type (reason) == CIF_FINAL_ERROR)
    4851                 :             :           /* PR 20090218-1_0.c. Body can be provided by another module. */
    4852                 :     8861374 :           && (reason != CIF_BODY_NOT_AVAILABLE || !flag_generate_lto))
    4853                 :             :         {
    4854                 :          26 :           error ("inlining failed in call to %<always_inline%> %q+F: %s", fn,
    4855                 :             :                  cgraph_inline_failed_string (reason));
    4856                 :          26 :           if (gimple_location (stmt) != UNKNOWN_LOCATION)
    4857                 :          26 :             inform (gimple_location (stmt), "called from here");
    4858                 :           0 :           else if (DECL_SOURCE_LOCATION (cfun->decl) != UNKNOWN_LOCATION)
    4859                 :           0 :             inform (DECL_SOURCE_LOCATION (cfun->decl),
    4860                 :             :                    "called from this function");
    4861                 :             :         }
    4862                 :     8861315 :       else if (opt_for_fn (fn, warn_inline)
    4863                 :         269 :                && DECL_DECLARED_INLINE_P (fn)
    4864                 :         127 :                && !DECL_NO_INLINE_WARNING_P (fn)
    4865                 :          35 :                && !DECL_IN_SYSTEM_HEADER (fn)
    4866                 :           9 :                && reason != CIF_UNSPECIFIED
    4867                 :           9 :                && !lookup_attribute ("noinline", DECL_ATTRIBUTES (fn))
    4868                 :             :                /* Do not warn about not inlined recursive calls.  */
    4869                 :           9 :                && !cg_edge->recursive_p ()
    4870                 :             :                /* Avoid warnings during early inline pass. */
    4871                 :     8861324 :                && symtab->global_info_ready)
    4872                 :             :         {
    4873                 :           8 :           auto_diagnostic_group d;
    4874                 :           8 :           if (warning (OPT_Winline, "inlining failed in call to %q+F: %s",
    4875                 :             :                        fn, _(cgraph_inline_failed_string (reason))))
    4876                 :             :             {
    4877                 :           8 :               if (gimple_location (stmt) != UNKNOWN_LOCATION)
    4878                 :           8 :                 inform (gimple_location (stmt), "called from here");
    4879                 :           0 :               else if (DECL_SOURCE_LOCATION (cfun->decl) != UNKNOWN_LOCATION)
    4880                 :           0 :                 inform (DECL_SOURCE_LOCATION (cfun->decl),
    4881                 :             :                        "called from this function");
    4882                 :             :             }
    4883                 :           8 :         }
    4884                 :     8861341 :       goto egress;
    4885                 :             :     }
    4886                 :     3667574 :   id->src_node = cg_edge->callee;
    4887                 :             : 
    4888                 :             :   /* If callee is thunk, all we need is to adjust the THIS pointer
    4889                 :             :      and redirect to function being thunked.  */
    4890                 :     3667574 :   if (id->src_node->thunk)
    4891                 :             :     {
    4892                 :         357 :       cgraph_edge *edge;
    4893                 :         357 :       tree virtual_offset = NULL;
    4894                 :         357 :       profile_count count = cg_edge->count;
    4895                 :         357 :       tree op;
    4896                 :         357 :       gimple_stmt_iterator iter = gsi_for_stmt (stmt);
    4897                 :         357 :       thunk_info *info = thunk_info::get (id->src_node);
    4898                 :             : 
    4899                 :         357 :       cgraph_edge::remove (cg_edge);
    4900                 :         714 :       edge = id->src_node->callees->clone (id->dst_node, call_stmt,
    4901                 :             :                                            gimple_uid (stmt),
    4902                 :             :                                            profile_count::one (),
    4903                 :             :                                            profile_count::one (),
    4904                 :             :                                            true);
    4905                 :         357 :       edge->count = count;
    4906                 :         357 :       if (info->virtual_offset_p)
    4907                 :           9 :         virtual_offset = size_int (info->virtual_value);
    4908                 :         357 :       op = create_tmp_reg_fn (cfun, TREE_TYPE (gimple_call_arg (stmt, 0)),
    4909                 :             :                               NULL);
    4910                 :         357 :       gsi_insert_before (&iter, gimple_build_assign (op,
    4911                 :             :                                                     gimple_call_arg (stmt, 0)),
    4912                 :             :                          GSI_NEW_STMT);
    4913                 :         357 :       gcc_assert (info->this_adjusting);
    4914                 :         357 :       op = thunk_adjust (&iter, op, 1, info->fixed_offset,
    4915                 :             :                          virtual_offset, info->indirect_offset);
    4916                 :             : 
    4917                 :         357 :       gimple_call_set_arg (stmt, 0, op);
    4918                 :         357 :       gimple_call_set_fndecl (stmt, edge->callee->decl);
    4919                 :         357 :       update_stmt (stmt);
    4920                 :         357 :       id->src_node->remove ();
    4921                 :         357 :       successfully_inlined = expand_call_inline (bb, stmt, id, to_purge);
    4922                 :         357 :       maybe_remove_unused_call_args (cfun, stmt);
    4923                 :             :       /* This used to return true even though we do fail to inline in
    4924                 :             :          some cases.  See PR98525.  */
    4925                 :         357 :       goto egress;
    4926                 :             :     }
    4927                 :     3667217 :   fn = cg_edge->callee->decl;
    4928                 :     3667217 :   cg_edge->callee->get_untransformed_body ();
    4929                 :             : 
    4930                 :     3667217 :   if (flag_checking && cg_edge->callee->decl != id->dst_node->decl)
    4931                 :     3667205 :     cg_edge->callee->verify ();
    4932                 :             : 
    4933                 :             :   /* We will be inlining this callee.  */
    4934                 :     3667217 :   id->eh_lp_nr = lookup_stmt_eh_lp (stmt);
    4935                 :             : 
    4936                 :             :   /* Update the callers EH personality.  */
    4937                 :     3667217 :   if (DECL_FUNCTION_PERSONALITY (fn))
    4938                 :      245226 :     DECL_FUNCTION_PERSONALITY (cg_edge->caller->decl)
    4939                 :      122613 :       = DECL_FUNCTION_PERSONALITY (fn);
    4940                 :             : 
    4941                 :             :   /* Split the block before the GIMPLE_CALL.  */
    4942                 :     3667217 :   stmt_gsi = gsi_for_stmt (stmt);
    4943                 :     3667217 :   gsi_prev (&stmt_gsi);
    4944                 :     3667217 :   e = split_block (bb, gsi_end_p (stmt_gsi) ? NULL : gsi_stmt (stmt_gsi));
    4945                 :     3667217 :   bb = e->src;
    4946                 :     3667217 :   return_block = e->dest;
    4947                 :     3667217 :   remove_edge (e);
    4948                 :             : 
    4949                 :             :   /* If the GIMPLE_CALL was in the last statement of BB, it may have
    4950                 :             :      been the source of abnormal edges.  In this case, schedule
    4951                 :             :      the removal of dead abnormal edges.  */
    4952                 :     3667217 :   gsi = gsi_start_bb (return_block);
    4953                 :     3667217 :   gsi_next (&gsi);
    4954                 :     3667217 :   purge_dead_abnormal_edges = gsi_end_p (gsi);
    4955                 :             : 
    4956                 :     3667217 :   stmt_gsi = gsi_start_bb (return_block);
    4957                 :             : 
    4958                 :             :   /* Build a block containing code to initialize the arguments, the
    4959                 :             :      actual inline expansion of the body, and a label for the return
    4960                 :             :      statements within the function to jump to.  The type of the
    4961                 :             :      statement expression is the return type of the function call.
    4962                 :             :      ???  If the call does not have an associated block then we will
    4963                 :             :      remap all callee blocks to NULL, effectively dropping most of
    4964                 :             :      its debug information.  This should only happen for calls to
    4965                 :             :      artificial decls inserted by the compiler itself.  We need to
    4966                 :             :      either link the inlined blocks into the caller block tree or
    4967                 :             :      not refer to them in any way to not break GC for locations.  */
    4968                 :     3667217 :   if (tree block = gimple_block (stmt))
    4969                 :             :     {
    4970                 :             :       /* We do want to assign a not UNKNOWN_LOCATION BLOCK_SOURCE_LOCATION
    4971                 :             :          to make inlined_function_outer_scope_p return true on this BLOCK.  */
    4972                 :     3642126 :       location_t loc = LOCATION_LOCUS (gimple_location (stmt));
    4973                 :     3642126 :       if (loc == UNKNOWN_LOCATION)
    4974                 :      211889 :         loc = LOCATION_LOCUS (DECL_SOURCE_LOCATION (fn));
    4975                 :      211889 :       if (loc == UNKNOWN_LOCATION)
    4976                 :             :         loc = BUILTINS_LOCATION;
    4977                 :     3642126 :       id->block = make_node (BLOCK);
    4978                 :     6226591 :       BLOCK_ABSTRACT_ORIGIN (id->block) = DECL_ORIGIN (fn);
    4979                 :     3642126 :       BLOCK_SOURCE_LOCATION (id->block) = loc;
    4980                 :     3642126 :       prepend_lexical_block (block, id->block);
    4981                 :             :     }
    4982                 :             : 
    4983                 :             :   /* Local declarations will be replaced by their equivalents in this map.  */
    4984                 :     3667217 :   st = id->decl_map;
    4985                 :     3667217 :   id->decl_map = new hash_map<tree, tree>;
    4986                 :     3667217 :   dst = id->debug_map;
    4987                 :     3667217 :   id->debug_map = NULL;
    4988                 :     3667217 :   if (flag_stack_reuse != SR_NONE)
    4989                 :     3661651 :     id->add_clobbers_to_eh_landing_pads = last_basic_block_for_fn (cfun);
    4990                 :             : 
    4991                 :             :   /* Record the function we are about to inline.  */
    4992                 :     3667217 :   id->src_fn = fn;
    4993                 :     3667217 :   id->src_cfun = DECL_STRUCT_FUNCTION (fn);
    4994                 :     3667217 :   id->reset_location = DECL_IGNORED_P (fn);
    4995                 :     3667217 :   id->call_stmt = call_stmt;
    4996                 :     3667217 :   cfun->cfg->full_profile &= id->src_cfun->cfg->full_profile;
    4997                 :             : 
    4998                 :             :   /* When inlining into an OpenMP SIMD-on-SIMT loop, arrange for new automatic
    4999                 :             :      variables to be added to IFN_GOMP_SIMT_ENTER argument list.  */
    5000                 :     3667217 :   dst_cfun = DECL_STRUCT_FUNCTION (id->dst_fn);
    5001                 :     3667217 :   simtvars_save = id->dst_simt_vars;
    5002                 :     3667217 :   if (!(dst_cfun->curr_properties & PROP_gimple_lomp_dev)
    5003                 :       18702 :       && (simduid = bb->loop_father->simduid) != NULL_TREE
    5004                 :           0 :       && (simduid = ssa_default_def (dst_cfun, simduid)) != NULL_TREE
    5005                 :           0 :       && single_imm_use (simduid, &use, &simtenter_stmt)
    5006                 :           0 :       && is_gimple_call (simtenter_stmt)
    5007                 :     3667217 :       && gimple_call_internal_p (simtenter_stmt, IFN_GOMP_SIMT_ENTER))
    5008                 :           0 :     vec_alloc (id->dst_simt_vars, 0);
    5009                 :             :   else
    5010                 :     3667217 :     id->dst_simt_vars = NULL;
    5011                 :             : 
    5012                 :     3667217 :   if (profile_status_for_fn (id->src_cfun) == PROFILE_ABSENT)
    5013                 :       21510 :     profile_status_for_fn (dst_cfun) = PROFILE_ABSENT;
    5014                 :             : 
    5015                 :             :   /* If the src function contains an IFN_VA_ARG, then so will the dst
    5016                 :             :      function after inlining.  Likewise for IFN_GOMP_USE_SIMT.  */
    5017                 :     3667217 :   prop_mask = PROP_gimple_lva | PROP_gimple_lomp_dev;
    5018                 :     3667217 :   src_properties = id->src_cfun->curr_properties & prop_mask;
    5019                 :     3667217 :   if (src_properties != prop_mask)
    5020                 :         929 :     dst_cfun->curr_properties &= src_properties | ~prop_mask;
    5021                 :     3667217 :   dst_cfun->calls_eh_return |= id->src_cfun->calls_eh_return;
    5022                 :     3667217 :   id->dst_node->calls_declare_variant_alt
    5023                 :     3667217 :     |= id->src_node->calls_declare_variant_alt;
    5024                 :             : 
    5025                 :     3667217 :   gcc_assert (!id->src_cfun->after_inlining);
    5026                 :             : 
    5027                 :     3667217 :   id->entry_bb = bb;
    5028                 :     3667217 :   if (lookup_attribute ("cold", DECL_ATTRIBUTES (fn)))
    5029                 :             :     {
    5030                 :          76 :       gimple_stmt_iterator si = gsi_last_bb (bb);
    5031                 :          76 :       gsi_insert_after (&si, gimple_build_predict (PRED_COLD_FUNCTION,
    5032                 :             :                                                    NOT_TAKEN),
    5033                 :             :                         GSI_NEW_STMT);
    5034                 :             :     }
    5035                 :     3667217 :   initialize_inlined_parameters (id, stmt, fn, bb);
    5036                 :     3215364 :   if (debug_nonbind_markers_p && debug_inline_points && id->block
    5037                 :     6869817 :       && inlined_function_outer_scope_p (id->block))
    5038                 :             :     {
    5039                 :     3202600 :       gimple_stmt_iterator si = gsi_last_bb (bb);
    5040                 :     3202600 :       gsi_insert_after (&si, gimple_build_debug_inline_entry
    5041                 :     3202600 :                         (id->block, DECL_SOURCE_LOCATION (id->src_fn)),
    5042                 :             :                         GSI_NEW_STMT);
    5043                 :             :     }
    5044                 :             : 
    5045                 :     3667217 :   if (DECL_INITIAL (fn))
    5046                 :             :     {
    5047                 :     3667217 :       if (gimple_block (stmt))
    5048                 :             :         {
    5049                 :     3642126 :           tree *var;
    5050                 :             : 
    5051                 :     3642126 :           prepend_lexical_block (id->block,
    5052                 :     3642126 :                                  remap_blocks (DECL_INITIAL (fn), id));
    5053                 :     3642126 :           gcc_checking_assert (BLOCK_SUBBLOCKS (id->block)
    5054                 :             :                                && (BLOCK_CHAIN (BLOCK_SUBBLOCKS (id->block))
    5055                 :             :                                    == NULL_TREE));
    5056                 :             :           /* Move vars for PARM_DECLs from DECL_INITIAL block to id->block,
    5057                 :             :              otherwise for DWARF DW_TAG_formal_parameter will not be children of
    5058                 :             :              DW_TAG_inlined_subroutine, but of a DW_TAG_lexical_block
    5059                 :             :              under it.  The parameters can be then evaluated in the debugger,
    5060                 :             :              but don't show in backtraces.  */
    5061                 :     5092537 :           for (var = &BLOCK_VARS (BLOCK_SUBBLOCKS (id->block)); *var; )
    5062                 :     1450411 :             if (TREE_CODE (DECL_ORIGIN (*var)) == PARM_DECL)
    5063                 :             :               {
    5064                 :      399386 :                 tree v = *var;
    5065                 :      399386 :                 *var = TREE_CHAIN (v);
    5066                 :      399386 :                 TREE_CHAIN (v) = BLOCK_VARS (id->block);
    5067                 :      399386 :                 BLOCK_VARS (id->block) = v;
    5068                 :             :               }
    5069                 :             :             else
    5070                 :     1051025 :               var = &TREE_CHAIN (*var);
    5071                 :             :         }
    5072                 :             :       else
    5073                 :       25091 :         remap_blocks_to_null (DECL_INITIAL (fn), id);
    5074                 :             :     }
    5075                 :             : 
    5076                 :             :   /* Return statements in the function body will be replaced by jumps
    5077                 :             :      to the RET_LABEL.  */
    5078                 :     3667217 :   gcc_assert (DECL_INITIAL (fn));
    5079                 :     3667217 :   gcc_assert (TREE_CODE (DECL_INITIAL (fn)) == BLOCK);
    5080                 :             : 
    5081                 :             :   /* Find the LHS to which the result of this call is assigned.  */
    5082                 :     3667217 :   return_slot = NULL;
    5083                 :     3667217 :   if (gimple_call_lhs (stmt))
    5084                 :             :     {
    5085                 :     1798137 :       modify_dest = gimple_call_lhs (stmt);
    5086                 :             : 
    5087                 :             :       /* The function which we are inlining might not return a value,
    5088                 :             :          in which case we should issue a warning that the function
    5089                 :             :          does not return a value.  In that case the optimizers will
    5090                 :             :          see that the variable to which the value is assigned was not
    5091                 :             :          initialized.  We do not want to issue a warning about that
    5092                 :             :          uninitialized variable.  */
    5093                 :     1798137 :       if (DECL_P (modify_dest))
    5094                 :      299637 :         suppress_warning (modify_dest, OPT_Wuninitialized);
    5095                 :             : 
    5096                 :     1798137 :       if (gimple_call_return_slot_opt_p (call_stmt))
    5097                 :             :         {
    5098                 :       89601 :           return_slot = modify_dest;
    5099                 :       89601 :           modify_dest = NULL;
    5100                 :             :         }
    5101                 :             :     }
    5102                 :             :   else
    5103                 :             :     modify_dest = NULL;
    5104                 :             : 
    5105                 :             :   /* If we are inlining a call to the C++ operator new, we don't want
    5106                 :             :      to use type based alias analysis on the return value.  Otherwise
    5107                 :             :      we may get confused if the compiler sees that the inlined new
    5108                 :             :      function returns a pointer which was just deleted.  See bug
    5109                 :             :      33407.  */
    5110                 :     3667217 :   if (DECL_IS_OPERATOR_NEW_P (fn))
    5111                 :             :     {
    5112                 :       16932 :       return_slot = NULL;
    5113                 :       16932 :       modify_dest = NULL;
    5114                 :             :     }
    5115                 :             : 
    5116                 :             :   /* Declare the return variable for the function.  */
    5117                 :     3667217 :   use_retvar = declare_return_variable (id, return_slot, modify_dest, bb);
    5118                 :             : 
    5119                 :             :   /* Add local vars in this inlined callee to caller.  */
    5120                 :     3667217 :   add_local_variables (id->src_cfun, cfun, id);
    5121                 :             : 
    5122                 :     3667217 :   if (dump_enabled_p ())
    5123                 :             :     {
    5124                 :         761 :       char buf[128];
    5125                 :         761 :       snprintf (buf, sizeof(buf), "%4.2f",
    5126                 :         761 :                 cg_edge->sreal_frequency ().to_double ());
    5127                 :         761 :       dump_printf_loc (MSG_NOTE | MSG_PRIORITY_INTERNALS,
    5128                 :             :                        call_stmt,
    5129                 :             :                        "Inlining %C to %C with frequency %s\n",
    5130                 :             :                        id->src_node, id->dst_node, buf);
    5131                 :         761 :       if (dump_file && (dump_flags & TDF_DETAILS))
    5132                 :             :         {
    5133                 :         230 :           id->src_node->dump (dump_file);
    5134                 :         230 :           id->dst_node->dump (dump_file);
    5135                 :             :         }
    5136                 :             :     }
    5137                 :             : 
    5138                 :             :   /* This is it.  Duplicate the callee body.  Assume callee is
    5139                 :             :      pre-gimplified.  Note that we must not alter the caller
    5140                 :             :      function in any way before this point, as this CALL_EXPR may be
    5141                 :             :      a self-referential call; if we're calling ourselves, we need to
    5142                 :             :      duplicate our body before altering anything.  */
    5143                 :     3667217 :   copy_body (id, bb, return_block, NULL);
    5144                 :             : 
    5145                 :     3667217 :   reset_debug_bindings (id, stmt_gsi);
    5146                 :             : 
    5147                 :     3667217 :   if (flag_stack_reuse != SR_NONE)
    5148                 :     9781025 :     for (tree p = DECL_ARGUMENTS (id->src_fn); p; p = DECL_CHAIN (p))
    5149                 :     6119374 :       if (!TREE_THIS_VOLATILE (p))
    5150                 :             :         {
    5151                 :             :           /* The value associated with P is a local temporary only if
    5152                 :             :              there is no value associated with P in the debug map.  */
    5153                 :     6119362 :           tree *varp = id->decl_map->get (p);
    5154                 :     6119362 :           if (varp
    5155                 :     6119362 :               && VAR_P (*varp)
    5156                 :     6060037 :               && !is_gimple_reg (*varp)
    5157                 :     6419211 :               && !(id->debug_map && id->debug_map->get (p)))
    5158                 :             :             {
    5159                 :      299756 :               tree clobber = build_clobber (TREE_TYPE (*varp),
    5160                 :             :                                             CLOBBER_STORAGE_END);
    5161                 :      299756 :               gimple *clobber_stmt;
    5162                 :      299756 :               clobber_stmt = gimple_build_assign (*varp, clobber);
    5163                 :      299756 :               gimple_set_location (clobber_stmt, gimple_location (stmt));
    5164                 :      299756 :               gsi_insert_before (&stmt_gsi, clobber_stmt, GSI_SAME_STMT);
    5165                 :             :             }
    5166                 :             :         }
    5167                 :             : 
    5168                 :             :   /* Reset the escaped solution.  */
    5169                 :     3667217 :   if (cfun->gimple_df)
    5170                 :             :     {
    5171                 :     3667217 :       pt_solution_reset (&cfun->gimple_df->escaped);
    5172                 :     3667217 :       pt_solution_reset (&cfun->gimple_df->escaped_return);
    5173                 :             :     }
    5174                 :             : 
    5175                 :             :   /* Add new automatic variables to IFN_GOMP_SIMT_ENTER arguments.  */
    5176                 :     3667217 :   if (id->dst_simt_vars && id->dst_simt_vars->length () > 0)
    5177                 :             :     {
    5178                 :           0 :       size_t nargs = gimple_call_num_args (simtenter_stmt);
    5179                 :           0 :       vec<tree> *vars = id->dst_simt_vars;
    5180                 :           0 :       auto_vec<tree> newargs (nargs + vars->length ());
    5181                 :           0 :       for (size_t i = 0; i < nargs; i++)
    5182                 :           0 :         newargs.quick_push (gimple_call_arg (simtenter_stmt, i));
    5183                 :           0 :       for (tree *pvar = vars->begin (); pvar != vars->end (); pvar++)
    5184                 :             :         {
    5185                 :           0 :           tree ptrtype = build_pointer_type (TREE_TYPE (*pvar));
    5186                 :           0 :           newargs.quick_push (build1 (ADDR_EXPR, ptrtype, *pvar));
    5187                 :             :         }
    5188                 :           0 :       gcall *g = gimple_build_call_internal_vec (IFN_GOMP_SIMT_ENTER, newargs);
    5189                 :           0 :       gimple_call_set_lhs (g, gimple_call_lhs (simtenter_stmt));
    5190                 :           0 :       gimple_stmt_iterator gsi = gsi_for_stmt (simtenter_stmt);
    5191                 :           0 :       gsi_replace (&gsi, g, false);
    5192                 :           0 :     }
    5193                 :     3667217 :   vec_free (id->dst_simt_vars);
    5194                 :     3667217 :   id->dst_simt_vars = simtvars_save;
    5195                 :             : 
    5196                 :             :   /* Clean up.  */
    5197                 :     3667217 :   if (id->debug_map)
    5198                 :             :     {
    5199                 :       57352 :       delete id->debug_map;
    5200                 :       57352 :       id->debug_map = dst;
    5201                 :             :     }
    5202                 :     7334434 :   delete id->decl_map;
    5203                 :     3667217 :   id->decl_map = st;
    5204                 :             : 
    5205                 :             :   /* Unlink the calls virtual operands before replacing it.  */
    5206                 :     3667217 :   unlink_stmt_vdef (stmt);
    5207                 :     3667217 :   if (gimple_vdef (stmt)
    5208                 :     3667217 :       && TREE_CODE (gimple_vdef (stmt)) == SSA_NAME)
    5209                 :     1707797 :     release_ssa_name (gimple_vdef (stmt));
    5210                 :             : 
    5211                 :             :   /* If the inlined function returns a result that we care about,
    5212                 :             :      substitute the GIMPLE_CALL with an assignment of the return
    5213                 :             :      variable to the LHS of the call.  That is, if STMT was
    5214                 :             :      'a = foo (...)', substitute the call with 'a = USE_RETVAR'.  */
    5215                 :     3667217 :   if (use_retvar && gimple_call_lhs (stmt))
    5216                 :             :     {
    5217                 :     1559780 :       gimple *old_stmt = stmt;
    5218                 :     1559780 :       stmt = gimple_build_assign (gimple_call_lhs (stmt), use_retvar);
    5219                 :     1559780 :       gimple_set_location (stmt, gimple_location (old_stmt));
    5220                 :     1559780 :       gsi_replace (&stmt_gsi, stmt, false);
    5221                 :     1559780 :       maybe_clean_or_replace_eh_stmt (old_stmt, stmt);
    5222                 :             :       /* Append a clobber for id->retvar if easily possible.  */
    5223                 :     1559780 :       if (flag_stack_reuse != SR_NONE
    5224                 :     1557991 :           && id->retvar
    5225                 :     1557991 :           && VAR_P (id->retvar)
    5226                 :     1557991 :           && id->retvar != return_slot
    5227                 :     1557991 :           && id->retvar != modify_dest
    5228                 :     1557991 :           && !TREE_THIS_VOLATILE (id->retvar)
    5229                 :     1557965 :           && !is_gimple_reg (id->retvar)
    5230                 :     1641341 :           && !stmt_ends_bb_p (stmt))
    5231                 :             :         {
    5232                 :       81557 :           tree clobber = build_clobber (TREE_TYPE (id->retvar),
    5233                 :             :                                         CLOBBER_STORAGE_END);
    5234                 :       81557 :           gimple *clobber_stmt;
    5235                 :       81557 :           clobber_stmt = gimple_build_assign (id->retvar, clobber);
    5236                 :       81557 :           gimple_set_location (clobber_stmt, gimple_location (old_stmt));
    5237                 :       81557 :           gsi_insert_after (&stmt_gsi, clobber_stmt, GSI_SAME_STMT);
    5238                 :             :         }
    5239                 :             :     }
    5240                 :             :   else
    5241                 :             :     {
    5242                 :             :       /* Handle the case of inlining a function with no return
    5243                 :             :          statement, which causes the return value to become undefined.  */
    5244                 :     2107437 :       if (gimple_call_lhs (stmt)
    5245                 :     2107437 :           && TREE_CODE (gimple_call_lhs (stmt)) == SSA_NAME)
    5246                 :             :         {
    5247                 :          21 :           tree name = gimple_call_lhs (stmt);
    5248                 :          21 :           tree var = SSA_NAME_VAR (name);
    5249                 :           6 :           tree def = var ? ssa_default_def (cfun, var) : NULL;
    5250                 :             : 
    5251                 :           6 :           if (def)
    5252                 :             :             {
    5253                 :             :               /* If the variable is used undefined, make this name
    5254                 :             :                  undefined via a move.  */
    5255                 :           0 :               stmt = gimple_build_assign (gimple_call_lhs (stmt), def);
    5256                 :           0 :               gsi_replace (&stmt_gsi, stmt, true);
    5257                 :             :             }
    5258                 :             :           else
    5259                 :             :             {
    5260                 :          21 :               if (!var)
    5261                 :             :                 {
    5262                 :          15 :                   var = create_tmp_reg_fn (cfun, TREE_TYPE (name), NULL);
    5263                 :          30 :                   SET_SSA_NAME_VAR_OR_IDENTIFIER (name, var);
    5264                 :             :                 }
    5265                 :             :               /* Otherwise make this variable undefined.  */
    5266                 :          21 :               gsi_remove (&stmt_gsi, true);
    5267                 :          21 :               set_ssa_default_def (cfun, var, name);
    5268                 :          21 :               SSA_NAME_DEF_STMT (name) = gimple_build_nop ();
    5269                 :             :             }
    5270                 :             :         }
    5271                 :             :       /* Replace with a clobber for id->retvar.  */
    5272                 :     2107416 :       else if (flag_stack_reuse != SR_NONE
    5273                 :     2103639 :                && id->retvar
    5274                 :      350670 :                && VAR_P (id->retvar)
    5275                 :      298320 :                && id->retvar != return_slot
    5276                 :      260183 :                && id->retvar != modify_dest
    5277                 :      112632 :                && !TREE_THIS_VOLATILE (id->retvar)
    5278                 :     2220048 :                && !is_gimple_reg (id->retvar))
    5279                 :             :         {
    5280                 :       12276 :           tree clobber = build_clobber (TREE_TYPE (id->retvar));
    5281                 :       12276 :           gimple *clobber_stmt;
    5282                 :       12276 :           clobber_stmt = gimple_build_assign (id->retvar, clobber);
    5283                 :       12276 :           gimple_set_location (clobber_stmt, gimple_location (stmt));
    5284                 :       12276 :           gsi_replace (&stmt_gsi, clobber_stmt, false);
    5285                 :       12276 :           maybe_clean_or_replace_eh_stmt (stmt, clobber_stmt);
    5286                 :             :         }
    5287                 :             :       else
    5288                 :     2095140 :         gsi_remove (&stmt_gsi, true);
    5289                 :             :     }
    5290                 :             : 
    5291                 :     3667217 :   if (purge_dead_abnormal_edges)
    5292                 :      869517 :     bitmap_set_bit (to_purge, return_block->index);
    5293                 :             : 
    5294                 :             :   /* If the value of the new expression is ignored, that's OK.  We
    5295                 :             :      don't warn about this for CALL_EXPRs, so we shouldn't warn about
    5296                 :             :      the equivalent inlined version either.  */
    5297                 :     3667217 :   if (is_gimple_assign (stmt))
    5298                 :             :     {
    5299                 :     1559780 :       gcc_assert (gimple_assign_single_p (stmt)
    5300                 :             :                   || CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)));
    5301                 :     1559780 :       TREE_USED (gimple_assign_rhs1 (stmt)) = 1;
    5302                 :             :     }
    5303                 :             : 
    5304                 :     3667217 :   id->add_clobbers_to_eh_landing_pads = 0;
    5305                 :             : 
    5306                 :             :   /* Output the inlining info for this abstract function, since it has been
    5307                 :             :      inlined.  If we don't do this now, we can lose the information about the
    5308                 :             :      variables in the function when the blocks get blown away as soon as we
    5309                 :             :      remove the cgraph node.  */
    5310                 :     3667217 :   if (gimple_block (stmt))
    5311                 :     3642126 :     (*debug_hooks->outlining_inline_function) (fn);
    5312                 :             : 
    5313                 :             :   /* Update callgraph if needed.  */
    5314                 :     3667217 :   cg_edge->callee->remove ();
    5315                 :             : 
    5316                 :     3667217 :   id->block = NULL_TREE;
    5317                 :     3667217 :   id->retvar = NULL_TREE;
    5318                 :     3667217 :   successfully_inlined = true;
    5319                 :             : 
    5320                 :    12760216 :  egress:
    5321                 :    12760216 :   input_location = saved_location;
    5322                 :    12760216 :   return successfully_inlined;
    5323                 :             : }
    5324                 :             : 
    5325                 :             : /* Expand call statements reachable from STMT_P.
    5326                 :             :    We can only have CALL_EXPRs as the "toplevel" tree code or nested
    5327                 :             :    in a MODIFY_EXPR.  */
    5328                 :             : 
    5329                 :             : static bool
    5330                 :    25773425 : gimple_expand_calls_inline (basic_block bb, copy_body_data *id,
    5331                 :             :                             bitmap to_purge)
    5332                 :             : {
    5333                 :    25773425 :   gimple_stmt_iterator gsi;
    5334                 :    25773425 :   bool inlined = false;
    5335                 :             : 
    5336                 :   184355084 :   for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);)
    5337                 :             :     {
    5338                 :   132808234 :       gimple *stmt = gsi_stmt (gsi);
    5339                 :   132808234 :       gsi_prev (&gsi);
    5340                 :             : 
    5341                 :   132808234 :       if (is_gimple_call (stmt)
    5342                 :   132808234 :           && !gimple_call_internal_p (stmt))
    5343                 :    12759859 :         inlined |= expand_call_inline (bb, stmt, id, to_purge);
    5344                 :             :     }
    5345                 :             : 
    5346                 :    25773425 :   return inlined;
    5347                 :             : }
    5348                 :             : 
    5349                 :             : 
    5350                 :             : /* Walk all basic blocks created after FIRST and try to fold every statement
    5351                 :             :    in the STATEMENTS pointer set.  */
    5352                 :             : 
    5353                 :             : static void
    5354                 :     1339646 : fold_marked_statements (int first, hash_set<gimple *> *statements)
    5355                 :             : {
    5356                 :     1339646 :   auto_bitmap to_purge;
    5357                 :             : 
    5358                 :     1339646 :   auto_vec<edge, 20> stack (n_basic_blocks_for_fn (cfun) + 2);
    5359                 :     1339646 :   auto_sbitmap visited (last_basic_block_for_fn (cfun));
    5360                 :     1339646 :   bitmap_clear (visited);
    5361                 :             : 
    5362                 :     1339646 :   stack.quick_push (single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
    5363                 :    31192792 :   while (!stack.is_empty ())
    5364                 :             :     {
    5365                 :             :       /* Look at the edge on the top of the stack.  */
    5366                 :    29853146 :       edge e = stack.pop ();
    5367                 :    29853146 :       basic_block dest = e->dest;
    5368                 :             : 
    5369                 :    36923269 :       if (dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
    5370                 :    28538500 :           || bitmap_bit_p (visited, dest->index))
    5371                 :     7070123 :         continue;
    5372                 :             : 
    5373                 :    22783023 :       bitmap_set_bit (visited, dest->index);
    5374                 :             : 
    5375                 :    22783023 :       if (dest->index >= first)
    5376                 :    29076172 :         for (gimple_stmt_iterator gsi = gsi_start_bb (dest);
    5377                 :    94866221 :              !gsi_end_p (gsi); gsi_next (&gsi))
    5378                 :             :           {
    5379                 :    80328135 :             if (!statements->contains (gsi_stmt (gsi)))
    5380                 :    18863632 :               continue;
    5381                 :             : 
    5382                 :    61464503 :             gimple *old_stmt = gsi_stmt (gsi);
    5383                 :    61464503 :             tree old_decl = (is_gimple_call (old_stmt)
    5384                 :    61464503 :                              ? gimple_call_fndecl (old_stmt) : 0);
    5385                 :     2989395 :             if (old_decl && fndecl_built_in_p (old_decl))
    5386                 :             :               {
    5387                 :             :                 /* Folding builtins can create multiple instructions,
    5388                 :             :                    we need to look at all of them.  */
    5389                 :      922097 :                 gimple_stmt_iterator i2 = gsi;
    5390                 :      922097 :                 gsi_prev (&i2);
    5391                 :      922097 :                 if (fold_stmt (&gsi))
    5392                 :             :                   {
    5393                 :       96196 :                     gimple *new_stmt;
    5394                 :             :                     /* If a builtin at the end of a bb folded into nothing,
    5395                 :             :                        the following loop won't work.  */
    5396                 :       96196 :                     if (gsi_end_p (gsi))
    5397                 :             :                       {
    5398                 :           0 :                         cgraph_update_edges_for_call_stmt (old_stmt,
    5399                 :             :                                                            old_decl, NULL);
    5400                 :           0 :                         break;
    5401                 :             :                       }
    5402                 :       96196 :                     if (gsi_end_p (i2))
    5403                 :      127650 :                       i2 = gsi_start_bb (dest);
    5404                 :             :                     else
    5405                 :       32371 :                       gsi_next (&i2);
    5406                 :         399 :                     while (1)
    5407                 :             :                       {
    5408                 :       96595 :                         new_stmt = gsi_stmt (i2);
    5409                 :       96595 :                         update_stmt (new_stmt);
    5410                 :       96595 :                         cgraph_update_edges_for_call_stmt (old_stmt, old_decl,
    5411                 :             :                                                            new_stmt);
    5412                 :             : 
    5413                 :       96595 :                         if (new_stmt == gsi_stmt (gsi))
    5414                 :             :                           {
    5415                 :             :                             /* It is okay to check only for the very last
    5416                 :             :                                of these statements.  If it is a throwing
    5417                 :             :                                statement nothing will change.  If it isn't
    5418                 :             :                                this can remove EH edges.  If that weren't
    5419                 :             :                                correct then because some intermediate stmts
    5420                 :             :                                throw, but not the last one.  That would mean
    5421                 :             :                                we'd have to split the block, which we can't
    5422                 :             :                                here and we'd loose anyway.  And as builtins
    5423                 :             :                                probably never throw, this all
    5424                 :             :                                is mood anyway.  */
    5425                 :       96196 :                             if (maybe_clean_or_replace_eh_stmt (old_stmt,
    5426                 :             :                                                                 new_stmt))
    5427                 :           7 :                               bitmap_set_bit (to_purge, dest->index);
    5428                 :             :                             break;
    5429                 :             :                           }
    5430                 :         399 :                         gsi_next (&i2);
    5431                 :             :                       }
    5432                 :             :                   }
    5433                 :             :               }
    5434                 :    60542406 :             else if (fold_stmt (&gsi))
    5435                 :             :               {
    5436                 :             :                 /* Re-read the statement from GSI as fold_stmt() may
    5437                 :             :                    have changed it.  */
    5438                 :     2418097 :                 gimple *new_stmt = gsi_stmt (gsi);
    5439                 :     2418097 :                 update_stmt (new_stmt);
    5440                 :             : 
    5441                 :     2418097 :                 if (is_gimple_call (old_stmt)
    5442                 :     2418097 :                     || is_gimple_call (new_stmt))
    5443                 :        3754 :                   cgraph_update_edges_for_call_stmt (old_stmt, old_decl,
    5444                 :             :                                                      new_stmt);
    5445                 :             : 
    5446                 :     2418097 :                 if (maybe_clean_or_replace_eh_stmt (old_stmt, new_stmt))
    5447                 :         170 :                   bitmap_set_bit (to_purge, dest->index);
    5448                 :             :               }
    5449                 :             :           }
    5450                 :             : 
    5451                 :    44603858 :       if (EDGE_COUNT (dest->succs) > 0)
    5452                 :             :         {
    5453                 :             :           /* Avoid warnings emitted from folding statements that
    5454                 :             :              became unreachable because of inlined function parameter
    5455                 :             :              propagation.  */
    5456                 :    21820835 :           e = find_taken_edge (dest, NULL_TREE);
    5457                 :    21820835 :           if (e)
    5458                 :    15286700 :             stack.quick_push (e);
    5459                 :             :           else
    5460                 :             :             {
    5461                 :     6534135 :               edge_iterator ei;
    5462                 :    19760935 :               FOR_EACH_EDGE (e, ei, dest->succs)
    5463                 :    13226800 :                 stack.safe_push (e);
    5464                 :             :             }
    5465                 :             :         }
    5466                 :             :     }
    5467                 :             : 
    5468                 :     1339646 :   gimple_purge_all_dead_eh_edges (to_purge);
    5469                 :     1339646 : }
    5470                 :             : 
    5471                 :             : /* Expand calls to inline functions in the body of FN.  */
    5472                 :             : 
    5473                 :             : unsigned int
    5474                 :     1733308 : optimize_inline_calls (tree fn)
    5475                 :             : {
    5476                 :     1733308 :   copy_body_data id;
    5477                 :     1733308 :   basic_block bb;
    5478                 :     1733308 :   int last = n_basic_blocks_for_fn (cfun);
    5479                 :     1733308 :   bool inlined_p = false;
    5480                 :             : 
    5481                 :             :   /* Clear out ID.  */
    5482                 :     1733308 :   memset (&id, 0, sizeof (id));
    5483                 :             : 
    5484                 :     1733308 :   id.src_node = id.dst_node = cgraph_node::get (fn);
    5485                 :     1733308 :   gcc_assert (id.dst_node->definition);
    5486                 :     1733308 :   id.dst_fn = fn;
    5487                 :             :   /* Or any functions that aren't finished yet.  */
    5488                 :     1733308 :   if (current_function_decl)
    5489                 :     1733308 :     id.dst_fn = current_function_decl;
    5490                 :             : 
    5491                 :     1733308 :   id.copy_decl = copy_decl_maybe_to_var;
    5492                 :     1733308 :   id.transform_call_graph_edges = CB_CGE_DUPLICATE;
    5493                 :     1733308 :   id.transform_new_cfg = false;
    5494                 :     1733308 :   id.transform_return_to_modify = true;
    5495                 :     1733308 :   id.transform_parameter = true;
    5496                 :     1733308 :   id.statements_to_fold = new hash_set<gimple *>;
    5497                 :             : 
    5498                 :     1733308 :   push_gimplify_context ();
    5499                 :             : 
    5500                 :             :   /* We make no attempts to keep dominance info up-to-date.  */
    5501                 :     1733308 :   free_dominance_info (CDI_DOMINATORS);
    5502                 :     1733308 :   free_dominance_info (CDI_POST_DOMINATORS);
    5503                 :             : 
    5504                 :             :   /* Register specific gimple functions.  */
    5505                 :     1733308 :   gimple_register_cfg_hooks ();
    5506                 :             : 
    5507                 :             :   /* Reach the trees by walking over the CFG, and note the
    5508                 :             :      enclosing basic-blocks in the call edges.  */
    5509                 :             :   /* We walk the blocks going forward, because inlined function bodies
    5510                 :             :      will split id->current_basic_block, and the new blocks will
    5511                 :             :      follow it; we'll trudge through them, processing their CALL_EXPRs
    5512                 :             :      along the way.  */
    5513                 :     1733308 :   auto_bitmap to_purge;
    5514                 :    27506733 :   FOR_EACH_BB_FN (bb, cfun)
    5515                 :    25773425 :     inlined_p |= gimple_expand_calls_inline (bb, &id, to_purge);
    5516                 :             : 
    5517                 :     1733308 :   pop_gimplify_context (NULL);
    5518                 :             : 
    5519                 :     1733308 :   if (flag_checking)
    5520                 :             :     {
    5521                 :     1733284 :       struct cgraph_edge *e;
    5522                 :             : 
    5523                 :     1733284 :       id.dst_node->verify ();
    5524                 :             : 
    5525                 :             :       /* Double check that we inlined everything we are supposed to inline.  */
    5526                 :    10047009 :       for (e = id.dst_node->callees; e; e = e->next_callee)
    5527                 :     8313725 :         gcc_assert (e->inline_failed);
    5528                 :             :     }
    5529                 :             : 
    5530                 :             :   /* If we didn't inline into the function there is nothing to do.  */
    5531                 :     1733308 :   if (!inlined_p)
    5532                 :             :     {
    5533                 :     1188486 :       delete id.statements_to_fold;
    5534                 :      594243 :       return 0;
    5535                 :             :     }
    5536                 :             : 
    5537                 :             :   /* Fold queued statements.  */
    5538                 :     1139065 :   update_max_bb_count ();
    5539                 :     1139065 :   fold_marked_statements (last, id.statements_to_fold);
    5540                 :     2278130 :   delete id.statements_to_fold;
    5541                 :             : 
    5542                 :             :   /* Finally purge EH and abnormal edges from the call stmts we inlined.
    5543                 :             :      We need to do this after fold_marked_statements since that may walk
    5544                 :             :      the SSA use-def chain.  */
    5545                 :     1139065 :   unsigned i;
    5546                 :     1139065 :   bitmap_iterator bi;
    5547                 :     2008582 :   EXECUTE_IF_SET_IN_BITMAP (to_purge, 0, i, bi)
    5548                 :             :     {
    5549                 :      869517 :       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
    5550                 :      869517 :       if (bb)
    5551                 :             :         {
    5552                 :      869517 :           gimple_purge_dead_eh_edges (bb);
    5553                 :      869517 :           gimple_purge_dead_abnormal_call_edges (bb);
    5554                 :             :         }
    5555                 :             :     }
    5556                 :             : 
    5557                 :     1139065 :   gcc_assert (!id.debug_stmts.exists ());
    5558                 :             : 
    5559                 :             :   /* Renumber the lexical scoping (non-code) blocks consecutively.  */
    5560                 :     1139065 :   number_blocks (fn);
    5561                 :             : 
    5562                 :     1139065 :   delete_unreachable_blocks_update_callgraph (id.dst_node, false);
    5563                 :     1139065 :   id.dst_node->calls_comdat_local = id.dst_node->check_calls_comdat_local_p ();
    5564                 :             : 
    5565                 :     1139065 :   if (flag_checking)
    5566                 :     1139053 :     id.dst_node->verify ();
    5567                 :             : 
    5568                 :             :   /* It would be nice to check SSA/CFG/statement consistency here, but it is
    5569                 :             :      not possible yet - the IPA passes might make various functions to not
    5570                 :             :      throw and they don't care to proactively update local EH info.  This is
    5571                 :             :      done later in fixup_cfg pass that also execute the verification.  */
    5572                 :     1139065 :   return (TODO_update_ssa
    5573                 :             :           | TODO_cleanup_cfg
    5574                 :     1139065 :           | (gimple_in_ssa_p (cfun) ? TODO_remove_unused_locals : 0)
    5575                 :     2278130 :           | (gimple_in_ssa_p (cfun) ? TODO_update_address_taken : 0));
    5576                 :     1733308 : }
    5577                 :             : 
    5578                 :             : /* Passed to walk_tree.  Copies the node pointed to, if appropriate.  */
    5579                 :             : 
    5580                 :             : tree
    5581                 :  1272278483 : copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
    5582                 :             : {
    5583                 :  1272278483 :   enum tree_code code = TREE_CODE (*tp);
    5584                 :  1272278483 :   enum tree_code_class cl = TREE_CODE_CLASS (code);
    5585                 :             : 
    5586                 :             :   /* We make copies of most nodes.  */
    5587                 :  1272278483 :   if (IS_EXPR_CODE_CLASS (cl)
    5588                 :             :       || code == TREE_LIST
    5589                 :   205185967 :       || code == TREE_VEC
    5590                 :   201719666 :       || code == TYPE_DECL
    5591                 :   201719666 :       || code == OMP_CLAUSE)
    5592                 :             :     {
    5593                 :             :       /* Because the chain gets clobbered when we make a copy, we save it
    5594                 :             :          here.  */
    5595                 :  1070579994 :       tree chain = NULL_TREE, new_tree;
    5596                 :             : 
    5597                 :  1070579994 :       if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
    5598                 :     3487478 :         chain = TREE_CHAIN (*tp);
    5599                 :             : 
    5600                 :             :       /* Copy the node.  */
    5601                 :  1070579994 :       new_tree = copy_node (*tp);
    5602                 :             : 
    5603                 :  1070579994 :       *tp = new_tree;
    5604                 :             : 
    5605                 :             :       /* Now, restore the chain, if appropriate.  That will cause
    5606                 :             :          walk_tree to walk into the chain as well.  */
    5607                 :  1070579994 :       if (code == PARM_DECL
    5608                 :  1070579994 :           || code == TREE_LIST
    5609                 :  1069102101 :           || code == OMP_CLAUSE)
    5610                 :     1499044 :         TREE_CHAIN (*tp) = chain;
    5611                 :             : 
    5612                 :             :       /* For now, we don't update BLOCKs when we make copies.  So, we
    5613                 :             :          have to nullify all BIND_EXPRs.  */
    5614                 :  1070579994 :       if (TREE_CODE (*tp) == BIND_EXPR)
    5615                 :    11223425 :         BIND_EXPR_BLOCK (*tp) = NULL_TREE;
    5616                 :             :     }
    5617                 :   201698489 :   else if (code == CONSTRUCTOR)
    5618                 :             :     {
    5619                 :             :       /* CONSTRUCTOR nodes need special handling because
    5620                 :             :          we need to duplicate the vector of elements.  */
    5621                 :    18258428 :       tree new_tree;
    5622                 :             : 
    5623                 :    18258428 :       new_tree = copy_node (*tp);
    5624                 :    23274595 :       CONSTRUCTOR_ELTS (new_tree) = vec_safe_copy (CONSTRUCTOR_ELTS (*tp));
    5625                 :    18258428 :       *tp = new_tree;
    5626                 :             :     }
    5627                 :   183440061 :   else if (code == STATEMENT_LIST)
    5628                 :             :     /* We used to just abort on STATEMENT_LIST, but we can run into them
    5629                 :             :        with statement-expressions (c++/40975).  */
    5630                 :          22 :     copy_statement_list (tp);
    5631                 :   183440039 :   else if (TREE_CODE_CLASS (code) == tcc_type)
    5632                 :          27 :     *walk_subtrees = 0;
    5633                 :   183440012 :   else if (TREE_CODE_CLASS (code) == tcc_declaration)
    5634                 :    62905941 :     *walk_subtrees = 0;
    5635                 :   120534071 :   else if (TREE_CODE_CLASS (code) == tcc_constant)
    5636                 :           0 :     *walk_subtrees = 0;
    5637                 :  1272278483 :   return NULL_TREE;
    5638                 :             : }
    5639                 :             : 
    5640                 :             : /* The SAVE_EXPR pointed to by TP is being copied.  If ST contains
    5641                 :             :    information indicating to what new SAVE_EXPR this one should be mapped,
    5642                 :             :    use that one.  Otherwise, create a new node and enter it in ST.  FN is
    5643                 :             :    the function into which the copy will be placed.  */
    5644                 :             : 
    5645                 :             : static void
    5646                 :     5624117 : remap_save_expr (tree *tp, hash_map<tree, tree> *st, int *walk_subtrees)
    5647                 :             : {
    5648                 :     5624117 :   tree *n;
    5649                 :     5624117 :   tree t;
    5650                 :             : 
    5651                 :             :   /* See if we already encountered this SAVE_EXPR.  */
    5652                 :     5624117 :   n = st->get (*tp);
    5653                 :             : 
    5654                 :             :   /* If we didn't already remap this SAVE_EXPR, do so now.  */
    5655                 :     5624117 :   if (!n)
    5656                 :             :     {
    5657                 :     5412267 :       t = copy_node (*tp);
    5658                 :             : 
    5659                 :             :       /* Remember this SAVE_EXPR.  */
    5660                 :     5412267 :       st->put (*tp, t);
    5661                 :             :       /* Make sure we don't remap an already-remapped SAVE_EXPR.  */
    5662                 :     5412267 :       st->put (t, t);
    5663                 :             :     }
    5664                 :             :   else
    5665                 :             :     {
    5666                 :             :       /* We've already walked into this SAVE_EXPR; don't do it again.  */
    5667                 :      211850 :       *walk_subtrees = 0;
    5668                 :      211850 :       t = *n;
    5669                 :             :     }
    5670                 :             : 
    5671                 :             :   /* Replace this SAVE_EXPR with the copy.  */
    5672                 :     5624117 :   *tp = t;
    5673                 :     5624117 : }
    5674                 :             : 
    5675                 :             : /* Called via walk_gimple_seq.  If *GSIP points to a GIMPLE_LABEL for a local
    5676                 :             :    label, copies the declaration and enters it in the splay_tree in DATA (which
    5677                 :             :    is really a 'copy_body_data *'.  */
    5678                 :             : 
    5679                 :             : static tree
    5680                 :     1311930 : mark_local_labels_stmt (gimple_stmt_iterator *gsip,
    5681                 :             :                         bool *handled_ops_p ATTRIBUTE_UNUSED,
    5682                 :             :                         struct walk_stmt_info *wi)
    5683                 :             : {
    5684                 :     1311930 :   copy_body_data *id = (copy_body_data *) wi->info;
    5685                 :     1311930 :   glabel *stmt = dyn_cast <glabel *> (gsi_stmt (*gsip));
    5686                 :             : 
    5687                 :       24498 :   if (stmt)
    5688                 :             :     {
    5689                 :       24498 :       tree decl = gimple_label_label (stmt);
    5690                 :             : 
    5691                 :             :       /* Copy the decl and remember the copy.  */
    5692                 :       24498 :       insert_decl_map (id, decl, id->copy_decl (decl, id));
    5693                 :             :     }
    5694                 :             : 
    5695                 :     1311930 :   return NULL_TREE;
    5696                 :             : }
    5697                 :             : 
    5698                 :             : static gimple_seq duplicate_remap_omp_clause_seq (gimple_seq seq,
    5699                 :             :                                                   struct walk_stmt_info *wi);
    5700                 :             : 
    5701                 :             : /* Called via walk_gimple_seq by copy_gimple_seq_and_replace_local.
    5702                 :             :    Using the splay_tree pointed to by ST (which is really a `splay_tree'),
    5703                 :             :    remaps all local declarations to appropriate replacements in gimple
    5704                 :             :    operands. */
    5705                 :             : 
    5706                 :             : static tree
    5707                 :     2860840 : replace_locals_op (tree *tp, int *walk_subtrees, void *data)
    5708                 :             : {
    5709                 :     2860840 :   struct walk_stmt_info *wi = (struct walk_stmt_info*) data;
    5710                 :     2860840 :   copy_body_data *id = (copy_body_data *) wi->info;
    5711                 :     2860840 :   hash_map<tree, tree> *st = id->decl_map;
    5712                 :     2860840 :   tree *n;
    5713                 :     2860840 :   tree expr = *tp;
    5714                 :             : 
    5715                 :             :   /* For recursive invocations this is no longer the LHS itself.  */
    5716                 :     2860840 :   bool is_lhs = wi->is_lhs;
    5717                 :     2860840 :   wi->is_lhs = false;
    5718                 :             : 
    5719                 :     2860840 :   if (TREE_CODE (expr) == SSA_NAME)
    5720                 :             :     {
    5721                 :       14178 :       *tp = remap_ssa_name (*tp, id);
    5722                 :       14178 :       *walk_subtrees = 0;
    5723                 :       14178 :       if (is_lhs)
    5724                 :        7089 :         SSA_NAME_DEF_STMT (*tp) = gsi_stmt (wi->gsi);
    5725                 :             :     }
    5726                 :             :   /* Only a local declaration (variable or label).  */
    5727                 :     2846662 :   else if ((VAR_P (expr) && !TREE_STATIC (expr))
    5728                 :     1651567 :            || TREE_CODE (expr) == LABEL_DECL)
    5729                 :             :     {
    5730                 :             :       /* Lookup the declaration.  */
    5731                 :     1246154 :       n = st->get (expr);
    5732                 :             : 
    5733                 :             :       /* If it's there, remap it.  */
    5734                 :     1246154 :       if (n)
    5735                 :       49713 :         *tp = *n;
    5736                 :     1246154 :       *walk_subtrees = 0;
    5737                 :             :     }
    5738                 :     1600508 :   else if (TREE_CODE (expr) == STATEMENT_LIST
    5739                 :     1600508 :            || TREE_CODE (expr) == BIND_EXPR
    5740                 :     1600508 :            || TREE_CODE (expr) == SAVE_EXPR)
    5741                 :           0 :     gcc_unreachable ();
    5742                 :     1600508 :   else if (TREE_CODE (expr) == TARGET_EXPR)
    5743                 :             :     {
    5744                 :             :       /* Don't mess with a TARGET_EXPR that hasn't been expanded.
    5745                 :             :          It's OK for this to happen if it was part of a subtree that
    5746                 :             :          isn't immediately expanded, such as operand 2 of another
    5747                 :             :          TARGET_EXPR.  */
    5748                 :           0 :       if (!TREE_OPERAND (expr, 1))
    5749                 :             :         {
    5750                 :           0 :           TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 3);
    5751                 :           0 :           TREE_OPERAND (expr, 3) = NULL_TREE;
    5752                 :             :         }
    5753                 :             :     }
    5754                 :     1600508 :   else if (TREE_CODE (expr) == OMP_CLAUSE)
    5755                 :             :     {
    5756                 :             :       /* Before the omplower pass completes, some OMP clauses can contain
    5757                 :             :          sequences that are neither copied by gimple_seq_copy nor walked by
    5758                 :             :          walk_gimple_seq.  To make copy_gimple_seq_and_replace_locals work even
    5759                 :             :          in those situations, we have to copy and process them explicitely.  */
    5760                 :             : 
    5761                 :         558 :       if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_LASTPRIVATE)
    5762                 :             :         {
    5763                 :          14 :           gimple_seq seq = OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (expr);
    5764                 :          14 :           seq = duplicate_remap_omp_clause_seq (seq, wi);
    5765                 :          14 :           OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (expr) = seq;
    5766                 :             :         }
    5767                 :         544 :       else if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_LINEAR)
    5768                 :             :         {
    5769                 :          78 :           gimple_seq seq = OMP_CLAUSE_LINEAR_GIMPLE_SEQ (expr);
    5770                 :          78 :           seq = duplicate_remap_omp_clause_seq (seq, wi);
    5771                 :          78 :           OMP_CLAUSE_LINEAR_GIMPLE_SEQ (expr) = seq;
    5772                 :             :         }
    5773                 :         466 :       else if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION)
    5774                 :             :         {
    5775                 :         100 :           gimple_seq seq = OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr);
    5776                 :         100 :           seq = duplicate_remap_omp_clause_seq (seq, wi);
    5777                 :         100 :           OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) = seq;
    5778                 :         100 :           seq = OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr);
    5779                 :         100 :           seq = duplicate_remap_omp_clause_seq (seq, wi);
    5780                 :         100 :           OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) = seq;
    5781                 :             :         }
    5782                 :             :     }
    5783                 :             : 
    5784                 :             :   /* Keep iterating.  */
    5785                 :     2860840 :   return NULL_TREE;
    5786                 :             : }
    5787                 :             : 
    5788                 :             : 
    5789                 :             : /* Called via walk_gimple_seq by copy_gimple_seq_and_replace_local.
    5790                 :             :    Using the splay_tree pointed to by ST (which is really a `splay_tree'),
    5791                 :             :    remaps all local declarations to appropriate replacements in gimple
    5792                 :             :    statements. */
    5793                 :             : 
    5794                 :             : static tree
    5795                 :     1311930 : replace_locals_stmt (gimple_stmt_iterator *gsip,
    5796                 :             :                      bool *handled_ops_p ATTRIBUTE_UNUSED,
    5797                 :             :                      struct walk_stmt_info *wi)
    5798                 :             : {
    5799                 :     1311930 :   copy_body_data *id = (copy_body_data *) wi->info;
    5800                 :     1311930 :   gimple *gs = gsi_stmt (*gsip);
    5801                 :             : 
    5802                 :     1311930 :   if (gbind *stmt = dyn_cast <gbind *> (gs))
    5803                 :             :     {
    5804                 :         351 :       tree block = gimple_bind_block (stmt);
    5805                 :             : 
    5806                 :         351 :       if (block)
    5807                 :             :         {
    5808                 :         271 :           remap_block (&block, id);
    5809                 :         271 :           gimple_bind_set_block (stmt, block);
    5810                 :             :         }
    5811                 :             : 
    5812                 :             :       /* This will remap a lot of the same decls again, but this should be
    5813                 :             :          harmless.  */
    5814                 :         351 :       if (gimple_bind_vars (stmt))
    5815                 :             :         {
    5816                 :             :           tree old_var, decls = gimple_bind_vars (stmt);
    5817                 :             : 
    5818                 :         528 :           for (old_var = decls; old_var; old_var = DECL_CHAIN (old_var))
    5819                 :         360 :             if (!can_be_nonlocal (old_var, id)
    5820                 :         360 :                 && ! variably_modified_type_p (TREE_TYPE (old_var), id->src_fn))
    5821                 :         360 :               remap_decl (old_var, id);
    5822                 :             : 
    5823                 :         168 :           gcc_checking_assert (!id->prevent_decl_creation_for_types);
    5824                 :         168 :           id->prevent_decl_creation_for_types = true;
    5825                 :         168 :           gimple_bind_set_vars (stmt, remap_decls (decls, NULL, id));
    5826                 :         168 :           id->prevent_decl_creation_for_types = false;
    5827                 :             :         }
    5828                 :             :     }
    5829                 :             : 
    5830                 :             :   /* Keep iterating.  */
    5831                 :     1311930 :   return NULL_TREE;
    5832                 :             : }
    5833                 :             : 
    5834                 :             : /* Create a copy of SEQ and remap all decls in it.  */
    5835                 :             : 
    5836                 :             : static gimple_seq
    5837                 :         292 : duplicate_remap_omp_clause_seq (gimple_seq seq, struct walk_stmt_info *wi)
    5838                 :             : {
    5839                 :         292 :   if (!seq)
    5840                 :             :     return NULL;
    5841                 :             : 
    5842                 :             :   /* If there are any labels in OMP sequences, they can be only referred to in
    5843                 :             :      the sequence itself and therefore we can do both here.  */
    5844                 :          60 :   walk_gimple_seq (seq, mark_local_labels_stmt, NULL, wi);
    5845                 :          60 :   gimple_seq copy = gimple_seq_copy (seq);
    5846                 :          60 :   walk_gimple_seq (copy, replace_locals_stmt, replace_locals_op, wi);
    5847                 :          60 :   return copy;
    5848                 :             : }
    5849                 :             : 
    5850                 :             : /* Copies everything in SEQ and replaces variables and labels local to
    5851                 :             :    current_function_decl.  */
    5852                 :             : 
    5853                 :             : gimple_seq
    5854                 :      883129 : copy_gimple_seq_and_replace_locals (gimple_seq seq)
    5855                 :             : {
    5856                 :      883129 :   copy_body_data id;
    5857                 :      883129 :   struct walk_stmt_info wi;
    5858                 :      883129 :   gimple_seq copy;
    5859                 :             : 
    5860                 :             :   /* There's nothing to do for NULL_TREE.  */
    5861                 :      883129 :   if (seq == NULL)
    5862                 :             :     return seq;
    5863                 :             : 
    5864                 :             :   /* Set up ID.  */
    5865                 :      883129 :   memset (&id, 0, sizeof (id));
    5866                 :      883129 :   id.src_fn = current_function_decl;
    5867                 :      883129 :   id.dst_fn = current_function_decl;
    5868                 :      883129 :   id.src_cfun = cfun;
    5869                 :      883129 :   id.decl_map = new hash_map<tree, tree>;
    5870                 :      883129 :   id.debug_map = NULL;
    5871                 :             : 
    5872                 :      883129 :   id.copy_decl = copy_decl_no_change;
    5873                 :      883129 :   id.transform_call_graph_edges = CB_CGE_DUPLICATE;
    5874                 :      883129 :   id.transform_new_cfg = false;
    5875                 :      883129 :   id.transform_return_to_modify = false;
    5876                 :      883129 :   id.transform_parameter = false;
    5877                 :             : 
    5878                 :             :   /* Walk the tree once to find local labels.  */
    5879                 :      883129 :   memset (&wi, 0, sizeof (wi));
    5880                 :      883129 :   hash_set<tree> visited;
    5881                 :      883129 :   wi.info = &id;
    5882                 :      883129 :   wi.pset = &visited;
    5883                 :      883129 :   walk_gimple_seq (seq, mark_local_labels_stmt, NULL, &wi);
    5884                 :             : 
    5885                 :      883129 :   copy = gimple_seq_copy (seq);
    5886                 :             : 
    5887                 :             :   /* Walk the copy, remapping decls.  */
    5888                 :      883129 :   memset (&wi, 0, sizeof (wi));
    5889                 :      883129 :   wi.info = &id;
    5890                 :      883129 :   walk_gimple_seq (copy, replace_locals_stmt, replace_locals_op, &wi);
    5891                 :             : 
    5892                 :             :   /* Clean up.  */
    5893                 :     1766258 :   delete id.decl_map;
    5894                 :      883129 :   if (id.debug_map)
    5895                 :           0 :     delete id.debug_map;
    5896                 :      883129 :   if (id.dependence_map)
    5897                 :             :     {
    5898                 :           0 :       delete id.dependence_map;
    5899                 :           0 :       id.dependence_map = NULL;
    5900                 :             :     }
    5901                 :             : 
    5902                 :      883129 :   return copy;
    5903                 :      883129 : }
    5904                 :             : 
    5905                 :             : 
    5906                 :             : /* Allow someone to determine if SEARCH is a child of TOP from gdb.  */
    5907                 :             : 
    5908                 :             : static tree
    5909                 :           0 : debug_find_tree_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
    5910                 :             : {
    5911                 :           0 :   if (*tp == data)
    5912                 :             :     return (tree) data;
    5913                 :             :   else
    5914                 :           0 :     return NULL;
    5915                 :             : }
    5916                 :             : 
    5917                 :             : DEBUG_FUNCTION bool
    5918                 :           0 : debug_find_tree (tree top, tree search)
    5919                 :             : {
    5920                 :           0 :   return walk_tree_without_duplicates (&top, debug_find_tree_1, search) != 0;
    5921                 :             : }
    5922                 :             : 
    5923                 :             : 
    5924                 :             : /* Declare the variables created by the inliner.  Add all the variables in
    5925                 :             :    VARS to BIND_EXPR.  */
    5926                 :             : 
    5927                 :             : static void
    5928                 :     5572637 : declare_inline_vars (tree block, tree vars)
    5929                 :             : {
    5930                 :     5572637 :   tree t;
    5931                 :    13558993 :   for (t = vars; t; t = DECL_CHAIN (t))
    5932                 :             :     {
    5933                 :     7986356 :       DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
    5934                 :     7986356 :       gcc_assert (!TREE_STATIC (t) && !TREE_ASM_WRITTEN (t));
    5935                 :     7986356 :       add_local_decl (cfun, t);
    5936                 :             :     }
    5937                 :             : 
    5938                 :     5572637 :   if (block)
    5939                 :     5504409 :     BLOCK_VARS (block) = chainon (BLOCK_VARS (block), vars);
    5940                 :     5572637 : }
    5941                 :             : 
    5942                 :             : /* Copy NODE (which must be a DECL).  The DECL originally was in the FROM_FN,
    5943                 :             :    but now it will be in the TO_FN.  PARM_TO_VAR means enable PARM_DECL to
    5944                 :             :    VAR_DECL translation.  */
    5945                 :             : 
    5946                 :             : tree
    5947                 :    70549007 : copy_decl_for_dup_finish (copy_body_data *id, tree decl, tree copy)
    5948                 :             : {
    5949                 :             :   /* Don't generate debug information for the copy if we wouldn't have
    5950                 :             :      generated it for the copy either.  */
    5951                 :    70549007 :   DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (decl);
    5952                 :    70549007 :   DECL_IGNORED_P (copy) = DECL_IGNORED_P (decl);
    5953                 :             : 
    5954                 :             :   /* Set the DECL_ABSTRACT_ORIGIN so the debugging routines know what
    5955                 :             :      declaration inspired this copy.  */
    5956                 :    92139980 :   DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (decl);
    5957                 :             : 
    5958                 :             :   /* The new variable/label has no RTL, yet.  */
    5959                 :    70549007 :   if (HAS_RTL_P (copy)
    5960                 :    70549007 :       && !TREE_STATIC (copy) && !DECL_EXTERNAL (copy))
    5961                 :    70544806 :     SET_DECL_RTL (copy, 0);
    5962                 :             :   /* For vector typed decls make sure to update DECL_MODE according
    5963                 :             :      to the new function context.  */
    5964                 :    70549007 :   if (VECTOR_TYPE_P (TREE_TYPE (copy)))
    5965                 :      147922 :     SET_DECL_MODE (copy, TYPE_MODE (TREE_TYPE (copy)));
    5966                 :             : 
    5967                 :             :   /* These args would always appear unused, if not for this.  */
    5968                 :    70549007 :   TREE_USED (copy) = 1;
    5969                 :             : 
    5970                 :             :   /* Set the context for the new declaration.  */
    5971                 :    70549007 :   if (!DECL_CONTEXT (decl))
    5972                 :             :     /* Globals stay global.  */
    5973                 :             :     ;
    5974                 :    70548939 :   else if (DECL_CONTEXT (decl) != id->src_fn)
    5975                 :             :     /* Things that weren't in the scope of the function we're inlining
    5976                 :             :        from aren't in the scope we're inlining to, either.  */
    5977                 :             :     ;
    5978                 :    70541434 :   else if (TREE_STATIC (decl))
    5979                 :             :     /* Function-scoped static variables should stay in the original
    5980                 :             :        function.  */
    5981                 :             :     ;
    5982                 :             :   else
    5983                 :             :     {
    5984                 :             :       /* Ordinary automatic local variables are now in the scope of the
    5985                 :             :          new function.  */
    5986                 :    70538534 :       DECL_CONTEXT (copy) = id->dst_fn;
    5987                 :    70538534 :       if (VAR_P (copy) && id->dst_simt_vars && !is_gimple_reg (copy))
    5988                 :             :         {
    5989                 :           0 :           if (!lookup_attribute ("omp simt private", DECL_ATTRIBUTES (copy)))
    5990                 :           0 :             DECL_ATTRIBUTES (copy)
    5991                 :           0 :               = tree_cons (get_identifier ("omp simt private"), NULL,
    5992                 :           0 :                            DECL_ATTRIBUTES (copy));
    5993                 :           0 :           id->dst_simt_vars->safe_push (copy);
    5994                 :             :         }
    5995                 :             :     }
    5996                 :             : 
    5997                 :    70549007 :   return copy;
    5998                 :             : }
    5999                 :             : 
    6000                 :             : /* Create a new VAR_DECL that is indentical in all respect to DECL except that
    6001                 :             :    DECL can be either a VAR_DECL, a PARM_DECL or RESULT_DECL.  The original
    6002                 :             :    DECL must come from ID->src_fn and the copy will be part of ID->dst_fn.  */
    6003                 :             : 
    6004                 :             : tree
    6005                 :     6289088 : copy_decl_to_var (tree decl, copy_body_data *id)
    6006                 :             : {
    6007                 :     6289088 :   tree copy, type;
    6008                 :             : 
    6009                 :     6289088 :   gcc_assert (TREE_CODE (decl) == PARM_DECL
    6010                 :             :               || TREE_CODE (decl) == RESULT_DECL);
    6011                 :             : 
    6012                 :     6289088 :   type = TREE_TYPE (decl);
    6013                 :             : 
    6014                 :     6289088 :   copy = build_decl (DECL_SOURCE_LOCATION (id->dst_fn),
    6015                 :     6289088 :                      VAR_DECL, DECL_NAME (decl), type);
    6016                 :     6289088 :   if (DECL_PT_UID_SET_P (decl))
    6017                 :         205 :     SET_DECL_PT_UID (copy, DECL_PT_UID (decl));
    6018                 :     6289088 :   TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
    6019                 :     6289088 :   TREE_READONLY (copy) = TREE_READONLY (decl);
    6020                 :     6289088 :   TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
    6021                 :     6289088 :   DECL_NOT_GIMPLE_REG_P (copy) = DECL_NOT_GIMPLE_REG_P (decl);
    6022                 :     6289088 :   DECL_BY_REFERENCE (copy) = DECL_BY_REFERENCE (decl);
    6023                 :             : 
    6024                 :     6289088 :   return copy_decl_for_dup_finish (id, decl, copy);
    6025                 :             : }
    6026                 :             : 
    6027                 :             : /* Like copy_decl_to_var, but create a return slot object instead of a
    6028                 :             :    pointer variable for return by invisible reference.  */
    6029                 :             : 
    6030                 :             : static tree
    6031                 :     1704839 : copy_result_decl_to_var (tree decl, copy_body_data *id)
    6032                 :             : {
    6033                 :     1704839 :   tree copy, type;
    6034                 :             : 
    6035                 :     1704839 :   gcc_assert (TREE_CODE (decl) == PARM_DECL
    6036                 :             :               || TREE_CODE (decl) == RESULT_DECL);
    6037                 :             : 
    6038                 :     1704839 :   type = TREE_TYPE (decl);
    6039                 :     1704839 :   if (DECL_BY_REFERENCE (decl))
    6040                 :          71 :     type = TREE_TYPE (type);
    6041                 :             : 
    6042                 :     1704839 :   copy = build_decl (DECL_SOURCE_LOCATION (id->dst_fn),
    6043                 :     1704839 :                      VAR_DECL, DECL_NAME (decl), type);
    6044                 :     1704839 :   if (DECL_PT_UID_SET_P (decl))
    6045                 :           0 :     SET_DECL_PT_UID (copy, DECL_PT_UID (decl));
    6046                 :     1704839 :   TREE_READONLY (copy) = TREE_READONLY (decl);
    6047                 :     1704839 :   TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
    6048                 :     1704839 :   if (!DECL_BY_REFERENCE (decl))
    6049                 :             :     {
    6050                 :     1704768 :       TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
    6051                 :     1704768 :       DECL_NOT_GIMPLE_REG_P (copy)
    6052                 :     3409536 :         = (DECL_NOT_GIMPLE_REG_P (decl)
    6053                 :             :            /* RESULT_DECLs are treated special by needs_to_live_in_memory,
    6054                 :             :               mirror that to the created VAR_DECL.  */
    6055                 :     1704768 :            || (TREE_CODE (decl) == RESULT_DECL
    6056                 :     1704615 :                && aggregate_value_p (decl, id->src_fn)));
    6057                 :             :     }
    6058                 :             : 
    6059                 :     1704839 :   return copy_decl_for_dup_finish (id, decl, copy);
    6060                 :             : }
    6061                 :             : 
    6062                 :             : tree
    6063                 :    62554923 : copy_decl_no_change (tree decl, copy_body_data *id)
    6064                 :             : {
    6065                 :    62554923 :   tree copy;
    6066                 :             : 
    6067                 :    62554923 :   copy = copy_node (decl);
    6068                 :             : 
    6069                 :             :   /* The COPY is not abstract; it will be generated in DST_FN.  */
    6070                 :    62554923 :   DECL_ABSTRACT_P (copy) = false;
    6071                 :    62554923 :   lang_hooks.dup_lang_specific_decl (copy);
    6072                 :             : 
    6073                 :             :   /* TREE_ADDRESSABLE isn't used to indicate that a label's address has
    6074                 :             :      been taken; it's for internal bookkeeping in expand_goto_internal.  */
    6075                 :    62554923 :   if (TREE_CODE (copy) == LABEL_DECL)
    6076                 :             :     {
    6077                 :     1049719 :       TREE_ADDRESSABLE (copy) = 0;
    6078                 :     1049719 :       LABEL_DECL_UID (copy) = -1;
    6079                 :             :     }
    6080                 :             : 
    6081                 :    62554923 :   return copy_decl_for_dup_finish (id, decl, copy);
    6082                 :             : }
    6083                 :             : 
    6084                 :             : static tree
    6085                 :    15833799 : copy_decl_maybe_to_var (tree decl, copy_body_data *id)
    6086                 :             : {
    6087                 :    15833799 :   if (TREE_CODE (decl) == PARM_DECL || TREE_CODE (decl) == RESULT_DECL)
    6088                 :        7571 :     return copy_decl_to_var (decl, id);
    6089                 :             :   else
    6090                 :    15826228 :     return copy_decl_no_change (decl, id);
    6091                 :             : }
    6092                 :             : 
    6093                 :             : /* Return a copy of the function's argument tree without any modifications.  */
    6094                 :             : 
    6095                 :             : static tree
    6096                 :       65610 : copy_arguments_nochange (tree orig_parm, copy_body_data * id)
    6097                 :             : {
    6098                 :       65610 :   tree arg, *parg;
    6099                 :       65610 :   tree new_parm = NULL;
    6100                 :             : 
    6101                 :       65610 :   parg = &new_parm;
    6102                 :      194740 :   for (arg = orig_parm; arg; arg = DECL_CHAIN (arg))
    6103                 :             :     {
    6104                 :      129130 :       tree new_tree = remap_decl (arg, id);
    6105                 :      129130 :       if (TREE_CODE (new_tree) != PARM_DECL)
    6106                 :        2855 :         new_tree = id->copy_decl (arg, id);
    6107                 :      129130 :       lang_hooks.dup_lang_specific_decl (new_tree);
    6108                 :      129130 :       *parg = new_tree;
    6109                 :      129130 :       parg = &DECL_CHAIN (new_tree);
    6110                 :             :     }
    6111                 :       65610 :   return new_parm;
    6112                 :             : }
    6113                 :             : 
    6114                 :             : /* Return a copy of the function's static chain.  */
    6115                 :             : static tree
    6116                 :         846 : copy_static_chain (tree static_chain, copy_body_data * id)
    6117                 :             : {
    6118                 :         846 :   tree *chain_copy, *pvar;
    6119                 :             : 
    6120                 :         846 :   chain_copy = &static_chain;
    6121                 :        1692 :   for (pvar = chain_copy; *pvar; pvar = &DECL_CHAIN (*pvar))
    6122                 :             :     {
    6123                 :         846 :       tree new_tree = remap_decl (*pvar, id);
    6124                 :         846 :       lang_hooks.dup_lang_specific_decl (new_tree);
    6125                 :         846 :       DECL_CHAIN (new_tree) = DECL_CHAIN (*pvar);
    6126                 :         846 :       *pvar = new_tree;
    6127                 :             :     }
    6128                 :         846 :   return static_chain;
    6129                 :             : }
    6130                 :             : 
    6131                 :             : /* Return true if the function is allowed to be versioned.
    6132                 :             :    This is a guard for the versioning functionality.  */
    6133                 :             : 
    6134                 :             : bool
    6135                 :    10693678 : tree_versionable_function_p (tree fndecl)
    6136                 :             : {
    6137                 :    10693678 :   return (!lookup_attribute ("noclone", DECL_ATTRIBUTES (fndecl))
    6138                 :    21126623 :           && copy_forbidden (DECL_STRUCT_FUNCTION (fndecl)) == NULL);
    6139                 :             : }
    6140                 :             : 
    6141                 :             : /* Update clone info after duplication.  */
    6142                 :             : 
    6143                 :             : static void
    6144                 :      200581 : update_clone_info (copy_body_data * id)
    6145                 :             : {
    6146                 :      200581 :   struct cgraph_node *this_node = id->dst_node;
    6147                 :      200581 :   if (!this_node->clones)
    6148                 :             :     return;
    6149                 :      458055 :   for (cgraph_node *node = this_node->clones; node != this_node;)
    6150                 :             :     {
    6151                 :             :       /* First update replace maps to match the new body.  */
    6152                 :      398779 :       clone_info *info = clone_info::get (node);
    6153                 :      398779 :       if (info && info->tree_map)
    6154                 :             :         {
    6155                 :             :           unsigned int i;
    6156                 :           0 :           for (i = 0; i < vec_safe_length (info->tree_map); i++)
    6157                 :             :             {
    6158                 :           0 :               struct ipa_replace_map *replace_info;
    6159                 :           0 :               replace_info = (*info->tree_map)[i];
    6160                 :           0 :               walk_tree (&replace_info->new_tree, copy_tree_body_r, id, NULL);
    6161                 :             :             }
    6162                 :             :         }
    6163                 :             : 
    6164                 :      398779 :       if (node->clones)
    6165                 :             :         node = node->clones;
    6166                 :      384938 :       else if (node->next_sibling_clone)
    6167                 :             :         node = node->next_sibling_clone;
    6168                 :             :       else
    6169                 :             :         {
    6170                 :      139998 :           while (node != id->dst_node && !node->next_sibling_clone)
    6171                 :       73117 :             node = node->clone_of;
    6172                 :       66881 :           if (node != id->dst_node)
    6173                 :        7605 :             node = node->next_sibling_clone;
    6174                 :             :         }
    6175                 :             :     }
    6176                 :             : }
    6177                 :             : 
    6178                 :             : /* Create a copy of a function's tree.
    6179                 :             :    OLD_DECL and NEW_DECL are FUNCTION_DECL tree nodes
    6180                 :             :    of the original function and the new copied function
    6181                 :             :    respectively.  In case we want to replace a DECL
    6182                 :             :    tree with another tree while duplicating the function's
    6183                 :             :    body, TREE_MAP represents the mapping between these
    6184                 :             :    trees. If UPDATE_CLONES is set, the call_stmt fields
    6185                 :             :    of edges of clones of the function will be updated.
    6186                 :             : 
    6187                 :             :    If non-NULL PARAM_ADJUSTMENTS determines how function prototype (i.e. the
    6188                 :             :    function parameters and return value) should be modified).
    6189                 :             :    If non-NULL BLOCKS_TO_COPY determine what basic blocks to copy.
    6190                 :             :    If non_NULL NEW_ENTRY determine new entry BB of the clone.
    6191                 :             : */
    6192                 :             : void
    6193                 :      200581 : tree_function_versioning (tree old_decl, tree new_decl,
    6194                 :             :                           vec<ipa_replace_map *, va_gc> *tree_map,
    6195                 :             :                           ipa_param_adjustments *param_adjustments,
    6196                 :             :                           bool update_clones, bitmap blocks_to_copy,
    6197                 :             :                           basic_block new_entry)
    6198                 :             : {
    6199                 :      200581 :   struct cgraph_node *old_version_node;
    6200                 :      200581 :   struct cgraph_node *new_version_node;
    6201                 :      200581 :   copy_body_data id;
    6202                 :      200581 :   tree p;
    6203                 :      200581 :   unsigned i;
    6204                 :      200581 :   struct ipa_replace_map *replace_info;
    6205                 :      200581 :   basic_block old_entry_block, bb;
    6206                 :      200581 :   auto_vec<gimple *, 10> init_stmts;
    6207                 :      200581 :   tree vars = NULL_TREE;
    6208                 :             : 
    6209                 :             :   /* We can get called recursively from expand_call_inline via clone
    6210                 :             :      materialization.  While expand_call_inline maintains input_location
    6211                 :             :      we cannot tolerate it to leak into the materialized clone.  */
    6212                 :      200581 :   location_t saved_location = input_location;
    6213                 :      200581 :   input_location = UNKNOWN_LOCATION;
    6214                 :             : 
    6215                 :      200581 :   gcc_assert (TREE_CODE (old_decl) == FUNCTION_DECL
    6216                 :             :               && TREE_CODE (new_decl) == FUNCTION_DECL);
    6217                 :      200581 :   DECL_POSSIBLY_INLINED (old_decl) = 1;
    6218                 :             : 
    6219                 :      200581 :   old_version_node = cgraph_node::get (old_decl);
    6220                 :      200581 :   gcc_checking_assert (old_version_node);
    6221                 :      200581 :   new_version_node = cgraph_node::get (new_decl);
    6222                 :      200581 :   gcc_checking_assert (new_version_node);
    6223                 :             : 
    6224                 :             :   /* Copy over debug args.  */
    6225                 :      200581 :   if (DECL_HAS_DEBUG_ARGS_P (old_decl))
    6226                 :             :     {
    6227                 :        3099 :       vec<tree, va_gc> **new_debug_args, **old_debug_args;
    6228                 :        3099 :       gcc_checking_assert (decl_debug_args_lookup (new_decl) == NULL);
    6229                 :        3099 :       DECL_HAS_DEBUG_ARGS_P (new_decl) = 0;
    6230                 :        3099 :       old_debug_args = decl_debug_args_lookup (old_decl);
    6231                 :        3099 :       if (old_debug_args)
    6232                 :             :         {
    6233                 :        3099 :           new_debug_args = decl_debug_args_insert (new_decl);
    6234                 :        6198 :           *new_debug_args = vec_safe_copy (*old_debug_args);
    6235                 :             :         }
    6236                 :             :     }
    6237                 :             : 
    6238                 :             :   /* Output the inlining info for this abstract function, since it has been
    6239                 :             :      inlined.  If we don't do this now, we can lose the information about the
    6240                 :             :      variables in the function when the blocks get blown away as soon as we
    6241                 :             :      remove the cgraph node.  */
    6242                 :      200581 :   (*debug_hooks->outlining_inline_function) (old_decl);
    6243                 :             : 
    6244                 :      200581 :   DECL_ARTIFICIAL (new_decl) = 1;
    6245                 :      362470 :   DECL_ABSTRACT_ORIGIN (new_decl) = DECL_ORIGIN (old_decl);
    6246                 :      362470 :   if (DECL_ORIGIN (old_decl) == old_decl)
    6247                 :      175221 :     old_version_node->used_as_abstract_origin = true;
    6248                 :      200581 :   DECL_FUNCTION_PERSONALITY (new_decl) = DECL_FUNCTION_PERSONALITY (old_decl);
    6249                 :             : 
    6250                 :             :   /* Prepare the data structures for the tree copy.  */
    6251                 :      200581 :   memset (&id, 0, sizeof (id));
    6252                 :             : 
    6253                 :             :   /* Generate a new name for the new version. */
    6254                 :      200581 :   id.statements_to_fold = new hash_set<gimple *>;
    6255                 :             : 
    6256                 :      200581 :   id.decl_map = new hash_map<tree, tree>;
    6257                 :      200581 :   id.debug_map = NULL;
    6258                 :      200581 :   id.src_fn = old_decl;
    6259                 :      200581 :   id.dst_fn = new_decl;
    6260                 :      200581 :   id.src_node = old_version_node;
    6261                 :      200581 :   id.dst_node = new_version_node;
    6262                 :      200581 :   id.src_cfun = DECL_STRUCT_FUNCTION (old_decl);
    6263                 :      200581 :   id.blocks_to_copy = blocks_to_copy;
    6264                 :             : 
    6265                 :      200581 :   id.copy_decl = copy_decl_no_change;
    6266                 :      200581 :   id.transform_call_graph_edges
    6267                 :      200581 :     = update_clones ? CB_CGE_MOVE_CLONES : CB_CGE_MOVE;
    6268                 :      200581 :   id.transform_new_cfg = true;
    6269                 :      200581 :   id.transform_return_to_modify = false;
    6270                 :      200581 :   id.transform_parameter = false;
    6271                 :             : 
    6272                 :      200581 :   old_entry_block = ENTRY_BLOCK_PTR_FOR_FN (DECL_STRUCT_FUNCTION (old_decl));
    6273                 :      200581 :   DECL_RESULT (new_decl) = DECL_RESULT (old_decl);
    6274                 :      200581 :   DECL_ARGUMENTS (new_decl) = DECL_ARGUMENTS (old_decl);
    6275                 :      200581 :   initialize_cfun (new_decl, old_decl,
    6276                 :      200581 :                    new_entry ? new_entry->count : old_entry_block->count);
    6277                 :      200581 :   new_version_node->calls_declare_variant_alt
    6278                 :      200581 :     = old_version_node->calls_declare_variant_alt;
    6279                 :      200581 :   if (DECL_STRUCT_FUNCTION (new_decl)->gimple_df)
    6280                 :      200581 :     DECL_STRUCT_FUNCTION (new_decl)->gimple_df->ipa_pta
    6281                 :      200581 :       = id.src_cfun->gimple_df->ipa_pta;
    6282                 :             : 
    6283                 :             :   /* Copy the function's static chain.  */
    6284                 :      200581 :   p = DECL_STRUCT_FUNCTION (old_decl)->static_chain_decl;
    6285                 :      200581 :   if (p)
    6286                 :        1692 :     DECL_STRUCT_FUNCTION (new_decl)->static_chain_decl
    6287                 :         846 :       = copy_static_chain (p, &id);
    6288                 :             : 
    6289                 :      200581 :   auto_vec<int, 16> new_param_indices;
    6290                 :      200581 :   clone_info *info = clone_info::get (old_version_node);
    6291                 :      405817 :   ipa_param_adjustments *old_param_adjustments
    6292                 :      200581 :     = info ? info->param_adjustments : NULL;
    6293                 :        4655 :   if (old_param_adjustments)
    6294                 :        4589 :     old_param_adjustments->get_updated_indices (&new_param_indices);
    6295                 :             : 
    6296                 :             :   /* If there's a tree_map, prepare for substitution.  */
    6297                 :      200581 :   if (tree_map)
    6298                 :       30979 :     for (i = 0; i < tree_map->length (); i++)
    6299                 :             :       {
    6300                 :       19196 :         gimple *init;
    6301                 :       19196 :         replace_info = (*tree_map)[i];
    6302                 :             : 
    6303                 :       19196 :         int p = replace_info->parm_num;
    6304                 :       19196 :         if (old_param_adjustments)
    6305                 :           0 :           p = new_param_indices[p];
    6306                 :             : 
    6307                 :       19196 :         tree parm;
    6308                 :       55734 :         for (parm = DECL_ARGUMENTS (old_decl); p;
    6309                 :       36538 :              parm = DECL_CHAIN (parm))
    6310                 :       36538 :           p--;
    6311                 :       19196 :         gcc_assert (parm);
    6312                 :       19196 :         init = setup_one_parameter (&id, parm, replace_info->new_tree,
    6313                 :             :                                     id.src_fn, NULL, &vars);
    6314                 :       19196 :         if (init)
    6315                 :        5937 :           init_stmts.safe_push (init);
    6316                 :             :       }
    6317                 :             : 
    6318                 :      200581 :   ipa_param_body_adjustments *param_body_adjs = NULL;
    6319                 :      200581 :   if (param_adjustments)
    6320                 :             :     {
    6321                 :      259674 :       param_body_adjs = new ipa_param_body_adjustments (param_adjustments,
    6322                 :             :                                                         new_decl, old_decl,
    6323                 :      129837 :                                                         &id, &vars, tree_map);
    6324                 :      129837 :       id.param_body_adjs = param_body_adjs;
    6325                 :      129837 :       DECL_ARGUMENTS (new_decl) = param_body_adjs->get_new_param_chain ();
    6326                 :             :     }
    6327                 :       70744 :   else if (DECL_ARGUMENTS (old_decl) != NULL_TREE)
    6328                 :      131220 :     DECL_ARGUMENTS (new_decl)
    6329                 :       65610 :       = copy_arguments_nochange (DECL_ARGUMENTS (old_decl), &id);
    6330                 :             : 
    6331                 :      200581 :   DECL_INITIAL (new_decl) = remap_blocks (DECL_INITIAL (id.src_fn), &id);
    6332                 :      200581 :   BLOCK_SUPERCONTEXT (DECL_INITIAL (new_decl)) = new_decl;
    6333                 :             : 
    6334                 :      200581 :   declare_inline_vars (DECL_INITIAL (new_decl), vars);
    6335                 :             : 
    6336                 :      200581 :   if (!vec_safe_is_empty (DECL_STRUCT_FUNCTION (old_decl)->local_decls))
    6337                 :             :     /* Add local vars.  */
    6338                 :      118624 :     add_local_variables (DECL_STRUCT_FUNCTION (old_decl), cfun, &id);
    6339                 :             : 
    6340                 :      200581 :   if (DECL_RESULT (old_decl) == NULL_TREE)
    6341                 :             :     ;
    6342                 :      129837 :   else if (param_adjustments && param_adjustments->m_skip_return
    6343                 :      239104 :            && !VOID_TYPE_P (TREE_TYPE (DECL_RESULT (old_decl))))
    6344                 :             :     {
    6345                 :       32224 :       tree resdecl_repl = copy_result_decl_to_var (DECL_RESULT (old_decl),
    6346                 :             :                                                    &id);
    6347                 :       32224 :       declare_inline_vars (NULL, resdecl_repl);
    6348                 :       32224 :       if (DECL_BY_REFERENCE (DECL_RESULT (old_decl)))
    6349                 :          71 :         resdecl_repl = build_fold_addr_expr (resdecl_repl);
    6350                 :       32224 :       insert_decl_map (&id, DECL_RESULT (old_decl), resdecl_repl);
    6351                 :             : 
    6352                 :       64448 :       DECL_RESULT (new_decl)
    6353                 :       32224 :         = build_decl (DECL_SOURCE_LOCATION (DECL_RESULT (old_decl)),
    6354                 :             :                       RESULT_DECL, NULL_TREE, void_type_node);
    6355                 :       32224 :       DECL_CONTEXT (DECL_RESULT (new_decl)) = new_decl;
    6356                 :       32224 :       DECL_IS_MALLOC (new_decl) = false;
    6357                 :       32224 :       cfun->returns_struct = 0;
    6358                 :       32224 :       cfun->returns_pcc_struct = 0;
    6359                 :             :     }
    6360                 :             :   else
    6361                 :             :     {
    6362                 :      168357 :       tree old_name;
    6363                 :      168357 :       DECL_RESULT (new_decl) = remap_decl (DECL_RESULT (old_decl), &id);
    6364                 :      168357 :       lang_hooks.dup_lang_specific_decl (DECL_RESULT (new_decl));
    6365                 :      336714 :       if (gimple_in_ssa_p (id.src_cfun)
    6366                 :      168357 :           && DECL_BY_REFERENCE (DECL_RESULT (old_decl))
    6367                 :        3630 :           && (old_name = ssa_default_def (id.src_cfun, DECL_RESULT (old_decl))))
    6368                 :             :         {
    6369                 :        3609 :           tree new_name = make_ssa_name (DECL_RESULT (new_decl));
    6370                 :        3609 :           insert_decl_map (&id, old_name, new_name);
    6371                 :        3609 :           SSA_NAME_DEF_STMT (new_name) = gimple_build_nop ();
    6372                 :        3609 :           set_ssa_default_def (cfun, DECL_RESULT (new_decl), new_name);
    6373                 :             :         }
    6374                 :             :     }
    6375                 :             : 
    6376                 :             :   /* Set up the destination functions loop tree.  */
    6377                 :      200581 :   if (loops_for_fn (DECL_STRUCT_FUNCTION (old_decl)) != NULL)
    6378                 :             :     {
    6379                 :      200581 :       cfun->curr_properties &= ~PROP_loops;
    6380                 :      200581 :       loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
    6381                 :      200581 :       cfun->curr_properties |= PROP_loops;
    6382                 :             :     }
    6383                 :             : 
    6384                 :             :   /* Copy the Function's body.  */
    6385                 :      200581 :   copy_body (&id, ENTRY_BLOCK_PTR_FOR_FN (cfun), EXIT_BLOCK_PTR_FOR_FN (cfun),
    6386                 :             :              new_entry);
    6387                 :             : 
    6388                 :             :   /* Renumber the lexical scoping (non-code) blocks consecutively.  */
    6389                 :      200581 :   number_blocks (new_decl);
    6390                 :             : 
    6391                 :             :   /* We want to create the BB unconditionally, so that the addition of
    6392                 :             :      debug stmts doesn't affect BB count, which may in the end cause
    6393                 :             :      codegen differences.  */
    6394                 :      200581 :   bb = split_edge (single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
    6395                 :      407099 :   while (init_stmts.length ())
    6396                 :        5937 :     insert_init_stmt (&id, bb, init_stmts.pop ());
    6397                 :      200581 :   if (param_body_adjs)
    6398                 :      129837 :     param_body_adjs->append_init_stmts (bb);
    6399                 :      200581 :   update_clone_info (&id);
    6400                 :             : 
    6401                 :             :   /* Remap the nonlocal_goto_save_area, if any.  */
    6402                 :      200581 :   if (cfun->nonlocal_goto_save_area)
    6403                 :             :     {
    6404                 :           0 :       struct walk_stmt_info wi;
    6405                 :             : 
    6406                 :           0 :       memset (&wi, 0, sizeof (wi));
    6407                 :           0 :       wi.info = &id;
    6408                 :           0 :       walk_tree (&cfun->nonlocal_goto_save_area, remap_gimple_op_r, &wi, NULL);
    6409                 :             :     }
    6410                 :             : 
    6411                 :             :   /* Clean up.  */
    6412                 :      401162 :   delete id.decl_map;
    6413                 :      200581 :   if (id.debug_map)
    6414                 :        1129 :     delete id.debug_map;
    6415                 :      200581 :   free_dominance_info (CDI_DOMINATORS);
    6416                 :      200581 :   free_dominance_info (CDI_POST_DOMINATORS);
    6417                 :             : 
    6418                 :      200581 :   update_max_bb_count ();
    6419                 :      200581 :   fold_marked_statements (0, id.statements_to_fold);
    6420                 :      401162 :   delete id.statements_to_fold;
    6421                 :      200581 :   delete_unreachable_blocks_update_callgraph (id.dst_node, update_clones);
    6422                 :      200581 :   if (id.dst_node->definition)
    6423                 :      197075 :     cgraph_edge::rebuild_references ();
    6424                 :      200581 :   if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
    6425                 :             :     {
    6426                 :      200581 :       calculate_dominance_info (CDI_DOMINATORS);
    6427                 :      200581 :       fix_loop_structure (NULL);
    6428                 :             :     }
    6429                 :      200581 :   update_ssa (TODO_update_ssa);
    6430                 :             : 
    6431                 :             :   /* After partial cloning we need to rescale frequencies, so they are
    6432                 :             :      within proper range in the cloned function.  */
    6433                 :      200581 :   if (new_entry)
    6434                 :             :     {
    6435                 :       43506 :       struct cgraph_edge *e;
    6436                 :       43506 :       rebuild_frequencies ();
    6437                 :             : 
    6438                 :       43506 :       new_version_node->count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
    6439                 :      222301 :       for (e = new_version_node->callees; e; e = e->next_callee)
    6440                 :             :         {
    6441                 :      178795 :           basic_block bb = gimple_bb (e->call_stmt);
    6442                 :      178795 :           e->count = bb->count;
    6443                 :             :         }
    6444                 :       48495 :       for (e = new_version_node->indirect_calls; e; e = e->next_callee)
    6445                 :             :         {
    6446                 :        4989 :           basic_block bb = gimple_bb (e->call_stmt);
    6447                 :        4989 :           e->count = bb->count;
    6448                 :             :         }
    6449                 :             :     }
    6450                 :             : 
    6451                 :      200581 :   if (param_body_adjs && MAY_HAVE_DEBUG_BIND_STMTS)
    6452                 :             :     {
    6453                 :      109824 :       vec<tree, va_gc> **debug_args = NULL;
    6454                 :      109824 :       unsigned int len = 0;
    6455                 :      109824 :       unsigned reset_len = param_body_adjs->m_reset_debug_decls.length ();
    6456                 :             : 
    6457                 :      199888 :       for (i = 0; i < reset_len; i++)
    6458                 :             :         {
    6459                 :       90064 :           tree parm = param_body_adjs->m_reset_debug_decls[i];
    6460                 :       90064 :           gcc_assert (is_gimple_reg (parm));
    6461                 :       90064 :           tree ddecl;
    6462                 :             : 
    6463                 :       90064 :           if (debug_args == NULL)
    6464                 :             :             {
    6465                 :       65556 :               debug_args = decl_debug_args_insert (new_decl);
    6466                 :       65556 :               len = vec_safe_length (*debug_args);
    6467                 :             :             }
    6468                 :       90064 :           ddecl = build_debug_expr_decl (TREE_TYPE (parm));
    6469                 :             :           /* FIXME: Is setting the mode really necessary? */
    6470                 :       90064 :           SET_DECL_MODE (ddecl, DECL_MODE (parm));
    6471                 :       90064 :           vec_safe_push (*debug_args, DECL_ORIGIN (parm));
    6472                 :       90064 :           vec_safe_push (*debug_args, ddecl);
    6473                 :             :         }
    6474                 :      109824 :       if (debug_args != NULL)
    6475                 :             :         {
    6476                 :             :           /* On the callee side, add
    6477                 :             :              DEBUG D#Y s=> parm
    6478                 :             :              DEBUG var => D#Y
    6479                 :             :              stmts to the first bb where var is a VAR_DECL created for the
    6480                 :             :              optimized away parameter in DECL_INITIAL block.  This hints
    6481                 :             :              in the debug info that var (whole DECL_ORIGIN is the parm
    6482                 :             :              PARM_DECL) is optimized away, but could be looked up at the
    6483                 :             :              call site as value of D#X there.  */
    6484                 :       65556 :           gimple_stmt_iterator cgsi
    6485                 :       65556 :             = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
    6486                 :       65556 :           gimple *def_temp;
    6487                 :       65556 :           tree var = vars;
    6488                 :       65556 :           i = vec_safe_length (*debug_args);
    6489                 :       90064 :           do
    6490                 :             :             {
    6491                 :       90064 :               tree vexpr = NULL_TREE;
    6492                 :       90064 :               i -= 2;
    6493                 :       90064 :               while (var != NULL_TREE
    6494                 :      118520 :                      && DECL_ABSTRACT_ORIGIN (var) != (**debug_args)[i])
    6495                 :       28456 :                 var = TREE_CHAIN (var);
    6496                 :       90064 :               if (var == NULL_TREE)
    6497                 :             :                 break;
    6498                 :       90064 :               tree parm = (**debug_args)[i];
    6499                 :       90064 :               if (tree parm_ddef = ssa_default_def (id.src_cfun, parm))
    6500                 :      118682 :                 if (tree *d
    6501                 :       59341 :                     = param_body_adjs->m_dead_ssa_debug_equiv.get (parm_ddef))
    6502                 :       20004 :                   vexpr = *d;
    6503                 :       90064 :               if (!vexpr)
    6504                 :             :                 {
    6505                 :       70060 :                   vexpr = build_debug_expr_decl (TREE_TYPE (parm));
    6506                 :             :                   /* FIXME: Is setting the mode really necessary? */
    6507                 :       70060 :                   SET_DECL_MODE (vexpr, DECL_MODE (parm));
    6508                 :             :                 }
    6509                 :       90064 :               def_temp = gimple_build_debug_bind (var, vexpr, NULL);
    6510                 :       90064 :               gsi_insert_before (&cgsi, def_temp, GSI_NEW_STMT);
    6511                 :       90064 :               def_temp = gimple_build_debug_source_bind (vexpr, parm, NULL);
    6512                 :       90064 :               gsi_insert_before (&cgsi, def_temp, GSI_NEW_STMT);
    6513                 :             :             }
    6514                 :       90064 :           while (i > len);
    6515                 :             :         }
    6516                 :             :     }
    6517                 :      129837 :   delete param_body_adjs;
    6518                 :      200581 :   free_dominance_info (CDI_DOMINATORS);
    6519                 :      200581 :   free_dominance_info (CDI_POST_DOMINATORS);
    6520                 :             : 
    6521                 :      200581 :   gcc_assert (!id.debug_stmts.exists ());
    6522                 :      200581 :   pop_cfun ();
    6523                 :      200581 :   input_location = saved_location;
    6524                 :      200581 :   return;
    6525                 :      200581 : }
    6526                 :             : 
    6527                 :             : /* EXP is CALL_EXPR present in a GENERIC expression tree.  Try to integrate
    6528                 :             :    the callee and return the inlined body on success.  */
    6529                 :             : 
    6530                 :             : tree
    6531                 :           0 : maybe_inline_call_in_expr (tree exp)
    6532                 :             : {
    6533                 :           0 :   tree fn = get_callee_fndecl (exp);
    6534                 :             : 
    6535                 :             :   /* We can only try to inline "const" functions.  */
    6536                 :           0 :   if (fn && TREE_READONLY (fn) && DECL_SAVED_TREE (fn))
    6537                 :             :     {
    6538                 :           0 :       call_expr_arg_iterator iter;
    6539                 :           0 :       copy_body_data id;
    6540                 :           0 :       tree param, arg, t;
    6541                 :           0 :       hash_map<tree, tree> decl_map;
    6542                 :             : 
    6543                 :             :       /* Remap the parameters.  */
    6544                 :           0 :       for (param = DECL_ARGUMENTS (fn), arg = first_call_expr_arg (exp, &iter);
    6545                 :           0 :            param;
    6546                 :           0 :            param = DECL_CHAIN (param), arg = next_call_expr_arg (&iter))
    6547                 :           0 :         decl_map.put (param, arg);
    6548                 :             : 
    6549                 :           0 :       memset (&id, 0, sizeof (id));
    6550                 :           0 :       id.src_fn = fn;
    6551                 :           0 :       id.dst_fn = current_function_decl;
    6552                 :           0 :       id.src_cfun = DECL_STRUCT_FUNCTION (fn);
    6553                 :           0 :       id.decl_map = &decl_map;
    6554                 :             : 
    6555                 :           0 :       id.copy_decl = copy_decl_no_change;
    6556                 :           0 :       id.transform_call_graph_edges = CB_CGE_DUPLICATE;
    6557                 :           0 :       id.transform_new_cfg = false;
    6558                 :           0 :       id.transform_return_to_modify = true;
    6559                 :           0 :       id.transform_parameter = true;
    6560                 :             : 
    6561                 :             :       /* Make sure not to unshare trees behind the front-end's back
    6562                 :             :          since front-end specific mechanisms may rely on sharing.  */
    6563                 :           0 :       id.regimplify = false;
    6564                 :           0 :       id.do_not_unshare = true;
    6565                 :             : 
    6566                 :             :       /* We're not inside any EH region.  */
    6567                 :           0 :       id.eh_lp_nr = 0;
    6568                 :             : 
    6569                 :           0 :       t = copy_tree_body (&id);
    6570                 :             : 
    6571                 :             :       /* We can only return something suitable for use in a GENERIC
    6572                 :             :          expression tree.  */
    6573                 :           0 :       if (TREE_CODE (t) == MODIFY_EXPR)
    6574                 :           0 :         return TREE_OPERAND (t, 1);
    6575                 :           0 :     }
    6576                 :             : 
    6577                 :             :    return NULL_TREE;
    6578                 :             : }
    6579                 :             : 
    6580                 :             : /* Duplicate a type, fields and all.  */
    6581                 :             : 
    6582                 :             : tree
    6583                 :         487 : build_duplicate_type (tree type)
    6584                 :             : {
    6585                 :         487 :   struct copy_body_data id;
    6586                 :             : 
    6587                 :         487 :   memset (&id, 0, sizeof (id));
    6588                 :         487 :   id.src_fn = current_function_decl;
    6589                 :         487 :   id.dst_fn = current_function_decl;
    6590                 :         487 :   id.src_cfun = cfun;
    6591                 :         487 :   id.decl_map = new hash_map<tree, tree>;
    6592                 :         487 :   id.debug_map = NULL;
    6593                 :         487 :   id.copy_decl = copy_decl_no_change;
    6594                 :             : 
    6595                 :         487 :   type = remap_type_1 (type, &id);
    6596                 :             : 
    6597                 :         974 :   delete id.decl_map;
    6598                 :         487 :   if (id.debug_map)
    6599                 :           0 :     delete id.debug_map;
    6600                 :             : 
    6601                 :         487 :   TYPE_CANONICAL (type) = type;
    6602                 :             : 
    6603                 :         487 :   return type;
    6604                 :             : }
    6605                 :             : 
    6606                 :             : /* Unshare the entire DECL_SAVED_TREE of FN and return the remapped
    6607                 :             :    parameters and RESULT_DECL in PARMS and RESULT.  Used by C++ constexpr
    6608                 :             :    evaluation.  */
    6609                 :             : 
    6610                 :             : tree
    6611                 :    15418396 : copy_fn (tree fn, tree& parms, tree& result)
    6612                 :             : {
    6613                 :    15418396 :   copy_body_data id;
    6614                 :    15418396 :   tree param;
    6615                 :    15418396 :   hash_map<tree, tree> decl_map;
    6616                 :             : 
    6617                 :    15418396 :   tree *p = &parms;
    6618                 :    15418396 :   *p = NULL_TREE;
    6619                 :             : 
    6620                 :    15418396 :   memset (&id, 0, sizeof (id));
    6621                 :    15418396 :   id.src_fn = fn;
    6622                 :    15418396 :   id.dst_fn = current_function_decl;
    6623                 :    15418396 :   id.src_cfun = DECL_STRUCT_FUNCTION (fn);
    6624                 :    15418396 :   id.decl_map = &decl_map;
    6625                 :             : 
    6626                 :    58897752 :   id.copy_decl = [] (tree decl, copy_body_data *id)
    6627                 :             :     {
    6628                 :    43479356 :       if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == CONST_DECL)
    6629                 :             :         /* Don't make copies of local types or injected enumerators,
    6630                 :             :            the C++ constexpr evaluator doesn't need them and they
    6631                 :             :            confuse modules streaming.  */
    6632                 :             :         return decl;
    6633                 :    42468606 :       return copy_decl_no_change (decl, id);
    6634                 :             :     };
    6635                 :    15418396 :   id.transform_call_graph_edges = CB_CGE_DUPLICATE;
    6636                 :    15418396 :   id.transform_new_cfg = false;
    6637                 :    15418396 :   id.transform_return_to_modify = false;
    6638                 :    15418396 :   id.transform_parameter = true;
    6639                 :             : 
    6640                 :             :   /* Make sure not to unshare trees behind the front-end's back
    6641                 :             :      since front-end specific mechanisms may rely on sharing.  */
    6642                 :    15418396 :   id.regimplify = false;
    6643                 :    15418396 :   id.do_not_unshare = true;
    6644                 :    15418396 :   id.do_not_fold = true;
    6645                 :             : 
    6646                 :             :   /* We're not inside any EH region.  */
    6647                 :    15418396 :   id.eh_lp_nr = 0;
    6648                 :             : 
    6649                 :             :   /* Remap the parameters and result and return them to the caller.  */
    6650                 :    15418396 :   for (param = DECL_ARGUMENTS (fn);
    6651                 :    34864830 :        param;
    6652                 :    19446434 :        param = DECL_CHAIN (param))
    6653                 :             :     {
    6654                 :    19446434 :       *p = remap_decl (param, &id);
    6655                 :    19446434 :       p = &DECL_CHAIN (*p);
    6656                 :             :     }
    6657                 :             : 
    6658                 :    15418396 :   if (DECL_RESULT (fn))
    6659                 :    15418396 :     result = remap_decl (DECL_RESULT (fn), &id);
    6660                 :             :   else
    6661                 :           0 :     result = NULL_TREE;
    6662                 :             : 
    6663                 :    15418396 :   return copy_tree_body (&id);
    6664                 :    15418396 : }
        

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.