1 /* Manipulation of formal and actual parameters of functions and function
2    calls.
3    Copyright (C) 2017-2020 Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 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 "tree.h"
26 #include "gimple.h"
27 #include "ssa.h"
28 #include "cgraph.h"
29 #include "fold-const.h"
30 #include "tree-eh.h"
31 #include "stor-layout.h"
32 #include "gimplify.h"
33 #include "gimple-iterator.h"
34 #include "gimplify-me.h"
35 #include "tree-cfg.h"
36 #include "tree-dfa.h"
37 #include "ipa-param-manipulation.h"
38 #include "print-tree.h"
39 #include "gimple-pretty-print.h"
40 #include "builtins.h"
41 #include "tree-ssa.h"
42 #include "tree-inline.h"
43 
44 
45 /* Actual prefixes of different newly synthetized parameters.  Keep in sync
46    with IPA_PARAM_PREFIX_* defines.  */
47 
48 static const char *ipa_param_prefixes[IPA_PARAM_PREFIX_COUNT]
49   = {"SYNTH",
50      "ISRA",
51      "simd",
52      "mask"};
53 
54 /* Names of parameters for dumping.  Keep in sync with enum ipa_parm_op.  */
55 
56 static const char *ipa_param_op_names[IPA_PARAM_PREFIX_COUNT]
57   = {"IPA_PARAM_OP_UNDEFINED",
58      "IPA_PARAM_OP_COPY",
59      "IPA_PARAM_OP_NEW",
60      "IPA_PARAM_OP_SPLIT"};
61 
62 /* Fill an empty vector ARGS with PARM_DECLs representing formal parameters of
63    FNDECL.  The function should not be called during LTO WPA phase except for
64    thunks (or functions with bodies streamed in). */
65 
66 void
push_function_arg_decls(vec<tree> * args,tree fndecl)67 push_function_arg_decls (vec<tree> *args, tree fndecl)
68 {
69   int count;
70   tree parm;
71 
72   /* Safety check that we do not attempt to use the function in WPA, except
73      when the function is a thunk and then we have DECL_ARGUMENTS or when we
74      have already explicitely loaded its body.  */
75   gcc_assert (!flag_wpa
76 	      || DECL_ARGUMENTS (fndecl)
77 	      || gimple_has_body_p (fndecl));
78   count = 0;
79   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
80     count++;
81 
82   args->reserve_exact (count);
83   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
84     args->quick_push (parm);
85 }
86 
87 /* Fill an empty vector TYPES with trees representing formal parameters of
88    function type FNTYPE.  */
89 
90 void
push_function_arg_types(vec<tree> * types,tree fntype)91 push_function_arg_types (vec<tree> *types, tree fntype)
92 {
93   int count = 0;
94   tree t;
95 
96   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
97     count++;
98 
99   types->reserve_exact (count);
100   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
101     types->quick_push (TREE_VALUE (t));
102 }
103 
104 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
105    friendly way, assuming they are meant to be applied to FNDECL.  */
106 
107 void
ipa_dump_adjusted_parameters(FILE * f,vec<ipa_adjusted_param,va_gc> * adj_params)108 ipa_dump_adjusted_parameters (FILE *f,
109 			      vec<ipa_adjusted_param, va_gc> *adj_params)
110 {
111   unsigned i, len = vec_safe_length (adj_params);
112   bool first = true;
113 
114   fprintf (f, "    IPA adjusted parameters: ");
115   for (i = 0; i < len; i++)
116     {
117       struct ipa_adjusted_param *apm;
118       apm = &(*adj_params)[i];
119 
120       if (!first)
121 	fprintf (f, "                             ");
122       else
123 	first = false;
124 
125       fprintf (f, "%i. %s %s", i, ipa_param_op_names[apm->op],
126 	       apm->prev_clone_adjustment ? "prev_clone_adjustment " : "");
127       switch (apm->op)
128 	{
129 	case IPA_PARAM_OP_UNDEFINED:
130 	  break;
131 
132 	case IPA_PARAM_OP_COPY:
133 	  fprintf (f, ", base_index: %u", apm->base_index);
134 	  fprintf (f, ", prev_clone_index: %u", apm->prev_clone_index);
135 	  break;
136 
137 	case IPA_PARAM_OP_SPLIT:
138 	  fprintf (f, ", offset: %u", apm->unit_offset);
139 	  /* fall-through */
140 	case IPA_PARAM_OP_NEW:
141 	  fprintf (f, ", base_index: %u", apm->base_index);
142 	  fprintf (f, ", prev_clone_index: %u", apm->prev_clone_index);
143 	  print_node_brief (f, ", type: ", apm->type, 0);
144 	  print_node_brief (f, ", alias type: ", apm->alias_ptr_type, 0);
145 	  fprintf (f, " prefix: %s",
146 		   ipa_param_prefixes[apm->param_prefix_index]);
147 	  if (apm->reverse)
148 	    fprintf (f, ", reverse-sso");
149 	  break;
150 	}
151       fprintf (f, "\n");
152     }
153 }
154 
155 /* Fill NEW_TYPES with types of a function after its current OTYPES have been
156    modified as described in ADJ_PARAMS.  When USE_PREV_INDICES is true, use
157    prev_clone_index from ADJ_PARAMS as opposed to base_index when the parameter
158    is false.  */
159 
160 static void
fill_vector_of_new_param_types(vec<tree> * new_types,vec<tree> * otypes,vec<ipa_adjusted_param,va_gc> * adj_params,bool use_prev_indices)161 fill_vector_of_new_param_types (vec<tree> *new_types, vec<tree> *otypes,
162 				vec<ipa_adjusted_param, va_gc> *adj_params,
163 				bool use_prev_indices)
164 {
165   unsigned adj_len = vec_safe_length (adj_params);
166   new_types->reserve_exact (adj_len);
167   for (unsigned i = 0; i < adj_len ; i++)
168     {
169       ipa_adjusted_param *apm = &(*adj_params)[i];
170       if (apm->op == IPA_PARAM_OP_COPY)
171 	{
172 	  unsigned index
173 	    = use_prev_indices ? apm->prev_clone_index : apm->base_index;
174 	  /* The following needs to be handled gracefully because of type
175 	     mismatches.  This happens with LTO but apparently also in Fortran
176 	     with -fcoarray=lib -O2 -lcaf_single -latomic.  */
177 	  if (index >= otypes->length ())
178 	    continue;
179 	  new_types->quick_push ((*otypes)[index]);
180 	}
181       else if (apm->op == IPA_PARAM_OP_NEW
182 	       || apm->op == IPA_PARAM_OP_SPLIT)
183 	{
184 	  tree ntype = apm->type;
185 	  if (is_gimple_reg_type (ntype)
186 	      && TYPE_MODE (ntype) != BLKmode)
187 	    {
188 	      unsigned malign = GET_MODE_ALIGNMENT (TYPE_MODE (ntype));
189 	      if (TYPE_ALIGN (ntype) != malign)
190 		ntype = build_aligned_type (ntype, malign);
191 	    }
192 	  new_types->quick_push (ntype);
193 	}
194       else
195 	gcc_unreachable ();
196     }
197 }
198 
199 /* Build and return a function type just like ORIG_TYPE but with parameter
200    types given in NEW_PARAM_TYPES - which can be NULL if, but only if,
201    ORIG_TYPE itself has NULL TREE_ARG_TYPEs.  If METHOD2FUNC is true, also make
202    it a FUNCTION_TYPE instead of FUNCTION_TYPE.  */
203 
204 static tree
build_adjusted_function_type(tree orig_type,vec<tree> * new_param_types,bool method2func,bool skip_return)205 build_adjusted_function_type (tree orig_type, vec<tree> *new_param_types,
206 			      bool method2func, bool skip_return)
207 {
208   tree new_arg_types = NULL;
209   if (TYPE_ARG_TYPES (orig_type))
210     {
211       gcc_checking_assert (new_param_types);
212       bool last_parm_void = (TREE_VALUE (tree_last (TYPE_ARG_TYPES (orig_type)))
213 			     == void_type_node);
214       unsigned len = new_param_types->length ();
215       for (unsigned i = 0; i < len; i++)
216 	new_arg_types = tree_cons (NULL_TREE, (*new_param_types)[i],
217 				   new_arg_types);
218 
219       tree new_reversed = nreverse (new_arg_types);
220       if (last_parm_void)
221 	{
222 	  if (new_reversed)
223 	    TREE_CHAIN (new_arg_types) = void_list_node;
224 	  else
225 	    new_reversed = void_list_node;
226 	}
227       new_arg_types = new_reversed;
228     }
229 
230   /* Use build_distinct_type_copy to preserve as much as possible from original
231      type (debug info, attribute lists etc.).  The one exception is
232      METHOD_TYPEs which must have THIS argument and when we are asked to remove
233      it, we need to build new FUNCTION_TYPE instead.  */
234   tree new_type = NULL;
235   if (method2func)
236     {
237       tree ret_type;
238       if (skip_return)
239 	ret_type = void_type_node;
240       else
241 	ret_type = TREE_TYPE (orig_type);
242 
243       new_type
244 	= build_distinct_type_copy (build_function_type (ret_type,
245 							 new_arg_types));
246       TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
247     }
248   else
249     {
250       new_type = build_distinct_type_copy (orig_type);
251       TYPE_ARG_TYPES (new_type) = new_arg_types;
252       if (skip_return)
253 	TREE_TYPE (new_type) = void_type_node;
254     }
255 
256   return new_type;
257 }
258 
259 /* Return the maximum index in any IPA_PARAM_OP_COPY adjustment or -1 if there
260    is none.  */
261 
262 int
get_max_base_index()263 ipa_param_adjustments::get_max_base_index ()
264 {
265   unsigned adj_len = vec_safe_length (m_adj_params);
266   int max_index = -1;
267   for (unsigned i = 0; i < adj_len ; i++)
268     {
269       ipa_adjusted_param *apm = &(*m_adj_params)[i];
270       if (apm->op == IPA_PARAM_OP_COPY
271 	  && max_index < apm->base_index)
272 	max_index = apm->base_index;
273     }
274   return max_index;
275 }
276 
277 
278 /* Fill SURVIVING_PARAMS with an array of bools where each one says whether a
279    parameter that originally was at that position still survives in the given
280    clone or is removed/replaced.  If the final array is smaller than an index
281    of an original parameter, that parameter also did not survive.  That a
282    parameter survives does not mean it has the same index as before.  */
283 
284 void
get_surviving_params(vec<bool> * surviving_params)285 ipa_param_adjustments::get_surviving_params (vec<bool> *surviving_params)
286 {
287   unsigned adj_len = vec_safe_length (m_adj_params);
288   int max_index = get_max_base_index ();
289 
290   if (max_index < 0)
291     return;
292   surviving_params->reserve_exact (max_index + 1);
293   surviving_params->quick_grow_cleared (max_index + 1);
294   for (unsigned i = 0; i < adj_len ; i++)
295     {
296       ipa_adjusted_param *apm = &(*m_adj_params)[i];
297       if (apm->op == IPA_PARAM_OP_COPY)
298 	(*surviving_params)[apm->base_index] = true;
299     }
300 }
301 
302 /* Fill NEW_INDICES with new indices of each surviving parameter or -1 for
303    those which do not survive.  Any parameter outside of lenght of the vector
304    does not survive.  There is currently no support for a parameter to be
305    copied to two distinct new parameters.  */
306 
307 void
get_updated_indices(vec<int> * new_indices)308 ipa_param_adjustments::get_updated_indices (vec<int> *new_indices)
309 {
310   unsigned adj_len = vec_safe_length (m_adj_params);
311   int max_index = get_max_base_index ();
312 
313   if (max_index < 0)
314     return;
315   unsigned res_len = max_index + 1;
316   new_indices->reserve_exact (res_len);
317   for (unsigned i = 0; i < res_len ; i++)
318     new_indices->quick_push (-1);
319   for (unsigned i = 0; i < adj_len ; i++)
320     {
321       ipa_adjusted_param *apm = &(*m_adj_params)[i];
322       if (apm->op == IPA_PARAM_OP_COPY)
323 	(*new_indices)[apm->base_index] = i;
324     }
325 }
326 
327 /* Return the original index for the given new parameter index.  Return a
328    negative number if not available.  */
329 
330 int
get_original_index(int newidx)331 ipa_param_adjustments::get_original_index (int newidx)
332 {
333   const ipa_adjusted_param *adj = &(*m_adj_params)[newidx];
334   if (adj->op != IPA_PARAM_OP_COPY)
335     return -1;
336   return adj->base_index;
337 }
338 
339 /* Return true if the first parameter (assuming there was one) survives the
340    transformation intact and remains the first one.  */
341 
342 bool
first_param_intact_p()343 ipa_param_adjustments::first_param_intact_p ()
344 {
345   return (!vec_safe_is_empty (m_adj_params)
346 	  && (*m_adj_params)[0].op == IPA_PARAM_OP_COPY
347 	  && (*m_adj_params)[0].base_index == 0);
348 }
349 
350 /* Return true if we have to change what has formerly been a method into a
351    function.  */
352 
353 bool
method2func_p(tree orig_type)354 ipa_param_adjustments::method2func_p (tree orig_type)
355 {
356   return ((TREE_CODE (orig_type) == METHOD_TYPE) && !first_param_intact_p ());
357 }
358 
359 /* Given function type OLD_TYPE, return a new type derived from it after
360    performing all atored modifications.  TYPE_ORIGINAL_P should be true when
361    OLD_TYPE refers to the type before any IPA transformations, as opposed to a
362    type that can be an intermediate one in between various IPA
363    transformations.  */
364 
365 tree
build_new_function_type(tree old_type,bool type_original_p)366 ipa_param_adjustments::build_new_function_type (tree old_type,
367 						bool type_original_p)
368 {
369   auto_vec<tree,16> new_param_types, *new_param_types_p;
370   if (prototype_p (old_type))
371     {
372       auto_vec<tree, 16> otypes;
373       push_function_arg_types (&otypes, old_type);
374       fill_vector_of_new_param_types (&new_param_types, &otypes, m_adj_params,
375 				      !type_original_p);
376       new_param_types_p = &new_param_types;
377     }
378   else
379     new_param_types_p = NULL;
380 
381   return build_adjusted_function_type (old_type, new_param_types_p,
382 				       method2func_p (old_type), m_skip_return);
383 }
384 
385 /* Build variant of function decl ORIG_DECL which has no return value if
386    M_SKIP_RETURN is true and, if ORIG_DECL's types or parameters is known, has
387    this type adjusted as indicated in M_ADJ_PARAMS. Arguments from
388    DECL_ARGUMENTS list are not processed now, since they are linked by
389    TREE_CHAIN directly and not accessible in LTO during WPA.  The caller is
390    responsible for eliminating them when clones are properly materialized.  */
391 
392 tree
adjust_decl(tree orig_decl)393 ipa_param_adjustments::adjust_decl (tree orig_decl)
394 {
395   tree new_decl = copy_node (orig_decl);
396   tree orig_type = TREE_TYPE (orig_decl);
397   if (prototype_p (orig_type)
398       || (m_skip_return && !VOID_TYPE_P (TREE_TYPE (orig_type))))
399     {
400       tree new_type = build_new_function_type (orig_type, false);
401       TREE_TYPE (new_decl) = new_type;
402     }
403   if (method2func_p (orig_type))
404     DECL_VINDEX (new_decl) = NULL_TREE;
405 
406   /* When signature changes, we need to clear builtin info.  */
407   if (fndecl_built_in_p (new_decl))
408     set_decl_built_in_function (new_decl, NOT_BUILT_IN, 0);
409 
410   DECL_VIRTUAL_P (new_decl) = 0;
411   DECL_LANG_SPECIFIC (new_decl) = NULL;
412 
413   /* Drop MALLOC attribute for a void function.  */
414   if (m_skip_return)
415     DECL_IS_MALLOC (new_decl) = 0;
416 
417   return new_decl;
418 }
419 
420 /* Wrapper around get_base_ref_and_offset for cases interesting for IPA-SRA
421    transformations.  Return true if EXPR has an interesting form and fill in
422    *BASE_P and *UNIT_OFFSET_P with the appropriate info.  */
423 
424 static bool
isra_get_ref_base_and_offset(tree expr,tree * base_p,unsigned * unit_offset_p)425 isra_get_ref_base_and_offset (tree expr, tree *base_p, unsigned *unit_offset_p)
426 {
427   HOST_WIDE_INT offset, size;
428   bool reverse;
429   tree base
430     = get_ref_base_and_extent_hwi (expr, &offset, &size, &reverse);
431   if (!base || size < 0)
432     return false;
433 
434   if ((offset % BITS_PER_UNIT) != 0)
435     return false;
436 
437   if (TREE_CODE (base) == MEM_REF)
438     {
439       poly_int64 plmoff = mem_ref_offset (base).force_shwi ();
440       HOST_WIDE_INT moff;
441       bool is_cst = plmoff.is_constant (&moff);
442       if (!is_cst)
443 	return false;
444       offset += moff * BITS_PER_UNIT;
445       base = TREE_OPERAND (base, 0);
446     }
447 
448   if (offset < 0 || (offset / BITS_PER_UNIT) > UINT_MAX)
449     return false;
450 
451   *base_p = base;
452   *unit_offset_p = offset / BITS_PER_UNIT;
453   return true;
454 }
455 
456 /* Return true if EXPR describes a transitive split (i.e. one that happened for
457    both the caller and the callee) as recorded in PERFORMED_SPLITS.  In that
458    case, store index of the respective record in PERFORMED_SPLITS into
459    *SM_IDX_P and the unit offset from all handled components in EXPR into
460    *UNIT_OFFSET_P.  */
461 
462 static bool
transitive_split_p(vec<ipa_param_performed_split,va_gc> * performed_splits,tree expr,unsigned * sm_idx_p,unsigned * unit_offset_p)463 transitive_split_p (vec<ipa_param_performed_split, va_gc> *performed_splits,
464 		    tree expr, unsigned *sm_idx_p, unsigned *unit_offset_p)
465 {
466   tree base;
467   if (!isra_get_ref_base_and_offset (expr, &base, unit_offset_p))
468     return false;
469 
470   if (TREE_CODE (base) == SSA_NAME)
471     {
472       base = SSA_NAME_VAR (base);
473       if (!base)
474 	return false;
475     }
476 
477   unsigned len = vec_safe_length (performed_splits);
478   for (unsigned i = 0 ; i < len; i++)
479     {
480       ipa_param_performed_split *sm = &(*performed_splits)[i];
481       if (sm->dummy_decl == base)
482 	{
483 	  *sm_idx_p = i;
484 	  return true;
485 	}
486     }
487   return false;
488 }
489 
490 /* Structure to hold declarations representing transitive IPA-SRA splits.  In
491    essence, if we need to pass UNIT_OFFSET of a parameter which originally has
492    number BASE_INDEX, we should pass down REPL.  */
493 
494 struct transitive_split_map
495 {
496   tree repl;
497   unsigned base_index;
498   unsigned unit_offset;
499 };
500 
501 /* If call STMT contains any parameters representing transitive splits as
502    described by PERFORMED_SPLITS, return the number of extra parameters that
503    were addded during clone materialization and fill in INDEX_MAP with adjusted
504    indices of corresponding original parameters and TRANS_MAP with description
505    of all transitive replacement descriptions.  Otherwise return zero. */
506 
507 static unsigned
init_transitive_splits(vec<ipa_param_performed_split,va_gc> * performed_splits,gcall * stmt,vec<unsigned> * index_map,auto_vec<transitive_split_map> * trans_map)508 init_transitive_splits (vec<ipa_param_performed_split, va_gc> *performed_splits,
509 			gcall *stmt, vec <unsigned> *index_map,
510 			auto_vec <transitive_split_map> *trans_map)
511 {
512   unsigned phony_arguments = 0;
513   unsigned stmt_idx = 0, base_index = 0;
514   unsigned nargs = gimple_call_num_args (stmt);
515   while (stmt_idx < nargs)
516     {
517       unsigned unit_offset_delta;
518       tree base_arg = gimple_call_arg (stmt, stmt_idx);
519 
520       if (phony_arguments > 0)
521 	index_map->safe_push (stmt_idx);
522 
523       unsigned sm_idx;
524       stmt_idx++;
525       if (transitive_split_p (performed_splits, base_arg, &sm_idx,
526 			      &unit_offset_delta))
527 	{
528 	  if (phony_arguments == 0)
529 	    /* We have optimistically avoided constructing index_map do far but
530 	       now it is clear it will be necessary, so let's create the easy
531 	       bit we skipped until now.  */
532 	    for (unsigned k = 0; k < stmt_idx; k++)
533 	      index_map->safe_push (k);
534 
535 	  tree dummy = (*performed_splits)[sm_idx].dummy_decl;
536 	  for (unsigned j = sm_idx; j < performed_splits->length (); j++)
537 	    {
538 	      ipa_param_performed_split *caller_split
539 		= &(*performed_splits)[j];
540 	      if (caller_split->dummy_decl != dummy)
541 		break;
542 
543 	      tree arg = gimple_call_arg (stmt, stmt_idx);
544 	      struct transitive_split_map tsm;
545 	      tsm.repl = arg;
546 	      tsm.base_index = base_index;
547 	      if (caller_split->unit_offset >= unit_offset_delta)
548 		{
549 		  tsm.unit_offset
550 		    = (caller_split->unit_offset - unit_offset_delta);
551 		  trans_map->safe_push (tsm);
552 		}
553 
554 	      phony_arguments++;
555 	      stmt_idx++;
556 	    }
557 	}
558       base_index++;
559     }
560   return phony_arguments;
561 }
562 
563 /* Modify actual arguments of a function call in statement STMT, assuming it
564    calls CALLEE_DECL.  CALLER_ADJ must be the description of parameter
565    adjustments of the caller or NULL if there are none.  Return the new
566    statement that replaced the old one.  When invoked, cfun and
567    current_function_decl have to be set to the caller.  */
568 
569 gcall *
modify_call(gcall * stmt,vec<ipa_param_performed_split,va_gc> * performed_splits,tree callee_decl,bool update_references)570 ipa_param_adjustments::modify_call (gcall *stmt,
571 				    vec<ipa_param_performed_split,
572 				        va_gc> *performed_splits,
573 				    tree callee_decl, bool update_references)
574 {
575   unsigned len = vec_safe_length (m_adj_params);
576   auto_vec<tree, 16> vargs (len);
577   tree old_decl = gimple_call_fndecl (stmt);
578   unsigned old_nargs = gimple_call_num_args (stmt);
579   auto_vec<bool, 16> kept (old_nargs);
580   kept.quick_grow_cleared (old_nargs);
581 
582   auto_vec <unsigned, 16> index_map;
583   auto_vec <transitive_split_map> trans_map;
584   bool transitive_remapping = false;
585 
586   if (performed_splits)
587     {
588       unsigned removed = init_transitive_splits (performed_splits,
589 						 stmt, &index_map, &trans_map);
590       if (removed > 0)
591 	{
592 	  transitive_remapping = true;
593 	  old_nargs -= removed;
594 	}
595     }
596 
597   cgraph_node *current_node = cgraph_node::get (current_function_decl);
598   if (update_references)
599     current_node->remove_stmt_references (stmt);
600 
601   gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
602   gimple_stmt_iterator prev_gsi = gsi;
603   gsi_prev (&prev_gsi);
604   for (unsigned i = 0; i < len; i++)
605     {
606       ipa_adjusted_param *apm = &(*m_adj_params)[i];
607       if (apm->op == IPA_PARAM_OP_COPY)
608 	{
609 	  unsigned index = apm->base_index;
610 	  if (index >= old_nargs)
611 	    /* Can happen if the original call has argument mismatch,
612 	       ignore.  */
613 	    continue;
614 	  if (transitive_remapping)
615 	    index = index_map[apm->base_index];
616 
617 	  tree arg = gimple_call_arg (stmt, index);
618 
619 	  vargs.quick_push (arg);
620 	  kept[index] = true;
621 	  continue;
622 	}
623 
624       /* At the moment the only user of IPA_PARAM_OP_NEW modifies calls itself.
625 	 If we ever want to support it during WPA IPA stage, we'll need a
626 	 mechanism to call into the IPA passes that introduced them.  Currently
627 	 we simply mandate that IPA infrastructure understands all argument
628 	 modifications.  Remember, edge redirection/modification is done only
629 	 once, not in steps for each pass modifying the callee like clone
630 	 materialization.  */
631       gcc_assert (apm->op == IPA_PARAM_OP_SPLIT);
632 
633       /* We have to handle transitive changes differently using the maps we
634 	 have created before.  So look into them first.  */
635       tree repl = NULL_TREE;
636       for (unsigned j = 0; j < trans_map.length (); j++)
637 	if (trans_map[j].base_index == apm->base_index
638 	    && trans_map[j].unit_offset == apm->unit_offset)
639 	  {
640 	    repl = trans_map[j].repl;
641 	    break;
642 	  }
643       if (repl)
644 	{
645 	  vargs.quick_push (repl);
646 	  continue;
647 	}
648 
649       unsigned index = apm->base_index;
650       if (index >= old_nargs)
651 	/* Can happen if the original call has argument mismatch, ignore.  */
652 	continue;
653       if (transitive_remapping)
654 	index = index_map[apm->base_index];
655       tree base = gimple_call_arg (stmt, index);
656 
657       /* We create a new parameter out of the value of the old one, we can
658 	 do the following kind of transformations:
659 
660 	 - A scalar passed by reference, potentially as a part of a larger
661 	 aggregate, is converted to a scalar passed by value.
662 
663 	 - A part of an aggregate is passed instead of the whole aggregate.  */
664 
665       location_t loc = gimple_location (stmt);
666       tree off;
667       bool deref_base = false;
668       unsigned int deref_align = 0;
669       if (TREE_CODE (base) != ADDR_EXPR
670 	  && is_gimple_reg_type (TREE_TYPE (base)))
671 	{
672 	  /* Detect type mismatches in calls in invalid programs and make a
673 	     poor attempt to gracefully convert them so that we don't ICE.  */
674 	  if (!POINTER_TYPE_P (TREE_TYPE (base)))
675 	    base = force_value_to_type (ptr_type_node, base);
676 
677 	  off = build_int_cst (apm->alias_ptr_type, apm->unit_offset);
678 	}
679       else
680 	{
681 	  bool addrof;
682 	  if (TREE_CODE (base) == ADDR_EXPR)
683 	    {
684 	      base = TREE_OPERAND (base, 0);
685 	      addrof = true;
686 	    }
687 	  else
688 	    addrof = false;
689 
690 	  tree prev_base = base;
691 	  poly_int64 base_offset;
692 	  base = get_addr_base_and_unit_offset (base, &base_offset);
693 
694 	  /* Aggregate arguments can have non-invariant addresses.  */
695 	  if (!base)
696 	    {
697 	      base = build_fold_addr_expr (prev_base);
698 	      off = build_int_cst (apm->alias_ptr_type, apm->unit_offset);
699 	    }
700 	  else if (TREE_CODE (base) == MEM_REF)
701 	    {
702 	      if (!addrof)
703 		{
704 		  deref_base = true;
705 		  deref_align = TYPE_ALIGN (TREE_TYPE (base));
706 		}
707 	      off = build_int_cst (apm->alias_ptr_type,
708 				   base_offset + apm->unit_offset);
709 	      off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
710 				     off);
711 	      base = TREE_OPERAND (base, 0);
712 	    }
713 	  else
714 	    {
715 	      off = build_int_cst (apm->alias_ptr_type,
716 				   base_offset + apm->unit_offset);
717 	      base = build_fold_addr_expr (base);
718 	    }
719 	}
720 
721       tree type = apm->type;
722       unsigned int align;
723       unsigned HOST_WIDE_INT misalign;
724 
725       if (deref_base)
726 	{
727 	  align = deref_align;
728 	  misalign = 0;
729 	}
730       else
731 	{
732 	  get_pointer_alignment_1 (base, &align, &misalign);
733 	  /* All users must make sure that we can be optimistic when it
734 	     comes to alignment in this case (by inspecting the final users
735 	     of these new parameters).  */
736 	  if (TYPE_ALIGN (type) > align)
737 	    align = TYPE_ALIGN (type);
738 	}
739       misalign
740 	+= (offset_int::from (wi::to_wide (off), SIGNED).to_short_addr ()
741 	    * BITS_PER_UNIT);
742       misalign = misalign & (align - 1);
743       if (misalign != 0)
744 	align = least_bit_hwi (misalign);
745       if (align < TYPE_ALIGN (type))
746 	type = build_aligned_type (type, align);
747       base = force_gimple_operand_gsi (&gsi, base,
748 				       true, NULL, true, GSI_SAME_STMT);
749       tree expr = fold_build2_loc (loc, MEM_REF, type, base, off);
750       REF_REVERSE_STORAGE_ORDER (expr) = apm->reverse;
751       /* If expr is not a valid gimple call argument emit
752 	 a load into a temporary.  */
753       if (is_gimple_reg_type (TREE_TYPE (expr)))
754 	{
755 	  gimple *tem = gimple_build_assign (NULL_TREE, expr);
756 	  if (gimple_in_ssa_p (cfun))
757 	    {
758 	      gimple_set_vuse (tem, gimple_vuse (stmt));
759 	      expr = make_ssa_name (TREE_TYPE (expr), tem);
760 	    }
761 	  else
762 	    expr = create_tmp_reg (TREE_TYPE (expr));
763 	  gimple_assign_set_lhs (tem, expr);
764 	  gsi_insert_before (&gsi, tem, GSI_SAME_STMT);
765 	}
766       vargs.quick_push (expr);
767     }
768 
769   if (m_always_copy_start >= 0)
770     for (unsigned i = m_always_copy_start; i < old_nargs; i++)
771       vargs.safe_push (gimple_call_arg (stmt, i));
772 
773   /* For optimized away parameters, add on the caller side
774      before the call
775      DEBUG D#X => parm_Y(D)
776      stmts and associate D#X with parm in decl_debug_args_lookup
777      vector to say for debug info that if parameter parm had been passed,
778      it would have value parm_Y(D).  */
779   if (MAY_HAVE_DEBUG_BIND_STMTS && old_decl && callee_decl)
780     {
781       vec<tree, va_gc> **debug_args = NULL;
782       unsigned i = 0;
783       for (tree old_parm = DECL_ARGUMENTS (old_decl);
784 	   old_parm && i < old_nargs && ((int) i) < m_always_copy_start;
785 	   old_parm = DECL_CHAIN (old_parm), i++)
786 	{
787 	  if (!is_gimple_reg (old_parm) || kept[i])
788 	    continue;
789 	  tree origin = DECL_ORIGIN (old_parm);
790 	  tree arg;
791 	  if (transitive_remapping)
792 	    arg = gimple_call_arg (stmt, index_map[i]);
793 	  else
794 	    arg = gimple_call_arg (stmt, i);
795 
796 	  if (!useless_type_conversion_p (TREE_TYPE (origin), TREE_TYPE (arg)))
797 	    {
798 	      if (!fold_convertible_p (TREE_TYPE (origin), arg))
799 		continue;
800 	      tree rhs1;
801 	      if (TREE_CODE (arg) == SSA_NAME
802 		  && gimple_assign_cast_p (SSA_NAME_DEF_STMT (arg))
803 		  && (rhs1
804 		      = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (arg)))
805 		  && useless_type_conversion_p (TREE_TYPE (origin),
806 						TREE_TYPE (rhs1)))
807 		arg = rhs1;
808 	      else
809 		arg = fold_convert_loc (gimple_location (stmt),
810 					TREE_TYPE (origin), arg);
811 	    }
812 	  if (debug_args == NULL)
813 	    debug_args = decl_debug_args_insert (callee_decl);
814 	  unsigned int ix;
815 	  tree ddecl = NULL_TREE;
816 	  for (ix = 0; vec_safe_iterate (*debug_args, ix, &ddecl); ix += 2)
817 	    if (ddecl == origin)
818 	      {
819 		ddecl = (**debug_args)[ix + 1];
820 		break;
821 	      }
822 	  if (ddecl == NULL)
823 	    {
824 	      ddecl = make_node (DEBUG_EXPR_DECL);
825 	      DECL_ARTIFICIAL (ddecl) = 1;
826 	      TREE_TYPE (ddecl) = TREE_TYPE (origin);
827 	      SET_DECL_MODE (ddecl, DECL_MODE (origin));
828 
829 	      vec_safe_push (*debug_args, origin);
830 	      vec_safe_push (*debug_args, ddecl);
831 	    }
832 	  gimple *def_temp = gimple_build_debug_bind (ddecl,
833 						      unshare_expr (arg), stmt);
834 	  gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
835 	}
836     }
837 
838   if (dump_file && (dump_flags & TDF_DETAILS))
839     {
840       fprintf (dump_file, "replacing stmt:");
841       print_gimple_stmt (dump_file, gsi_stmt (gsi), 0);
842     }
843 
844   gcall *new_stmt = gimple_build_call_vec (callee_decl, vargs);
845 
846   if (tree lhs = gimple_call_lhs (stmt))
847     {
848       if (!m_skip_return)
849 	gimple_call_set_lhs (new_stmt, lhs);
850       else if (TREE_CODE (lhs) == SSA_NAME)
851 	{
852 	  /* LHS should now by a default-def SSA.  Unfortunately default-def
853 	     SSA_NAMEs need a backing variable (or at least some code examining
854 	     SSAs assumes it is non-NULL).  So we either have to re-use the
855 	     decl we have at hand or introdice a new one.  */
856 	  tree repl = create_tmp_var (TREE_TYPE (lhs), "removed_return");
857 	  repl = get_or_create_ssa_default_def (cfun, repl);
858 	  SSA_NAME_IS_DEFAULT_DEF (repl) = true;
859 	  imm_use_iterator ui;
860 	  use_operand_p use_p;
861 	  gimple *using_stmt;
862 	  FOR_EACH_IMM_USE_STMT (using_stmt, ui, lhs)
863 	    {
864 	      FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
865 		{
866 		  SET_USE (use_p, repl);
867 		}
868 	      update_stmt (using_stmt);
869 	    }
870 	}
871     }
872 
873   gimple_set_block (new_stmt, gimple_block (stmt));
874   if (gimple_has_location (stmt))
875     gimple_set_location (new_stmt, gimple_location (stmt));
876   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
877   gimple_call_copy_flags (new_stmt, stmt);
878   if (gimple_in_ssa_p (cfun))
879     gimple_move_vops (new_stmt, stmt);
880 
881   if (dump_file && (dump_flags & TDF_DETAILS))
882     {
883       fprintf (dump_file, "with stmt:");
884       print_gimple_stmt (dump_file, new_stmt, 0);
885       fprintf (dump_file, "\n");
886     }
887   gsi_replace (&gsi, new_stmt, true);
888   if (update_references)
889     do
890       {
891 	current_node->record_stmt_references (gsi_stmt (gsi));
892 	gsi_prev (&gsi);
893       }
894     while (gsi_stmt (gsi) != gsi_stmt (prev_gsi));
895   return new_stmt;
896 }
897 
898 /* Dump information contained in the object in textual form to F.  */
899 
900 void
dump(FILE * f)901 ipa_param_adjustments::dump (FILE *f)
902 {
903   fprintf (f, "    m_always_copy_start: %i\n", m_always_copy_start);
904   ipa_dump_adjusted_parameters (f, m_adj_params);
905   if (m_skip_return)
906     fprintf (f, "     Will SKIP return.\n");
907 }
908 
909 /* Dump information contained in the object in textual form to stderr.  */
910 
911 void
debug()912 ipa_param_adjustments::debug ()
913 {
914   dump (stderr);
915 }
916 
917 /* Register that REPLACEMENT should replace parameter described in APM and
918    optionally as DUMMY to mark transitive splits across calls.  */
919 
920 void
register_replacement(ipa_adjusted_param * apm,tree replacement,tree dummy)921 ipa_param_body_adjustments::register_replacement (ipa_adjusted_param *apm,
922 						  tree replacement,
923 						  tree dummy)
924 {
925   gcc_checking_assert (apm->op == IPA_PARAM_OP_SPLIT
926 		       || apm->op == IPA_PARAM_OP_NEW);
927   gcc_checking_assert (!apm->prev_clone_adjustment);
928   ipa_param_body_replacement psr;
929   psr.base = m_oparms[apm->prev_clone_index];
930   psr.repl = replacement;
931   psr.dummy = dummy;
932   psr.unit_offset = apm->unit_offset;
933   m_replacements.safe_push (psr);
934 }
935 
936 /* Copy or not, as appropriate given m_id and decl context, a pre-existing
937    PARM_DECL T so that it can be included in the parameters of the modified
938    function.  */
939 
940 tree
carry_over_param(tree t)941 ipa_param_body_adjustments::carry_over_param (tree t)
942 {
943   tree new_parm;
944   if (m_id)
945     {
946       new_parm = remap_decl (t, m_id);
947       if (TREE_CODE (new_parm) != PARM_DECL)
948 	new_parm = m_id->copy_decl (t, m_id);
949     }
950   else if (DECL_CONTEXT (t) != m_fndecl)
951     {
952       new_parm = copy_node (t);
953       DECL_CONTEXT (new_parm) = m_fndecl;
954     }
955   else
956     new_parm = t;
957   return new_parm;
958 }
959 
960 /* Common initialization performed by all ipa_param_body_adjustments
961    constructors.  OLD_FNDECL is the declaration we take original arguments
962    from, (it may be the same as M_FNDECL).  VARS, if non-NULL, is a pointer to
963    a chained list of new local variables.  TREE_MAP is the IPA-CP produced
964    mapping of trees to constants.
965 
966    The function is rather long but it really onlu initializes all data members
967    of the class.  It creates new param DECLs, finds their new types,   */
968 
969 void
common_initialization(tree old_fndecl,tree * vars,vec<ipa_replace_map *,va_gc> * tree_map)970 ipa_param_body_adjustments::common_initialization (tree old_fndecl,
971 						   tree *vars,
972 						   vec<ipa_replace_map *,
973 						       va_gc> *tree_map)
974 {
975   push_function_arg_decls (&m_oparms, old_fndecl);
976   auto_vec<tree,16> otypes;
977   if (TYPE_ARG_TYPES (TREE_TYPE (old_fndecl)) != NULL_TREE)
978     push_function_arg_types (&otypes, TREE_TYPE (old_fndecl));
979   else
980     {
981       auto_vec<tree,16> oparms;
982       push_function_arg_decls (&oparms, old_fndecl);
983       unsigned ocount = oparms.length ();
984       otypes.reserve_exact (ocount);
985       for (unsigned i = 0; i < ocount; i++)
986 	otypes.quick_push (TREE_TYPE (oparms[i]));
987     }
988   fill_vector_of_new_param_types (&m_new_types, &otypes, m_adj_params, true);
989 
990   auto_vec<bool, 16> kept;
991   kept.reserve_exact (m_oparms.length ());
992   kept.quick_grow_cleared (m_oparms.length ());
993   auto_vec<tree, 16> isra_dummy_decls;
994   isra_dummy_decls.reserve_exact (m_oparms.length ());
995   isra_dummy_decls.quick_grow_cleared (m_oparms.length ());
996 
997   unsigned adj_len = vec_safe_length (m_adj_params);
998   m_method2func = ((TREE_CODE (TREE_TYPE (m_fndecl)) == METHOD_TYPE)
999 		   && (adj_len == 0
1000 		       || (*m_adj_params)[0].op != IPA_PARAM_OP_COPY
1001 		       || (*m_adj_params)[0].base_index != 0));
1002 
1003   /* The main job of the this function is to go over the vector of adjusted
1004      parameters and create declarations or find corresponding old ones and push
1005      them to m_new_decls.  For IPA-SRA replacements it also creates
1006      corresponding m_id->dst_node->clone.performed_splits entries.  */
1007 
1008   m_new_decls.reserve_exact (adj_len);
1009   for (unsigned i = 0; i < adj_len ; i++)
1010     {
1011       ipa_adjusted_param *apm = &(*m_adj_params)[i];
1012       unsigned prev_index = apm->prev_clone_index;
1013       tree new_parm;
1014       if (apm->op == IPA_PARAM_OP_COPY
1015 	  || apm->prev_clone_adjustment)
1016 	{
1017 	  kept[prev_index] = true;
1018 	  new_parm = carry_over_param (m_oparms[prev_index]);
1019 	  m_new_decls.quick_push (new_parm);
1020 	}
1021       else if (apm->op == IPA_PARAM_OP_NEW
1022 	       || apm->op == IPA_PARAM_OP_SPLIT)
1023 	{
1024 	  tree new_type = m_new_types[i];
1025 	  gcc_checking_assert (new_type);
1026 	  new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
1027 				 new_type);
1028 	  const char *prefix = ipa_param_prefixes[apm->param_prefix_index];
1029 	  DECL_NAME (new_parm) = create_tmp_var_name (prefix);
1030 	  DECL_ARTIFICIAL (new_parm) = 1;
1031 	  DECL_ARG_TYPE (new_parm) = new_type;
1032 	  DECL_CONTEXT (new_parm) = m_fndecl;
1033 	  TREE_USED (new_parm) = 1;
1034 	  DECL_IGNORED_P (new_parm) = 1;
1035 	  /* We assume all newly created arguments are not addressable.  */
1036 	  if (TREE_CODE (new_type) == COMPLEX_TYPE
1037 	      || TREE_CODE (new_type) == VECTOR_TYPE)
1038 	    DECL_GIMPLE_REG_P (new_parm) = 1;
1039 	  layout_decl (new_parm, 0);
1040 	  m_new_decls.quick_push (new_parm);
1041 
1042 	  if (apm->op == IPA_PARAM_OP_SPLIT)
1043 	    {
1044 	      m_split_modifications_p = true;
1045 
1046 	      if (m_id)
1047 		{
1048 		  tree dummy_decl;
1049 		  if (!isra_dummy_decls[prev_index])
1050 		    {
1051 		      dummy_decl = copy_decl_to_var (m_oparms[prev_index],
1052 						     m_id);
1053 		      /* Any attempt to remap this dummy in this particular
1054 			 instance of clone materialization should yield
1055 			 itself.  */
1056 		      insert_decl_map (m_id, dummy_decl, dummy_decl);
1057 
1058 		      DECL_CHAIN (dummy_decl) = *vars;
1059 		      *vars = dummy_decl;
1060 		      isra_dummy_decls[prev_index] = dummy_decl;
1061 		    }
1062 		  else
1063 		    dummy_decl = isra_dummy_decls[prev_index];
1064 
1065 		  register_replacement (apm, new_parm, dummy_decl);
1066 		  ipa_param_performed_split ps;
1067 		  ps.dummy_decl = dummy_decl;
1068 		  ps.unit_offset = apm->unit_offset;
1069 		  vec_safe_push (m_id->dst_node->clone.performed_splits, ps);
1070 		}
1071 	      else
1072 		register_replacement (apm, new_parm);
1073 	    }
1074         }
1075       else
1076 	gcc_unreachable ();
1077     }
1078 
1079 
1080   /* As part of body modifications, we will also have to replace remaining uses
1081      of remaining uses of removed PARM_DECLs (which do not however use the
1082      initial value) with their VAR_DECL copies.
1083 
1084      We do this differently with and without m_id.  With m_id, we rely on its
1085      mapping and create a replacement straight away.  Without it, we have our
1086      own mechanism for which we have to populate m_removed_decls vector.  Just
1087      don't mix them, that is why you should not call
1088      replace_removed_params_ssa_names or perform_cfun_body_modifications when
1089      you construct with ID not equal to NULL.  */
1090 
1091   unsigned op_len = m_oparms.length ();
1092   for (unsigned i = 0; i < op_len; i++)
1093     if (!kept[i])
1094       {
1095 	if (m_id)
1096 	  {
1097 	    if (!m_id->decl_map->get (m_oparms[i]))
1098 	      {
1099 		/* TODO: Perhaps at least aggregate-type params could re-use
1100 		   their isra_dummy_decl here?  */
1101 		tree var = copy_decl_to_var (m_oparms[i], m_id);
1102 		insert_decl_map (m_id, m_oparms[i], var);
1103 		/* Declare this new variable.  */
1104 		DECL_CHAIN (var) = *vars;
1105 		*vars = var;
1106 	      }
1107 	  }
1108 	else
1109 	  {
1110 	    m_removed_decls.safe_push (m_oparms[i]);
1111 	    m_removed_map.put (m_oparms[i], m_removed_decls.length () - 1);
1112 	  }
1113       }
1114 
1115   if (!MAY_HAVE_DEBUG_STMTS)
1116     return;
1117 
1118   /* Finally, when generating debug info, we fill vector m_reset_debug_decls
1119     with removed parameters declarations.  We do this in order to re-map their
1120     debug bind statements and create debug decls for them.  */
1121 
1122   if (tree_map)
1123     {
1124       /* Do not output debuginfo for parameter declarations as if they vanished
1125 	 when they were in fact replaced by a constant.  */
1126       auto_vec <int, 16> index_mapping;
1127       bool need_remap = false;
1128 
1129       if (m_id && m_id->src_node->clone.param_adjustments)
1130 	{
1131 	  ipa_param_adjustments *prev_adjustments
1132 	    = m_id->src_node->clone.param_adjustments;
1133 	  prev_adjustments->get_updated_indices (&index_mapping);
1134 	  need_remap = true;
1135 	}
1136 
1137       for (unsigned i = 0; i < tree_map->length (); i++)
1138 	{
1139 	  int parm_num = (*tree_map)[i]->parm_num;
1140 	  gcc_assert (parm_num >= 0);
1141 	  if (need_remap)
1142 	    parm_num = index_mapping[parm_num];
1143 	  kept[parm_num] = true;
1144 	}
1145     }
1146 
1147   for (unsigned i = 0; i < op_len; i++)
1148     if (!kept[i] && is_gimple_reg (m_oparms[i]))
1149       m_reset_debug_decls.safe_push (m_oparms[i]);
1150 }
1151 
1152 /* Constructor of ipa_param_body_adjustments from a simple list of
1153    modifications to parameters listed in ADJ_PARAMS which will prepare ground
1154    for modification of parameters of fndecl.  Return value of the function will
1155    not be removed and the object will assume it does not run as a part of
1156    tree-function_versioning.  */
1157 
1158 ipa_param_body_adjustments
ipa_param_body_adjustments(vec<ipa_adjusted_param,va_gc> * adj_params,tree fndecl)1159 ::ipa_param_body_adjustments (vec<ipa_adjusted_param, va_gc> *adj_params,
1160 			      tree fndecl)
1161   : m_adj_params (adj_params), m_adjustments (NULL), m_reset_debug_decls (),
1162     m_split_modifications_p (false), m_fndecl (fndecl), m_id (NULL),
1163     m_oparms (), m_new_decls (), m_new_types (), m_replacements (),
1164     m_removed_decls (), m_removed_map (), m_method2func (false)
1165 {
1166   common_initialization (fndecl, NULL, NULL);
1167 }
1168 
1169 /* Constructor of ipa_param_body_adjustments from ipa_param_adjustments in
1170    ADJUSTMENTS which will prepare ground for modification of parameters of
1171    fndecl.  The object will assume it does not run as a part of
1172    tree-function_versioning.  */
1173 
1174 ipa_param_body_adjustments
ipa_param_body_adjustments(ipa_param_adjustments * adjustments,tree fndecl)1175 ::ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1176 			      tree fndecl)
1177   : m_adj_params (adjustments->m_adj_params), m_adjustments (adjustments),
1178     m_reset_debug_decls (), m_split_modifications_p (false), m_fndecl (fndecl),
1179     m_id (NULL), m_oparms (), m_new_decls (), m_new_types (),
1180     m_replacements (), m_removed_decls (), m_removed_map (),
1181     m_method2func (false)
1182 {
1183   common_initialization (fndecl, NULL, NULL);
1184 }
1185 
1186 /* Constructor of ipa_param_body_adjustments which sets it up as a part of
1187    running tree_function_versioning.  Planned modifications to the function are
1188    in ADJUSTMENTS.  FNDECL designates the new function clone which is being
1189    modified.  OLD_FNDECL is the function of which FNDECL is a clone (and which
1190    at the time of invocation still share DECL_ARGUMENTS).  ID is the
1191    copy_body_data structure driving the wholy body copying process.  VARS is a
1192    pointer to the head of the list of new local variables, TREE_MAP is the map
1193    that drives tree substitution in the cloning process.  */
1194 
1195 ipa_param_body_adjustments
ipa_param_body_adjustments(ipa_param_adjustments * adjustments,tree fndecl,tree old_fndecl,copy_body_data * id,tree * vars,vec<ipa_replace_map *,va_gc> * tree_map)1196 ::ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1197 			      tree fndecl, tree old_fndecl,
1198 			      copy_body_data *id, tree *vars,
1199 			      vec<ipa_replace_map *, va_gc> *tree_map)
1200   : m_adj_params (adjustments->m_adj_params), m_adjustments (adjustments),
1201     m_reset_debug_decls (), m_split_modifications_p (false), m_fndecl (fndecl),
1202     m_id (id), m_oparms (), m_new_decls (), m_new_types (), m_replacements (),
1203     m_removed_decls (), m_removed_map (), m_method2func (false)
1204 {
1205   common_initialization (old_fndecl, vars, tree_map);
1206 }
1207 
1208 /* Chain new param decls up and return them.  */
1209 
1210 tree
get_new_param_chain()1211 ipa_param_body_adjustments::get_new_param_chain ()
1212 {
1213   tree result;
1214   tree *link = &result;
1215 
1216   unsigned len = vec_safe_length (m_adj_params);
1217   for (unsigned i = 0; i < len; i++)
1218     {
1219       tree new_decl = m_new_decls[i];
1220       *link = new_decl;
1221       link = &DECL_CHAIN (new_decl);
1222     }
1223   *link = NULL_TREE;
1224   return result;
1225 }
1226 
1227 /* Modify the function parameters FNDECL and its type according to the plan in
1228    ADJUSTMENTS.  This function needs to be called when the decl has not already
1229    been processed with ipa_param_adjustments::adjust_decl, otherwise just
1230    seting DECL_ARGUMENTS to whatever get_new_param_chain will do is enough.  */
1231 
1232 void
modify_formal_parameters()1233 ipa_param_body_adjustments::modify_formal_parameters ()
1234 {
1235   tree orig_type = TREE_TYPE (m_fndecl);
1236   DECL_ARGUMENTS (m_fndecl) = get_new_param_chain ();
1237 
1238   /* When signature changes, we need to clear builtin info.  */
1239   if (fndecl_built_in_p (m_fndecl))
1240     set_decl_built_in_function (m_fndecl, NOT_BUILT_IN, 0);
1241 
1242   /* At this point, removing return value is only implemented when going
1243      through tree_function_versioning, not when modifying function body
1244      directly.  */
1245   gcc_assert (!m_adjustments || !m_adjustments->m_skip_return);
1246   tree new_type = build_adjusted_function_type (orig_type, &m_new_types,
1247 						m_method2func, false);
1248 
1249   TREE_TYPE (m_fndecl) = new_type;
1250   DECL_VIRTUAL_P (m_fndecl) = 0;
1251   DECL_LANG_SPECIFIC (m_fndecl) = NULL;
1252   if (m_method2func)
1253     DECL_VINDEX (m_fndecl) = NULL_TREE;
1254 }
1255 
1256 /* Given BASE and UNIT_OFFSET, find the corresponding record among replacement
1257    structures.  */
1258 
1259 ipa_param_body_replacement *
lookup_replacement_1(tree base,unsigned unit_offset)1260 ipa_param_body_adjustments::lookup_replacement_1 (tree base,
1261 						  unsigned unit_offset)
1262 {
1263   unsigned int len = m_replacements.length ();
1264   for (unsigned i = 0; i < len; i++)
1265     {
1266       ipa_param_body_replacement *pbr = &m_replacements[i];
1267 
1268       if (pbr->base == base
1269 	  && (pbr->unit_offset == unit_offset))
1270 	return pbr;
1271     }
1272   return NULL;
1273 }
1274 
1275 /* Given BASE and UNIT_OFFSET, find the corresponding replacement expression
1276    and return it, assuming it is known it does not hold value by reference or
1277    in reverse storage order.  */
1278 
1279 tree
lookup_replacement(tree base,unsigned unit_offset)1280 ipa_param_body_adjustments::lookup_replacement (tree base, unsigned unit_offset)
1281 {
1282   ipa_param_body_replacement *pbr = lookup_replacement_1 (base, unit_offset);
1283   if (!pbr)
1284     return NULL;
1285   return pbr->repl;
1286 }
1287 
1288 /* If T is an SSA_NAME, return NULL if it is not a default def or
1289    return its base variable if it is.  If IGNORE_DEFAULT_DEF is true,
1290    the base variable is always returned, regardless if it is a default
1291    def.  Return T if it is not an SSA_NAME.  */
1292 
1293 static tree
get_ssa_base_param(tree t,bool ignore_default_def)1294 get_ssa_base_param (tree t, bool ignore_default_def)
1295 {
1296   if (TREE_CODE (t) == SSA_NAME)
1297     {
1298       if (ignore_default_def || SSA_NAME_IS_DEFAULT_DEF (t))
1299 	return SSA_NAME_VAR (t);
1300       else
1301 	return NULL_TREE;
1302     }
1303   return t;
1304 }
1305 
1306 /* Given an expression, return the structure describing how it should be
1307    replaced if it accesses a part of a split parameter or NULL otherwise.
1308 
1309    Do not free the result, it will be deallocated when the object is destroyed.
1310 
1311    If IGNORE_DEFAULT_DEF is cleared, consider only SSA_NAMEs of PARM_DECLs
1312    which are default definitions, if set, consider all SSA_NAMEs of
1313    PARM_DECLs.  */
1314 
1315 ipa_param_body_replacement *
get_expr_replacement(tree expr,bool ignore_default_def)1316 ipa_param_body_adjustments::get_expr_replacement (tree expr,
1317 						  bool ignore_default_def)
1318 {
1319   tree base;
1320   unsigned unit_offset;
1321 
1322   if (!isra_get_ref_base_and_offset (expr, &base, &unit_offset))
1323     return NULL;
1324 
1325   base = get_ssa_base_param (base, ignore_default_def);
1326   if (!base || TREE_CODE (base) != PARM_DECL)
1327     return NULL;
1328   return lookup_replacement_1 (base, unit_offset);
1329 }
1330 
1331 /* Given OLD_DECL, which is a PARM_DECL of a parameter that is being removed
1332    (which includes it being split or replaced), return a new variable that
1333    should be used for any SSA names that will remain in the function that
1334    previously belonged to OLD_DECL.  */
1335 
1336 tree
get_replacement_ssa_base(tree old_decl)1337 ipa_param_body_adjustments::get_replacement_ssa_base (tree old_decl)
1338 {
1339   unsigned *idx = m_removed_map.get (old_decl);
1340   if (!idx)
1341     return NULL;
1342 
1343   tree repl;
1344   if (TREE_CODE (m_removed_decls[*idx]) == PARM_DECL)
1345     {
1346       gcc_assert (m_removed_decls[*idx] == old_decl);
1347       repl = copy_var_decl (old_decl, DECL_NAME (old_decl),
1348 			    TREE_TYPE (old_decl));
1349       m_removed_decls[*idx] = repl;
1350     }
1351   else
1352     repl = m_removed_decls[*idx];
1353   return repl;
1354 }
1355 
1356 /* If OLD_NAME, which is being defined by statement STMT, is an SSA_NAME of a
1357    parameter which is to be removed because its value is not used, create a new
1358    SSA_NAME relating to a replacement VAR_DECL, replace all uses of the
1359    original with it and return it.  If there is no need to re-map, return NULL.
1360    ADJUSTMENTS is a pointer to a vector of IPA-SRA adjustments.  */
1361 
1362 tree
replace_removed_params_ssa_names(tree old_name,gimple * stmt)1363 ipa_param_body_adjustments::replace_removed_params_ssa_names (tree old_name,
1364 							      gimple *stmt)
1365 {
1366   gcc_assert (!m_id);
1367   if (TREE_CODE (old_name) != SSA_NAME)
1368     return NULL;
1369 
1370   tree decl = SSA_NAME_VAR (old_name);
1371   if (decl == NULL_TREE
1372       || TREE_CODE (decl) != PARM_DECL)
1373     return NULL;
1374 
1375   tree repl = get_replacement_ssa_base (decl);
1376   if (!repl)
1377     return NULL;
1378 
1379   tree new_name = make_ssa_name (repl, stmt);
1380   SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name)
1381     = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (old_name);
1382 
1383   if (dump_file && (dump_flags & TDF_DETAILS))
1384     {
1385       fprintf (dump_file, "replacing an SSA name of a removed param ");
1386       print_generic_expr (dump_file, old_name);
1387       fprintf (dump_file, " with ");
1388       print_generic_expr (dump_file, new_name);
1389       fprintf (dump_file, "\n");
1390     }
1391 
1392   replace_uses_by (old_name, new_name);
1393   return new_name;
1394 }
1395 
1396 /* If the expression *EXPR_P should be replaced, do so.  CONVERT specifies
1397    whether the function should care about type incompatibility of the current
1398    and new expressions.  If it is false, the function will leave
1399    incompatibility issues to the caller - note that when the function
1400    encounters a BIT_FIELD_REF, IMAGPART_EXPR or REALPART_EXPR, it will modify
1401    their bases instead of the expressions themselves and then also performs any
1402    necessary conversions.  */
1403 
1404 bool
modify_expression(tree * expr_p,bool convert)1405 ipa_param_body_adjustments::modify_expression (tree *expr_p, bool convert)
1406 {
1407   tree expr = *expr_p;
1408 
1409   if (TREE_CODE (expr) == BIT_FIELD_REF
1410       || TREE_CODE (expr) == IMAGPART_EXPR
1411       || TREE_CODE (expr) == REALPART_EXPR)
1412     {
1413       expr_p = &TREE_OPERAND (expr, 0);
1414       expr = *expr_p;
1415       convert = true;
1416     }
1417 
1418   ipa_param_body_replacement *pbr = get_expr_replacement (expr, false);
1419   if (!pbr)
1420     return false;
1421 
1422   tree repl = pbr->repl;
1423   if (dump_file && (dump_flags & TDF_DETAILS))
1424     {
1425       fprintf (dump_file, "About to replace expr ");
1426       print_generic_expr (dump_file, expr);
1427       fprintf (dump_file, " with ");
1428       print_generic_expr (dump_file, repl);
1429       fprintf (dump_file, "\n");
1430     }
1431 
1432   if (convert && !useless_type_conversion_p (TREE_TYPE (expr),
1433 					     TREE_TYPE (repl)))
1434     {
1435       tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (expr), repl);
1436       *expr_p = vce;
1437     }
1438   else
1439     *expr_p = repl;
1440   return true;
1441 }
1442 
1443 /* If the assignment statement STMT contains any expressions that need to
1444    replaced with a different one as noted by ADJUSTMENTS, do so.  Handle any
1445    potential type incompatibilities.  If any conversion sttements have to be
1446    pre-pended to STMT, they will be added to EXTRA_STMTS.  Return true iff the
1447    statement was modified.  */
1448 
1449 bool
modify_assignment(gimple * stmt,gimple_seq * extra_stmts)1450 ipa_param_body_adjustments::modify_assignment (gimple *stmt,
1451 					       gimple_seq *extra_stmts)
1452 {
1453   tree *lhs_p, *rhs_p;
1454   bool any;
1455 
1456   if (!gimple_assign_single_p (stmt))
1457     return false;
1458 
1459   rhs_p = gimple_assign_rhs1_ptr (stmt);
1460   lhs_p = gimple_assign_lhs_ptr (stmt);
1461 
1462   any = modify_expression (lhs_p, false);
1463   any |= modify_expression (rhs_p, false);
1464   if (any
1465       && !useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
1466     {
1467       if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
1468 	{
1469 	  /* V_C_Es of constructors can cause trouble (PR 42714).  */
1470 	  if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
1471 	    *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
1472 	  else
1473 	    *rhs_p = build_constructor (TREE_TYPE (*lhs_p),
1474 					NULL);
1475 	}
1476       else
1477 	{
1478 	  tree new_rhs = fold_build1_loc (gimple_location (stmt),
1479 					  VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
1480 					  *rhs_p);
1481 	  tree tmp = force_gimple_operand (new_rhs, extra_stmts, true,
1482 					   NULL_TREE);
1483 	  gimple_assign_set_rhs1 (stmt, tmp);
1484 	}
1485       return true;
1486     }
1487 
1488   return any;
1489 }
1490 
1491 /* Data passed to remap_split_decl_to_dummy through walk_tree.  */
1492 
1493 struct simple_tree_swap_info
1494 {
1495   /* Change FROM to TO.  */
1496   tree from, to;
1497   /* And set DONE to true when doing so.  */
1498   bool done;
1499 };
1500 
1501 /* Simple remapper to remap a split parameter to the same expression based on a
1502    special dummy decl so that edge redirections can detect transitive splitting
1503    and finish them.  */
1504 
1505 static tree
remap_split_decl_to_dummy(tree * tp,int * walk_subtrees,void * data)1506 remap_split_decl_to_dummy (tree *tp, int *walk_subtrees, void *data)
1507 {
1508   tree t = *tp;
1509 
1510   if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
1511     {
1512       struct simple_tree_swap_info *swapinfo
1513 	= (struct simple_tree_swap_info *) data;
1514       if (t == swapinfo->from
1515 	  || (TREE_CODE (t) == SSA_NAME
1516 	      && SSA_NAME_VAR (t) == swapinfo->from))
1517 	{
1518 	  *tp = swapinfo->to;
1519 	  swapinfo->done = true;
1520 	}
1521       *walk_subtrees = 0;
1522     }
1523   else if (TYPE_P (t))
1524       *walk_subtrees = 0;
1525   else
1526     *walk_subtrees = 1;
1527   return NULL_TREE;
1528 }
1529 
1530 
1531 /* If the call statement pointed at by STMT_P contains any expressions that
1532    need to replaced with a different one as noted by ADJUSTMENTS, do so.  f the
1533    statement needs to be rebuilt, do so.  Return true if any modifications have
1534    been performed.
1535 
1536    If the method is invoked as a part of IPA clone materialization and if any
1537    parameter split is transitive, i.e. it applies to the functin that is being
1538    modified and also to the callee of the statement, replace the parameter
1539    passed to old callee with an equivalent expression based on a dummy decl
1540    followed by PARM_DECLs representing the actual replacements.  The actual
1541    replacements will be then converted into SSA_NAMEs and then
1542    ipa_param_adjustments::modify_call will find the appropriate ones and leave
1543    only those in the call.  */
1544 
1545 bool
modify_call_stmt(gcall ** stmt_p)1546 ipa_param_body_adjustments::modify_call_stmt (gcall **stmt_p)
1547 {
1548   gcall *stmt = *stmt_p;
1549   auto_vec <unsigned, 4> pass_through_args;
1550   auto_vec <unsigned, 4> pass_through_pbr_indices;
1551 
1552   if (m_split_modifications_p && m_id)
1553     {
1554       for (unsigned i = 0; i < gimple_call_num_args (stmt); i++)
1555 	{
1556 	  tree t = gimple_call_arg (stmt, i);
1557 	  gcc_assert (TREE_CODE (t) != BIT_FIELD_REF
1558 		      && TREE_CODE (t) != IMAGPART_EXPR
1559 		      && TREE_CODE (t) != REALPART_EXPR);
1560 
1561 	  tree base;
1562 	  unsigned unit_offset;
1563 	  if (!isra_get_ref_base_and_offset (t, &base, &unit_offset))
1564 	    continue;
1565 
1566 	  bool by_ref = false;
1567 	  if (TREE_CODE (base) == SSA_NAME)
1568 	    {
1569 	      if (!SSA_NAME_IS_DEFAULT_DEF (base))
1570 		continue;
1571 	      base = SSA_NAME_VAR (base);
1572 	      gcc_checking_assert (base);
1573 	      by_ref = true;
1574 	    }
1575 	  if (TREE_CODE (base) != PARM_DECL)
1576 	    continue;
1577 
1578 	  bool base_among_replacements = false;
1579 	  unsigned j, repl_list_len = m_replacements.length ();
1580 	  for (j = 0; j < repl_list_len; j++)
1581 	    {
1582 	      ipa_param_body_replacement *pbr = &m_replacements[j];
1583 	      if (pbr->base == base)
1584 		{
1585 		  base_among_replacements = true;
1586 		  break;
1587 		}
1588 	    }
1589 	  if (!base_among_replacements)
1590 	    continue;
1591 
1592 	  /* We still have to distinguish between an end-use that we have to
1593 	     transform now and a pass-through, which happens in the following
1594 	     two cases.  */
1595 
1596 	  /* TODO: After we adjust ptr_parm_has_nonarg_uses to also consider
1597 	     &MEM_REF[ssa_name + offset], we will also have to detect that case
1598 	     here.    */
1599 
1600 	  if (TREE_CODE (t) == SSA_NAME
1601 	      && SSA_NAME_IS_DEFAULT_DEF (t)
1602 	      && SSA_NAME_VAR (t)
1603 	      && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL)
1604 	    {
1605 	      /* This must be a by_reference pass-through.  */
1606 	      gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
1607 	      pass_through_args.safe_push (i);
1608 	      pass_through_pbr_indices.safe_push (j);
1609 	    }
1610 	  else if (!by_ref && AGGREGATE_TYPE_P (TREE_TYPE (t)))
1611 	    {
1612 	      /* Currently IPA-SRA guarantees the aggregate access type
1613 		 exactly matches in this case.  So if it does not match, it is
1614 		 a pass-through argument that will be sorted out at edge
1615 		 redirection time.  */
1616 	      ipa_param_body_replacement *pbr
1617 		= lookup_replacement_1 (base, unit_offset);
1618 
1619 	      if (!pbr
1620 		  || (TYPE_MAIN_VARIANT (TREE_TYPE (t))
1621 		      != TYPE_MAIN_VARIANT (TREE_TYPE (pbr->repl))))
1622 		{
1623 		  pass_through_args.safe_push (i);
1624 		  pass_through_pbr_indices.safe_push (j);
1625 		}
1626 	    }
1627 	}
1628     }
1629 
1630   unsigned nargs = gimple_call_num_args (stmt);
1631   if (!pass_through_args.is_empty ())
1632     {
1633       auto_vec<tree, 16> vargs;
1634       unsigned pt_idx = 0;
1635       for (unsigned i = 0; i < nargs; i++)
1636 	{
1637 	  if (pt_idx < pass_through_args.length ()
1638 	      && i == pass_through_args[pt_idx])
1639 	    {
1640 	      unsigned j = pass_through_pbr_indices[pt_idx];
1641 	      pt_idx++;
1642 	      tree base = m_replacements[j].base;
1643 
1644 	      /* Map base will get mapped to the special transitive-isra marker
1645 		 dummy decl. */
1646 	      struct simple_tree_swap_info swapinfo;
1647 	      swapinfo.from = base;
1648 	      swapinfo.to = m_replacements[j].dummy;
1649 	      swapinfo.done = false;
1650 	      tree arg = gimple_call_arg (stmt, i);
1651 	      walk_tree (&arg, remap_split_decl_to_dummy, &swapinfo, NULL);
1652 	      gcc_assert (swapinfo.done);
1653 	      vargs.safe_push (arg);
1654 	      /* Now let's push all replacements pertaining to this parameter
1655 		 so that all gimple register ones get correct SSA_NAMES.  Edge
1656 		 redirection will weed out the dummy argument as well as all
1657 		 unused replacements later.  */
1658 	      unsigned int repl_list_len = m_replacements.length ();
1659 	      for (; j < repl_list_len; j++)
1660 		{
1661 		  if (m_replacements[j].base != base)
1662 		    break;
1663 		  vargs.safe_push (m_replacements[j].repl);
1664 		}
1665 	    }
1666 	  else
1667 	    {
1668 	      tree t = gimple_call_arg (stmt, i);
1669 	      modify_expression (&t, true);
1670 	      vargs.safe_push (t);
1671 	    }
1672 	}
1673       gcall *new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
1674       gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
1675       gimple_call_copy_flags (new_stmt, stmt);
1676       if (tree lhs = gimple_call_lhs (stmt))
1677 	{
1678 	  modify_expression (&lhs, false);
1679 	  /* Avoid adjusting SSA_NAME_DEF_STMT of a SSA lhs, SSA names
1680 	     have not yet been remapped.  */
1681 	  *gimple_call_lhs_ptr (new_stmt) = lhs;
1682 	}
1683       *stmt_p = new_stmt;
1684       return true;
1685     }
1686 
1687   /* Otherwise, no need to rebuild the statement, let's just modify arguments
1688      and the LHS if/as appropriate.  */
1689   bool modified = false;
1690   for (unsigned i = 0; i < nargs; i++)
1691     {
1692       tree *t = gimple_call_arg_ptr (stmt, i);
1693       modified |= modify_expression (t, true);
1694     }
1695 
1696   if (gimple_call_lhs (stmt))
1697     {
1698       tree *t = gimple_call_lhs_ptr (stmt);
1699       modified |= modify_expression (t, false);
1700     }
1701 
1702   return modified;
1703 }
1704 
1705 /* If the statement STMT contains any expressions that need to replaced with a
1706    different one as noted by ADJUSTMENTS, do so.  Handle any potential type
1707    incompatibilities.  If any conversion sttements have to be pre-pended to
1708    STMT, they will be added to EXTRA_STMTS.  Return true iff the statement was
1709    modified.  */
1710 
1711 bool
modify_gimple_stmt(gimple ** stmt,gimple_seq * extra_stmts)1712 ipa_param_body_adjustments::modify_gimple_stmt (gimple **stmt,
1713 						gimple_seq *extra_stmts)
1714 {
1715   bool modified = false;
1716   tree *t;
1717 
1718   switch (gimple_code (*stmt))
1719     {
1720     case GIMPLE_RETURN:
1721       t = gimple_return_retval_ptr (as_a <greturn *> (*stmt));
1722       if (m_adjustments && m_adjustments->m_skip_return)
1723 	*t = NULL_TREE;
1724       else if (*t != NULL_TREE)
1725 	modified |= modify_expression (t, true);
1726       break;
1727 
1728     case GIMPLE_ASSIGN:
1729       modified |= modify_assignment (*stmt, extra_stmts);
1730       break;
1731 
1732     case GIMPLE_CALL:
1733       modified |= modify_call_stmt ((gcall **) stmt);
1734       break;
1735 
1736     case GIMPLE_ASM:
1737       {
1738 	gasm *asm_stmt = as_a <gasm *> (*stmt);
1739 	for (unsigned i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
1740 	  {
1741 	    t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
1742 	    modified |= modify_expression (t, true);
1743 	  }
1744 	for (unsigned i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
1745 	  {
1746 	    t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
1747 	    modified |= modify_expression (t, false);
1748 	  }
1749       }
1750       break;
1751 
1752     default:
1753       break;
1754     }
1755   return modified;
1756 }
1757 
1758 
1759 /* Traverse body of the current function and perform the requested adjustments
1760    on its statements.  Return true iff the CFG has been changed.  */
1761 
1762 bool
modify_cfun_body()1763 ipa_param_body_adjustments::modify_cfun_body ()
1764 {
1765   bool cfg_changed = false;
1766   basic_block bb;
1767 
1768   FOR_EACH_BB_FN (bb, cfun)
1769     {
1770       gimple_stmt_iterator gsi;
1771 
1772       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1773 	{
1774 	  gphi *phi = as_a <gphi *> (gsi_stmt (gsi));
1775 	  tree new_lhs, old_lhs = gimple_phi_result (phi);
1776 	  new_lhs = replace_removed_params_ssa_names (old_lhs, phi);
1777 	  if (new_lhs)
1778 	    {
1779 	      gimple_phi_set_result (phi, new_lhs);
1780 	      release_ssa_name (old_lhs);
1781 	    }
1782 	}
1783 
1784       gsi = gsi_start_bb (bb);
1785       while (!gsi_end_p (gsi))
1786 	{
1787 	  gimple *stmt = gsi_stmt (gsi);
1788 	  gimple *stmt_copy = stmt;
1789 	  gimple_seq extra_stmts = NULL;
1790 	  bool modified = modify_gimple_stmt (&stmt, &extra_stmts);
1791 	  if (stmt != stmt_copy)
1792 	    {
1793 	      gcc_checking_assert (modified);
1794 	      gsi_replace (&gsi, stmt, false);
1795 	    }
1796 	  if (!gimple_seq_empty_p (extra_stmts))
1797 	    gsi_insert_seq_before (&gsi, extra_stmts, GSI_SAME_STMT);
1798 
1799 	  def_operand_p defp;
1800 	  ssa_op_iter iter;
1801 	  FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF)
1802 	    {
1803 	      tree old_def = DEF_FROM_PTR (defp);
1804 	      if (tree new_def = replace_removed_params_ssa_names (old_def,
1805 								   stmt))
1806 		{
1807 		  SET_DEF (defp, new_def);
1808 		  release_ssa_name (old_def);
1809 		  modified = true;
1810 		}
1811 	    }
1812 
1813 	  if (modified)
1814 	    {
1815 	      update_stmt (stmt);
1816 	      if (maybe_clean_eh_stmt (stmt)
1817 		  && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
1818 		cfg_changed = true;
1819 	    }
1820 	  gsi_next (&gsi);
1821 	}
1822     }
1823 
1824   return cfg_changed;
1825 }
1826 
1827 /* Call gimple_debug_bind_reset_value on all debug statements describing
1828    gimple register parameters that are being removed or replaced.  */
1829 
1830 void
reset_debug_stmts()1831 ipa_param_body_adjustments::reset_debug_stmts ()
1832 {
1833   int i, len;
1834   gimple_stmt_iterator *gsip = NULL, gsi;
1835 
1836   if (MAY_HAVE_DEBUG_STMTS && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
1837     {
1838       gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
1839       gsip = &gsi;
1840     }
1841   len = m_reset_debug_decls.length ();
1842   for (i = 0; i < len; i++)
1843     {
1844       imm_use_iterator ui;
1845       gimple *stmt;
1846       gdebug *def_temp;
1847       tree name, vexpr, copy = NULL_TREE;
1848       use_operand_p use_p;
1849       tree decl = m_reset_debug_decls[i];
1850 
1851       gcc_checking_assert (is_gimple_reg (decl));
1852       name = ssa_default_def (cfun, decl);
1853       vexpr = NULL;
1854       if (name)
1855 	FOR_EACH_IMM_USE_STMT (stmt, ui, name)
1856 	  {
1857 	    if (gimple_clobber_p (stmt))
1858 	      {
1859 		gimple_stmt_iterator cgsi = gsi_for_stmt (stmt);
1860 		unlink_stmt_vdef (stmt);
1861 		gsi_remove (&cgsi, true);
1862 		release_defs (stmt);
1863 		continue;
1864 	      }
1865 	    /* All other users must have been removed by function body
1866 	       modification.  */
1867 	    gcc_assert (is_gimple_debug (stmt));
1868 	    if (vexpr == NULL && gsip != NULL)
1869 	      {
1870 		vexpr = make_node (DEBUG_EXPR_DECL);
1871 		def_temp = gimple_build_debug_source_bind (vexpr, decl, NULL);
1872 		DECL_ARTIFICIAL (vexpr) = 1;
1873 		TREE_TYPE (vexpr) = TREE_TYPE (name);
1874 		SET_DECL_MODE (vexpr, DECL_MODE (decl));
1875 		gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
1876 	      }
1877 	    if (vexpr)
1878 	      {
1879 		FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
1880 		  SET_USE (use_p, vexpr);
1881 	      }
1882 	    else
1883 	      gimple_debug_bind_reset_value (stmt);
1884 	    update_stmt (stmt);
1885 	  }
1886       /* Create a VAR_DECL for debug info purposes.  */
1887       if (!DECL_IGNORED_P (decl))
1888 	{
1889 	  copy = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
1890 			     VAR_DECL, DECL_NAME (decl),
1891 			     TREE_TYPE (decl));
1892 	  if (DECL_PT_UID_SET_P (decl))
1893 	    SET_DECL_PT_UID (copy, DECL_PT_UID (decl));
1894 	  TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
1895 	  TREE_READONLY (copy) = TREE_READONLY (decl);
1896 	  TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
1897 	  DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (decl);
1898 	  DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (decl);
1899 	  DECL_IGNORED_P (copy) = DECL_IGNORED_P (decl);
1900 	  DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (decl);
1901 	  DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
1902 	  SET_DECL_RTL (copy, 0);
1903 	  TREE_USED (copy) = 1;
1904 	  DECL_CONTEXT (copy) = current_function_decl;
1905 	  add_local_decl (cfun, copy);
1906 	  DECL_CHAIN (copy)
1907 	    = BLOCK_VARS (DECL_INITIAL (current_function_decl));
1908 	  BLOCK_VARS (DECL_INITIAL (current_function_decl)) = copy;
1909 	}
1910       if (gsip != NULL && copy && target_for_debug_bind (decl))
1911 	{
1912 	  gcc_assert (TREE_CODE (decl) == PARM_DECL);
1913 	  if (vexpr)
1914 	    def_temp = gimple_build_debug_bind (copy, vexpr, NULL);
1915 	  else
1916 	    def_temp = gimple_build_debug_source_bind (copy, decl,
1917 						       NULL);
1918 	  gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
1919 	}
1920     }
1921 }
1922 
1923 /* Perform all necessary body changes to change signature, body and debug info
1924    of fun according to adjustments passed at construction.  Return true if CFG
1925    was changed in any way.  The main entry point for modification of standalone
1926    functions that is not part of IPA clone materialization.  */
1927 
1928 bool
perform_cfun_body_modifications()1929 ipa_param_body_adjustments::perform_cfun_body_modifications ()
1930 {
1931   bool cfg_changed;
1932   modify_formal_parameters ();
1933   cfg_changed = modify_cfun_body ();
1934   reset_debug_stmts ();
1935 
1936   return cfg_changed;
1937 }
1938 
1939