OSDN Git Service

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