gcc50: Disconnect from buildworld.
[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 (prev_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     /* Drop any special alignment on the type if it's not on the main
2016        variant.  This avoids issues with weirdo ABIs like AAPCS.  */
2017     repl = create_tmp_var (build_qualified_type
2018                              (TYPE_MAIN_VARIANT (access->type),
2019                               TYPE_QUALS (access->type)), "SR");
2020   if (TREE_CODE (access->type) == COMPLEX_TYPE
2021       || TREE_CODE (access->type) == VECTOR_TYPE)
2022     {
2023       if (!access->grp_partial_lhs)
2024         DECL_GIMPLE_REG_P (repl) = 1;
2025     }
2026   else if (access->grp_partial_lhs
2027            && is_gimple_reg_type (access->type))
2028     TREE_ADDRESSABLE (repl) = 1;
2029
2030   DECL_SOURCE_LOCATION (repl) = DECL_SOURCE_LOCATION (access->base);
2031   DECL_ARTIFICIAL (repl) = 1;
2032   DECL_IGNORED_P (repl) = DECL_IGNORED_P (access->base);
2033
2034   if (DECL_NAME (access->base)
2035       && !DECL_IGNORED_P (access->base)
2036       && !DECL_ARTIFICIAL (access->base))
2037     {
2038       char *pretty_name = make_fancy_name (access->expr);
2039       tree debug_expr = unshare_expr_without_location (access->expr), d;
2040       bool fail = false;
2041
2042       DECL_NAME (repl) = get_identifier (pretty_name);
2043       obstack_free (&name_obstack, pretty_name);
2044
2045       /* Get rid of any SSA_NAMEs embedded in debug_expr,
2046          as DECL_DEBUG_EXPR isn't considered when looking for still
2047          used SSA_NAMEs and thus they could be freed.  All debug info
2048          generation cares is whether something is constant or variable
2049          and that get_ref_base_and_extent works properly on the
2050          expression.  It cannot handle accesses at a non-constant offset
2051          though, so just give up in those cases.  */
2052       for (d = debug_expr;
2053            !fail && (handled_component_p (d) || TREE_CODE (d) == MEM_REF);
2054            d = TREE_OPERAND (d, 0))
2055         switch (TREE_CODE (d))
2056           {
2057           case ARRAY_REF:
2058           case ARRAY_RANGE_REF:
2059             if (TREE_OPERAND (d, 1)
2060                 && TREE_CODE (TREE_OPERAND (d, 1)) != INTEGER_CST)
2061               fail = true;
2062             if (TREE_OPERAND (d, 3)
2063                 && TREE_CODE (TREE_OPERAND (d, 3)) != INTEGER_CST)
2064               fail = true;
2065             /* FALLTHRU */
2066           case COMPONENT_REF:
2067             if (TREE_OPERAND (d, 2)
2068                 && TREE_CODE (TREE_OPERAND (d, 2)) != INTEGER_CST)
2069               fail = true;
2070             break;
2071           case MEM_REF:
2072             if (TREE_CODE (TREE_OPERAND (d, 0)) != ADDR_EXPR)
2073               fail = true;
2074             else
2075               d = TREE_OPERAND (d, 0);
2076             break;
2077           default:
2078             break;
2079           }
2080       if (!fail)
2081         {
2082           SET_DECL_DEBUG_EXPR (repl, debug_expr);
2083           DECL_HAS_DEBUG_EXPR_P (repl) = 1;
2084         }
2085       if (access->grp_no_warning)
2086         TREE_NO_WARNING (repl) = 1;
2087       else
2088         TREE_NO_WARNING (repl) = TREE_NO_WARNING (access->base);
2089     }
2090   else
2091     TREE_NO_WARNING (repl) = 1;
2092
2093   if (dump_file)
2094     {
2095       if (access->grp_to_be_debug_replaced)
2096         {
2097           fprintf (dump_file, "Created a debug-only replacement for ");
2098           print_generic_expr (dump_file, access->base, 0);
2099           fprintf (dump_file, " offset: %u, size: %u\n",
2100                    (unsigned) access->offset, (unsigned) access->size);
2101         }
2102       else
2103         {
2104           fprintf (dump_file, "Created a replacement for ");
2105           print_generic_expr (dump_file, access->base, 0);
2106           fprintf (dump_file, " offset: %u, size: %u: ",
2107                    (unsigned) access->offset, (unsigned) access->size);
2108           print_generic_expr (dump_file, repl, 0);
2109           fprintf (dump_file, "\n");
2110         }
2111     }
2112   sra_stats.replacements++;
2113
2114   return repl;
2115 }
2116
2117 /* Return ACCESS scalar replacement, create it if it does not exist yet.  */
2118
2119 static inline tree
2120 get_access_replacement (struct access *access)
2121 {
2122   gcc_checking_assert (access->replacement_decl);
2123   return access->replacement_decl;
2124 }
2125
2126
2127 /* Build a subtree of accesses rooted in *ACCESS, and move the pointer in the
2128    linked list along the way.  Stop when *ACCESS is NULL or the access pointed
2129    to it is not "within" the root.  Return false iff some accesses partially
2130    overlap.  */
2131
2132 static bool
2133 build_access_subtree (struct access **access)
2134 {
2135   struct access *root = *access, *last_child = NULL;
2136   HOST_WIDE_INT limit = root->offset + root->size;
2137
2138   *access = (*access)->next_grp;
2139   while  (*access && (*access)->offset + (*access)->size <= limit)
2140     {
2141       if (!last_child)
2142         root->first_child = *access;
2143       else
2144         last_child->next_sibling = *access;
2145       last_child = *access;
2146
2147       if (!build_access_subtree (access))
2148         return false;
2149     }
2150
2151   if (*access && (*access)->offset < limit)
2152     return false;
2153
2154   return true;
2155 }
2156
2157 /* Build a tree of access representatives, ACCESS is the pointer to the first
2158    one, others are linked in a list by the next_grp field.  Return false iff
2159    some accesses partially overlap.  */
2160
2161 static bool
2162 build_access_trees (struct access *access)
2163 {
2164   while (access)
2165     {
2166       struct access *root = access;
2167
2168       if (!build_access_subtree (&access))
2169         return false;
2170       root->next_grp = access;
2171     }
2172   return true;
2173 }
2174
2175 /* Return true if expr contains some ARRAY_REFs into a variable bounded
2176    array.  */
2177
2178 static bool
2179 expr_with_var_bounded_array_refs_p (tree expr)
2180 {
2181   while (handled_component_p (expr))
2182     {
2183       if (TREE_CODE (expr) == ARRAY_REF
2184           && !tree_fits_shwi_p (array_ref_low_bound (expr)))
2185         return true;
2186       expr = TREE_OPERAND (expr, 0);
2187     }
2188   return false;
2189 }
2190
2191 /* Analyze the subtree of accesses rooted in ROOT, scheduling replacements when
2192    both seeming beneficial and when ALLOW_REPLACEMENTS allows it.  Also set all
2193    sorts of access flags appropriately along the way, notably always set
2194    grp_read and grp_assign_read according to MARK_READ and grp_write when
2195    MARK_WRITE is true.
2196
2197    Creating a replacement for a scalar access is considered beneficial if its
2198    grp_hint is set (this means we are either attempting total scalarization or
2199    there is more than one direct read access) or according to the following
2200    table:
2201
2202    Access written to through a scalar type (once or more times)
2203    |
2204    |    Written to in an assignment statement
2205    |    |
2206    |    |       Access read as scalar _once_
2207    |    |       |
2208    |    |       |       Read in an assignment statement
2209    |    |       |       |
2210    |    |       |       |       Scalarize       Comment
2211 -----------------------------------------------------------------------------
2212    0    0       0       0                       No access for the scalar
2213    0    0       0       1                       No access for the scalar
2214    0    0       1       0       No              Single read - won't help
2215    0    0       1       1       No              The same case
2216    0    1       0       0                       No access for the scalar
2217    0    1       0       1                       No access for the scalar
2218    0    1       1       0       Yes             s = *g; return s.i;
2219    0    1       1       1       Yes             The same case as above
2220    1    0       0       0       No              Won't help
2221    1    0       0       1       Yes             s.i = 1; *g = s;
2222    1    0       1       0       Yes             s.i = 5; g = s.i;
2223    1    0       1       1       Yes             The same case as above
2224    1    1       0       0       No              Won't help.
2225    1    1       0       1       Yes             s.i = 1; *g = s;
2226    1    1       1       0       Yes             s = *g; return s.i;
2227    1    1       1       1       Yes             Any of the above yeses  */
2228
2229 static bool
2230 analyze_access_subtree (struct access *root, struct access *parent,
2231                         bool allow_replacements)
2232 {
2233   struct access *child;
2234   HOST_WIDE_INT limit = root->offset + root->size;
2235   HOST_WIDE_INT covered_to = root->offset;
2236   bool scalar = is_gimple_reg_type (root->type);
2237   bool hole = false, sth_created = false;
2238
2239   if (parent)
2240     {
2241       if (parent->grp_read)
2242         root->grp_read = 1;
2243       if (parent->grp_assignment_read)
2244         root->grp_assignment_read = 1;
2245       if (parent->grp_write)
2246         root->grp_write = 1;
2247       if (parent->grp_assignment_write)
2248         root->grp_assignment_write = 1;
2249       if (parent->grp_total_scalarization)
2250         root->grp_total_scalarization = 1;
2251     }
2252
2253   if (root->grp_unscalarizable_region)
2254     allow_replacements = false;
2255
2256   if (allow_replacements && expr_with_var_bounded_array_refs_p (root->expr))
2257     allow_replacements = false;
2258
2259   for (child = root->first_child; child; child = child->next_sibling)
2260     {
2261       hole |= covered_to < child->offset;
2262       sth_created |= analyze_access_subtree (child, root,
2263                                              allow_replacements && !scalar);
2264
2265       root->grp_unscalarized_data |= child->grp_unscalarized_data;
2266       root->grp_total_scalarization &= child->grp_total_scalarization;
2267       if (child->grp_covered)
2268         covered_to += child->size;
2269       else
2270         hole = true;
2271     }
2272
2273   if (allow_replacements && scalar && !root->first_child
2274       && (root->grp_hint
2275           || ((root->grp_scalar_read || root->grp_assignment_read)
2276               && (root->grp_scalar_write || root->grp_assignment_write))))
2277     {
2278       /* Always create access replacements that cover the whole access.
2279          For integral types this means the precision has to match.
2280          Avoid assumptions based on the integral type kind, too.  */
2281       if (INTEGRAL_TYPE_P (root->type)
2282           && (TREE_CODE (root->type) != INTEGER_TYPE
2283               || TYPE_PRECISION (root->type) != root->size)
2284           /* But leave bitfield accesses alone.  */
2285           && (TREE_CODE (root->expr) != COMPONENT_REF
2286               || !DECL_BIT_FIELD (TREE_OPERAND (root->expr, 1))))
2287         {
2288           tree rt = root->type;
2289           gcc_assert ((root->offset % BITS_PER_UNIT) == 0
2290                       && (root->size % BITS_PER_UNIT) == 0);
2291           root->type = build_nonstandard_integer_type (root->size,
2292                                                        TYPE_UNSIGNED (rt));
2293           root->expr = build_ref_for_offset (UNKNOWN_LOCATION,
2294                                              root->base, root->offset,
2295                                              root->type, NULL, false);
2296
2297           if (dump_file && (dump_flags & TDF_DETAILS))
2298             {
2299               fprintf (dump_file, "Changing the type of a replacement for ");
2300               print_generic_expr (dump_file, root->base, 0);
2301               fprintf (dump_file, " offset: %u, size: %u ",
2302                        (unsigned) root->offset, (unsigned) root->size);
2303               fprintf (dump_file, " to an integer.\n");
2304             }
2305         }
2306
2307       root->grp_to_be_replaced = 1;
2308       root->replacement_decl = create_access_replacement (root);
2309       sth_created = true;
2310       hole = false;
2311     }
2312   else
2313     {
2314       if (allow_replacements
2315           && scalar && !root->first_child
2316           && (root->grp_scalar_write || root->grp_assignment_write)
2317           && !bitmap_bit_p (cannot_scalarize_away_bitmap,
2318                             DECL_UID (root->base)))
2319         {
2320           gcc_checking_assert (!root->grp_scalar_read
2321                                && !root->grp_assignment_read);
2322           sth_created = true;
2323           if (MAY_HAVE_DEBUG_STMTS)
2324             {
2325               root->grp_to_be_debug_replaced = 1;
2326               root->replacement_decl = create_access_replacement (root);
2327             }
2328         }
2329
2330       if (covered_to < limit)
2331         hole = true;
2332       if (scalar || !allow_replacements)
2333         root->grp_total_scalarization = 0;
2334     }
2335
2336   if (!hole || root->grp_total_scalarization)
2337     root->grp_covered = 1;
2338   else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL)
2339     root->grp_unscalarized_data = 1; /* not covered and written to */
2340   return sth_created;
2341 }
2342
2343 /* Analyze all access trees linked by next_grp by the means of
2344    analyze_access_subtree.  */
2345 static bool
2346 analyze_access_trees (struct access *access)
2347 {
2348   bool ret = false;
2349
2350   while (access)
2351     {
2352       if (analyze_access_subtree (access, NULL, true))
2353         ret = true;
2354       access = access->next_grp;
2355     }
2356
2357   return ret;
2358 }
2359
2360 /* Return true iff a potential new child of LACC at offset OFFSET and with size
2361    SIZE would conflict with an already existing one.  If exactly such a child
2362    already exists in LACC, store a pointer to it in EXACT_MATCH.  */
2363
2364 static bool
2365 child_would_conflict_in_lacc (struct access *lacc, HOST_WIDE_INT norm_offset,
2366                               HOST_WIDE_INT size, struct access **exact_match)
2367 {
2368   struct access *child;
2369
2370   for (child = lacc->first_child; child; child = child->next_sibling)
2371     {
2372       if (child->offset == norm_offset && child->size == size)
2373         {
2374           *exact_match = child;
2375           return true;
2376         }
2377
2378       if (child->offset < norm_offset + size
2379           && child->offset + child->size > norm_offset)
2380         return true;
2381     }
2382
2383   return false;
2384 }
2385
2386 /* Create a new child access of PARENT, with all properties just like MODEL
2387    except for its offset and with its grp_write false and grp_read true.
2388    Return the new access or NULL if it cannot be created.  Note that this access
2389    is created long after all splicing and sorting, it's not located in any
2390    access vector and is automatically a representative of its group.  */
2391
2392 static struct access *
2393 create_artificial_child_access (struct access *parent, struct access *model,
2394                                 HOST_WIDE_INT new_offset)
2395 {
2396   struct access *access;
2397   struct access **child;
2398   tree expr = parent->base;
2399
2400   gcc_assert (!model->grp_unscalarizable_region);
2401
2402   access = (struct access *) pool_alloc (access_pool);
2403   memset (access, 0, sizeof (struct access));
2404   if (!build_user_friendly_ref_for_offset (&expr, TREE_TYPE (expr), new_offset,
2405                                            model->type))
2406     {
2407       access->grp_no_warning = true;
2408       expr = build_ref_for_model (EXPR_LOCATION (parent->base), parent->base,
2409                                   new_offset, model, NULL, false);
2410     }
2411
2412   access->base = parent->base;
2413   access->expr = expr;
2414   access->offset = new_offset;
2415   access->size = model->size;
2416   access->type = model->type;
2417   access->grp_write = true;
2418   access->grp_read = false;
2419
2420   child = &parent->first_child;
2421   while (*child && (*child)->offset < new_offset)
2422     child = &(*child)->next_sibling;
2423
2424   access->next_sibling = *child;
2425   *child = access;
2426
2427   return access;
2428 }
2429
2430
2431 /* Propagate all subaccesses of RACC across an assignment link to LACC. Return
2432    true if any new subaccess was created.  Additionally, if RACC is a scalar
2433    access but LACC is not, change the type of the latter, if possible.  */
2434
2435 static bool
2436 propagate_subaccesses_across_link (struct access *lacc, struct access *racc)
2437 {
2438   struct access *rchild;
2439   HOST_WIDE_INT norm_delta = lacc->offset - racc->offset;
2440   bool ret = false;
2441
2442   if (is_gimple_reg_type (lacc->type)
2443       || lacc->grp_unscalarizable_region
2444       || racc->grp_unscalarizable_region)
2445     return false;
2446
2447   if (is_gimple_reg_type (racc->type))
2448     {
2449       if (!lacc->first_child && !racc->first_child)
2450         {
2451           tree t = lacc->base;
2452
2453           lacc->type = racc->type;
2454           if (build_user_friendly_ref_for_offset (&t, TREE_TYPE (t),
2455                                                   lacc->offset, racc->type))
2456             lacc->expr = t;
2457           else
2458             {
2459               lacc->expr = build_ref_for_model (EXPR_LOCATION (lacc->base),
2460                                                 lacc->base, lacc->offset,
2461                                                 racc, NULL, false);
2462               lacc->grp_no_warning = true;
2463             }
2464         }
2465       return false;
2466     }
2467
2468   for (rchild = racc->first_child; rchild; rchild = rchild->next_sibling)
2469     {
2470       struct access *new_acc = NULL;
2471       HOST_WIDE_INT norm_offset = rchild->offset + norm_delta;
2472
2473       if (rchild->grp_unscalarizable_region)
2474         continue;
2475
2476       if (child_would_conflict_in_lacc (lacc, norm_offset, rchild->size,
2477                                         &new_acc))
2478         {
2479           if (new_acc)
2480             {
2481               rchild->grp_hint = 1;
2482               new_acc->grp_hint |= new_acc->grp_read;
2483               if (rchild->first_child)
2484                 ret |= propagate_subaccesses_across_link (new_acc, rchild);
2485             }
2486           continue;
2487         }
2488
2489       rchild->grp_hint = 1;
2490       new_acc = create_artificial_child_access (lacc, rchild, norm_offset);
2491       if (new_acc)
2492         {
2493           ret = true;
2494           if (racc->first_child)
2495             propagate_subaccesses_across_link (new_acc, rchild);
2496         }
2497     }
2498
2499   return ret;
2500 }
2501
2502 /* Propagate all subaccesses across assignment links.  */
2503
2504 static void
2505 propagate_all_subaccesses (void)
2506 {
2507   while (work_queue_head)
2508     {
2509       struct access *racc = pop_access_from_work_queue ();
2510       struct assign_link *link;
2511
2512       gcc_assert (racc->first_link);
2513
2514       for (link = racc->first_link; link; link = link->next)
2515         {
2516           struct access *lacc = link->lacc;
2517
2518           if (!bitmap_bit_p (candidate_bitmap, DECL_UID (lacc->base)))
2519             continue;
2520           lacc = lacc->group_representative;
2521           if (propagate_subaccesses_across_link (lacc, racc)
2522               && lacc->first_link)
2523             add_access_to_work_queue (lacc);
2524         }
2525     }
2526 }
2527
2528 /* Go through all accesses collected throughout the (intraprocedural) analysis
2529    stage, exclude overlapping ones, identify representatives and build trees
2530    out of them, making decisions about scalarization on the way.  Return true
2531    iff there are any to-be-scalarized variables after this stage. */
2532
2533 static bool
2534 analyze_all_variable_accesses (void)
2535 {
2536   int res = 0;
2537   bitmap tmp = BITMAP_ALLOC (NULL);
2538   bitmap_iterator bi;
2539   unsigned i;
2540   bool optimize_speed_p = !optimize_function_for_size_p (cfun);
2541
2542   enum compiler_param param = optimize_speed_p
2543                         ? PARAM_SRA_MAX_SCALARIZATION_SIZE_SPEED
2544                         : PARAM_SRA_MAX_SCALARIZATION_SIZE_SIZE;
2545
2546   /* If the user didn't set PARAM_SRA_MAX_SCALARIZATION_SIZE_<...>,
2547      fall back to a target default.  */
2548   unsigned HOST_WIDE_INT max_scalarization_size
2549     = global_options_set.x_param_values[param]
2550       ? PARAM_VALUE (param)
2551       : get_move_ratio (optimize_speed_p) * UNITS_PER_WORD;
2552
2553   max_scalarization_size *= BITS_PER_UNIT;
2554
2555   EXECUTE_IF_SET_IN_BITMAP (candidate_bitmap, 0, i, bi)
2556     if (bitmap_bit_p (should_scalarize_away_bitmap, i)
2557         && !bitmap_bit_p (cannot_scalarize_away_bitmap, i))
2558       {
2559         tree var = candidate (i);
2560
2561         if (TREE_CODE (var) == VAR_DECL
2562             && type_consists_of_records_p (TREE_TYPE (var)))
2563           {
2564             if (tree_to_uhwi (TYPE_SIZE (TREE_TYPE (var)))
2565                 <= max_scalarization_size)
2566               {
2567                 completely_scalarize_var (var);
2568                 if (dump_file && (dump_flags & TDF_DETAILS))
2569                   {
2570                     fprintf (dump_file, "Will attempt to totally scalarize ");
2571                     print_generic_expr (dump_file, var, 0);
2572                     fprintf (dump_file, " (UID: %u): \n", DECL_UID (var));
2573                   }
2574               }
2575             else if (dump_file && (dump_flags & TDF_DETAILS))
2576               {
2577                 fprintf (dump_file, "Too big to totally scalarize: ");
2578                 print_generic_expr (dump_file, var, 0);
2579                 fprintf (dump_file, " (UID: %u)\n", DECL_UID (var));
2580               }
2581           }
2582       }
2583
2584   bitmap_copy (tmp, candidate_bitmap);
2585   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2586     {
2587       tree var = candidate (i);
2588       struct access *access;
2589
2590       access = sort_and_splice_var_accesses (var);
2591       if (!access || !build_access_trees (access))
2592         disqualify_candidate (var,
2593                               "No or inhibitingly overlapping accesses.");
2594     }
2595
2596   propagate_all_subaccesses ();
2597
2598   bitmap_copy (tmp, candidate_bitmap);
2599   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2600     {
2601       tree var = candidate (i);
2602       struct access *access = get_first_repr_for_decl (var);
2603
2604       if (analyze_access_trees (access))
2605         {
2606           res++;
2607           if (dump_file && (dump_flags & TDF_DETAILS))
2608             {
2609               fprintf (dump_file, "\nAccess trees for ");
2610               print_generic_expr (dump_file, var, 0);
2611               fprintf (dump_file, " (UID: %u): \n", DECL_UID (var));
2612               dump_access_tree (dump_file, access);
2613               fprintf (dump_file, "\n");
2614             }
2615         }
2616       else
2617         disqualify_candidate (var, "No scalar replacements to be created.");
2618     }
2619
2620   BITMAP_FREE (tmp);
2621
2622   if (res)
2623     {
2624       statistics_counter_event (cfun, "Scalarized aggregates", res);
2625       return true;
2626     }
2627   else
2628     return false;
2629 }
2630
2631 /* Generate statements copying scalar replacements of accesses within a subtree
2632    into or out of AGG.  ACCESS, all its children, siblings and their children
2633    are to be processed.  AGG is an aggregate type expression (can be a
2634    declaration but does not have to be, it can for example also be a mem_ref or
2635    a series of handled components).  TOP_OFFSET is the offset of the processed
2636    subtree which has to be subtracted from offsets of individual accesses to
2637    get corresponding offsets for AGG.  If CHUNK_SIZE is non-null, copy only
2638    replacements in the interval <start_offset, start_offset + chunk_size>,
2639    otherwise copy all.  GSI is a statement iterator used to place the new
2640    statements.  WRITE should be true when the statements should write from AGG
2641    to the replacement and false if vice versa.  if INSERT_AFTER is true, new
2642    statements will be added after the current statement in GSI, they will be
2643    added before the statement otherwise.  */
2644
2645 static void
2646 generate_subtree_copies (struct access *access, tree agg,
2647                          HOST_WIDE_INT top_offset,
2648                          HOST_WIDE_INT start_offset, HOST_WIDE_INT chunk_size,
2649                          gimple_stmt_iterator *gsi, bool write,
2650                          bool insert_after, location_t loc)
2651 {
2652   do
2653     {
2654       if (chunk_size && access->offset >= start_offset + chunk_size)
2655         return;
2656
2657       if (access->grp_to_be_replaced
2658           && (chunk_size == 0
2659               || access->offset + access->size > start_offset))
2660         {
2661           tree expr, repl = get_access_replacement (access);
2662           gassign *stmt;
2663
2664           expr = build_ref_for_model (loc, agg, access->offset - top_offset,
2665                                       access, gsi, insert_after);
2666
2667           if (write)
2668             {
2669               if (access->grp_partial_lhs)
2670                 expr = force_gimple_operand_gsi (gsi, expr, true, NULL_TREE,
2671                                                  !insert_after,
2672                                                  insert_after ? GSI_NEW_STMT
2673                                                  : GSI_SAME_STMT);
2674               stmt = gimple_build_assign (repl, expr);
2675             }
2676           else
2677             {
2678               TREE_NO_WARNING (repl) = 1;
2679               if (access->grp_partial_lhs)
2680                 repl = force_gimple_operand_gsi (gsi, repl, true, NULL_TREE,
2681                                                  !insert_after,
2682                                                  insert_after ? GSI_NEW_STMT
2683                                                  : GSI_SAME_STMT);
2684               stmt = gimple_build_assign (expr, repl);
2685             }
2686           gimple_set_location (stmt, loc);
2687
2688           if (insert_after)
2689             gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2690           else
2691             gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2692           update_stmt (stmt);
2693           sra_stats.subtree_copies++;
2694         }
2695       else if (write
2696                && access->grp_to_be_debug_replaced
2697                && (chunk_size == 0
2698                    || access->offset + access->size > start_offset))
2699         {
2700           gdebug *ds;
2701           tree drhs = build_debug_ref_for_model (loc, agg,
2702                                                  access->offset - top_offset,
2703                                                  access);
2704           ds = gimple_build_debug_bind (get_access_replacement (access),
2705                                         drhs, gsi_stmt (*gsi));
2706           if (insert_after)
2707             gsi_insert_after (gsi, ds, GSI_NEW_STMT);
2708           else
2709             gsi_insert_before (gsi, ds, GSI_SAME_STMT);
2710         }
2711
2712       if (access->first_child)
2713         generate_subtree_copies (access->first_child, agg, top_offset,
2714                                  start_offset, chunk_size, gsi,
2715                                  write, insert_after, loc);
2716
2717       access = access->next_sibling;
2718     }
2719   while (access);
2720 }
2721
2722 /* Assign zero to all scalar replacements in an access subtree.  ACCESS is the
2723    the root of the subtree to be processed.  GSI is the statement iterator used
2724    for inserting statements which are added after the current statement if
2725    INSERT_AFTER is true or before it otherwise.  */
2726
2727 static void
2728 init_subtree_with_zero (struct access *access, gimple_stmt_iterator *gsi,
2729                         bool insert_after, location_t loc)
2730
2731 {
2732   struct access *child;
2733
2734   if (access->grp_to_be_replaced)
2735     {
2736       gassign *stmt;
2737
2738       stmt = gimple_build_assign (get_access_replacement (access),
2739                                   build_zero_cst (access->type));
2740       if (insert_after)
2741         gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2742       else
2743         gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2744       update_stmt (stmt);
2745       gimple_set_location (stmt, loc);
2746     }
2747   else if (access->grp_to_be_debug_replaced)
2748     {
2749       gdebug *ds
2750         = gimple_build_debug_bind (get_access_replacement (access),
2751                                    build_zero_cst (access->type),
2752                                    gsi_stmt (*gsi));
2753       if (insert_after)
2754         gsi_insert_after (gsi, ds, GSI_NEW_STMT);
2755       else
2756         gsi_insert_before (gsi, ds, GSI_SAME_STMT);
2757     }
2758
2759   for (child = access->first_child; child; child = child->next_sibling)
2760     init_subtree_with_zero (child, gsi, insert_after, loc);
2761 }
2762
2763 /* Clobber all scalar replacements in an access subtree.  ACCESS is the the
2764    root of the subtree to be processed.  GSI is the statement iterator used
2765    for inserting statements which are added after the current statement if
2766    INSERT_AFTER is true or before it otherwise.  */
2767
2768 static void
2769 clobber_subtree (struct access *access, gimple_stmt_iterator *gsi,
2770                 bool insert_after, location_t loc)
2771
2772 {
2773   struct access *child;
2774
2775   if (access->grp_to_be_replaced)
2776     {
2777       tree rep = get_access_replacement (access);
2778       tree clobber = build_constructor (access->type, NULL);
2779       TREE_THIS_VOLATILE (clobber) = 1;
2780       gimple stmt = gimple_build_assign (rep, clobber);
2781
2782       if (insert_after)
2783         gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2784       else
2785         gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2786       update_stmt (stmt);
2787       gimple_set_location (stmt, loc);
2788     }
2789
2790   for (child = access->first_child; child; child = child->next_sibling)
2791     clobber_subtree (child, gsi, insert_after, loc);
2792 }
2793
2794 /* Search for an access representative for the given expression EXPR and
2795    return it or NULL if it cannot be found.  */
2796
2797 static struct access *
2798 get_access_for_expr (tree expr)
2799 {
2800   HOST_WIDE_INT offset, size, max_size;
2801   tree base;
2802
2803   /* FIXME: This should not be necessary but Ada produces V_C_Es with a type of
2804      a different size than the size of its argument and we need the latter
2805      one.  */
2806   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
2807     expr = TREE_OPERAND (expr, 0);
2808
2809   base = get_ref_base_and_extent (expr, &offset, &size, &max_size);
2810   if (max_size == -1 || !DECL_P (base))
2811     return NULL;
2812
2813   if (!bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
2814     return NULL;
2815
2816   return get_var_base_offset_size_access (base, offset, max_size);
2817 }
2818
2819 /* Replace the expression EXPR with a scalar replacement if there is one and
2820    generate other statements to do type conversion or subtree copying if
2821    necessary.  GSI is used to place newly created statements, WRITE is true if
2822    the expression is being written to (it is on a LHS of a statement or output
2823    in an assembly statement).  */
2824
2825 static bool
2826 sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, bool write)
2827 {
2828   location_t loc;
2829   struct access *access;
2830   tree type, bfr, orig_expr;
2831
2832   if (TREE_CODE (*expr) == BIT_FIELD_REF)
2833     {
2834       bfr = *expr;
2835       expr = &TREE_OPERAND (*expr, 0);
2836     }
2837   else
2838     bfr = NULL_TREE;
2839
2840   if (TREE_CODE (*expr) == REALPART_EXPR || TREE_CODE (*expr) == IMAGPART_EXPR)
2841     expr = &TREE_OPERAND (*expr, 0);
2842   access = get_access_for_expr (*expr);
2843   if (!access)
2844     return false;
2845   type = TREE_TYPE (*expr);
2846   orig_expr = *expr;
2847
2848   loc = gimple_location (gsi_stmt (*gsi));
2849   gimple_stmt_iterator alt_gsi = gsi_none ();
2850   if (write && stmt_ends_bb_p (gsi_stmt (*gsi)))
2851     {
2852       alt_gsi = gsi_start_edge (single_non_eh_succ (gsi_bb (*gsi)));
2853       gsi = &alt_gsi;
2854     }
2855
2856   if (access->grp_to_be_replaced)
2857     {
2858       tree repl = get_access_replacement (access);
2859       /* If we replace a non-register typed access simply use the original
2860          access expression to extract the scalar component afterwards.
2861          This happens if scalarizing a function return value or parameter
2862          like in gcc.c-torture/execute/20041124-1.c, 20050316-1.c and
2863          gcc.c-torture/compile/20011217-1.c.
2864
2865          We also want to use this when accessing a complex or vector which can
2866          be accessed as a different type too, potentially creating a need for
2867          type conversion (see PR42196) and when scalarized unions are involved
2868          in assembler statements (see PR42398).  */
2869       if (!useless_type_conversion_p (type, access->type))
2870         {
2871           tree ref;
2872
2873           ref = build_ref_for_model (loc, orig_expr, 0, access, gsi, false);
2874
2875           if (write)
2876             {
2877               gassign *stmt;
2878
2879               if (access->grp_partial_lhs)
2880                 ref = force_gimple_operand_gsi (gsi, ref, true, NULL_TREE,
2881                                                  false, GSI_NEW_STMT);
2882               stmt = gimple_build_assign (repl, ref);
2883               gimple_set_location (stmt, loc);
2884               gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2885             }
2886           else
2887             {
2888               gassign *stmt;
2889
2890               if (access->grp_partial_lhs)
2891                 repl = force_gimple_operand_gsi (gsi, repl, true, NULL_TREE,
2892                                                  true, GSI_SAME_STMT);
2893               stmt = gimple_build_assign (ref, repl);
2894               gimple_set_location (stmt, loc);
2895               gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2896             }
2897         }
2898       else
2899         *expr = repl;
2900       sra_stats.exprs++;
2901     }
2902   else if (write && access->grp_to_be_debug_replaced)
2903     {
2904       gdebug *ds = gimple_build_debug_bind (get_access_replacement (access),
2905                                             NULL_TREE,
2906                                             gsi_stmt (*gsi));
2907       gsi_insert_after (gsi, ds, GSI_NEW_STMT);
2908     }
2909
2910   if (access->first_child)
2911     {
2912       HOST_WIDE_INT start_offset, chunk_size;
2913       if (bfr
2914           && tree_fits_uhwi_p (TREE_OPERAND (bfr, 1))
2915           && tree_fits_uhwi_p (TREE_OPERAND (bfr, 2)))
2916         {
2917           chunk_size = tree_to_uhwi (TREE_OPERAND (bfr, 1));
2918           start_offset = access->offset
2919             + tree_to_uhwi (TREE_OPERAND (bfr, 2));
2920         }
2921       else
2922         start_offset = chunk_size = 0;
2923
2924       generate_subtree_copies (access->first_child, orig_expr, access->offset,
2925                                start_offset, chunk_size, gsi, write, write,
2926                                loc);
2927     }
2928   return true;
2929 }
2930
2931 /* Where scalar replacements of the RHS have been written to when a replacement
2932    of a LHS of an assigments cannot be direclty loaded from a replacement of
2933    the RHS. */
2934 enum unscalarized_data_handling { SRA_UDH_NONE,  /* Nothing done so far. */
2935                                   SRA_UDH_RIGHT, /* Data flushed to the RHS. */
2936                                   SRA_UDH_LEFT }; /* Data flushed to the LHS. */
2937
2938 struct subreplacement_assignment_data
2939 {
2940   /* Offset of the access representing the lhs of the assignment.  */
2941   HOST_WIDE_INT left_offset;
2942
2943   /* LHS and RHS of the original assignment.  */
2944   tree assignment_lhs, assignment_rhs;
2945
2946   /* Access representing the rhs of the whole assignment.  */
2947   struct access *top_racc;
2948
2949   /* Stmt iterator used for statement insertions after the original assignment.
2950    It points to the main GSI used to traverse a BB during function body
2951    modification.  */
2952   gimple_stmt_iterator *new_gsi;
2953
2954   /* Stmt iterator used for statement insertions before the original
2955    assignment.  Keeps on pointing to the original statement.  */
2956   gimple_stmt_iterator old_gsi;
2957
2958   /* Location of the assignment.   */
2959   location_t loc;
2960
2961   /* Keeps the information whether we have needed to refresh replacements of
2962    the LHS and from which side of the assignments this takes place.  */
2963   enum unscalarized_data_handling refreshed;
2964 };
2965
2966 /* Store all replacements in the access tree rooted in TOP_RACC either to their
2967    base aggregate if there are unscalarized data or directly to LHS of the
2968    statement that is pointed to by GSI otherwise.  */
2969
2970 static void
2971 handle_unscalarized_data_in_subtree (struct subreplacement_assignment_data *sad)
2972 {
2973   tree src;
2974   if (sad->top_racc->grp_unscalarized_data)
2975     {
2976       src = sad->assignment_rhs;
2977       sad->refreshed = SRA_UDH_RIGHT;
2978     }
2979   else
2980     {
2981       src = sad->assignment_lhs;
2982       sad->refreshed = SRA_UDH_LEFT;
2983     }
2984   generate_subtree_copies (sad->top_racc->first_child, src,
2985                            sad->top_racc->offset, 0, 0,
2986                            &sad->old_gsi, false, false, sad->loc);
2987 }
2988
2989 /* Try to generate statements to load all sub-replacements in an access subtree
2990    formed by children of LACC from scalar replacements in the SAD->top_racc
2991    subtree.  If that is not possible, refresh the SAD->top_racc base aggregate
2992    and load the accesses from it.  */
2993
2994 static void
2995 load_assign_lhs_subreplacements (struct access *lacc,
2996                                  struct subreplacement_assignment_data *sad)
2997 {
2998   for (lacc = lacc->first_child; lacc; lacc = lacc->next_sibling)
2999     {
3000       HOST_WIDE_INT offset;
3001       offset = lacc->offset - sad->left_offset + sad->top_racc->offset;
3002
3003       if (lacc->grp_to_be_replaced)
3004         {
3005           struct access *racc;
3006           gassign *stmt;
3007           tree rhs;
3008
3009           racc = find_access_in_subtree (sad->top_racc, offset, lacc->size);
3010           if (racc && racc->grp_to_be_replaced)
3011             {
3012               rhs = get_access_replacement (racc);
3013               if (!useless_type_conversion_p (lacc->type, racc->type))
3014                 rhs = fold_build1_loc (sad->loc, VIEW_CONVERT_EXPR,
3015                                        lacc->type, rhs);
3016
3017               if (racc->grp_partial_lhs && lacc->grp_partial_lhs)
3018                 rhs = force_gimple_operand_gsi (&sad->old_gsi, rhs, true,
3019                                                 NULL_TREE, true, GSI_SAME_STMT);
3020             }
3021           else
3022             {
3023               /* No suitable access on the right hand side, need to load from
3024                  the aggregate.  See if we have to update it first... */
3025               if (sad->refreshed == SRA_UDH_NONE)
3026                 handle_unscalarized_data_in_subtree (sad);
3027
3028               if (sad->refreshed == SRA_UDH_LEFT)
3029                 rhs = build_ref_for_model (sad->loc, sad->assignment_lhs,
3030                                            lacc->offset - sad->left_offset,
3031                                            lacc, sad->new_gsi, true);
3032               else
3033                 rhs = build_ref_for_model (sad->loc, sad->assignment_rhs,
3034                                            lacc->offset - sad->left_offset,
3035                                            lacc, sad->new_gsi, true);
3036               if (lacc->grp_partial_lhs)
3037                 rhs = force_gimple_operand_gsi (sad->new_gsi,
3038                                                 rhs, true, NULL_TREE,
3039                                                 false, GSI_NEW_STMT);
3040             }
3041
3042           stmt = gimple_build_assign (get_access_replacement (lacc), rhs);
3043           gsi_insert_after (sad->new_gsi, stmt, GSI_NEW_STMT);
3044           gimple_set_location (stmt, sad->loc);
3045           update_stmt (stmt);
3046           sra_stats.subreplacements++;
3047         }
3048       else
3049         {
3050           if (sad->refreshed == SRA_UDH_NONE
3051               && lacc->grp_read && !lacc->grp_covered)
3052             handle_unscalarized_data_in_subtree (sad);
3053
3054           if (lacc && lacc->grp_to_be_debug_replaced)
3055             {
3056               gdebug *ds;
3057               tree drhs;
3058               struct access *racc = find_access_in_subtree (sad->top_racc,
3059                                                             offset,
3060                                                             lacc->size);
3061
3062               if (racc && racc->grp_to_be_replaced)
3063                 {
3064                   if (racc->grp_write)
3065                     drhs = get_access_replacement (racc);
3066                   else
3067                     drhs = NULL;
3068                 }
3069               else if (sad->refreshed == SRA_UDH_LEFT)
3070                 drhs = build_debug_ref_for_model (sad->loc, lacc->base,
3071                                                   lacc->offset, lacc);
3072               else if (sad->refreshed == SRA_UDH_RIGHT)
3073                 drhs = build_debug_ref_for_model (sad->loc, sad->top_racc->base,
3074                                                   offset, lacc);
3075               else
3076                 drhs = NULL_TREE;
3077               if (drhs
3078                   && !useless_type_conversion_p (lacc->type, TREE_TYPE (drhs)))
3079                 drhs = fold_build1_loc (sad->loc, VIEW_CONVERT_EXPR,
3080                                         lacc->type, drhs);
3081               ds = gimple_build_debug_bind (get_access_replacement (lacc),
3082                                             drhs, gsi_stmt (sad->old_gsi));
3083               gsi_insert_after (sad->new_gsi, ds, GSI_NEW_STMT);
3084             }
3085         }
3086
3087       if (lacc->first_child)
3088         load_assign_lhs_subreplacements (lacc, sad);
3089     }
3090 }
3091
3092 /* Result code for SRA assignment modification.  */
3093 enum assignment_mod_result { SRA_AM_NONE,       /* nothing done for the stmt */
3094                              SRA_AM_MODIFIED,  /* stmt changed but not
3095                                                   removed */
3096                              SRA_AM_REMOVED };  /* stmt eliminated */
3097
3098 /* Modify assignments with a CONSTRUCTOR on their RHS.  STMT contains a pointer
3099    to the assignment and GSI is the statement iterator pointing at it.  Returns
3100    the same values as sra_modify_assign.  */
3101
3102 static enum assignment_mod_result
3103 sra_modify_constructor_assign (gimple stmt, gimple_stmt_iterator *gsi)
3104 {
3105   tree lhs = gimple_assign_lhs (stmt);
3106   struct access *acc = get_access_for_expr (lhs);
3107   if (!acc)
3108     return SRA_AM_NONE;
3109   location_t loc = gimple_location (stmt);
3110
3111   if (gimple_clobber_p (stmt))
3112     {
3113       /* Clobber the replacement variable.  */
3114       clobber_subtree (acc, gsi, !acc->grp_covered, loc);
3115       /* Remove clobbers of fully scalarized variables, they are dead.  */
3116       if (acc->grp_covered)
3117         {
3118           unlink_stmt_vdef (stmt);
3119           gsi_remove (gsi, true);
3120           release_defs (stmt);
3121           return SRA_AM_REMOVED;
3122         }
3123       else
3124         return SRA_AM_MODIFIED;
3125     }
3126
3127   if (vec_safe_length (CONSTRUCTOR_ELTS (gimple_assign_rhs1 (stmt))) > 0)
3128     {
3129       /* I have never seen this code path trigger but if it can happen the
3130          following should handle it gracefully.  */
3131       if (access_has_children_p (acc))
3132         generate_subtree_copies (acc->first_child, lhs, acc->offset, 0, 0, gsi,
3133                                  true, true, loc);
3134       return SRA_AM_MODIFIED;
3135     }
3136
3137   if (acc->grp_covered)
3138     {
3139       init_subtree_with_zero (acc, gsi, false, loc);
3140       unlink_stmt_vdef (stmt);
3141       gsi_remove (gsi, true);
3142       release_defs (stmt);
3143       return SRA_AM_REMOVED;
3144     }
3145   else
3146     {
3147       init_subtree_with_zero (acc, gsi, true, loc);
3148       return SRA_AM_MODIFIED;
3149     }
3150 }
3151
3152 /* Create and return a new suitable default definition SSA_NAME for RACC which
3153    is an access describing an uninitialized part of an aggregate that is being
3154    loaded.  */
3155
3156 static tree
3157 get_repl_default_def_ssa_name (struct access *racc)
3158 {
3159   gcc_checking_assert (!racc->grp_to_be_replaced
3160                        && !racc->grp_to_be_debug_replaced);
3161   if (!racc->replacement_decl)
3162     racc->replacement_decl = create_access_replacement (racc);
3163   return get_or_create_ssa_default_def (cfun, racc->replacement_decl);
3164 }
3165
3166 /* Return true if REF has an VIEW_CONVERT_EXPR or a COMPONENT_REF with a
3167    bit-field field declaration somewhere in it.  */
3168
3169 static inline bool
3170 contains_vce_or_bfcref_p (const_tree ref)
3171 {
3172   while (handled_component_p (ref))
3173     {
3174       if (TREE_CODE (ref) == VIEW_CONVERT_EXPR
3175           || (TREE_CODE (ref) == COMPONENT_REF
3176               && DECL_BIT_FIELD (TREE_OPERAND (ref, 1))))
3177         return true;
3178       ref = TREE_OPERAND (ref, 0);
3179     }
3180
3181   return false;
3182 }
3183
3184 /* Examine both sides of the assignment statement pointed to by STMT, replace
3185    them with a scalare replacement if there is one and generate copying of
3186    replacements if scalarized aggregates have been used in the assignment.  GSI
3187    is used to hold generated statements for type conversions and subtree
3188    copying.  */
3189
3190 static enum assignment_mod_result
3191 sra_modify_assign (gimple stmt, gimple_stmt_iterator *gsi)
3192 {
3193   struct access *lacc, *racc;
3194   tree lhs, rhs;
3195   bool modify_this_stmt = false;
3196   bool force_gimple_rhs = false;
3197   location_t loc;
3198   gimple_stmt_iterator orig_gsi = *gsi;
3199
3200   if (!gimple_assign_single_p (stmt))
3201     return SRA_AM_NONE;
3202   lhs = gimple_assign_lhs (stmt);
3203   rhs = gimple_assign_rhs1 (stmt);
3204
3205   if (TREE_CODE (rhs) == CONSTRUCTOR)
3206     return sra_modify_constructor_assign (stmt, gsi);
3207
3208   if (TREE_CODE (rhs) == REALPART_EXPR || TREE_CODE (lhs) == REALPART_EXPR
3209       || TREE_CODE (rhs) == IMAGPART_EXPR || TREE_CODE (lhs) == IMAGPART_EXPR
3210       || TREE_CODE (rhs) == BIT_FIELD_REF || TREE_CODE (lhs) == BIT_FIELD_REF)
3211     {
3212       modify_this_stmt = sra_modify_expr (gimple_assign_rhs1_ptr (stmt),
3213                                           gsi, false);
3214       modify_this_stmt |= sra_modify_expr (gimple_assign_lhs_ptr (stmt),
3215                                            gsi, true);
3216       return modify_this_stmt ? SRA_AM_MODIFIED : SRA_AM_NONE;
3217     }
3218
3219   lacc = get_access_for_expr (lhs);
3220   racc = get_access_for_expr (rhs);
3221   if (!lacc && !racc)
3222     return SRA_AM_NONE;
3223
3224   loc = gimple_location (stmt);
3225   if (lacc && lacc->grp_to_be_replaced)
3226     {
3227       lhs = get_access_replacement (lacc);
3228       gimple_assign_set_lhs (stmt, lhs);
3229       modify_this_stmt = true;
3230       if (lacc->grp_partial_lhs)
3231         force_gimple_rhs = true;
3232       sra_stats.exprs++;
3233     }
3234
3235   if (racc && racc->grp_to_be_replaced)
3236     {
3237       rhs = get_access_replacement (racc);
3238       modify_this_stmt = true;
3239       if (racc->grp_partial_lhs)
3240         force_gimple_rhs = true;
3241       sra_stats.exprs++;
3242     }
3243   else if (racc
3244            && !racc->grp_unscalarized_data
3245            && !racc->grp_unscalarizable_region
3246            && TREE_CODE (lhs) == SSA_NAME
3247            && !access_has_replacements_p (racc))
3248     {
3249       rhs = get_repl_default_def_ssa_name (racc);
3250       modify_this_stmt = true;
3251       sra_stats.exprs++;
3252     }
3253
3254   if (modify_this_stmt)
3255     {
3256       if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
3257         {
3258           /* If we can avoid creating a VIEW_CONVERT_EXPR do so.
3259              ???  This should move to fold_stmt which we simply should
3260              call after building a VIEW_CONVERT_EXPR here.  */
3261           if (AGGREGATE_TYPE_P (TREE_TYPE (lhs))
3262               && !contains_bitfld_component_ref_p (lhs))
3263             {
3264               lhs = build_ref_for_model (loc, lhs, 0, racc, gsi, false);
3265               gimple_assign_set_lhs (stmt, lhs);
3266             }
3267           else if (AGGREGATE_TYPE_P (TREE_TYPE (rhs))
3268                    && !contains_vce_or_bfcref_p (rhs))
3269             rhs = build_ref_for_model (loc, rhs, 0, lacc, gsi, false);
3270
3271           if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
3272             {
3273               rhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR, TREE_TYPE (lhs),
3274                                      rhs);
3275               if (is_gimple_reg_type (TREE_TYPE (lhs))
3276                   && TREE_CODE (lhs) != SSA_NAME)
3277                 force_gimple_rhs = true;
3278             }
3279         }
3280     }
3281
3282   if (lacc && lacc->grp_to_be_debug_replaced)
3283     {
3284       tree dlhs = get_access_replacement (lacc);
3285       tree drhs = unshare_expr (rhs);
3286       if (!useless_type_conversion_p (TREE_TYPE (dlhs), TREE_TYPE (drhs)))
3287         {
3288           if (AGGREGATE_TYPE_P (TREE_TYPE (drhs))
3289               && !contains_vce_or_bfcref_p (drhs))
3290             drhs = build_debug_ref_for_model (loc, drhs, 0, lacc);
3291           if (drhs
3292               && !useless_type_conversion_p (TREE_TYPE (dlhs),
3293                                              TREE_TYPE (drhs)))
3294             drhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR,
3295                                     TREE_TYPE (dlhs), drhs);
3296         }
3297       gdebug *ds = gimple_build_debug_bind (dlhs, drhs, stmt);
3298       gsi_insert_before (gsi, ds, GSI_SAME_STMT);
3299     }
3300
3301   /* From this point on, the function deals with assignments in between
3302      aggregates when at least one has scalar reductions of some of its
3303      components.  There are three possible scenarios: Both the LHS and RHS have
3304      to-be-scalarized components, 2) only the RHS has or 3) only the LHS has.
3305
3306      In the first case, we would like to load the LHS components from RHS
3307      components whenever possible.  If that is not possible, we would like to
3308      read it directly from the RHS (after updating it by storing in it its own
3309      components).  If there are some necessary unscalarized data in the LHS,
3310      those will be loaded by the original assignment too.  If neither of these
3311      cases happen, the original statement can be removed.  Most of this is done
3312      by load_assign_lhs_subreplacements.
3313
3314      In the second case, we would like to store all RHS scalarized components
3315      directly into LHS and if they cover the aggregate completely, remove the
3316      statement too.  In the third case, we want the LHS components to be loaded
3317      directly from the RHS (DSE will remove the original statement if it
3318      becomes redundant).
3319
3320      This is a bit complex but manageable when types match and when unions do
3321      not cause confusion in a way that we cannot really load a component of LHS
3322      from the RHS or vice versa (the access representing this level can have
3323      subaccesses that are accessible only through a different union field at a
3324      higher level - different from the one used in the examined expression).
3325      Unions are fun.
3326
3327      Therefore, I specially handle a fourth case, happening when there is a
3328      specific type cast or it is impossible to locate a scalarized subaccess on
3329      the other side of the expression.  If that happens, I simply "refresh" the
3330      RHS by storing in it is scalarized components leave the original statement
3331      there to do the copying and then load the scalar replacements of the LHS.
3332      This is what the first branch does.  */
3333
3334   if (modify_this_stmt
3335       || gimple_has_volatile_ops (stmt)
3336       || contains_vce_or_bfcref_p (rhs)
3337       || contains_vce_or_bfcref_p (lhs)
3338       || stmt_ends_bb_p (stmt))
3339     {
3340       if (access_has_children_p (racc))
3341         generate_subtree_copies (racc->first_child, rhs, racc->offset, 0, 0,
3342                                  gsi, false, false, loc);
3343       if (access_has_children_p (lacc))
3344         {
3345           gimple_stmt_iterator alt_gsi = gsi_none ();
3346           if (stmt_ends_bb_p (stmt))
3347             {
3348               alt_gsi = gsi_start_edge (single_non_eh_succ (gsi_bb (*gsi)));
3349               gsi = &alt_gsi;
3350             }
3351           generate_subtree_copies (lacc->first_child, lhs, lacc->offset, 0, 0,
3352                                    gsi, true, true, loc);
3353         }
3354       sra_stats.separate_lhs_rhs_handling++;
3355
3356       /* This gimplification must be done after generate_subtree_copies,
3357          lest we insert the subtree copies in the middle of the gimplified
3358          sequence.  */
3359       if (force_gimple_rhs)
3360         rhs = force_gimple_operand_gsi (&orig_gsi, rhs, true, NULL_TREE,
3361                                         true, GSI_SAME_STMT);
3362       if (gimple_assign_rhs1 (stmt) != rhs)
3363         {
3364           modify_this_stmt = true;
3365           gimple_assign_set_rhs_from_tree (&orig_gsi, rhs);
3366           gcc_assert (stmt == gsi_stmt (orig_gsi));
3367         }
3368
3369       return modify_this_stmt ? SRA_AM_MODIFIED : SRA_AM_NONE;
3370     }
3371   else
3372     {
3373       if (access_has_children_p (lacc)
3374           && access_has_children_p (racc)
3375           /* When an access represents an unscalarizable region, it usually
3376              represents accesses with variable offset and thus must not be used
3377              to generate new memory accesses.  */
3378           && !lacc->grp_unscalarizable_region
3379           && !racc->grp_unscalarizable_region)
3380         {
3381           struct subreplacement_assignment_data sad;
3382
3383           sad.left_offset = lacc->offset;
3384           sad.assignment_lhs = lhs;
3385           sad.assignment_rhs = rhs;
3386           sad.top_racc = racc;
3387           sad.old_gsi = *gsi;
3388           sad.new_gsi = gsi;
3389           sad.loc = gimple_location (stmt);
3390           sad.refreshed = SRA_UDH_NONE;
3391
3392           if (lacc->grp_read && !lacc->grp_covered)
3393             handle_unscalarized_data_in_subtree (&sad);
3394
3395           load_assign_lhs_subreplacements (lacc, &sad);
3396           if (sad.refreshed != SRA_UDH_RIGHT)
3397             {
3398               gsi_next (gsi);
3399               unlink_stmt_vdef (stmt);
3400               gsi_remove (&sad.old_gsi, true);
3401               release_defs (stmt);
3402               sra_stats.deleted++;
3403               return SRA_AM_REMOVED;
3404             }
3405         }
3406       else
3407         {
3408           if (access_has_children_p (racc)
3409               && !racc->grp_unscalarized_data
3410               && TREE_CODE (lhs) != SSA_NAME)
3411             {
3412               if (dump_file)
3413                 {
3414                   fprintf (dump_file, "Removing load: ");
3415                   print_gimple_stmt (dump_file, stmt, 0, 0);
3416                 }
3417               generate_subtree_copies (racc->first_child, lhs,
3418                                        racc->offset, 0, 0, gsi,
3419                                        false, false, loc);
3420               gcc_assert (stmt == gsi_stmt (*gsi));
3421               unlink_stmt_vdef (stmt);
3422               gsi_remove (gsi, true);
3423               release_defs (stmt);
3424               sra_stats.deleted++;
3425               return SRA_AM_REMOVED;
3426             }
3427           /* Restore the aggregate RHS from its components so the
3428              prevailing aggregate copy does the right thing.  */
3429           if (access_has_children_p (racc))
3430             generate_subtree_copies (racc->first_child, rhs, racc->offset, 0, 0,
3431                                      gsi, false, false, loc);
3432           /* Re-load the components of the aggregate copy destination.
3433              But use the RHS aggregate to load from to expose more
3434              optimization opportunities.  */
3435           if (access_has_children_p (lacc))
3436             generate_subtree_copies (lacc->first_child, rhs, lacc->offset,
3437                                      0, 0, gsi, true, true, loc);
3438         }
3439
3440       return SRA_AM_NONE;
3441     }
3442 }
3443
3444 /* Traverse the function body and all modifications as decided in
3445    analyze_all_variable_accesses.  Return true iff the CFG has been
3446    changed.  */
3447
3448 static bool
3449 sra_modify_function_body (void)
3450 {
3451   bool cfg_changed = false;
3452   basic_block bb;
3453
3454   FOR_EACH_BB_FN (bb, cfun)
3455     {
3456       gimple_stmt_iterator gsi = gsi_start_bb (bb);
3457       while (!gsi_end_p (gsi))
3458         {
3459           gimple stmt = gsi_stmt (gsi);
3460           enum assignment_mod_result assign_result;
3461           bool modified = false, deleted = false;
3462           tree *t;
3463           unsigned i;
3464
3465           switch (gimple_code (stmt))
3466             {
3467             case GIMPLE_RETURN:
3468               t = gimple_return_retval_ptr (as_a <greturn *> (stmt));
3469               if (*t != NULL_TREE)
3470                 modified |= sra_modify_expr (t, &gsi, false);
3471               break;
3472
3473             case GIMPLE_ASSIGN:
3474               assign_result = sra_modify_assign (stmt, &gsi);
3475               modified |= assign_result == SRA_AM_MODIFIED;
3476               deleted = assign_result == SRA_AM_REMOVED;
3477               break;
3478
3479             case GIMPLE_CALL:
3480               /* Operands must be processed before the lhs.  */
3481               for (i = 0; i < gimple_call_num_args (stmt); i++)
3482                 {
3483                   t = gimple_call_arg_ptr (stmt, i);
3484                   modified |= sra_modify_expr (t, &gsi, false);
3485                 }
3486
3487               if (gimple_call_lhs (stmt))
3488                 {
3489                   t = gimple_call_lhs_ptr (stmt);
3490                   modified |= sra_modify_expr (t, &gsi, true);
3491                 }
3492               break;
3493
3494             case GIMPLE_ASM:
3495               {
3496                 gasm *asm_stmt = as_a <gasm *> (stmt);
3497                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
3498                   {
3499                     t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
3500                     modified |= sra_modify_expr (t, &gsi, false);
3501                   }
3502                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
3503                   {
3504                     t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
3505                     modified |= sra_modify_expr (t, &gsi, true);
3506                   }
3507               }
3508               break;
3509
3510             default:
3511               break;
3512             }
3513
3514           if (modified)
3515             {
3516               update_stmt (stmt);
3517               if (maybe_clean_eh_stmt (stmt)
3518                   && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
3519                 cfg_changed = true;
3520             }
3521           if (!deleted)
3522             gsi_next (&gsi);
3523         }
3524     }
3525
3526   gsi_commit_edge_inserts ();
3527   return cfg_changed;
3528 }
3529
3530 /* Generate statements initializing scalar replacements of parts of function
3531    parameters.  */
3532
3533 static void
3534 initialize_parameter_reductions (void)
3535 {
3536   gimple_stmt_iterator gsi;
3537   gimple_seq seq = NULL;
3538   tree parm;
3539
3540   gsi = gsi_start (seq);
3541   for (parm = DECL_ARGUMENTS (current_function_decl);
3542        parm;
3543        parm = DECL_CHAIN (parm))
3544     {
3545       vec<access_p> *access_vec;
3546       struct access *access;
3547
3548       if (!bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
3549         continue;
3550       access_vec = get_base_access_vector (parm);
3551       if (!access_vec)
3552         continue;
3553
3554       for (access = (*access_vec)[0];
3555            access;
3556            access = access->next_grp)
3557         generate_subtree_copies (access, parm, 0, 0, 0, &gsi, true, true,
3558                                  EXPR_LOCATION (parm));
3559     }
3560
3561   seq = gsi_seq (gsi);
3562   if (seq)
3563     gsi_insert_seq_on_edge_immediate (single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)), seq);
3564 }
3565
3566 /* The "main" function of intraprocedural SRA passes.  Runs the analysis and if
3567    it reveals there are components of some aggregates to be scalarized, it runs
3568    the required transformations.  */
3569 static unsigned int
3570 perform_intra_sra (void)
3571 {
3572   int ret = 0;
3573   sra_initialize ();
3574
3575   if (!find_var_candidates ())
3576     goto out;
3577
3578   if (!scan_function ())
3579     goto out;
3580
3581   if (!analyze_all_variable_accesses ())
3582     goto out;
3583
3584   if (sra_modify_function_body ())
3585     ret = TODO_update_ssa | TODO_cleanup_cfg;
3586   else
3587     ret = TODO_update_ssa;
3588   initialize_parameter_reductions ();
3589
3590   statistics_counter_event (cfun, "Scalar replacements created",
3591                             sra_stats.replacements);
3592   statistics_counter_event (cfun, "Modified expressions", sra_stats.exprs);
3593   statistics_counter_event (cfun, "Subtree copy stmts",
3594                             sra_stats.subtree_copies);
3595   statistics_counter_event (cfun, "Subreplacement stmts",
3596                             sra_stats.subreplacements);
3597   statistics_counter_event (cfun, "Deleted stmts", sra_stats.deleted);
3598   statistics_counter_event (cfun, "Separate LHS and RHS handling",
3599                             sra_stats.separate_lhs_rhs_handling);
3600
3601  out:
3602   sra_deinitialize ();
3603   return ret;
3604 }
3605
3606 /* Perform early intraprocedural SRA.  */
3607 static unsigned int
3608 early_intra_sra (void)
3609 {
3610   sra_mode = SRA_MODE_EARLY_INTRA;
3611   return perform_intra_sra ();
3612 }
3613
3614 /* Perform "late" intraprocedural SRA.  */
3615 static unsigned int
3616 late_intra_sra (void)
3617 {
3618   sra_mode = SRA_MODE_INTRA;
3619   return perform_intra_sra ();
3620 }
3621
3622
3623 static bool
3624 gate_intra_sra (void)
3625 {
3626   return flag_tree_sra != 0 && dbg_cnt (tree_sra);
3627 }
3628
3629
3630 namespace {
3631
3632 const pass_data pass_data_sra_early =
3633 {
3634   GIMPLE_PASS, /* type */
3635   "esra", /* name */
3636   OPTGROUP_NONE, /* optinfo_flags */
3637   TV_TREE_SRA, /* tv_id */
3638   ( PROP_cfg | PROP_ssa ), /* properties_required */
3639   0, /* properties_provided */
3640   0, /* properties_destroyed */
3641   0, /* todo_flags_start */
3642   TODO_update_ssa, /* todo_flags_finish */
3643 };
3644
3645 class pass_sra_early : public gimple_opt_pass
3646 {
3647 public:
3648   pass_sra_early (gcc::context *ctxt)
3649     : gimple_opt_pass (pass_data_sra_early, ctxt)
3650   {}
3651
3652   /* opt_pass methods: */
3653   virtual bool gate (function *) { return gate_intra_sra (); }
3654   virtual unsigned int execute (function *) { return early_intra_sra (); }
3655
3656 }; // class pass_sra_early
3657
3658 } // anon namespace
3659
3660 gimple_opt_pass *
3661 make_pass_sra_early (gcc::context *ctxt)
3662 {
3663   return new pass_sra_early (ctxt);
3664 }
3665
3666 namespace {
3667
3668 const pass_data pass_data_sra =
3669 {
3670   GIMPLE_PASS, /* type */
3671   "sra", /* name */
3672   OPTGROUP_NONE, /* optinfo_flags */
3673   TV_TREE_SRA, /* tv_id */
3674   ( PROP_cfg | PROP_ssa ), /* properties_required */
3675   0, /* properties_provided */
3676   0, /* properties_destroyed */
3677   TODO_update_address_taken, /* todo_flags_start */
3678   TODO_update_ssa, /* todo_flags_finish */
3679 };
3680
3681 class pass_sra : public gimple_opt_pass
3682 {
3683 public:
3684   pass_sra (gcc::context *ctxt)
3685     : gimple_opt_pass (pass_data_sra, ctxt)
3686   {}
3687
3688   /* opt_pass methods: */
3689   virtual bool gate (function *) { return gate_intra_sra (); }
3690   virtual unsigned int execute (function *) { return late_intra_sra (); }
3691
3692 }; // class pass_sra
3693
3694 } // anon namespace
3695
3696 gimple_opt_pass *
3697 make_pass_sra (gcc::context *ctxt)
3698 {
3699   return new pass_sra (ctxt);
3700 }
3701
3702
3703 /* Return true iff PARM (which must be a parm_decl) is an unused scalar
3704    parameter.  */
3705
3706 static bool
3707 is_unused_scalar_param (tree parm)
3708 {
3709   tree name;
3710   return (is_gimple_reg (parm)
3711           && (!(name = ssa_default_def (cfun, parm))
3712               || has_zero_uses (name)));
3713 }
3714
3715 /* Scan immediate uses of a default definition SSA name of a parameter PARM and
3716    examine whether there are any direct or otherwise infeasible ones.  If so,
3717    return true, otherwise return false.  PARM must be a gimple register with a
3718    non-NULL default definition.  */
3719
3720 static bool
3721 ptr_parm_has_direct_uses (tree parm)
3722 {
3723   imm_use_iterator ui;
3724   gimple stmt;
3725   tree name = ssa_default_def (cfun, parm);
3726   bool ret = false;
3727
3728   FOR_EACH_IMM_USE_STMT (stmt, ui, name)
3729     {
3730       int uses_ok = 0;
3731       use_operand_p use_p;
3732
3733       if (is_gimple_debug (stmt))
3734         continue;
3735
3736       /* Valid uses include dereferences on the lhs and the rhs.  */
3737       if (gimple_has_lhs (stmt))
3738         {
3739           tree lhs = gimple_get_lhs (stmt);
3740           while (handled_component_p (lhs))
3741             lhs = TREE_OPERAND (lhs, 0);
3742           if (TREE_CODE (lhs) == MEM_REF
3743               && TREE_OPERAND (lhs, 0) == name
3744               && integer_zerop (TREE_OPERAND (lhs, 1))
3745               && types_compatible_p (TREE_TYPE (lhs),
3746                                      TREE_TYPE (TREE_TYPE (name)))
3747               && !TREE_THIS_VOLATILE (lhs))
3748             uses_ok++;
3749         }
3750       if (gimple_assign_single_p (stmt))
3751         {
3752           tree rhs = gimple_assign_rhs1 (stmt);
3753           while (handled_component_p (rhs))
3754             rhs = TREE_OPERAND (rhs, 0);
3755           if (TREE_CODE (rhs) == MEM_REF
3756               && TREE_OPERAND (rhs, 0) == name
3757               && integer_zerop (TREE_OPERAND (rhs, 1))
3758               && types_compatible_p (TREE_TYPE (rhs),
3759                                      TREE_TYPE (TREE_TYPE (name)))
3760               && !TREE_THIS_VOLATILE (rhs))
3761             uses_ok++;
3762         }
3763       else if (is_gimple_call (stmt))
3764         {
3765           unsigned i;
3766           for (i = 0; i < gimple_call_num_args (stmt); ++i)
3767             {
3768               tree arg = gimple_call_arg (stmt, i);
3769               while (handled_component_p (arg))
3770                 arg = TREE_OPERAND (arg, 0);
3771               if (TREE_CODE (arg) == MEM_REF
3772                   && TREE_OPERAND (arg, 0) == name
3773                   && integer_zerop (TREE_OPERAND (arg, 1))
3774                   && types_compatible_p (TREE_TYPE (arg),
3775                                          TREE_TYPE (TREE_TYPE (name)))
3776                   && !TREE_THIS_VOLATILE (arg))
3777                 uses_ok++;
3778             }
3779         }
3780
3781       /* If the number of valid uses does not match the number of
3782          uses in this stmt there is an unhandled use.  */
3783       FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
3784         --uses_ok;
3785
3786       if (uses_ok != 0)
3787         ret = true;
3788
3789       if (ret)
3790         BREAK_FROM_IMM_USE_STMT (ui);
3791     }
3792
3793   return ret;
3794 }
3795
3796 /* Identify candidates for reduction for IPA-SRA based on their type and mark
3797    them in candidate_bitmap.  Note that these do not necessarily include
3798    parameter which are unused and thus can be removed.  Return true iff any
3799    such candidate has been found.  */
3800
3801 static bool
3802 find_param_candidates (void)
3803 {
3804   tree parm;
3805   int count = 0;
3806   bool ret = false;
3807   const char *msg;
3808
3809   for (parm = DECL_ARGUMENTS (current_function_decl);
3810        parm;
3811        parm = DECL_CHAIN (parm))
3812     {
3813       tree type = TREE_TYPE (parm);
3814       tree_node **slot;
3815
3816       count++;
3817
3818       if (TREE_THIS_VOLATILE (parm)
3819           || TREE_ADDRESSABLE (parm)
3820           || (!is_gimple_reg_type (type) && is_va_list_type (type)))
3821         continue;
3822
3823       if (is_unused_scalar_param (parm))
3824         {
3825           ret = true;
3826           continue;
3827         }
3828
3829       if (POINTER_TYPE_P (type))
3830         {
3831           type = TREE_TYPE (type);
3832
3833           if (TREE_CODE (type) == FUNCTION_TYPE
3834               || TYPE_VOLATILE (type)
3835               || (TREE_CODE (type) == ARRAY_TYPE
3836                   && TYPE_NONALIASED_COMPONENT (type))
3837               || !is_gimple_reg (parm)
3838               || is_va_list_type (type)
3839               || ptr_parm_has_direct_uses (parm))
3840             continue;
3841         }
3842       else if (!AGGREGATE_TYPE_P (type))
3843         continue;
3844
3845       if (!COMPLETE_TYPE_P (type)
3846           || !tree_fits_uhwi_p (TYPE_SIZE (type))
3847           || tree_to_uhwi (TYPE_SIZE (type)) == 0
3848           || (AGGREGATE_TYPE_P (type)
3849               && type_internals_preclude_sra_p (type, &msg)))
3850         continue;
3851
3852       bitmap_set_bit (candidate_bitmap, DECL_UID (parm));
3853       slot = candidates->find_slot_with_hash (parm, DECL_UID (parm), INSERT);
3854       *slot = parm;
3855
3856       ret = true;
3857       if (dump_file && (dump_flags & TDF_DETAILS))
3858         {
3859           fprintf (dump_file, "Candidate (%d): ", DECL_UID (parm));
3860           print_generic_expr (dump_file, parm, 0);
3861           fprintf (dump_file, "\n");
3862         }
3863     }
3864
3865   func_param_count = count;
3866   return ret;
3867 }
3868
3869 /* Callback of walk_aliased_vdefs, marks the access passed as DATA as
3870    maybe_modified. */
3871
3872 static bool
3873 mark_maybe_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
3874                      void *data)
3875 {
3876   struct access *repr = (struct access *) data;
3877
3878   repr->grp_maybe_modified = 1;
3879   return true;
3880 }
3881
3882 /* Analyze what representatives (in linked lists accessible from
3883    REPRESENTATIVES) can be modified by side effects of statements in the
3884    current function.  */
3885
3886 static void
3887 analyze_modified_params (vec<access_p> representatives)
3888 {
3889   int i;
3890
3891   for (i = 0; i < func_param_count; i++)
3892     {
3893       struct access *repr;
3894
3895       for (repr = representatives[i];
3896            repr;
3897            repr = repr->next_grp)
3898         {
3899           struct access *access;
3900           bitmap visited;
3901           ao_ref ar;
3902
3903           if (no_accesses_p (repr))
3904             continue;
3905           if (!POINTER_TYPE_P (TREE_TYPE (repr->base))
3906               || repr->grp_maybe_modified)
3907             continue;
3908
3909           ao_ref_init (&ar, repr->expr);
3910           visited = BITMAP_ALLOC (NULL);
3911           for (access = repr; access; access = access->next_sibling)
3912             {
3913               /* All accesses are read ones, otherwise grp_maybe_modified would
3914                  be trivially set.  */
3915               walk_aliased_vdefs (&ar, gimple_vuse (access->stmt),
3916                                   mark_maybe_modified, repr, &visited);
3917               if (repr->grp_maybe_modified)
3918                 break;
3919             }
3920           BITMAP_FREE (visited);
3921         }
3922     }
3923 }
3924
3925 /* Propagate distances in bb_dereferences in the opposite direction than the
3926    control flow edges, in each step storing the maximum of the current value
3927    and the minimum of all successors.  These steps are repeated until the table
3928    stabilizes.  Note that BBs which might terminate the functions (according to
3929    final_bbs bitmap) never updated in this way.  */
3930
3931 static void
3932 propagate_dereference_distances (void)
3933 {
3934   basic_block bb;
3935
3936   auto_vec<basic_block> queue (last_basic_block_for_fn (cfun));
3937   queue.quick_push (ENTRY_BLOCK_PTR_FOR_FN (cfun));
3938   FOR_EACH_BB_FN (bb, cfun)
3939     {
3940       queue.quick_push (bb);
3941       bb->aux = bb;
3942     }
3943
3944   while (!queue.is_empty ())
3945     {
3946       edge_iterator ei;
3947       edge e;
3948       bool change = false;
3949       int i;
3950
3951       bb = queue.pop ();
3952       bb->aux = NULL;
3953
3954       if (bitmap_bit_p (final_bbs, bb->index))
3955         continue;
3956
3957       for (i = 0; i < func_param_count; i++)
3958         {
3959           int idx = bb->index * func_param_count + i;
3960           bool first = true;
3961           HOST_WIDE_INT inh = 0;
3962
3963           FOR_EACH_EDGE (e, ei, bb->succs)
3964           {
3965             int succ_idx = e->dest->index * func_param_count + i;
3966
3967             if (e->src == EXIT_BLOCK_PTR_FOR_FN (cfun))
3968               continue;
3969
3970             if (first)
3971               {
3972                 first = false;
3973                 inh = bb_dereferences [succ_idx];
3974               }
3975             else if (bb_dereferences [succ_idx] < inh)
3976               inh = bb_dereferences [succ_idx];
3977           }
3978
3979           if (!first && bb_dereferences[idx] < inh)
3980             {
3981               bb_dereferences[idx] = inh;
3982               change = true;
3983             }
3984         }
3985
3986       if (change && !bitmap_bit_p (final_bbs, bb->index))
3987         FOR_EACH_EDGE (e, ei, bb->preds)
3988           {
3989             if (e->src->aux)
3990               continue;
3991
3992             e->src->aux = e->src;
3993             queue.quick_push (e->src);
3994           }
3995     }
3996 }
3997
3998 /* Dump a dereferences TABLE with heading STR to file F.  */
3999
4000 static void
4001 dump_dereferences_table (FILE *f, const char *str, HOST_WIDE_INT *table)
4002 {
4003   basic_block bb;
4004
4005   fprintf (dump_file, "%s", str);
4006   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
4007                   EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
4008     {
4009       fprintf (f, "%4i  %i   ", bb->index, bitmap_bit_p (final_bbs, bb->index));
4010       if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
4011         {
4012           int i;
4013           for (i = 0; i < func_param_count; i++)
4014             {
4015               int idx = bb->index * func_param_count + i;
4016               fprintf (f, " %4" HOST_WIDE_INT_PRINT "d", table[idx]);
4017             }
4018         }
4019       fprintf (f, "\n");
4020     }
4021   fprintf (dump_file, "\n");
4022 }
4023
4024 /* Determine what (parts of) parameters passed by reference that are not
4025    assigned to are not certainly dereferenced in this function and thus the
4026    dereferencing cannot be safely moved to the caller without potentially
4027    introducing a segfault.  Mark such REPRESENTATIVES as
4028    grp_not_necessarilly_dereferenced.
4029
4030    The dereferenced maximum "distance," i.e. the offset + size of the accessed
4031    part is calculated rather than simple booleans are calculated for each
4032    pointer parameter to handle cases when only a fraction of the whole
4033    aggregate is allocated (see testsuite/gcc.c-torture/execute/ipa-sra-2.c for
4034    an example).
4035
4036    The maximum dereference distances for each pointer parameter and BB are
4037    already stored in bb_dereference.  This routine simply propagates these
4038    values upwards by propagate_dereference_distances and then compares the
4039    distances of individual parameters in the ENTRY BB to the equivalent
4040    distances of each representative of a (fraction of a) parameter.  */
4041
4042 static void
4043 analyze_caller_dereference_legality (vec<access_p> representatives)
4044 {
4045   int i;
4046
4047   if (dump_file && (dump_flags & TDF_DETAILS))
4048     dump_dereferences_table (dump_file,
4049                              "Dereference table before propagation:\n",
4050                              bb_dereferences);
4051
4052   propagate_dereference_distances ();
4053
4054   if (dump_file && (dump_flags & TDF_DETAILS))
4055     dump_dereferences_table (dump_file,
4056                              "Dereference table after propagation:\n",
4057                              bb_dereferences);
4058
4059   for (i = 0; i < func_param_count; i++)
4060     {
4061       struct access *repr = representatives[i];
4062       int idx = ENTRY_BLOCK_PTR_FOR_FN (cfun)->index * func_param_count + i;
4063
4064       if (!repr || no_accesses_p (repr))
4065         continue;
4066
4067       do
4068         {
4069           if ((repr->offset + repr->size) > bb_dereferences[idx])
4070             repr->grp_not_necessarilly_dereferenced = 1;
4071           repr = repr->next_grp;
4072         }
4073       while (repr);
4074     }
4075 }
4076
4077 /* Return the representative access for the parameter declaration PARM if it is
4078    a scalar passed by reference which is not written to and the pointer value
4079    is not used directly.  Thus, if it is legal to dereference it in the caller
4080    and we can rule out modifications through aliases, such parameter should be
4081    turned into one passed by value.  Return NULL otherwise.  */
4082
4083 static struct access *
4084 unmodified_by_ref_scalar_representative (tree parm)
4085 {
4086   int i, access_count;
4087   struct access *repr;
4088   vec<access_p> *access_vec;
4089
4090   access_vec = get_base_access_vector (parm);
4091   gcc_assert (access_vec);
4092   repr = (*access_vec)[0];
4093   if (repr->write)
4094     return NULL;
4095   repr->group_representative = repr;
4096
4097   access_count = access_vec->length ();
4098   for (i = 1; i < access_count; i++)
4099     {
4100       struct access *access = (*access_vec)[i];
4101       if (access->write)
4102         return NULL;
4103       access->group_representative = repr;
4104       access->next_sibling = repr->next_sibling;
4105       repr->next_sibling = access;
4106     }
4107
4108   repr->grp_read = 1;
4109   repr->grp_scalar_ptr = 1;
4110   return repr;
4111 }
4112
4113 /* Return true iff this ACCESS precludes IPA-SRA of the parameter it is
4114    associated with.  REQ_ALIGN is the minimum required alignment.  */
4115
4116 static bool
4117 access_precludes_ipa_sra_p (struct access *access, unsigned int req_align)
4118 {
4119   unsigned int exp_align;
4120   /* Avoid issues such as the second simple testcase in PR 42025.  The problem
4121      is incompatible assign in a call statement (and possibly even in asm
4122      statements).  This can be relaxed by using a new temporary but only for
4123      non-TREE_ADDRESSABLE types and is probably not worth the complexity. (In
4124      intraprocedural SRA we deal with this by keeping the old aggregate around,
4125      something we cannot do in IPA-SRA.)  */
4126   if (access->write
4127       && (is_gimple_call (access->stmt)
4128           || gimple_code (access->stmt) == GIMPLE_ASM))
4129     return true;
4130
4131   exp_align = get_object_alignment (access->expr);
4132   if (exp_align < req_align)
4133     return true;
4134
4135   return false;
4136 }
4137
4138
4139 /* Sort collected accesses for parameter PARM, identify representatives for
4140    each accessed region and link them together.  Return NULL if there are
4141    different but overlapping accesses, return the special ptr value meaning
4142    there are no accesses for this parameter if that is the case and return the
4143    first representative otherwise.  Set *RO_GRP if there is a group of accesses
4144    with only read (i.e. no write) accesses.  */
4145
4146 static struct access *
4147 splice_param_accesses (tree parm, bool *ro_grp)
4148 {
4149   int i, j, access_count, group_count;
4150   int agg_size, total_size = 0;
4151   struct access *access, *res, **prev_acc_ptr = &res;
4152   vec<access_p> *access_vec;
4153
4154   access_vec = get_base_access_vector (parm);
4155   if (!access_vec)
4156     return &no_accesses_representant;
4157   access_count = access_vec->length ();
4158
4159   access_vec->qsort (compare_access_positions);
4160
4161   i = 0;
4162   total_size = 0;
4163   group_count = 0;
4164   while (i < access_count)
4165     {
4166       bool modification;
4167       tree a1_alias_type;
4168       access = (*access_vec)[i];
4169       modification = access->write;
4170       if (access_precludes_ipa_sra_p (access, TYPE_ALIGN (access->type)))
4171         return NULL;
4172       a1_alias_type = reference_alias_ptr_type (access->expr);
4173
4174       /* Access is about to become group representative unless we find some
4175          nasty overlap which would preclude us from breaking this parameter
4176          apart. */
4177
4178       j = i + 1;
4179       while (j < access_count)
4180         {
4181           struct access *ac2 = (*access_vec)[j];
4182           if (ac2->offset != access->offset)
4183             {
4184               /* All or nothing law for parameters. */
4185               if (access->offset + access->size > ac2->offset)
4186                 return NULL;
4187               else
4188                 break;
4189             }
4190           else if (ac2->size != access->size)
4191             return NULL;
4192
4193           if (access_precludes_ipa_sra_p (ac2, TYPE_ALIGN (access->type))
4194               || (ac2->type != access->type
4195                   && (TREE_ADDRESSABLE (ac2->type)
4196                       || TREE_ADDRESSABLE (access->type)))
4197               || (reference_alias_ptr_type (ac2->expr) != a1_alias_type))
4198             return NULL;
4199
4200           modification |= ac2->write;
4201           ac2->group_representative = access;
4202           ac2->next_sibling = access->next_sibling;
4203           access->next_sibling = ac2;
4204           j++;
4205         }
4206
4207       group_count++;
4208       access->grp_maybe_modified = modification;
4209       if (!modification)
4210         *ro_grp = true;
4211       *prev_acc_ptr = access;
4212       prev_acc_ptr = &access->next_grp;
4213       total_size += access->size;
4214       i = j;
4215     }
4216
4217   if (POINTER_TYPE_P (TREE_TYPE (parm)))
4218     agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))));
4219   else
4220     agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (parm)));
4221   if (total_size >= agg_size)
4222     return NULL;
4223
4224   gcc_assert (group_count > 0);
4225   return res;
4226 }
4227
4228 /* Decide whether parameters with representative accesses given by REPR should
4229    be reduced into components.  */
4230
4231 static int
4232 decide_one_param_reduction (struct access *repr)
4233 {
4234   int total_size, cur_parm_size, agg_size, new_param_count, parm_size_limit;
4235   bool by_ref;
4236   tree parm;
4237
4238   parm = repr->base;
4239   cur_parm_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (parm)));
4240   gcc_assert (cur_parm_size > 0);
4241
4242   if (POINTER_TYPE_P (TREE_TYPE (parm)))
4243     {
4244       by_ref = true;
4245       agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))));
4246     }
4247   else
4248     {
4249       by_ref = false;
4250       agg_size = cur_parm_size;
4251     }
4252
4253   if (dump_file)
4254     {
4255       struct access *acc;
4256       fprintf (dump_file, "Evaluating PARAM group sizes for ");
4257       print_generic_expr (dump_file, parm, 0);
4258       fprintf (dump_file, " (UID: %u): \n", DECL_UID (parm));
4259       for (acc = repr; acc; acc = acc->next_grp)
4260         dump_access (dump_file, acc, true);
4261     }
4262
4263   total_size = 0;
4264   new_param_count = 0;
4265
4266   for (; repr; repr = repr->next_grp)
4267     {
4268       gcc_assert (parm == repr->base);
4269
4270       /* Taking the address of a non-addressable field is verboten.  */
4271       if (by_ref && repr->non_addressable)
4272         return 0;
4273
4274       /* Do not decompose a non-BLKmode param in a way that would
4275          create BLKmode params.  Especially for by-reference passing
4276          (thus, pointer-type param) this is hardly worthwhile.  */
4277       if (DECL_MODE (parm) != BLKmode
4278           && TYPE_MODE (repr->type) == BLKmode)
4279         return 0;
4280
4281       if (!by_ref || (!repr->grp_maybe_modified
4282                       && !repr->grp_not_necessarilly_dereferenced))
4283         total_size += repr->size;
4284       else
4285         total_size += cur_parm_size;
4286
4287       new_param_count++;
4288     }
4289
4290   gcc_assert (new_param_count > 0);
4291
4292   if (optimize_function_for_size_p (cfun))
4293     parm_size_limit = cur_parm_size;
4294   else
4295     parm_size_limit = (PARAM_VALUE (PARAM_IPA_SRA_PTR_GROWTH_FACTOR)
4296                        * cur_parm_size);
4297
4298   if (total_size < agg_size
4299       && total_size <= parm_size_limit)
4300     {
4301       if (dump_file)
4302         fprintf (dump_file, "    ....will be split into %i components\n",
4303                  new_param_count);
4304       return new_param_count;
4305     }
4306   else
4307     return 0;
4308 }
4309
4310 /* The order of the following enums is important, we need to do extra work for
4311    UNUSED_PARAMS, BY_VAL_ACCESSES and UNMODIF_BY_REF_ACCESSES.  */
4312 enum ipa_splicing_result { NO_GOOD_ACCESS, UNUSED_PARAMS, BY_VAL_ACCESSES,
4313                           MODIF_BY_REF_ACCESSES, UNMODIF_BY_REF_ACCESSES };
4314
4315 /* Identify representatives of all accesses to all candidate parameters for
4316    IPA-SRA.  Return result based on what representatives have been found. */
4317
4318 static enum ipa_splicing_result
4319 splice_all_param_accesses (vec<access_p> &representatives)
4320 {
4321   enum ipa_splicing_result result = NO_GOOD_ACCESS;
4322   tree parm;
4323   struct access *repr;
4324
4325   representatives.create (func_param_count);
4326
4327   for (parm = DECL_ARGUMENTS (current_function_decl);
4328        parm;
4329        parm = DECL_CHAIN (parm))
4330     {
4331       if (is_unused_scalar_param (parm))
4332         {
4333           representatives.quick_push (&no_accesses_representant);
4334           if (result == NO_GOOD_ACCESS)
4335             result = UNUSED_PARAMS;
4336         }
4337       else if (POINTER_TYPE_P (TREE_TYPE (parm))
4338                && is_gimple_reg_type (TREE_TYPE (TREE_TYPE (parm)))
4339                && bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
4340         {
4341           repr = unmodified_by_ref_scalar_representative (parm);
4342           representatives.quick_push (repr);
4343           if (repr)
4344             result = UNMODIF_BY_REF_ACCESSES;
4345         }
4346       else if (bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
4347         {
4348           bool ro_grp = false;
4349           repr = splice_param_accesses (parm, &ro_grp);
4350           representatives.quick_push (repr);
4351
4352           if (repr && !no_accesses_p (repr))
4353             {
4354               if (POINTER_TYPE_P (TREE_TYPE (parm)))
4355                 {
4356                   if (ro_grp)
4357                     result = UNMODIF_BY_REF_ACCESSES;
4358                   else if (result < MODIF_BY_REF_ACCESSES)
4359                     result = MODIF_BY_REF_ACCESSES;
4360                 }
4361               else if (result < BY_VAL_ACCESSES)
4362                 result = BY_VAL_ACCESSES;
4363             }
4364           else if (no_accesses_p (repr) && (result == NO_GOOD_ACCESS))
4365             result = UNUSED_PARAMS;
4366         }
4367       else
4368         representatives.quick_push (NULL);
4369     }
4370
4371   if (result == NO_GOOD_ACCESS)
4372     {
4373       representatives.release ();
4374       return NO_GOOD_ACCESS;
4375     }
4376
4377   return result;
4378 }
4379
4380 /* Return the index of BASE in PARMS.  Abort if it is not found.  */
4381
4382 static inline int
4383 get_param_index (tree base, vec<tree> parms)
4384 {
4385   int i, len;
4386
4387   len = parms.length ();
4388   for (i = 0; i < len; i++)
4389     if (parms[i] == base)
4390       return i;
4391   gcc_unreachable ();
4392 }
4393
4394 /* Convert the decisions made at the representative level into compact
4395    parameter adjustments.  REPRESENTATIVES are pointers to first
4396    representatives of each param accesses, ADJUSTMENTS_COUNT is the expected
4397    final number of adjustments.  */
4398
4399 static ipa_parm_adjustment_vec
4400 turn_representatives_into_adjustments (vec<access_p> representatives,
4401                                        int adjustments_count)
4402 {
4403   vec<tree> parms;
4404   ipa_parm_adjustment_vec adjustments;
4405   tree parm;
4406   int i;
4407
4408   gcc_assert (adjustments_count > 0);
4409   parms = ipa_get_vector_of_formal_parms (current_function_decl);
4410   adjustments.create (adjustments_count);
4411   parm = DECL_ARGUMENTS (current_function_decl);
4412   for (i = 0; i < func_param_count; i++, parm = DECL_CHAIN (parm))
4413     {
4414       struct access *repr = representatives[i];
4415
4416       if (!repr || no_accesses_p (repr))
4417         {
4418           struct ipa_parm_adjustment adj;
4419
4420           memset (&adj, 0, sizeof (adj));
4421           adj.base_index = get_param_index (parm, parms);
4422           adj.base = parm;
4423           if (!repr)
4424             adj.op = IPA_PARM_OP_COPY;
4425           else
4426             adj.op = IPA_PARM_OP_REMOVE;
4427           adj.arg_prefix = "ISRA";
4428           adjustments.quick_push (adj);
4429         }
4430       else
4431         {
4432           struct ipa_parm_adjustment adj;
4433           int index = get_param_index (parm, parms);
4434
4435           for (; repr; repr = repr->next_grp)
4436             {
4437               memset (&adj, 0, sizeof (adj));
4438               gcc_assert (repr->base == parm);
4439               adj.base_index = index;
4440               adj.base = repr->base;
4441               adj.type = repr->type;
4442               adj.alias_ptr_type = reference_alias_ptr_type (repr->expr);
4443               adj.offset = repr->offset;
4444               adj.by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base))
4445                             && (repr->grp_maybe_modified
4446                                 || repr->grp_not_necessarilly_dereferenced));
4447               adj.arg_prefix = "ISRA";
4448               adjustments.quick_push (adj);
4449             }
4450         }
4451     }
4452   parms.release ();
4453   return adjustments;
4454 }
4455
4456 /* Analyze the collected accesses and produce a plan what to do with the
4457    parameters in the form of adjustments, NULL meaning nothing.  */
4458
4459 static ipa_parm_adjustment_vec
4460 analyze_all_param_acesses (void)
4461 {
4462   enum ipa_splicing_result repr_state;
4463   bool proceed = false;
4464   int i, adjustments_count = 0;
4465   vec<access_p> representatives;
4466   ipa_parm_adjustment_vec adjustments;
4467
4468   repr_state = splice_all_param_accesses (representatives);
4469   if (repr_state == NO_GOOD_ACCESS)
4470     return ipa_parm_adjustment_vec ();
4471
4472   /* If there are any parameters passed by reference which are not modified
4473      directly, we need to check whether they can be modified indirectly.  */
4474   if (repr_state == UNMODIF_BY_REF_ACCESSES)
4475     {
4476       analyze_caller_dereference_legality (representatives);
4477       analyze_modified_params (representatives);
4478     }
4479
4480   for (i = 0; i < func_param_count; i++)
4481     {
4482       struct access *repr = representatives[i];
4483
4484       if (repr && !no_accesses_p (repr))
4485         {
4486           if (repr->grp_scalar_ptr)
4487             {
4488               adjustments_count++;
4489               if (repr->grp_not_necessarilly_dereferenced
4490                   || repr->grp_maybe_modified)
4491                 representatives[i] = NULL;
4492               else
4493                 {
4494                   proceed = true;
4495                   sra_stats.scalar_by_ref_to_by_val++;
4496                 }
4497             }
4498           else
4499             {
4500               int new_components = decide_one_param_reduction (repr);
4501
4502               if (new_components == 0)
4503                 {
4504                   representatives[i] = NULL;
4505                   adjustments_count++;
4506                 }
4507               else
4508                 {
4509                   adjustments_count += new_components;
4510                   sra_stats.aggregate_params_reduced++;
4511                   sra_stats.param_reductions_created += new_components;
4512                   proceed = true;
4513                 }
4514             }
4515         }
4516       else
4517         {
4518           if (no_accesses_p (repr))
4519             {
4520               proceed = true;
4521               sra_stats.deleted_unused_parameters++;
4522             }
4523           adjustments_count++;
4524         }
4525     }
4526
4527   if (!proceed && dump_file)
4528     fprintf (dump_file, "NOT proceeding to change params.\n");
4529
4530   if (proceed)
4531     adjustments = turn_representatives_into_adjustments (representatives,
4532                                                          adjustments_count);
4533   else
4534     adjustments = ipa_parm_adjustment_vec ();
4535
4536   representatives.release ();
4537   return adjustments;
4538 }
4539
4540 /* If a parameter replacement identified by ADJ does not yet exist in the form
4541    of declaration, create it and record it, otherwise return the previously
4542    created one.  */
4543
4544 static tree
4545 get_replaced_param_substitute (struct ipa_parm_adjustment *adj)
4546 {
4547   tree repl;
4548   if (!adj->new_ssa_base)
4549     {
4550       char *pretty_name = make_fancy_name (adj->base);
4551
4552       repl = create_tmp_reg (TREE_TYPE (adj->base), "ISR");
4553       DECL_NAME (repl) = get_identifier (pretty_name);
4554       obstack_free (&name_obstack, pretty_name);
4555
4556       adj->new_ssa_base = repl;
4557     }
4558   else
4559     repl = adj->new_ssa_base;
4560   return repl;
4561 }
4562
4563 /* Find the first adjustment for a particular parameter BASE in a vector of
4564    ADJUSTMENTS which is not a copy_param.  Return NULL if there is no such
4565    adjustment. */
4566
4567 static struct ipa_parm_adjustment *
4568 get_adjustment_for_base (ipa_parm_adjustment_vec adjustments, tree base)
4569 {
4570   int i, len;
4571
4572   len = adjustments.length ();
4573   for (i = 0; i < len; i++)
4574     {
4575       struct ipa_parm_adjustment *adj;
4576
4577       adj = &adjustments[i];
4578       if (adj->op != IPA_PARM_OP_COPY && adj->base == base)
4579         return adj;
4580     }
4581
4582   return NULL;
4583 }
4584
4585 /* If OLD_NAME, which is being defined by statement STMT, is an SSA_NAME of a
4586    parameter which is to be removed because its value is not used, create a new
4587    SSA_NAME relating to a replacement VAR_DECL, replace all uses of the
4588    original with it and return it.  If there is no need to re-map, return NULL.
4589    ADJUSTMENTS is a pointer to a vector of IPA-SRA adjustments.  */
4590
4591 static tree
4592 replace_removed_params_ssa_names (tree old_name, gimple stmt,
4593                                   ipa_parm_adjustment_vec adjustments)
4594 {
4595   struct ipa_parm_adjustment *adj;
4596   tree decl, repl, new_name;
4597
4598   if (TREE_CODE (old_name) != SSA_NAME)
4599     return NULL;
4600
4601   decl = SSA_NAME_VAR (old_name);
4602   if (decl == NULL_TREE
4603       || TREE_CODE (decl) != PARM_DECL)
4604     return NULL;
4605
4606   adj = get_adjustment_for_base (adjustments, decl);
4607   if (!adj)
4608     return NULL;
4609
4610   repl = get_replaced_param_substitute (adj);
4611   new_name = make_ssa_name (repl, stmt);
4612   SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name)
4613     = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (old_name);
4614
4615   if (dump_file)
4616     {
4617       fprintf (dump_file, "replacing an SSA name of a removed param ");
4618       print_generic_expr (dump_file, old_name, 0);
4619       fprintf (dump_file, " with ");
4620       print_generic_expr (dump_file, new_name, 0);
4621       fprintf (dump_file, "\n");
4622     }
4623
4624   replace_uses_by (old_name, new_name);
4625   return new_name;
4626 }
4627
4628 /* If the statement STMT contains any expressions that need to replaced with a
4629    different one as noted by ADJUSTMENTS, do so.  Handle any potential type
4630    incompatibilities (GSI is used to accommodate conversion statements and must
4631    point to the statement).  Return true iff the statement was modified.  */
4632
4633 static bool
4634 sra_ipa_modify_assign (gimple stmt, gimple_stmt_iterator *gsi,
4635                        ipa_parm_adjustment_vec adjustments)
4636 {
4637   tree *lhs_p, *rhs_p;
4638   bool any;
4639
4640   if (!gimple_assign_single_p (stmt))
4641     return false;
4642
4643   rhs_p = gimple_assign_rhs1_ptr (stmt);
4644   lhs_p = gimple_assign_lhs_ptr (stmt);
4645
4646   any = ipa_modify_expr (rhs_p, false, adjustments);
4647   any |= ipa_modify_expr (lhs_p, false, adjustments);
4648   if (any)
4649     {
4650       tree new_rhs = NULL_TREE;
4651
4652       if (!useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
4653         {
4654           if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
4655             {
4656               /* V_C_Es of constructors can cause trouble (PR 42714).  */
4657               if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
4658                 *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
4659               else
4660                 *rhs_p = build_constructor (TREE_TYPE (*lhs_p),
4661                                             NULL);
4662             }
4663           else
4664             new_rhs = fold_build1_loc (gimple_location (stmt),
4665                                        VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
4666                                        *rhs_p);
4667         }
4668       else if (REFERENCE_CLASS_P (*rhs_p)
4669                && is_gimple_reg_type (TREE_TYPE (*lhs_p))
4670                && !is_gimple_reg (*lhs_p))
4671         /* This can happen when an assignment in between two single field
4672            structures is turned into an assignment in between two pointers to
4673            scalars (PR 42237).  */
4674         new_rhs = *rhs_p;
4675
4676       if (new_rhs)
4677         {
4678           tree tmp = force_gimple_operand_gsi (gsi, new_rhs, true, NULL_TREE,
4679                                                true, GSI_SAME_STMT);
4680
4681           gimple_assign_set_rhs_from_tree (gsi, tmp);
4682         }
4683
4684       return true;
4685     }
4686
4687   return false;
4688 }
4689
4690 /* Traverse the function body and all modifications as described in
4691    ADJUSTMENTS.  Return true iff the CFG has been changed.  */
4692
4693 bool
4694 ipa_sra_modify_function_body (ipa_parm_adjustment_vec adjustments)
4695 {
4696   bool cfg_changed = false;
4697   basic_block bb;
4698
4699   FOR_EACH_BB_FN (bb, cfun)
4700     {
4701       gimple_stmt_iterator gsi;
4702
4703       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4704         {
4705           gphi *phi = as_a <gphi *> (gsi_stmt (gsi));
4706           tree new_lhs, old_lhs = gimple_phi_result (phi);
4707           new_lhs = replace_removed_params_ssa_names (old_lhs, phi, adjustments);
4708           if (new_lhs)
4709             {
4710               gimple_phi_set_result (phi, new_lhs);
4711               release_ssa_name (old_lhs);
4712             }
4713         }
4714
4715       gsi = gsi_start_bb (bb);
4716       while (!gsi_end_p (gsi))
4717         {
4718           gimple stmt = gsi_stmt (gsi);
4719           bool modified = false;
4720           tree *t;
4721           unsigned i;
4722
4723           switch (gimple_code (stmt))
4724             {
4725             case GIMPLE_RETURN:
4726               t = gimple_return_retval_ptr (as_a <greturn *> (stmt));
4727               if (*t != NULL_TREE)
4728                 modified |= ipa_modify_expr (t, true, adjustments);
4729               break;
4730
4731             case GIMPLE_ASSIGN:
4732               modified |= sra_ipa_modify_assign (stmt, &gsi, adjustments);
4733               break;
4734
4735             case GIMPLE_CALL:
4736               /* Operands must be processed before the lhs.  */
4737               for (i = 0; i < gimple_call_num_args (stmt); i++)
4738                 {
4739                   t = gimple_call_arg_ptr (stmt, i);
4740                   modified |= ipa_modify_expr (t, true, adjustments);
4741                 }
4742
4743               if (gimple_call_lhs (stmt))
4744                 {
4745                   t = gimple_call_lhs_ptr (stmt);
4746                   modified |= ipa_modify_expr (t, false, adjustments);
4747                 }
4748               break;
4749
4750             case GIMPLE_ASM:
4751               {
4752                 gasm *asm_stmt = as_a <gasm *> (stmt);
4753                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
4754                   {
4755                     t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
4756                     modified |= ipa_modify_expr (t, true, adjustments);
4757                   }
4758                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
4759                   {
4760                     t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
4761                     modified |= ipa_modify_expr (t, false, adjustments);
4762                   }
4763               }
4764               break;
4765
4766             default:
4767               break;
4768             }
4769
4770           def_operand_p defp;
4771           ssa_op_iter iter;
4772           FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF)
4773             {
4774               tree old_def = DEF_FROM_PTR (defp);
4775               if (tree new_def = replace_removed_params_ssa_names (old_def, stmt,
4776                                                                    adjustments))
4777                 {
4778                   SET_DEF (defp, new_def);
4779                   release_ssa_name (old_def);
4780                   modified = true;
4781                 }
4782             }
4783
4784           if (modified)
4785             {
4786               update_stmt (stmt);
4787               if (maybe_clean_eh_stmt (stmt)
4788                   && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
4789                 cfg_changed = true;
4790             }
4791           gsi_next (&gsi);
4792         }
4793     }
4794
4795   return cfg_changed;
4796 }
4797
4798 /* Call gimple_debug_bind_reset_value on all debug statements describing
4799    gimple register parameters that are being removed or replaced.  */
4800
4801 static void
4802 sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments)
4803 {
4804   int i, len;
4805   gimple_stmt_iterator *gsip = NULL, gsi;
4806
4807   if (MAY_HAVE_DEBUG_STMTS && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
4808     {
4809       gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
4810       gsip = &gsi;
4811     }
4812   len = adjustments.length ();
4813   for (i = 0; i < len; i++)
4814     {
4815       struct ipa_parm_adjustment *adj;
4816       imm_use_iterator ui;
4817       gimple stmt;
4818       gdebug *def_temp;
4819       tree name, vexpr, copy = NULL_TREE;
4820       use_operand_p use_p;
4821
4822       adj = &adjustments[i];
4823       if (adj->op == IPA_PARM_OP_COPY || !is_gimple_reg (adj->base))
4824         continue;
4825       name = ssa_default_def (cfun, adj->base);
4826       vexpr = NULL;
4827       if (name)
4828         FOR_EACH_IMM_USE_STMT (stmt, ui, name)
4829           {
4830             if (gimple_clobber_p (stmt))
4831               {
4832                 gimple_stmt_iterator cgsi = gsi_for_stmt (stmt);
4833                 unlink_stmt_vdef (stmt);
4834                 gsi_remove (&cgsi, true);
4835                 release_defs (stmt);
4836                 continue;
4837               }
4838             /* All other users must have been removed by
4839                ipa_sra_modify_function_body.  */
4840             gcc_assert (is_gimple_debug (stmt));
4841             if (vexpr == NULL && gsip != NULL)
4842               {
4843                 gcc_assert (TREE_CODE (adj->base) == PARM_DECL);
4844                 vexpr = make_node (DEBUG_EXPR_DECL);
4845                 def_temp = gimple_build_debug_source_bind (vexpr, adj->base,
4846                                                            NULL);
4847                 DECL_ARTIFICIAL (vexpr) = 1;
4848                 TREE_TYPE (vexpr) = TREE_TYPE (name);
4849                 DECL_MODE (vexpr) = DECL_MODE (adj->base);
4850                 gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
4851               }
4852             if (vexpr)
4853               {
4854                 FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
4855                   SET_USE (use_p, vexpr);
4856               }
4857             else
4858               gimple_debug_bind_reset_value (stmt);
4859             update_stmt (stmt);
4860           }
4861       /* Create a VAR_DECL for debug info purposes.  */
4862       if (!DECL_IGNORED_P (adj->base))
4863         {
4864           copy = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
4865                              VAR_DECL, DECL_NAME (adj->base),
4866                              TREE_TYPE (adj->base));
4867           if (DECL_PT_UID_SET_P (adj->base))
4868             SET_DECL_PT_UID (copy, DECL_PT_UID (adj->base));
4869           TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (adj->base);
4870           TREE_READONLY (copy) = TREE_READONLY (adj->base);
4871           TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (adj->base);
4872           DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (adj->base);
4873           DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (adj->base);
4874           DECL_IGNORED_P (copy) = DECL_IGNORED_P (adj->base);
4875           DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (adj->base);
4876           DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
4877           SET_DECL_RTL (copy, 0);
4878           TREE_USED (copy) = 1;
4879           DECL_CONTEXT (copy) = current_function_decl;
4880           add_local_decl (cfun, copy);
4881           DECL_CHAIN (copy) =
4882             BLOCK_VARS (DECL_INITIAL (current_function_decl));
4883           BLOCK_VARS (DECL_INITIAL (current_function_decl)) = copy;
4884         }
4885       if (gsip != NULL && copy && target_for_debug_bind (adj->base))
4886         {
4887           gcc_assert (TREE_CODE (adj->base) == PARM_DECL);
4888           if (vexpr)
4889             def_temp = gimple_build_debug_bind (copy, vexpr, NULL);
4890           else
4891             def_temp = gimple_build_debug_source_bind (copy, adj->base,
4892                                                        NULL);
4893           gsi_insert_before (gsip, def_temp, GSI_SAME_STMT);
4894         }
4895     }
4896 }
4897
4898 /* Return false if all callers have at least as many actual arguments as there
4899    are formal parameters in the current function and that their types
4900    match.  */
4901
4902 static bool
4903 some_callers_have_mismatched_arguments_p (struct cgraph_node *node,
4904                                           void *data ATTRIBUTE_UNUSED)
4905 {
4906   struct cgraph_edge *cs;
4907   for (cs = node->callers; cs; cs = cs->next_caller)
4908     if (!cs->call_stmt || !callsite_arguments_match_p (cs->call_stmt))
4909       return true;
4910
4911   return false;
4912 }
4913
4914 /* Return false if all callers have vuse attached to a call statement.  */
4915
4916 static bool
4917 some_callers_have_no_vuse_p (struct cgraph_node *node,
4918                              void *data ATTRIBUTE_UNUSED)
4919 {
4920   struct cgraph_edge *cs;
4921   for (cs = node->callers; cs; cs = cs->next_caller)
4922     if (!cs->call_stmt || !gimple_vuse (cs->call_stmt))
4923       return true;
4924
4925   return false;
4926 }
4927
4928 /* Convert all callers of NODE.  */
4929
4930 static bool
4931 convert_callers_for_node (struct cgraph_node *node,
4932                           void *data)
4933 {
4934   ipa_parm_adjustment_vec *adjustments = (ipa_parm_adjustment_vec *) data;
4935   bitmap recomputed_callers = BITMAP_ALLOC (NULL);
4936   struct cgraph_edge *cs;
4937
4938   for (cs = node->callers; cs; cs = cs->next_caller)
4939     {
4940       push_cfun (DECL_STRUCT_FUNCTION (cs->caller->decl));
4941
4942       if (dump_file)
4943         fprintf (dump_file, "Adjusting call %s/%i -> %s/%i\n",
4944                  xstrdup (cs->caller->name ()),
4945                  cs->caller->order,
4946                  xstrdup (cs->callee->name ()),
4947                  cs->callee->order);
4948
4949       ipa_modify_call_arguments (cs, cs->call_stmt, *adjustments);
4950
4951       pop_cfun ();
4952     }
4953
4954   for (cs = node->callers; cs; cs = cs->next_caller)
4955     if (bitmap_set_bit (recomputed_callers, cs->caller->uid)
4956         && gimple_in_ssa_p (DECL_STRUCT_FUNCTION (cs->caller->decl)))
4957       compute_inline_parameters (cs->caller, true);
4958   BITMAP_FREE (recomputed_callers);
4959
4960   return true;
4961 }
4962
4963 /* Convert all callers of NODE to pass parameters as given in ADJUSTMENTS.  */
4964
4965 static void
4966 convert_callers (struct cgraph_node *node, tree old_decl,
4967                  ipa_parm_adjustment_vec adjustments)
4968 {
4969   basic_block this_block;
4970
4971   node->call_for_symbol_and_aliases (convert_callers_for_node,
4972                                      &adjustments, false);
4973
4974   if (!encountered_recursive_call)
4975     return;
4976
4977   FOR_EACH_BB_FN (this_block, cfun)
4978     {
4979       gimple_stmt_iterator gsi;
4980
4981       for (gsi = gsi_start_bb (this_block); !gsi_end_p (gsi); gsi_next (&gsi))
4982         {
4983           gcall *stmt;
4984           tree call_fndecl;
4985           stmt = dyn_cast <gcall *> (gsi_stmt (gsi));
4986           if (!stmt)
4987             continue;
4988           call_fndecl = gimple_call_fndecl (stmt);
4989           if (call_fndecl == old_decl)
4990             {
4991               if (dump_file)
4992                 fprintf (dump_file, "Adjusting recursive call");
4993               gimple_call_set_fndecl (stmt, node->decl);
4994               ipa_modify_call_arguments (NULL, stmt, adjustments);
4995             }
4996         }
4997     }
4998
4999   return;
5000 }
5001
5002 /* Perform all the modification required in IPA-SRA for NODE to have parameters
5003    as given in ADJUSTMENTS.  Return true iff the CFG has been changed.  */
5004
5005 static bool
5006 modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
5007 {
5008   struct cgraph_node *new_node;
5009   bool cfg_changed;
5010
5011   cgraph_edge::rebuild_edges ();
5012   free_dominance_info (CDI_DOMINATORS);
5013   pop_cfun ();
5014
5015   /* This must be done after rebuilding cgraph edges for node above.
5016      Otherwise any recursive calls to node that are recorded in
5017      redirect_callers will be corrupted.  */
5018   vec<cgraph_edge *> redirect_callers = node->collect_callers ();
5019   new_node = node->create_version_clone_with_body (redirect_callers, NULL,
5020                                                    NULL, false, NULL, NULL,
5021                                                    "isra");
5022   redirect_callers.release ();
5023
5024   push_cfun (DECL_STRUCT_FUNCTION (new_node->decl));
5025   ipa_modify_formal_parameters (current_function_decl, adjustments);
5026   cfg_changed = ipa_sra_modify_function_body (adjustments);
5027   sra_ipa_reset_debug_stmts (adjustments);
5028   convert_callers (new_node, node->decl, adjustments);
5029   new_node->make_local ();
5030   return cfg_changed;
5031 }
5032
5033 /* Means of communication between ipa_sra_check_caller and
5034    ipa_sra_preliminary_function_checks.  */
5035
5036 struct ipa_sra_check_caller_data
5037 {
5038   bool has_callers;
5039   bool bad_arg_alignment;
5040   bool has_thunk;
5041 };
5042
5043 /* If NODE has a caller, mark that fact in DATA which is pointer to
5044    ipa_sra_check_caller_data.  Also check all aggregate arguments in all known
5045    calls if they are unit aligned and if not, set the appropriate flag in DATA
5046    too. */
5047
5048 static bool
5049 ipa_sra_check_caller (struct cgraph_node *node, void *data)
5050 {
5051   if (!node->callers)
5052     return false;
5053
5054   struct ipa_sra_check_caller_data *iscc;
5055   iscc = (struct ipa_sra_check_caller_data *) data;
5056   iscc->has_callers = true;
5057
5058   for (cgraph_edge *cs = node->callers; cs; cs = cs->next_caller)
5059     {
5060       if (cs->caller->thunk.thunk_p)
5061         {
5062           iscc->has_thunk = true;
5063           return true;
5064         }
5065       gimple call_stmt = cs->call_stmt;
5066       unsigned count = gimple_call_num_args (call_stmt);
5067       for (unsigned i = 0; i < count; i++)
5068         {
5069           tree arg = gimple_call_arg (call_stmt, i);
5070           if (is_gimple_reg (arg))
5071               continue;
5072
5073           tree offset;
5074           HOST_WIDE_INT bitsize, bitpos;
5075           machine_mode mode;
5076           int unsignedp, volatilep = 0;
5077           get_inner_reference (arg, &bitsize, &bitpos, &offset, &mode,
5078                                &unsignedp, &volatilep, false);
5079           if (bitpos % BITS_PER_UNIT)
5080             {
5081               iscc->bad_arg_alignment = true;
5082               return true;
5083             }
5084         }
5085     }
5086
5087   return false;
5088 }
5089
5090 /* Return false the function is apparently unsuitable for IPA-SRA based on it's
5091    attributes, return true otherwise.  NODE is the cgraph node of the current
5092    function.  */
5093
5094 static bool
5095 ipa_sra_preliminary_function_checks (struct cgraph_node *node)
5096 {
5097   if (!node->can_be_local_p ())
5098     {
5099       if (dump_file)
5100         fprintf (dump_file, "Function not local to this compilation unit.\n");
5101       return false;
5102     }
5103
5104   if (!node->local.can_change_signature)
5105     {
5106       if (dump_file)
5107         fprintf (dump_file, "Function can not change signature.\n");
5108       return false;
5109     }
5110
5111   if (!tree_versionable_function_p (node->decl))
5112     {
5113       if (dump_file)
5114         fprintf (dump_file, "Function is not versionable.\n");
5115       return false;
5116     }
5117
5118   if (!opt_for_fn (node->decl, optimize)
5119       || !opt_for_fn (node->decl, flag_ipa_sra))
5120     {
5121       if (dump_file)
5122         fprintf (dump_file, "Function not optimized.\n");
5123       return false;
5124     }
5125
5126   if (DECL_VIRTUAL_P (current_function_decl))
5127     {
5128       if (dump_file)
5129         fprintf (dump_file, "Function is a virtual method.\n");
5130       return false;
5131     }
5132
5133   if ((DECL_ONE_ONLY (node->decl) || DECL_EXTERNAL (node->decl))
5134       && inline_summaries->get (node)->size >= MAX_INLINE_INSNS_AUTO)
5135     {
5136       if (dump_file)
5137         fprintf (dump_file, "Function too big to be made truly local.\n");
5138       return false;
5139     }
5140
5141   if (cfun->stdarg)
5142     {
5143       if (dump_file)
5144         fprintf (dump_file, "Function uses stdarg. \n");
5145       return false;
5146     }
5147
5148   if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
5149     return false;
5150
5151   if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
5152     {
5153       if (dump_file)
5154         fprintf (dump_file, "Always inline function will be inlined "
5155                  "anyway. \n");
5156       return false;
5157     }
5158
5159   struct ipa_sra_check_caller_data iscc;
5160   memset (&iscc, 0, sizeof(iscc));
5161   node->call_for_symbol_and_aliases (ipa_sra_check_caller, &iscc, true);
5162   if (!iscc.has_callers)
5163     {
5164       if (dump_file)
5165         fprintf (dump_file,
5166                  "Function has no callers in this compilation unit.\n");
5167       return false;
5168     }
5169
5170   if (iscc.bad_arg_alignment)
5171     {
5172       if (dump_file)
5173         fprintf (dump_file,
5174                  "A function call has an argument with non-unit alignment.\n");
5175       return false;
5176     }
5177
5178   if (iscc.has_thunk)
5179     {
5180       if (dump_file)
5181         fprintf (dump_file,
5182                  "A has thunk.\n");
5183       return false;
5184     }
5185
5186   return true;
5187 }
5188
5189 /* Perform early interprocedural SRA.  */
5190
5191 static unsigned int
5192 ipa_early_sra (void)
5193 {
5194   struct cgraph_node *node = cgraph_node::get (current_function_decl);
5195   ipa_parm_adjustment_vec adjustments;
5196   int ret = 0;
5197
5198   if (!ipa_sra_preliminary_function_checks (node))
5199     return 0;
5200
5201   sra_initialize ();
5202   sra_mode = SRA_MODE_EARLY_IPA;
5203
5204   if (!find_param_candidates ())
5205     {
5206       if (dump_file)
5207         fprintf (dump_file, "Function has no IPA-SRA candidates.\n");
5208       goto simple_out;
5209     }
5210
5211   if (node->call_for_symbol_and_aliases
5212        (some_callers_have_mismatched_arguments_p, NULL, true))
5213     {
5214       if (dump_file)
5215         fprintf (dump_file, "There are callers with insufficient number of "
5216                  "arguments or arguments with type mismatches.\n");
5217       goto simple_out;
5218     }
5219
5220   if (node->call_for_symbol_and_aliases
5221        (some_callers_have_no_vuse_p, NULL, true))
5222     {
5223       if (dump_file)
5224         fprintf (dump_file, "There are callers with no VUSE attached "
5225                  "to a call stmt.\n");
5226       goto simple_out;
5227     }
5228
5229   bb_dereferences = XCNEWVEC (HOST_WIDE_INT,
5230                                  func_param_count
5231                                  * last_basic_block_for_fn (cfun));
5232   final_bbs = BITMAP_ALLOC (NULL);
5233
5234   scan_function ();
5235   if (encountered_apply_args)
5236     {
5237       if (dump_file)
5238         fprintf (dump_file, "Function calls  __builtin_apply_args().\n");
5239       goto out;
5240     }
5241
5242   if (encountered_unchangable_recursive_call)
5243     {
5244       if (dump_file)
5245         fprintf (dump_file, "Function calls itself with insufficient "
5246                  "number of arguments.\n");
5247       goto out;
5248     }
5249
5250   adjustments = analyze_all_param_acesses ();
5251   if (!adjustments.exists ())
5252     goto out;
5253   if (dump_file)
5254     ipa_dump_param_adjustments (dump_file, adjustments, current_function_decl);
5255
5256   if (modify_function (node, adjustments))
5257     ret = TODO_update_ssa | TODO_cleanup_cfg;
5258   else
5259     ret = TODO_update_ssa;
5260   adjustments.release ();
5261
5262   statistics_counter_event (cfun, "Unused parameters deleted",
5263                             sra_stats.deleted_unused_parameters);
5264   statistics_counter_event (cfun, "Scalar parameters converted to by-value",
5265                             sra_stats.scalar_by_ref_to_by_val);
5266   statistics_counter_event (cfun, "Aggregate parameters broken up",
5267                             sra_stats.aggregate_params_reduced);
5268   statistics_counter_event (cfun, "Aggregate parameter components created",
5269                             sra_stats.param_reductions_created);
5270
5271  out:
5272   BITMAP_FREE (final_bbs);
5273   free (bb_dereferences);
5274  simple_out:
5275   sra_deinitialize ();
5276   return ret;
5277 }
5278
5279 namespace {
5280
5281 const pass_data pass_data_early_ipa_sra =
5282 {
5283   GIMPLE_PASS, /* type */
5284   "eipa_sra", /* name */
5285   OPTGROUP_NONE, /* optinfo_flags */
5286   TV_IPA_SRA, /* tv_id */
5287   0, /* properties_required */
5288   0, /* properties_provided */
5289   0, /* properties_destroyed */
5290   0, /* todo_flags_start */
5291   TODO_dump_symtab, /* todo_flags_finish */
5292 };
5293
5294 class pass_early_ipa_sra : public gimple_opt_pass
5295 {
5296 public:
5297   pass_early_ipa_sra (gcc::context *ctxt)
5298     : gimple_opt_pass (pass_data_early_ipa_sra, ctxt)
5299   {}
5300
5301   /* opt_pass methods: */
5302   virtual bool gate (function *) { return flag_ipa_sra && dbg_cnt (eipa_sra); }
5303   virtual unsigned int execute (function *) { return ipa_early_sra (); }
5304
5305 }; // class pass_early_ipa_sra
5306
5307 } // anon namespace
5308
5309 gimple_opt_pass *
5310 make_pass_early_ipa_sra (gcc::context *ctxt)
5311 {
5312   return new pass_early_ipa_sra (ctxt);
5313 }