OSDN Git Service

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