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