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