Import pre-release gcc-5.0 to new vendor branch
[dragonfly.git] / contrib / gcc-5.0 / gcc / tree-sra.c
1 /* Scalar Replacement of Aggregates (SRA) converts some structure
2    references into scalar references, exposing them to the scalar
3    optimizers.
4    Copyright (C) 2008-2015 Free Software Foundation, Inc.
5    Contributed by Martin Jambor <mjambor@suse.cz>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 /* This file implements Scalar Reduction of Aggregates (SRA).  SRA is run
24    twice, once in the early stages of compilation (early SRA) and once in the
25    late stages (late SRA).  The aim of both is to turn references to scalar
26    parts of aggregates into uses of independent scalar variables.
27
28    The two passes are nearly identical, the only difference is that early SRA
29    does not scalarize unions which are used as the result in a GIMPLE_RETURN
30    statement because together with inlining this can lead to weird type
31    conversions.
32
33    Both passes operate in four stages:
34
35    1. The declarations that have properties which make them candidates for
36       scalarization are identified in function find_var_candidates().  The
37       candidates are stored in candidate_bitmap.
38
39    2. The function body is scanned.  In the process, declarations which are
40       used in a manner that prevent their scalarization are removed from the
41       candidate bitmap.  More importantly, for every access into an aggregate,
42       an access structure (struct access) is created by create_access() and
43       stored in a vector associated with the aggregate.  Among other
44       information, the aggregate declaration, the offset and size of the access
45       and its type are stored in the structure.
46
47       On a related note, assign_link structures are created for every assign
48       statement between candidate aggregates and attached to the related
49       accesses.
50
51    3. The vectors of accesses are analyzed.  They are first sorted according to
52       their offset and size and then scanned for partially overlapping accesses
53       (i.e. those which overlap but one is not entirely within another).  Such
54       an access disqualifies the whole aggregate from being scalarized.
55
56       If there is no such inhibiting overlap, a representative access structure
57       is chosen for every unique combination of offset and size.  Afterwards,
58       the pass builds a set of trees from these structures, in which children
59       of an access are within their parent (in terms of offset and size).
60
61       Then accesses  are propagated  whenever possible (i.e.  in cases  when it
62       does not create a partially overlapping access) across assign_links from
63       the right hand side to the left hand side.
64
65       Then the set of trees for each declaration is traversed again and those
66       accesses which should be replaced by a scalar are identified.
67
68    4. The function is traversed again, and for every reference into an
69       aggregate that has some component which is about to be scalarized,
70       statements are amended and new statements are created as necessary.
71       Finally, if a parameter got scalarized, the scalar replacements are
72       initialized with values from respective parameter aggregates.  */
73
74 #include "config.h"
75 #include "system.h"
76 #include "coretypes.h"
77 #include "hash-map.h"
78 #include "hash-table.h"
79 #include "alloc-pool.h"
80 #include "tm.h"
81 #include "hash-set.h"
82 #include "machmode.h"
83 #include "vec.h"
84 #include "double-int.h"
85 #include "input.h"
86 #include "alias.h"
87 #include "symtab.h"
88 #include "wide-int.h"
89 #include "inchash.h"
90 #include "tree.h"
91 #include "fold-const.h"
92 #include "predict.h"
93 #include "hard-reg-set.h"
94 #include "function.h"
95 #include "dominance.h"
96 #include "cfg.h"
97 #include "basic-block.h"
98 #include "tree-ssa-alias.h"
99 #include "internal-fn.h"
100 #include "tree-eh.h"
101 #include "gimple-expr.h"
102 #include "is-a.h"
103 #include "gimple.h"
104 #include "stor-layout.h"
105 #include "gimplify.h"
106 #include "gimple-iterator.h"
107 #include "gimplify-me.h"
108 #include "gimple-walk.h"
109 #include "bitmap.h"
110 #include "gimple-ssa.h"
111 #include "tree-cfg.h"
112 #include "tree-phinodes.h"
113 #include "ssa-iterators.h"
114 #include "stringpool.h"
115 #include "tree-ssanames.h"
116 #include "hashtab.h"
117 #include "rtl.h"
118 #include "flags.h"
119 #include "statistics.h"
120 #include "real.h"
121 #include "fixed-value.h"
122 #include "insn-config.h"
123 #include "expmed.h"
124 #include "dojump.h"
125 #include "explow.h"
126 #include "calls.h"
127 #include "emit-rtl.h"
128 #include "varasm.h"
129 #include "stmt.h"
130 #include "expr.h"
131 #include "tree-dfa.h"
132 #include "tree-ssa.h"
133 #include "tree-pass.h"
134 #include "plugin-api.h"
135 #include "ipa-ref.h"
136 #include "cgraph.h"
137 #include "symbol-summary.h"
138 #include "ipa-prop.h"
139 #include "params.h"
140 #include "target.h"
141 #include "dbgcnt.h"
142 #include "tree-inline.h"
143 #include "gimple-pretty-print.h"
144 #include "ipa-inline.h"
145 #include "ipa-utils.h"
146 #include "builtins.h"
147
148 /* Enumeration of all aggregate reductions we can do.  */
149 enum sra_mode { SRA_MODE_EARLY_IPA,   /* early call regularization */
150                 SRA_MODE_EARLY_INTRA, /* early intraprocedural SRA */
151                 SRA_MODE_INTRA };     /* late intraprocedural SRA */
152
153 /* Global variable describing which aggregate reduction we are performing at
154    the moment.  */
155 static enum sra_mode sra_mode;
156
157 struct assign_link;
158
159 /* ACCESS represents each access to an aggregate variable (as a whole or a
160    part).  It can also represent a group of accesses that refer to exactly the
161    same fragment of an aggregate (i.e. those that have exactly the same offset
162    and size).  Such representatives for a single aggregate, once determined,
163    are linked in a linked list and have the group fields set.
164
165    Moreover, when doing intraprocedural SRA, a tree is built from those
166    representatives (by the means of first_child and next_sibling pointers), in
167    which all items in a subtree are "within" the root, i.e. their offset is
168    greater or equal to offset of the root and offset+size is smaller or equal
169    to offset+size of the root.  Children of an access are sorted by offset.
170
171    Note that accesses to parts of vector and complex number types always
172    represented by an access to the whole complex number or a vector.  It is a
173    duty of the modifying functions to replace them appropriately.  */
174
175 struct access
176 {
177   /* Values returned by  `get_ref_base_and_extent' for each component reference
178      If EXPR isn't a component reference  just set `BASE = EXPR', `OFFSET = 0',
179      `SIZE = TREE_SIZE (TREE_TYPE (expr))'.  */
180   HOST_WIDE_INT offset;
181   HOST_WIDE_INT size;
182   tree base;
183
184   /* Expression.  It is context dependent so do not use it to create new
185      expressions to access the original aggregate.  See PR 42154 for a
186      testcase.  */
187   tree expr;
188   /* Type.  */
189   tree type;
190
191   /* The statement this access belongs to.  */
192   gimple stmt;
193
194   /* Next group representative for this aggregate. */
195   struct access *next_grp;
196
197   /* Pointer to the group representative.  Pointer to itself if the struct is
198      the representative.  */
199   struct access *group_representative;
200
201   /* If this access has any children (in terms of the definition above), this
202      points to the first one.  */
203   struct access *first_child;
204
205   /* In intraprocedural SRA, pointer to the next sibling in the access tree as
206      described above.  In IPA-SRA this is a pointer to the next access
207      belonging to the same group (having the same representative).  */
208   struct access *next_sibling;
209
210   /* Pointers to the first and last element in the linked list of assign
211      links.  */
212   struct assign_link *first_link, *last_link;
213
214   /* Pointer to the next access in the work queue.  */
215   struct access *next_queued;
216
217   /* Replacement variable for this access "region."  Never to be accessed
218      directly, always only by the means of get_access_replacement() and only
219      when grp_to_be_replaced flag is set.  */
220   tree replacement_decl;
221
222   /* Is this particular access write access? */
223   unsigned write : 1;
224
225   /* Is this access an access to a non-addressable field? */
226   unsigned non_addressable : 1;
227
228   /* Is this access currently in the work queue?  */
229   unsigned grp_queued : 1;
230
231   /* Does this group contain a write access?  This flag is propagated down the
232      access tree.  */
233   unsigned grp_write : 1;
234
235   /* Does this group contain a read access?  This flag is propagated down the
236      access tree.  */
237   unsigned grp_read : 1;
238
239   /* Does this group contain a read access that comes from an assignment
240      statement?  This flag is propagated down the access tree.  */
241   unsigned grp_assignment_read : 1;
242
243   /* Does this group contain a write access that comes from an assignment
244      statement?  This flag is propagated down the access tree.  */
245   unsigned grp_assignment_write : 1;
246
247   /* Does this group contain a read access through a scalar type?  This flag is
248      not propagated in the access tree in any direction.  */
249   unsigned grp_scalar_read : 1;
250
251   /* Does this group contain a write access through a scalar type?  This flag
252      is not propagated in the access tree in any direction.  */
253   unsigned grp_scalar_write : 1;
254
255   /* Is this access an artificial one created to scalarize some record
256      entirely? */
257   unsigned grp_total_scalarization : 1;
258
259   /* Other passes of the analysis use this bit to make function
260      analyze_access_subtree create scalar replacements for this group if
261      possible.  */
262   unsigned grp_hint : 1;
263
264   /* Is the subtree rooted in this access fully covered by scalar
265      replacements?  */
266   unsigned grp_covered : 1;
267
268   /* If set to true, this access and all below it in an access tree must not be
269      scalarized.  */
270   unsigned grp_unscalarizable_region : 1;
271
272   /* Whether data have been written to parts of the aggregate covered by this
273      access which is not to be scalarized.  This flag is propagated up in the
274      access tree.  */
275   unsigned grp_unscalarized_data : 1;
276
277   /* Does this access and/or group contain a write access through a
278      BIT_FIELD_REF?  */
279   unsigned grp_partial_lhs : 1;
280
281   /* Set when a scalar replacement should be created for this variable.  */
282   unsigned grp_to_be_replaced : 1;
283
284   /* Set when we want a replacement for the sole purpose of having it in
285      generated debug statements.  */
286   unsigned grp_to_be_debug_replaced : 1;
287
288   /* Should TREE_NO_WARNING of a replacement be set?  */
289   unsigned grp_no_warning : 1;
290
291   /* Is it possible that the group refers to data which might be (directly or
292      otherwise) modified?  */
293   unsigned grp_maybe_modified : 1;
294
295   /* Set when this is a representative of a pointer to scalar (i.e. by
296      reference) parameter which we consider for turning into a plain scalar
297      (i.e. a by value parameter).  */
298   unsigned grp_scalar_ptr : 1;
299
300   /* Set when we discover that this pointer is not safe to dereference in the
301      caller.  */
302   unsigned grp_not_necessarilly_dereferenced : 1;
303 };
304
305 typedef struct access *access_p;
306
307
308 /* Alloc pool for allocating access structures.  */
309 static alloc_pool access_pool;
310
311 /* A structure linking lhs and rhs accesses from an aggregate assignment.  They
312    are used to propagate subaccesses from rhs to lhs as long as they don't
313    conflict with what is already there.  */
314 struct assign_link
315 {
316   struct access *lacc, *racc;
317   struct assign_link *next;
318 };
319
320 /* Alloc pool for allocating assign link structures.  */
321 static alloc_pool link_pool;
322
323 /* Base (tree) -> Vector (vec<access_p> *) map.  */
324 static hash_map<tree, auto_vec<access_p> > *base_access_vec;
325
326 /* Candidate hash table helpers.  */
327
328 struct uid_decl_hasher : typed_noop_remove <tree_node>
329 {
330   typedef tree_node value_type;
331   typedef tree_node compare_type;
332   static inline hashval_t hash (const value_type *);
333   static inline bool equal (const value_type *, const compare_type *);
334 };
335
336 /* Hash a tree in a uid_decl_map.  */
337
338 inline hashval_t
339 uid_decl_hasher::hash (const value_type *item)
340 {
341   return item->decl_minimal.uid;
342 }
343
344 /* Return true if the DECL_UID in both trees are equal.  */
345
346 inline bool
347 uid_decl_hasher::equal (const value_type *a, const compare_type *b)
348 {
349   return (a->decl_minimal.uid == b->decl_minimal.uid);
350 }
351
352 /* Set of candidates.  */
353 static bitmap candidate_bitmap;
354 static hash_table<uid_decl_hasher> *candidates;
355
356 /* For a candidate UID return the candidates decl.  */
357
358 static inline tree
359 candidate (unsigned uid)
360 {
361  tree_node t;
362  t.decl_minimal.uid = uid;
363  return candidates->find_with_hash (&t, static_cast <hashval_t> (uid));
364 }
365
366 /* Bitmap of candidates which we should try to entirely scalarize away and
367    those which cannot be (because they are and need be used as a whole).  */
368 static bitmap should_scalarize_away_bitmap, cannot_scalarize_away_bitmap;
369
370 /* Obstack for creation of fancy names.  */
371 static struct obstack name_obstack;
372
373 /* Head of a linked list of accesses that need to have its subaccesses
374    propagated to their assignment counterparts. */
375 static struct access *work_queue_head;
376
377 /* Number of parameters of the analyzed function when doing early ipa SRA.  */
378 static int func_param_count;
379
380 /* scan_function sets the following to true if it encounters a call to
381    __builtin_apply_args.  */
382 static bool encountered_apply_args;
383
384 /* Set by scan_function when it finds a recursive call.  */
385 static bool encountered_recursive_call;
386
387 /* Set by scan_function when it finds a recursive call with less actual
388    arguments than formal parameters..  */
389 static bool encountered_unchangable_recursive_call;
390
391 /* This is a table in which for each basic block and parameter there is a
392    distance (offset + size) in that parameter which is dereferenced and
393    accessed in that BB.  */
394 static HOST_WIDE_INT *bb_dereferences;
395 /* Bitmap of BBs that can cause the function to "stop" progressing by
396    returning, throwing externally, looping infinitely or calling a function
397    which might abort etc.. */
398 static bitmap final_bbs;
399
400 /* Representative of no accesses at all. */
401 static struct access  no_accesses_representant;
402
403 /* Predicate to test the special value.  */
404
405 static inline bool
406 no_accesses_p (struct access *access)
407 {
408   return access == &no_accesses_representant;
409 }
410
411 /* Dump contents of ACCESS to file F in a human friendly way.  If GRP is true,
412    representative fields are dumped, otherwise those which only describe the
413    individual access are.  */
414
415 static struct
416 {
417   /* Number of processed aggregates is readily available in
418      analyze_all_variable_accesses and so is not stored here.  */
419
420   /* Number of created scalar replacements.  */
421   int replacements;
422
423   /* Number of times sra_modify_expr or sra_modify_assign themselves changed an
424      expression.  */
425   int exprs;
426
427   /* Number of statements created by generate_subtree_copies.  */
428   int subtree_copies;
429
430   /* Number of statements created by load_assign_lhs_subreplacements.  */
431   int subreplacements;
432
433   /* Number of times sra_modify_assign has deleted a statement.  */
434   int deleted;
435
436   /* Number of times sra_modify_assign has to deal with subaccesses of LHS and
437      RHS reparately due to type conversions or nonexistent matching
438      references.  */
439   int separate_lhs_rhs_handling;
440
441   /* Number of parameters that were removed because they were unused.  */
442   int deleted_unused_parameters;
443
444   /* Number of scalars passed as parameters by reference that have been
445      converted to be passed by value.  */
446   int scalar_by_ref_to_by_val;
447
448   /* Number of aggregate parameters that were replaced by one or more of their
449      components.  */
450   int aggregate_params_reduced;
451
452   /* Numbber of components created when splitting aggregate parameters.  */
453   int param_reductions_created;
454 } sra_stats;
455
456 static void
457 dump_access (FILE *f, struct access *access, bool grp)
458 {
459   fprintf (f, "access { ");
460   fprintf (f, "base = (%d)'", DECL_UID (access->base));
461   print_generic_expr (f, access->base, 0);
462   fprintf (f, "', offset = " HOST_WIDE_INT_PRINT_DEC, access->offset);
463   fprintf (f, ", size = " HOST_WIDE_INT_PRINT_DEC, access->size);
464   fprintf (f, ", expr = ");
465   print_generic_expr (f, access->expr, 0);
466   fprintf (f, ", type = ");
467   print_generic_expr (f, access->type, 0);
468   if (grp)
469     fprintf (f, ", grp_read = %d, grp_write = %d, grp_assignment_read = %d, "
470              "grp_assignment_write = %d, grp_scalar_read = %d, "
471              "grp_scalar_write = %d, grp_total_scalarization = %d, "
472              "grp_hint = %d, grp_covered = %d, "
473              "grp_unscalarizable_region = %d, grp_unscalarized_data = %d, "
474              "grp_partial_lhs = %d, grp_to_be_replaced = %d, "
475              "grp_to_be_debug_replaced = %d, grp_maybe_modified = %d, "
476              "grp_not_necessarilly_dereferenced = %d\n",
477              access->grp_read, access->grp_write, access->grp_assignment_read,
478              access->grp_assignment_write, access->grp_scalar_read,
479              access->grp_scalar_write, access->grp_total_scalarization,
480              access->grp_hint, access->grp_covered,
481              access->grp_unscalarizable_region, access->grp_unscalarized_data,
482              access->grp_partial_lhs, access->grp_to_be_replaced,
483              access->grp_to_be_debug_replaced, access->grp_maybe_modified,
484              access->grp_not_necessarilly_dereferenced);
485   else
486     fprintf (f, ", write = %d, grp_total_scalarization = %d, "
487              "grp_partial_lhs = %d\n",
488              access->write, access->grp_total_scalarization,
489              access->grp_partial_lhs);
490 }
491
492 /* Dump a subtree rooted in ACCESS to file F, indent by LEVEL.  */
493
494 static void
495 dump_access_tree_1 (FILE *f, struct access *access, int level)
496 {
497   do
498     {
499       int i;
500
501       for (i = 0; i < level; i++)
502         fputs ("* ", dump_file);
503
504       dump_access (f, access, true);
505
506       if (access->first_child)
507         dump_access_tree_1 (f, access->first_child, level + 1);
508
509       access = access->next_sibling;
510     }
511   while (access);
512 }
513
514 /* Dump all access trees for a variable, given the pointer to the first root in
515    ACCESS.  */
516
517 static void
518 dump_access_tree (FILE *f, struct access *access)
519 {
520   for (; access; access = access->next_grp)
521     dump_access_tree_1 (f, access, 0);
522 }
523
524 /* Return true iff ACC is non-NULL and has subaccesses.  */
525
526 static inline bool
527 access_has_children_p (struct access *acc)
528 {
529   return acc && acc->first_child;
530 }
531
532 /* Return true iff ACC is (partly) covered by at least one replacement.  */
533
534 static bool
535 access_has_replacements_p (struct access *acc)
536 {
537   struct access *child;
538   if (acc->grp_to_be_replaced)
539     return true;
540   for (child = acc->first_child; child; child = child->next_sibling)
541     if (access_has_replacements_p (child))
542       return true;
543   return false;
544 }
545
546 /* Return a vector of pointers to accesses for the variable given in BASE or
547    NULL if there is none.  */
548
549 static vec<access_p> *
550 get_base_access_vector (tree base)
551 {
552   return base_access_vec->get (base);
553 }
554
555 /* Find an access with required OFFSET and SIZE in a subtree of accesses rooted
556    in ACCESS.  Return NULL if it cannot be found.  */
557
558 static struct access *
559 find_access_in_subtree (struct access *access, HOST_WIDE_INT offset,
560                         HOST_WIDE_INT size)
561 {
562   while (access && (access->offset != offset || access->size != size))
563     {
564       struct access *child = access->first_child;
565
566       while (child && (child->offset + child->size <= offset))
567         child = child->next_sibling;
568       access = child;
569     }
570
571   return access;
572 }
573
574 /* Return the first group representative for DECL or NULL if none exists.  */
575
576 static struct access *
577 get_first_repr_for_decl (tree base)
578 {
579   vec<access_p> *access_vec;
580
581   access_vec = get_base_access_vector (base);
582   if (!access_vec)
583     return NULL;
584
585   return (*access_vec)[0];
586 }
587
588 /* Find an access representative for the variable BASE and given OFFSET and
589    SIZE.  Requires that access trees have already been built.  Return NULL if
590    it cannot be found.  */
591
592 static struct access *
593 get_var_base_offset_size_access (tree base, HOST_WIDE_INT offset,
594                                  HOST_WIDE_INT size)
595 {
596   struct access *access;
597
598   access = get_first_repr_for_decl (base);
599   while (access && (access->offset + access->size <= offset))
600     access = access->next_grp;
601   if (!access)
602     return NULL;
603
604   return find_access_in_subtree (access, offset, size);
605 }
606
607 /* Add LINK to the linked list of assign links of RACC.  */
608 static void
609 add_link_to_rhs (struct access *racc, struct assign_link *link)
610 {
611   gcc_assert (link->racc == racc);
612
613   if (!racc->first_link)
614     {
615       gcc_assert (!racc->last_link);
616       racc->first_link = link;
617     }
618   else
619     racc->last_link->next = link;
620
621   racc->last_link = link;
622   link->next = NULL;
623 }
624
625 /* Move all link structures in their linked list in OLD_RACC to the linked list
626    in NEW_RACC.  */
627 static void
628 relink_to_new_repr (struct access *new_racc, struct access *old_racc)
629 {
630   if (!old_racc->first_link)
631     {
632       gcc_assert (!old_racc->last_link);
633       return;
634     }
635
636   if (new_racc->first_link)
637     {
638       gcc_assert (!new_racc->last_link->next);
639       gcc_assert (!old_racc->last_link || !old_racc->last_link->next);
640
641       new_racc->last_link->next = old_racc->first_link;
642       new_racc->last_link = old_racc->last_link;
643     }
644   else
645     {
646       gcc_assert (!new_racc->last_link);
647
648       new_racc->first_link = old_racc->first_link;
649       new_racc->last_link = old_racc->last_link;
650     }
651   old_racc->first_link = old_racc->last_link = NULL;
652 }
653
654 /* Add ACCESS to the work queue (which is actually a stack).  */
655
656 static void
657 add_access_to_work_queue (struct access *access)
658 {
659   if (!access->grp_queued)
660     {
661       gcc_assert (!access->next_queued);
662       access->next_queued = work_queue_head;
663       access->grp_queued = 1;
664       work_queue_head = access;
665     }
666 }
667
668 /* Pop an access from the work queue, and return it, assuming there is one.  */
669
670 static struct access *
671 pop_access_from_work_queue (void)
672 {
673   struct access *access = work_queue_head;
674
675   work_queue_head = access->next_queued;
676   access->next_queued = NULL;
677   access->grp_queued = 0;
678   return access;
679 }
680
681
682 /* Allocate necessary structures.  */
683
684 static void
685 sra_initialize (void)
686 {
687   candidate_bitmap = BITMAP_ALLOC (NULL);
688   candidates = new hash_table<uid_decl_hasher>
689     (vec_safe_length (cfun->local_decls) / 2);
690   should_scalarize_away_bitmap = BITMAP_ALLOC (NULL);
691   cannot_scalarize_away_bitmap = BITMAP_ALLOC (NULL);
692   gcc_obstack_init (&name_obstack);
693   access_pool = create_alloc_pool ("SRA accesses", sizeof (struct access), 16);
694   link_pool = create_alloc_pool ("SRA links", sizeof (struct assign_link), 16);
695   base_access_vec = new hash_map<tree, auto_vec<access_p> >;
696   memset (&sra_stats, 0, sizeof (sra_stats));
697   encountered_apply_args = false;
698   encountered_recursive_call = false;
699   encountered_unchangable_recursive_call = false;
700 }
701
702 /* Deallocate all general structures.  */
703
704 static void
705 sra_deinitialize (void)
706 {
707   BITMAP_FREE (candidate_bitmap);
708   delete candidates;
709   candidates = NULL;
710   BITMAP_FREE (should_scalarize_away_bitmap);
711   BITMAP_FREE (cannot_scalarize_away_bitmap);
712   free_alloc_pool (access_pool);
713   free_alloc_pool (link_pool);
714   obstack_free (&name_obstack, NULL);
715
716   delete base_access_vec;
717 }
718
719 /* Remove DECL from candidates for SRA and write REASON to the dump file if
720    there is one.  */
721 static void
722 disqualify_candidate (tree decl, const char *reason)
723 {
724   if (bitmap_clear_bit (candidate_bitmap, DECL_UID (decl)))
725     candidates->remove_elt_with_hash (decl, DECL_UID (decl));
726
727   if (dump_file && (dump_flags & TDF_DETAILS))
728     {
729       fprintf (dump_file, "! Disqualifying ");
730       print_generic_expr (dump_file, decl, 0);
731       fprintf (dump_file, " - %s\n", reason);
732     }
733 }
734
735 /* Return true iff the type contains a field or an element which does not allow
736    scalarization.  */
737
738 static bool
739 type_internals_preclude_sra_p (tree type, const char **msg)
740 {
741   tree fld;
742   tree et;
743
744   switch (TREE_CODE (type))
745     {
746     case RECORD_TYPE:
747     case UNION_TYPE:
748     case QUAL_UNION_TYPE:
749       for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
750         if (TREE_CODE (fld) == FIELD_DECL)
751           {
752             tree ft = TREE_TYPE (fld);
753
754             if (TREE_THIS_VOLATILE (fld))
755               {
756                 *msg = "volatile structure field";
757                 return true;
758               }
759             if (!DECL_FIELD_OFFSET (fld))
760               {
761                 *msg = "no structure field offset";
762                 return true;
763               }
764             if (!DECL_SIZE (fld))
765               {
766                 *msg = "zero structure field size";
767                 return true;
768               }
769             if (!tree_fits_uhwi_p (DECL_FIELD_OFFSET (fld)))
770               {
771                 *msg = "structure field offset not fixed";
772                 return true;
773               }
774             if (!tree_fits_uhwi_p (DECL_SIZE (fld)))
775               {
776                 *msg = "structure field size not fixed";
777                 return true;
778               }
779             if (!tree_fits_shwi_p (bit_position (fld)))
780               {
781                 *msg = "structure field size too big";
782                 return true;
783               }
784             if (AGGREGATE_TYPE_P (ft)
785                     && int_bit_position (fld) % BITS_PER_UNIT != 0)
786               {
787                 *msg = "structure field is bit field";
788                 return true;
789               }
790
791             if (AGGREGATE_TYPE_P (ft) && type_internals_preclude_sra_p (ft, msg))
792               return true;
793           }
794
795       return false;
796
797     case ARRAY_TYPE:
798       et = TREE_TYPE (type);
799
800       if (TYPE_VOLATILE (et))
801         {
802           *msg = "element type is volatile";
803           return true;
804         }
805
806       if (AGGREGATE_TYPE_P (et) && type_internals_preclude_sra_p (et, msg))
807         return true;
808
809       return false;
810
811     default:
812       return false;
813     }
814 }
815
816 /* If T is an SSA_NAME, return NULL if it is not a default def or return its
817    base variable if it is.  Return T if it is not an SSA_NAME.  */
818
819 static tree
820 get_ssa_base_param (tree t)
821 {
822   if (TREE_CODE (t) == SSA_NAME)
823     {
824       if (SSA_NAME_IS_DEFAULT_DEF (t))
825         return SSA_NAME_VAR (t);
826       else
827         return NULL_TREE;
828     }
829   return t;
830 }
831
832 /* Mark a dereference of BASE of distance DIST in a basic block tht STMT
833    belongs to, unless the BB has already been marked as a potentially
834    final.  */
835
836 static void
837 mark_parm_dereference (tree base, HOST_WIDE_INT dist, gimple stmt)
838 {
839   basic_block bb = gimple_bb (stmt);
840   int idx, parm_index = 0;
841   tree parm;
842
843   if (bitmap_bit_p (final_bbs, bb->index))
844     return;
845
846   for (parm = DECL_ARGUMENTS (current_function_decl);
847        parm && parm != base;
848        parm = DECL_CHAIN (parm))
849     parm_index++;
850
851   gcc_assert (parm_index < func_param_count);
852
853   idx = bb->index * func_param_count + parm_index;
854   if (bb_dereferences[idx] < dist)
855     bb_dereferences[idx] = dist;
856 }
857
858 /* Allocate an access structure for BASE, OFFSET and SIZE, clear it, fill in
859    the three fields.  Also add it to the vector of accesses corresponding to
860    the base.  Finally, return the new access.  */
861
862 static struct access *
863 create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size)
864 {
865   struct access *access;
866
867   access = (struct access *) pool_alloc (access_pool);
868   memset (access, 0, sizeof (struct access));
869   access->base = base;
870   access->offset = offset;
871   access->size = size;
872
873   base_access_vec->get_or_insert (base).safe_push (access);
874
875   return access;
876 }
877
878 /* Create and insert access for EXPR. Return created access, or NULL if it is
879    not possible.  */
880
881 static struct access *
882 create_access (tree expr, gimple stmt, bool write)
883 {
884   struct access *access;
885   HOST_WIDE_INT offset, size, max_size;
886   tree base = expr;
887   bool ptr, unscalarizable_region = false;
888
889   base = get_ref_base_and_extent (expr, &offset, &size, &max_size);
890
891   if (sra_mode == SRA_MODE_EARLY_IPA
892       && TREE_CODE (base) == MEM_REF)
893     {
894       base = get_ssa_base_param (TREE_OPERAND (base, 0));
895       if (!base)
896         return NULL;
897       ptr = true;
898     }
899   else
900     ptr = false;
901
902   if (!DECL_P (base) || !bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
903     return NULL;
904
905   if (sra_mode == SRA_MODE_EARLY_IPA)
906     {
907       if (size < 0 || size != max_size)
908         {
909           disqualify_candidate (base, "Encountered a variable sized access.");
910           return NULL;
911         }
912       if (TREE_CODE (expr) == COMPONENT_REF
913           && DECL_BIT_FIELD (TREE_OPERAND (expr, 1)))
914         {
915           disqualify_candidate (base, "Encountered a bit-field access.");
916           return NULL;
917         }
918       gcc_checking_assert ((offset % BITS_PER_UNIT) == 0);
919
920       if (ptr)
921         mark_parm_dereference (base, offset + size, stmt);
922     }
923   else
924     {
925       if (size != max_size)
926         {
927           size = max_size;
928           unscalarizable_region = true;
929         }
930       if (size < 0)
931         {
932           disqualify_candidate (base, "Encountered an unconstrained access.");
933           return NULL;
934         }
935     }
936
937   access = create_access_1 (base, offset, size);
938   access->expr = expr;
939   access->type = TREE_TYPE (expr);
940   access->write = write;
941   access->grp_unscalarizable_region = unscalarizable_region;
942   access->stmt = stmt;
943
944   if (TREE_CODE (expr) == COMPONENT_REF
945       && DECL_NONADDRESSABLE_P (TREE_OPERAND (expr, 1)))
946     access->non_addressable = 1;
947
948   return access;
949 }
950
951
952 /* Return true iff TYPE is a RECORD_TYPE with fields that are either of gimple
953    register types or (recursively) records with only these two kinds of fields.
954    It also returns false if any of these records contains a bit-field.  */
955
956 static bool
957 type_consists_of_records_p (tree type)
958 {
959   tree fld;
960
961   if (TREE_CODE (type) != RECORD_TYPE)
962     return false;
963
964   for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
965     if (TREE_CODE (fld) == FIELD_DECL)
966       {
967         tree ft = TREE_TYPE (fld);
968
969         if (DECL_BIT_FIELD (fld))
970           return false;
971
972         if (!is_gimple_reg_type (ft)
973             && !type_consists_of_records_p (ft))
974           return false;
975       }
976
977   return true;
978 }
979
980 /* Create total_scalarization accesses for all scalar type fields in DECL that
981    must be of a RECORD_TYPE conforming to type_consists_of_records_p.  BASE
982    must be the top-most VAR_DECL representing the variable, OFFSET must be the
983    offset of DECL within BASE.  REF must be the memory reference expression for
984    the given decl.  */
985
986 static void
987 completely_scalarize_record (tree base, tree decl, HOST_WIDE_INT offset,
988                              tree ref)
989 {
990   tree fld, decl_type = TREE_TYPE (decl);
991
992   for (fld = TYPE_FIELDS (decl_type); fld; fld = DECL_CHAIN (fld))
993     if (TREE_CODE (fld) == FIELD_DECL)
994       {
995         HOST_WIDE_INT pos = offset + int_bit_position (fld);
996         tree ft = TREE_TYPE (fld);
997         tree nref = build3 (COMPONENT_REF, TREE_TYPE (fld), ref, fld,
998                             NULL_TREE);
999
1000         if (is_gimple_reg_type (ft))
1001           {
1002             struct access *access;
1003             HOST_WIDE_INT size;
1004
1005             size = tree_to_uhwi (DECL_SIZE (fld));
1006             access = create_access_1 (base, pos, size);
1007             access->expr = nref;
1008             access->type = ft;
1009             access->grp_total_scalarization = 1;
1010             /* Accesses for intraprocedural SRA can have their stmt NULL.  */
1011           }
1012         else
1013           completely_scalarize_record (base, fld, pos, nref);
1014       }
1015 }
1016
1017 /* Create total_scalarization accesses for all scalar type fields in VAR and
1018    for VAR a a whole.  VAR must be of a RECORD_TYPE conforming to
1019    type_consists_of_records_p.   */
1020
1021 static void
1022 completely_scalarize_var (tree var)
1023 {
1024   HOST_WIDE_INT size = tree_to_uhwi (DECL_SIZE (var));
1025   struct access *access;
1026
1027   access = create_access_1 (var, 0, size);
1028   access->expr = var;
1029   access->type = TREE_TYPE (var);
1030   access->grp_total_scalarization = 1;
1031
1032   completely_scalarize_record (var, var, 0, var);
1033 }
1034
1035 /* Return true if REF has an VIEW_CONVERT_EXPR somewhere in it.  */
1036
1037 static inline bool
1038 contains_view_convert_expr_p (const_tree ref)
1039 {
1040   while (handled_component_p (ref))
1041     {
1042       if (TREE_CODE (ref) == VIEW_CONVERT_EXPR)
1043         return true;
1044       ref = TREE_OPERAND (ref, 0);
1045     }
1046
1047   return false;
1048 }
1049
1050 /* Search the given tree for a declaration by skipping handled components and
1051    exclude it from the candidates.  */
1052
1053 static void
1054 disqualify_base_of_expr (tree t, const char *reason)
1055 {
1056   t = get_base_address (t);
1057   if (sra_mode == SRA_MODE_EARLY_IPA
1058       && TREE_CODE (t) == MEM_REF)
1059     t = get_ssa_base_param (TREE_OPERAND (t, 0));
1060
1061   if (t && DECL_P (t))
1062     disqualify_candidate (t, reason);
1063 }
1064
1065 /* Scan expression EXPR and create access structures for all accesses to
1066    candidates for scalarization.  Return the created access or NULL if none is
1067    created.  */
1068
1069 static struct access *
1070 build_access_from_expr_1 (tree expr, gimple stmt, bool write)
1071 {
1072   struct access *ret = NULL;
1073   bool partial_ref;
1074
1075   if (TREE_CODE (expr) == BIT_FIELD_REF
1076       || TREE_CODE (expr) == IMAGPART_EXPR
1077       || TREE_CODE (expr) == REALPART_EXPR)
1078     {
1079       expr = TREE_OPERAND (expr, 0);
1080       partial_ref = true;
1081     }
1082   else
1083     partial_ref = false;
1084
1085   /* We need to dive through V_C_Es in order to get the size of its parameter
1086      and not the result type.  Ada produces such statements.  We are also
1087      capable of handling the topmost V_C_E but not any of those buried in other
1088      handled components.  */
1089   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
1090     expr = TREE_OPERAND (expr, 0);
1091
1092   if (contains_view_convert_expr_p (expr))
1093     {
1094       disqualify_base_of_expr (expr, "V_C_E under a different handled "
1095                                "component.");
1096       return NULL;
1097     }
1098   if (TREE_THIS_VOLATILE (expr))
1099     {
1100       disqualify_base_of_expr (expr, "part of a volatile reference.");
1101       return NULL;
1102     }
1103
1104   switch (TREE_CODE (expr))
1105     {
1106     case MEM_REF:
1107       if (TREE_CODE (TREE_OPERAND (expr, 0)) != ADDR_EXPR
1108           && sra_mode != SRA_MODE_EARLY_IPA)
1109         return NULL;
1110       /* fall through */
1111     case VAR_DECL:
1112     case PARM_DECL:
1113     case RESULT_DECL:
1114     case COMPONENT_REF:
1115     case ARRAY_REF:
1116     case ARRAY_RANGE_REF:
1117       ret = create_access (expr, stmt, write);
1118       break;
1119
1120     default:
1121       break;
1122     }
1123
1124   if (write && partial_ref && ret)
1125     ret->grp_partial_lhs = 1;
1126
1127   return ret;
1128 }
1129
1130 /* Scan expression EXPR and create access structures for all accesses to
1131    candidates for scalarization.  Return true if any access has been inserted.
1132    STMT must be the statement from which the expression is taken, WRITE must be
1133    true if the expression is a store and false otherwise. */
1134
1135 static bool
1136 build_access_from_expr (tree expr, gimple stmt, bool write)
1137 {
1138   struct access *access;
1139
1140   access = build_access_from_expr_1 (expr, stmt, write);
1141   if (access)
1142     {
1143       /* This means the aggregate is accesses as a whole in a way other than an
1144          assign statement and thus cannot be removed even if we had a scalar
1145          replacement for everything.  */
1146       if (cannot_scalarize_away_bitmap)
1147         bitmap_set_bit (cannot_scalarize_away_bitmap, DECL_UID (access->base));
1148       return true;
1149     }
1150   return false;
1151 }
1152
1153 /* Return the single non-EH successor edge of BB or NULL if there is none or
1154    more than one.  */
1155
1156 static edge
1157 single_non_eh_succ (basic_block bb)
1158 {
1159   edge e, res = NULL;
1160   edge_iterator ei;
1161
1162   FOR_EACH_EDGE (e, ei, bb->succs)
1163     if (!(e->flags & EDGE_EH))
1164       {
1165         if (res)
1166           return NULL;
1167         res = e;
1168       }
1169
1170   return res;
1171 }
1172
1173 /* Disqualify LHS and RHS for scalarization if STMT has to terminate its BB and
1174    there is no alternative spot where to put statements SRA might need to
1175    generate after it.  The spot we are looking for is an edge leading to a
1176    single non-EH successor, if it exists and is indeed single.  RHS may be
1177    NULL, in that case ignore it.  */
1178
1179 static bool
1180 disqualify_if_bad_bb_terminating_stmt (gimple stmt, tree lhs, tree rhs)
1181 {
1182   if ((sra_mode == SRA_MODE_EARLY_INTRA || sra_mode == SRA_MODE_INTRA)
1183       && stmt_ends_bb_p (stmt))
1184     {
1185       if (single_non_eh_succ (gimple_bb (stmt)))
1186         return false;
1187
1188       disqualify_base_of_expr (lhs, "LHS of a throwing stmt.");
1189       if (rhs)
1190         disqualify_base_of_expr (rhs, "RHS of a throwing stmt.");
1191       return true;
1192     }
1193   return false;
1194 }
1195
1196 /* Scan expressions occurring in STMT, create access structures for all accesses
1197    to candidates for scalarization and remove those candidates which occur in
1198    statements or expressions that prevent them from being split apart.  Return
1199    true if any access has been inserted.  */
1200
1201 static bool
1202 build_accesses_from_assign (gimple stmt)
1203 {
1204   tree lhs, rhs;
1205   struct access *lacc, *racc;
1206
1207   if (!gimple_assign_single_p (stmt)
1208       /* Scope clobbers don't influence scalarization.  */
1209       || gimple_clobber_p (stmt))
1210     return false;
1211
1212   lhs = gimple_assign_lhs (stmt);
1213   rhs = gimple_assign_rhs1 (stmt);
1214
1215   if (disqualify_if_bad_bb_terminating_stmt (stmt, lhs, rhs))
1216     return false;
1217
1218   racc = build_access_from_expr_1 (rhs, stmt, false);
1219   lacc = build_access_from_expr_1 (lhs, stmt, true);
1220
1221   if (lacc)
1222     lacc->grp_assignment_write = 1;
1223
1224   if (racc)
1225     {
1226       racc->grp_assignment_read = 1;
1227       if (should_scalarize_away_bitmap && !gimple_has_volatile_ops (stmt)
1228           && !is_gimple_reg_type (racc->type))
1229         bitmap_set_bit (should_scalarize_away_bitmap, DECL_UID (racc->base));
1230     }
1231
1232   if (lacc && racc
1233       && (sra_mode == SRA_MODE_EARLY_INTRA || sra_mode == SRA_MODE_INTRA)
1234       && !lacc->grp_unscalarizable_region
1235       && !racc->grp_unscalarizable_region
1236       && AGGREGATE_TYPE_P (TREE_TYPE (lhs))
1237       && lacc->size == racc->size
1238       && useless_type_conversion_p (lacc->type, racc->type))
1239     {
1240       struct assign_link *link;
1241
1242       link = (struct assign_link *) pool_alloc (link_pool);
1243       memset (link, 0, sizeof (struct assign_link));
1244
1245       link->lacc = lacc;
1246       link->racc = racc;
1247
1248       add_link_to_rhs (racc, link);
1249     }
1250
1251   return lacc || racc;
1252 }
1253
1254 /* Callback of walk_stmt_load_store_addr_ops visit_addr used to determine
1255    GIMPLE_ASM operands with memory constrains which cannot be scalarized.  */
1256
1257 static bool
1258 asm_visit_addr (gimple, tree op, tree, void *)
1259 {
1260   op = get_base_address (op);
1261   if (op
1262       && DECL_P (op))
1263     disqualify_candidate (op, "Non-scalarizable GIMPLE_ASM operand.");
1264
1265   return false;
1266 }
1267
1268 /* Return true iff callsite CALL has at least as many actual arguments as there
1269    are formal parameters of the function currently processed by IPA-SRA and
1270    that their types match.  */
1271
1272 static inline bool
1273 callsite_arguments_match_p (gimple call)
1274 {
1275   if (gimple_call_num_args (call) < (unsigned) func_param_count)
1276     return false;
1277
1278   tree parm;
1279   int i;
1280   for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1281        parm;
1282        parm = DECL_CHAIN (parm), i++)
1283     {
1284       tree arg = gimple_call_arg (call, i);
1285       if (!useless_type_conversion_p (TREE_TYPE (parm), TREE_TYPE (arg)))
1286         return false;
1287     }
1288   return true;
1289 }
1290
1291 /* Scan function and look for interesting expressions and create access
1292    structures for them.  Return true iff any access is created.  */
1293
1294 static bool
1295 scan_function (void)
1296 {
1297   basic_block bb;
1298   bool ret = false;
1299
1300   FOR_EACH_BB_FN (bb, cfun)
1301     {
1302       gimple_stmt_iterator gsi;
1303       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1304         {
1305           gimple stmt = gsi_stmt (gsi);
1306           tree t;
1307           unsigned i;
1308
1309           if (final_bbs && stmt_can_throw_external (stmt))
1310             bitmap_set_bit (final_bbs, bb->index);
1311           switch (gimple_code (stmt))
1312             {
1313             case GIMPLE_RETURN:
1314               t = gimple_return_retval (as_a <greturn *> (stmt));
1315               if (t != NULL_TREE)
1316                 ret |= build_access_from_expr (t, stmt, false);
1317               if (final_bbs)
1318                 bitmap_set_bit (final_bbs, bb->index);
1319               break;
1320
1321             case GIMPLE_ASSIGN:
1322               ret |= build_accesses_from_assign (stmt);
1323               break;
1324
1325             case GIMPLE_CALL:
1326               for (i = 0; i < gimple_call_num_args (stmt); i++)
1327                 ret |= build_access_from_expr (gimple_call_arg (stmt, i),
1328                                                stmt, false);
1329
1330               if (sra_mode == SRA_MODE_EARLY_IPA)
1331                 {
1332                   tree dest = gimple_call_fndecl (stmt);
1333                   int flags = gimple_call_flags (stmt);
1334
1335                   if (dest)
1336                     {
1337                       if (DECL_BUILT_IN_CLASS (dest) == BUILT_IN_NORMAL
1338                           && DECL_FUNCTION_CODE (dest) == BUILT_IN_APPLY_ARGS)
1339                         encountered_apply_args = true;
1340                       if (recursive_call_p (current_function_decl, dest))
1341                         {
1342                           encountered_recursive_call = true;
1343                           if (!callsite_arguments_match_p (stmt))
1344                             encountered_unchangable_recursive_call = true;
1345                         }
1346                     }
1347
1348                   if (final_bbs
1349                       && (flags & (ECF_CONST | ECF_PURE)) == 0)
1350                     bitmap_set_bit (final_bbs, bb->index);
1351                 }
1352
1353               t = gimple_call_lhs (stmt);
1354               if (t && !disqualify_if_bad_bb_terminating_stmt (stmt, t, NULL))
1355                 ret |= build_access_from_expr (t, stmt, true);
1356               break;
1357
1358             case GIMPLE_ASM:
1359               {
1360                 gasm *asm_stmt = as_a <gasm *> (stmt);
1361                 walk_stmt_load_store_addr_ops (asm_stmt, NULL, NULL, NULL,
1362                                                asm_visit_addr);
1363                 if (final_bbs)
1364                   bitmap_set_bit (final_bbs, bb->index);
1365
1366                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
1367                   {
1368                     t = TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
1369                     ret |= build_access_from_expr (t, asm_stmt, false);
1370                   }
1371                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
1372                   {
1373                     t = TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
1374                     ret |= build_access_from_expr (t, asm_stmt, true);
1375                   }
1376               }
1377               break;
1378
1379             default:
1380               break;
1381             }
1382         }
1383     }
1384
1385   return ret;
1386 }
1387
1388 /* Helper of QSORT function. There are pointers to accesses in the array.  An
1389    access is considered smaller than another if it has smaller offset or if the
1390    offsets are the same but is size is bigger. */
1391
1392 static int
1393 compare_access_positions (const void *a, const void *b)
1394 {
1395   const access_p *fp1 = (const access_p *) a;
1396   const access_p *fp2 = (const access_p *) b;
1397   const access_p f1 = *fp1;
1398   const access_p f2 = *fp2;
1399
1400   if (f1->offset != f2->offset)
1401     return f1->offset < f2->offset ? -1 : 1;
1402
1403   if (f1->size == f2->size)
1404     {
1405       if (f1->type == f2->type)
1406         return 0;
1407       /* Put any non-aggregate type before any aggregate type.  */
1408       else if (!is_gimple_reg_type (f1->type)
1409           && is_gimple_reg_type (f2->type))
1410         return 1;
1411       else if (is_gimple_reg_type (f1->type)
1412                && !is_gimple_reg_type (f2->type))
1413         return -1;
1414       /* Put any complex or vector type before any other scalar type.  */
1415       else if (TREE_CODE (f1->type) != COMPLEX_TYPE
1416                && TREE_CODE (f1->type) != VECTOR_TYPE
1417                && (TREE_CODE (f2->type) == COMPLEX_TYPE
1418                    || TREE_CODE (f2->type) == VECTOR_TYPE))
1419         return 1;
1420       else if ((TREE_CODE (f1->type) == COMPLEX_TYPE
1421                 || TREE_CODE (f1->type) == VECTOR_TYPE)
1422                && TREE_CODE (f2->type) != COMPLEX_TYPE
1423                && TREE_CODE (f2->type) != VECTOR_TYPE)
1424         return -1;
1425       /* Put the integral type with the bigger precision first.  */
1426       else if (INTEGRAL_TYPE_P (f1->type)
1427                && INTEGRAL_TYPE_P (f2->type))
1428         return TYPE_PRECISION (f2->type) - TYPE_PRECISION (f1->type);
1429       /* Put any integral type with non-full precision last.  */
1430       else if (INTEGRAL_TYPE_P (f1->type)
1431                && (TREE_INT_CST_LOW (TYPE_SIZE (f1->type))
1432                    != TYPE_PRECISION (f1->type)))
1433         return 1;
1434       else if (INTEGRAL_TYPE_P (f2->type)
1435                && (TREE_INT_CST_LOW (TYPE_SIZE (f2->type))
1436                    != TYPE_PRECISION (f2->type)))
1437         return -1;
1438       /* Stabilize the sort.  */
1439       return TYPE_UID (f1->type) - TYPE_UID (f2->type);
1440     }
1441
1442   /* We want the bigger accesses first, thus the opposite operator in the next
1443      line: */
1444   return f1->size > f2->size ? -1 : 1;
1445 }
1446
1447
1448 /* Append a name of the declaration to the name obstack.  A helper function for
1449    make_fancy_name.  */
1450
1451 static void
1452 make_fancy_decl_name (tree decl)
1453 {
1454   char buffer[32];
1455
1456   tree name = DECL_NAME (decl);
1457   if (name)
1458     obstack_grow (&name_obstack, IDENTIFIER_POINTER (name),
1459                   IDENTIFIER_LENGTH (name));
1460   else
1461     {
1462       sprintf (buffer, "D%u", DECL_UID (decl));
1463       obstack_grow (&name_obstack, buffer, strlen (buffer));
1464     }
1465 }
1466
1467 /* Helper for make_fancy_name.  */
1468
1469 static void
1470 make_fancy_name_1 (tree expr)
1471 {
1472   char buffer[32];
1473   tree index;
1474
1475   if (DECL_P (expr))
1476     {
1477       make_fancy_decl_name (expr);
1478       return;
1479     }
1480
1481   switch (TREE_CODE (expr))
1482     {
1483     case COMPONENT_REF:
1484       make_fancy_name_1 (TREE_OPERAND (expr, 0));
1485       obstack_1grow (&name_obstack, '$');
1486       make_fancy_decl_name (TREE_OPERAND (expr, 1));
1487       break;
1488
1489     case ARRAY_REF:
1490       make_fancy_name_1 (TREE_OPERAND (expr, 0));
1491       obstack_1grow (&name_obstack, '$');
1492       /* Arrays with only one element may not have a constant as their
1493          index. */
1494       index = TREE_OPERAND (expr, 1);
1495       if (TREE_CODE (index) != INTEGER_CST)
1496         break;
1497       sprintf (buffer, HOST_WIDE_INT_PRINT_DEC, TREE_INT_CST_LOW (index));
1498       obstack_grow (&name_obstack, buffer, strlen (buffer));
1499       break;
1500
1501     case ADDR_EXPR:
1502       make_fancy_name_1 (TREE_OPERAND (expr, 0));
1503       break;
1504
1505     case MEM_REF:
1506       make_fancy_name_1 (TREE_OPERAND (expr, 0));
1507       if (!integer_zerop (TREE_OPERAND (expr, 1)))
1508         {
1509           obstack_1grow (&name_obstack, '$');
1510           sprintf (buffer, HOST_WIDE_INT_PRINT_DEC,
1511                    TREE_INT_CST_LOW (TREE_OPERAND (expr, 1)));
1512           obstack_grow (&name_obstack, buffer, strlen (buffer));
1513         }
1514       break;
1515
1516     case BIT_FIELD_REF:
1517     case REALPART_EXPR:
1518     case IMAGPART_EXPR:
1519       gcc_unreachable ();       /* we treat these as scalars.  */
1520       break;
1521     default:
1522       break;
1523     }
1524 }
1525
1526 /* Create a human readable name for replacement variable of ACCESS.  */
1527
1528 static char *
1529 make_fancy_name (tree expr)
1530 {
1531   make_fancy_name_1 (expr);
1532   obstack_1grow (&name_obstack, '\0');
1533   return XOBFINISH (&name_obstack, char *);
1534 }
1535
1536 /* Construct a MEM_REF that would reference a part of aggregate BASE of type
1537    EXP_TYPE at the given OFFSET.  If BASE is something for which
1538    get_addr_base_and_unit_offset returns NULL, gsi must be non-NULL and is used
1539    to insert new statements either before or below the current one as specified
1540    by INSERT_AFTER.  This function is not capable of handling bitfields.
1541
1542    BASE must be either a declaration or a memory reference that has correct
1543    alignment ifformation embeded in it (e.g. a pre-existing one in SRA).  */
1544
1545 tree
1546 build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset,
1547                       tree exp_type, gimple_stmt_iterator *gsi,
1548                       bool insert_after)
1549 {
1550   tree prev_base = base;
1551   tree off;
1552   tree mem_ref;
1553   HOST_WIDE_INT base_offset;
1554   unsigned HOST_WIDE_INT misalign;
1555   unsigned int align;
1556
1557   gcc_checking_assert (offset % BITS_PER_UNIT == 0);
1558   get_object_alignment_1 (base, &align, &misalign);
1559   base = get_addr_base_and_unit_offset (base, &base_offset);
1560
1561   /* get_addr_base_and_unit_offset returns NULL for references with a variable
1562      offset such as array[var_index].  */
1563   if (!base)
1564     {
1565       gassign *stmt;
1566       tree tmp, addr;
1567
1568       gcc_checking_assert (gsi);
1569       tmp = make_ssa_name (build_pointer_type (TREE_TYPE (prev_base)));
1570       addr = build_fold_addr_expr (unshare_expr (prev_base));
1571       STRIP_USELESS_TYPE_CONVERSION (addr);
1572       stmt = gimple_build_assign (tmp, addr);
1573       gimple_set_location (stmt, loc);
1574       if (insert_after)
1575         gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
1576       else
1577         gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
1578
1579       off = build_int_cst (reference_alias_ptr_type (prev_base),
1580                            offset / BITS_PER_UNIT);
1581       base = tmp;
1582     }
1583   else if (TREE_CODE (base) == MEM_REF)
1584     {
1585       off = build_int_cst (TREE_TYPE (TREE_OPERAND (base, 1)),
1586                            base_offset + offset / BITS_PER_UNIT);
1587       off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1), off);
1588       base = unshare_expr (TREE_OPERAND (base, 0));
1589     }
1590   else
1591     {
1592       off = build_int_cst (reference_alias_ptr_type (base),
1593                            base_offset + offset / BITS_PER_UNIT);
1594       base = build_fold_addr_expr (unshare_expr (base));
1595     }
1596
1597   misalign = (misalign + offset) & (align - 1);
1598   if (misalign != 0)
1599     align = (misalign & -misalign);
1600   if (align < TYPE_ALIGN (exp_type))
1601     exp_type = build_aligned_type (exp_type, align);
1602
1603   mem_ref = fold_build2_loc (loc, MEM_REF, exp_type, base, off);
1604   if (TREE_THIS_VOLATILE (prev_base))
1605     TREE_THIS_VOLATILE (mem_ref) = 1;
1606   if (TREE_SIDE_EFFECTS (prev_base))
1607     TREE_SIDE_EFFECTS (mem_ref) = 1;
1608   return mem_ref;
1609 }
1610
1611 /* Construct a memory reference to a part of an aggregate BASE at the given
1612    OFFSET and of the same type as MODEL.  In case this is a reference to a
1613    bit-field, the function will replicate the last component_ref of model's
1614    expr to access it.  GSI and INSERT_AFTER have the same meaning as in
1615    build_ref_for_offset.  */
1616
1617 static tree
1618 build_ref_for_model (location_t loc, tree base, HOST_WIDE_INT offset,
1619                      struct access *model, gimple_stmt_iterator *gsi,
1620                      bool insert_after)
1621 {
1622   if (TREE_CODE (model->expr) == COMPONENT_REF
1623       && DECL_BIT_FIELD (TREE_OPERAND (model->expr, 1)))
1624     {
1625       /* This access represents a bit-field.  */
1626       tree t, exp_type, fld = TREE_OPERAND (model->expr, 1);
1627
1628       offset -= int_bit_position (fld);
1629       exp_type = TREE_TYPE (TREE_OPERAND (model->expr, 0));
1630       t = build_ref_for_offset (loc, base, offset, exp_type, gsi, insert_after);
1631       return fold_build3_loc (loc, COMPONENT_REF, TREE_TYPE (fld), t, fld,
1632                               NULL_TREE);
1633     }
1634   else
1635     return build_ref_for_offset (loc, base, offset, model->type,
1636                                  gsi, insert_after);
1637 }
1638
1639 /* Attempt to build a memory reference that we could but into a gimple
1640    debug_bind statement.  Similar to build_ref_for_model but punts if it has to
1641    create statements and return s NULL instead.  This function also ignores
1642    alignment issues and so its results should never end up in non-debug
1643    statements.  */
1644
1645 static tree
1646 build_debug_ref_for_model (location_t loc, tree base, HOST_WIDE_INT offset,
1647                            struct access *model)
1648 {
1649   HOST_WIDE_INT base_offset;
1650   tree off;
1651
1652   if (TREE_CODE (model->expr) == COMPONENT_REF
1653       && DECL_BIT_FIELD (TREE_OPERAND (model->expr, 1)))
1654     return NULL_TREE;
1655
1656   base = get_addr_base_and_unit_offset (base, &base_offset);
1657   if (!base)
1658     return NULL_TREE;
1659   if (TREE_CODE (base) == MEM_REF)
1660     {
1661       off = build_int_cst (TREE_TYPE (TREE_OPERAND (base, 1)),
1662                            base_offset + offset / BITS_PER_UNIT);
1663       off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1), off);
1664       base = unshare_expr (TREE_OPERAND (base, 0));
1665     }
1666   else
1667     {
1668       off = build_int_cst (reference_alias_ptr_type (base),
1669                            base_offset + offset / BITS_PER_UNIT);
1670       base = build_fold_addr_expr (unshare_expr (base));
1671     }
1672
1673   return fold_build2_loc (loc, MEM_REF, model->type, base, off);
1674 }
1675
1676 /* Construct a memory reference consisting of component_refs and array_refs to
1677    a part of an aggregate *RES (which is of type TYPE).  The requested part
1678    should have type EXP_TYPE at be the given OFFSET.  This function might not
1679    succeed, it returns true when it does and only then *RES points to something
1680    meaningful.  This function should be used only to build expressions that we
1681    might need to present to user (e.g. in warnings).  In all other situations,
1682    build_ref_for_model or build_ref_for_offset should be used instead.  */
1683
1684 static bool
1685 build_user_friendly_ref_for_offset (tree *res, tree type, HOST_WIDE_INT offset,
1686                                     tree exp_type)
1687 {
1688   while (1)
1689     {
1690       tree fld;
1691       tree tr_size, index, minidx;
1692       HOST_WIDE_INT el_size;
1693
1694       if (offset == 0 && exp_type
1695           && types_compatible_p (exp_type, type))
1696         return true;
1697
1698       switch (TREE_CODE (type))
1699         {
1700         case UNION_TYPE:
1701         case QUAL_UNION_TYPE:
1702         case RECORD_TYPE:
1703           for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
1704             {
1705               HOST_WIDE_INT pos, size;
1706               tree tr_pos, expr, *expr_ptr;
1707
1708               if (TREE_CODE (fld) != FIELD_DECL)
1709                 continue;
1710
1711               tr_pos = bit_position (fld);
1712               if (!tr_pos || !tree_fits_uhwi_p (tr_pos))
1713                 continue;
1714               pos = tree_to_uhwi (tr_pos);
1715               gcc_assert (TREE_CODE (type) == RECORD_TYPE || pos == 0);
1716               tr_size = DECL_SIZE (fld);
1717               if (!tr_size || !tree_fits_uhwi_p (tr_size))
1718                 continue;
1719               size = tree_to_uhwi (tr_size);
1720               if (size == 0)
1721                 {
1722                   if (pos != offset)
1723                     continue;
1724                 }
1725               else if (pos > offset || (pos + size) <= offset)
1726                 continue;
1727
1728               expr = build3 (COMPONENT_REF, TREE_TYPE (fld), *res, fld,
1729                              NULL_TREE);
1730               expr_ptr = &expr;
1731               if (build_user_friendly_ref_for_offset (expr_ptr, TREE_TYPE (fld),
1732                                                       offset - pos, exp_type))
1733                 {
1734                   *res = expr;
1735                   return true;
1736                 }
1737             }
1738           return false;
1739
1740         case ARRAY_TYPE:
1741           tr_size = TYPE_SIZE (TREE_TYPE (type));
1742           if (!tr_size || !tree_fits_uhwi_p (tr_size))
1743             return false;
1744           el_size = tree_to_uhwi (tr_size);
1745
1746           minidx = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
1747           if (TREE_CODE (minidx) != INTEGER_CST || el_size == 0)
1748             return false;
1749           index = build_int_cst (TYPE_DOMAIN (type), offset / el_size);
1750           if (!integer_zerop (minidx))
1751             index = int_const_binop (PLUS_EXPR, index, minidx);
1752           *res = build4 (ARRAY_REF, TREE_TYPE (type), *res, index,
1753                          NULL_TREE, NULL_TREE);
1754           offset = offset % el_size;
1755           type = TREE_TYPE (type);
1756           break;
1757
1758         default:
1759           if (offset != 0)
1760             return false;
1761
1762           if (exp_type)
1763             return false;
1764           else
1765             return true;
1766         }
1767     }
1768 }
1769
1770 /* Return true iff TYPE is stdarg va_list type.  */
1771
1772 static inline bool
1773 is_va_list_type (tree type)
1774 {
1775   return TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (va_list_type_node);
1776 }
1777
1778 /* Print message to dump file why a variable was rejected. */
1779
1780 static void
1781 reject (tree var, const char *msg)
1782 {
1783   if (dump_file && (dump_flags & TDF_DETAILS))
1784     {
1785       fprintf (dump_file, "Rejected (%d): %s: ", DECL_UID (var), msg);
1786       print_generic_expr (dump_file, var, 0);
1787       fprintf (dump_file, "\n");
1788     }
1789 }
1790
1791 /* Return true if VAR is a candidate for SRA.  */
1792
1793 static bool
1794 maybe_add_sra_candidate (tree var)
1795 {
1796   tree type = TREE_TYPE (var);
1797   const char *msg;
1798   tree_node **slot;
1799
1800   if (!AGGREGATE_TYPE_P (type)) 
1801     {
1802       reject (var, "not aggregate");
1803       return false;
1804     }
1805   if (needs_to_live_in_memory (var))
1806     {
1807       reject (var, "needs to live in memory");
1808       return false;
1809     }
1810   if (TREE_THIS_VOLATILE (var))
1811     {
1812       reject (var, "is volatile");
1813       return false;
1814     }
1815   if (!COMPLETE_TYPE_P (type))
1816     {
1817       reject (var, "has incomplete type");
1818       return false;
1819     }
1820   if (!tree_fits_uhwi_p (TYPE_SIZE (type)))
1821     {
1822       reject (var, "type size not fixed");
1823       return false;
1824     }
1825   if (tree_to_uhwi (TYPE_SIZE (type)) == 0)
1826     {
1827       reject (var, "type size is zero");
1828       return false;
1829     }
1830   if (type_internals_preclude_sra_p (type, &msg))
1831     {
1832       reject (var, msg);
1833       return false;
1834     }
1835   if (/* Fix for PR 41089.  tree-stdarg.c needs to have va_lists intact but
1836          we also want to schedule it rather late.  Thus we ignore it in
1837          the early pass. */
1838       (sra_mode == SRA_MODE_EARLY_INTRA
1839        && is_va_list_type (type)))
1840     {
1841       reject (var, "is va_list");
1842       return false;
1843     }
1844
1845   bitmap_set_bit (candidate_bitmap, DECL_UID (var));
1846   slot = candidates->find_slot_with_hash (var, DECL_UID (var), INSERT);
1847   *slot = var;
1848
1849   if (dump_file && (dump_flags & TDF_DETAILS))
1850     {
1851       fprintf (dump_file, "Candidate (%d): ", DECL_UID (var));
1852       print_generic_expr (dump_file, var, 0);
1853       fprintf (dump_file, "\n");
1854     }
1855
1856   return true;
1857 }
1858
1859 /* The very first phase of intraprocedural SRA.  It marks in candidate_bitmap
1860    those with type which is suitable for scalarization.  */
1861
1862 static bool
1863 find_var_candidates (void)
1864 {
1865   tree var, parm;
1866   unsigned int i;
1867   bool ret = false;
1868
1869   for (parm = DECL_ARGUMENTS (current_function_decl);
1870        parm;
1871        parm = DECL_CHAIN (parm))
1872     ret |= maybe_add_sra_candidate (parm);
1873
1874   FOR_EACH_LOCAL_DECL (cfun, i, var)
1875     {
1876       if (TREE_CODE (var) != VAR_DECL)
1877         continue;
1878
1879       ret |= maybe_add_sra_candidate (var);
1880     }
1881
1882   return ret;
1883 }
1884
1885 /* Sort all accesses for the given variable, check for partial overlaps and
1886    return NULL if there are any.  If there are none, pick a representative for
1887    each combination of offset and size and create a linked list out of them.
1888    Return the pointer to the first representative and make sure it is the first
1889    one in the vector of accesses.  */
1890
1891 static struct access *
1892 sort_and_splice_var_accesses (tree var)
1893 {
1894   int i, j, access_count;
1895   struct access *res, **prev_acc_ptr = &res;
1896   vec<access_p> *access_vec;
1897   bool first = true;
1898   HOST_WIDE_INT low = -1, high = 0;
1899
1900   access_vec = get_base_access_vector (var);
1901   if (!access_vec)
1902     return NULL;
1903   access_count = access_vec->length ();
1904
1905   /* Sort by <OFFSET, SIZE>.  */
1906   access_vec->qsort (compare_access_positions);
1907
1908   i = 0;
1909   while (i < access_count)
1910     {
1911       struct access *access = (*access_vec)[i];
1912       bool grp_write = access->write;
1913       bool grp_read = !access->write;
1914       bool grp_scalar_write = access->write
1915         && is_gimple_reg_type (access->type);
1916       bool grp_scalar_read = !access->write
1917         && is_gimple_reg_type (access->type);
1918       bool grp_assignment_read = access->grp_assignment_read;
1919       bool grp_assignment_write = access->grp_assignment_write;
1920       bool multiple_scalar_reads = false;
1921       bool total_scalarization = access->grp_total_scalarization;
1922       bool grp_partial_lhs = access->grp_partial_lhs;
1923       bool first_scalar = is_gimple_reg_type (access->type);
1924       bool unscalarizable_region = access->grp_unscalarizable_region;
1925
1926       if (first || access->offset >= high)
1927         {
1928           first = false;
1929           low = access->offset;
1930           high = access->offset + access->size;
1931         }
1932       else if (access->offset > low && access->offset + access->size > high)
1933         return NULL;
1934       else
1935         gcc_assert (access->offset >= low
1936                     && access->offset + access->size <= high);
1937
1938       j = i + 1;
1939       while (j < access_count)
1940         {
1941           struct access *ac2 = (*access_vec)[j];
1942           if (ac2->offset != access->offset || ac2->size != access->size)
1943             break;
1944           if (ac2->write)
1945             {
1946               grp_write = true;
1947               grp_scalar_write = (grp_scalar_write
1948                                   || is_gimple_reg_type (ac2->type));
1949             }
1950           else
1951             {
1952               grp_read = true;
1953               if (is_gimple_reg_type (ac2->type))
1954                 {
1955                   if (grp_scalar_read)
1956                     multiple_scalar_reads = true;
1957                   else
1958                     grp_scalar_read = true;
1959                 }
1960             }
1961           grp_assignment_read |= ac2->grp_assignment_read;
1962           grp_assignment_write |= ac2->grp_assignment_write;
1963           grp_partial_lhs |= ac2->grp_partial_lhs;
1964           unscalarizable_region |= ac2->grp_unscalarizable_region;
1965           total_scalarization |= ac2->grp_total_scalarization;
1966           relink_to_new_repr (access, ac2);
1967
1968           /* If there are both aggregate-type and scalar-type accesses with
1969              this combination of size and offset, the comparison function
1970              should have put the scalars first.  */
1971           gcc_assert (first_scalar || !is_gimple_reg_type (ac2->type));
1972           ac2->group_representative = access;
1973           j++;
1974         }
1975
1976       i = j;
1977
1978       access->group_representative = access;
1979       access->grp_write = grp_write;
1980       access->grp_read = grp_read;
1981       access->grp_scalar_read = grp_scalar_read;
1982       access->grp_scalar_write = grp_scalar_write;
1983       access->grp_assignment_read = grp_assignment_read;
1984       access->grp_assignment_write = grp_assignment_write;
1985       access->grp_hint = multiple_scalar_reads || total_scalarization;
1986       access->grp_total_scalarization = total_scalarization;
1987       access->grp_partial_lhs = grp_partial_lhs;
1988       access->grp_unscalarizable_region = unscalarizable_region;
1989       if (access->first_link)
1990         add_access_to_work_queue (access);
1991
1992       *prev_acc_ptr = access;
1993       prev_acc_ptr = &access->next_grp;
1994     }
1995
1996   gcc_assert (res == (*access_vec)[0]);
1997   return res;
1998 }
1999
2000 /* Create a variable for the given ACCESS which determines the type, name and a
2001    few other properties.  Return the variable declaration and store it also to
2002    ACCESS->replacement.  */
2003
2004 static tree
2005 create_access_replacement (struct access *access)
2006 {
2007   tree repl;
2008
2009   if (access->grp_to_be_debug_replaced)
2010     {
2011       repl = create_tmp_var_raw (access->type);
2012       DECL_CONTEXT (repl) = current_function_decl;
2013     }
2014   else
2015     repl = create_tmp_var (access->type, "SR");
2016   if (TREE_CODE (access->type) == COMPLEX_TYPE
2017       || TREE_CODE (access->type) == VECTOR_TYPE)
2018     {
2019       if (!access->grp_partial_lhs)
2020         DECL_GIMPLE_REG_P (repl) = 1;
2021     }
2022   else if (access->grp_partial_lhs
2023            && is_gimple_reg_type (access->type))
2024     TREE_ADDRESSABLE (repl) = 1;
2025
2026   DECL_SOURCE_LOCATION (repl) = DECL_SOURCE_LOCATION (access->base);
2027   DECL_ARTIFICIAL (repl) = 1;
2028   DECL_IGNORED_P (repl) = DECL_IGNORED_P (access->base);
2029
2030   if (DECL_NAME (access->base)
2031       && !DECL_IGNORED_P (access->base)
2032       && !DECL_ARTIFICIAL (access->base))
2033     {
2034       char *pretty_name = make_fancy_name (access->expr);
2035       tree debug_expr = unshare_expr_without_location (access->expr), d;
2036       bool fail = false;
2037
2038       DECL_NAME (repl) = get_identifier (pretty_name);
2039       obstack_free (&name_obstack, pretty_name);
2040
2041       /* Get rid of any SSA_NAMEs embedded in debug_expr,
2042          as DECL_DEBUG_EXPR isn't considered when looking for still
2043          used SSA_NAMEs and thus they could be freed.  All debug info
2044          generation cares is whether something is constant or variable
2045          and that get_ref_base_and_extent works properly on the
2046          expression.  It cannot handle accesses at a non-constant offset
2047          though, so just give up in those cases.  */
2048       for (d = debug_expr;
2049            !fail && (handled_component_p (d) || TREE_CODE (d) == MEM_REF);
2050            d = TREE_OPERAND (d, 0))
2051         switch (TREE_CODE (d))
2052           {
2053           case ARRAY_REF:
2054           case ARRAY_RANGE_REF:
2055             if (TREE_OPERAND (d, 1)
2056                 && TREE_CODE (TREE_OPERAND (d, 1)) != INTEGER_CST)
2057               fail = true;
2058             if (TREE_OPERAND (d, 3)
2059                 && TREE_CODE (TREE_OPERAND (d, 3)) != INTEGER_CST)
2060               fail = true;
2061             /* FALLTHRU */
2062           case COMPONENT_REF:
2063             if (TREE_OPERAND (d, 2)
2064                 && TREE_CODE (TREE_OPERAND (d, 2)) != INTEGER_CST)
2065               fail = true;
2066             break;
2067           case MEM_REF:
2068             if (TREE_CODE (TREE_OPERAND (d, 0)) != ADDR_EXPR)
2069               fail = true;
2070             else
2071               d = TREE_OPERAND (d, 0);
2072             break;
2073           default:
2074             break;
2075           }
2076       if (!fail)
2077         {
2078           SET_DECL_DEBUG_EXPR (repl, debug_expr);
2079           DECL_HAS_DEBUG_EXPR_P (repl) = 1;
2080         }
2081       if (access->grp_no_warning)
2082         TREE_NO_WARNING (repl) = 1;
2083       else
2084         TREE_NO_WARNING (repl) = TREE_NO_WARNING (access->base);
2085     }
2086   else
2087     TREE_NO_WARNING (repl) = 1;
2088
2089   if (dump_file)
2090     {
2091       if (access->grp_to_be_debug_replaced)
2092         {
2093           fprintf (dump_file, "Created a debug-only replacement for ");
2094           print_generic_expr (dump_file, access->base, 0);
2095           fprintf (dump_file, " offset: %u, size: %u\n",
2096                    (unsigned) access->offset, (unsigned) access->size);
2097         }
2098       else
2099         {
2100           fprintf (dump_file, "Created a replacement for ");
2101           print_generic_expr (dump_file, access->base, 0);
2102           fprintf (dump_file, " offset: %u, size: %u: ",
2103                    (unsigned) access->offset, (unsigned) access->size);
2104           print_generic_expr (dump_file, repl, 0);
2105           fprintf (dump_file, "\n");
2106         }
2107     }
2108   sra_stats.replacements++;
2109
2110   return repl;
2111 }
2112
2113 /* Return ACCESS scalar replacement, create it if it does not exist yet.  */
2114
2115 static inline tree
2116 get_access_replacement (struct access *access)
2117 {
2118   gcc_checking_assert (access->replacement_decl);
2119   return access->replacement_decl;
2120 }
2121
2122
2123 /* Build a subtree of accesses rooted in *ACCESS, and move the pointer in the
2124    linked list along the way.  Stop when *ACCESS is NULL or the access pointed
2125    to it is not "within" the root.  Return false iff some accesses partially
2126    overlap.  */
2127
2128 static bool
2129 build_access_subtree (struct access **access)
2130 {
2131   struct access *root = *access, *last_child = NULL;
2132   HOST_WIDE_INT limit = root->offset + root->size;
2133
2134   *access = (*access)->next_grp;
2135   while  (*access && (*access)->offset + (*access)->size <= limit)
2136     {
2137       if (!last_child)
2138         root->first_child = *access;
2139       else
2140         last_child->next_sibling = *access;
2141       last_child = *access;
2142
2143       if (!build_access_subtree (access))
2144         return false;
2145     }
2146
2147   if (*access && (*access)->offset < limit)
2148     return false;
2149
2150   return true;
2151 }
2152
2153 /* Build a tree of access representatives, ACCESS is the pointer to the first
2154    one, others are linked in a list by the next_grp field.  Return false iff
2155    some accesses partially overlap.  */
2156
2157 static bool
2158 build_access_trees (struct access *access)
2159 {
2160   while (access)
2161     {
2162       struct access *root = access;
2163
2164       if (!build_access_subtree (&access))
2165         return false;
2166       root->next_grp = access;
2167     }
2168   return true;
2169 }
2170
2171 /* Return true if expr contains some ARRAY_REFs into a variable bounded
2172    array.  */
2173
2174 static bool
2175 expr_with_var_bounded_array_refs_p (tree expr)
2176 {
2177   while (handled_component_p (expr))
2178     {
2179       if (TREE_CODE (expr) == ARRAY_REF
2180           && !tree_fits_shwi_p (array_ref_low_bound (expr)))
2181         return true;
2182       expr = TREE_OPERAND (expr, 0);
2183     }
2184   return false;
2185 }
2186
2187 /* Analyze the subtree of accesses rooted in ROOT, scheduling replacements when
2188    both seeming beneficial and when ALLOW_REPLACEMENTS allows it.  Also set all
2189    sorts of access flags appropriately along the way, notably always set
2190    grp_read and grp_assign_read according to MARK_READ and grp_write when
2191    MARK_WRITE is true.
2192
2193    Creating a replacement for a scalar access is considered beneficial if its
2194    grp_hint is set (this means we are either attempting total scalarization or
2195    there is more than one direct read access) or according to the following
2196    table:
2197
2198    Access written to through a scalar type (once or more times)
2199    |
2200    |    Written to in an assignment statement
2201    |    |
2202    |    |       Access read as scalar _once_
2203    |    |       |
2204    |    |       |       Read in an assignment statement
2205    |    |       |       |
2206    |    |       |       |       Scalarize       Comment
2207 -----------------------------------------------------------------------------
2208    0    0       0       0                       No access for the scalar
2209    0    0       0       1                       No access for the scalar
2210    0    0       1       0       No              Single read - won't help
2211    0    0       1       1       No              The same case
2212    0    1       0       0                       No access for the scalar
2213    0    1       0       1                       No access for the scalar
2214    0    1       1       0       Yes             s = *g; return s.i;
2215    0    1       1       1       Yes             The same case as above
2216    1    0       0       0       No              Won't help
2217    1    0       0       1       Yes             s.i = 1; *g = s;
2218    1    0       1       0       Yes             s.i = 5; g = s.i;
2219    1    0       1       1       Yes             The same case as above
2220    1    1       0       0       No              Won't help.
2221    1    1       0       1       Yes             s.i = 1; *g = s;
2222    1    1       1       0       Yes             s = *g; return s.i;
2223    1    1       1       1       Yes             Any of the above yeses  */
2224
2225 static bool
2226 analyze_access_subtree (struct access *root, struct access *parent,
2227                         bool allow_replacements)
2228 {
2229   struct access *child;
2230   HOST_WIDE_INT limit = root->offset + root->size;
2231   HOST_WIDE_INT covered_to = root->offset;
2232   bool scalar = is_gimple_reg_type (root->type);
2233   bool hole = false, sth_created = false;
2234
2235   if (parent)
2236     {
2237       if (parent->grp_read)
2238         root->grp_read = 1;
2239       if (parent->grp_assignment_read)
2240         root->grp_assignment_read = 1;
2241       if (parent->grp_write)
2242         root->grp_write = 1;
2243       if (parent->grp_assignment_write)
2244         root->grp_assignment_write = 1;
2245       if (parent->grp_total_scalarization)
2246         root->grp_total_scalarization = 1;
2247     }
2248
2249   if (root->grp_unscalarizable_region)
2250     allow_replacements = false;
2251
2252   if (allow_replacements && expr_with_var_bounded_array_refs_p (root->expr))
2253     allow_replacements = false;
2254
2255   for (child = root->first_child; child; child = child->next_sibling)
2256     {
2257       hole |= covered_to < child->offset;
2258       sth_created |= analyze_access_subtree (child, root,
2259                                              allow_replacements && !scalar);
2260
2261       root->grp_unscalarized_data |= child->grp_unscalarized_data;
2262       root->grp_total_scalarization &= child->grp_total_scalarization;
2263       if (child->grp_covered)
2264         covered_to += child->size;
2265       else
2266         hole = true;
2267     }
2268
2269   if (allow_replacements && scalar && !root->first_child
2270       && (root->grp_hint
2271           || ((root->grp_scalar_read || root->grp_assignment_read)
2272               && (root->grp_scalar_write || root->grp_assignment_write))))
2273     {
2274       /* Always create access replacements that cover the whole access.
2275          For integral types this means the precision has to match.
2276          Avoid assumptions based on the integral type kind, too.  */
2277       if (INTEGRAL_TYPE_P (root->type)
2278           && (TREE_CODE (root->type) != INTEGER_TYPE
2279               || TYPE_PRECISION (root->type) != root->size)
2280           /* But leave bitfield accesses alone.  */
2281           && (TREE_CODE (root->expr) != COMPONENT_REF
2282               || !DECL_BIT_FIELD (TREE_OPERAND (root->expr, 1))))
2283         {
2284           tree rt = root->type;
2285           gcc_assert ((root->offset % BITS_PER_UNIT) == 0
2286                       && (root->size % BITS_PER_UNIT) == 0);
2287           root->type = build_nonstandard_integer_type (root->size,
2288                                                        TYPE_UNSIGNED (rt));
2289           root->expr = build_ref_for_offset (UNKNOWN_LOCATION,
2290                                              root->base, root->offset,
2291                                              root->type, NULL, false);
2292
2293           if (dump_file && (dump_flags & TDF_DETAILS))
2294             {
2295               fprintf (dump_file, "Changing the type of a replacement for ");
2296               print_generic_expr (dump_file, root->base, 0);
2297               fprintf (dump_file, " offset: %u, size: %u ",
2298                        (unsigned) root->offset, (unsigned) root->size);
2299               fprintf (dump_file, " to an integer.\n");
2300             }
2301         }
2302
2303       root->grp_to_be_replaced = 1;
2304       root->replacement_decl = create_access_replacement (root);
2305       sth_created = true;
2306       hole = false;
2307     }
2308   else
2309     {
2310       if (allow_replacements
2311           && scalar && !root->first_child
2312           && (root->grp_scalar_write || root->grp_assignment_write)
2313           && !bitmap_bit_p (cannot_scalarize_away_bitmap,
2314                             DECL_UID (root->base)))
2315         {
2316           gcc_checking_assert (!root->grp_scalar_read
2317                                && !root->grp_assignment_read);
2318           sth_created = true;
2319           if (MAY_HAVE_DEBUG_STMTS)
2320             {
2321               root->grp_to_be_debug_replaced = 1;
2322               root->replacement_decl = create_access_replacement (root);
2323             }
2324         }
2325
2326       if (covered_to < limit)
2327         hole = true;
2328       if (scalar)
2329         root->grp_total_scalarization = 0;
2330     }
2331
2332   if (!hole || root->grp_total_scalarization)
2333     root->grp_covered = 1;
2334   else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL)
2335     root->grp_unscalarized_data = 1; /* not covered and written to */
2336   return sth_created;
2337 }
2338
2339 /* Analyze all access trees linked by next_grp by the means of
2340    analyze_access_subtree.  */
2341 static bool
2342 analyze_access_trees (struct access *access)
2343 {
2344   bool ret = false;
2345
2346   while (access)
2347     {
2348       if (analyze_access_subtree (access, NULL, true))
2349         ret = true;
2350       access = access->next_grp;
2351     }
2352
2353   return ret;
2354 }
2355
2356 /* Return true iff a potential new child of LACC at offset OFFSET and with size
2357    SIZE would conflict with an already existing one.  If exactly such a child
2358    already exists in LACC, store a pointer to it in EXACT_MATCH.  */
2359
2360 static bool
2361 child_would_conflict_in_lacc (struct access *lacc, HOST_WIDE_INT norm_offset,
2362                               HOST_WIDE_INT size, struct access **exact_match)
2363 {
2364   struct access *child;
2365
2366   for (child = lacc->first_child; child; child = child->next_sibling)
2367     {
2368       if (child->offset == norm_offset && child->size == size)
2369         {
2370           *exact_match = child;
2371           return true;
2372         }
2373
2374       if (child->offset < norm_offset + size
2375           && child->offset + child->size > norm_offset)
2376         return true;
2377     }
2378
2379   return false;
2380 }
2381
2382 /* Create a new child access of PARENT, with all properties just like MODEL
2383    except for its offset and with its grp_write false and grp_read true.
2384    Return the new access or NULL if it cannot be created.  Note that this access
2385    is created long after all splicing and sorting, it's not located in any
2386    access vector and is automatically a representative of its group.  */
2387
2388 static struct access *
2389 create_artificial_child_access (struct access *parent, struct access *model,
2390                                 HOST_WIDE_INT new_offset)
2391 {
2392   struct access *access;
2393   struct access **child;
2394   tree expr = parent->base;
2395
2396   gcc_assert (!model->grp_unscalarizable_region);
2397
2398   access = (struct access *) pool_alloc (access_pool);
2399   memset (access, 0, sizeof (struct access));
2400   if (!build_user_friendly_ref_for_offset (&expr, TREE_TYPE (expr), new_offset,
2401                                            model->type))
2402     {
2403       access->grp_no_warning = true;
2404       expr = build_ref_for_model (EXPR_LOCATION (parent->base), parent->base,
2405                                   new_offset, model, NULL, false);
2406     }
2407
2408   access->base = parent->base;
2409   access->expr = expr;
2410   access->offset = new_offset;
2411   access->size = model->size;
2412   access->type = model->type;
2413   access->grp_write = true;
2414   access->grp_read = false;
2415
2416   child = &parent->first_child;
2417   while (*child && (*child)->offset < new_offset)
2418     child = &(*child)->next_sibling;
2419
2420   access->next_sibling = *child;
2421   *child = access;
2422
2423   return access;
2424 }
2425
2426
2427 /* Propagate all subaccesses of RACC across an assignment link to LACC. Return
2428    true if any new subaccess was created.  Additionally, if RACC is a scalar
2429    access but LACC is not, change the type of the latter, if possible.  */
2430
2431 static bool
2432 propagate_subaccesses_across_link (struct access *lacc, struct access *racc)
2433 {
2434   struct access *rchild;
2435   HOST_WIDE_INT norm_delta = lacc->offset - racc->offset;
2436   bool ret = false;
2437
2438   if (is_gimple_reg_type (lacc->type)
2439       || lacc->grp_unscalarizable_region
2440       || racc->grp_unscalarizable_region)
2441     return false;
2442
2443   if (is_gimple_reg_type (racc->type))
2444     {
2445       if (!lacc->first_child && !racc->first_child)
2446         {
2447           tree t = lacc->base;
2448
2449           lacc->type = racc->type;
2450           if (build_user_friendly_ref_for_offset (&t, TREE_TYPE (t),
2451                                                   lacc->offset, racc->type))
2452             lacc->expr = t;
2453           else
2454             {
2455               lacc->expr = build_ref_for_model (EXPR_LOCATION (lacc->base),
2456                                                 lacc->base, lacc->offset,
2457                                                 racc, NULL, false);
2458               lacc->grp_no_warning = true;
2459             }
2460         }
2461       return false;
2462     }
2463
2464   for (rchild = racc->first_child; rchild; rchild = rchild->next_sibling)
2465     {
2466       struct access *new_acc = NULL;
2467       HOST_WIDE_INT norm_offset = rchild->offset + norm_delta;
2468
2469       if (rchild->grp_unscalarizable_region)
2470         continue;
2471
2472       if (child_would_conflict_in_lacc (lacc, norm_offset, rchild->size,
2473                                         &new_acc))
2474         {
2475           if (new_acc)
2476             {
2477               rchild->grp_hint = 1;
2478               new_acc->grp_hint |= new_acc->grp_read;
2479               if (rchild->first_child)
2480                 ret |= propagate_subaccesses_across_link (new_acc, rchild);
2481             }
2482           continue;
2483         }
2484
2485       rchild->grp_hint = 1;
2486       new_acc = create_artificial_child_access (lacc, rchild, norm_offset);
2487       if (new_acc)
2488         {
2489           ret = true;
2490           if (racc->first_child)
2491             propagate_subaccesses_across_link (new_acc, rchild);
2492         }
2493     }
2494
2495   return ret;
2496 }
2497
2498 /* Propagate all subaccesses across assignment links.  */
2499
2500 static void
2501 propagate_all_subaccesses (void)
2502 {
2503   while (work_queue_head)
2504     {
2505       struct access *racc = pop_access_from_work_queue ();
2506       struct assign_link *link;
2507
2508       gcc_assert (racc->first_link);
2509
2510       for (link = racc->first_link; link; link = link->next)
2511         {
2512           struct access *lacc = link->lacc;
2513
2514           if (!bitmap_bit_p (candidate_bitmap, DECL_UID (lacc->base)))
2515             continue;
2516           lacc = lacc->group_representative;
2517           if (propagate_subaccesses_across_link (lacc, racc)
2518               && lacc->first_link)
2519             add_access_to_work_queue (lacc);
2520         }
2521     }
2522 }
2523
2524 /* Go through all accesses collected throughout the (intraprocedural) analysis
2525    stage, exclude overlapping ones, identify representatives and build trees
2526    out of them, making decisions about scalarization on the way.  Return true
2527    iff there are any to-be-scalarized variables after this stage. */
2528
2529 static bool
2530 analyze_all_variable_accesses (void)
2531 {
2532   int res = 0;
2533   bitmap tmp = BITMAP_ALLOC (NULL);
2534   bitmap_iterator bi;
2535   unsigned i;
2536   unsigned max_scalarization_size
2537     = (optimize_function_for_size_p (cfun)
2538         ? PARAM_VALUE (PARAM_SRA_MAX_SCALARIZATION_SIZE_SIZE)
2539         : PARAM_VALUE (PARAM_SRA_MAX_SCALARIZATION_SIZE_SPEED))
2540       * BITS_PER_UNIT;
2541
2542   EXECUTE_IF_SET_IN_BITMAP (candidate_bitmap, 0, i, bi)
2543     if (bitmap_bit_p (should_scalarize_away_bitmap, i)
2544         && !bitmap_bit_p (cannot_scalarize_away_bitmap, i))
2545       {
2546         tree var = candidate (i);
2547
2548         if (TREE_CODE (var) == VAR_DECL
2549             && type_consists_of_records_p (TREE_TYPE (var)))
2550           {
2551             if (tree_to_uhwi (TYPE_SIZE (TREE_TYPE (var)))
2552                 <= max_scalarization_size)
2553               {
2554                 completely_scalarize_var (var);
2555                 if (dump_file && (dump_flags & TDF_DETAILS))
2556                   {
2557                     fprintf (dump_file, "Will attempt to totally scalarize ");
2558                     print_generic_expr (dump_file, var, 0);
2559                     fprintf (dump_file, " (UID: %u): \n", DECL_UID (var));
2560                   }
2561               }
2562             else if (dump_file && (dump_flags & TDF_DETAILS))
2563               {
2564                 fprintf (dump_file, "Too big to totally scalarize: ");
2565                 print_generic_expr (dump_file, var, 0);
2566                 fprintf (dump_file, " (UID: %u)\n", DECL_UID (var));
2567               }
2568           }
2569       }
2570
2571   bitmap_copy (tmp, candidate_bitmap);
2572   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2573     {
2574       tree var = candidate (i);
2575       struct access *access;
2576
2577       access = sort_and_splice_var_accesses (var);
2578       if (!access || !build_access_trees (access))
2579         disqualify_candidate (var,
2580                               "No or inhibitingly overlapping accesses.");
2581     }
2582
2583   propagate_all_subaccesses ();
2584
2585   bitmap_copy (tmp, candidate_bitmap);
2586   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2587     {
2588       tree var = candidate (i);
2589       struct access *access = get_first_repr_for_decl (var);
2590
2591       if (analyze_access_trees (access))
2592         {
2593           res++;
2594           if (dump_file && (dump_flags & TDF_DETAILS))
2595             {
2596               fprintf (dump_file, "\nAccess trees for ");
2597               print_generic_expr (dump_file, var, 0);
2598               fprintf (dump_file, " (UID: %u): \n", DECL_UID (var));
2599               dump_access_tree (dump_file, access);
2600               fprintf (dump_file, "\n");
2601             }
2602         }
2603       else
2604         disqualify_candidate (var, "No scalar replacements to be created.");
2605     }
2606
2607   BITMAP_FREE (tmp);
2608
2609   if (res)
2610     {
2611       statistics_counter_event (cfun, "Scalarized aggregates", res);
2612       return true;
2613     }
2614   else
2615     return false;
2616 }
2617
2618 /* Generate statements copying scalar replacements of accesses within a subtree
2619    into or out of AGG.  ACCESS, all its children, siblings and their children
2620    are to be processed.  AGG is an aggregate type expression (can be a
2621    declaration but does not have to be, it can for example also be a mem_ref or
2622    a series of handled components).  TOP_OFFSET is the offset of the processed
2623    subtree which has to be subtracted from offsets of individual accesses to
2624    get corresponding offsets for AGG.  If CHUNK_SIZE is non-null, copy only
2625    replacements in the interval <start_offset, start_offset + chunk_size>,
2626    otherwise copy all.  GSI is a statement iterator used to place the new
2627    statements.  WRITE should be true when the statements should write from AGG
2628    to the replacement and false if vice versa.  if INSERT_AFTER is true, new
2629    statements will be added after the current statement in GSI, they will be
2630    added before the statement otherwise.  */
2631
2632 static void
2633 generate_subtree_copies (struct access *access, tree agg,
2634                          HOST_WIDE_INT top_offset,
2635                          HOST_WIDE_INT start_offset, HOST_WIDE_INT chunk_size,
2636                          gimple_stmt_iterator *gsi, bool write,
2637                          bool insert_after, location_t loc)
2638 {
2639   do
2640     {
2641       if (chunk_size && access->offset >= start_offset + chunk_size)
2642         return;
2643
2644       if (access->grp_to_be_replaced
2645           && (chunk_size == 0
2646               || access->offset + access->size > start_offset))
2647         {
2648           tree expr, repl = get_access_replacement (access);
2649           gassign *stmt;
2650
2651           expr = build_ref_for_model (loc, agg, access->offset - top_offset,
2652                                       access, gsi, insert_after);
2653
2654           if (write)
2655             {
2656               if (access->grp_partial_lhs)
2657                 expr = force_gimple_operand_gsi (gsi, expr, true, NULL_TREE,
2658                                                  !insert_after,
2659                                                  insert_after ? GSI_NEW_STMT
2660                                                  : GSI_SAME_STMT);
2661               stmt = gimple_build_assign (repl, expr);
2662             }
2663           else
2664             {
2665               TREE_NO_WARNING (repl) = 1;
2666               if (access->grp_partial_lhs)
2667                 repl = force_gimple_operand_gsi (gsi, repl, true, NULL_TREE,
2668                                                  !insert_after,
2669                                                  insert_after ? GSI_NEW_STMT
2670                                                  : GSI_SAME_STMT);
2671               stmt = gimple_build_assign (expr, repl);
2672             }
2673           gimple_set_location (stmt, loc);
2674
2675           if (insert_after)
2676             gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2677           else
2678             gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2679           update_stmt (stmt);
2680           sra_stats.subtree_copies++;
2681         }
2682       else if (write
2683                && access->grp_to_be_debug_replaced
2684                && (chunk_size == 0
2685                    || access->offset + access->size > start_offset))
2686         {
2687           gdebug *ds;
2688           tree drhs = build_debug_ref_for_model (loc, agg,
2689                                                  access->offset - top_offset,
2690                                                  access);
2691           ds = gimple_build_debug_bind (get_access_replacement (access),
2692                                         drhs, gsi_stmt (*gsi));
2693           if (insert_after)
2694             gsi_insert_after (gsi, ds, GSI_NEW_STMT);
2695           else
2696             gsi_insert_before (gsi, ds, GSI_SAME_STMT);
2697         }
2698
2699       if (access->first_child)
2700         generate_subtree_copies (access->first_child, agg, top_offset,
2701                                  start_offset, chunk_size, gsi,
2702                                  write, insert_after, loc);
2703
2704       access = access->next_sibling;
2705     }
2706   while (access);
2707 }
2708
2709 /* Assign zero to all scalar replacements in an access subtree.  ACCESS is the
2710    the root of the subtree to be processed.  GSI is the statement iterator used
2711    for inserting statements which are added after the current statement if
2712    INSERT_AFTER is true or before it otherwise.  */
2713
2714 static void
2715 init_subtree_with_zero (struct access *access, gimple_stmt_iterator *gsi,
2716                         bool insert_after, location_t loc)
2717
2718 {
2719   struct access *child;
2720
2721   if (access->grp_to_be_replaced)
2722     {
2723       gassign *stmt;
2724
2725       stmt = gimple_build_assign (get_access_replacement (access),
2726                                   build_zero_cst (access->type));
2727       if (insert_after)
2728         gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2729       else
2730         gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2731       update_stmt (stmt);
2732       gimple_set_location (stmt, loc);
2733     }
2734   else if (access->grp_to_be_debug_replaced)
2735     {
2736       gdebug *ds
2737         = gimple_build_debug_bind (get_access_replacement (access),
2738                                    build_zero_cst (access->type),
2739                                    gsi_stmt (*gsi));
2740       if (insert_after)
2741         gsi_insert_after (gsi, ds, GSI_NEW_STMT);
2742       else
2743         gsi_insert_before (gsi, ds, GSI_SAME_STMT);
2744     }
2745
2746   for (child = access->first_child; child; child = child->next_sibling)
2747     init_subtree_with_zero (child, gsi, insert_after, loc);
2748 }
2749
2750 /* Clobber all scalar replacements in an access subtree.  ACCESS is the the
2751    root of the subtree to be processed.  GSI is the statement iterator used
2752    for inserting statements which are added after the current statement if
2753    INSERT_AFTER is true or before it otherwise.  */
2754
2755 static void
2756 clobber_subtree (struct access *access, gimple_stmt_iterator *gsi,
2757                 bool insert_after, location_t loc)
2758
2759 {
2760   struct access *child;
2761
2762   if (access->grp_to_be_replaced)
2763     {
2764       tree rep = get_access_replacement (access);
2765       tree clobber = build_constructor (access->type, NULL);
2766       TREE_THIS_VOLATILE (clobber) = 1;
2767       gimple stmt = gimple_build_assign (rep, clobber);
2768
2769       if (insert_after)
2770         gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2771       else
2772         gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2773       update_stmt (stmt);
2774       gimple_set_location (stmt, loc);
2775     }
2776
2777   for (child = access->first_child; child; child = child->next_sibling)
2778     clobber_subtree (child, gsi, insert_after, loc);
2779 }
2780
2781 /* Search for an access representative for the given expression EXPR and
2782    return it or NULL if it cannot be found.  */
2783
2784 static struct access *
2785 get_access_for_expr (tree expr)
2786 {
2787   HOST_WIDE_INT offset, size, max_size;
2788   tree base;
2789
2790   /* FIXME: This should not be necessary but Ada produces V_C_Es with a type of
2791      a different size than the size of its argument and we need the latter
2792      one.  */
2793   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
2794     expr = TREE_OPERAND (expr, 0);
2795
2796   base = get_ref_base_and_extent (expr, &offset, &size, &max_size);
2797   if (max_size == -1 || !DECL_P (base))
2798     return NULL;
2799
2800   if (!bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
2801     return NULL;
2802
2803   return get_var_base_offset_size_access (base, offset, max_size);
2804 }
2805
2806 /* Replace the expression EXPR with a scalar replacement if there is one and
2807    generate other statements to do type conversion or subtree copying if
2808    necessary.  GSI is used to place newly created statements, WRITE is true if
2809    the expression is being written to (it is on a LHS of a statement or output
2810    in an assembly statement).  */
2811
2812 static bool
2813 sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, bool write)
2814 {
2815   location_t loc;
2816   struct access *access;
2817   tree type, bfr, orig_expr;
2818
2819   if (TREE_CODE (*expr) == BIT_FIELD_REF)
2820     {
2821       bfr = *expr;
2822       expr = &TREE_OPERAND (*expr, 0);
2823     }
2824   else
2825     bfr = NULL_TREE;
2826
2827   if (TREE_CODE (*expr) == REALPART_EXPR || TREE_CODE (*expr) == IMAGPART_EXPR)
2828     expr = &TREE_OPERAND (*expr, 0);
2829   access = get_access_for_expr (*expr);
2830   if (!access)
2831     return false;
2832   type = TREE_TYPE (*expr);
2833   orig_expr = *expr;
2834
2835   loc = gimple_location (gsi_stmt (*gsi));
2836   gimple_stmt_iterator alt_gsi = gsi_none ();
2837   if (write && stmt_ends_bb_p (gsi_stmt (*gsi)))
2838     {
2839       alt_gsi = gsi_start_edge (single_non_eh_succ (gsi_bb (*gsi)));
2840       gsi = &alt_gsi;
2841     }
2842
2843   if (access->grp_to_be_replaced)
2844     {
2845       tree repl = get_access_replacement (access);
2846       /* If we replace a non-register typed access simply use the original
2847          access expression to extract the scalar component afterwards.
2848          This happens if scalarizing a function return value or parameter
2849          like in gcc.c-torture/execute/20041124-1.c, 20050316-1.c and
2850          gcc.c-torture/compile/20011217-1.c.
2851
2852          We also want to use this when accessing a complex or vector which can
2853          be accessed as a different type too, potentially creating a need for
2854          type conversion (see PR42196) and when scalarized unions are involved
2855          in assembler statements (see PR42398).  */
2856       if (!useless_type_conversion_p (type, access->type))
2857         {
2858           tree ref;
2859
2860           ref = build_ref_for_model (loc, orig_expr, 0, access, gsi, false);
2861
2862           if (write)
2863             {
2864               gassign *stmt;
2865
2866               if (access->grp_partial_lhs)
2867                 ref = force_gimple_operand_gsi (gsi, ref, true, NULL_TREE,
2868                                                  false, GSI_NEW_STMT);
2869               stmt = gimple_build_assign (repl, ref);
2870               gimple_set_location (stmt, loc);
2871               gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2872             }
2873           else
2874             {
2875               gassign *stmt;
2876
2877               if (access->grp_partial_lhs)
2878                 repl = force_gimple_operand_gsi (gsi, repl, true, NULL_TREE,
2879                                                  true, GSI_SAME_STMT);
2880               stmt = gimple_build_assign (ref, repl);
2881               gimple_set_location (stmt, loc);
2882               gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2883             }
2884         }
2885       else
2886         *expr = repl;
2887       sra_stats.exprs++;
2888     }
2889   else if (write && access->grp_to_be_debug_replaced)
2890     {
2891       gdebug *ds = gimple_build_debug_bind (get_access_replacement (access),
2892                                             NULL_TREE,
2893                                             gsi_stmt (*gsi));
2894       gsi_insert_after (gsi, ds, GSI_NEW_STMT);
2895     }
2896
2897   if (access->first_child)
2898     {
2899       HOST_WIDE_INT start_offset, chunk_size;
2900       if (bfr
2901           && tree_fits_uhwi_p (TREE_OPERAND (bfr, 1))
2902           && tree_fits_uhwi_p (TREE_OPERAND (bfr, 2)))
2903         {
2904           chunk_size = tree_to_uhwi (TREE_OPERAND (bfr, 1));
2905           start_offset = access->offset
2906             + tree_to_uhwi (TREE_OPERAND (bfr, 2));
2907         }
2908       else
2909         start_offset = chunk_size = 0;
2910
2911       generate_subtree_copies (access->first_child, orig_expr, access->offset,
2912                                start_offset, chunk_size, gsi, write, write,
2913                                loc);
2914     }
2915   return true;
2916 }
2917
2918 /* Where scalar replacements of the RHS have been written to when a replacement
2919    of a LHS of an assigments cannot be direclty loaded from a replacement of
2920    the RHS. */
2921 enum unscalarized_data_handling { SRA_UDH_NONE,  /* Nothing done so far. */
2922                                   SRA_UDH_RIGHT, /* Data flushed to the RHS. */
2923                                   SRA_UDH_LEFT }; /* Data flushed to the LHS. */
2924
2925 struct subreplacement_assignment_data
2926 {
2927   /* Offset of the access representing the lhs of the assignment.  */
2928   HOST_WIDE_INT left_offset;
2929
2930   /* LHS and RHS of the original assignment.  */
2931   tree assignment_lhs, assignment_rhs;
2932
2933   /* Access representing the rhs of the whole assignment.  */
2934   struct access *top_racc;
2935
2936   /* Stmt iterator used for statement insertions after the original assignment.
2937    It points to the main GSI used to traverse a BB during function body
2938    modification.  */
2939   gimple_stmt_iterator *new_gsi;
2940
2941   /* Stmt iterator used for statement insertions before the original
2942    assignment.  Keeps on pointing to the original statement.  */
2943   gimple_stmt_iterator old_gsi;
2944
2945   /* Location of the assignment.   */
2946   location_t loc;
2947
2948   /* Keeps the information whether we have needed to refresh replacements of
2949    the LHS and from which side of the assignments this takes place.  */
2950   enum unscalarized_data_handling refreshed;
2951 };
2952
2953 /* Store all replacements in the access tree rooted in TOP_RACC either to their
2954    base aggregate if there are unscalarized data or directly to LHS of the
2955    statement that is pointed to by GSI otherwise.  */
2956
2957 static void
2958 handle_unscalarized_data_in_subtree (struct subreplacement_assignment_data *sad)
2959 {
2960   tree src;
2961   if (sad->top_racc->grp_unscalarized_data)
2962     {
2963       src = sad->assignment_rhs;
2964       sad->refreshed = SRA_UDH_RIGHT;
2965     }
2966   else
2967     {
2968       src = sad->assignment_lhs;
2969       sad->refreshed = SRA_UDH_LEFT;
2970     }
2971   generate_subtree_copies (sad->top_racc->first_child, src,
2972                            sad->top_racc->offset, 0, 0,
2973                            &sad->old_gsi, false, false, sad->loc);
2974 }
2975
2976 /* Try to generate statements to load all sub-replacements in an access subtree
2977    formed by children of LACC from scalar replacements in the SAD->top_racc
2978    subtree.  If that is not possible, refresh the SAD->top_racc base aggregate
2979    and load the accesses from it.  */
2980
2981 static void
2982 load_assign_lhs_subreplacements (struct access *lacc,
2983                                  struct subreplacement_assignment_data *sad)
2984 {
2985   for (lacc = lacc->first_child; lacc; lacc = lacc->next_sibling)
2986     {
2987       HOST_WIDE_INT offset;
2988       offset = lacc->offset - sad->left_offset + sad->top_racc->offset;
2989
2990       if (lacc->grp_to_be_replaced)
2991         {
2992           struct access *racc;
2993           gassign *stmt;
2994           tree rhs;
2995
2996           racc = find_access_in_subtree (sad->top_racc, offset, lacc->size);
2997           if (racc && racc->grp_to_be_replaced)
2998             {
2999               rhs = get_access_replacement (racc);
3000               if (!useless_type_conversion_p (lacc->type, racc->type))
3001                 rhs = fold_build1_loc (sad->loc, VIEW_CONVERT_EXPR,
3002                                        lacc->type, rhs);
3003
3004               if (racc->grp_partial_lhs && lacc->grp_partial_lhs)
3005                 rhs = force_gimple_operand_gsi (&sad->old_gsi, rhs, true,
3006                                                 NULL_TREE, true, GSI_SAME_STMT);
3007             }
3008           else
3009             {
3010               /* No suitable access on the right hand side, need to load from
3011                  the aggregate.  See if we have to update it first... */
3012               if (sad->refreshed == SRA_UDH_NONE)
3013                 handle_unscalarized_data_in_subtree (sad);
3014
3015               if (sad->refreshed == SRA_UDH_LEFT)
3016                 rhs = build_ref_for_model (sad->loc, sad->assignment_lhs,
3017                                            lacc->offset - sad->left_offset,
3018                                            lacc, sad->new_gsi, true);
3019               else
3020                 rhs = build_ref_for_model (sad->loc, sad->assignment_rhs,
3021                                            lacc->offset - sad->left_offset,
3022                                            lacc, sad->new_gsi, true);
3023               if (lacc->grp_partial_lhs)
3024                 rhs = force_gimple_operand_gsi (sad->new_gsi,
3025                                                 rhs, true, NULL_TREE,
3026                                                 false, GSI_NEW_STMT);
3027             }
3028
3029           stmt = gimple_build_assign (get_access_replacement (lacc), rhs);
3030           gsi_insert_after (sad->new_gsi, stmt, GSI_NEW_STMT);
3031           gimple_set_location (stmt, sad->loc);
3032           update_stmt (stmt);
3033           sra_stats.subreplacements++;
3034         }
3035       else
3036         {
3037           if (sad->refreshed == SRA_UDH_NONE
3038               && lacc->grp_read && !lacc->grp_covered)
3039             handle_unscalarized_data_in_subtree (sad);
3040
3041           if (lacc && lacc->grp_to_be_debug_replaced)
3042             {
3043               gdebug *ds;
3044               tree drhs;
3045               struct access *racc = find_access_in_subtree (sad->top_racc,
3046                                                             offset,
3047                                                             lacc->size);
3048
3049               if (racc && racc->grp_to_be_replaced)
3050                 {
3051                   if (racc->grp_write)
3052                     drhs = get_access_replacement (racc);
3053                   else
3054                     drhs = NULL;
3055                 }
3056               else if (sad->refreshed == SRA_UDH_LEFT)
3057                 drhs = build_debug_ref_for_model (sad->loc, lacc->base,
3058                                                   lacc->offset, lacc);
3059               else if (sad->refreshed == SRA_UDH_RIGHT)
3060                 drhs = build_debug_ref_for_model (sad->loc, sad->top_racc->base,
3061                                                   offset, lacc);
3062               else
3063                 drhs = NULL_TREE;
3064               if (drhs
3065                   && !useless_type_conversion_p (lacc->type, TREE_TYPE (drhs)))
3066                 drhs = fold_build1_loc (sad->loc, VIEW_CONVERT_EXPR,
3067                                         lacc->type, drhs);
3068               ds = gimple_build_debug_bind (get_access_replacement (lacc),
3069                                             drhs, gsi_stmt (sad->old_gsi));
3070               gsi_insert_after (sad->new_gsi, ds, GSI_NEW_STMT);
3071             }
3072         }
3073
3074       if (lacc->first_child)
3075         load_assign_lhs_subreplacements (lacc, sad);
3076     }
3077 }
3078
3079 /* Result code for SRA assignment modification.  */
3080 enum assignment_mod_result { SRA_AM_NONE,       /* nothing done for the stmt */
3081                              SRA_AM_MODIFIED,  /* stmt changed but not
3082                                                   removed */
3083                              SRA_AM_REMOVED };  /* stmt eliminated */
3084
3085 /* Modify assignments with a CONSTRUCTOR on their RHS.  STMT contains a pointer
3086    to the assignment and GSI is the statement iterator pointing at it.  Returns
3087    the same values as sra_modify_assign.  */
3088
3089 static enum assignment_mod_result
3090 sra_modify_constructor_assign (gimple stmt, gimple_stmt_iterator *gsi)
3091 {
3092   tree lhs = gimple_assign_lhs (stmt);
3093   struct access *acc = get_access_for_expr (lhs);
3094   if (!acc)
3095     return SRA_AM_NONE;
3096   location_t loc = gimple_location (stmt);
3097
3098   if (gimple_clobber_p (stmt))
3099     {
3100       /* Clobber the replacement variable.  */
3101       clobber_subtree (acc, gsi, !acc->grp_covered, loc);
3102       /* Remove clobbers of fully scalarized variables, they are dead.  */
3103       if (acc->grp_covered)
3104         {
3105           unlink_stmt_vdef (stmt);
3106           gsi_remove (gsi, true);
3107           release_defs (stmt);
3108           return SRA_AM_REMOVED;
3109         }
3110       else
3111         return SRA_AM_MODIFIED;
3112     }
3113
3114   if (vec_safe_length (CONSTRUCTOR_ELTS (gimple_assign_rhs1 (stmt))) > 0)
3115     {
3116       /* I have never seen this code path trigger but if it can happen the
3117          following should handle it gracefully.  */
3118       if (access_has_children_p (acc))
3119         generate_subtree_copies (acc->first_child, lhs, acc->offset, 0, 0, gsi,
3120                                  true, true, loc);
3121       return SRA_AM_MODIFIED;
3122     }
3123
3124   if (acc->grp_covered)
3125     {
3126       init_subtree_with_zero (acc, gsi, false, loc);
3127       unlink_stmt_vdef (stmt);
3128       gsi_remove (gsi, true);
3129       release_defs (stmt);
3130       return SRA_AM_REMOVED;
3131     }
3132   else
3133     {
3134       init_subtree_with_zero (acc, gsi, true, loc);
3135       return SRA_AM_MODIFIED;
3136     }
3137 }
3138
3139 /* Create and return a new suitable default definition SSA_NAME for RACC which
3140    is an access describing an uninitialized part of an aggregate that is being
3141    loaded.  */
3142
3143 static tree
3144 get_repl_default_def_ssa_name (struct access *racc)
3145 {
3146   gcc_checking_assert (!racc->grp_to_be_replaced
3147                        && !racc->grp_to_be_debug_replaced);
3148   if (!racc->replacement_decl)
3149     racc->replacement_decl = create_access_replacement (racc);
3150   return get_or_create_ssa_default_def (cfun, racc->replacement_decl);
3151 }
3152
3153 /* Return true if REF has an VIEW_CONVERT_EXPR or a COMPONENT_REF with a
3154    bit-field field declaration somewhere in it.  */
3155
3156 static inline bool
3157 contains_vce_or_bfcref_p (const_tree ref)
3158 {
3159   while (handled_component_p (ref))
3160     {
3161       if (TREE_CODE (ref) == VIEW_CONVERT_EXPR
3162           || (TREE_CODE (ref) == COMPONENT_REF
3163               && DECL_BIT_FIELD (TREE_OPERAND (ref, 1))))
3164         return true;
3165       ref = TREE_OPERAND (ref, 0);
3166     }
3167
3168   return false;
3169 }
3170
3171 /* Examine both sides of the assignment statement pointed to by STMT, replace
3172    them with a scalare replacement if there is one and generate copying of
3173    replacements if scalarized aggregates have been used in the assignment.  GSI
3174    is used to hold generated statements for type conversions and subtree
3175    copying.  */
3176
3177 static enum assignment_mod_result
3178 sra_modify_assign (gimple stmt, gimple_stmt_iterator *gsi)
3179 {
3180   struct access *lacc, *racc;
3181   tree lhs, rhs;
3182   bool modify_this_stmt = false;
3183   bool force_gimple_rhs = false;
3184   location_t loc;
3185   gimple_stmt_iterator orig_gsi = *gsi;
3186
3187   if (!gimple_assign_single_p (stmt))
3188     return SRA_AM_NONE;
3189   lhs = gimple_assign_lhs (stmt);
3190   rhs = gimple_assign_rhs1 (stmt);
3191
3192   if (TREE_CODE (rhs) == CONSTRUCTOR)
3193     return sra_modify_constructor_assign (stmt, gsi);
3194
3195   if (TREE_CODE (rhs) == REALPART_EXPR || TREE_CODE (lhs) == REALPART_EXPR
3196       || TREE_CODE (rhs) == IMAGPART_EXPR || TREE_CODE (lhs) == IMAGPART_EXPR
3197       || TREE_CODE (rhs) == BIT_FIELD_REF || TREE_CODE (lhs) == BIT_FIELD_REF)
3198     {
3199       modify_this_stmt = sra_modify_expr (gimple_assign_rhs1_ptr (stmt),
3200                                           gsi, false);
3201       modify_this_stmt |= sra_modify_expr (gimple_assign_lhs_ptr (stmt),
3202                                            gsi, true);
3203       return modify_this_stmt ? SRA_AM_MODIFIED : SRA_AM_NONE;
3204     }
3205
3206   lacc = get_access_for_expr (lhs);
3207   racc = get_access_for_expr (rhs);
3208   if (!lacc && !racc)
3209     return SRA_AM_NONE;
3210
3211   loc = gimple_location (stmt);
3212   if (lacc && lacc->grp_to_be_replaced)
3213     {
3214       lhs = get_access_replacement (lacc);
3215       gimple_assign_set_lhs (stmt, lhs);
3216       modify_this_stmt = true;
3217       if (lacc->grp_partial_lhs)
3218         force_gimple_rhs = true;
3219       sra_stats.exprs++;
3220     }
3221
3222   if (racc && racc->grp_to_be_replaced)
3223     {
3224       rhs = get_access_replacement (racc);
3225       modify_this_stmt = true;
3226       if (racc->grp_partial_lhs)
3227         force_gimple_rhs = true;
3228       sra_stats.exprs++;
3229     }
3230   else if (racc
3231            && !racc->grp_unscalarized_data
3232            && TREE_CODE (lhs) == SSA_NAME
3233            && !access_has_replacements_p (racc))
3234     {
3235       rhs = get_repl_default_def_ssa_name (racc);
3236       modify_this_stmt = true;
3237       sra_stats.exprs++;
3238     }
3239
3240   if (modify_this_stmt)
3241     {
3242       if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
3243         {
3244           /* If we can avoid creating a VIEW_CONVERT_EXPR do so.
3245              ???  This should move to fold_stmt which we simply should
3246              call after building a VIEW_CONVERT_EXPR here.  */
3247           if (AGGREGATE_TYPE_P (TREE_TYPE (lhs))
3248               && !contains_bitfld_component_ref_p (lhs))
3249             {
3250               lhs = build_ref_for_model (loc, lhs, 0, racc, gsi, false);
3251               gimple_assign_set_lhs (stmt, lhs);
3252             }
3253           else if (AGGREGATE_TYPE_P (TREE_TYPE (rhs))
3254                    && !contains_vce_or_bfcref_p (rhs))
3255             rhs = build_ref_for_model (loc, rhs, 0, lacc, gsi, false);
3256
3257           if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
3258             {
3259               rhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR, TREE_TYPE (lhs),
3260                                      rhs);
3261               if (is_gimple_reg_type (TREE_TYPE (lhs))
3262                   && TREE_CODE (lhs) != SSA_NAME)
3263                 force_gimple_rhs = true;
3264             }
3265         }
3266     }
3267
3268   if (lacc && lacc->grp_to_be_debug_replaced)
3269     {
3270       tree dlhs = get_access_replacement (lacc);
3271       tree drhs = unshare_expr (rhs);
3272       if (!useless_type_conversion_p (TREE_TYPE (dlhs), TREE_TYPE (drhs)))
3273         {
3274           if (AGGREGATE_TYPE_P (TREE_TYPE (drhs))
3275               && !contains_vce_or_bfcref_p (drhs))
3276             drhs = build_debug_ref_for_model (loc, drhs, 0, lacc);
3277           if (drhs
3278               && !useless_type_conversion_p (TREE_TYPE (dlhs),
3279                                              TREE_TYPE (drhs)))
3280             drhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR,
3281                                     TREE_TYPE (dlhs), drhs);
3282         }
3283       gdebug *ds = gimple_build_debug_bind (dlhs, drhs, stmt);
3284       gsi_insert_before (gsi, ds, GSI_SAME_STMT);
3285     }
3286
3287   /* From this point on, the function deals with assignments in between
3288      aggregates when at least one has scalar reductions of some of its
3289      components.  There are three possible scenarios: Both the LHS and RHS have
3290      to-be-scalarized components, 2) only the RHS has or 3) only the LHS has.
3291
3292      In the first case, we would like to load the LHS components from RHS
3293      components whenever possible.  If that is not possible, we would like to
3294      read it directly from the RHS (after updating it by storing in it its own
3295      components).  If there are some necessary unscalarized data in the LHS,
3296      those will be loaded by the original assignment too.  If neither of these
3297      cases happen, the original statement can be removed.  Most of this is done
3298      by load_assign_lhs_subreplacements.
3299
3300      In the second case, we would like to store all RHS scalarized components
3301      directly into LHS and if they cover the aggregate completely, remove the
3302      statement too.  In the third case, we want the LHS components to be loaded
3303      directly from the RHS (DSE will remove the original statement if it
3304      becomes redundant).
3305
3306      This is a bit complex but manageable when types match and when unions do
3307      not cause confusion in a way that we cannot really load a component of LHS
3308      from the RHS or vice versa (the access representing this level can have
3309      subaccesses that are accessible only through a different union field at a
3310      higher level - different from the one used in the examined expression).
3311      Unions are fun.
3312
3313      Therefore, I specially handle a fourth case, happening when there is a
3314      specific type cast or it is impossible to locate a scalarized subaccess on
3315      the other side of the expression.  If that happens, I simply "refresh" the
3316      RHS by storing in it is scalarized components leave the original statement
3317      there to do the copying and then load the scalar replacements of the LHS.
3318      This is what the first branch does.  */
3319
3320   if (modify_this_stmt
3321       || gimple_has_volatile_ops (stmt)
3322       || contains_vce_or_bfcref_p (rhs)
3323       || contains_vce_or_bfcref_p (lhs)
3324       || stmt_ends_bb_p (stmt))
3325     {
3326       if (access_has_children_p (racc))
3327         generate_subtree_copies (racc->first_child, rhs, racc->offset, 0, 0,
3328                                  gsi, false, false, loc);
3329       if (access_has_children_p (lacc))
3330         {
3331           gimple_stmt_iterator alt_gsi = gsi_none ();
3332           if (stmt_ends_bb_p (stmt))
3333             {
3334               alt_gsi = gsi_start_edge (single_non_eh_succ (gsi_bb (*gsi)));
3335               gsi = &alt_gsi;
3336             }
3337           generate_subtree_copies (lacc->first_child, lhs, lacc->offset, 0, 0,
3338                                    gsi, true, true, loc);
3339         }
3340       sra_stats.separate_lhs_rhs_handling++;
3341
3342       /* This gimplification must be done after generate_subtree_copies,
3343          lest we insert the subtree copies in the middle of the gimplified
3344          sequence.  */
3345       if (force_gimple_rhs)
3346         rhs = force_gimple_operand_gsi (&orig_gsi, rhs, true, NULL_TREE,
3347                                         true, GSI_SAME_STMT);
3348       if (gimple_assign_rhs1 (stmt) != rhs)
3349         {
3350           modify_this_stmt = true;
3351           gimple_assign_set_rhs_from_tree (&orig_gsi, rhs);
3352           gcc_assert (stmt == gsi_stmt (orig_gsi));
3353         }
3354
3355       return modify_this_stmt ? SRA_AM_MODIFIED : SRA_AM_NONE;
3356     }
3357   else
3358     {
3359       if (access_has_children_p (lacc)
3360           && access_has_children_p (racc)
3361           /* When an access represents an unscalarizable region, it usually
3362              represents accesses with variable offset and thus must not be used
3363              to generate new memory accesses.  */
3364           && !lacc->grp_unscalarizable_region
3365           && !racc->grp_unscalarizable_region)
3366         {
3367           struct subreplacement_assignment_data sad;
3368
3369           sad.left_offset = lacc->offset;
3370           sad.assignment_lhs = lhs;
3371           sad.assignment_rhs = rhs;
3372           sad.top_racc = racc;
3373           sad.old_gsi = *gsi;
3374           sad.new_gsi = gsi;
3375           sad.loc = gimple_location (stmt);
3376           sad.refreshed = SRA_UDH_NONE;
3377
3378           if (lacc->grp_read && !lacc->grp_covered)
3379             handle_unscalarized_data_in_subtree (&sad);
3380
3381           load_assign_lhs_subreplacements (lacc, &sad);
3382           if (sad.refreshed != SRA_UDH_RIGHT)
3383             {
3384               gsi_next (gsi);
3385               unlink_stmt_vdef (stmt);
3386               gsi_remove (&sad.old_gsi, true);
3387               release_defs (stmt);
3388               sra_stats.deleted++;
3389               return SRA_AM_REMOVED;
3390             }
3391         }
3392       else
3393         {
3394           if (access_has_children_p (racc)
3395               && !racc->grp_unscalarized_data)
3396             {
3397               if (dump_file)
3398                 {
3399                   fprintf (dump_file, "Removing load: ");
3400                   print_gimple_stmt (dump_file, stmt, 0, 0);
3401                 }
3402               generate_subtree_copies (racc->first_child, lhs,
3403                                        racc->offset, 0, 0, gsi,
3404                                        false, false, loc);
3405               gcc_assert (stmt == gsi_stmt (*gsi));
3406               unlink_stmt_vdef (stmt);
3407               gsi_remove (gsi, true);
3408               release_defs (stmt);
3409               sra_stats.deleted++;
3410               return SRA_AM_REMOVED;
3411             }
3412           /* Restore the aggregate RHS from its components so the
3413              prevailing aggregate copy does the right thing.  */
3414           if (access_has_children_p (racc))
3415             generate_subtree_copies (racc->first_child, rhs, racc->offset, 0, 0,
3416                                      gsi, false, false, loc);
3417           /* Re-load the components of the aggregate copy destination.
3418              But use the RHS aggregate to load from to expose more
3419              optimization opportunities.  */
3420           if (access_has_children_p (lacc))
3421             generate_subtree_copies (lacc->first_child, rhs, lacc->offset,
3422                                      0, 0, gsi, true, true, loc);
3423         }
3424
3425       return SRA_AM_NONE;
3426     }
3427 }
3428
3429 /* Traverse the function body and all modifications as decided in
3430    analyze_all_variable_accesses.  Return true iff the CFG has been
3431    changed.  */
3432
3433 static bool
3434 sra_modify_function_body (void)
3435 {
3436   bool cfg_changed = false;
3437   basic_block bb;
3438
3439   FOR_EACH_BB_FN (bb, cfun)
3440     {
3441       gimple_stmt_iterator gsi = gsi_start_bb (bb);
3442       while (!gsi_end_p (gsi))
3443         {
3444           gimple stmt = gsi_stmt (gsi);
3445           enum assignment_mod_result assign_result;
3446           bool modified = false, deleted = false;
3447           tree *t;
3448           unsigned i;
3449
3450           switch (gimple_code (stmt))
3451             {
3452             case GIMPLE_RETURN:
3453               t = gimple_return_retval_ptr (as_a <greturn *> (stmt));
3454               if (*t != NULL_TREE)
3455                 modified |= sra_modify_expr (t, &gsi, false);
3456               break;
3457
3458             case GIMPLE_ASSIGN:
3459               assign_result = sra_modify_assign (stmt, &gsi);
3460               modified |= assign_result == SRA_AM_MODIFIED;
3461               deleted = assign_result == SRA_AM_REMOVED;
3462               break;
3463
3464             case GIMPLE_CALL:
3465               /* Operands must be processed before the lhs.  */
3466               for (i = 0; i < gimple_call_num_args (stmt); i++)
3467                 {
3468                   t = gimple_call_arg_ptr (stmt, i);
3469                   modified |= sra_modify_expr (t, &gsi, false);
3470                 }
3471
3472               if (gimple_call_lhs (stmt))
3473                 {
3474                   t = gimple_call_lhs_ptr (stmt);
3475                   modified |= sra_modify_expr (t, &gsi, true);
3476                 }
3477               break;
3478
3479             case GIMPLE_ASM:
3480               {
3481                 gasm *asm_stmt = as_a <gasm *> (stmt);
3482                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
3483                   {
3484                     t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
3485                     modified |= sra_modify_expr (t, &gsi, false);
3486                   }
3487                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
3488                   {
3489                     t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
3490                     modified |= sra_modify_expr (t, &gsi, true);
3491                   }
3492               }
3493               break;
3494
3495             default:
3496               break;
3497             }
3498
3499           if (modified)
3500             {
3501               update_stmt (stmt);
3502               if (maybe_clean_eh_stmt (stmt)
3503                   && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
3504                 cfg_changed = true;
3505             }
3506           if (!deleted)
3507             gsi_next (&gsi);
3508         }
3509     }
3510
3511   gsi_commit_edge_inserts ();
3512   return cfg_changed;
3513 }
3514
3515 /* Generate statements initializing scalar replacements of parts of function
3516    parameters.  */
3517
3518 static void
3519 initialize_parameter_reductions (void)
3520 {
3521   gimple_stmt_iterator gsi;
3522   gimple_seq seq = NULL;
3523   tree parm;
3524
3525   gsi = gsi_start (seq);
3526   for (parm = DECL_ARGUMENTS (current_function_decl);
3527        parm;
3528        parm = DECL_CHAIN (parm))
3529     {
3530       vec<access_p> *access_vec;
3531       struct access *access;
3532
3533       if (!bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
3534         continue;
3535       access_vec = get_base_access_vector (parm);
3536       if (!access_vec)
3537         continue;
3538
3539       for (access = (*access_vec)[0];
3540            access;
3541            access = access->next_grp)
3542         generate_subtree_copies (access, parm, 0, 0, 0, &gsi, true, true,
3543                                  EXPR_LOCATION (parm));
3544     }
3545
3546   seq = gsi_seq (gsi);
3547   if (seq)
3548     gsi_insert_seq_on_edge_immediate (single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)), seq);
3549 }
3550
3551 /* The "main" function of intraprocedural SRA passes.  Runs the analysis and if
3552    it reveals there are components of some aggregates to be scalarized, it runs
3553    the required transformations.  */
3554 static unsigned int
3555 perform_intra_sra (void)
3556 {
3557   int ret = 0;
3558   sra_initialize ();
3559
3560   if (!find_var_candidates ())
3561     goto out;
3562
3563   if (!scan_function ())
3564     goto out;
3565
3566   if (!analyze_all_variable_accesses ())
3567     goto out;
3568
3569   if (sra_modify_function_body ())
3570     ret = TODO_update_ssa | TODO_cleanup_cfg;
3571   else
3572     ret = TODO_update_ssa;
3573   initialize_parameter_reductions ();
3574
3575   statistics_counter_event (cfun, "Scalar replacements created",
3576                             sra_stats.replacements);
3577   statistics_counter_event (cfun, "Modified expressions", sra_stats.exprs);
3578   statistics_counter_event (cfun, "Subtree copy stmts",
3579                             sra_stats.subtree_copies);
3580   statistics_counter_event (cfun, "Subreplacement stmts",
3581                             sra_stats.subreplacements);
3582   statistics_counter_event (cfun, "Deleted stmts", sra_stats.deleted);
3583   statistics_counter_event (cfun, "Separate LHS and RHS handling",
3584                             sra_stats.separate_lhs_rhs_handling);
3585
3586  out:
3587   sra_deinitialize ();
3588   return ret;
3589 }
3590
3591 /* Perform early intraprocedural SRA.  */
3592 static unsigned int
3593 early_intra_sra (void)
3594 {
3595   sra_mode = SRA_MODE_EARLY_INTRA;
3596   return perform_intra_sra ();
3597 }
3598
3599 /* Perform "late" intraprocedural SRA.  */
3600 static unsigned int
3601 late_intra_sra (void)
3602 {
3603   sra_mode = SRA_MODE_INTRA;
3604   return perform_intra_sra ();
3605 }
3606
3607
3608 static bool
3609 gate_intra_sra (void)
3610 {
3611   return flag_tree_sra != 0 && dbg_cnt (tree_sra);
3612 }
3613
3614
3615 namespace {
3616
3617 const pass_data pass_data_sra_early =
3618 {
3619   GIMPLE_PASS, /* type */
3620   "esra", /* name */
3621   OPTGROUP_NONE, /* optinfo_flags */
3622   TV_TREE_SRA, /* tv_id */
3623   ( PROP_cfg | PROP_ssa ), /* properties_required */
3624   0, /* properties_provided */
3625   0, /* properties_destroyed */
3626   0, /* todo_flags_start */
3627   TODO_update_ssa, /* todo_flags_finish */
3628 };
3629
3630 class pass_sra_early : public gimple_opt_pass
3631 {
3632 public:
3633   pass_sra_early (gcc::context *ctxt)
3634     : gimple_opt_pass (pass_data_sra_early, ctxt)
3635   {}
3636
3637   /* opt_pass methods: */
3638   virtual bool gate (function *) { return gate_intra_sra (); }
3639   virtual unsigned int execute (function *) { return early_intra_sra (); }
3640
3641 }; // class pass_sra_early
3642
3643 } // anon namespace
3644
3645 gimple_opt_pass *
3646 make_pass_sra_early (gcc::context *ctxt)
3647 {
3648   return new pass_sra_early (ctxt);
3649 }
3650
3651 namespace {
3652
3653 const pass_data pass_data_sra =
3654 {
3655   GIMPLE_PASS, /* type */
3656   "sra", /* name */
3657   OPTGROUP_NONE, /* optinfo_flags */
3658   TV_TREE_SRA, /* tv_id */
3659   ( PROP_cfg | PROP_ssa ), /* properties_required */
3660   0, /* properties_provided */
3661   0, /* properties_destroyed */
3662   TODO_update_address_taken, /* todo_flags_start */
3663   TODO_update_ssa, /* todo_flags_finish */
3664 };
3665
3666 class pass_sra : public gimple_opt_pass
3667 {
3668 public:
3669   pass_sra (gcc::context *ctxt)
3670     : gimple_opt_pass (pass_data_sra, ctxt)
3671   {}
3672
3673   /* opt_pass methods: */
3674   virtual bool gate (function *) { return gate_intra_sra (); }
3675   virtual unsigned int execute (function *) { return late_intra_sra (); }
3676
3677 }; // class pass_sra
3678
3679 } // anon namespace
3680
3681 gimple_opt_pass *
3682 make_pass_sra (gcc::context *ctxt)
3683 {
3684   return new pass_sra (ctxt);
3685 }
3686
3687
3688 /* Return true iff PARM (which must be a parm_decl) is an unused scalar
3689    parameter.  */
3690
3691 static bool
3692 is_unused_scalar_param (tree parm)
3693 {
3694   tree name;
3695   return (is_gimple_reg (parm)
3696           && (!(name = ssa_default_def (cfun, parm))
3697               || has_zero_uses (name)));
3698 }
3699
3700 /* Scan immediate uses of a default definition SSA name of a parameter PARM and
3701    examine whether there are any direct or otherwise infeasible ones.  If so,
3702    return true, otherwise return false.  PARM must be a gimple register with a
3703    non-NULL default definition.  */
3704
3705 static bool
3706 ptr_parm_has_direct_uses (tree parm)
3707 {
3708   imm_use_iterator ui;
3709   gimple stmt;
3710   tree name = ssa_default_def (cfun, parm);
3711   bool ret = false;
3712
3713   FOR_EACH_IMM_USE_STMT (stmt, ui, name)
3714     {
3715       int uses_ok = 0;
3716       use_operand_p use_p;
3717
3718       if (is_gimple_debug (stmt))
3719         continue;
3720
3721       /* Valid uses include dereferences on the lhs and the rhs.  */
3722       if (gimple_has_lhs (stmt))
3723         {
3724           tree lhs = gimple_get_lhs (stmt);
3725           while (handled_component_p (lhs))
3726             lhs = TREE_OPERAND (lhs, 0);
3727           if (TREE_CODE (lhs) == MEM_REF
3728               && TREE_OPERAND (lhs, 0) == name
3729               && integer_zerop (TREE_OPERAND (lhs, 1))
3730               && types_compatible_p (TREE_TYPE (lhs),
3731                                      TREE_TYPE (TREE_TYPE (name)))
3732               && !TREE_THIS_VOLATILE (lhs))
3733             uses_ok++;
3734         }
3735       if (gimple_assign_single_p (stmt))
3736         {
3737           tree rhs = gimple_assign_rhs1 (stmt);
3738           while (handled_component_p (rhs))
3739             rhs = TREE_OPERAND (rhs, 0);
3740           if (TREE_CODE (rhs) == MEM_REF
3741               && TREE_OPERAND (rhs, 0) == name
3742               && integer_zerop (TREE_OPERAND (rhs, 1))
3743               && types_compatible_p (TREE_TYPE (rhs),
3744                                      TREE_TYPE (TREE_TYPE (name)))
3745               && !TREE_THIS_VOLATILE (rhs))
3746             uses_ok++;
3747         }
3748       else if (is_gimple_call (stmt))
3749         {
3750           unsigned i;
3751           for (i = 0; i < gimple_call_num_args (stmt); ++i)
3752             {
3753               tree arg = gimple_call_arg (stmt, i);
3754               while (handled_component_p (arg))
3755                 arg = TREE_OPERAND (arg, 0);
3756               if (TREE_CODE (arg) == MEM_REF
3757                   && TREE_OPERAND (arg, 0) == name
3758                   && integer_zerop (TREE_OPERAND (arg, 1))
3759                   && types_compatible_p (TREE_TYPE (arg),
3760                                          TREE_TYPE (TREE_TYPE (name)))
3761                   && !TREE_THIS_VOLATILE (arg))
3762                 uses_ok++;
3763             }
3764         }
3765
3766       /* If the number of valid uses does not match the number of
3767          uses in this stmt there is an unhandled use.  */
3768       FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
3769         --uses_ok;
3770
3771       if (uses_ok != 0)
3772         ret = true;
3773
3774       if (ret)
3775         BREAK_FROM_IMM_USE_STMT (ui);
3776     }
3777
3778   return ret;
3779 }
3780
3781 /* Identify candidates for reduction for IPA-SRA based on their type and mark
3782    them in candidate_bitmap.  Note that these do not necessarily include
3783    parameter which are unused and thus can be removed.  Return true iff any
3784    such candidate has been found.  */
3785
3786 static bool
3787 find_param_candidates (void)
3788 {
3789   tree parm;
3790   int count = 0;
3791   bool ret = false;
3792   const char *msg;
3793
3794   for (parm = DECL_ARGUMENTS (current_function_decl);
3795        parm;
3796        parm = DECL_CHAIN (parm))
3797     {
3798       tree type = TREE_TYPE (parm);
3799       tree_node **slot;
3800
3801       count++;
3802
3803       if (TREE_THIS_VOLATILE (parm)
3804           || TREE_ADDRESSABLE (parm)
3805           || (!is_gimple_reg_type (type) && is_va_list_type (type)))
3806         continue;
3807
3808       if (is_unused_scalar_param (parm))
3809         {
3810           ret = true;
3811           continue;
3812         }
3813
3814       if (POINTER_TYPE_P (type))
3815         {
3816           type = TREE_TYPE (type);
3817
3818           if (TREE_CODE (type) == FUNCTION_TYPE
3819               || TYPE_VOLATILE (type)
3820               || (TREE_CODE (type) == ARRAY_TYPE
3821                   && TYPE_NONALIASED_COMPONENT (type))
3822               || !is_gimple_reg (parm)
3823               || is_va_list_type (type)
3824               || ptr_parm_has_direct_uses (parm))
3825             continue;
3826         }
3827       else if (!AGGREGATE_TYPE_P (type))
3828         continue;
3829
3830       if (!COMPLETE_TYPE_P (type)
3831           || !tree_fits_uhwi_p (TYPE_SIZE (type))
3832           || tree_to_uhwi (TYPE_SIZE (type)) == 0
3833           || (AGGREGATE_TYPE_P (type)
3834               && type_internals_preclude_sra_p (type, &msg)))
3835         continue;
3836
3837       bitmap_set_bit (candidate_bitmap, DECL_UID (parm));
3838       slot = candidates->find_slot_with_hash (parm, DECL_UID (parm), INSERT);
3839       *slot = parm;
3840
3841       ret = true;
3842       if (dump_file && (dump_flags & TDF_DETAILS))
3843         {
3844           fprintf (dump_file, "Candidate (%d): ", DECL_UID (parm));
3845           print_generic_expr (dump_file, parm, 0);
3846           fprintf (dump_file, "\n");
3847         }
3848     }
3849
3850   func_param_count = count;
3851   return ret;
3852 }
3853
3854 /* Callback of walk_aliased_vdefs, marks the access passed as DATA as
3855    maybe_modified. */
3856
3857 static bool
3858 mark_maybe_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
3859                      void *data)
3860 {
3861   struct access *repr = (struct access *) data;
3862
3863   repr->grp_maybe_modified = 1;
3864   return true;
3865 }
3866
3867 /* Analyze what representatives (in linked lists accessible from
3868    REPRESENTATIVES) can be modified by side effects of statements in the
3869    current function.  */
3870
3871 static void
3872 analyze_modified_params (vec<access_p> representatives)
3873 {
3874   int i;
3875
3876   for (i = 0; i < func_param_count; i++)
3877     {
3878       struct access *repr;
3879
3880       for (repr = representatives[i];
3881            repr;
3882            repr = repr->next_grp)
3883         {
3884           struct access *access;
3885           bitmap visited;
3886           ao_ref ar;
3887
3888           if (no_accesses_p (repr))
3889             continue;
3890           if (!POINTER_TYPE_P (TREE_TYPE (repr->base))
3891               || repr->grp_maybe_modified)
3892             continue;
3893
3894           ao_ref_init (&ar, repr->expr);
3895           visited = BITMAP_ALLOC (NULL);
3896           for (access = repr; access; access = access->next_sibling)
3897             {
3898               /* All accesses are read ones, otherwise grp_maybe_modified would
3899                  be trivially set.  */
3900               walk_aliased_vdefs (&ar, gimple_vuse (access->stmt),
3901                                   mark_maybe_modified, repr, &visited);
3902               if (repr->grp_maybe_modified)
3903                 break;
3904             }
3905           BITMAP_FREE (visited);
3906         }
3907     }
3908 }
3909
3910 /* Propagate distances in bb_dereferences in the opposite direction than the
3911    control flow edges, in each step storing the maximum of the current value
3912    and the minimum of all successors.  These steps are repeated until the table
3913    stabilizes.  Note that BBs which might terminate the functions (according to
3914    final_bbs bitmap) never updated in this way.  */
3915
3916 static void
3917 propagate_dereference_distances (void)
3918 {
3919   basic_block bb;
3920
3921   auto_vec<basic_block> queue (last_basic_block_for_fn (cfun));
3922   queue.quick_push (ENTRY_BLOCK_PTR_FOR_FN (cfun));
3923   FOR_EACH_BB_FN (bb, cfun)
3924     {
3925       queue.quick_push (bb);
3926       bb->aux = bb;
3927     }
3928
3929   while (!queue.is_empty ())
3930     {
3931       edge_iterator ei;
3932       edge e;
3933       bool change = false;
3934       int i;
3935
3936       bb = queue.pop ();
3937       bb->aux = NULL;
3938
3939       if (bitmap_bit_p (final_bbs, bb->index))
3940         continue;
3941
3942       for (i = 0; i < func_param_count; i++)
3943         {
3944           int idx = bb->index * func_param_count + i;
3945           bool first = true;
3946           HOST_WIDE_INT inh = 0;
3947
3948           FOR_EACH_EDGE (e, ei, bb->succs)
3949           {
3950             int succ_idx = e->dest->index * func_param_count + i;
3951
3952             if (e->src == EXIT_BLOCK_PTR_FOR_FN (cfun))
3953               continue;
3954
3955             if (first)
3956               {
3957                 first = false;
3958                 inh = bb_dereferences [succ_idx];
3959               }
3960             else if (bb_dereferences [succ_idx] < inh)
3961               inh = bb_dereferences [succ_idx];
3962           }
3963
3964           if (!first && bb_dereferences[idx] < inh)
3965             {
3966               bb_dereferences[idx] = inh;
3967               change = true;
3968             }
3969         }
3970
3971       if (change && !bitmap_bit_p (final_bbs, bb->index))
3972         FOR_EACH_EDGE (e, ei, bb->preds)
3973           {
3974             if (e->src->aux)
3975               continue;
3976
3977             e->src->aux = e->src;
3978             queue.quick_push (e->src);
3979           }
3980     }
3981 }
3982
3983 /* Dump a dereferences TABLE with heading STR to file F.  */
3984
3985 static void
3986 dump_dereferences_table (FILE *f, const char *str, HOST_WIDE_INT *table)
3987 {
3988   basic_block bb;
3989
3990   fprintf (dump_file, str);
3991   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
3992                   EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
3993     {
3994       fprintf (f, "%4i  %i   ", bb->index, bitmap_bit_p (final_bbs, bb->index));
3995       if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
3996         {
3997           int i;
3998           for (i = 0; i < func_param_count; i++)
3999             {
4000               int idx = bb->index * func_param_count + i;
4001               fprintf (f, " %4" HOST_WIDE_INT_PRINT "d", table[idx]);
4002             }
4003         }
4004       fprintf (f, "\n");
4005     }
4006   fprintf (dump_file, "\n");
4007 }
4008
4009 /* Determine what (parts of) parameters passed by reference that are not
4010    assigned to are not certainly dereferenced in this function and thus the
4011    dereferencing cannot be safely moved to the caller without potentially
4012    introducing a segfault.  Mark such REPRESENTATIVES as
4013    grp_not_necessarilly_dereferenced.
4014
4015    The dereferenced maximum "distance," i.e. the offset + size of the accessed
4016    part is calculated rather than simple booleans are calculated for each
4017    pointer parameter to handle cases when only a fraction of the whole
4018    aggregate is allocated (see testsuite/gcc.c-torture/execute/ipa-sra-2.c for
4019    an example).
4020
4021    The maximum dereference distances for each pointer parameter and BB are
4022    already stored in bb_dereference.  This routine simply propagates these
4023    values upwards by propagate_dereference_distances and then compares the
4024    distances of individual parameters in the ENTRY BB to the equivalent
4025    distances of each representative of a (fraction of a) parameter.  */
4026
4027 static void
4028 analyze_caller_dereference_legality (vec<access_p> representatives)
4029 {
4030   int i;
4031
4032   if (dump_file && (dump_flags & TDF_DETAILS))
4033     dump_dereferences_table (dump_file,
4034                              "Dereference table before propagation:\n",
4035                              bb_dereferences);
4036
4037   propagate_dereference_distances ();
4038
4039   if (dump_file && (dump_flags & TDF_DETAILS))
4040     dump_dereferences_table (dump_file,
4041                              "Dereference table after propagation:\n",
4042                              bb_dereferences);
4043
4044   for (i = 0; i < func_param_count; i++)
4045     {
4046       struct access *repr = representatives[i];
4047       int idx = ENTRY_BLOCK_PTR_FOR_FN (cfun)->index * func_param_count + i;
4048
4049       if (!repr || no_accesses_p (repr))
4050         continue;
4051
4052       do
4053         {
4054           if ((repr->offset + repr->size) > bb_dereferences[idx])
4055             repr->grp_not_necessarilly_dereferenced = 1;
4056           repr = repr->next_grp;
4057         }
4058       while (repr);
4059     }
4060 }
4061
4062 /* Return the representative access for the parameter declaration PARM if it is
4063    a scalar passed by reference which is not written to and the pointer value
4064    is not used directly.  Thus, if it is legal to dereference it in the caller
4065    and we can rule out modifications through aliases, such parameter should be
4066    turned into one passed by value.  Return NULL otherwise.  */
4067
4068 static struct access *
4069 unmodified_by_ref_scalar_representative (tree parm)
4070 {
4071   int i, access_count;
4072   struct access *repr;
4073   vec<access_p> *access_vec;
4074
4075   access_vec = get_base_access_vector (parm);
4076   gcc_assert (access_vec);
4077   repr = (*access_vec)[0];
4078   if (repr->write)
4079     return NULL;
4080   repr->group_representative = repr;
4081
4082   access_count = access_vec->length ();
4083   for (i = 1; i < access_count; i++)
4084     {
4085       struct access *access = (*access_vec)[i];
4086       if (access->write)
4087         return NULL;
4088       access->group_representative = repr;
4089       access->next_sibling = repr->next_sibling;
4090       repr->next_sibling = access;
4091     }
4092
4093   repr->grp_read = 1;
4094   repr->grp_scalar_ptr = 1;
4095   return repr;
4096 }
4097
4098 /* Return true iff this ACCESS precludes IPA-SRA of the parameter it is
4099    associated with.  REQ_ALIGN is the minimum required alignment.  */
4100
4101 static bool
4102 access_precludes_ipa_sra_p (struct access *access, unsigned int req_align)
4103 {
4104   unsigned int exp_align;
4105   /* Avoid issues such as the second simple testcase in PR 42025.  The problem
4106      is incompatible assign in a call statement (and possibly even in asm
4107      statements).  This can be relaxed by using a new temporary but only for
4108      non-TREE_ADDRESSABLE types and is probably not worth the complexity. (In
4109      intraprocedural SRA we deal with this by keeping the old aggregate around,
4110      something we cannot do in IPA-SRA.)  */
4111   if (access->write
4112       && (is_gimple_call (access->stmt)
4113           || gimple_code (access->stmt) == GIMPLE_ASM))
4114     return true;
4115
4116   exp_align = get_object_alignment (access->expr);
4117   if (exp_align < req_align)
4118     return true;
4119
4120   return false;
4121 }
4122
4123
4124 /* Sort collected accesses for parameter PARM, identify representatives for
4125    each accessed region and link them together.  Return NULL if there are
4126    different but overlapping accesses, return the special ptr value meaning
4127    there are no accesses for this parameter if that is the case and return the
4128    first representative otherwise.  Set *RO_GRP if there is a group of accesses
4129    with only read (i.e. no write) accesses.  */
4130
4131 static struct access *
4132 splice_param_accesses (tree parm, bool *ro_grp)
4133 {
4134   int i, j, access_count, group_count;
4135   int agg_size, total_size = 0;
4136   struct access *access, *res, **prev_acc_ptr = &res;
4137   vec<access_p> *access_vec;
4138
4139   access_vec = get_base_access_vector (parm);
4140   if (!access_vec)
4141     return &no_accesses_representant;
4142   access_count = access_vec->length ();
4143
4144   access_vec->qsort (compare_access_positions);
4145
4146   i = 0;
4147   total_size = 0;
4148   group_count = 0;
4149   while (i < access_count)
4150     {
4151       bool modification;
4152       tree a1_alias_type;
4153       access = (*access_vec)[i];
4154       modification = access->write;
4155       if (access_precludes_ipa_sra_p (access, TYPE_ALIGN (access->type)))
4156         return NULL;
4157       a1_alias_type = reference_alias_ptr_type (access->expr);
4158
4159       /* Access is about to become group representative unless we find some
4160          nasty overlap which would preclude us from breaking this parameter
4161          apart. */
4162
4163       j = i + 1;
4164       while (j < access_count)
4165         {
4166           struct access *ac2 = (*access_vec)[j];
4167           if (ac2->offset != access->offset)
4168             {
4169               /* All or nothing law for parameters. */
4170               if (access->offset + access->size > ac2->offset)
4171                 return NULL;
4172               else
4173                 break;
4174             }
4175           else if (ac2->size != access->size)
4176             return NULL;
4177
4178           if (access_precludes_ipa_sra_p (ac2, TYPE_ALIGN (access->type))
4179               || (ac2->type != access->type
4180                   && (TREE_ADDRESSABLE (ac2->type)
4181                       || TREE_ADDRESSABLE (access->type)))
4182               || (reference_alias_ptr_type (ac2->expr) != a1_alias_type))
4183             return NULL;
4184
4185           modification |= ac2->write;
4186           ac2->group_representative = access;
4187           ac2->next_sibling = access->next_sibling;
4188           access->next_sibling = ac2;
4189           j++;
4190         }
4191
4192       group_count++;
4193       access->grp_maybe_modified = modification;
4194       if (!modification)
4195         *ro_grp = true;
4196       *prev_acc_ptr = access;
4197       prev_acc_ptr = &access->next_grp;
4198       total_size += access->size;
4199       i = j;
4200     }
4201
4202   if (POINTER_TYPE_P (TREE_TYPE (parm)))
4203     agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))));
4204   else
4205     agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (parm)));
4206   if (total_size >= agg_size)
4207     return NULL;
4208
4209   gcc_assert (group_count > 0);
4210   return res;
4211 }
4212
4213 /* Decide whether parameters with representative accesses given by REPR should
4214    be reduced into components.  */
4215
4216 static int
4217 decide_one_param_reduction (struct access *repr)
4218 {
4219   int total_size, cur_parm_size, agg_size, new_param_count, parm_size_limit;
4220   bool by_ref;
4221   tree parm;
4222
4223   parm = repr->base;
4224   cur_parm_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (parm)));
4225   gcc_assert (cur_parm_size > 0);
4226
4227   if (POINTER_TYPE_P (TREE_TYPE (parm)))
4228     {
4229       by_ref = true;
4230       agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))));
4231     }
4232   else
4233     {
4234       by_ref = false;
4235       agg_size = cur_parm_size;
4236     }
4237
4238   if (dump_file)
4239     {
4240       struct access *acc;
4241       fprintf (dump_file, "Evaluating PARAM group sizes for ");
4242       print_generic_expr (dump_file, parm, 0);
4243       fprintf (dump_file, " (UID: %u): \n", DECL_UID (parm));
4244       for (acc = repr; acc; acc = acc->next_grp)
4245         dump_access (dump_file, acc, true);
4246     }
4247
4248   total_size = 0;
4249   new_param_count = 0;
4250
4251   for (; repr; repr = repr->next_grp)
4252     {
4253       gcc_assert (parm == repr->base);
4254
4255       /* Taking the address of a non-addressable field is verboten.  */
4256       if (by_ref && repr->non_addressable)
4257         return 0;
4258
4259       /* Do not decompose a non-BLKmode param in a way that would
4260          create BLKmode params.  Especially for by-reference passing
4261          (thus, pointer-type param) this is hardly worthwhile.  */
4262       if (DECL_MODE (parm) != BLKmode
4263           && TYPE_MODE (repr->type) == BLKmode)
4264         return 0;
4265
4266       if (!by_ref || (!repr->grp_maybe_modified
4267                       && !repr->grp_not_necessarilly_dereferenced))
4268         total_size += repr->size;
4269       else
4270         total_size += cur_parm_size;
4271
4272       new_param_count++;
4273     }
4274
4275   gcc_assert (new_param_count > 0);
4276
4277   if (optimize_function_for_size_p (cfun))
4278     parm_size_limit = cur_parm_size;
4279   else
4280     parm_size_limit = (PARAM_VALUE (PARAM_IPA_SRA_PTR_GROWTH_FACTOR)
4281                        * cur_parm_size);
4282
4283   if (total_size < agg_size
4284       && total_size <= parm_size_limit)
4285     {
4286       if (dump_file)
4287         fprintf (dump_file, "    ....will be split into %i components\n",
4288                  new_param_count);
4289       return new_param_count;
4290     }
4291   else
4292     return 0;
4293 }
4294
4295 /* The order of the following enums is important, we need to do extra work for
4296    UNUSED_PARAMS, BY_VAL_ACCESSES and UNMODIF_BY_REF_ACCESSES.  */
4297 enum ipa_splicing_result { NO_GOOD_ACCESS, UNUSED_PARAMS, BY_VAL_ACCESSES,
4298                           MODIF_BY_REF_ACCESSES, UNMODIF_BY_REF_ACCESSES };
4299
4300 /* Identify representatives of all accesses to all candidate parameters for
4301    IPA-SRA.  Return result based on what representatives have been found. */
4302
4303 static enum ipa_splicing_result
4304 splice_all_param_accesses (vec<access_p> &representatives)
4305 {
4306   enum ipa_splicing_result result = NO_GOOD_ACCESS;
4307   tree parm;
4308   struct access *repr;
4309
4310   representatives.create (func_param_count);
4311
4312   for (parm = DECL_ARGUMENTS (current_function_decl);
4313        parm;
4314        parm = DECL_CHAIN (parm))
4315     {
4316       if (is_unused_scalar_param (parm))
4317         {
4318           representatives.quick_push (&no_accesses_representant);
4319           if (result == NO_GOOD_ACCESS)
4320             result = UNUSED_PARAMS;
4321         }
4322       else if (POINTER_TYPE_P (TREE_TYPE (parm))
4323                && is_gimple_reg_type (TREE_TYPE (TREE_TYPE (parm)))
4324                && bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
4325         {
4326           repr = unmodified_by_ref_scalar_representative (parm);
4327           representatives.quick_push (repr);
4328           if (repr)
4329             result = UNMODIF_BY_REF_ACCESSES;
4330         }
4331       else if (bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
4332         {
4333           bool ro_grp = false;
4334           repr = splice_param_accesses (parm, &ro_grp);
4335           representatives.quick_push (repr);
4336
4337           if (repr && !no_accesses_p (repr))
4338             {
4339               if (POINTER_TYPE_P (TREE_TYPE (parm)))
4340                 {
4341                   if (ro_grp)
4342                     result = UNMODIF_BY_REF_ACCESSES;
4343                   else if (result < MODIF_BY_REF_ACCESSES)
4344                     result = MODIF_BY_REF_ACCESSES;
4345                 }
4346               else if (result < BY_VAL_ACCESSES)
4347                 result = BY_VAL_ACCESSES;
4348             }
4349           else if (no_accesses_p (repr) && (result == NO_GOOD_ACCESS))
4350             result = UNUSED_PARAMS;
4351         }
4352       else
4353         representatives.quick_push (NULL);
4354     }
4355
4356   if (result == NO_GOOD_ACCESS)
4357     {
4358       representatives.release ();
4359       return NO_GOOD_ACCESS;
4360     }
4361
4362   return result;
4363 }
4364
4365 /* Return the index of BASE in PARMS.  Abort if it is not found.  */
4366
4367 static inline int
4368 get_param_index (tree base, vec<tree> parms)
4369 {
4370   int i, len;
4371
4372   len = parms.length ();
4373   for (i = 0; i < len; i++)
4374     if (parms[i] == base)
4375       return i;
4376   gcc_unreachable ();
4377 }
4378
4379 /* Convert the decisions made at the representative level into compact
4380    parameter adjustments.  REPRESENTATIVES are pointers to first
4381    representatives of each param accesses, ADJUSTMENTS_COUNT is the expected
4382    final number of adjustments.  */
4383
4384 static ipa_parm_adjustment_vec
4385 turn_representatives_into_adjustments (vec<access_p> representatives,
4386                                        int adjustments_count)
4387 {
4388   vec<tree> parms;
4389   ipa_parm_adjustment_vec adjustments;
4390   tree parm;
4391   int i;
4392
4393   gcc_assert (adjustments_count > 0);
4394   parms = ipa_get_vector_of_formal_parms (current_function_decl);
4395   adjustments.create (adjustments_count);
4396   parm = DECL_ARGUMENTS (current_function_decl);
4397   for (i = 0; i < func_param_count; i++, parm = DECL_CHAIN (parm))
4398     {
4399       struct access *repr = representatives[i];
4400
4401       if (!repr || no_accesses_p (repr))
4402         {
4403           struct ipa_parm_adjustment adj;
4404
4405           memset (&adj, 0, sizeof (adj));
4406           adj.base_index = get_param_index (parm, parms);
4407           adj.base = parm;
4408           if (!repr)
4409             adj.op = IPA_PARM_OP_COPY;
4410           else
4411             adj.op = IPA_PARM_OP_REMOVE;
4412           adj.arg_prefix = "ISRA";
4413           adjustments.quick_push (adj);
4414         }
4415       else
4416         {
4417           struct ipa_parm_adjustment adj;
4418           int index = get_param_index (parm, parms);
4419
4420           for (; repr; repr = repr->next_grp)
4421             {
4422               memset (&adj, 0, sizeof (adj));
4423               gcc_assert (repr->base == parm);
4424               adj.base_index = index;
4425               adj.base = repr->base;
4426               adj.type = repr->type;
4427               adj.alias_ptr_type = reference_alias_ptr_type (repr->expr);
4428               adj.offset = repr->offset;
4429               adj.by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base))
4430                             && (repr->grp_maybe_modified
4431                                 || repr->grp_not_necessarilly_dereferenced));
4432               adj.arg_prefix = "ISRA";
4433               adjustments.quick_push (adj);
4434             }
4435         }
4436     }
4437   parms.release ();
4438   return adjustments;
4439 }
4440
4441 /* Analyze the collected accesses and produce a plan what to do with the
4442    parameters in the form of adjustments, NULL meaning nothing.  */
4443
4444 static ipa_parm_adjustment_vec
4445 analyze_all_param_acesses (void)
4446 {
4447   enum ipa_splicing_result repr_state;
4448   bool proceed = false;
4449   int i, adjustments_count = 0;
4450   vec<access_p> representatives;
4451   ipa_parm_adjustment_vec adjustments;
4452
4453   repr_state = splice_all_param_accesses (representatives);
4454   if (repr_state == NO_GOOD_ACCESS)
4455     return ipa_parm_adjustment_vec ();
4456
4457   /* If there are any parameters passed by reference which are not modified
4458      directly, we need to check whether they can be modified indirectly.  */
4459   if (repr_state == UNMODIF_BY_REF_ACCESSES)
4460     {
4461       analyze_caller_dereference_legality (representatives);
4462       analyze_modified_params (representatives);
4463     }
4464
4465   for (i = 0; i < func_param_count; i++)
4466     {
4467       struct access *repr = representatives[i];
4468
4469       if (repr && !no_accesses_p (repr))
4470         {
4471           if (repr->grp_scalar_ptr)
4472             {
4473               adjustments_count++;
4474               if (repr->grp_not_necessarilly_dereferenced
4475                   || repr->grp_maybe_modified)
4476                 representatives[i] = NULL;
4477               else
4478                 {
4479                   proceed = true;
4480                   sra_stats.scalar_by_ref_to_by_val++;
4481                 }
4482             }
4483           else
4484             {
4485               int new_components = decide_one_param_reduction (repr);
4486
4487               if (new_components == 0)
4488                 {
4489                   representatives[i] = NULL;
4490                   adjustments_count++;
4491                 }
4492               else
4493                 {
4494                   adjustments_count += new_components;
4495                   sra_stats.aggregate_params_reduced++;
4496                   sra_stats.param_reductions_created += new_components;
4497                   proceed = true;
4498                 }
4499             }
4500         }
4501       else
4502         {
4503           if (no_accesses_p (repr))
4504             {
4505               proceed = true;
4506               sra_stats.deleted_unused_parameters++;
4507             }
4508           adjustments_count++;
4509         }
4510     }
4511
4512   if (!proceed && dump_file)
4513     fprintf (dump_file, "NOT proceeding to change params.\n");
4514
4515   if (proceed)
4516     adjustments = turn_representatives_into_adjustments (representatives,
4517                                                          adjustments_count);
4518   else
4519     adjustments = ipa_parm_adjustment_vec ();
4520
4521   representatives.release ();
4522   return adjustments;
4523 }
4524
4525 /* If a parameter replacement identified by ADJ does not yet exist in the form
4526    of declaration, create it and record it, otherwise return the previously
4527    created one.  */
4528
4529 static tree
4530 get_replaced_param_substitute (struct ipa_parm_adjustment *adj)
4531 {
4532   tree repl;
4533   if (!adj->new_ssa_base)
4534     {
4535       char *pretty_name = make_fancy_name (adj->base);
4536
4537       repl = create_tmp_reg (TREE_TYPE (adj->base), "ISR");
4538       DECL_NAME (repl) = get_identifier (pretty_name);
4539       obstack_free (&name_obstack, pretty_name);
4540
4541       adj->new_ssa_base = repl;
4542     }
4543   else
4544     repl = adj->new_ssa_base;
4545   return repl;
4546 }
4547
4548 /* Find the first adjustment for a particular parameter BASE in a vector of
4549    ADJUSTMENTS which is not a copy_param.  Return NULL if there is no such
4550    adjustment. */
4551
4552 static struct ipa_parm_adjustment *
4553 get_adjustment_for_base (ipa_parm_adjustment_vec adjustments, tree base)
4554 {
4555   int i, len;
4556
4557   len = adjustments.length ();
4558   for (i = 0; i < len; i++)
4559     {
4560       struct ipa_parm_adjustment *adj;
4561
4562       adj = &adjustments[i];
4563       if (adj->op != IPA_PARM_OP_COPY && adj->base == base)
4564         return adj;
4565     }
4566
4567   return NULL;
4568 }
4569
4570 /* If the statement STMT defines an SSA_NAME of a parameter which is to be
4571    removed because its value is not used, replace the SSA_NAME with a one
4572    relating to a created VAR_DECL together all of its uses and return true.
4573    ADJUSTMENTS is a pointer to an adjustments vector.  */
4574
4575 static bool
4576 replace_removed_params_ssa_names (gimple stmt,
4577                                   ipa_parm_adjustment_vec adjustments)
4578 {
4579   struct ipa_parm_adjustment *adj;
4580   tree lhs, decl, repl, name;
4581
4582   if (gimple_code (stmt) == GIMPLE_PHI)
4583     lhs = gimple_phi_result (stmt);
4584   else if (is_gimple_assign (stmt))
4585     lhs = gimple_assign_lhs (stmt);
4586   else if (is_gimple_call (stmt))
4587     lhs = gimple_call_lhs (stmt);
4588   else
4589     gcc_unreachable ();
4590
4591   if (TREE_CODE (lhs) != SSA_NAME)
4592     return false;
4593
4594   decl = SSA_NAME_VAR (lhs);
4595   if (decl == NULL_TREE
4596       || TREE_CODE (decl) != PARM_DECL)
4597     return false;
4598
4599   adj = get_adjustment_for_base (adjustments, decl);
4600   if (!adj)
4601     return false;
4602
4603   repl = get_replaced_param_substitute (adj);
4604   name = make_ssa_name (repl, stmt);
4605
4606   if (dump_file)
4607     {
4608       fprintf (dump_file, "replacing an SSA name of a removed param ");
4609       print_generic_expr (dump_file, lhs, 0);
4610       fprintf (dump_file, " with ");
4611       print_generic_expr (dump_file, name, 0);
4612       fprintf (dump_file, "\n");
4613     }
4614
4615   if (is_gimple_assign (stmt))
4616     gimple_assign_set_lhs (stmt, name);
4617   else if (is_gimple_call (stmt))
4618     gimple_call_set_lhs (stmt, name);
4619   else
4620     gimple_phi_set_result (as_a <gphi *> (stmt), name);
4621
4622   replace_uses_by (lhs, name);
4623   release_ssa_name (lhs);
4624   return true;
4625 }
4626
4627 /* If the statement STMT contains any expressions that need to replaced with a
4628    different one as noted by ADJUSTMENTS, do so.  Handle any potential type
4629    incompatibilities (GSI is used to accommodate conversion statements and must
4630    point to the statement).  Return true iff the statement was modified.  */
4631
4632 static bool
4633 sra_ipa_modify_assign (gimple stmt, gimple_stmt_iterator *gsi,
4634                        ipa_parm_adjustment_vec adjustments)
4635 {
4636   tree *lhs_p, *rhs_p;
4637   bool any;
4638
4639   if (!gimple_assign_single_p (stmt))
4640     return false;
4641
4642   rhs_p = gimple_assign_rhs1_ptr (stmt);
4643   lhs_p = gimple_assign_lhs_ptr (stmt);
4644
4645   any = ipa_modify_expr (rhs_p, false, adjustments);
4646   any |= ipa_modify_expr (lhs_p, false, adjustments);
4647   if (any)
4648     {
4649       tree new_rhs = NULL_TREE;
4650
4651       if (!useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
4652         {
4653           if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
4654             {
4655               /* V_C_Es of constructors can cause trouble (PR 42714).  */
4656               if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
4657                 *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
4658               else
4659                 *rhs_p = build_constructor (TREE_TYPE (*lhs_p),
4660                                             NULL);
4661             }
4662           else
4663             new_rhs = fold_build1_loc (gimple_location (stmt),
4664                                        VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
4665                                        *rhs_p);
4666         }
4667       else if (REFERENCE_CLASS_P (*rhs_p)
4668                && is_gimple_reg_type (TREE_TYPE (*lhs_p))
4669                && !is_gimple_reg (*lhs_p))
4670         /* This can happen when an assignment in between two single field
4671            structures is turned into an assignment in between two pointers to
4672            scalars (PR 42237).  */
4673         new_rhs = *rhs_p;
4674
4675       if (new_rhs)
4676         {
4677           tree tmp = force_gimple_operand_gsi (gsi, new_rhs, true, NULL_TREE,
4678                                                true, GSI_SAME_STMT);
4679
4680           gimple_assign_set_rhs_from_tree (gsi, tmp);
4681         }
4682
4683       return true;
4684     }
4685
4686   return false;
4687 }
4688
4689 /* Traverse the function body and all modifications as described in
4690    ADJUSTMENTS.  Return true iff the CFG has been changed.  */
4691
4692 bool
4693 ipa_sra_modify_function_body (ipa_parm_adjustment_vec adjustments)
4694 {
4695   bool cfg_changed = false;
4696   basic_block bb;
4697
4698   FOR_EACH_BB_FN (bb, cfun)
4699     {
4700       gimple_stmt_iterator gsi;
4701
4702       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4703         replace_removed_params_ssa_names (gsi_stmt (gsi), adjustments);
4704
4705       gsi = gsi_start_bb (bb);
4706       while (!gsi_end_p (gsi))
4707         {
4708           gimple stmt = gsi_stmt (gsi);
4709           bool modified = false;
4710           tree *t;
4711           unsigned i;
4712
4713           switch (gimple_code (stmt))
4714             {
4715             case GIMPLE_RETURN:
4716               t = gimple_return_retval_ptr (as_a <greturn *> (stmt));
4717               if (*t != NULL_TREE)
4718                 modified |= ipa_modify_expr (t, true, adjustments);
4719               break;
4720
4721             case GIMPLE_ASSIGN:
4722               modified |= sra_ipa_modify_assign (stmt, &gsi, adjustments);
4723               modified |= replace_removed_params_ssa_names (stmt, adjustments);
4724               break;
4725
4726             case GIMPLE_CALL:
4727               /* Operands must be processed before the lhs.  */
4728               for (i = 0; i < gimple_call_num_args (stmt); i++)
4729                 {
4730                   t = gimple_call_arg_ptr (stmt, i);
4731                   modified |= ipa_modify_expr (t, true, adjustments);
4732                 }
4733
4734               if (gimple_call_lhs (stmt))
4735                 {
4736                   t = gimple_call_lhs_ptr (stmt);
4737                   modified |= ipa_modify_expr (t, false, adjustments);
4738                   modified |= replace_removed_params_ssa_names (stmt,
4739                                                                 adjustments);
4740                 }
4741               break;
4742
4743             case GIMPLE_ASM:
4744               {
4745                 gasm *asm_stmt = as_a <gasm *> (stmt);
4746                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
4747                   {
4748                     t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
4749                     modified |= ipa_modify_expr (t, true, adjustments);
4750                   }
4751                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
4752                   {
4753                     t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
4754                     modified |= ipa_modify_expr (t, false, adjustments);
4755                   }
4756               }
4757               break;
4758
4759             default:
4760               break;
4761             }
4762
4763           if (modified)
4764             {
4765               update_stmt (stmt);
4766               if (maybe_clean_eh_stmt (stmt)
4767                   && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
4768                 cfg_changed = true;
4769             }
4770           gsi_next (&gsi);
4771         }
4772     }
4773
4774   return cfg_changed;
4775 }
4776
4777 /* Call gimple_debug_bind_reset_value on all debug statements describing
4778    gimple register parameters that are being removed or replaced.  */
4779
4780 static void
4781 sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments)
4782 {
4783   int i, len;
4784   gimple_stmt_iterator *gsip = NULL, gsi;
4785
4786   if (MAY_HAVE_DEBUG_STMTS && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
4787     {
4788       gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
4789       gsip = &gsi;
4790     }
4791   len = adjustments.length ();
4792   for (i = 0; i < len; i++)
4793     {
4794       struct ipa_parm_adjustment *adj;
4795       imm_use_iterator ui;
4796       gimple stmt;
4797       gdebug *def_temp;
4798       tree name, vexpr, copy = NULL_TREE;
4799       use_operand_p use_p;
4800
4801       adj = &adjustments[i];
4802       if (adj->op == IPA_PARM_OP_COPY || !is_gimple_reg (adj->base))
4803         continue;
4804       name = ssa_default_def (cfun, adj->base);
4805       vexpr = NULL;
4806       if (name)
4807         FOR_EACH_IMM_USE_STMT (stmt, ui, name)
4808           {
4809             if (gimple_clobber_p (stmt))
4810               {
4811                 gimple_stmt_iterator cgsi = gsi_for_stmt (stmt);
4812                 unlink_stmt_vdef (stmt);
4813                 gsi_remove (&cgsi, true);
4814                 release_defs (stmt);
4815                 continue;
4816               }
4817             /* All other users must have been removed by
4818                ipa_sra_modify_function_body.  */
4819             gcc_assert (is_gimple_debug (stmt));
4820             if (vexpr == NULL && gsip != NULL)
4821               {
4822                 gcc_assert (TREE_CODE (adj->base) == PARM_DECL);
4823                 vexpr = make_node (DEBUG_EXPR_DECL);
4824                 def_temp = gimple_build_debug_source_bind (vexpr, adj->base,
4825                                                            NULL);
4826                 DECL_ARTIFICIAL (vexpr) = 1;
4827                 TREE_TYPE (vexpr) = TREE_TYPE (name);
4828                 DECL_MODE (vexpr) = DECL_MODE (adj->base);
4829                 gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
4830               }
4831             if (vexpr)
4832               {
4833                 FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
4834                   SET_USE (use_p, vexpr);
4835               }
4836             else
4837               gimple_debug_bind_reset_value (stmt);
4838             update_stmt (stmt);
4839           }
4840       /* Create a VAR_DECL for debug info purposes.  */
4841       if (!DECL_IGNORED_P (adj->base))
4842         {
4843           copy = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
4844                              VAR_DECL, DECL_NAME (adj->base),
4845                              TREE_TYPE (adj->base));
4846           if (DECL_PT_UID_SET_P (adj->base))
4847             SET_DECL_PT_UID (copy, DECL_PT_UID (adj->base));
4848           TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (adj->base);
4849           TREE_READONLY (copy) = TREE_READONLY (adj->base);
4850           TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (adj->base);
4851           DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (adj->base);
4852           DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (adj->base);
4853           DECL_IGNORED_P (copy) = DECL_IGNORED_P (adj->base);
4854           DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (adj->base);
4855           DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
4856           SET_DECL_RTL (copy, 0);
4857           TREE_USED (copy) = 1;
4858           DECL_CONTEXT (copy) = current_function_decl;
4859           add_local_decl (cfun, copy);
4860           DECL_CHAIN (copy) =
4861             BLOCK_VARS (DECL_INITIAL (current_function_decl));
4862           BLOCK_VARS (DECL_INITIAL (current_function_decl)) = copy;
4863         }
4864       if (gsip != NULL && copy && target_for_debug_bind (adj->base))
4865         {
4866           gcc_assert (TREE_CODE (adj->base) == PARM_DECL);
4867           if (vexpr)
4868             def_temp = gimple_build_debug_bind (copy, vexpr, NULL);
4869           else
4870             def_temp = gimple_build_debug_source_bind (copy, adj->base,
4871                                                        NULL);
4872           gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
4873         }
4874     }
4875 }
4876
4877 /* Return false if all callers have at least as many actual arguments as there
4878    are formal parameters in the current function and that their types
4879    match.  */
4880
4881 static bool
4882 some_callers_have_mismatched_arguments_p (struct cgraph_node *node,
4883                                           void *data ATTRIBUTE_UNUSED)
4884 {
4885   struct cgraph_edge *cs;
4886   for (cs = node->callers; cs; cs = cs->next_caller)
4887     if (!cs->call_stmt || !callsite_arguments_match_p (cs->call_stmt))
4888       return true;
4889
4890   return false;
4891 }
4892
4893 /* Convert all callers of NODE.  */
4894
4895 static bool
4896 convert_callers_for_node (struct cgraph_node *node,
4897                           void *data)
4898 {
4899   ipa_parm_adjustment_vec *adjustments = (ipa_parm_adjustment_vec *) data;
4900   bitmap recomputed_callers = BITMAP_ALLOC (NULL);
4901   struct cgraph_edge *cs;
4902
4903   for (cs = node->callers; cs; cs = cs->next_caller)
4904     {
4905       push_cfun (DECL_STRUCT_FUNCTION (cs->caller->decl));
4906
4907       if (dump_file)
4908         fprintf (dump_file, "Adjusting call %s/%i -> %s/%i\n",
4909                  xstrdup (cs->caller->name ()),
4910                  cs->caller->order,
4911                  xstrdup (cs->callee->name ()),
4912                  cs->callee->order);
4913
4914       ipa_modify_call_arguments (cs, cs->call_stmt, *adjustments);
4915
4916       pop_cfun ();
4917     }
4918
4919   for (cs = node->callers; cs; cs = cs->next_caller)
4920     if (bitmap_set_bit (recomputed_callers, cs->caller->uid)
4921         && gimple_in_ssa_p (DECL_STRUCT_FUNCTION (cs->caller->decl)))
4922       compute_inline_parameters (cs->caller, true);
4923   BITMAP_FREE (recomputed_callers);
4924
4925   return true;
4926 }
4927
4928 /* Convert all callers of NODE to pass parameters as given in ADJUSTMENTS.  */
4929
4930 static void
4931 convert_callers (struct cgraph_node *node, tree old_decl,
4932                  ipa_parm_adjustment_vec adjustments)
4933 {
4934   basic_block this_block;
4935
4936   node->call_for_symbol_thunks_and_aliases (convert_callers_for_node,
4937                                           &adjustments, false);
4938
4939   if (!encountered_recursive_call)
4940     return;
4941
4942   FOR_EACH_BB_FN (this_block, cfun)
4943     {
4944       gimple_stmt_iterator gsi;
4945
4946       for (gsi = gsi_start_bb (this_block); !gsi_end_p (gsi); gsi_next (&gsi))
4947         {
4948           gcall *stmt;
4949           tree call_fndecl;
4950           stmt = dyn_cast <gcall *> (gsi_stmt (gsi));
4951           if (!stmt)
4952             continue;
4953           call_fndecl = gimple_call_fndecl (stmt);
4954           if (call_fndecl == old_decl)
4955             {
4956               if (dump_file)
4957                 fprintf (dump_file, "Adjusting recursive call");
4958               gimple_call_set_fndecl (stmt, node->decl);
4959               ipa_modify_call_arguments (NULL, stmt, adjustments);
4960             }
4961         }
4962     }
4963
4964   return;
4965 }
4966
4967 /* Perform all the modification required in IPA-SRA for NODE to have parameters
4968    as given in ADJUSTMENTS.  Return true iff the CFG has been changed.  */
4969
4970 static bool
4971 modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
4972 {
4973   struct cgraph_node *new_node;
4974   bool cfg_changed;
4975
4976   cgraph_edge::rebuild_edges ();
4977   free_dominance_info (CDI_DOMINATORS);
4978   pop_cfun ();
4979
4980   /* This must be done after rebuilding cgraph edges for node above.
4981      Otherwise any recursive calls to node that are recorded in
4982      redirect_callers will be corrupted.  */
4983   vec<cgraph_edge *> redirect_callers = node->collect_callers ();
4984   new_node = node->create_version_clone_with_body (redirect_callers, NULL,
4985                                                    NULL, false, NULL, NULL,
4986                                                    "isra");
4987   redirect_callers.release ();
4988
4989   push_cfun (DECL_STRUCT_FUNCTION (new_node->decl));
4990   ipa_modify_formal_parameters (current_function_decl, adjustments);
4991   cfg_changed = ipa_sra_modify_function_body (adjustments);
4992   sra_ipa_reset_debug_stmts (adjustments);
4993   convert_callers (new_node, node->decl, adjustments);
4994   new_node->make_local ();
4995   return cfg_changed;
4996 }
4997
4998 /* If NODE has a caller, return true.  */
4999
5000 static bool
5001 has_caller_p (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
5002 {
5003   if (node->callers)
5004     return true;
5005   return false;
5006 }
5007
5008 /* Return false the function is apparently unsuitable for IPA-SRA based on it's
5009    attributes, return true otherwise.  NODE is the cgraph node of the current
5010    function.  */
5011
5012 static bool
5013 ipa_sra_preliminary_function_checks (struct cgraph_node *node)
5014 {
5015   if (!node->can_be_local_p ())
5016     {
5017       if (dump_file)
5018         fprintf (dump_file, "Function not local to this compilation unit.\n");
5019       return false;
5020     }
5021
5022   if (!node->local.can_change_signature)
5023     {
5024       if (dump_file)
5025         fprintf (dump_file, "Function can not change signature.\n");
5026       return false;
5027     }
5028
5029   if (!tree_versionable_function_p (node->decl))
5030     {
5031       if (dump_file)
5032         fprintf (dump_file, "Function is not versionable.\n");
5033       return false;
5034     }
5035
5036   if (!opt_for_fn (node->decl, optimize)
5037       || !opt_for_fn (node->decl, flag_ipa_sra))
5038     {
5039       if (dump_file)
5040         fprintf (dump_file, "Function not optimized.\n");
5041       return false;
5042     }
5043
5044   if (DECL_VIRTUAL_P (current_function_decl))
5045     {
5046       if (dump_file)
5047         fprintf (dump_file, "Function is a virtual method.\n");
5048       return false;
5049     }
5050
5051   if ((DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
5052       && inline_summaries->get (node)->size >= MAX_INLINE_INSNS_AUTO)
5053     {
5054       if (dump_file)
5055         fprintf (dump_file, "Function too big to be made truly local.\n");
5056       return false;
5057     }
5058
5059   if (!node->call_for_symbol_thunks_and_aliases (has_caller_p, NULL, true))
5060     {
5061       if (dump_file)
5062         fprintf (dump_file,
5063                  "Function has no callers in this compilation unit.\n");
5064       return false;
5065     }
5066
5067   if (cfun->stdarg)
5068     {
5069       if (dump_file)
5070         fprintf (dump_file, "Function uses stdarg. \n");
5071       return false;
5072     }
5073
5074   if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
5075     return false;
5076
5077   if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
5078     {
5079       if (dump_file)
5080         fprintf (dump_file, "Always inline function will be inlined "
5081                  "anyway. \n");
5082       return false;
5083     }
5084
5085   return true;
5086 }
5087
5088 /* Perform early interprocedural SRA.  */
5089
5090 static unsigned int
5091 ipa_early_sra (void)
5092 {
5093   struct cgraph_node *node = cgraph_node::get (current_function_decl);
5094   ipa_parm_adjustment_vec adjustments;
5095   int ret = 0;
5096
5097   if (!ipa_sra_preliminary_function_checks (node))
5098     return 0;
5099
5100   sra_initialize ();
5101   sra_mode = SRA_MODE_EARLY_IPA;
5102
5103   if (!find_param_candidates ())
5104     {
5105       if (dump_file)
5106         fprintf (dump_file, "Function has no IPA-SRA candidates.\n");
5107       goto simple_out;
5108     }
5109
5110   if (node->call_for_symbol_thunks_and_aliases
5111        (some_callers_have_mismatched_arguments_p, NULL, true))
5112     {
5113       if (dump_file)
5114         fprintf (dump_file, "There are callers with insufficient number of "
5115                  "arguments or arguments with type mismatches.\n");
5116       goto simple_out;
5117     }
5118
5119   bb_dereferences = XCNEWVEC (HOST_WIDE_INT,
5120                                  func_param_count
5121                                  * last_basic_block_for_fn (cfun));
5122   final_bbs = BITMAP_ALLOC (NULL);
5123
5124   scan_function ();
5125   if (encountered_apply_args)
5126     {
5127       if (dump_file)
5128         fprintf (dump_file, "Function calls  __builtin_apply_args().\n");
5129       goto out;
5130     }
5131
5132   if (encountered_unchangable_recursive_call)
5133     {
5134       if (dump_file)
5135         fprintf (dump_file, "Function calls itself with insufficient "
5136                  "number of arguments.\n");
5137       goto out;
5138     }
5139
5140   adjustments = analyze_all_param_acesses ();
5141   if (!adjustments.exists ())
5142     goto out;
5143   if (dump_file)
5144     ipa_dump_param_adjustments (dump_file, adjustments, current_function_decl);
5145
5146   if (modify_function (node, adjustments))
5147     ret = TODO_update_ssa | TODO_cleanup_cfg;
5148   else
5149     ret = TODO_update_ssa;
5150   adjustments.release ();
5151
5152   statistics_counter_event (cfun, "Unused parameters deleted",
5153                             sra_stats.deleted_unused_parameters);
5154   statistics_counter_event (cfun, "Scalar parameters converted to by-value",
5155                             sra_stats.scalar_by_ref_to_by_val);
5156   statistics_counter_event (cfun, "Aggregate parameters broken up",
5157                             sra_stats.aggregate_params_reduced);
5158   statistics_counter_event (cfun, "Aggregate parameter components created",
5159                             sra_stats.param_reductions_created);
5160
5161  out:
5162   BITMAP_FREE (final_bbs);
5163   free (bb_dereferences);
5164  simple_out:
5165   sra_deinitialize ();
5166   return ret;
5167 }
5168
5169 namespace {
5170
5171 const pass_data pass_data_early_ipa_sra =
5172 {
5173   GIMPLE_PASS, /* type */
5174   "eipa_sra", /* name */
5175   OPTGROUP_NONE, /* optinfo_flags */
5176   TV_IPA_SRA, /* tv_id */
5177   0, /* properties_required */
5178   0, /* properties_provided */
5179   0, /* properties_destroyed */
5180   0, /* todo_flags_start */
5181   TODO_dump_symtab, /* todo_flags_finish */
5182 };
5183
5184 class pass_early_ipa_sra : public gimple_opt_pass
5185 {
5186 public:
5187   pass_early_ipa_sra (gcc::context *ctxt)
5188     : gimple_opt_pass (pass_data_early_ipa_sra, ctxt)
5189   {}
5190
5191   /* opt_pass methods: */
5192   virtual bool gate (function *) { return flag_ipa_sra && dbg_cnt (eipa_sra); }
5193   virtual unsigned int execute (function *) { return ipa_early_sra (); }
5194
5195 }; // class pass_early_ipa_sra
5196
5197 } // anon namespace
5198
5199 gimple_opt_pass *
5200 make_pass_early_ipa_sra (gcc::context *ctxt)
5201 {
5202   return new pass_early_ipa_sra (ctxt);
5203 }