OSDN Git Service

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