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