OSDN Git Service

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