testsuite: Correct vec-rlmi-rlnm.c testsuite expected result
[official-gcc.git] / gcc / ipa-param-manipulation.c
blob438f4bd5a68984d3fbeb019e2586927f457d7f96
1 /* Manipulation of formal and actual parameters of functions and function
2 calls.
3 Copyright (C) 2017-2020 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 #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"
45 /* Actual prefixes of different newly synthetized parameters. Keep in sync
46 with IPA_PARAM_PREFIX_* defines. */
48 static const char *ipa_param_prefixes[IPA_PARAM_PREFIX_COUNT]
49 = {"SYNTH",
50 "ISRA",
51 "simd",
52 "mask"};
54 /* Names of parameters for dumping. Keep in sync with enum ipa_parm_op. */
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"};
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). */
66 void
67 push_function_arg_decls (vec<tree> *args, tree fndecl)
69 int count;
70 tree parm;
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++;
82 args->reserve_exact (count);
83 for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
84 args->quick_push (parm);
87 /* Fill an empty vector TYPES with trees representing formal parameters of
88 function type FNTYPE. */
90 void
91 push_function_arg_types (vec<tree> *types, tree fntype)
93 int count = 0;
94 tree t;
96 for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
97 count++;
99 types->reserve_exact (count);
100 for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
101 types->quick_push (TREE_VALUE (t));
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. */
107 void
108 ipa_dump_adjusted_parameters (FILE *f,
109 vec<ipa_adjusted_param, va_gc> *adj_params)
111 unsigned i, len = vec_safe_length (adj_params);
112 bool first = true;
114 if (!len)
115 return;
117 fprintf (f, " IPA adjusted parameters: ");
118 for (i = 0; i < len; i++)
120 struct ipa_adjusted_param *apm;
121 apm = &(*adj_params)[i];
123 if (!first)
124 fprintf (f, " ");
125 else
126 first = false;
128 fprintf (f, "%i. %s %s", i, ipa_param_op_names[apm->op],
129 apm->prev_clone_adjustment ? "prev_clone_adjustment " : "");
130 switch (apm->op)
132 case IPA_PARAM_OP_UNDEFINED:
133 break;
135 case IPA_PARAM_OP_COPY:
136 fprintf (f, ", base_index: %u", apm->base_index);
137 fprintf (f, ", prev_clone_index: %u", apm->prev_clone_index);
138 break;
140 case IPA_PARAM_OP_SPLIT:
141 fprintf (f, ", offset: %u", apm->unit_offset);
142 /* fall-through */
143 case IPA_PARAM_OP_NEW:
144 fprintf (f, ", base_index: %u", apm->base_index);
145 fprintf (f, ", prev_clone_index: %u", apm->prev_clone_index);
146 print_node_brief (f, ", type: ", apm->type, 0);
147 print_node_brief (f, ", alias type: ", apm->alias_ptr_type, 0);
148 fprintf (f, " prefix: %s",
149 ipa_param_prefixes[apm->param_prefix_index]);
150 if (apm->reverse)
151 fprintf (f, ", reverse-sso");
152 break;
154 fprintf (f, "\n");
158 /* Fill NEW_TYPES with types of a function after its current OTYPES have been
159 modified as described in ADJ_PARAMS. When USE_PREV_INDICES is true, use
160 prev_clone_index from ADJ_PARAMS as opposed to base_index when the parameter
161 is false. */
163 static void
164 fill_vector_of_new_param_types (vec<tree> *new_types, vec<tree> *otypes,
165 vec<ipa_adjusted_param, va_gc> *adj_params,
166 bool use_prev_indices)
168 unsigned adj_len = vec_safe_length (adj_params);
169 new_types->reserve_exact (adj_len);
170 for (unsigned i = 0; i < adj_len ; i++)
172 ipa_adjusted_param *apm = &(*adj_params)[i];
173 if (apm->op == IPA_PARAM_OP_COPY)
175 unsigned index
176 = use_prev_indices ? apm->prev_clone_index : apm->base_index;
177 /* The following needs to be handled gracefully because of type
178 mismatches. This happens with LTO but apparently also in Fortran
179 with -fcoarray=lib -O2 -lcaf_single -latomic. */
180 if (index >= otypes->length ())
181 continue;
182 new_types->quick_push ((*otypes)[index]);
184 else if (apm->op == IPA_PARAM_OP_NEW
185 || apm->op == IPA_PARAM_OP_SPLIT)
187 tree ntype = apm->type;
188 if (is_gimple_reg_type (ntype)
189 && TYPE_MODE (ntype) != BLKmode)
191 unsigned malign = GET_MODE_ALIGNMENT (TYPE_MODE (ntype));
192 if (TYPE_ALIGN (ntype) != malign)
193 ntype = build_aligned_type (ntype, malign);
195 new_types->quick_push (ntype);
197 else
198 gcc_unreachable ();
202 /* Build and return a function type just like ORIG_TYPE but with parameter
203 types given in NEW_PARAM_TYPES - which can be NULL if, but only if,
204 ORIG_TYPE itself has NULL TREE_ARG_TYPEs. If METHOD2FUNC is true, also make
205 it a FUNCTION_TYPE instead of FUNCTION_TYPE. */
207 static tree
208 build_adjusted_function_type (tree orig_type, vec<tree> *new_param_types,
209 bool method2func, bool skip_return)
211 tree new_arg_types = NULL;
212 if (TYPE_ARG_TYPES (orig_type))
214 gcc_checking_assert (new_param_types);
215 bool last_parm_void = (TREE_VALUE (tree_last (TYPE_ARG_TYPES (orig_type)))
216 == void_type_node);
217 unsigned len = new_param_types->length ();
218 for (unsigned i = 0; i < len; i++)
219 new_arg_types = tree_cons (NULL_TREE, (*new_param_types)[i],
220 new_arg_types);
222 tree new_reversed = nreverse (new_arg_types);
223 if (last_parm_void)
225 if (new_reversed)
226 TREE_CHAIN (new_arg_types) = void_list_node;
227 else
228 new_reversed = void_list_node;
230 new_arg_types = new_reversed;
233 /* Use build_distinct_type_copy to preserve as much as possible from original
234 type (debug info, attribute lists etc.). The one exception is
235 METHOD_TYPEs which must have THIS argument and when we are asked to remove
236 it, we need to build new FUNCTION_TYPE instead. */
237 tree new_type = NULL;
238 if (method2func)
240 tree ret_type;
241 if (skip_return)
242 ret_type = void_type_node;
243 else
244 ret_type = TREE_TYPE (orig_type);
246 new_type
247 = build_distinct_type_copy (build_function_type (ret_type,
248 new_arg_types));
249 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
251 else
253 new_type = build_distinct_type_copy (orig_type);
254 TYPE_ARG_TYPES (new_type) = new_arg_types;
255 if (skip_return)
256 TREE_TYPE (new_type) = void_type_node;
259 return new_type;
262 /* Return the maximum index in any IPA_PARAM_OP_COPY adjustment or -1 if there
263 is none. */
266 ipa_param_adjustments::get_max_base_index ()
268 unsigned adj_len = vec_safe_length (m_adj_params);
269 int max_index = -1;
270 for (unsigned i = 0; i < adj_len ; i++)
272 ipa_adjusted_param *apm = &(*m_adj_params)[i];
273 if (apm->op == IPA_PARAM_OP_COPY
274 && max_index < apm->base_index)
275 max_index = apm->base_index;
277 return max_index;
281 /* Fill SURVIVING_PARAMS with an array of bools where each one says whether a
282 parameter that originally was at that position still survives in the given
283 clone or is removed/replaced. If the final array is smaller than an index
284 of an original parameter, that parameter also did not survive. That a
285 parameter survives does not mean it has the same index as before. */
287 void
288 ipa_param_adjustments::get_surviving_params (vec<bool> *surviving_params)
290 unsigned adj_len = vec_safe_length (m_adj_params);
291 int max_index = get_max_base_index ();
293 if (max_index < 0)
294 return;
295 surviving_params->reserve_exact (max_index + 1);
296 surviving_params->quick_grow_cleared (max_index + 1);
297 for (unsigned i = 0; i < adj_len ; i++)
299 ipa_adjusted_param *apm = &(*m_adj_params)[i];
300 if (apm->op == IPA_PARAM_OP_COPY)
301 (*surviving_params)[apm->base_index] = true;
305 /* Fill NEW_INDICES with new indices of each surviving parameter or -1 for
306 those which do not survive. Any parameter outside of lenght of the vector
307 does not survive. There is currently no support for a parameter to be
308 copied to two distinct new parameters. */
310 void
311 ipa_param_adjustments::get_updated_indices (vec<int> *new_indices)
313 unsigned adj_len = vec_safe_length (m_adj_params);
314 int max_index = get_max_base_index ();
316 if (max_index < 0)
317 return;
318 unsigned res_len = max_index + 1;
319 new_indices->reserve_exact (res_len);
320 for (unsigned i = 0; i < res_len ; i++)
321 new_indices->quick_push (-1);
322 for (unsigned i = 0; i < adj_len ; i++)
324 ipa_adjusted_param *apm = &(*m_adj_params)[i];
325 if (apm->op == IPA_PARAM_OP_COPY)
326 (*new_indices)[apm->base_index] = i;
330 /* Return the original index for the given new parameter index. Return a
331 negative number if not available. */
334 ipa_param_adjustments::get_original_index (int newidx)
336 const ipa_adjusted_param *adj = &(*m_adj_params)[newidx];
337 if (adj->op != IPA_PARAM_OP_COPY)
338 return -1;
339 return adj->base_index;
342 /* Return true if the first parameter (assuming there was one) survives the
343 transformation intact and remains the first one. */
345 bool
346 ipa_param_adjustments::first_param_intact_p ()
348 return (!vec_safe_is_empty (m_adj_params)
349 && (*m_adj_params)[0].op == IPA_PARAM_OP_COPY
350 && (*m_adj_params)[0].base_index == 0);
353 /* Return true if we have to change what has formerly been a method into a
354 function. */
356 bool
357 ipa_param_adjustments::method2func_p (tree orig_type)
359 return ((TREE_CODE (orig_type) == METHOD_TYPE) && !first_param_intact_p ());
362 /* Given function type OLD_TYPE, return a new type derived from it after
363 performing all atored modifications. TYPE_ORIGINAL_P should be true when
364 OLD_TYPE refers to the type before any IPA transformations, as opposed to a
365 type that can be an intermediate one in between various IPA
366 transformations. */
368 tree
369 ipa_param_adjustments::build_new_function_type (tree old_type,
370 bool type_original_p)
372 auto_vec<tree,16> new_param_types, *new_param_types_p;
373 if (prototype_p (old_type))
375 auto_vec<tree, 16> otypes;
376 push_function_arg_types (&otypes, old_type);
377 fill_vector_of_new_param_types (&new_param_types, &otypes, m_adj_params,
378 !type_original_p);
379 new_param_types_p = &new_param_types;
381 else
382 new_param_types_p = NULL;
384 return build_adjusted_function_type (old_type, new_param_types_p,
385 method2func_p (old_type), m_skip_return);
388 /* Build variant of function decl ORIG_DECL which has no return value if
389 M_SKIP_RETURN is true and, if ORIG_DECL's types or parameters is known, has
390 this type adjusted as indicated in M_ADJ_PARAMS. Arguments from
391 DECL_ARGUMENTS list are not processed now, since they are linked by
392 TREE_CHAIN directly and not accessible in LTO during WPA. The caller is
393 responsible for eliminating them when clones are properly materialized. */
395 tree
396 ipa_param_adjustments::adjust_decl (tree orig_decl)
398 tree new_decl = copy_node (orig_decl);
399 tree orig_type = TREE_TYPE (orig_decl);
400 if (prototype_p (orig_type)
401 || (m_skip_return && !VOID_TYPE_P (TREE_TYPE (orig_type))))
403 tree new_type = build_new_function_type (orig_type, false);
404 TREE_TYPE (new_decl) = new_type;
406 if (method2func_p (orig_type))
407 DECL_VINDEX (new_decl) = NULL_TREE;
409 /* When signature changes, we need to clear builtin info. */
410 if (fndecl_built_in_p (new_decl))
411 set_decl_built_in_function (new_decl, NOT_BUILT_IN, 0);
413 DECL_VIRTUAL_P (new_decl) = 0;
414 DECL_LANG_SPECIFIC (new_decl) = NULL;
416 /* Drop MALLOC attribute for a void function. */
417 if (m_skip_return)
418 DECL_IS_MALLOC (new_decl) = 0;
420 return new_decl;
423 /* Wrapper around get_base_ref_and_offset for cases interesting for IPA-SRA
424 transformations. Return true if EXPR has an interesting form and fill in
425 *BASE_P and *UNIT_OFFSET_P with the appropriate info. */
427 static bool
428 isra_get_ref_base_and_offset (tree expr, tree *base_p, unsigned *unit_offset_p)
430 HOST_WIDE_INT offset, size;
431 bool reverse;
432 tree base
433 = get_ref_base_and_extent_hwi (expr, &offset, &size, &reverse);
434 if (!base || size < 0)
435 return false;
437 if ((offset % BITS_PER_UNIT) != 0)
438 return false;
440 if (TREE_CODE (base) == MEM_REF)
442 poly_int64 plmoff = mem_ref_offset (base).force_shwi ();
443 HOST_WIDE_INT moff;
444 bool is_cst = plmoff.is_constant (&moff);
445 if (!is_cst)
446 return false;
447 offset += moff * BITS_PER_UNIT;
448 base = TREE_OPERAND (base, 0);
451 if (offset < 0 || (offset / BITS_PER_UNIT) > UINT_MAX)
452 return false;
454 *base_p = base;
455 *unit_offset_p = offset / BITS_PER_UNIT;
456 return true;
459 /* Return true if EXPR describes a transitive split (i.e. one that happened for
460 both the caller and the callee) as recorded in PERFORMED_SPLITS. In that
461 case, store index of the respective record in PERFORMED_SPLITS into
462 *SM_IDX_P and the unit offset from all handled components in EXPR into
463 *UNIT_OFFSET_P. */
465 static bool
466 transitive_split_p (vec<ipa_param_performed_split, va_gc> *performed_splits,
467 tree expr, unsigned *sm_idx_p, unsigned *unit_offset_p)
469 tree base;
470 if (!isra_get_ref_base_and_offset (expr, &base, unit_offset_p))
471 return false;
473 if (TREE_CODE (base) == SSA_NAME)
475 base = SSA_NAME_VAR (base);
476 if (!base)
477 return false;
480 unsigned len = vec_safe_length (performed_splits);
481 for (unsigned i = 0 ; i < len; i++)
483 ipa_param_performed_split *sm = &(*performed_splits)[i];
484 if (sm->dummy_decl == base)
486 *sm_idx_p = i;
487 return true;
490 return false;
493 /* Structure to hold declarations representing transitive IPA-SRA splits. In
494 essence, if we need to pass UNIT_OFFSET of a parameter which originally has
495 number BASE_INDEX, we should pass down REPL. */
497 struct transitive_split_map
499 tree repl;
500 unsigned base_index;
501 unsigned unit_offset;
504 /* If call STMT contains any parameters representing transitive splits as
505 described by PERFORMED_SPLITS, return the number of extra parameters that
506 were addded during clone materialization and fill in INDEX_MAP with adjusted
507 indices of corresponding original parameters and TRANS_MAP with description
508 of all transitive replacement descriptions. Otherwise return zero. */
510 static unsigned
511 init_transitive_splits (vec<ipa_param_performed_split, va_gc> *performed_splits,
512 gcall *stmt, vec <unsigned> *index_map,
513 auto_vec <transitive_split_map> *trans_map)
515 unsigned phony_arguments = 0;
516 unsigned stmt_idx = 0, base_index = 0;
517 unsigned nargs = gimple_call_num_args (stmt);
518 while (stmt_idx < nargs)
520 unsigned unit_offset_delta;
521 tree base_arg = gimple_call_arg (stmt, stmt_idx);
523 if (phony_arguments > 0)
524 index_map->safe_push (stmt_idx);
526 unsigned sm_idx;
527 stmt_idx++;
528 if (transitive_split_p (performed_splits, base_arg, &sm_idx,
529 &unit_offset_delta))
531 if (phony_arguments == 0)
532 /* We have optimistically avoided constructing index_map do far but
533 now it is clear it will be necessary, so let's create the easy
534 bit we skipped until now. */
535 for (unsigned k = 0; k < stmt_idx; k++)
536 index_map->safe_push (k);
538 tree dummy = (*performed_splits)[sm_idx].dummy_decl;
539 for (unsigned j = sm_idx; j < performed_splits->length (); j++)
541 ipa_param_performed_split *caller_split
542 = &(*performed_splits)[j];
543 if (caller_split->dummy_decl != dummy)
544 break;
546 tree arg = gimple_call_arg (stmt, stmt_idx);
547 struct transitive_split_map tsm;
548 tsm.repl = arg;
549 tsm.base_index = base_index;
550 if (caller_split->unit_offset >= unit_offset_delta)
552 tsm.unit_offset
553 = (caller_split->unit_offset - unit_offset_delta);
554 trans_map->safe_push (tsm);
557 phony_arguments++;
558 stmt_idx++;
561 base_index++;
563 return phony_arguments;
566 /* Modify actual arguments of a function call in statement STMT, assuming it
567 calls CALLEE_DECL. CALLER_ADJ must be the description of parameter
568 adjustments of the caller or NULL if there are none. Return the new
569 statement that replaced the old one. When invoked, cfun and
570 current_function_decl have to be set to the caller. */
572 gcall *
573 ipa_param_adjustments::modify_call (gcall *stmt,
574 vec<ipa_param_performed_split,
575 va_gc> *performed_splits,
576 tree callee_decl, bool update_references)
578 unsigned len = vec_safe_length (m_adj_params);
579 auto_vec<tree, 16> vargs (len);
580 tree old_decl = gimple_call_fndecl (stmt);
581 unsigned old_nargs = gimple_call_num_args (stmt);
582 auto_vec<bool, 16> kept (old_nargs);
583 kept.quick_grow_cleared (old_nargs);
585 auto_vec <unsigned, 16> index_map;
586 auto_vec <transitive_split_map> trans_map;
587 bool transitive_remapping = false;
589 if (performed_splits)
591 unsigned removed = init_transitive_splits (performed_splits,
592 stmt, &index_map, &trans_map);
593 if (removed > 0)
595 transitive_remapping = true;
596 old_nargs -= removed;
600 cgraph_node *current_node = cgraph_node::get (current_function_decl);
601 if (update_references)
602 current_node->remove_stmt_references (stmt);
604 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
605 gimple_stmt_iterator prev_gsi = gsi;
606 gsi_prev (&prev_gsi);
607 for (unsigned i = 0; i < len; i++)
609 ipa_adjusted_param *apm = &(*m_adj_params)[i];
610 if (apm->op == IPA_PARAM_OP_COPY)
612 unsigned index = apm->base_index;
613 if (index >= old_nargs)
614 /* Can happen if the original call has argument mismatch,
615 ignore. */
616 continue;
617 if (transitive_remapping)
618 index = index_map[apm->base_index];
620 tree arg = gimple_call_arg (stmt, index);
622 vargs.quick_push (arg);
623 kept[index] = true;
624 continue;
627 /* At the moment the only user of IPA_PARAM_OP_NEW modifies calls itself.
628 If we ever want to support it during WPA IPA stage, we'll need a
629 mechanism to call into the IPA passes that introduced them. Currently
630 we simply mandate that IPA infrastructure understands all argument
631 modifications. Remember, edge redirection/modification is done only
632 once, not in steps for each pass modifying the callee like clone
633 materialization. */
634 gcc_assert (apm->op == IPA_PARAM_OP_SPLIT);
636 /* We have to handle transitive changes differently using the maps we
637 have created before. So look into them first. */
638 tree repl = NULL_TREE;
639 for (unsigned j = 0; j < trans_map.length (); j++)
640 if (trans_map[j].base_index == apm->base_index
641 && trans_map[j].unit_offset == apm->unit_offset)
643 repl = trans_map[j].repl;
644 break;
646 if (repl)
648 vargs.quick_push (repl);
649 continue;
652 unsigned index = apm->base_index;
653 if (index >= old_nargs)
654 /* Can happen if the original call has argument mismatch, ignore. */
655 continue;
656 if (transitive_remapping)
657 index = index_map[apm->base_index];
658 tree base = gimple_call_arg (stmt, index);
660 /* We create a new parameter out of the value of the old one, we can
661 do the following kind of transformations:
663 - A scalar passed by reference, potentially as a part of a larger
664 aggregate, is converted to a scalar passed by value.
666 - A part of an aggregate is passed instead of the whole aggregate. */
668 location_t loc = gimple_location (stmt);
669 tree off;
670 bool deref_base = false;
671 unsigned int deref_align = 0;
672 if (TREE_CODE (base) != ADDR_EXPR
673 && is_gimple_reg_type (TREE_TYPE (base)))
675 /* Detect type mismatches in calls in invalid programs and make a
676 poor attempt to gracefully convert them so that we don't ICE. */
677 if (!POINTER_TYPE_P (TREE_TYPE (base)))
678 base = force_value_to_type (ptr_type_node, base);
680 off = build_int_cst (apm->alias_ptr_type, apm->unit_offset);
682 else
684 bool addrof;
685 if (TREE_CODE (base) == ADDR_EXPR)
687 base = TREE_OPERAND (base, 0);
688 addrof = true;
690 else
691 addrof = false;
693 tree prev_base = base;
694 poly_int64 base_offset;
695 base = get_addr_base_and_unit_offset (base, &base_offset);
697 /* Aggregate arguments can have non-invariant addresses. */
698 if (!base)
700 base = build_fold_addr_expr (prev_base);
701 off = build_int_cst (apm->alias_ptr_type, apm->unit_offset);
703 else if (TREE_CODE (base) == MEM_REF)
705 if (!addrof)
707 deref_base = true;
708 deref_align = TYPE_ALIGN (TREE_TYPE (base));
710 off = build_int_cst (apm->alias_ptr_type,
711 base_offset + apm->unit_offset);
712 off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
713 off);
714 base = TREE_OPERAND (base, 0);
716 else
718 off = build_int_cst (apm->alias_ptr_type,
719 base_offset + apm->unit_offset);
720 base = build_fold_addr_expr (base);
724 tree type = apm->type;
725 unsigned int align;
726 unsigned HOST_WIDE_INT misalign;
728 if (deref_base)
730 align = deref_align;
731 misalign = 0;
733 else
735 get_pointer_alignment_1 (base, &align, &misalign);
736 /* All users must make sure that we can be optimistic when it
737 comes to alignment in this case (by inspecting the final users
738 of these new parameters). */
739 if (TYPE_ALIGN (type) > align)
740 align = TYPE_ALIGN (type);
742 misalign
743 += (offset_int::from (wi::to_wide (off), SIGNED).to_short_addr ()
744 * BITS_PER_UNIT);
745 misalign = misalign & (align - 1);
746 if (misalign != 0)
747 align = least_bit_hwi (misalign);
748 if (align < TYPE_ALIGN (type))
749 type = build_aligned_type (type, align);
750 base = force_gimple_operand_gsi (&gsi, base,
751 true, NULL, true, GSI_SAME_STMT);
752 tree expr = fold_build2_loc (loc, MEM_REF, type, base, off);
753 REF_REVERSE_STORAGE_ORDER (expr) = apm->reverse;
754 /* If expr is not a valid gimple call argument emit
755 a load into a temporary. */
756 if (is_gimple_reg_type (TREE_TYPE (expr)))
758 gimple *tem = gimple_build_assign (NULL_TREE, expr);
759 if (gimple_in_ssa_p (cfun))
761 gimple_set_vuse (tem, gimple_vuse (stmt));
762 expr = make_ssa_name (TREE_TYPE (expr), tem);
764 else
765 expr = create_tmp_reg (TREE_TYPE (expr));
766 gimple_assign_set_lhs (tem, expr);
767 gsi_insert_before (&gsi, tem, GSI_SAME_STMT);
769 vargs.quick_push (expr);
772 if (m_always_copy_start >= 0)
773 for (unsigned i = m_always_copy_start; i < old_nargs; i++)
774 vargs.safe_push (gimple_call_arg (stmt, i));
776 /* For optimized away parameters, add on the caller side
777 before the call
778 DEBUG D#X => parm_Y(D)
779 stmts and associate D#X with parm in decl_debug_args_lookup
780 vector to say for debug info that if parameter parm had been passed,
781 it would have value parm_Y(D). */
782 if (MAY_HAVE_DEBUG_BIND_STMTS && old_decl && callee_decl)
784 vec<tree, va_gc> **debug_args = NULL;
785 unsigned i = 0;
786 cgraph_node *callee_node = cgraph_node::get (callee_decl);
788 /* FIXME: we don't seem to be able to insert debug args before clone
789 is materialized. Materializing them early leads to extra memory
790 use. */
791 if (callee_node->clone_of)
792 callee_node->get_untransformed_body ();
793 for (tree old_parm = DECL_ARGUMENTS (old_decl);
794 old_parm && i < old_nargs && ((int) i) < m_always_copy_start;
795 old_parm = DECL_CHAIN (old_parm), i++)
797 if (!is_gimple_reg (old_parm) || kept[i])
798 continue;
799 tree origin = DECL_ORIGIN (old_parm);
800 tree arg;
801 if (transitive_remapping)
802 arg = gimple_call_arg (stmt, index_map[i]);
803 else
804 arg = gimple_call_arg (stmt, i);
806 if (!useless_type_conversion_p (TREE_TYPE (origin), TREE_TYPE (arg)))
808 if (!fold_convertible_p (TREE_TYPE (origin), arg))
809 continue;
810 tree rhs1;
811 if (TREE_CODE (arg) == SSA_NAME
812 && gimple_assign_cast_p (SSA_NAME_DEF_STMT (arg))
813 && (rhs1
814 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (arg)))
815 && useless_type_conversion_p (TREE_TYPE (origin),
816 TREE_TYPE (rhs1)))
817 arg = rhs1;
818 else
819 arg = fold_convert_loc (gimple_location (stmt),
820 TREE_TYPE (origin), arg);
822 if (debug_args == NULL)
823 debug_args = decl_debug_args_insert (callee_decl);
824 unsigned int ix;
825 tree ddecl = NULL_TREE;
826 for (ix = 0; vec_safe_iterate (*debug_args, ix, &ddecl); ix += 2)
827 if (ddecl == origin)
829 ddecl = (**debug_args)[ix + 1];
830 break;
832 if (ddecl == NULL)
834 ddecl = make_node (DEBUG_EXPR_DECL);
835 DECL_ARTIFICIAL (ddecl) = 1;
836 TREE_TYPE (ddecl) = TREE_TYPE (origin);
837 SET_DECL_MODE (ddecl, DECL_MODE (origin));
839 vec_safe_push (*debug_args, origin);
840 vec_safe_push (*debug_args, ddecl);
842 gimple *def_temp = gimple_build_debug_bind (ddecl,
843 unshare_expr (arg), stmt);
844 gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
848 if (dump_file && (dump_flags & TDF_DETAILS))
850 fprintf (dump_file, "replacing stmt:");
851 print_gimple_stmt (dump_file, gsi_stmt (gsi), 0);
854 gcall *new_stmt = gimple_build_call_vec (callee_decl, vargs);
856 if (tree lhs = gimple_call_lhs (stmt))
858 if (!m_skip_return)
859 gimple_call_set_lhs (new_stmt, lhs);
860 else if (TREE_CODE (lhs) == SSA_NAME)
862 /* LHS should now by a default-def SSA. Unfortunately default-def
863 SSA_NAMEs need a backing variable (or at least some code examining
864 SSAs assumes it is non-NULL). So we either have to re-use the
865 decl we have at hand or introdice a new one. */
866 tree repl = create_tmp_var (TREE_TYPE (lhs), "removed_return");
867 repl = get_or_create_ssa_default_def (cfun, repl);
868 SSA_NAME_IS_DEFAULT_DEF (repl) = true;
869 imm_use_iterator ui;
870 use_operand_p use_p;
871 gimple *using_stmt;
872 FOR_EACH_IMM_USE_STMT (using_stmt, ui, lhs)
874 FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
876 SET_USE (use_p, repl);
878 update_stmt (using_stmt);
883 gimple_set_block (new_stmt, gimple_block (stmt));
884 if (gimple_has_location (stmt))
885 gimple_set_location (new_stmt, gimple_location (stmt));
886 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
887 gimple_call_copy_flags (new_stmt, stmt);
888 if (gimple_in_ssa_p (cfun))
889 gimple_move_vops (new_stmt, stmt);
891 if (dump_file && (dump_flags & TDF_DETAILS))
893 fprintf (dump_file, "with stmt:");
894 print_gimple_stmt (dump_file, new_stmt, 0);
895 fprintf (dump_file, "\n");
897 gsi_replace (&gsi, new_stmt, true);
898 if (update_references)
901 current_node->record_stmt_references (gsi_stmt (gsi));
902 gsi_prev (&gsi);
904 while (gsi_stmt (gsi) != gsi_stmt (prev_gsi));
905 return new_stmt;
908 /* Dump information contained in the object in textual form to F. */
910 void
911 ipa_param_adjustments::dump (FILE *f)
913 fprintf (f, " m_always_copy_start: %i\n", m_always_copy_start);
914 ipa_dump_adjusted_parameters (f, m_adj_params);
915 if (m_skip_return)
916 fprintf (f, " Will SKIP return.\n");
919 /* Dump information contained in the object in textual form to stderr. */
921 void
922 ipa_param_adjustments::debug ()
924 dump (stderr);
927 /* Register that REPLACEMENT should replace parameter described in APM and
928 optionally as DUMMY to mark transitive splits across calls. */
930 void
931 ipa_param_body_adjustments::register_replacement (ipa_adjusted_param *apm,
932 tree replacement,
933 tree dummy)
935 gcc_checking_assert (apm->op == IPA_PARAM_OP_SPLIT
936 || apm->op == IPA_PARAM_OP_NEW);
937 gcc_checking_assert (!apm->prev_clone_adjustment);
938 ipa_param_body_replacement psr;
939 psr.base = m_oparms[apm->prev_clone_index];
940 psr.repl = replacement;
941 psr.dummy = dummy;
942 psr.unit_offset = apm->unit_offset;
943 m_replacements.safe_push (psr);
946 /* Copy or not, as appropriate given m_id and decl context, a pre-existing
947 PARM_DECL T so that it can be included in the parameters of the modified
948 function. */
950 tree
951 ipa_param_body_adjustments::carry_over_param (tree t)
953 tree new_parm;
954 if (m_id)
956 new_parm = remap_decl (t, m_id);
957 if (TREE_CODE (new_parm) != PARM_DECL)
958 new_parm = m_id->copy_decl (t, m_id);
960 else if (DECL_CONTEXT (t) != m_fndecl)
962 new_parm = copy_node (t);
963 DECL_CONTEXT (new_parm) = m_fndecl;
965 else
966 new_parm = t;
967 return new_parm;
970 /* Common initialization performed by all ipa_param_body_adjustments
971 constructors. OLD_FNDECL is the declaration we take original arguments
972 from, (it may be the same as M_FNDECL). VARS, if non-NULL, is a pointer to
973 a chained list of new local variables. TREE_MAP is the IPA-CP produced
974 mapping of trees to constants.
976 The function is rather long but it really onlu initializes all data members
977 of the class. It creates new param DECLs, finds their new types, */
979 void
980 ipa_param_body_adjustments::common_initialization (tree old_fndecl,
981 tree *vars,
982 vec<ipa_replace_map *,
983 va_gc> *tree_map)
985 push_function_arg_decls (&m_oparms, old_fndecl);
986 auto_vec<tree,16> otypes;
987 if (TYPE_ARG_TYPES (TREE_TYPE (old_fndecl)) != NULL_TREE)
988 push_function_arg_types (&otypes, TREE_TYPE (old_fndecl));
989 else
991 auto_vec<tree,16> oparms;
992 push_function_arg_decls (&oparms, old_fndecl);
993 unsigned ocount = oparms.length ();
994 otypes.reserve_exact (ocount);
995 for (unsigned i = 0; i < ocount; i++)
996 otypes.quick_push (TREE_TYPE (oparms[i]));
998 fill_vector_of_new_param_types (&m_new_types, &otypes, m_adj_params, true);
1000 auto_vec<bool, 16> kept;
1001 kept.reserve_exact (m_oparms.length ());
1002 kept.quick_grow_cleared (m_oparms.length ());
1003 auto_vec<tree, 16> isra_dummy_decls;
1004 isra_dummy_decls.reserve_exact (m_oparms.length ());
1005 isra_dummy_decls.quick_grow_cleared (m_oparms.length ());
1007 unsigned adj_len = vec_safe_length (m_adj_params);
1008 m_method2func = ((TREE_CODE (TREE_TYPE (m_fndecl)) == METHOD_TYPE)
1009 && (adj_len == 0
1010 || (*m_adj_params)[0].op != IPA_PARAM_OP_COPY
1011 || (*m_adj_params)[0].base_index != 0));
1013 /* The main job of the this function is to go over the vector of adjusted
1014 parameters and create declarations or find corresponding old ones and push
1015 them to m_new_decls. For IPA-SRA replacements it also creates
1016 corresponding m_id->dst_node->clone.performed_splits entries. */
1018 m_new_decls.reserve_exact (adj_len);
1019 for (unsigned i = 0; i < adj_len ; i++)
1021 ipa_adjusted_param *apm = &(*m_adj_params)[i];
1022 unsigned prev_index = apm->prev_clone_index;
1023 tree new_parm;
1024 if (apm->op == IPA_PARAM_OP_COPY
1025 || apm->prev_clone_adjustment)
1027 kept[prev_index] = true;
1028 new_parm = carry_over_param (m_oparms[prev_index]);
1029 m_new_decls.quick_push (new_parm);
1031 else if (apm->op == IPA_PARAM_OP_NEW
1032 || apm->op == IPA_PARAM_OP_SPLIT)
1034 tree new_type = m_new_types[i];
1035 gcc_checking_assert (new_type);
1036 new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
1037 new_type);
1038 const char *prefix = ipa_param_prefixes[apm->param_prefix_index];
1039 DECL_NAME (new_parm) = create_tmp_var_name (prefix);
1040 DECL_ARTIFICIAL (new_parm) = 1;
1041 DECL_ARG_TYPE (new_parm) = new_type;
1042 DECL_CONTEXT (new_parm) = m_fndecl;
1043 TREE_USED (new_parm) = 1;
1044 DECL_IGNORED_P (new_parm) = 1;
1045 layout_decl (new_parm, 0);
1046 m_new_decls.quick_push (new_parm);
1048 if (apm->op == IPA_PARAM_OP_SPLIT)
1050 m_split_modifications_p = true;
1052 if (m_id)
1054 tree dummy_decl;
1055 if (!isra_dummy_decls[prev_index])
1057 dummy_decl = copy_decl_to_var (m_oparms[prev_index],
1058 m_id);
1059 /* Any attempt to remap this dummy in this particular
1060 instance of clone materialization should yield
1061 itself. */
1062 insert_decl_map (m_id, dummy_decl, dummy_decl);
1064 DECL_CHAIN (dummy_decl) = *vars;
1065 *vars = dummy_decl;
1066 isra_dummy_decls[prev_index] = dummy_decl;
1068 else
1069 dummy_decl = isra_dummy_decls[prev_index];
1071 register_replacement (apm, new_parm, dummy_decl);
1072 ipa_param_performed_split ps;
1073 ps.dummy_decl = dummy_decl;
1074 ps.unit_offset = apm->unit_offset;
1075 vec_safe_push (m_id->dst_node->clone.performed_splits, ps);
1077 else
1078 register_replacement (apm, new_parm);
1081 else
1082 gcc_unreachable ();
1086 /* As part of body modifications, we will also have to replace remaining uses
1087 of remaining uses of removed PARM_DECLs (which do not however use the
1088 initial value) with their VAR_DECL copies.
1090 We do this differently with and without m_id. With m_id, we rely on its
1091 mapping and create a replacement straight away. Without it, we have our
1092 own mechanism for which we have to populate m_removed_decls vector. Just
1093 don't mix them, that is why you should not call
1094 replace_removed_params_ssa_names or perform_cfun_body_modifications when
1095 you construct with ID not equal to NULL. */
1097 unsigned op_len = m_oparms.length ();
1098 for (unsigned i = 0; i < op_len; i++)
1099 if (!kept[i])
1101 if (m_id)
1103 if (!m_id->decl_map->get (m_oparms[i]))
1105 /* TODO: Perhaps at least aggregate-type params could re-use
1106 their isra_dummy_decl here? */
1107 tree var = copy_decl_to_var (m_oparms[i], m_id);
1108 insert_decl_map (m_id, m_oparms[i], var);
1109 /* Declare this new variable. */
1110 DECL_CHAIN (var) = *vars;
1111 *vars = var;
1114 else
1116 m_removed_decls.safe_push (m_oparms[i]);
1117 m_removed_map.put (m_oparms[i], m_removed_decls.length () - 1);
1121 if (!MAY_HAVE_DEBUG_STMTS)
1122 return;
1124 /* Finally, when generating debug info, we fill vector m_reset_debug_decls
1125 with removed parameters declarations. We do this in order to re-map their
1126 debug bind statements and create debug decls for them. */
1128 if (tree_map)
1130 /* Do not output debuginfo for parameter declarations as if they vanished
1131 when they were in fact replaced by a constant. */
1132 auto_vec <int, 16> index_mapping;
1133 bool need_remap = false;
1135 if (m_id && m_id->src_node->clone.param_adjustments)
1137 ipa_param_adjustments *prev_adjustments
1138 = m_id->src_node->clone.param_adjustments;
1139 prev_adjustments->get_updated_indices (&index_mapping);
1140 need_remap = true;
1143 for (unsigned i = 0; i < tree_map->length (); i++)
1145 int parm_num = (*tree_map)[i]->parm_num;
1146 gcc_assert (parm_num >= 0);
1147 if (need_remap)
1148 parm_num = index_mapping[parm_num];
1149 kept[parm_num] = true;
1153 for (unsigned i = 0; i < op_len; i++)
1154 if (!kept[i] && is_gimple_reg (m_oparms[i]))
1155 m_reset_debug_decls.safe_push (m_oparms[i]);
1158 /* Constructor of ipa_param_body_adjustments from a simple list of
1159 modifications to parameters listed in ADJ_PARAMS which will prepare ground
1160 for modification of parameters of fndecl. Return value of the function will
1161 not be removed and the object will assume it does not run as a part of
1162 tree-function_versioning. */
1164 ipa_param_body_adjustments
1165 ::ipa_param_body_adjustments (vec<ipa_adjusted_param, va_gc> *adj_params,
1166 tree fndecl)
1167 : m_adj_params (adj_params), m_adjustments (NULL), m_reset_debug_decls (),
1168 m_split_modifications_p (false), m_fndecl (fndecl), m_id (NULL),
1169 m_oparms (), m_new_decls (), m_new_types (), m_replacements (),
1170 m_removed_decls (), m_removed_map (), m_method2func (false)
1172 common_initialization (fndecl, NULL, NULL);
1175 /* Constructor of ipa_param_body_adjustments from ipa_param_adjustments in
1176 ADJUSTMENTS which will prepare ground for modification of parameters of
1177 fndecl. The object will assume it does not run as a part of
1178 tree-function_versioning. */
1180 ipa_param_body_adjustments
1181 ::ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1182 tree fndecl)
1183 : m_adj_params (adjustments->m_adj_params), m_adjustments (adjustments),
1184 m_reset_debug_decls (), m_split_modifications_p (false), m_fndecl (fndecl),
1185 m_id (NULL), m_oparms (), m_new_decls (), m_new_types (),
1186 m_replacements (), m_removed_decls (), m_removed_map (),
1187 m_method2func (false)
1189 common_initialization (fndecl, NULL, NULL);
1192 /* Constructor of ipa_param_body_adjustments which sets it up as a part of
1193 running tree_function_versioning. Planned modifications to the function are
1194 in ADJUSTMENTS. FNDECL designates the new function clone which is being
1195 modified. OLD_FNDECL is the function of which FNDECL is a clone (and which
1196 at the time of invocation still share DECL_ARGUMENTS). ID is the
1197 copy_body_data structure driving the wholy body copying process. VARS is a
1198 pointer to the head of the list of new local variables, TREE_MAP is the map
1199 that drives tree substitution in the cloning process. */
1201 ipa_param_body_adjustments
1202 ::ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1203 tree fndecl, tree old_fndecl,
1204 copy_body_data *id, tree *vars,
1205 vec<ipa_replace_map *, va_gc> *tree_map)
1206 : m_adj_params (adjustments->m_adj_params), m_adjustments (adjustments),
1207 m_reset_debug_decls (), m_split_modifications_p (false), m_fndecl (fndecl),
1208 m_id (id), m_oparms (), m_new_decls (), m_new_types (), m_replacements (),
1209 m_removed_decls (), m_removed_map (), m_method2func (false)
1211 common_initialization (old_fndecl, vars, tree_map);
1214 /* Chain new param decls up and return them. */
1216 tree
1217 ipa_param_body_adjustments::get_new_param_chain ()
1219 tree result;
1220 tree *link = &result;
1222 unsigned len = vec_safe_length (m_adj_params);
1223 for (unsigned i = 0; i < len; i++)
1225 tree new_decl = m_new_decls[i];
1226 *link = new_decl;
1227 link = &DECL_CHAIN (new_decl);
1229 *link = NULL_TREE;
1230 return result;
1233 /* Modify the function parameters FNDECL and its type according to the plan in
1234 ADJUSTMENTS. This function needs to be called when the decl has not already
1235 been processed with ipa_param_adjustments::adjust_decl, otherwise just
1236 seting DECL_ARGUMENTS to whatever get_new_param_chain will do is enough. */
1238 void
1239 ipa_param_body_adjustments::modify_formal_parameters ()
1241 tree orig_type = TREE_TYPE (m_fndecl);
1242 DECL_ARGUMENTS (m_fndecl) = get_new_param_chain ();
1244 /* When signature changes, we need to clear builtin info. */
1245 if (fndecl_built_in_p (m_fndecl))
1246 set_decl_built_in_function (m_fndecl, NOT_BUILT_IN, 0);
1248 /* At this point, removing return value is only implemented when going
1249 through tree_function_versioning, not when modifying function body
1250 directly. */
1251 gcc_assert (!m_adjustments || !m_adjustments->m_skip_return);
1252 tree new_type = build_adjusted_function_type (orig_type, &m_new_types,
1253 m_method2func, false);
1255 TREE_TYPE (m_fndecl) = new_type;
1256 DECL_VIRTUAL_P (m_fndecl) = 0;
1257 DECL_LANG_SPECIFIC (m_fndecl) = NULL;
1258 if (m_method2func)
1259 DECL_VINDEX (m_fndecl) = NULL_TREE;
1262 /* Given BASE and UNIT_OFFSET, find the corresponding record among replacement
1263 structures. */
1265 ipa_param_body_replacement *
1266 ipa_param_body_adjustments::lookup_replacement_1 (tree base,
1267 unsigned unit_offset)
1269 unsigned int len = m_replacements.length ();
1270 for (unsigned i = 0; i < len; i++)
1272 ipa_param_body_replacement *pbr = &m_replacements[i];
1274 if (pbr->base == base
1275 && (pbr->unit_offset == unit_offset))
1276 return pbr;
1278 return NULL;
1281 /* Given BASE and UNIT_OFFSET, find the corresponding replacement expression
1282 and return it, assuming it is known it does not hold value by reference or
1283 in reverse storage order. */
1285 tree
1286 ipa_param_body_adjustments::lookup_replacement (tree base, unsigned unit_offset)
1288 ipa_param_body_replacement *pbr = lookup_replacement_1 (base, unit_offset);
1289 if (!pbr)
1290 return NULL;
1291 return pbr->repl;
1294 /* If T is an SSA_NAME, return NULL if it is not a default def or
1295 return its base variable if it is. If IGNORE_DEFAULT_DEF is true,
1296 the base variable is always returned, regardless if it is a default
1297 def. Return T if it is not an SSA_NAME. */
1299 static tree
1300 get_ssa_base_param (tree t, bool ignore_default_def)
1302 if (TREE_CODE (t) == SSA_NAME)
1304 if (ignore_default_def || SSA_NAME_IS_DEFAULT_DEF (t))
1305 return SSA_NAME_VAR (t);
1306 else
1307 return NULL_TREE;
1309 return t;
1312 /* Given an expression, return the structure describing how it should be
1313 replaced if it accesses a part of a split parameter or NULL otherwise.
1315 Do not free the result, it will be deallocated when the object is destroyed.
1317 If IGNORE_DEFAULT_DEF is cleared, consider only SSA_NAMEs of PARM_DECLs
1318 which are default definitions, if set, consider all SSA_NAMEs of
1319 PARM_DECLs. */
1321 ipa_param_body_replacement *
1322 ipa_param_body_adjustments::get_expr_replacement (tree expr,
1323 bool ignore_default_def)
1325 tree base;
1326 unsigned unit_offset;
1328 if (!isra_get_ref_base_and_offset (expr, &base, &unit_offset))
1329 return NULL;
1331 base = get_ssa_base_param (base, ignore_default_def);
1332 if (!base || TREE_CODE (base) != PARM_DECL)
1333 return NULL;
1334 return lookup_replacement_1 (base, unit_offset);
1337 /* Given OLD_DECL, which is a PARM_DECL of a parameter that is being removed
1338 (which includes it being split or replaced), return a new variable that
1339 should be used for any SSA names that will remain in the function that
1340 previously belonged to OLD_DECL. */
1342 tree
1343 ipa_param_body_adjustments::get_replacement_ssa_base (tree old_decl)
1345 unsigned *idx = m_removed_map.get (old_decl);
1346 if (!idx)
1347 return NULL;
1349 tree repl;
1350 if (TREE_CODE (m_removed_decls[*idx]) == PARM_DECL)
1352 gcc_assert (m_removed_decls[*idx] == old_decl);
1353 repl = copy_var_decl (old_decl, DECL_NAME (old_decl),
1354 TREE_TYPE (old_decl));
1355 m_removed_decls[*idx] = repl;
1357 else
1358 repl = m_removed_decls[*idx];
1359 return repl;
1362 /* If OLD_NAME, which is being defined by statement STMT, is an SSA_NAME of a
1363 parameter which is to be removed because its value is not used, create a new
1364 SSA_NAME relating to a replacement VAR_DECL, replace all uses of the
1365 original with it and return it. If there is no need to re-map, return NULL.
1366 ADJUSTMENTS is a pointer to a vector of IPA-SRA adjustments. */
1368 tree
1369 ipa_param_body_adjustments::replace_removed_params_ssa_names (tree old_name,
1370 gimple *stmt)
1372 gcc_assert (!m_id);
1373 if (TREE_CODE (old_name) != SSA_NAME)
1374 return NULL;
1376 tree decl = SSA_NAME_VAR (old_name);
1377 if (decl == NULL_TREE
1378 || TREE_CODE (decl) != PARM_DECL)
1379 return NULL;
1381 tree repl = get_replacement_ssa_base (decl);
1382 if (!repl)
1383 return NULL;
1385 tree new_name = make_ssa_name (repl, stmt);
1386 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name)
1387 = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (old_name);
1389 if (dump_file && (dump_flags & TDF_DETAILS))
1391 fprintf (dump_file, "replacing an SSA name of a removed param ");
1392 print_generic_expr (dump_file, old_name);
1393 fprintf (dump_file, " with ");
1394 print_generic_expr (dump_file, new_name);
1395 fprintf (dump_file, "\n");
1398 replace_uses_by (old_name, new_name);
1399 return new_name;
1402 /* If the expression *EXPR_P should be replaced, do so. CONVERT specifies
1403 whether the function should care about type incompatibility of the current
1404 and new expressions. If it is false, the function will leave
1405 incompatibility issues to the caller - note that when the function
1406 encounters a BIT_FIELD_REF, IMAGPART_EXPR or REALPART_EXPR, it will modify
1407 their bases instead of the expressions themselves and then also performs any
1408 necessary conversions. */
1410 bool
1411 ipa_param_body_adjustments::modify_expression (tree *expr_p, bool convert)
1413 tree expr = *expr_p;
1415 if (TREE_CODE (expr) == BIT_FIELD_REF
1416 || TREE_CODE (expr) == IMAGPART_EXPR
1417 || TREE_CODE (expr) == REALPART_EXPR)
1419 expr_p = &TREE_OPERAND (expr, 0);
1420 expr = *expr_p;
1421 convert = true;
1424 ipa_param_body_replacement *pbr = get_expr_replacement (expr, false);
1425 if (!pbr)
1426 return false;
1428 tree repl = pbr->repl;
1429 if (dump_file && (dump_flags & TDF_DETAILS))
1431 fprintf (dump_file, "About to replace expr ");
1432 print_generic_expr (dump_file, expr);
1433 fprintf (dump_file, " with ");
1434 print_generic_expr (dump_file, repl);
1435 fprintf (dump_file, "\n");
1438 if (convert && !useless_type_conversion_p (TREE_TYPE (expr),
1439 TREE_TYPE (repl)))
1441 tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (expr), repl);
1442 *expr_p = vce;
1444 else
1445 *expr_p = repl;
1446 return true;
1449 /* If the assignment statement STMT contains any expressions that need to
1450 replaced with a different one as noted by ADJUSTMENTS, do so. Handle any
1451 potential type incompatibilities. If any conversion sttements have to be
1452 pre-pended to STMT, they will be added to EXTRA_STMTS. Return true iff the
1453 statement was modified. */
1455 bool
1456 ipa_param_body_adjustments::modify_assignment (gimple *stmt,
1457 gimple_seq *extra_stmts)
1459 tree *lhs_p, *rhs_p;
1460 bool any;
1462 if (!gimple_assign_single_p (stmt))
1463 return false;
1465 rhs_p = gimple_assign_rhs1_ptr (stmt);
1466 lhs_p = gimple_assign_lhs_ptr (stmt);
1468 any = modify_expression (lhs_p, false);
1469 any |= modify_expression (rhs_p, false);
1470 if (any
1471 && !useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
1473 if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
1475 /* V_C_Es of constructors can cause trouble (PR 42714). */
1476 if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
1477 *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
1478 else
1479 *rhs_p = build_constructor (TREE_TYPE (*lhs_p),
1480 NULL);
1482 else
1484 tree new_rhs = fold_build1_loc (gimple_location (stmt),
1485 VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
1486 *rhs_p);
1487 tree tmp = force_gimple_operand (new_rhs, extra_stmts, true,
1488 NULL_TREE);
1489 gimple_assign_set_rhs1 (stmt, tmp);
1491 return true;
1494 return any;
1497 /* Data passed to remap_split_decl_to_dummy through walk_tree. */
1499 struct simple_tree_swap_info
1501 /* Change FROM to TO. */
1502 tree from, to;
1503 /* And set DONE to true when doing so. */
1504 bool done;
1507 /* Simple remapper to remap a split parameter to the same expression based on a
1508 special dummy decl so that edge redirections can detect transitive splitting
1509 and finish them. */
1511 static tree
1512 remap_split_decl_to_dummy (tree *tp, int *walk_subtrees, void *data)
1514 tree t = *tp;
1516 if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
1518 struct simple_tree_swap_info *swapinfo
1519 = (struct simple_tree_swap_info *) data;
1520 if (t == swapinfo->from
1521 || (TREE_CODE (t) == SSA_NAME
1522 && SSA_NAME_VAR (t) == swapinfo->from))
1524 *tp = swapinfo->to;
1525 swapinfo->done = true;
1527 *walk_subtrees = 0;
1529 else if (TYPE_P (t))
1530 *walk_subtrees = 0;
1531 else
1532 *walk_subtrees = 1;
1533 return NULL_TREE;
1537 /* If the call statement pointed at by STMT_P contains any expressions that
1538 need to replaced with a different one as noted by ADJUSTMENTS, do so. f the
1539 statement needs to be rebuilt, do so. Return true if any modifications have
1540 been performed.
1542 If the method is invoked as a part of IPA clone materialization and if any
1543 parameter split is transitive, i.e. it applies to the functin that is being
1544 modified and also to the callee of the statement, replace the parameter
1545 passed to old callee with an equivalent expression based on a dummy decl
1546 followed by PARM_DECLs representing the actual replacements. The actual
1547 replacements will be then converted into SSA_NAMEs and then
1548 ipa_param_adjustments::modify_call will find the appropriate ones and leave
1549 only those in the call. */
1551 bool
1552 ipa_param_body_adjustments::modify_call_stmt (gcall **stmt_p)
1554 gcall *stmt = *stmt_p;
1555 auto_vec <unsigned, 4> pass_through_args;
1556 auto_vec <unsigned, 4> pass_through_pbr_indices;
1558 if (m_split_modifications_p && m_id)
1560 for (unsigned i = 0; i < gimple_call_num_args (stmt); i++)
1562 tree t = gimple_call_arg (stmt, i);
1563 gcc_assert (TREE_CODE (t) != BIT_FIELD_REF
1564 && TREE_CODE (t) != IMAGPART_EXPR
1565 && TREE_CODE (t) != REALPART_EXPR);
1567 tree base;
1568 unsigned unit_offset;
1569 if (!isra_get_ref_base_and_offset (t, &base, &unit_offset))
1570 continue;
1572 bool by_ref = false;
1573 if (TREE_CODE (base) == SSA_NAME)
1575 if (!SSA_NAME_IS_DEFAULT_DEF (base))
1576 continue;
1577 base = SSA_NAME_VAR (base);
1578 gcc_checking_assert (base);
1579 by_ref = true;
1581 if (TREE_CODE (base) != PARM_DECL)
1582 continue;
1584 bool base_among_replacements = false;
1585 unsigned j, repl_list_len = m_replacements.length ();
1586 for (j = 0; j < repl_list_len; j++)
1588 ipa_param_body_replacement *pbr = &m_replacements[j];
1589 if (pbr->base == base)
1591 base_among_replacements = true;
1592 break;
1595 if (!base_among_replacements)
1596 continue;
1598 /* We still have to distinguish between an end-use that we have to
1599 transform now and a pass-through, which happens in the following
1600 two cases. */
1602 /* TODO: After we adjust ptr_parm_has_nonarg_uses to also consider
1603 &MEM_REF[ssa_name + offset], we will also have to detect that case
1604 here. */
1606 if (TREE_CODE (t) == SSA_NAME
1607 && SSA_NAME_IS_DEFAULT_DEF (t)
1608 && SSA_NAME_VAR (t)
1609 && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL)
1611 /* This must be a by_reference pass-through. */
1612 gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
1613 pass_through_args.safe_push (i);
1614 pass_through_pbr_indices.safe_push (j);
1616 else if (!by_ref && AGGREGATE_TYPE_P (TREE_TYPE (t)))
1618 /* Currently IPA-SRA guarantees the aggregate access type
1619 exactly matches in this case. So if it does not match, it is
1620 a pass-through argument that will be sorted out at edge
1621 redirection time. */
1622 ipa_param_body_replacement *pbr
1623 = lookup_replacement_1 (base, unit_offset);
1625 if (!pbr
1626 || (TYPE_MAIN_VARIANT (TREE_TYPE (t))
1627 != TYPE_MAIN_VARIANT (TREE_TYPE (pbr->repl))))
1629 pass_through_args.safe_push (i);
1630 pass_through_pbr_indices.safe_push (j);
1636 unsigned nargs = gimple_call_num_args (stmt);
1637 if (!pass_through_args.is_empty ())
1639 auto_vec<tree, 16> vargs;
1640 unsigned pt_idx = 0;
1641 for (unsigned i = 0; i < nargs; i++)
1643 if (pt_idx < pass_through_args.length ()
1644 && i == pass_through_args[pt_idx])
1646 unsigned j = pass_through_pbr_indices[pt_idx];
1647 pt_idx++;
1648 tree base = m_replacements[j].base;
1650 /* Map base will get mapped to the special transitive-isra marker
1651 dummy decl. */
1652 struct simple_tree_swap_info swapinfo;
1653 swapinfo.from = base;
1654 swapinfo.to = m_replacements[j].dummy;
1655 swapinfo.done = false;
1656 tree arg = gimple_call_arg (stmt, i);
1657 walk_tree (&arg, remap_split_decl_to_dummy, &swapinfo, NULL);
1658 gcc_assert (swapinfo.done);
1659 vargs.safe_push (arg);
1660 /* Now let's push all replacements pertaining to this parameter
1661 so that all gimple register ones get correct SSA_NAMES. Edge
1662 redirection will weed out the dummy argument as well as all
1663 unused replacements later. */
1664 unsigned int repl_list_len = m_replacements.length ();
1665 for (; j < repl_list_len; j++)
1667 if (m_replacements[j].base != base)
1668 break;
1669 vargs.safe_push (m_replacements[j].repl);
1672 else
1674 tree t = gimple_call_arg (stmt, i);
1675 modify_expression (&t, true);
1676 vargs.safe_push (t);
1679 gcall *new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
1680 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
1681 gimple_call_copy_flags (new_stmt, stmt);
1682 if (tree lhs = gimple_call_lhs (stmt))
1684 modify_expression (&lhs, false);
1685 gimple_call_set_lhs (new_stmt, lhs);
1687 *stmt_p = new_stmt;
1688 return true;
1691 /* Otherwise, no need to rebuild the statement, let's just modify arguments
1692 and the LHS if/as appropriate. */
1693 bool modified = false;
1694 for (unsigned i = 0; i < nargs; i++)
1696 tree *t = gimple_call_arg_ptr (stmt, i);
1697 modified |= modify_expression (t, true);
1700 if (gimple_call_lhs (stmt))
1702 tree *t = gimple_call_lhs_ptr (stmt);
1703 modified |= modify_expression (t, false);
1706 return modified;
1709 /* If the statement STMT contains any expressions that need to replaced with a
1710 different one as noted by ADJUSTMENTS, do so. Handle any potential type
1711 incompatibilities. If any conversion sttements have to be pre-pended to
1712 STMT, they will be added to EXTRA_STMTS. Return true iff the statement was
1713 modified. */
1715 bool
1716 ipa_param_body_adjustments::modify_gimple_stmt (gimple **stmt,
1717 gimple_seq *extra_stmts)
1719 bool modified = false;
1720 tree *t;
1722 switch (gimple_code (*stmt))
1724 case GIMPLE_RETURN:
1725 t = gimple_return_retval_ptr (as_a <greturn *> (*stmt));
1726 if (m_adjustments && m_adjustments->m_skip_return)
1727 *t = NULL_TREE;
1728 else if (*t != NULL_TREE)
1729 modified |= modify_expression (t, true);
1730 break;
1732 case GIMPLE_ASSIGN:
1733 modified |= modify_assignment (*stmt, extra_stmts);
1734 break;
1736 case GIMPLE_CALL:
1737 modified |= modify_call_stmt ((gcall **) stmt);
1738 break;
1740 case GIMPLE_ASM:
1742 gasm *asm_stmt = as_a <gasm *> (*stmt);
1743 for (unsigned i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
1745 t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
1746 modified |= modify_expression (t, true);
1748 for (unsigned i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
1750 t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
1751 modified |= modify_expression (t, false);
1754 break;
1756 default:
1757 break;
1759 return modified;
1763 /* Traverse body of the current function and perform the requested adjustments
1764 on its statements. Return true iff the CFG has been changed. */
1766 bool
1767 ipa_param_body_adjustments::modify_cfun_body ()
1769 bool cfg_changed = false;
1770 basic_block bb;
1772 FOR_EACH_BB_FN (bb, cfun)
1774 gimple_stmt_iterator gsi;
1776 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1778 gphi *phi = as_a <gphi *> (gsi_stmt (gsi));
1779 tree new_lhs, old_lhs = gimple_phi_result (phi);
1780 new_lhs = replace_removed_params_ssa_names (old_lhs, phi);
1781 if (new_lhs)
1783 gimple_phi_set_result (phi, new_lhs);
1784 release_ssa_name (old_lhs);
1788 gsi = gsi_start_bb (bb);
1789 while (!gsi_end_p (gsi))
1791 gimple *stmt = gsi_stmt (gsi);
1792 gimple *stmt_copy = stmt;
1793 gimple_seq extra_stmts = NULL;
1794 bool modified = modify_gimple_stmt (&stmt, &extra_stmts);
1795 if (stmt != stmt_copy)
1797 gcc_checking_assert (modified);
1798 gsi_replace (&gsi, stmt, false);
1800 if (!gimple_seq_empty_p (extra_stmts))
1801 gsi_insert_seq_before (&gsi, extra_stmts, GSI_SAME_STMT);
1803 def_operand_p defp;
1804 ssa_op_iter iter;
1805 FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF)
1807 tree old_def = DEF_FROM_PTR (defp);
1808 if (tree new_def = replace_removed_params_ssa_names (old_def,
1809 stmt))
1811 SET_DEF (defp, new_def);
1812 release_ssa_name (old_def);
1813 modified = true;
1817 if (modified)
1819 update_stmt (stmt);
1820 if (maybe_clean_eh_stmt (stmt)
1821 && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
1822 cfg_changed = true;
1824 gsi_next (&gsi);
1828 return cfg_changed;
1831 /* Call gimple_debug_bind_reset_value on all debug statements describing
1832 gimple register parameters that are being removed or replaced. */
1834 void
1835 ipa_param_body_adjustments::reset_debug_stmts ()
1837 int i, len;
1838 gimple_stmt_iterator *gsip = NULL, gsi;
1840 if (MAY_HAVE_DEBUG_STMTS && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
1842 gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
1843 gsip = &gsi;
1845 len = m_reset_debug_decls.length ();
1846 for (i = 0; i < len; i++)
1848 imm_use_iterator ui;
1849 gimple *stmt;
1850 gdebug *def_temp;
1851 tree name, vexpr, copy = NULL_TREE;
1852 use_operand_p use_p;
1853 tree decl = m_reset_debug_decls[i];
1855 gcc_checking_assert (is_gimple_reg (decl));
1856 name = ssa_default_def (cfun, decl);
1857 vexpr = NULL;
1858 if (name)
1859 FOR_EACH_IMM_USE_STMT (stmt, ui, name)
1861 if (gimple_clobber_p (stmt))
1863 gimple_stmt_iterator cgsi = gsi_for_stmt (stmt);
1864 unlink_stmt_vdef (stmt);
1865 gsi_remove (&cgsi, true);
1866 release_defs (stmt);
1867 continue;
1869 /* All other users must have been removed by function body
1870 modification. */
1871 gcc_assert (is_gimple_debug (stmt));
1872 if (vexpr == NULL && gsip != NULL)
1874 vexpr = make_node (DEBUG_EXPR_DECL);
1875 def_temp = gimple_build_debug_source_bind (vexpr, decl, NULL);
1876 DECL_ARTIFICIAL (vexpr) = 1;
1877 TREE_TYPE (vexpr) = TREE_TYPE (name);
1878 SET_DECL_MODE (vexpr, DECL_MODE (decl));
1879 gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
1881 if (vexpr)
1883 FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
1884 SET_USE (use_p, vexpr);
1886 else
1887 gimple_debug_bind_reset_value (stmt);
1888 update_stmt (stmt);
1890 /* Create a VAR_DECL for debug info purposes. */
1891 if (!DECL_IGNORED_P (decl))
1893 copy = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
1894 VAR_DECL, DECL_NAME (decl),
1895 TREE_TYPE (decl));
1896 if (DECL_PT_UID_SET_P (decl))
1897 SET_DECL_PT_UID (copy, DECL_PT_UID (decl));
1898 TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
1899 TREE_READONLY (copy) = TREE_READONLY (decl);
1900 TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
1901 DECL_NOT_GIMPLE_REG_P (copy) = DECL_NOT_GIMPLE_REG_P (decl);
1902 DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (decl);
1903 DECL_IGNORED_P (copy) = DECL_IGNORED_P (decl);
1904 DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (decl);
1905 DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
1906 SET_DECL_RTL (copy, 0);
1907 TREE_USED (copy) = 1;
1908 DECL_CONTEXT (copy) = current_function_decl;
1909 add_local_decl (cfun, copy);
1910 DECL_CHAIN (copy)
1911 = BLOCK_VARS (DECL_INITIAL (current_function_decl));
1912 BLOCK_VARS (DECL_INITIAL (current_function_decl)) = copy;
1914 if (gsip != NULL && copy && target_for_debug_bind (decl))
1916 gcc_assert (TREE_CODE (decl) == PARM_DECL);
1917 if (vexpr)
1918 def_temp = gimple_build_debug_bind (copy, vexpr, NULL);
1919 else
1920 def_temp = gimple_build_debug_source_bind (copy, decl,
1921 NULL);
1922 gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
1927 /* Perform all necessary body changes to change signature, body and debug info
1928 of fun according to adjustments passed at construction. Return true if CFG
1929 was changed in any way. The main entry point for modification of standalone
1930 functions that is not part of IPA clone materialization. */
1932 bool
1933 ipa_param_body_adjustments::perform_cfun_body_modifications ()
1935 bool cfg_changed;
1936 modify_formal_parameters ();
1937 cfg_changed = modify_cfun_body ();
1938 reset_debug_stmts ();
1940 return cfg_changed;