hppa: Fix bug in atomic_storedi_1 pattern
[official-gcc.git] / gcc / ipa-param-manipulation.cc
blob02f71a42237e1d1ad79be05c6d8d4da743ad1d39
1 /* Manipulation of formal and actual parameters of functions and function
2 calls.
3 Copyright (C) 2017-2024 Free Software Foundation, Inc.
5 This file is part of GCC.
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.
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.
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/>. */
21 #define INCLUDE_ALGORITHM
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "ssa.h"
29 #include "cgraph.h"
30 #include "fold-const.h"
31 #include "tree-eh.h"
32 #include "stor-layout.h"
33 #include "gimplify.h"
34 #include "gimple-iterator.h"
35 #include "gimplify-me.h"
36 #include "tree-cfg.h"
37 #include "tree-dfa.h"
38 #include "ipa-param-manipulation.h"
39 #include "print-tree.h"
40 #include "gimple-pretty-print.h"
41 #include "builtins.h"
42 #include "tree-ssa.h"
43 #include "tree-inline.h"
44 #include "alloc-pool.h"
45 #include "symbol-summary.h"
46 #include "symtab-clones.h"
47 #include "tree-phinodes.h"
48 #include "cfgexpand.h"
49 #include "attribs.h"
50 #include "ipa-prop.h"
52 /* Actual prefixes of different newly synthetized parameters. Keep in sync
53 with IPA_PARAM_PREFIX_* defines. */
55 static const char *ipa_param_prefixes[IPA_PARAM_PREFIX_COUNT]
56 = {"SYNTH",
57 "ISRA",
58 "simd",
59 "mask"};
61 /* Names of parameters for dumping. Keep in sync with enum ipa_parm_op. */
63 static const char *ipa_param_op_names[IPA_PARAM_PREFIX_COUNT]
64 = {"IPA_PARAM_OP_UNDEFINED",
65 "IPA_PARAM_OP_COPY",
66 "IPA_PARAM_OP_NEW",
67 "IPA_PARAM_OP_SPLIT"};
69 /* Structure to hold declarations representing pass-through IPA-SRA splits. In
70 essence, it tells new index for a combination of original index and
71 offset. */
73 struct pass_through_split_map
75 /* Original argument index. */
76 unsigned base_index;
77 /* Offset of the split part in the original argument. */
78 unsigned unit_offset;
79 /* Index of the split part in the call statement - where clone
80 materialization put it. */
81 int new_index;
84 /* Information about some call statements that needs to be conveyed from clone
85 materialization to edge redirection. */
87 class ipa_edge_modification_info
89 public:
90 ipa_edge_modification_info ()
93 /* Mapping of original argument indices to where those arguments sit in the
94 call statement now or to a negative index if they were removed. */
95 auto_vec<int> index_map;
96 /* Information about ISRA replacements put into the call statement at the
97 clone materialization stages. */
98 auto_vec<pass_through_split_map> pass_through_map;
99 /* Necessary adjustment to ipa_param_adjustments::m_always_copy_start when
100 redirecting the call. */
101 int always_copy_delta = 0;
104 /* Class for storing and retrieving summaries about cal statement
105 modifications. */
107 class ipa_edge_modification_sum
108 : public call_summary <ipa_edge_modification_info *>
110 public:
111 ipa_edge_modification_sum (symbol_table *table)
112 : call_summary<ipa_edge_modification_info *> (table)
116 /* Hook that is called by summary when an edge is duplicated. */
118 void duplicate (cgraph_edge *,
119 cgraph_edge *,
120 ipa_edge_modification_info *old_info,
121 ipa_edge_modification_info *new_info) final override
123 new_info->index_map.safe_splice (old_info->index_map);
124 new_info->pass_through_map.safe_splice (old_info->pass_through_map);
125 new_info->always_copy_delta = old_info->always_copy_delta;
129 /* Call summary to store information about edges which have had their arguments
130 partially modified already. */
132 static ipa_edge_modification_sum *ipa_edge_modifications;
134 /* Fail compilation if CS has any summary associated with it in
135 ipa_edge_modifications. */
137 DEBUG_FUNCTION void
138 ipa_verify_edge_has_no_modifications (cgraph_edge *cs)
140 gcc_assert (!ipa_edge_modifications || !ipa_edge_modifications->get (cs));
143 /* Fill an empty vector ARGS with PARM_DECLs representing formal parameters of
144 FNDECL. The function should not be called during LTO WPA phase except for
145 thunks (or functions with bodies streamed in). */
147 void
148 push_function_arg_decls (vec<tree> *args, tree fndecl)
150 int count;
151 tree parm;
153 /* Safety check that we do not attempt to use the function in WPA, except
154 when the function is a thunk and then we have DECL_ARGUMENTS or when we
155 have already explicitely loaded its body. */
156 gcc_assert (!flag_wpa
157 || DECL_ARGUMENTS (fndecl)
158 || gimple_has_body_p (fndecl));
159 count = 0;
160 for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
161 count++;
163 args->reserve_exact (count);
164 for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
165 args->quick_push (parm);
168 /* Fill an empty vector TYPES with trees representing formal parameters of
169 function type FNTYPE. */
171 void
172 push_function_arg_types (vec<tree> *types, tree fntype)
174 int count = 0;
175 tree t;
177 for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
178 count++;
180 types->reserve_exact (count);
181 for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
182 types->quick_push (TREE_VALUE (t));
185 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
186 friendly way, assuming they are meant to be applied to FNDECL. */
188 void
189 ipa_dump_adjusted_parameters (FILE *f,
190 vec<ipa_adjusted_param, va_gc> *adj_params)
192 unsigned i, len = vec_safe_length (adj_params);
193 bool first = true;
195 if (!len)
196 return;
198 fprintf (f, " IPA adjusted parameters: ");
199 for (i = 0; i < len; i++)
201 struct ipa_adjusted_param *apm;
202 apm = &(*adj_params)[i];
204 if (!first)
205 fprintf (f, " ");
206 else
207 first = false;
209 fprintf (f, "%i. %s %s", i, ipa_param_op_names[apm->op],
210 apm->prev_clone_adjustment ? "prev_clone_adjustment " : "");
211 switch (apm->op)
213 case IPA_PARAM_OP_UNDEFINED:
214 break;
216 case IPA_PARAM_OP_COPY:
217 fprintf (f, ", base_index: %u", apm->base_index);
218 fprintf (f, ", prev_clone_index: %u", apm->prev_clone_index);
219 break;
221 case IPA_PARAM_OP_SPLIT:
222 fprintf (f, ", offset: %u", apm->unit_offset);
223 /* fall-through */
224 case IPA_PARAM_OP_NEW:
225 fprintf (f, ", base_index: %u", apm->base_index);
226 fprintf (f, ", prev_clone_index: %u", apm->prev_clone_index);
227 print_node_brief (f, ", type: ", apm->type, 0);
228 print_node_brief (f, ", alias type: ", apm->alias_ptr_type, 0);
229 fprintf (f, " prefix: %s",
230 ipa_param_prefixes[apm->param_prefix_index]);
231 if (apm->reverse)
232 fprintf (f, ", reverse");
233 break;
235 fprintf (f, "\n");
239 /* Fill NEW_TYPES with types of a function after its current OTYPES have been
240 modified as described in ADJ_PARAMS. When USE_PREV_INDICES is true, use
241 prev_clone_index from ADJ_PARAMS as opposed to base_index when the parameter
242 is false. */
244 static void
245 fill_vector_of_new_param_types (vec<tree> *new_types, vec<tree> *otypes,
246 vec<ipa_adjusted_param, va_gc> *adj_params,
247 bool use_prev_indices)
249 unsigned adj_len = vec_safe_length (adj_params);
250 new_types->reserve_exact (adj_len);
251 for (unsigned i = 0; i < adj_len ; i++)
253 ipa_adjusted_param *apm = &(*adj_params)[i];
254 if (apm->op == IPA_PARAM_OP_COPY)
256 unsigned index
257 = use_prev_indices ? apm->prev_clone_index : apm->base_index;
258 /* The following needs to be handled gracefully because of type
259 mismatches. This happens with LTO but apparently also in Fortran
260 with -fcoarray=lib -O2 -lcaf_single -latomic. */
261 if (index >= otypes->length ())
262 continue;
263 new_types->quick_push ((*otypes)[index]);
265 else if (apm->op == IPA_PARAM_OP_NEW
266 || apm->op == IPA_PARAM_OP_SPLIT)
268 tree ntype = apm->type;
269 if (is_gimple_reg_type (ntype)
270 && TYPE_MODE (ntype) != BLKmode)
272 unsigned malign = GET_MODE_ALIGNMENT (TYPE_MODE (ntype));
273 if (TYPE_ALIGN (ntype) != malign)
274 ntype = build_aligned_type (ntype, malign);
276 new_types->quick_push (ntype);
278 else
279 gcc_unreachable ();
283 /* Return false if given attribute should prevent type adjustments. */
285 bool
286 ipa_param_adjustments::type_attribute_allowed_p (tree name)
288 if ((is_attribute_p ("fn spec", name) && flag_ipa_modref)
289 || is_attribute_p ("access", name)
290 || is_attribute_p ("returns_nonnull", name)
291 || is_attribute_p ("assume_aligned", name)
292 || is_attribute_p ("nocf_check", name)
293 || is_attribute_p ("warn_unused_result", name))
294 return true;
295 return false;
298 /* Return true if attribute should be dropped if parameter changed. */
300 static bool
301 drop_type_attribute_if_params_changed_p (tree name)
303 if (is_attribute_p ("fn spec", name)
304 || is_attribute_p ("access", name))
305 return true;
306 return false;
309 /* Build and return a function type just like ORIG_TYPE but with parameter
310 types given in NEW_PARAM_TYPES - which can be NULL if, but only if,
311 ORIG_TYPE itself has NULL TREE_ARG_TYPEs. If METHOD2FUNC is true, also make
312 it a FUNCTION_TYPE instead of FUNCTION_TYPE.
313 If ARG_MODIFIED is true drop attributes that are no longer up to date. */
315 static tree
316 build_adjusted_function_type (tree orig_type, vec<tree> *new_param_types,
317 bool method2func, bool skip_return,
318 bool args_modified)
320 tree new_arg_types = NULL;
321 if (TYPE_ARG_TYPES (orig_type))
323 gcc_checking_assert (new_param_types);
324 bool last_parm_void = (TREE_VALUE (tree_last (TYPE_ARG_TYPES (orig_type)))
325 == void_type_node);
326 unsigned len = new_param_types->length ();
327 for (unsigned i = 0; i < len; i++)
328 new_arg_types = tree_cons (NULL_TREE, (*new_param_types)[i],
329 new_arg_types);
331 tree new_reversed = nreverse (new_arg_types);
332 if (last_parm_void)
334 if (new_reversed)
335 TREE_CHAIN (new_arg_types) = void_list_node;
336 else
337 new_reversed = void_list_node;
339 new_arg_types = new_reversed;
342 /* Use build_distinct_type_copy to preserve as much as possible from original
343 type (debug info, attribute lists etc.). The one exception is
344 METHOD_TYPEs which must have THIS argument and when we are asked to remove
345 it, we need to build new FUNCTION_TYPE instead. */
346 tree new_type = NULL;
347 if (method2func)
349 tree ret_type;
350 if (skip_return)
351 ret_type = void_type_node;
352 else
353 ret_type = TREE_TYPE (orig_type);
355 new_type
356 = build_distinct_type_copy (build_function_type (ret_type,
357 new_arg_types));
358 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
360 else
362 new_type = build_distinct_type_copy (orig_type);
363 TYPE_ARG_TYPES (new_type) = new_arg_types;
364 if (skip_return)
365 TREE_TYPE (new_type) = void_type_node;
367 if (args_modified && TYPE_ATTRIBUTES (new_type))
369 tree t = TYPE_ATTRIBUTES (new_type);
370 tree *last = &TYPE_ATTRIBUTES (new_type);
371 TYPE_ATTRIBUTES (new_type) = NULL;
372 for (;t; t = TREE_CHAIN (t))
373 if (!drop_type_attribute_if_params_changed_p
374 (get_attribute_name (t)))
376 *last = copy_node (t);
377 TREE_CHAIN (*last) = NULL;
378 last = &TREE_CHAIN (*last);
382 return new_type;
385 /* Return the maximum index in any IPA_PARAM_OP_COPY adjustment or -1 if there
386 is none. */
389 ipa_param_adjustments::get_max_base_index ()
391 unsigned adj_len = vec_safe_length (m_adj_params);
392 int max_index = -1;
393 for (unsigned i = 0; i < adj_len ; i++)
395 ipa_adjusted_param *apm = &(*m_adj_params)[i];
396 if (apm->op == IPA_PARAM_OP_COPY
397 && max_index < apm->base_index)
398 max_index = apm->base_index;
400 return max_index;
404 /* Fill SURVIVING_PARAMS with an array of bools where each one says whether a
405 parameter that originally was at that position still survives in the given
406 clone or is removed/replaced. If the final array is smaller than an index
407 of an original parameter, that parameter also did not survive. That a
408 parameter survives does not mean it has the same index as before. */
410 void
411 ipa_param_adjustments::get_surviving_params (vec<bool> *surviving_params)
413 unsigned adj_len = vec_safe_length (m_adj_params);
414 int max_index = get_max_base_index ();
416 if (max_index < 0)
417 return;
418 surviving_params->reserve_exact (max_index + 1);
419 surviving_params->quick_grow_cleared (max_index + 1);
420 for (unsigned i = 0; i < adj_len ; i++)
422 ipa_adjusted_param *apm = &(*m_adj_params)[i];
423 if (apm->op == IPA_PARAM_OP_COPY)
424 (*surviving_params)[apm->base_index] = true;
428 /* Fill NEW_INDICES with new indices of each surviving parameter or -1 for
429 those which do not survive. Any parameter outside of lenght of the vector
430 does not survive. There is currently no support for a parameter to be
431 copied to two distinct new parameters. */
433 void
434 ipa_param_adjustments::get_updated_indices (vec<int> *new_indices)
436 unsigned adj_len = vec_safe_length (m_adj_params);
437 int max_index = get_max_base_index ();
439 if (max_index < 0)
440 return;
441 unsigned res_len = max_index + 1;
442 new_indices->reserve_exact (res_len);
443 for (unsigned i = 0; i < res_len ; i++)
444 new_indices->quick_push (-1);
445 for (unsigned i = 0; i < adj_len ; i++)
447 ipa_adjusted_param *apm = &(*m_adj_params)[i];
448 if (apm->op == IPA_PARAM_OP_COPY)
449 (*new_indices)[apm->base_index] = i;
453 /* Return the original index for the given new parameter index. Return a
454 negative number if not available. */
457 ipa_param_adjustments::get_original_index (int newidx)
459 const ipa_adjusted_param *adj = &(*m_adj_params)[newidx];
460 if (adj->op != IPA_PARAM_OP_COPY)
461 return -1;
462 return adj->base_index;
465 /* Return true if the first parameter (assuming there was one) survives the
466 transformation intact and remains the first one. */
468 bool
469 ipa_param_adjustments::first_param_intact_p ()
471 return (!vec_safe_is_empty (m_adj_params)
472 && (*m_adj_params)[0].op == IPA_PARAM_OP_COPY
473 && (*m_adj_params)[0].base_index == 0);
476 /* Return true if we have to change what has formerly been a method into a
477 function. */
479 bool
480 ipa_param_adjustments::method2func_p (tree orig_type)
482 return ((TREE_CODE (orig_type) == METHOD_TYPE) && !first_param_intact_p ());
485 /* Given function type OLD_TYPE, return a new type derived from it after
486 performing all atored modifications. TYPE_ORIGINAL_P should be true when
487 OLD_TYPE refers to the type before any IPA transformations, as opposed to a
488 type that can be an intermediate one in between various IPA
489 transformations. */
491 tree
492 ipa_param_adjustments::build_new_function_type (tree old_type,
493 bool type_original_p)
495 auto_vec<tree,16> new_param_types, *new_param_types_p;
496 if (prototype_p (old_type))
498 auto_vec<tree, 16> otypes;
499 push_function_arg_types (&otypes, old_type);
500 fill_vector_of_new_param_types (&new_param_types, &otypes, m_adj_params,
501 !type_original_p);
502 new_param_types_p = &new_param_types;
504 else
505 new_param_types_p = NULL;
507 /* Check if any params type cares about are modified. In this case will
508 need to drop some type attributes. */
509 bool modified = false;
510 size_t index = 0;
511 if (m_adj_params)
512 for (tree t = TYPE_ARG_TYPES (old_type);
513 t && (int)index < m_always_copy_start && !modified;
514 t = TREE_CHAIN (t), index++)
515 if (index >= m_adj_params->length ()
516 || get_original_index (index) != (int)index)
517 modified = true;
520 return build_adjusted_function_type (old_type, new_param_types_p,
521 method2func_p (old_type), m_skip_return,
522 modified);
525 /* Build variant of function decl ORIG_DECL which has no return value if
526 M_SKIP_RETURN is true and, if ORIG_DECL's types or parameters is known, has
527 this type adjusted as indicated in M_ADJ_PARAMS. Arguments from
528 DECL_ARGUMENTS list are not processed now, since they are linked by
529 TREE_CHAIN directly and not accessible in LTO during WPA. The caller is
530 responsible for eliminating them when clones are properly materialized. */
532 tree
533 ipa_param_adjustments::adjust_decl (tree orig_decl)
535 tree new_decl = copy_node (orig_decl);
536 tree orig_type = TREE_TYPE (orig_decl);
537 if (prototype_p (orig_type)
538 || (m_skip_return && !VOID_TYPE_P (TREE_TYPE (orig_type))))
540 tree new_type = build_new_function_type (orig_type, false);
541 TREE_TYPE (new_decl) = new_type;
543 if (method2func_p (orig_type))
544 DECL_VINDEX (new_decl) = NULL_TREE;
546 /* When signature changes, we need to clear builtin info. */
547 if (fndecl_built_in_p (new_decl))
548 set_decl_built_in_function (new_decl, NOT_BUILT_IN, 0);
550 DECL_VIRTUAL_P (new_decl) = 0;
551 DECL_LANG_SPECIFIC (new_decl) = NULL;
553 /* Drop MALLOC attribute for a void function. */
554 if (m_skip_return)
555 DECL_IS_MALLOC (new_decl) = 0;
557 return new_decl;
560 /* Wrapper around get_base_ref_and_offset for cases interesting for IPA-SRA
561 transformations. Return true if EXPR has an interesting form and fill in
562 *BASE_P and *UNIT_OFFSET_P with the appropriate info. */
564 static bool
565 isra_get_ref_base_and_offset (tree expr, tree *base_p, unsigned *unit_offset_p)
567 HOST_WIDE_INT offset, size;
568 bool reverse;
569 tree base
570 = get_ref_base_and_extent_hwi (expr, &offset, &size, &reverse);
571 if (!base || size < 0)
572 return false;
574 if ((offset % BITS_PER_UNIT) != 0)
575 return false;
577 if (TREE_CODE (base) == MEM_REF)
579 poly_int64 plmoff = mem_ref_offset (base).force_shwi ();
580 HOST_WIDE_INT moff;
581 bool is_cst = plmoff.is_constant (&moff);
582 if (!is_cst)
583 return false;
584 offset += moff * BITS_PER_UNIT;
585 base = TREE_OPERAND (base, 0);
588 if (offset < 0 || (offset / BITS_PER_UNIT) > UINT_MAX)
589 return false;
591 *base_p = base;
592 *unit_offset_p = offset / BITS_PER_UNIT;
593 return true;
596 /* Remove all statements that use NAME directly or indirectly. KILLED_SSAS
597 contains the SSA_NAMEs that are already being or have been processed and new
598 ones need to be added to it. The function only has to process situations
599 handled by ssa_name_only_returned_p in ipa-sra.cc with the exception that it
600 can assume it must never reach a use in a return statement. */
602 static void
603 purge_all_uses (tree name, hash_set <tree> *killed_ssas)
605 imm_use_iterator imm_iter;
606 gimple *stmt;
607 auto_vec <tree, 4> worklist;
609 worklist.safe_push (name);
610 while (!worklist.is_empty ())
612 tree cur_name = worklist.pop ();
613 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, cur_name)
615 if (gimple_debug_bind_p (stmt))
617 /* When runing within tree-inline, we will never end up here but
618 adding the SSAs to killed_ssas will do the trick in this case
619 and the respective debug statements will get reset. */
620 gimple_debug_bind_reset_value (stmt);
621 update_stmt (stmt);
622 continue;
625 tree lhs = NULL_TREE;
626 if (is_gimple_assign (stmt))
627 lhs = gimple_assign_lhs (stmt);
628 else if (gimple_code (stmt) == GIMPLE_PHI)
629 lhs = gimple_phi_result (stmt);
630 gcc_assert (lhs
631 && (TREE_CODE (lhs) == SSA_NAME)
632 && !gimple_vdef (stmt));
633 if (!killed_ssas->add (lhs))
635 worklist.safe_push (lhs);
636 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
637 gsi_remove (&gsi, true);
643 /* Modify actual arguments of a function call in statement currently belonging
644 to CS, and make it call CS->callee->decl. Return the new statement that
645 replaced the old one. When invoked, cfun and current_function_decl have to
646 be set to the caller. When called from within tree-inline, KILLED_SSAs has
647 to contain the pointer to killed_new_ssa_names within the copy_body_data
648 structure and SSAs discovered to be useless (if LHS is removed) will be
649 added to it, otherwise it needs to be NULL. */
651 gcall *
652 ipa_param_adjustments::modify_call (cgraph_edge *cs,
653 bool update_references,
654 hash_set <tree> *killed_ssas)
656 gcall *stmt = cs->call_stmt;
657 tree callee_decl = cs->callee->decl;
659 ipa_edge_modification_info *mod_info
660 = ipa_edge_modifications ? ipa_edge_modifications->get (cs) : NULL;
661 if (mod_info && symtab->dump_file)
663 fprintf (symtab->dump_file, "Information about pre-exiting "
664 "modifications.\n Index map:");
665 unsigned idx_len = mod_info->index_map.length ();
666 for (unsigned i = 0; i < idx_len; i++)
667 fprintf (symtab->dump_file, " %i", mod_info->index_map[i]);
668 fprintf (symtab->dump_file, "\n Pass-through split map: ");
669 unsigned ptm_len = mod_info->pass_through_map.length ();
670 for (unsigned i = 0; i < ptm_len; i++)
671 fprintf (symtab->dump_file,
672 " (base_index: %u, offset: %u, new_index: %i)",
673 mod_info->pass_through_map[i].base_index,
674 mod_info->pass_through_map[i].unit_offset,
675 mod_info->pass_through_map[i].new_index);
676 fprintf (symtab->dump_file, "\n Always-copy delta: %i\n",
677 mod_info->always_copy_delta);
680 unsigned len = vec_safe_length (m_adj_params);
681 auto_vec<tree, 16> vargs (len);
682 unsigned old_nargs = gimple_call_num_args (stmt);
683 unsigned orig_nargs = mod_info ? mod_info->index_map.length () : old_nargs;
684 auto_vec<bool, 16> kept (old_nargs);
685 kept.quick_grow_cleared (old_nargs);
687 cgraph_node *current_node = cgraph_node::get (current_function_decl);
688 if (update_references)
689 current_node->remove_stmt_references (stmt);
691 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
692 gimple_stmt_iterator prev_gsi = gsi;
693 gsi_prev (&prev_gsi);
694 for (unsigned i = 0; i < len; i++)
696 ipa_adjusted_param *apm = &(*m_adj_params)[i];
697 if (apm->op == IPA_PARAM_OP_COPY)
699 int index = apm->base_index;
700 if ((unsigned) index >= orig_nargs)
701 /* Can happen if the original call has argument mismatch,
702 ignore. */
703 continue;
704 if (mod_info)
706 index = mod_info->index_map[apm->base_index];
707 gcc_assert (index >= 0);
710 tree arg = gimple_call_arg (stmt, index);
712 vargs.quick_push (arg);
713 kept[index] = true;
714 continue;
717 /* At the moment the only user of IPA_PARAM_OP_NEW modifies calls itself.
718 If we ever want to support it during WPA IPA stage, we'll need a
719 mechanism to call into the IPA passes that introduced them. Currently
720 we simply mandate that IPA infrastructure understands all argument
721 modifications. Remember, edge redirection/modification is done only
722 once, not in steps for each pass modifying the callee like clone
723 materialization. */
724 gcc_assert (apm->op == IPA_PARAM_OP_SPLIT);
726 /* We have to handle pass-through changes differently using the map
727 clone materialziation might have left behind. */
728 tree repl = NULL_TREE;
729 unsigned ptm_len = mod_info ? mod_info->pass_through_map.length () : 0;
730 for (unsigned j = 0; j < ptm_len; j++)
731 if (mod_info->pass_through_map[j].base_index == apm->base_index
732 && mod_info->pass_through_map[j].unit_offset == apm->unit_offset)
734 int repl_idx = mod_info->pass_through_map[j].new_index;
735 gcc_assert (repl_idx >= 0);
736 repl = gimple_call_arg (stmt, repl_idx);
737 break;
739 if (repl)
741 vargs.quick_push (repl);
742 continue;
745 int index = apm->base_index;
746 if ((unsigned) index >= orig_nargs)
747 /* Can happen if the original call has argument mismatch, ignore. */
748 continue;
749 if (mod_info)
751 index = mod_info->index_map[apm->base_index];
752 gcc_assert (index >= 0);
754 tree base = gimple_call_arg (stmt, index);
756 /* We create a new parameter out of the value of the old one, we can
757 do the following kind of transformations:
759 - A scalar passed by reference, potentially as a part of a larger
760 aggregate, is converted to a scalar passed by value.
762 - A part of an aggregate is passed instead of the whole aggregate. */
764 location_t loc = gimple_location (stmt);
765 tree off;
766 bool deref_base = false;
767 unsigned int deref_align = 0;
768 if (TREE_CODE (base) != ADDR_EXPR
769 && is_gimple_reg_type (TREE_TYPE (base)))
771 /* Detect type mismatches in calls in invalid programs and make a
772 poor attempt to gracefully convert them so that we don't ICE. */
773 if (!POINTER_TYPE_P (TREE_TYPE (base)))
774 base = force_value_to_type (ptr_type_node, base);
776 off = build_int_cst (apm->alias_ptr_type, apm->unit_offset);
778 else
780 bool addrof;
781 if (TREE_CODE (base) == ADDR_EXPR)
783 base = TREE_OPERAND (base, 0);
784 addrof = true;
786 else
787 addrof = false;
789 tree prev_base = base;
790 poly_int64 base_offset;
791 base = get_addr_base_and_unit_offset (base, &base_offset);
793 /* Aggregate arguments can have non-invariant addresses. */
794 if (!base)
796 base = build_fold_addr_expr (prev_base);
797 off = build_int_cst (apm->alias_ptr_type, apm->unit_offset);
799 else if (TREE_CODE (base) == MEM_REF)
801 if (!addrof)
803 deref_base = true;
804 deref_align = TYPE_ALIGN (TREE_TYPE (base));
806 off = build_int_cst (apm->alias_ptr_type,
807 base_offset + apm->unit_offset);
808 off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
809 off);
810 base = TREE_OPERAND (base, 0);
812 else
814 off = build_int_cst (apm->alias_ptr_type,
815 base_offset + apm->unit_offset);
816 base = build_fold_addr_expr (base);
820 tree type = apm->type;
821 unsigned int align;
822 unsigned HOST_WIDE_INT misalign;
824 if (deref_base)
826 align = deref_align;
827 misalign = 0;
829 else
831 get_pointer_alignment_1 (base, &align, &misalign);
832 /* All users must make sure that we can be optimistic when it
833 comes to alignment in this case (by inspecting the final users
834 of these new parameters). */
835 if (TYPE_ALIGN (type) > align)
836 align = TYPE_ALIGN (type);
838 misalign
839 += (offset_int::from (wi::to_wide (off), SIGNED).to_short_addr ()
840 * BITS_PER_UNIT);
841 misalign = misalign & (align - 1);
842 if (misalign != 0)
843 align = least_bit_hwi (misalign);
844 if (align < TYPE_ALIGN (type))
845 type = build_aligned_type (type, align);
846 base = force_gimple_operand_gsi (&gsi, base,
847 true, NULL, true, GSI_SAME_STMT);
848 tree expr = fold_build2_loc (loc, MEM_REF, type, base, off);
849 REF_REVERSE_STORAGE_ORDER (expr) = apm->reverse;
850 /* If expr is not a valid gimple call argument emit
851 a load into a temporary. */
852 if (is_gimple_reg_type (TREE_TYPE (expr)))
854 gimple *tem = gimple_build_assign (NULL_TREE, expr);
855 if (gimple_in_ssa_p (cfun))
857 gimple_set_vuse (tem, gimple_vuse (stmt));
858 expr = make_ssa_name (TREE_TYPE (expr), tem);
860 else
861 expr = create_tmp_reg (TREE_TYPE (expr));
862 gimple_assign_set_lhs (tem, expr);
863 gsi_insert_before (&gsi, tem, GSI_SAME_STMT);
865 vargs.quick_push (expr);
868 if (m_always_copy_start >= 0)
870 int always_copy_start = m_always_copy_start;
871 if (mod_info)
873 always_copy_start += mod_info->always_copy_delta;
874 gcc_assert (always_copy_start >= 0);
876 for (unsigned i = always_copy_start; i < old_nargs; i++)
877 vargs.safe_push (gimple_call_arg (stmt, i));
880 /* For optimized away parameters, add on the caller side
881 before the call
882 DEBUG D#X => parm_Y(D)
883 stmts and associate D#X with parm in decl_debug_args_lookup
884 vector to say for debug info that if parameter parm had been passed,
885 it would have value parm_Y(D). */
886 tree old_decl = gimple_call_fndecl (stmt);
887 if (MAY_HAVE_DEBUG_BIND_STMTS && old_decl && callee_decl)
889 vec<tree, va_gc> **debug_args = NULL;
890 unsigned i = 0;
891 cgraph_node *callee_node = cgraph_node::get (callee_decl);
893 /* FIXME: we don't seem to be able to insert debug args before clone
894 is materialized. Materializing them early leads to extra memory
895 use. */
896 if (callee_node->clone_of)
897 callee_node->get_untransformed_body ();
898 for (tree old_parm = DECL_ARGUMENTS (old_decl);
899 old_parm && i < old_nargs && ((int) i) < m_always_copy_start;
900 old_parm = DECL_CHAIN (old_parm), i++)
902 if (!is_gimple_reg (old_parm) || kept[i])
903 continue;
904 tree arg;
905 if (mod_info)
907 if (mod_info->index_map[i] < 0)
908 continue;
909 arg = gimple_call_arg (stmt, mod_info->index_map[i]);
911 else
912 arg = gimple_call_arg (stmt, i);
914 tree origin = DECL_ORIGIN (old_parm);
915 if (!useless_type_conversion_p (TREE_TYPE (origin), TREE_TYPE (arg)))
917 if (!fold_convertible_p (TREE_TYPE (origin), arg))
918 continue;
919 tree rhs1;
920 if (TREE_CODE (arg) == SSA_NAME
921 && gimple_assign_cast_p (SSA_NAME_DEF_STMT (arg))
922 && (rhs1
923 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (arg)))
924 && useless_type_conversion_p (TREE_TYPE (origin),
925 TREE_TYPE (rhs1)))
926 arg = rhs1;
927 else
928 arg = fold_convert_loc (gimple_location (stmt),
929 TREE_TYPE (origin), arg);
931 if (debug_args == NULL)
932 debug_args = decl_debug_args_insert (callee_decl);
933 unsigned int ix;
934 tree ddecl = NULL_TREE;
935 for (ix = 0; vec_safe_iterate (*debug_args, ix, &ddecl); ix += 2)
936 if (ddecl == origin)
938 ddecl = (**debug_args)[ix + 1];
939 break;
941 if (ddecl == NULL)
943 ddecl = build_debug_expr_decl (TREE_TYPE (origin));
944 /* FIXME: Is setting the mode really necessary? */
945 SET_DECL_MODE (ddecl, DECL_MODE (origin));
947 vec_safe_push (*debug_args, origin);
948 vec_safe_push (*debug_args, ddecl);
950 gimple *def_temp = gimple_build_debug_bind (ddecl,
951 unshare_expr (arg), stmt);
952 gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
956 if (dump_file && (dump_flags & TDF_DETAILS))
958 fprintf (dump_file, "replacing stmt:");
959 print_gimple_stmt (dump_file, gsi_stmt (gsi), 0);
962 gcall *new_stmt = gimple_build_call_vec (callee_decl, vargs);
964 hash_set <tree> *ssas_to_remove = NULL;
965 if (tree lhs = gimple_call_lhs (stmt))
967 if (!m_skip_return)
968 gimple_call_set_lhs (new_stmt, lhs);
969 else if (TREE_CODE (lhs) == SSA_NAME)
971 if (!killed_ssas)
973 ssas_to_remove = new hash_set<tree> (8);
974 killed_ssas = ssas_to_remove;
976 killed_ssas->add (lhs);
977 purge_all_uses (lhs, killed_ssas);
981 gimple_set_block (new_stmt, gimple_block (stmt));
982 if (gimple_has_location (stmt))
983 gimple_set_location (new_stmt, gimple_location (stmt));
984 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
985 gimple_call_copy_flags (new_stmt, stmt);
986 if (gimple_in_ssa_p (cfun))
987 gimple_move_vops (new_stmt, stmt);
989 if (dump_file && (dump_flags & TDF_DETAILS))
991 fprintf (dump_file, "with stmt:");
992 print_gimple_stmt (dump_file, new_stmt, 0);
993 fprintf (dump_file, "\n");
995 gsi_replace (&gsi, new_stmt, true);
996 if (ssas_to_remove)
998 ipa_release_ssas_in_hash (ssas_to_remove);
999 delete ssas_to_remove;
1001 if (update_references)
1004 current_node->record_stmt_references (gsi_stmt (gsi));
1005 gsi_prev (&gsi);
1007 while (gsi_stmt (gsi) != gsi_stmt (prev_gsi));
1009 if (mod_info)
1010 ipa_edge_modifications->remove (cs);
1011 return new_stmt;
1014 /* Dump information contained in the object in textual form to F. */
1016 void
1017 ipa_param_adjustments::dump (FILE *f)
1019 fprintf (f, " m_always_copy_start: %i\n", m_always_copy_start);
1020 ipa_dump_adjusted_parameters (f, m_adj_params);
1021 if (m_skip_return)
1022 fprintf (f, " Will SKIP return.\n");
1025 /* Dump information contained in the object in textual form to stderr. */
1027 void
1028 ipa_param_adjustments::debug ()
1030 dump (stderr);
1033 /* Register a REPLACEMENT for accesses to BASE at UNIT_OFFSET. */
1035 void
1036 ipa_param_body_adjustments::register_replacement (tree base,
1037 unsigned unit_offset,
1038 tree replacement)
1040 ipa_param_body_replacement psr;
1041 psr.base = base;
1042 psr.repl = replacement;
1043 psr.dummy = NULL_TREE;
1044 psr.unit_offset = unit_offset;
1045 m_replacements.safe_push (psr);
1046 m_sorted_replacements_p = false;
1049 /* Register that REPLACEMENT should replace parameter described in APM. */
1051 void
1052 ipa_param_body_adjustments::register_replacement (ipa_adjusted_param *apm,
1053 tree replacement)
1055 gcc_checking_assert (apm->op == IPA_PARAM_OP_SPLIT
1056 || apm->op == IPA_PARAM_OP_NEW);
1057 gcc_checking_assert (!apm->prev_clone_adjustment);
1058 register_replacement (m_oparms[apm->prev_clone_index], apm->unit_offset,
1059 replacement);
1062 /* Comparator for sorting and searching
1063 ipa_param_body_adjustments::m_replacements. */
1065 static int
1066 compare_param_body_replacement (const void *va, const void *vb)
1068 const ipa_param_body_replacement *a = (const ipa_param_body_replacement *) va;
1069 const ipa_param_body_replacement *b = (const ipa_param_body_replacement *) vb;
1071 if (DECL_UID (a->base) < DECL_UID (b->base))
1072 return -1;
1073 if (DECL_UID (a->base) > DECL_UID (b->base))
1074 return 1;
1075 if (a->unit_offset < b->unit_offset)
1076 return -1;
1077 if (a->unit_offset > b->unit_offset)
1078 return 1;
1079 return 0;
1082 /* Sort m_replacements and set m_sorted_replacements_p to true. */
1084 void
1085 ipa_param_body_adjustments::sort_replacements ()
1087 if (m_sorted_replacements_p)
1088 return;
1089 m_replacements.qsort (compare_param_body_replacement);
1090 m_sorted_replacements_p = true;
1093 /* Copy or not, as appropriate given m_id and decl context, a pre-existing
1094 PARM_DECL T so that it can be included in the parameters of the modified
1095 function. */
1097 tree
1098 ipa_param_body_adjustments::carry_over_param (tree t)
1100 tree new_parm;
1101 if (m_id)
1103 new_parm = remap_decl (t, m_id);
1104 if (TREE_CODE (new_parm) != PARM_DECL)
1105 new_parm = m_id->copy_decl (t, m_id);
1107 else if (DECL_CONTEXT (t) != m_fndecl)
1109 new_parm = copy_node (t);
1110 DECL_CONTEXT (new_parm) = m_fndecl;
1112 else
1113 new_parm = t;
1114 return new_parm;
1117 /* If DECL is a gimple register that has a default definition SSA name and that
1118 has some uses, return the default definition, otherwise return NULL_TREE. */
1120 tree
1121 ipa_param_body_adjustments::get_ddef_if_exists_and_is_used (tree decl)
1123 if (!is_gimple_reg (decl))
1124 return NULL_TREE;
1125 tree ddef = ssa_default_def (m_id->src_cfun, decl);
1126 if (!ddef || has_zero_uses (ddef))
1127 return NULL_TREE;
1128 return ddef;
1131 /* Populate m_dead_stmts given that DEAD_PARAM is going to be removed without
1132 any replacement or splitting. REPL is the replacement VAR_SECL to base any
1133 remaining uses of a removed parameter on. Push all removed SSA names that
1134 are used within debug statements to DEBUGSTACK. */
1136 void
1137 ipa_param_body_adjustments::mark_dead_statements (tree dead_param,
1138 vec<tree> *debugstack)
1140 /* Current IPA analyses which remove unused parameters never remove a
1141 non-gimple register ones which have any use except as parameters in other
1142 calls, so we can safely leve them as they are. */
1143 tree parm_ddef = get_ddef_if_exists_and_is_used (dead_param);
1144 if (!parm_ddef)
1145 return;
1147 auto_vec<tree, 4> stack;
1148 hash_set<tree> used_in_debug;
1149 m_dead_ssas.add (parm_ddef);
1150 stack.safe_push (parm_ddef);
1151 while (!stack.is_empty ())
1153 imm_use_iterator imm_iter;
1154 use_operand_p use_p;
1155 tree t = stack.pop ();
1157 insert_decl_map (m_id, t, error_mark_node);
1158 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, t)
1160 gimple *stmt = USE_STMT (use_p);
1162 /* Calls containing dead arguments cannot be deleted,
1163 modify_call_stmt will instead remove just the argument later on.
1164 If isra_track_scalar_value_uses in ipa-sra.cc is extended to look
1165 through const functions, we will need to do so here too. */
1166 if (is_gimple_call (stmt)
1167 || (m_id->blocks_to_copy
1168 && !bitmap_bit_p (m_id->blocks_to_copy,
1169 gimple_bb (stmt)->index)))
1170 continue;
1172 if (is_gimple_debug (stmt))
1174 m_dead_stmts.add (stmt);
1175 gcc_assert (gimple_debug_bind_p (stmt));
1176 if (!used_in_debug.contains (t))
1178 used_in_debug.add (t);
1179 debugstack->safe_push (t);
1182 else if (gimple_code (stmt) == GIMPLE_PHI)
1184 gphi *phi = as_a <gphi *> (stmt);
1185 int ix = PHI_ARG_INDEX_FROM_USE (use_p);
1187 if (!m_id->blocks_to_copy
1188 || bitmap_bit_p (m_id->blocks_to_copy,
1189 gimple_phi_arg_edge (phi, ix)->src->index))
1191 m_dead_stmts.add (phi);
1192 tree res = gimple_phi_result (phi);
1193 if (!m_dead_ssas.add (res))
1194 stack.safe_push (res);
1197 else if (is_gimple_assign (stmt))
1199 m_dead_stmts.add (stmt);
1200 if (!gimple_clobber_p (stmt))
1202 tree lhs = gimple_assign_lhs (stmt);
1203 gcc_assert (TREE_CODE (lhs) == SSA_NAME);
1204 if (!m_dead_ssas.add (lhs))
1205 stack.safe_push (lhs);
1208 else if (gimple_code (stmt) == GIMPLE_RETURN)
1209 gcc_assert (m_adjustments && m_adjustments->m_skip_return);
1210 else
1211 /* IPA-SRA does not analyze other types of statements. */
1212 gcc_unreachable ();
1216 if (!MAY_HAVE_DEBUG_STMTS)
1218 gcc_assert (debugstack->is_empty ());
1219 return;
1222 tree dp_ddecl = build_debug_expr_decl (TREE_TYPE (dead_param));
1223 /* FIXME: Is setting the mode really necessary? */
1224 SET_DECL_MODE (dp_ddecl, DECL_MODE (dead_param));
1225 m_dead_ssa_debug_equiv.put (parm_ddef, dp_ddecl);
1228 /* Put all clobbers of of dereference of default definition of PARAM into
1229 m_dead_stmts. If there are returns among uses of the default definition of
1230 PARAM, verify they will be stripped off the return value. */
1232 void
1233 ipa_param_body_adjustments::mark_clobbers_dead (tree param)
1235 if (!is_gimple_reg (param))
1236 return;
1237 tree ddef = get_ddef_if_exists_and_is_used (param);
1238 if (!ddef)
1239 return;
1241 imm_use_iterator imm_iter;
1242 use_operand_p use_p;
1243 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, ddef)
1245 gimple *stmt = USE_STMT (use_p);
1246 if (gimple_clobber_p (stmt))
1247 m_dead_stmts.add (stmt);
1248 else if (gimple_code (stmt) == GIMPLE_RETURN)
1249 gcc_assert (m_adjustments && m_adjustments->m_skip_return);
1253 /* Callback to walk_tree. If REMAP is an SSA_NAME that is present in hash_map
1254 passed in DATA, replace it with unshared version of what it was mapped to.
1255 If an SSA argument would be remapped to NULL, the whole operation needs to
1256 abort which is signaled by returning error_mark_node. */
1258 static tree
1259 replace_with_mapped_expr (tree *remap, int *walk_subtrees, void *data)
1261 if (TYPE_P (*remap))
1263 *walk_subtrees = 0;
1264 return 0;
1266 if (TREE_CODE (*remap) != SSA_NAME)
1267 return 0;
1269 *walk_subtrees = 0;
1271 hash_map<tree, tree> *equivs = (hash_map<tree, tree> *) data;
1272 if (tree *p = equivs->get (*remap))
1274 if (!*p)
1275 return error_mark_node;
1276 *remap = unshare_expr (*p);
1278 return 0;
1281 /* Replace all occurances of SSAs in m_dead_ssa_debug_equiv in t with what they
1282 are mapped to. */
1284 void
1285 ipa_param_body_adjustments::remap_with_debug_expressions (tree *t)
1287 /* If *t is an SSA_NAME which should have its debug statements reset, it is
1288 mapped to NULL in the hash_map.
1290 It is perhaps simpler to handle the SSA_NAME cases directly and only
1291 invoke walk_tree on more complex expressions. When
1292 remap_with_debug_expressions is called from tree-inline.cc, a to-be-reset
1293 SSA_NAME can be an operand to such expressions and the entire debug
1294 variable we are remapping should be reset. This is signaled by walk_tree
1295 returning error_mark_node and done by setting *t to NULL. */
1296 if (TREE_CODE (*t) == SSA_NAME)
1298 if (tree *p = m_dead_ssa_debug_equiv.get (*t))
1299 *t = *p;
1301 else if (walk_tree (t, replace_with_mapped_expr,
1302 &m_dead_ssa_debug_equiv, NULL) == error_mark_node)
1303 *t = NULL_TREE;
1306 /* For an SSA_NAME DEAD_SSA which is about to be DCEd because it is based on a
1307 useless parameter, prepare an expression that should represent it in
1308 debug_binds in the cloned function and add a mapping from DEAD_SSA to
1309 m_dead_ssa_debug_equiv. That mapping is to NULL when the associated
1310 debug_statement has to be reset instead. In such case return false,
1311 ottherwise return true. If DEAD_SSA comes from a basic block which is not
1312 about to be copied, ignore it and return true. */
1314 bool
1315 ipa_param_body_adjustments::prepare_debug_expressions (tree dead_ssa)
1317 gcc_checking_assert (m_dead_ssas.contains (dead_ssa));
1318 if (tree *d = m_dead_ssa_debug_equiv.get (dead_ssa))
1319 return (*d != NULL_TREE);
1321 gcc_assert (!SSA_NAME_IS_DEFAULT_DEF (dead_ssa));
1322 gimple *def = SSA_NAME_DEF_STMT (dead_ssa);
1323 if (m_id->blocks_to_copy
1324 && !bitmap_bit_p (m_id->blocks_to_copy, gimple_bb (def)->index))
1325 return true;
1327 if (gimple_code (def) == GIMPLE_PHI)
1329 /* In theory, we could ignore all SSAs coming from BBs not in
1330 m_id->blocks_to_copy but at the time of the writing this code that
1331 should never really be the case because only fnsplit uses that bitmap,
1332 so don't bother. */
1333 tree value = degenerate_phi_result (as_a <gphi *> (def));
1334 if (!value
1335 || (m_dead_ssas.contains (value)
1336 && !prepare_debug_expressions (value)))
1338 m_dead_ssa_debug_equiv.put (dead_ssa, NULL_TREE);
1339 return false;
1342 gcc_assert (TREE_CODE (value) == SSA_NAME);
1343 tree *d = m_dead_ssa_debug_equiv.get (value);
1344 m_dead_ssa_debug_equiv.put (dead_ssa, *d);
1345 return true;
1348 bool lost = false;
1349 use_operand_p use_p;
1350 ssa_op_iter oi;
1351 FOR_EACH_PHI_OR_STMT_USE (use_p, def, oi, SSA_OP_USE)
1353 tree use = USE_FROM_PTR (use_p);
1354 if (m_dead_ssas.contains (use)
1355 && !prepare_debug_expressions (use))
1357 lost = true;
1358 break;
1362 if (lost)
1364 m_dead_ssa_debug_equiv.put (dead_ssa, NULL_TREE);
1365 return false;
1368 if (is_gimple_assign (def))
1370 gcc_assert (!gimple_clobber_p (def));
1371 if (gimple_assign_copy_p (def)
1372 && TREE_CODE (gimple_assign_rhs1 (def)) == SSA_NAME)
1374 tree d = *m_dead_ssa_debug_equiv.get (gimple_assign_rhs1 (def));
1375 gcc_assert (d);
1376 m_dead_ssa_debug_equiv.put (dead_ssa, d);
1377 return true;
1380 tree val
1381 = unshare_expr_without_location (gimple_assign_rhs_to_tree (def));
1382 remap_with_debug_expressions (&val);
1384 tree vexpr = build_debug_expr_decl (TREE_TYPE (val));
1385 m_dead_stmt_debug_equiv.put (def, val);
1386 m_dead_ssa_debug_equiv.put (dead_ssa, vexpr);
1387 return true;
1389 else
1390 gcc_unreachable ();
1393 /* Common initialization performed by all ipa_param_body_adjustments
1394 constructors. OLD_FNDECL is the declaration we take original arguments
1395 from, (it may be the same as M_FNDECL). VARS, if non-NULL, is a pointer to
1396 a chained list of new local variables. TREE_MAP is the IPA-CP produced
1397 mapping of trees to constants.
1399 The function is rather long but it really onlu initializes all data members
1400 of the class. It creates new param DECLs, finds their new types, */
1402 void
1403 ipa_param_body_adjustments::common_initialization (tree old_fndecl,
1404 tree *vars,
1405 vec<ipa_replace_map *,
1406 va_gc> *tree_map)
1408 push_function_arg_decls (&m_oparms, old_fndecl);
1409 auto_vec<tree,16> otypes;
1410 if (TYPE_ARG_TYPES (TREE_TYPE (old_fndecl)) != NULL_TREE)
1411 push_function_arg_types (&otypes, TREE_TYPE (old_fndecl));
1412 else
1414 auto_vec<tree,16> oparms;
1415 push_function_arg_decls (&oparms, old_fndecl);
1416 unsigned ocount = oparms.length ();
1417 otypes.reserve_exact (ocount);
1418 for (unsigned i = 0; i < ocount; i++)
1419 otypes.quick_push (TREE_TYPE (oparms[i]));
1421 fill_vector_of_new_param_types (&m_new_types, &otypes, m_adj_params, true);
1423 auto_vec<bool, 16> kept;
1424 kept.reserve_exact (m_oparms.length ());
1425 kept.quick_grow_cleared (m_oparms.length ());
1426 auto_vec<bool, 16> split;
1427 split.reserve_exact (m_oparms.length ());
1428 split.quick_grow_cleared (m_oparms.length ());
1430 unsigned adj_len = vec_safe_length (m_adj_params);
1431 m_method2func = ((TREE_CODE (TREE_TYPE (m_fndecl)) == METHOD_TYPE)
1432 && (adj_len == 0
1433 || (*m_adj_params)[0].op != IPA_PARAM_OP_COPY
1434 || (*m_adj_params)[0].base_index != 0));
1436 /* The main job of the this function is to go over the vector of adjusted
1437 parameters and create declarations or find corresponding old ones and push
1438 them to m_new_decls. For IPA-SRA replacements it also creates
1439 corresponding m_id->dst_node->clone.performed_splits entries. */
1441 m_new_decls.reserve_exact (adj_len);
1442 for (unsigned i = 0; i < adj_len ; i++)
1444 ipa_adjusted_param *apm = &(*m_adj_params)[i];
1445 unsigned prev_index = apm->prev_clone_index;
1446 tree new_parm;
1447 if (apm->op == IPA_PARAM_OP_COPY
1448 || apm->prev_clone_adjustment)
1450 kept[prev_index] = true;
1451 new_parm = carry_over_param (m_oparms[prev_index]);
1452 m_new_decls.quick_push (new_parm);
1454 else if (apm->op == IPA_PARAM_OP_NEW
1455 || apm->op == IPA_PARAM_OP_SPLIT)
1457 tree new_type = m_new_types[i];
1458 gcc_checking_assert (new_type);
1459 new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
1460 new_type);
1461 const char *prefix = ipa_param_prefixes[apm->param_prefix_index];
1462 DECL_NAME (new_parm) = create_tmp_var_name (prefix);
1463 DECL_ARTIFICIAL (new_parm) = 1;
1464 DECL_ARG_TYPE (new_parm) = new_type;
1465 DECL_CONTEXT (new_parm) = m_fndecl;
1466 TREE_USED (new_parm) = 1;
1467 DECL_IGNORED_P (new_parm) = 1;
1468 layout_decl (new_parm, 0);
1469 m_new_decls.quick_push (new_parm);
1471 if (apm->op == IPA_PARAM_OP_SPLIT)
1473 split[prev_index] = true;
1474 register_replacement (apm, new_parm);
1477 else
1478 gcc_unreachable ();
1481 auto_vec <int, 16> index_mapping;
1482 bool need_remap = false;
1483 if (m_id)
1485 clone_info *cinfo = clone_info::get (m_id->src_node);
1486 if (cinfo && cinfo->param_adjustments)
1488 cinfo->param_adjustments->get_updated_indices (&index_mapping);
1489 need_remap = true;
1492 if (ipcp_transformation *ipcp_ts
1493 = ipcp_get_transformation_summary (m_id->src_node))
1495 for (const ipa_argagg_value &av : ipcp_ts->m_agg_values)
1497 int parm_num = av.index;
1499 if (need_remap)
1501 /* FIXME: We cannot handle the situation when IPA-CP
1502 identified that a parameter is a pointer to a global
1503 variable and at the same time the variable has some known
1504 constant contents (PR 107640). The best place to make
1505 sure we don't drop such constants on the floor probably is
1506 not here, but we have to make sure that it does not
1507 confuse the remapping. */
1508 if (parm_num >= (int) index_mapping.length ())
1509 continue;
1510 parm_num = index_mapping[parm_num];
1511 if (parm_num < 0)
1512 continue;
1515 if (!kept[parm_num])
1517 /* IPA-CP has detected an aggregate constant in a parameter
1518 that will not be kept, which means that IPA-SRA would have
1519 split it if there wasn't a constant. Because we are about
1520 to remove the original, this is the last chance where we
1521 can substitute the uses with a constant (for values passed
1522 by reference) or do the split but initialize the
1523 replacement with a constant (for split aggregates passed
1524 by value). */
1526 tree repl;
1527 if (av.by_ref)
1528 repl = av.value;
1529 else
1531 repl = create_tmp_var (TREE_TYPE (av.value),
1532 "removed_ipa_cp");
1533 gimple *init_stmt = gimple_build_assign (repl, av.value);
1534 m_split_agg_csts_inits.safe_push (init_stmt);
1536 register_replacement (m_oparms[parm_num], av.unit_offset,
1537 repl);
1538 split[parm_num] = true;
1543 sort_replacements ();
1545 if (tree_map)
1547 /* Do not treat parameters which were replaced with a constant as
1548 completely vanished. */
1549 for (unsigned i = 0; i < tree_map->length (); i++)
1551 int parm_num = (*tree_map)[i]->parm_num;
1552 gcc_assert (parm_num >= 0);
1553 if (need_remap)
1554 parm_num = index_mapping[parm_num];
1555 kept[parm_num] = true;
1559 /* As part of body modifications, we will also have to replace remaining uses
1560 of remaining uses of removed PARM_DECLs (which do not however use the
1561 initial value) with their VAR_DECL copies.
1563 We do this differently with and without m_id. With m_id, we rely on its
1564 mapping and create a replacement straight away. Without it, we have our
1565 own mechanism for which we have to populate m_removed_decls vector. Just
1566 don't mix them, that is why you should not call
1567 replace_removed_params_ssa_names or perform_cfun_body_modifications when
1568 you construct with ID not equal to NULL. */
1570 auto_vec<tree, 8> ssas_to_process_debug;
1571 unsigned op_len = m_oparms.length ();
1572 for (unsigned i = 0; i < op_len; i++)
1573 if (!kept[i])
1575 if (m_id)
1577 gcc_assert (!m_id->decl_map->get (m_oparms[i]));
1578 tree var = copy_decl_to_var (m_oparms[i], m_id);
1579 insert_decl_map (m_id, m_oparms[i], var);
1580 /* Declare this new variable. */
1581 DECL_CHAIN (var) = *vars;
1582 *vars = var;
1584 /* If this is not a split but a real removal, init hash sets
1585 that will guide what not to copy to the new body. */
1586 if (!split[i])
1587 mark_dead_statements (m_oparms[i], &ssas_to_process_debug);
1588 else
1589 mark_clobbers_dead (m_oparms[i]);
1590 if (MAY_HAVE_DEBUG_STMTS
1591 && is_gimple_reg (m_oparms[i]))
1592 m_reset_debug_decls.safe_push (m_oparms[i]);
1594 else
1596 m_removed_decls.safe_push (m_oparms[i]);
1597 m_removed_map.put (m_oparms[i], m_removed_decls.length () - 1);
1598 if (MAY_HAVE_DEBUG_STMTS
1599 && !kept[i]
1600 && is_gimple_reg (m_oparms[i]))
1601 m_reset_debug_decls.safe_push (m_oparms[i]);
1605 while (!ssas_to_process_debug.is_empty ())
1606 prepare_debug_expressions (ssas_to_process_debug.pop ());
1609 /* Constructor of ipa_param_body_adjustments from a simple list of
1610 modifications to parameters listed in ADJ_PARAMS which will prepare ground
1611 for modification of parameters of fndecl. Return value of the function will
1612 not be removed and the object will assume it does not run as a part of
1613 tree-function_versioning. */
1615 ipa_param_body_adjustments
1616 ::ipa_param_body_adjustments (vec<ipa_adjusted_param, va_gc> *adj_params,
1617 tree fndecl)
1618 : m_adj_params (adj_params), m_adjustments (NULL), m_reset_debug_decls (),
1619 m_dead_stmts (), m_dead_ssas (), m_dead_ssa_debug_equiv (),
1620 m_dead_stmt_debug_equiv (), m_fndecl (fndecl), m_id (NULL), m_oparms (),
1621 m_new_decls (), m_new_types (), m_replacements (),
1622 m_split_agg_csts_inits (), m_removed_decls (), m_removed_map (),
1623 m_method2func (false), m_sorted_replacements_p (true)
1625 common_initialization (fndecl, NULL, NULL);
1628 /* Constructor of ipa_param_body_adjustments from ipa_param_adjustments in
1629 ADJUSTMENTS which will prepare ground for modification of parameters of
1630 fndecl. The object will assume it does not run as a part of
1631 tree-function_versioning. */
1633 ipa_param_body_adjustments
1634 ::ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1635 tree fndecl)
1636 : m_adj_params (adjustments->m_adj_params), m_adjustments (adjustments),
1637 m_reset_debug_decls (), m_dead_stmts (), m_dead_ssas (),
1638 m_dead_ssa_debug_equiv (), m_dead_stmt_debug_equiv (), m_fndecl (fndecl),
1639 m_id (NULL), m_oparms (), m_new_decls (), m_new_types (), m_replacements (),
1640 m_split_agg_csts_inits (), m_removed_decls (), m_removed_map (),
1641 m_method2func (false), m_sorted_replacements_p (true)
1643 common_initialization (fndecl, NULL, NULL);
1646 /* Constructor of ipa_param_body_adjustments which sets it up as a part of
1647 running tree_function_versioning. Planned modifications to the function are
1648 in ADJUSTMENTS. FNDECL designates the new function clone which is being
1649 modified. OLD_FNDECL is the function of which FNDECL is a clone (and which
1650 at the time of invocation still share DECL_ARGUMENTS). ID is the
1651 copy_body_data structure driving the wholy body copying process. VARS is a
1652 pointer to the head of the list of new local variables, TREE_MAP is the map
1653 that drives tree substitution in the cloning process. */
1655 ipa_param_body_adjustments
1656 ::ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1657 tree fndecl, tree old_fndecl,
1658 copy_body_data *id, tree *vars,
1659 vec<ipa_replace_map *, va_gc> *tree_map)
1660 : m_adj_params (adjustments->m_adj_params), m_adjustments (adjustments),
1661 m_reset_debug_decls (), m_dead_stmts (), m_dead_ssas (),
1662 m_dead_ssa_debug_equiv (), m_dead_stmt_debug_equiv (), m_fndecl (fndecl),
1663 m_id (id), m_oparms (), m_new_decls (), m_new_types (), m_replacements (),
1664 m_split_agg_csts_inits (), m_removed_decls (), m_removed_map (),
1665 m_method2func (false), m_sorted_replacements_p (true)
1667 common_initialization (old_fndecl, vars, tree_map);
1670 /* Chain new param decls up and return them. */
1672 tree
1673 ipa_param_body_adjustments::get_new_param_chain ()
1675 tree result;
1676 tree *link = &result;
1678 unsigned len = vec_safe_length (m_adj_params);
1679 for (unsigned i = 0; i < len; i++)
1681 tree new_decl = m_new_decls[i];
1682 *link = new_decl;
1683 link = &DECL_CHAIN (new_decl);
1685 *link = NULL_TREE;
1686 return result;
1689 /* Modify the function parameters FNDECL and its type according to the plan in
1690 ADJUSTMENTS. This function needs to be called when the decl has not already
1691 been processed with ipa_param_adjustments::adjust_decl, otherwise just
1692 seting DECL_ARGUMENTS to whatever get_new_param_chain will do is enough. */
1694 void
1695 ipa_param_body_adjustments::modify_formal_parameters ()
1697 tree orig_type = TREE_TYPE (m_fndecl);
1698 DECL_ARGUMENTS (m_fndecl) = get_new_param_chain ();
1700 /* When signature changes, we need to clear builtin info. */
1701 if (fndecl_built_in_p (m_fndecl))
1702 set_decl_built_in_function (m_fndecl, NOT_BUILT_IN, 0);
1704 bool modified = false;
1705 size_t index = 0;
1706 if (m_adj_params)
1707 for (tree t = TYPE_ARG_TYPES (orig_type);
1708 t && !modified;
1709 t = TREE_CHAIN (t), index++)
1710 if (index >= m_adj_params->length ()
1711 || (*m_adj_params)[index].op != IPA_PARAM_OP_COPY
1712 || (*m_adj_params)[index].base_index != index)
1713 modified = true;
1715 /* At this point, removing return value is only implemented when going
1716 through tree_function_versioning, not when modifying function body
1717 directly. */
1718 gcc_assert (!m_adjustments || !m_adjustments->m_skip_return);
1719 tree new_type = build_adjusted_function_type (orig_type, &m_new_types,
1720 m_method2func, false, modified);
1722 TREE_TYPE (m_fndecl) = new_type;
1723 DECL_VIRTUAL_P (m_fndecl) = 0;
1724 DECL_LANG_SPECIFIC (m_fndecl) = NULL;
1725 if (m_method2func)
1726 DECL_VINDEX (m_fndecl) = NULL_TREE;
1729 /* Given BASE and UNIT_OFFSET, find the corresponding record among replacement
1730 structures. */
1732 ipa_param_body_replacement *
1733 ipa_param_body_adjustments::lookup_replacement_1 (tree base,
1734 unsigned unit_offset)
1736 gcc_assert (m_sorted_replacements_p);
1737 ipa_param_body_replacement key;
1738 key.base = base;
1739 key.unit_offset = unit_offset;
1740 ipa_param_body_replacement *res
1741 = std::lower_bound (m_replacements.begin (), m_replacements.end (), key,
1742 [] (const ipa_param_body_replacement &elt,
1743 const ipa_param_body_replacement &val)
1745 return (compare_param_body_replacement (&elt, &val)
1746 < 0);
1749 if (res == m_replacements.end ()
1750 || res->base != base
1751 || res->unit_offset != unit_offset)
1752 return NULL;
1753 return res;
1756 /* Find the first replacement for BASE among m_replacements and return pointer
1757 to it, or NULL if there is none. */
1759 ipa_param_body_replacement *
1760 ipa_param_body_adjustments::lookup_first_base_replacement (tree base)
1762 gcc_assert (m_sorted_replacements_p);
1763 ipa_param_body_replacement key;
1764 key.base = base;
1765 ipa_param_body_replacement *res
1766 = std::lower_bound (m_replacements.begin (), m_replacements.end (), key,
1767 [] (const ipa_param_body_replacement &elt,
1768 const ipa_param_body_replacement &val)
1770 if (DECL_UID (elt.base) < DECL_UID (val.base))
1771 return true;
1772 return false;
1775 if (res == m_replacements.end ()
1776 || res->base != base)
1777 return NULL;
1778 return res;
1781 /* Given BASE and UNIT_OFFSET, find the corresponding replacement expression
1782 and return it, assuming it is known it does not hold value by reference or
1783 in reverse storage order. */
1785 tree
1786 ipa_param_body_adjustments::lookup_replacement (tree base, unsigned unit_offset)
1788 ipa_param_body_replacement *pbr = lookup_replacement_1 (base, unit_offset);
1789 if (!pbr)
1790 return NULL;
1791 return pbr->repl;
1794 /* If T is an SSA_NAME, return NULL if it is not a default def or
1795 return its base variable if it is. If IGNORE_DEFAULT_DEF is true,
1796 the base variable is always returned, regardless if it is a default
1797 def. Return T if it is not an SSA_NAME. */
1799 static tree
1800 get_ssa_base_param (tree t, bool ignore_default_def)
1802 if (TREE_CODE (t) == SSA_NAME)
1804 if (ignore_default_def || SSA_NAME_IS_DEFAULT_DEF (t))
1805 return SSA_NAME_VAR (t);
1806 else
1807 return NULL_TREE;
1809 return t;
1812 /* Given an expression, return the structure describing how it should be
1813 replaced if it accesses a part of a split parameter or NULL otherwise.
1815 Do not free the result, it will be deallocated when the object is destroyed.
1817 If IGNORE_DEFAULT_DEF is cleared, consider only SSA_NAMEs of PARM_DECLs
1818 which are default definitions, if set, consider all SSA_NAMEs of
1819 PARM_DECLs. */
1821 ipa_param_body_replacement *
1822 ipa_param_body_adjustments::get_expr_replacement (tree expr,
1823 bool ignore_default_def)
1825 tree base;
1826 unsigned unit_offset;
1828 if (!isra_get_ref_base_and_offset (expr, &base, &unit_offset))
1829 return NULL;
1831 base = get_ssa_base_param (base, ignore_default_def);
1832 if (!base || TREE_CODE (base) != PARM_DECL)
1833 return NULL;
1834 return lookup_replacement_1 (base, unit_offset);
1837 /* Given OLD_DECL, which is a PARM_DECL of a parameter that is being removed
1838 (which includes it being split or replaced), return a new variable that
1839 should be used for any SSA names that will remain in the function that
1840 previously belonged to OLD_DECL. */
1842 tree
1843 ipa_param_body_adjustments::get_replacement_ssa_base (tree old_decl)
1845 unsigned *idx = m_removed_map.get (old_decl);
1846 if (!idx)
1847 return NULL;
1849 tree repl;
1850 if (TREE_CODE (m_removed_decls[*idx]) == PARM_DECL)
1852 gcc_assert (m_removed_decls[*idx] == old_decl);
1853 repl = copy_var_decl (old_decl, DECL_NAME (old_decl),
1854 TREE_TYPE (old_decl));
1855 m_removed_decls[*idx] = repl;
1857 else
1858 repl = m_removed_decls[*idx];
1859 return repl;
1862 /* If OLD_NAME, which is being defined by statement STMT, is an SSA_NAME of a
1863 parameter which is to be removed because its value is not used, create a new
1864 SSA_NAME relating to a replacement VAR_DECL, replace all uses of the
1865 original with it and return it. If there is no need to re-map, return NULL.
1866 ADJUSTMENTS is a pointer to a vector of IPA-SRA adjustments. */
1868 tree
1869 ipa_param_body_adjustments::replace_removed_params_ssa_names (tree old_name,
1870 gimple *stmt)
1872 gcc_assert (!m_id);
1873 if (TREE_CODE (old_name) != SSA_NAME)
1874 return NULL;
1876 tree decl = SSA_NAME_VAR (old_name);
1877 if (decl == NULL_TREE
1878 || TREE_CODE (decl) != PARM_DECL)
1879 return NULL;
1881 tree repl = get_replacement_ssa_base (decl);
1882 if (!repl)
1883 return NULL;
1885 tree new_name = make_ssa_name (repl, stmt);
1886 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name)
1887 = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (old_name);
1889 if (dump_file && (dump_flags & TDF_DETAILS))
1891 fprintf (dump_file, "replacing an SSA name of a removed param ");
1892 print_generic_expr (dump_file, old_name);
1893 fprintf (dump_file, " with ");
1894 print_generic_expr (dump_file, new_name);
1895 fprintf (dump_file, "\n");
1898 replace_uses_by (old_name, new_name);
1899 return new_name;
1902 /* If the expression *EXPR_P should be replaced, do so. CONVERT specifies
1903 whether the function should care about type incompatibility of the current
1904 and new expressions. If it is false, the function will leave
1905 incompatibility issues to the caller - note that when the function
1906 encounters a BIT_FIELD_REF, IMAGPART_EXPR or REALPART_EXPR, it will modify
1907 their bases instead of the expressions themselves and then also performs any
1908 necessary conversions. */
1910 bool
1911 ipa_param_body_adjustments::modify_expression (tree *expr_p, bool convert,
1912 gimple_seq *extra_stmts)
1914 tree expr = *expr_p;
1916 if (m_replacements.is_empty ())
1917 return false;
1918 if (TREE_CODE (expr) == BIT_FIELD_REF
1919 || TREE_CODE (expr) == IMAGPART_EXPR
1920 || TREE_CODE (expr) == REALPART_EXPR)
1922 /* For a BIT_FIELD_REF do not bother to VIEW_CONVERT the base,
1923 instead reference the replacement directly. */
1924 convert = TREE_CODE (expr) != BIT_FIELD_REF;
1925 expr_p = &TREE_OPERAND (expr, 0);
1926 expr = *expr_p;
1929 ipa_param_body_replacement *pbr = get_expr_replacement (expr, false);
1930 if (!pbr)
1931 return false;
1933 tree repl = pbr->repl;
1934 if (dump_file && (dump_flags & TDF_DETAILS))
1936 fprintf (dump_file, "About to replace expr ");
1937 print_generic_expr (dump_file, expr);
1938 fprintf (dump_file, " with ");
1939 print_generic_expr (dump_file, repl);
1940 fprintf (dump_file, "\n");
1943 if (convert && !useless_type_conversion_p (TREE_TYPE (expr),
1944 TREE_TYPE (repl)))
1946 gcc_checking_assert (tree_to_shwi (TYPE_SIZE (TREE_TYPE (expr)))
1947 == tree_to_shwi (TYPE_SIZE (TREE_TYPE (repl))));
1948 tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (expr), repl);
1949 if (is_gimple_reg (repl)
1950 && is_gimple_reg_type (TREE_TYPE (expr)))
1952 gcc_assert (extra_stmts);
1953 vce = force_gimple_operand (vce, extra_stmts, true, NULL_TREE);
1955 *expr_p = vce;
1957 else
1958 *expr_p = repl;
1959 return true;
1962 /* If the assignment statement STMT contains any expressions that need to
1963 replaced with a different one as noted by ADJUSTMENTS, do so. Handle any
1964 potential type incompatibilities. If any conversion sttements have to be
1965 pre-pended to STMT, they will be added to EXTRA_STMTS. Return true iff the
1966 statement was modified. */
1968 bool
1969 ipa_param_body_adjustments::modify_assignment (gimple *stmt,
1970 gimple_seq *extra_stmts)
1972 tree *lhs_p, *rhs_p;
1973 bool any;
1975 if (m_replacements.is_empty () || !gimple_assign_single_p (stmt))
1976 return false;
1978 rhs_p = gimple_assign_rhs1_ptr (stmt);
1979 lhs_p = gimple_assign_lhs_ptr (stmt);
1981 any = modify_expression (lhs_p, false);
1982 any |= modify_expression (rhs_p, false, extra_stmts);
1983 if (any
1984 && !useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
1986 if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
1988 /* V_C_Es of constructors can cause trouble (PR 42714). */
1989 if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
1990 *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
1991 else
1992 *rhs_p = build_constructor (TREE_TYPE (*lhs_p),
1993 NULL);
1995 else
1997 gcc_checking_assert (tree_to_shwi (TYPE_SIZE (TREE_TYPE (*lhs_p)))
1998 == tree_to_shwi (TYPE_SIZE (TREE_TYPE (*rhs_p))));
1999 tree new_rhs = fold_build1_loc (gimple_location (stmt),
2000 VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
2001 *rhs_p);
2002 tree tmp = force_gimple_operand (new_rhs, extra_stmts, true,
2003 NULL_TREE);
2004 gimple_assign_set_rhs1 (stmt, tmp);
2006 return true;
2009 return any;
2012 /* Record information about what modifications to call arguments have already
2013 been done by clone materialization into a summary describing CS. The
2014 information is stored in NEW_INDEX_MAP, NEW_PT_MAP and NEW_ALWAYS_COPY_DELTA
2015 and correspond to equivalent fields in ipa_edge_modification_info. Return
2016 the edge summary. */
2018 static ipa_edge_modification_info *
2019 record_argument_state_1 (cgraph_edge *cs, const vec<int> &new_index_map,
2020 const vec<pass_through_split_map> &new_pt_map,
2021 int new_always_copy_delta)
2024 ipa_edge_modification_info *sum = ipa_edge_modifications->get_create (cs);
2026 unsigned len = sum->pass_through_map.length ();
2027 for (unsigned i = 0; i < len; i++)
2029 unsigned oldnew = sum->pass_through_map[i].new_index;
2030 sum->pass_through_map[i].new_index = new_index_map[oldnew];
2033 len = sum->index_map.length ();
2034 if (len > 0)
2036 unsigned nptlen = new_pt_map.length ();
2037 for (unsigned j = 0; j < nptlen; j++)
2039 int inverse = -1;
2040 for (unsigned i = 0; i < len ; i++)
2041 if ((unsigned) sum->index_map[i] == new_pt_map[j].base_index)
2043 inverse = i;
2044 break;
2046 gcc_assert (inverse >= 0);
2047 pass_through_split_map ptm_item;
2049 ptm_item.base_index = inverse;
2050 ptm_item.unit_offset = new_pt_map[j].unit_offset;
2051 ptm_item.new_index = new_pt_map[j].new_index;
2052 sum->pass_through_map.safe_push (ptm_item);
2055 for (unsigned i = 0; i < len; i++)
2057 int idx = sum->index_map[i];
2058 if (idx < 0)
2059 continue;
2060 sum->index_map[i] = new_index_map[idx];
2063 else
2065 sum->pass_through_map.safe_splice (new_pt_map);
2066 sum->index_map.safe_splice (new_index_map);
2068 sum->always_copy_delta += new_always_copy_delta;
2069 return sum;
2072 /* Record information about what modifications to call arguments have already
2073 been done by clone materialization into a summary of an edge describing the
2074 call in this clone and all its clones. NEW_INDEX_MAP, NEW_PT_MAP and
2075 NEW_ALWAYS_COPY_DELTA have the same meaning as record_argument_state_1.
2077 In order to associate the info with the right edge summaries, we need
2078 address of the ORIG_STMT in the function from which we are cloning (because
2079 the edges have not yet been re-assigned to the new statement that has just
2080 been created) and ID, the structure governing function body copying. */
2082 static void
2083 record_argument_state (copy_body_data *id, gimple *orig_stmt,
2084 const vec<int> &new_index_map,
2085 const vec<pass_through_split_map> &new_pt_map,
2086 int new_always_copy_delta)
2088 if (!ipa_edge_modifications)
2089 ipa_edge_modifications = new ipa_edge_modification_sum (symtab);
2091 struct cgraph_node *this_node = id->dst_node;
2092 ipa_edge_modification_info *first_sum = NULL;
2093 cgraph_edge *cs = this_node->get_edge (orig_stmt);
2094 if (cs)
2095 first_sum = record_argument_state_1 (cs, new_index_map, new_pt_map,
2096 new_always_copy_delta);
2097 else
2098 gcc_assert (this_node->clones);
2100 if (!this_node->clones)
2101 return;
2102 for (cgraph_node *subclone = this_node->clones; subclone != this_node;)
2104 cs = subclone->get_edge (orig_stmt);
2105 if (cs)
2107 if (!first_sum)
2108 first_sum = record_argument_state_1 (cs, new_index_map, new_pt_map,
2109 new_always_copy_delta);
2110 else
2112 ipa_edge_modification_info *s2
2113 = ipa_edge_modifications->get_create (cs);
2114 s2->index_map.truncate (0);
2115 s2->index_map.safe_splice (first_sum->index_map);
2116 s2->pass_through_map.truncate (0);
2117 s2->pass_through_map.safe_splice (first_sum->pass_through_map);
2118 s2->always_copy_delta = first_sum->always_copy_delta;
2121 else
2122 gcc_assert (subclone->clones);
2124 if (subclone->clones)
2125 subclone = subclone->clones;
2126 else if (subclone->next_sibling_clone)
2127 subclone = subclone->next_sibling_clone;
2128 else
2130 while (subclone != this_node && !subclone->next_sibling_clone)
2131 subclone = subclone->clone_of;
2132 if (subclone != this_node)
2133 subclone = subclone->next_sibling_clone;
2138 /* If the call statement pointed at by STMT_P contains any expressions that
2139 need to replaced with a different one as noted by ADJUSTMENTS, do so. f the
2140 statement needs to be rebuilt, do so. Return true if any modifications have
2141 been performed. ORIG_STMT, if not NULL, is the original statement in the
2142 function that is being cloned from, which at this point can be used to look
2143 up call_graph edges.
2145 If the method is invoked as a part of IPA clone materialization and if any
2146 parameter split is pass-through, i.e. it applies to the functin that is
2147 being modified and also to the callee of the statement, replace the
2148 parameter passed to old callee with all of the replacement a callee might
2149 possibly want and record the performed argument modifications in
2150 ipa_edge_modifications. Likewise if any argument has already been left out
2151 because it is not necessary. */
2153 bool
2154 ipa_param_body_adjustments::modify_call_stmt (gcall **stmt_p,
2155 gimple *orig_stmt)
2157 auto_vec <unsigned, 4> pass_through_args;
2158 auto_vec <unsigned, 4> pass_through_pbr_indices;
2159 auto_vec <HOST_WIDE_INT, 4> pass_through_offsets;
2160 gcall *stmt = *stmt_p;
2161 unsigned nargs = gimple_call_num_args (stmt);
2162 bool recreate = false;
2163 gcc_assert (m_sorted_replacements_p);
2165 for (unsigned i = 0; i < gimple_call_num_args (stmt); i++)
2167 tree t = gimple_call_arg (stmt, i);
2168 gcc_assert (TREE_CODE (t) != BIT_FIELD_REF
2169 && TREE_CODE (t) != IMAGPART_EXPR
2170 && TREE_CODE (t) != REALPART_EXPR);
2172 if (TREE_CODE (t) == SSA_NAME
2173 && m_dead_ssas.contains (t))
2174 recreate = true;
2176 if (m_replacements.is_empty ())
2177 continue;
2179 tree base;
2180 unsigned agg_arg_offset;
2181 if (!isra_get_ref_base_and_offset (t, &base, &agg_arg_offset))
2182 continue;
2184 bool by_ref = false;
2185 if (TREE_CODE (base) == SSA_NAME)
2187 if (!SSA_NAME_IS_DEFAULT_DEF (base))
2188 continue;
2189 base = SSA_NAME_VAR (base);
2190 gcc_checking_assert (base);
2191 by_ref = true;
2193 if (TREE_CODE (base) != PARM_DECL)
2194 continue;
2196 ipa_param_body_replacement *first_rep
2197 = lookup_first_base_replacement (base);
2198 if (!first_rep)
2199 continue;
2200 unsigned first_rep_index = first_rep - m_replacements.begin ();
2202 /* We still have to distinguish between an end-use that we have to
2203 transform now and a pass-through, which happens in the following
2204 two cases. */
2206 /* TODO: After we adjust ptr_parm_has_nonarg_uses to also consider
2207 &MEM_REF[ssa_name + offset], we will also have to detect that case
2208 here. */
2210 if (TREE_CODE (t) == SSA_NAME
2211 && SSA_NAME_IS_DEFAULT_DEF (t)
2212 && SSA_NAME_VAR (t)
2213 && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL)
2215 /* This must be a by_reference pass-through. */
2216 recreate = true;
2217 gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
2218 pass_through_args.safe_push (i);
2219 pass_through_pbr_indices.safe_push (first_rep_index);
2220 pass_through_offsets.safe_push (agg_arg_offset);
2222 else if (!by_ref && AGGREGATE_TYPE_P (TREE_TYPE (t)))
2224 /* Currently IPA-SRA guarantees the aggregate access type
2225 exactly matches in this case. So if it does not match, it is
2226 a pass-through argument that will be sorted out at edge
2227 redirection time. */
2228 ipa_param_body_replacement *pbr
2229 = lookup_replacement_1 (base, agg_arg_offset);
2231 if (!pbr
2232 || (TYPE_MAIN_VARIANT (TREE_TYPE (t))
2233 != TYPE_MAIN_VARIANT (TREE_TYPE (pbr->repl))))
2235 recreate = true;
2236 pass_through_args.safe_push (i);
2237 pass_through_pbr_indices.safe_push (first_rep_index);
2238 pass_through_offsets.safe_push (agg_arg_offset);
2243 if (!recreate)
2245 /* No need to rebuild the statement, let's just modify arguments
2246 and the LHS if/as appropriate. */
2247 bool modified = false;
2248 for (unsigned i = 0; i < nargs; i++)
2250 tree *t = gimple_call_arg_ptr (stmt, i);
2251 modified |= modify_expression (t, true);
2253 if (gimple_call_lhs (stmt))
2255 tree *t = gimple_call_lhs_ptr (stmt);
2256 modified |= modify_expression (t, false);
2258 return modified;
2261 auto_vec<int, 16> index_map;
2262 auto_vec<pass_through_split_map, 4> pass_through_map;
2263 auto_vec<tree, 16> vargs;
2264 int always_copy_delta = 0;
2265 unsigned pt_idx = 0;
2266 int new_arg_idx = 0;
2267 for (unsigned i = 0; i < nargs; i++)
2269 if (pt_idx < pass_through_args.length ()
2270 && i == pass_through_args[pt_idx])
2272 unsigned j = pass_through_pbr_indices[pt_idx];
2273 unsigned agg_arg_offset = pass_through_offsets[pt_idx];
2274 pt_idx++;
2275 always_copy_delta--;
2276 tree base = m_replacements[j].base;
2278 /* In order to be put into SSA form, we have to push all replacements
2279 pertaining to this parameter as parameters to the call statement.
2280 Edge redirection will need to use edge summary to weed out the
2281 unnecessary ones. */
2282 unsigned repl_list_len = m_replacements.length ();
2283 for (; j < repl_list_len; j++)
2285 if (m_replacements[j].base != base)
2286 break;
2287 if (m_replacements[j].unit_offset < agg_arg_offset)
2288 continue;
2289 pass_through_split_map pt_map;
2290 pt_map.base_index = i;
2291 pt_map.unit_offset
2292 = m_replacements[j].unit_offset - agg_arg_offset;
2293 pt_map.new_index = new_arg_idx;
2294 pass_through_map.safe_push (pt_map);
2295 vargs.safe_push (m_replacements[j].repl);
2296 new_arg_idx++;
2297 always_copy_delta++;
2299 index_map.safe_push (-1);
2301 else
2303 tree t = gimple_call_arg (stmt, i);
2304 if (TREE_CODE (t) == SSA_NAME
2305 && m_dead_ssas.contains (t))
2307 always_copy_delta--;
2308 index_map.safe_push (-1);
2310 else
2312 modify_expression (&t, true);
2313 vargs.safe_push (t);
2314 index_map.safe_push (new_arg_idx);
2315 new_arg_idx++;
2320 gcall *new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
2321 if (gimple_has_location (stmt))
2322 gimple_set_location (new_stmt, gimple_location (stmt));
2323 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
2324 gimple_call_copy_flags (new_stmt, stmt);
2325 if (tree lhs = gimple_call_lhs (stmt))
2327 modify_expression (&lhs, false);
2328 /* Avoid adjusting SSA_NAME_DEF_STMT of a SSA lhs, SSA names
2329 have not yet been remapped. */
2330 *gimple_call_lhs_ptr (new_stmt) = lhs;
2332 *stmt_p = new_stmt;
2334 if (orig_stmt)
2335 record_argument_state (m_id, orig_stmt, index_map, pass_through_map,
2336 always_copy_delta);
2337 return true;
2340 /* If the statement STMT contains any expressions that need to replaced with a
2341 different one as noted by ADJUSTMENTS, do so. Handle any potential type
2342 incompatibilities. If any conversion sttements have to be pre-pended to
2343 STMT, they will be added to EXTRA_STMTS. Return true iff the statement was
2344 modified. */
2346 bool
2347 ipa_param_body_adjustments::modify_gimple_stmt (gimple **stmt,
2348 gimple_seq *extra_stmts,
2349 gimple *orig_stmt)
2351 bool modified = false;
2352 tree *t;
2354 switch (gimple_code (*stmt))
2356 case GIMPLE_RETURN:
2357 t = gimple_return_retval_ptr (as_a <greturn *> (*stmt));
2358 if (m_adjustments && m_adjustments->m_skip_return)
2359 *t = NULL_TREE;
2360 else if (*t != NULL_TREE)
2361 modified |= modify_expression (t, true);
2362 break;
2364 case GIMPLE_ASSIGN:
2365 modified |= modify_assignment (*stmt, extra_stmts);
2366 break;
2368 case GIMPLE_CALL:
2369 modified |= modify_call_stmt ((gcall **) stmt, orig_stmt);
2370 break;
2372 case GIMPLE_ASM:
2374 gasm *asm_stmt = as_a <gasm *> (*stmt);
2375 for (unsigned i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
2377 t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
2378 modified |= modify_expression (t, true);
2380 for (unsigned i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
2382 t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
2383 modified |= modify_expression (t, false);
2386 break;
2388 default:
2389 break;
2391 return modified;
2395 /* Traverse body of the current function and perform the requested adjustments
2396 on its statements. Return true iff the CFG has been changed. */
2398 bool
2399 ipa_param_body_adjustments::modify_cfun_body ()
2401 bool cfg_changed = false;
2402 basic_block bb;
2404 FOR_EACH_BB_FN (bb, cfun)
2406 gimple_stmt_iterator gsi;
2408 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2410 gphi *phi = as_a <gphi *> (gsi_stmt (gsi));
2411 tree new_lhs, old_lhs = gimple_phi_result (phi);
2412 new_lhs = replace_removed_params_ssa_names (old_lhs, phi);
2413 if (new_lhs)
2415 gimple_phi_set_result (phi, new_lhs);
2416 release_ssa_name (old_lhs);
2420 gsi = gsi_start_bb (bb);
2421 while (!gsi_end_p (gsi))
2423 gimple *stmt = gsi_stmt (gsi);
2424 gimple *stmt_copy = stmt;
2425 gimple_seq extra_stmts = NULL;
2426 bool modified = modify_gimple_stmt (&stmt, &extra_stmts, NULL);
2427 if (stmt != stmt_copy)
2429 gcc_checking_assert (modified);
2430 gsi_replace (&gsi, stmt, false);
2432 if (!gimple_seq_empty_p (extra_stmts))
2433 gsi_insert_seq_before (&gsi, extra_stmts, GSI_SAME_STMT);
2435 def_operand_p defp;
2436 ssa_op_iter iter;
2437 FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF)
2439 tree old_def = DEF_FROM_PTR (defp);
2440 if (tree new_def = replace_removed_params_ssa_names (old_def,
2441 stmt))
2443 SET_DEF (defp, new_def);
2444 release_ssa_name (old_def);
2445 modified = true;
2449 if (modified)
2451 update_stmt (stmt);
2452 if (maybe_clean_eh_stmt (stmt)
2453 && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
2454 cfg_changed = true;
2456 gsi_next (&gsi);
2460 return cfg_changed;
2463 /* Call gimple_debug_bind_reset_value on all debug statements describing
2464 gimple register parameters that are being removed or replaced. */
2466 void
2467 ipa_param_body_adjustments::reset_debug_stmts ()
2469 int i, len;
2470 gimple_stmt_iterator *gsip = NULL, gsi;
2472 if (MAY_HAVE_DEBUG_STMTS && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
2474 gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
2475 gsip = &gsi;
2477 len = m_reset_debug_decls.length ();
2478 for (i = 0; i < len; i++)
2480 imm_use_iterator ui;
2481 gimple *stmt;
2482 gdebug *def_temp;
2483 tree name, vexpr, copy = NULL_TREE;
2484 use_operand_p use_p;
2485 tree decl = m_reset_debug_decls[i];
2487 gcc_checking_assert (is_gimple_reg (decl));
2488 name = ssa_default_def (cfun, decl);
2489 vexpr = NULL;
2490 if (name)
2491 FOR_EACH_IMM_USE_STMT (stmt, ui, name)
2493 if (gimple_clobber_p (stmt))
2495 gimple_stmt_iterator cgsi = gsi_for_stmt (stmt);
2496 unlink_stmt_vdef (stmt);
2497 gsi_remove (&cgsi, true);
2498 release_defs (stmt);
2499 continue;
2501 /* All other users must have been removed by function body
2502 modification. */
2503 gcc_assert (is_gimple_debug (stmt));
2504 if (vexpr == NULL && gsip != NULL)
2506 vexpr = build_debug_expr_decl (TREE_TYPE (name));
2507 /* FIXME: Is setting the mode really necessary? */
2508 SET_DECL_MODE (vexpr, DECL_MODE (decl));
2509 def_temp = gimple_build_debug_source_bind (vexpr, decl, NULL);
2510 gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
2512 if (vexpr)
2514 FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
2515 SET_USE (use_p, vexpr);
2517 else
2518 gimple_debug_bind_reset_value (stmt);
2519 update_stmt (stmt);
2521 /* Create a VAR_DECL for debug info purposes. */
2522 if (!DECL_IGNORED_P (decl))
2524 copy = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
2525 VAR_DECL, DECL_NAME (decl),
2526 TREE_TYPE (decl));
2527 if (DECL_PT_UID_SET_P (decl))
2528 SET_DECL_PT_UID (copy, DECL_PT_UID (decl));
2529 TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
2530 TREE_READONLY (copy) = TREE_READONLY (decl);
2531 TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
2532 DECL_NOT_GIMPLE_REG_P (copy) = DECL_NOT_GIMPLE_REG_P (decl);
2533 DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (decl);
2534 DECL_IGNORED_P (copy) = DECL_IGNORED_P (decl);
2535 DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (decl);
2536 DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
2537 SET_DECL_RTL (copy, 0);
2538 TREE_USED (copy) = 1;
2539 DECL_CONTEXT (copy) = current_function_decl;
2540 add_local_decl (cfun, copy);
2541 DECL_CHAIN (copy)
2542 = BLOCK_VARS (DECL_INITIAL (current_function_decl));
2543 BLOCK_VARS (DECL_INITIAL (current_function_decl)) = copy;
2545 if (gsip != NULL && copy && target_for_debug_bind (decl))
2547 gcc_assert (TREE_CODE (decl) == PARM_DECL);
2548 if (vexpr)
2549 def_temp = gimple_build_debug_bind (copy, vexpr, NULL);
2550 else
2551 def_temp = gimple_build_debug_source_bind (copy, decl,
2552 NULL);
2553 gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
2558 /* Perform all necessary body changes to change signature, body and debug info
2559 of fun according to adjustments passed at construction. Return true if CFG
2560 was changed in any way. The main entry point for modification of standalone
2561 functions that is not part of IPA clone materialization. */
2563 bool
2564 ipa_param_body_adjustments::perform_cfun_body_modifications ()
2566 bool cfg_changed;
2567 modify_formal_parameters ();
2568 cfg_changed = modify_cfun_body ();
2569 reset_debug_stmts ();
2571 return cfg_changed;
2575 /* If there are any initialization statements that need to be emitted into
2576 the basic block BB right at ther start of the new function, do so. */
2577 void
2578 ipa_param_body_adjustments::append_init_stmts (basic_block bb)
2580 gimple_stmt_iterator si = gsi_last_bb (bb);
2581 while (!m_split_agg_csts_inits.is_empty ())
2582 gsi_insert_after (&si, m_split_agg_csts_inits.pop (), GSI_NEW_STMT);
2585 /* Deallocate summaries which otherwise stay alive until the end of
2586 compilation. */
2588 void
2589 ipa_edge_modifications_finalize ()
2591 if (!ipa_edge_modifications)
2592 return;
2593 delete ipa_edge_modifications;
2594 ipa_edge_modifications = NULL;
2597 /* Helper used to sort a vector of SSA_NAMES. */
2599 static int
2600 compare_ssa_versions (const void *va, const void *vb)
2602 const_tree const a = *(const_tree const*)va;
2603 const_tree const b = *(const_tree const*)vb;
2605 if (SSA_NAME_VERSION (a) < SSA_NAME_VERSION (b))
2606 return -1;
2607 if (SSA_NAME_VERSION (a) > SSA_NAME_VERSION (b))
2608 return 1;
2609 return 0;
2612 /* Call release_ssa_name on all elements in KILLED_SSAS in a defined order. */
2614 void
2615 ipa_release_ssas_in_hash (hash_set <tree> *killed_ssas)
2617 auto_vec<tree, 16> ssas_to_release;
2618 for (tree sn : *killed_ssas)
2619 ssas_to_release.safe_push (sn);
2620 ssas_to_release.qsort (compare_ssa_versions);
2621 for (tree sn : ssas_to_release)
2622 release_ssa_name (sn);