OSDN Git Service

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