OSDN Git Service

gcc/
[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                                   build_zero_cst (access->type));
2328       if (insert_after)
2329         gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2330       else
2331         gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2332       update_stmt (stmt);
2333       gimple_set_location (stmt, loc);
2334     }
2335
2336   for (child = access->first_child; child; child = child->next_sibling)
2337     init_subtree_with_zero (child, gsi, insert_after, loc);
2338 }
2339
2340 /* Search for an access representative for the given expression EXPR and
2341    return it or NULL if it cannot be found.  */
2342
2343 static struct access *
2344 get_access_for_expr (tree expr)
2345 {
2346   HOST_WIDE_INT offset, size, max_size;
2347   tree base;
2348
2349   /* FIXME: This should not be necessary but Ada produces V_C_Es with a type of
2350      a different size than the size of its argument and we need the latter
2351      one.  */
2352   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
2353     expr = TREE_OPERAND (expr, 0);
2354
2355   base = get_ref_base_and_extent (expr, &offset, &size, &max_size);
2356   if (max_size == -1 || !DECL_P (base))
2357     return NULL;
2358
2359   if (!bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
2360     return NULL;
2361
2362   return get_var_base_offset_size_access (base, offset, max_size);
2363 }
2364
2365 /* Replace the expression EXPR with a scalar replacement if there is one and
2366    generate other statements to do type conversion or subtree copying if
2367    necessary.  GSI is used to place newly created statements, WRITE is true if
2368    the expression is being written to (it is on a LHS of a statement or output
2369    in an assembly statement).  */
2370
2371 static bool
2372 sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, bool write)
2373 {
2374   location_t loc;
2375   struct access *access;
2376   tree type, bfr;
2377
2378   if (TREE_CODE (*expr) == BIT_FIELD_REF)
2379     {
2380       bfr = *expr;
2381       expr = &TREE_OPERAND (*expr, 0);
2382     }
2383   else
2384     bfr = NULL_TREE;
2385
2386   if (TREE_CODE (*expr) == REALPART_EXPR || TREE_CODE (*expr) == IMAGPART_EXPR)
2387     expr = &TREE_OPERAND (*expr, 0);
2388   access = get_access_for_expr (*expr);
2389   if (!access)
2390     return false;
2391   type = TREE_TYPE (*expr);
2392
2393   loc = gimple_location (gsi_stmt (*gsi));
2394   if (access->grp_to_be_replaced)
2395     {
2396       tree repl = get_access_replacement (access);
2397       /* If we replace a non-register typed access simply use the original
2398          access expression to extract the scalar component afterwards.
2399          This happens if scalarizing a function return value or parameter
2400          like in gcc.c-torture/execute/20041124-1.c, 20050316-1.c and
2401          gcc.c-torture/compile/20011217-1.c.
2402
2403          We also want to use this when accessing a complex or vector which can
2404          be accessed as a different type too, potentially creating a need for
2405          type conversion (see PR42196) and when scalarized unions are involved
2406          in assembler statements (see PR42398).  */
2407       if (!useless_type_conversion_p (type, access->type))
2408         {
2409           tree ref;
2410
2411           ref = build_ref_for_model (loc, access->base, access->offset, access,
2412                                      NULL, false);
2413
2414           if (write)
2415             {
2416               gimple stmt;
2417
2418               if (access->grp_partial_lhs)
2419                 ref = force_gimple_operand_gsi (gsi, ref, true, NULL_TREE,
2420                                                  false, GSI_NEW_STMT);
2421               stmt = gimple_build_assign (repl, ref);
2422               gimple_set_location (stmt, loc);
2423               gsi_insert_after (gsi, stmt, GSI_NEW_STMT);
2424             }
2425           else
2426             {
2427               gimple stmt;
2428
2429               if (access->grp_partial_lhs)
2430                 repl = force_gimple_operand_gsi (gsi, repl, true, NULL_TREE,
2431                                                  true, GSI_SAME_STMT);
2432               stmt = gimple_build_assign (ref, repl);
2433               gimple_set_location (stmt, loc);
2434               gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
2435             }
2436         }
2437       else
2438         *expr = repl;
2439       sra_stats.exprs++;
2440     }
2441
2442   if (access->first_child)
2443     {
2444       HOST_WIDE_INT start_offset, chunk_size;
2445       if (bfr
2446           && host_integerp (TREE_OPERAND (bfr, 1), 1)
2447           && host_integerp (TREE_OPERAND (bfr, 2), 1))
2448         {
2449           chunk_size = tree_low_cst (TREE_OPERAND (bfr, 1), 1);
2450           start_offset = access->offset
2451             + tree_low_cst (TREE_OPERAND (bfr, 2), 1);
2452         }
2453       else
2454         start_offset = chunk_size = 0;
2455
2456       generate_subtree_copies (access->first_child, access->base, 0,
2457                                start_offset, chunk_size, gsi, write, write,
2458                                loc);
2459     }
2460   return true;
2461 }
2462
2463 /* Where scalar replacements of the RHS have been written to when a replacement
2464    of a LHS of an assigments cannot be direclty loaded from a replacement of
2465    the RHS. */
2466 enum unscalarized_data_handling { SRA_UDH_NONE,  /* Nothing done so far. */
2467                                   SRA_UDH_RIGHT, /* Data flushed to the RHS. */
2468                                   SRA_UDH_LEFT }; /* Data flushed to the LHS. */
2469
2470 /* Store all replacements in the access tree rooted in TOP_RACC either to their
2471    base aggregate if there are unscalarized data or directly to LHS of the
2472    statement that is pointed to by GSI otherwise.  */
2473
2474 static enum unscalarized_data_handling
2475 handle_unscalarized_data_in_subtree (struct access *top_racc,
2476                                      gimple_stmt_iterator *gsi)
2477 {
2478   if (top_racc->grp_unscalarized_data)
2479     {
2480       generate_subtree_copies (top_racc->first_child, top_racc->base, 0, 0, 0,
2481                                gsi, false, false,
2482                                gimple_location (gsi_stmt (*gsi)));
2483       return SRA_UDH_RIGHT;
2484     }
2485   else
2486     {
2487       tree lhs = gimple_assign_lhs (gsi_stmt (*gsi));
2488       generate_subtree_copies (top_racc->first_child, lhs, top_racc->offset,
2489                                0, 0, gsi, false, false,
2490                                gimple_location (gsi_stmt (*gsi)));
2491       return SRA_UDH_LEFT;
2492     }
2493 }
2494
2495
2496 /* Try to generate statements to load all sub-replacements in an access subtree
2497    formed by children of LACC from scalar replacements in the TOP_RACC subtree.
2498    If that is not possible, refresh the TOP_RACC base aggregate and load the
2499    accesses from it.  LEFT_OFFSET is the offset of the left whole subtree being
2500    copied. NEW_GSI is stmt iterator used for statement insertions after the
2501    original assignment, OLD_GSI is used to insert statements before the
2502    assignment.  *REFRESHED keeps the information whether we have needed to
2503    refresh replacements of the LHS and from which side of the assignments this
2504    takes place.  */
2505
2506 static void
2507 load_assign_lhs_subreplacements (struct access *lacc, struct access *top_racc,
2508                                  HOST_WIDE_INT left_offset,
2509                                  gimple_stmt_iterator *old_gsi,
2510                                  gimple_stmt_iterator *new_gsi,
2511                                  enum unscalarized_data_handling *refreshed)
2512 {
2513   location_t loc = gimple_location (gsi_stmt (*old_gsi));
2514   for (lacc = lacc->first_child; lacc; lacc = lacc->next_sibling)
2515     {
2516       if (lacc->grp_to_be_replaced)
2517         {
2518           struct access *racc;
2519           HOST_WIDE_INT offset = lacc->offset - left_offset + top_racc->offset;
2520           gimple stmt;
2521           tree rhs;
2522
2523           racc = find_access_in_subtree (top_racc, offset, lacc->size);
2524           if (racc && racc->grp_to_be_replaced)
2525             {
2526               rhs = get_access_replacement (racc);
2527               if (!useless_type_conversion_p (lacc->type, racc->type))
2528                 rhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR, lacc->type, rhs);
2529             }
2530           else
2531             {
2532               /* No suitable access on the right hand side, need to load from
2533                  the aggregate.  See if we have to update it first... */
2534               if (*refreshed == SRA_UDH_NONE)
2535                 *refreshed = handle_unscalarized_data_in_subtree (top_racc,
2536                                                                   old_gsi);
2537
2538               if (*refreshed == SRA_UDH_LEFT)
2539                 rhs = build_ref_for_model (loc, lacc->base, lacc->offset, lacc,
2540                                             new_gsi, true);
2541               else
2542                 rhs = build_ref_for_model (loc, top_racc->base, offset, lacc,
2543                                             new_gsi, true);
2544             }
2545
2546           stmt = gimple_build_assign (get_access_replacement (lacc), rhs);
2547           gsi_insert_after (new_gsi, stmt, GSI_NEW_STMT);
2548           gimple_set_location (stmt, loc);
2549           update_stmt (stmt);
2550           sra_stats.subreplacements++;
2551         }
2552       else if (*refreshed == SRA_UDH_NONE
2553                && lacc->grp_read && !lacc->grp_covered)
2554         *refreshed = handle_unscalarized_data_in_subtree (top_racc,
2555                                                           old_gsi);
2556
2557       if (lacc->first_child)
2558         load_assign_lhs_subreplacements (lacc, top_racc, left_offset,
2559                                          old_gsi, new_gsi, refreshed);
2560     }
2561 }
2562
2563 /* Result code for SRA assignment modification.  */
2564 enum assignment_mod_result { SRA_AM_NONE,       /* nothing done for the stmt */
2565                              SRA_AM_MODIFIED,  /* stmt changed but not
2566                                                   removed */
2567                              SRA_AM_REMOVED };  /* stmt eliminated */
2568
2569 /* Modify assignments with a CONSTRUCTOR on their RHS.  STMT contains a pointer
2570    to the assignment and GSI is the statement iterator pointing at it.  Returns
2571    the same values as sra_modify_assign.  */
2572
2573 static enum assignment_mod_result
2574 sra_modify_constructor_assign (gimple *stmt, gimple_stmt_iterator *gsi)
2575 {
2576   tree lhs = gimple_assign_lhs (*stmt);
2577   struct access *acc;
2578   location_t loc;
2579
2580   acc = get_access_for_expr (lhs);
2581   if (!acc)
2582     return SRA_AM_NONE;
2583
2584   loc = gimple_location (*stmt);
2585   if (VEC_length (constructor_elt,
2586                   CONSTRUCTOR_ELTS (gimple_assign_rhs1 (*stmt))) > 0)
2587     {
2588       /* I have never seen this code path trigger but if it can happen the
2589          following should handle it gracefully.  */
2590       if (access_has_children_p (acc))
2591         generate_subtree_copies (acc->first_child, acc->base, 0, 0, 0, gsi,
2592                                  true, true, loc);
2593       return SRA_AM_MODIFIED;
2594     }
2595
2596   if (acc->grp_covered)
2597     {
2598       init_subtree_with_zero (acc, gsi, false, loc);
2599       unlink_stmt_vdef (*stmt);
2600       gsi_remove (gsi, true);
2601       return SRA_AM_REMOVED;
2602     }
2603   else
2604     {
2605       init_subtree_with_zero (acc, gsi, true, loc);
2606       return SRA_AM_MODIFIED;
2607     }
2608 }
2609
2610 /* Create and return a new suitable default definition SSA_NAME for RACC which
2611    is an access describing an uninitialized part of an aggregate that is being
2612    loaded.  */
2613
2614 static tree
2615 get_repl_default_def_ssa_name (struct access *racc)
2616 {
2617   tree repl, decl;
2618
2619   decl = get_unrenamed_access_replacement (racc);
2620
2621   repl = gimple_default_def (cfun, decl);
2622   if (!repl)
2623     {
2624       repl = make_ssa_name (decl, gimple_build_nop ());
2625       set_default_def (decl, repl);
2626     }
2627
2628   return repl;
2629 }
2630
2631 /* Examine both sides of the assignment statement pointed to by STMT, replace
2632    them with a scalare replacement if there is one and generate copying of
2633    replacements if scalarized aggregates have been used in the assignment.  GSI
2634    is used to hold generated statements for type conversions and subtree
2635    copying.  */
2636
2637 static enum assignment_mod_result
2638 sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
2639 {
2640   struct access *lacc, *racc;
2641   tree lhs, rhs;
2642   bool modify_this_stmt = false;
2643   bool force_gimple_rhs = false;
2644   location_t loc;
2645   gimple_stmt_iterator orig_gsi = *gsi;
2646
2647   if (!gimple_assign_single_p (*stmt))
2648     return SRA_AM_NONE;
2649   lhs = gimple_assign_lhs (*stmt);
2650   rhs = gimple_assign_rhs1 (*stmt);
2651
2652   if (TREE_CODE (rhs) == CONSTRUCTOR)
2653     return sra_modify_constructor_assign (stmt, gsi);
2654
2655   if (TREE_CODE (rhs) == REALPART_EXPR || TREE_CODE (lhs) == REALPART_EXPR
2656       || TREE_CODE (rhs) == IMAGPART_EXPR || TREE_CODE (lhs) == IMAGPART_EXPR
2657       || TREE_CODE (rhs) == BIT_FIELD_REF || TREE_CODE (lhs) == BIT_FIELD_REF)
2658     {
2659       modify_this_stmt = sra_modify_expr (gimple_assign_rhs1_ptr (*stmt),
2660                                           gsi, false);
2661       modify_this_stmt |= sra_modify_expr (gimple_assign_lhs_ptr (*stmt),
2662                                            gsi, true);
2663       return modify_this_stmt ? SRA_AM_MODIFIED : SRA_AM_NONE;
2664     }
2665
2666   lacc = get_access_for_expr (lhs);
2667   racc = get_access_for_expr (rhs);
2668   if (!lacc && !racc)
2669     return SRA_AM_NONE;
2670
2671   loc = gimple_location (*stmt);
2672   if (lacc && lacc->grp_to_be_replaced)
2673     {
2674       lhs = get_access_replacement (lacc);
2675       gimple_assign_set_lhs (*stmt, lhs);
2676       modify_this_stmt = true;
2677       if (lacc->grp_partial_lhs)
2678         force_gimple_rhs = true;
2679       sra_stats.exprs++;
2680     }
2681
2682   if (racc && racc->grp_to_be_replaced)
2683     {
2684       rhs = get_access_replacement (racc);
2685       modify_this_stmt = true;
2686       if (racc->grp_partial_lhs)
2687         force_gimple_rhs = true;
2688       sra_stats.exprs++;
2689     }
2690
2691   if (modify_this_stmt)
2692     {
2693       if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
2694         {
2695           /* If we can avoid creating a VIEW_CONVERT_EXPR do so.
2696              ???  This should move to fold_stmt which we simply should
2697              call after building a VIEW_CONVERT_EXPR here.  */
2698           if (AGGREGATE_TYPE_P (TREE_TYPE (lhs))
2699               && !access_has_children_p (lacc))
2700             {
2701               lhs = build_ref_for_offset (loc, lhs, 0, TREE_TYPE (rhs),
2702                                           gsi, false);
2703               gimple_assign_set_lhs (*stmt, lhs);
2704             }
2705           else if (AGGREGATE_TYPE_P (TREE_TYPE (rhs))
2706                    && !contains_view_convert_expr_p (rhs)
2707                    && !access_has_children_p (racc))
2708             rhs = build_ref_for_offset (loc, rhs, 0, TREE_TYPE (lhs),
2709                                         gsi, false);
2710
2711           if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
2712             {
2713               rhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR, TREE_TYPE (lhs),
2714                                      rhs);
2715               if (is_gimple_reg_type (TREE_TYPE (lhs))
2716                   && TREE_CODE (lhs) != SSA_NAME)
2717                 force_gimple_rhs = true;
2718             }
2719         }
2720     }
2721
2722   /* From this point on, the function deals with assignments in between
2723      aggregates when at least one has scalar reductions of some of its
2724      components.  There are three possible scenarios: Both the LHS and RHS have
2725      to-be-scalarized components, 2) only the RHS has or 3) only the LHS has.
2726
2727      In the first case, we would like to load the LHS components from RHS
2728      components whenever possible.  If that is not possible, we would like to
2729      read it directly from the RHS (after updating it by storing in it its own
2730      components).  If there are some necessary unscalarized data in the LHS,
2731      those will be loaded by the original assignment too.  If neither of these
2732      cases happen, the original statement can be removed.  Most of this is done
2733      by load_assign_lhs_subreplacements.
2734
2735      In the second case, we would like to store all RHS scalarized components
2736      directly into LHS and if they cover the aggregate completely, remove the
2737      statement too.  In the third case, we want the LHS components to be loaded
2738      directly from the RHS (DSE will remove the original statement if it
2739      becomes redundant).
2740
2741      This is a bit complex but manageable when types match and when unions do
2742      not cause confusion in a way that we cannot really load a component of LHS
2743      from the RHS or vice versa (the access representing this level can have
2744      subaccesses that are accessible only through a different union field at a
2745      higher level - different from the one used in the examined expression).
2746      Unions are fun.
2747
2748      Therefore, I specially handle a fourth case, happening when there is a
2749      specific type cast or it is impossible to locate a scalarized subaccess on
2750      the other side of the expression.  If that happens, I simply "refresh" the
2751      RHS by storing in it is scalarized components leave the original statement
2752      there to do the copying and then load the scalar replacements of the LHS.
2753      This is what the first branch does.  */
2754
2755   if (gimple_has_volatile_ops (*stmt)
2756       || contains_view_convert_expr_p (rhs)
2757       || contains_view_convert_expr_p (lhs))
2758     {
2759       if (access_has_children_p (racc))
2760         generate_subtree_copies (racc->first_child, racc->base, 0, 0, 0,
2761                                  gsi, false, false, loc);
2762       if (access_has_children_p (lacc))
2763         generate_subtree_copies (lacc->first_child, lacc->base, 0, 0, 0,
2764                                  gsi, true, true, loc);
2765       sra_stats.separate_lhs_rhs_handling++;
2766     }
2767   else
2768     {
2769       if (access_has_children_p (lacc) && access_has_children_p (racc))
2770         {
2771           gimple_stmt_iterator orig_gsi = *gsi;
2772           enum unscalarized_data_handling refreshed;
2773
2774           if (lacc->grp_read && !lacc->grp_covered)
2775             refreshed = handle_unscalarized_data_in_subtree (racc, gsi);
2776           else
2777             refreshed = SRA_UDH_NONE;
2778
2779           load_assign_lhs_subreplacements (lacc, racc, lacc->offset,
2780                                            &orig_gsi, gsi, &refreshed);
2781           if (refreshed != SRA_UDH_RIGHT)
2782             {
2783               gsi_next (gsi);
2784               unlink_stmt_vdef (*stmt);
2785               gsi_remove (&orig_gsi, true);
2786               sra_stats.deleted++;
2787               return SRA_AM_REMOVED;
2788             }
2789         }
2790       else
2791         {
2792           if (racc)
2793             {
2794               if (!racc->grp_to_be_replaced && !racc->grp_unscalarized_data)
2795                 {
2796                   if (dump_file)
2797                     {
2798                       fprintf (dump_file, "Removing load: ");
2799                       print_gimple_stmt (dump_file, *stmt, 0, 0);
2800                     }
2801
2802                   if (TREE_CODE (lhs) == SSA_NAME)
2803                     {
2804                       rhs = get_repl_default_def_ssa_name (racc);
2805                       if (!useless_type_conversion_p (TREE_TYPE (lhs),
2806                                                       TREE_TYPE (rhs)))
2807                         rhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR,
2808                                                TREE_TYPE (lhs), rhs);
2809                     }
2810                   else
2811                     {
2812                       if (racc->first_child)
2813                         generate_subtree_copies (racc->first_child, lhs,
2814                                                  racc->offset, 0, 0, gsi,
2815                                                  false, false, loc);
2816
2817                       gcc_assert (*stmt == gsi_stmt (*gsi));
2818                       unlink_stmt_vdef (*stmt);
2819                       gsi_remove (gsi, true);
2820                       sra_stats.deleted++;
2821                       return SRA_AM_REMOVED;
2822                     }
2823                 }
2824               else if (racc->first_child)
2825                 generate_subtree_copies (racc->first_child, lhs, racc->offset,
2826                                          0, 0, gsi, false, true, loc);
2827             }
2828           if (access_has_children_p (lacc))
2829             generate_subtree_copies (lacc->first_child, rhs, lacc->offset,
2830                                      0, 0, gsi, true, true, loc);
2831         }
2832     }
2833
2834   /* This gimplification must be done after generate_subtree_copies, lest we
2835      insert the subtree copies in the middle of the gimplified sequence.  */
2836   if (force_gimple_rhs)
2837     rhs = force_gimple_operand_gsi (&orig_gsi, rhs, true, NULL_TREE,
2838                                     true, GSI_SAME_STMT);
2839   if (gimple_assign_rhs1 (*stmt) != rhs)
2840     {
2841       modify_this_stmt = true;
2842       gimple_assign_set_rhs_from_tree (&orig_gsi, rhs);
2843       gcc_assert (*stmt == gsi_stmt (orig_gsi));
2844     }
2845
2846   return modify_this_stmt ? SRA_AM_MODIFIED : SRA_AM_NONE;
2847 }
2848
2849 /* Traverse the function body and all modifications as decided in
2850    analyze_all_variable_accesses.  Return true iff the CFG has been
2851    changed.  */
2852
2853 static bool
2854 sra_modify_function_body (void)
2855 {
2856   bool cfg_changed = false;
2857   basic_block bb;
2858
2859   FOR_EACH_BB (bb)
2860     {
2861       gimple_stmt_iterator gsi = gsi_start_bb (bb);
2862       while (!gsi_end_p (gsi))
2863         {
2864           gimple stmt = gsi_stmt (gsi);
2865           enum assignment_mod_result assign_result;
2866           bool modified = false, deleted = false;
2867           tree *t;
2868           unsigned i;
2869
2870           switch (gimple_code (stmt))
2871             {
2872             case GIMPLE_RETURN:
2873               t = gimple_return_retval_ptr (stmt);
2874               if (*t != NULL_TREE)
2875                 modified |= sra_modify_expr (t, &gsi, false);
2876               break;
2877
2878             case GIMPLE_ASSIGN:
2879               assign_result = sra_modify_assign (&stmt, &gsi);
2880               modified |= assign_result == SRA_AM_MODIFIED;
2881               deleted = assign_result == SRA_AM_REMOVED;
2882               break;
2883
2884             case GIMPLE_CALL:
2885               /* Operands must be processed before the lhs.  */
2886               for (i = 0; i < gimple_call_num_args (stmt); i++)
2887                 {
2888                   t = gimple_call_arg_ptr (stmt, i);
2889                   modified |= sra_modify_expr (t, &gsi, false);
2890                 }
2891
2892               if (gimple_call_lhs (stmt))
2893                 {
2894                   t = gimple_call_lhs_ptr (stmt);
2895                   modified |= sra_modify_expr (t, &gsi, true);
2896                 }
2897               break;
2898
2899             case GIMPLE_ASM:
2900               for (i = 0; i < gimple_asm_ninputs (stmt); i++)
2901                 {
2902                   t = &TREE_VALUE (gimple_asm_input_op (stmt, i));
2903                   modified |= sra_modify_expr (t, &gsi, false);
2904                 }
2905               for (i = 0; i < gimple_asm_noutputs (stmt); i++)
2906                 {
2907                   t = &TREE_VALUE (gimple_asm_output_op (stmt, i));
2908                   modified |= sra_modify_expr (t, &gsi, true);
2909                 }
2910               break;
2911
2912             default:
2913               break;
2914             }
2915
2916           if (modified)
2917             {
2918               update_stmt (stmt);
2919               if (maybe_clean_eh_stmt (stmt)
2920                   && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
2921                 cfg_changed = true;
2922             }
2923           if (!deleted)
2924             gsi_next (&gsi);
2925         }
2926     }
2927
2928   return cfg_changed;
2929 }
2930
2931 /* Generate statements initializing scalar replacements of parts of function
2932    parameters.  */
2933
2934 static void
2935 initialize_parameter_reductions (void)
2936 {
2937   gimple_stmt_iterator gsi;
2938   gimple_seq seq = NULL;
2939   tree parm;
2940
2941   for (parm = DECL_ARGUMENTS (current_function_decl);
2942        parm;
2943        parm = DECL_CHAIN (parm))
2944     {
2945       VEC (access_p, heap) *access_vec;
2946       struct access *access;
2947
2948       if (!bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
2949         continue;
2950       access_vec = get_base_access_vector (parm);
2951       if (!access_vec)
2952         continue;
2953
2954       if (!seq)
2955         {
2956           seq = gimple_seq_alloc ();
2957           gsi = gsi_start (seq);
2958         }
2959
2960       for (access = VEC_index (access_p, access_vec, 0);
2961            access;
2962            access = access->next_grp)
2963         generate_subtree_copies (access, parm, 0, 0, 0, &gsi, true, true,
2964                                  EXPR_LOCATION (parm));
2965     }
2966
2967   if (seq)
2968     gsi_insert_seq_on_edge_immediate (single_succ_edge (ENTRY_BLOCK_PTR), seq);
2969 }
2970
2971 /* The "main" function of intraprocedural SRA passes.  Runs the analysis and if
2972    it reveals there are components of some aggregates to be scalarized, it runs
2973    the required transformations.  */
2974 static unsigned int
2975 perform_intra_sra (void)
2976 {
2977   int ret = 0;
2978   sra_initialize ();
2979
2980   if (!find_var_candidates ())
2981     goto out;
2982
2983   if (!scan_function ())
2984     goto out;
2985
2986   if (!analyze_all_variable_accesses ())
2987     goto out;
2988
2989   if (sra_modify_function_body ())
2990     ret = TODO_update_ssa | TODO_cleanup_cfg;
2991   else
2992     ret = TODO_update_ssa;
2993   initialize_parameter_reductions ();
2994
2995   statistics_counter_event (cfun, "Scalar replacements created",
2996                             sra_stats.replacements);
2997   statistics_counter_event (cfun, "Modified expressions", sra_stats.exprs);
2998   statistics_counter_event (cfun, "Subtree copy stmts",
2999                             sra_stats.subtree_copies);
3000   statistics_counter_event (cfun, "Subreplacement stmts",
3001                             sra_stats.subreplacements);
3002   statistics_counter_event (cfun, "Deleted stmts", sra_stats.deleted);
3003   statistics_counter_event (cfun, "Separate LHS and RHS handling",
3004                             sra_stats.separate_lhs_rhs_handling);
3005
3006  out:
3007   sra_deinitialize ();
3008   return ret;
3009 }
3010
3011 /* Perform early intraprocedural SRA.  */
3012 static unsigned int
3013 early_intra_sra (void)
3014 {
3015   sra_mode = SRA_MODE_EARLY_INTRA;
3016   return perform_intra_sra ();
3017 }
3018
3019 /* Perform "late" intraprocedural SRA.  */
3020 static unsigned int
3021 late_intra_sra (void)
3022 {
3023   sra_mode = SRA_MODE_INTRA;
3024   return perform_intra_sra ();
3025 }
3026
3027
3028 static bool
3029 gate_intra_sra (void)
3030 {
3031   return flag_tree_sra != 0 && dbg_cnt (tree_sra);
3032 }
3033
3034
3035 struct gimple_opt_pass pass_sra_early =
3036 {
3037  {
3038   GIMPLE_PASS,
3039   "esra",                               /* name */
3040   gate_intra_sra,                       /* gate */
3041   early_intra_sra,                      /* execute */
3042   NULL,                                 /* sub */
3043   NULL,                                 /* next */
3044   0,                                    /* static_pass_number */
3045   TV_TREE_SRA,                          /* tv_id */
3046   PROP_cfg | PROP_ssa,                  /* properties_required */
3047   0,                                    /* properties_provided */
3048   0,                                    /* properties_destroyed */
3049   0,                                    /* todo_flags_start */
3050   TODO_dump_func
3051   | TODO_update_ssa
3052   | TODO_ggc_collect
3053   | TODO_verify_ssa                     /* todo_flags_finish */
3054  }
3055 };
3056
3057 struct gimple_opt_pass pass_sra =
3058 {
3059  {
3060   GIMPLE_PASS,
3061   "sra",                                /* name */
3062   gate_intra_sra,                       /* gate */
3063   late_intra_sra,                       /* execute */
3064   NULL,                                 /* sub */
3065   NULL,                                 /* next */
3066   0,                                    /* static_pass_number */
3067   TV_TREE_SRA,                          /* tv_id */
3068   PROP_cfg | PROP_ssa,                  /* properties_required */
3069   0,                                    /* properties_provided */
3070   0,                                    /* properties_destroyed */
3071   TODO_update_address_taken,            /* todo_flags_start */
3072   TODO_dump_func
3073   | TODO_update_ssa
3074   | TODO_ggc_collect
3075   | TODO_verify_ssa                     /* todo_flags_finish */
3076  }
3077 };
3078
3079
3080 /* Return true iff PARM (which must be a parm_decl) is an unused scalar
3081    parameter.  */
3082
3083 static bool
3084 is_unused_scalar_param (tree parm)
3085 {
3086   tree name;
3087   return (is_gimple_reg (parm)
3088           && (!(name = gimple_default_def (cfun, parm))
3089               || has_zero_uses (name)));
3090 }
3091
3092 /* Scan immediate uses of a default definition SSA name of a parameter PARM and
3093    examine whether there are any direct or otherwise infeasible ones.  If so,
3094    return true, otherwise return false.  PARM must be a gimple register with a
3095    non-NULL default definition.  */
3096
3097 static bool
3098 ptr_parm_has_direct_uses (tree parm)
3099 {
3100   imm_use_iterator ui;
3101   gimple stmt;
3102   tree name = gimple_default_def (cfun, parm);
3103   bool ret = false;
3104
3105   FOR_EACH_IMM_USE_STMT (stmt, ui, name)
3106     {
3107       int uses_ok = 0;
3108       use_operand_p use_p;
3109
3110       if (is_gimple_debug (stmt))
3111         continue;
3112
3113       /* Valid uses include dereferences on the lhs and the rhs.  */
3114       if (gimple_has_lhs (stmt))
3115         {
3116           tree lhs = gimple_get_lhs (stmt);
3117           while (handled_component_p (lhs))
3118             lhs = TREE_OPERAND (lhs, 0);
3119           if (TREE_CODE (lhs) == MEM_REF
3120               && TREE_OPERAND (lhs, 0) == name
3121               && integer_zerop (TREE_OPERAND (lhs, 1))
3122               && types_compatible_p (TREE_TYPE (lhs),
3123                                      TREE_TYPE (TREE_TYPE (name))))
3124             uses_ok++;
3125         }
3126       if (gimple_assign_single_p (stmt))
3127         {
3128           tree rhs = gimple_assign_rhs1 (stmt);
3129           while (handled_component_p (rhs))
3130             rhs = TREE_OPERAND (rhs, 0);
3131           if (TREE_CODE (rhs) == MEM_REF
3132               && TREE_OPERAND (rhs, 0) == name
3133               && integer_zerop (TREE_OPERAND (rhs, 1))
3134               && types_compatible_p (TREE_TYPE (rhs),
3135                                      TREE_TYPE (TREE_TYPE (name))))
3136             uses_ok++;
3137         }
3138       else if (is_gimple_call (stmt))
3139         {
3140           unsigned i;
3141           for (i = 0; i < gimple_call_num_args (stmt); ++i)
3142             {
3143               tree arg = gimple_call_arg (stmt, i);
3144               while (handled_component_p (arg))
3145                 arg = TREE_OPERAND (arg, 0);
3146               if (TREE_CODE (arg) == MEM_REF
3147                   && TREE_OPERAND (arg, 0) == name
3148                   && integer_zerop (TREE_OPERAND (arg, 1))
3149                   && types_compatible_p (TREE_TYPE (arg),
3150                                          TREE_TYPE (TREE_TYPE (name))))
3151                 uses_ok++;
3152             }
3153         }
3154
3155       /* If the number of valid uses does not match the number of
3156          uses in this stmt there is an unhandled use.  */
3157       FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
3158         --uses_ok;
3159
3160       if (uses_ok != 0)
3161         ret = true;
3162
3163       if (ret)
3164         BREAK_FROM_IMM_USE_STMT (ui);
3165     }
3166
3167   return ret;
3168 }
3169
3170 /* Identify candidates for reduction for IPA-SRA based on their type and mark
3171    them in candidate_bitmap.  Note that these do not necessarily include
3172    parameter which are unused and thus can be removed.  Return true iff any
3173    such candidate has been found.  */
3174
3175 static bool
3176 find_param_candidates (void)
3177 {
3178   tree parm;
3179   int count = 0;
3180   bool ret = false;
3181
3182   for (parm = DECL_ARGUMENTS (current_function_decl);
3183        parm;
3184        parm = DECL_CHAIN (parm))
3185     {
3186       tree type = TREE_TYPE (parm);
3187
3188       count++;
3189
3190       if (TREE_THIS_VOLATILE (parm)
3191           || TREE_ADDRESSABLE (parm)
3192           || (!is_gimple_reg_type (type) && is_va_list_type (type)))
3193         continue;
3194
3195       if (is_unused_scalar_param (parm))
3196         {
3197           ret = true;
3198           continue;
3199         }
3200
3201       if (POINTER_TYPE_P (type))
3202         {
3203           type = TREE_TYPE (type);
3204
3205           if (TREE_CODE (type) == FUNCTION_TYPE
3206               || TYPE_VOLATILE (type)
3207               || (TREE_CODE (type) == ARRAY_TYPE
3208                   && TYPE_NONALIASED_COMPONENT (type))
3209               || !is_gimple_reg (parm)
3210               || is_va_list_type (type)
3211               || ptr_parm_has_direct_uses (parm))
3212             continue;
3213         }
3214       else if (!AGGREGATE_TYPE_P (type))
3215         continue;
3216
3217       if (!COMPLETE_TYPE_P (type)
3218           || !host_integerp (TYPE_SIZE (type), 1)
3219           || tree_low_cst (TYPE_SIZE (type), 1) == 0
3220           || (AGGREGATE_TYPE_P (type)
3221               && type_internals_preclude_sra_p (type)))
3222         continue;
3223
3224       bitmap_set_bit (candidate_bitmap, DECL_UID (parm));
3225       ret = true;
3226       if (dump_file && (dump_flags & TDF_DETAILS))
3227         {
3228           fprintf (dump_file, "Candidate (%d): ", DECL_UID (parm));
3229           print_generic_expr (dump_file, parm, 0);
3230           fprintf (dump_file, "\n");
3231         }
3232     }
3233
3234   func_param_count = count;
3235   return ret;
3236 }
3237
3238 /* Callback of walk_aliased_vdefs, marks the access passed as DATA as
3239    maybe_modified. */
3240
3241 static bool
3242 mark_maybe_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
3243                      void *data)
3244 {
3245   struct access *repr = (struct access *) data;
3246
3247   repr->grp_maybe_modified = 1;
3248   return true;
3249 }
3250
3251 /* Analyze what representatives (in linked lists accessible from
3252    REPRESENTATIVES) can be modified by side effects of statements in the
3253    current function.  */
3254
3255 static void
3256 analyze_modified_params (VEC (access_p, heap) *representatives)
3257 {
3258   int i;
3259
3260   for (i = 0; i < func_param_count; i++)
3261     {
3262       struct access *repr;
3263
3264       for (repr = VEC_index (access_p, representatives, i);
3265            repr;
3266            repr = repr->next_grp)
3267         {
3268           struct access *access;
3269           bitmap visited;
3270           ao_ref ar;
3271
3272           if (no_accesses_p (repr))
3273             continue;
3274           if (!POINTER_TYPE_P (TREE_TYPE (repr->base))
3275               || repr->grp_maybe_modified)
3276             continue;
3277
3278           ao_ref_init (&ar, repr->expr);
3279           visited = BITMAP_ALLOC (NULL);
3280           for (access = repr; access; access = access->next_sibling)
3281             {
3282               /* All accesses are read ones, otherwise grp_maybe_modified would
3283                  be trivially set.  */
3284               walk_aliased_vdefs (&ar, gimple_vuse (access->stmt),
3285                                   mark_maybe_modified, repr, &visited);
3286               if (repr->grp_maybe_modified)
3287                 break;
3288             }
3289           BITMAP_FREE (visited);
3290         }
3291     }
3292 }
3293
3294 /* Propagate distances in bb_dereferences in the opposite direction than the
3295    control flow edges, in each step storing the maximum of the current value
3296    and the minimum of all successors.  These steps are repeated until the table
3297    stabilizes.  Note that BBs which might terminate the functions (according to
3298    final_bbs bitmap) never updated in this way.  */
3299
3300 static void
3301 propagate_dereference_distances (void)
3302 {
3303   VEC (basic_block, heap) *queue;
3304   basic_block bb;
3305
3306   queue = VEC_alloc (basic_block, heap, last_basic_block_for_function (cfun));
3307   VEC_quick_push (basic_block, queue, ENTRY_BLOCK_PTR);
3308   FOR_EACH_BB (bb)
3309     {
3310       VEC_quick_push (basic_block, queue, bb);
3311       bb->aux = bb;
3312     }
3313
3314   while (!VEC_empty (basic_block, queue))
3315     {
3316       edge_iterator ei;
3317       edge e;
3318       bool change = false;
3319       int i;
3320
3321       bb = VEC_pop (basic_block, queue);
3322       bb->aux = NULL;
3323
3324       if (bitmap_bit_p (final_bbs, bb->index))
3325         continue;
3326
3327       for (i = 0; i < func_param_count; i++)
3328         {
3329           int idx = bb->index * func_param_count + i;
3330           bool first = true;
3331           HOST_WIDE_INT inh = 0;
3332
3333           FOR_EACH_EDGE (e, ei, bb->succs)
3334           {
3335             int succ_idx = e->dest->index * func_param_count + i;
3336
3337             if (e->src == EXIT_BLOCK_PTR)
3338               continue;
3339
3340             if (first)
3341               {
3342                 first = false;
3343                 inh = bb_dereferences [succ_idx];
3344               }
3345             else if (bb_dereferences [succ_idx] < inh)
3346               inh = bb_dereferences [succ_idx];
3347           }
3348
3349           if (!first && bb_dereferences[idx] < inh)
3350             {
3351               bb_dereferences[idx] = inh;
3352               change = true;
3353             }
3354         }
3355
3356       if (change && !bitmap_bit_p (final_bbs, bb->index))
3357         FOR_EACH_EDGE (e, ei, bb->preds)
3358           {
3359             if (e->src->aux)
3360               continue;
3361
3362             e->src->aux = e->src;
3363             VEC_quick_push (basic_block, queue, e->src);
3364           }
3365     }
3366
3367   VEC_free (basic_block, heap, queue);
3368 }
3369
3370 /* Dump a dereferences TABLE with heading STR to file F.  */
3371
3372 static void
3373 dump_dereferences_table (FILE *f, const char *str, HOST_WIDE_INT *table)
3374 {
3375   basic_block bb;
3376
3377   fprintf (dump_file, str);
3378   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
3379     {
3380       fprintf (f, "%4i  %i   ", bb->index, bitmap_bit_p (final_bbs, bb->index));
3381       if (bb != EXIT_BLOCK_PTR)
3382         {
3383           int i;
3384           for (i = 0; i < func_param_count; i++)
3385             {
3386               int idx = bb->index * func_param_count + i;
3387               fprintf (f, " %4" HOST_WIDE_INT_PRINT "d", table[idx]);
3388             }
3389         }
3390       fprintf (f, "\n");
3391     }
3392   fprintf (dump_file, "\n");
3393 }
3394
3395 /* Determine what (parts of) parameters passed by reference that are not
3396    assigned to are not certainly dereferenced in this function and thus the
3397    dereferencing cannot be safely moved to the caller without potentially
3398    introducing a segfault.  Mark such REPRESENTATIVES as
3399    grp_not_necessarilly_dereferenced.
3400
3401    The dereferenced maximum "distance," i.e. the offset + size of the accessed
3402    part is calculated rather than simple booleans are calculated for each
3403    pointer parameter to handle cases when only a fraction of the whole
3404    aggregate is allocated (see testsuite/gcc.c-torture/execute/ipa-sra-2.c for
3405    an example).
3406
3407    The maximum dereference distances for each pointer parameter and BB are
3408    already stored in bb_dereference.  This routine simply propagates these
3409    values upwards by propagate_dereference_distances and then compares the
3410    distances of individual parameters in the ENTRY BB to the equivalent
3411    distances of each representative of a (fraction of a) parameter.  */
3412
3413 static void
3414 analyze_caller_dereference_legality (VEC (access_p, heap) *representatives)
3415 {
3416   int i;
3417
3418   if (dump_file && (dump_flags & TDF_DETAILS))
3419     dump_dereferences_table (dump_file,
3420                              "Dereference table before propagation:\n",
3421                              bb_dereferences);
3422
3423   propagate_dereference_distances ();
3424
3425   if (dump_file && (dump_flags & TDF_DETAILS))
3426     dump_dereferences_table (dump_file,
3427                              "Dereference table after propagation:\n",
3428                              bb_dereferences);
3429
3430   for (i = 0; i < func_param_count; i++)
3431     {
3432       struct access *repr = VEC_index (access_p, representatives, i);
3433       int idx = ENTRY_BLOCK_PTR->index * func_param_count + i;
3434
3435       if (!repr || no_accesses_p (repr))
3436         continue;
3437
3438       do
3439         {
3440           if ((repr->offset + repr->size) > bb_dereferences[idx])
3441             repr->grp_not_necessarilly_dereferenced = 1;
3442           repr = repr->next_grp;
3443         }
3444       while (repr);
3445     }
3446 }
3447
3448 /* Return the representative access for the parameter declaration PARM if it is
3449    a scalar passed by reference which is not written to and the pointer value
3450    is not used directly.  Thus, if it is legal to dereference it in the caller
3451    and we can rule out modifications through aliases, such parameter should be
3452    turned into one passed by value.  Return NULL otherwise.  */
3453
3454 static struct access *
3455 unmodified_by_ref_scalar_representative (tree parm)
3456 {
3457   int i, access_count;
3458   struct access *repr;
3459   VEC (access_p, heap) *access_vec;
3460
3461   access_vec = get_base_access_vector (parm);
3462   gcc_assert (access_vec);
3463   repr = VEC_index (access_p, access_vec, 0);
3464   if (repr->write)
3465     return NULL;
3466   repr->group_representative = repr;
3467
3468   access_count = VEC_length (access_p, access_vec);
3469   for (i = 1; i < access_count; i++)
3470     {
3471       struct access *access = VEC_index (access_p, access_vec, i);
3472       if (access->write)
3473         return NULL;
3474       access->group_representative = repr;
3475       access->next_sibling = repr->next_sibling;
3476       repr->next_sibling = access;
3477     }
3478
3479   repr->grp_read = 1;
3480   repr->grp_scalar_ptr = 1;
3481   return repr;
3482 }
3483
3484 /* Return true iff this access precludes IPA-SRA of the parameter it is
3485    associated with. */
3486
3487 static bool
3488 access_precludes_ipa_sra_p (struct access *access)
3489 {
3490   /* Avoid issues such as the second simple testcase in PR 42025.  The problem
3491      is incompatible assign in a call statement (and possibly even in asm
3492      statements).  This can be relaxed by using a new temporary but only for
3493      non-TREE_ADDRESSABLE types and is probably not worth the complexity. (In
3494      intraprocedural SRA we deal with this by keeping the old aggregate around,
3495      something we cannot do in IPA-SRA.)  */
3496   if (access->write
3497       && (is_gimple_call (access->stmt)
3498           || gimple_code (access->stmt) == GIMPLE_ASM))
3499     return true;
3500
3501   return false;
3502 }
3503
3504
3505 /* Sort collected accesses for parameter PARM, identify representatives for
3506    each accessed region and link them together.  Return NULL if there are
3507    different but overlapping accesses, return the special ptr value meaning
3508    there are no accesses for this parameter if that is the case and return the
3509    first representative otherwise.  Set *RO_GRP if there is a group of accesses
3510    with only read (i.e. no write) accesses.  */
3511
3512 static struct access *
3513 splice_param_accesses (tree parm, bool *ro_grp)
3514 {
3515   int i, j, access_count, group_count;
3516   int agg_size, total_size = 0;
3517   struct access *access, *res, **prev_acc_ptr = &res;
3518   VEC (access_p, heap) *access_vec;
3519
3520   access_vec = get_base_access_vector (parm);
3521   if (!access_vec)
3522     return &no_accesses_representant;
3523   access_count = VEC_length (access_p, access_vec);
3524
3525   VEC_qsort (access_p, access_vec, compare_access_positions);
3526
3527   i = 0;
3528   total_size = 0;
3529   group_count = 0;
3530   while (i < access_count)
3531     {
3532       bool modification;
3533       access = VEC_index (access_p, access_vec, i);
3534       modification = access->write;
3535       if (access_precludes_ipa_sra_p (access))
3536         return NULL;
3537
3538       /* Access is about to become group representative unless we find some
3539          nasty overlap which would preclude us from breaking this parameter
3540          apart. */
3541
3542       j = i + 1;
3543       while (j < access_count)
3544         {
3545           struct access *ac2 = VEC_index (access_p, access_vec, j);
3546           if (ac2->offset != access->offset)
3547             {
3548               /* All or nothing law for parameters. */
3549               if (access->offset + access->size > ac2->offset)
3550                 return NULL;
3551               else
3552                 break;
3553             }
3554           else if (ac2->size != access->size)
3555             return NULL;
3556
3557           if (access_precludes_ipa_sra_p (ac2))
3558             return NULL;
3559
3560           modification |= ac2->write;
3561           ac2->group_representative = access;
3562           ac2->next_sibling = access->next_sibling;
3563           access->next_sibling = ac2;
3564           j++;
3565         }
3566
3567       group_count++;
3568       access->grp_maybe_modified = modification;
3569       if (!modification)
3570         *ro_grp = true;
3571       *prev_acc_ptr = access;
3572       prev_acc_ptr = &access->next_grp;
3573       total_size += access->size;
3574       i = j;
3575     }
3576
3577   if (POINTER_TYPE_P (TREE_TYPE (parm)))
3578     agg_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))), 1);
3579   else
3580     agg_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (parm)), 1);
3581   if (total_size >= agg_size)
3582     return NULL;
3583
3584   gcc_assert (group_count > 0);
3585   return res;
3586 }
3587
3588 /* Decide whether parameters with representative accesses given by REPR should
3589    be reduced into components.  */
3590
3591 static int
3592 decide_one_param_reduction (struct access *repr)
3593 {
3594   int total_size, cur_parm_size, agg_size, new_param_count, parm_size_limit;
3595   bool by_ref;
3596   tree parm;
3597
3598   parm = repr->base;
3599   cur_parm_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (parm)), 1);
3600   gcc_assert (cur_parm_size > 0);
3601
3602   if (POINTER_TYPE_P (TREE_TYPE (parm)))
3603     {
3604       by_ref = true;
3605       agg_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))), 1);
3606     }
3607   else
3608     {
3609       by_ref = false;
3610       agg_size = cur_parm_size;
3611     }
3612
3613   if (dump_file)
3614     {
3615       struct access *acc;
3616       fprintf (dump_file, "Evaluating PARAM group sizes for ");
3617       print_generic_expr (dump_file, parm, 0);
3618       fprintf (dump_file, " (UID: %u): \n", DECL_UID (parm));
3619       for (acc = repr; acc; acc = acc->next_grp)
3620         dump_access (dump_file, acc, true);
3621     }
3622
3623   total_size = 0;
3624   new_param_count = 0;
3625
3626   for (; repr; repr = repr->next_grp)
3627     {
3628       gcc_assert (parm == repr->base);
3629       new_param_count++;
3630
3631       if (!by_ref || (!repr->grp_maybe_modified
3632                       && !repr->grp_not_necessarilly_dereferenced))
3633         total_size += repr->size;
3634       else
3635         total_size += cur_parm_size;
3636     }
3637
3638   gcc_assert (new_param_count > 0);
3639
3640   if (optimize_function_for_size_p (cfun))
3641     parm_size_limit = cur_parm_size;
3642   else
3643     parm_size_limit = (PARAM_VALUE (PARAM_IPA_SRA_PTR_GROWTH_FACTOR)
3644                        * cur_parm_size);
3645
3646   if (total_size < agg_size
3647       && total_size <= parm_size_limit)
3648     {
3649       if (dump_file)
3650         fprintf (dump_file, "    ....will be split into %i components\n",
3651                  new_param_count);
3652       return new_param_count;
3653     }
3654   else
3655     return 0;
3656 }
3657
3658 /* The order of the following enums is important, we need to do extra work for
3659    UNUSED_PARAMS, BY_VAL_ACCESSES and UNMODIF_BY_REF_ACCESSES.  */
3660 enum ipa_splicing_result { NO_GOOD_ACCESS, UNUSED_PARAMS, BY_VAL_ACCESSES,
3661                           MODIF_BY_REF_ACCESSES, UNMODIF_BY_REF_ACCESSES };
3662
3663 /* Identify representatives of all accesses to all candidate parameters for
3664    IPA-SRA.  Return result based on what representatives have been found. */
3665
3666 static enum ipa_splicing_result
3667 splice_all_param_accesses (VEC (access_p, heap) **representatives)
3668 {
3669   enum ipa_splicing_result result = NO_GOOD_ACCESS;
3670   tree parm;
3671   struct access *repr;
3672
3673   *representatives = VEC_alloc (access_p, heap, func_param_count);
3674
3675   for (parm = DECL_ARGUMENTS (current_function_decl);
3676        parm;
3677        parm = DECL_CHAIN (parm))
3678     {
3679       if (is_unused_scalar_param (parm))
3680         {
3681           VEC_quick_push (access_p, *representatives,
3682                           &no_accesses_representant);
3683           if (result == NO_GOOD_ACCESS)
3684             result = UNUSED_PARAMS;
3685         }
3686       else if (POINTER_TYPE_P (TREE_TYPE (parm))
3687                && is_gimple_reg_type (TREE_TYPE (TREE_TYPE (parm)))
3688                && bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
3689         {
3690           repr = unmodified_by_ref_scalar_representative (parm);
3691           VEC_quick_push (access_p, *representatives, repr);
3692           if (repr)
3693             result = UNMODIF_BY_REF_ACCESSES;
3694         }
3695       else if (bitmap_bit_p (candidate_bitmap, DECL_UID (parm)))
3696         {
3697           bool ro_grp = false;
3698           repr = splice_param_accesses (parm, &ro_grp);
3699           VEC_quick_push (access_p, *representatives, repr);
3700
3701           if (repr && !no_accesses_p (repr))
3702             {
3703               if (POINTER_TYPE_P (TREE_TYPE (parm)))
3704                 {
3705                   if (ro_grp)
3706                     result = UNMODIF_BY_REF_ACCESSES;
3707                   else if (result < MODIF_BY_REF_ACCESSES)
3708                     result = MODIF_BY_REF_ACCESSES;
3709                 }
3710               else if (result < BY_VAL_ACCESSES)
3711                 result = BY_VAL_ACCESSES;
3712             }
3713           else if (no_accesses_p (repr) && (result == NO_GOOD_ACCESS))
3714             result = UNUSED_PARAMS;
3715         }
3716       else
3717         VEC_quick_push (access_p, *representatives, NULL);
3718     }
3719
3720   if (result == NO_GOOD_ACCESS)
3721     {
3722       VEC_free (access_p, heap, *representatives);
3723       *representatives = NULL;
3724       return NO_GOOD_ACCESS;
3725     }
3726
3727   return result;
3728 }
3729
3730 /* Return the index of BASE in PARMS.  Abort if it is not found.  */
3731
3732 static inline int
3733 get_param_index (tree base, VEC(tree, heap) *parms)
3734 {
3735   int i, len;
3736
3737   len = VEC_length (tree, parms);
3738   for (i = 0; i < len; i++)
3739     if (VEC_index (tree, parms, i) == base)
3740       return i;
3741   gcc_unreachable ();
3742 }
3743
3744 /* Convert the decisions made at the representative level into compact
3745    parameter adjustments.  REPRESENTATIVES are pointers to first
3746    representatives of each param accesses, ADJUSTMENTS_COUNT is the expected
3747    final number of adjustments.  */
3748
3749 static ipa_parm_adjustment_vec
3750 turn_representatives_into_adjustments (VEC (access_p, heap) *representatives,
3751                                        int adjustments_count)
3752 {
3753   VEC (tree, heap) *parms;
3754   ipa_parm_adjustment_vec adjustments;
3755   tree parm;
3756   int i;
3757
3758   gcc_assert (adjustments_count > 0);
3759   parms = ipa_get_vector_of_formal_parms (current_function_decl);
3760   adjustments = VEC_alloc (ipa_parm_adjustment_t, heap, adjustments_count);
3761   parm = DECL_ARGUMENTS (current_function_decl);
3762   for (i = 0; i < func_param_count; i++, parm = DECL_CHAIN (parm))
3763     {
3764       struct access *repr = VEC_index (access_p, representatives, i);
3765
3766       if (!repr || no_accesses_p (repr))
3767         {
3768           struct ipa_parm_adjustment *adj;
3769
3770           adj = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
3771           memset (adj, 0, sizeof (*adj));
3772           adj->base_index = get_param_index (parm, parms);
3773           adj->base = parm;
3774           if (!repr)
3775             adj->copy_param = 1;
3776           else
3777             adj->remove_param = 1;
3778         }
3779       else
3780         {
3781           struct ipa_parm_adjustment *adj;
3782           int index = get_param_index (parm, parms);
3783
3784           for (; repr; repr = repr->next_grp)
3785             {
3786               adj = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
3787               memset (adj, 0, sizeof (*adj));
3788               gcc_assert (repr->base == parm);
3789               adj->base_index = index;
3790               adj->base = repr->base;
3791               adj->type = repr->type;
3792               adj->offset = repr->offset;
3793               adj->by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base))
3794                              && (repr->grp_maybe_modified
3795                                  || repr->grp_not_necessarilly_dereferenced));
3796
3797             }
3798         }
3799     }
3800   VEC_free (tree, heap, parms);
3801   return adjustments;
3802 }
3803
3804 /* Analyze the collected accesses and produce a plan what to do with the
3805    parameters in the form of adjustments, NULL meaning nothing.  */
3806
3807 static ipa_parm_adjustment_vec
3808 analyze_all_param_acesses (void)
3809 {
3810   enum ipa_splicing_result repr_state;
3811   bool proceed = false;
3812   int i, adjustments_count = 0;
3813   VEC (access_p, heap) *representatives;
3814   ipa_parm_adjustment_vec adjustments;
3815
3816   repr_state = splice_all_param_accesses (&representatives);
3817   if (repr_state == NO_GOOD_ACCESS)
3818     return NULL;
3819
3820   /* If there are any parameters passed by reference which are not modified
3821      directly, we need to check whether they can be modified indirectly.  */
3822   if (repr_state == UNMODIF_BY_REF_ACCESSES)
3823     {
3824       analyze_caller_dereference_legality (representatives);
3825       analyze_modified_params (representatives);
3826     }
3827
3828   for (i = 0; i < func_param_count; i++)
3829     {
3830       struct access *repr = VEC_index (access_p, representatives, i);
3831
3832       if (repr && !no_accesses_p (repr))
3833         {
3834           if (repr->grp_scalar_ptr)
3835             {
3836               adjustments_count++;
3837               if (repr->grp_not_necessarilly_dereferenced
3838                   || repr->grp_maybe_modified)
3839                 VEC_replace (access_p, representatives, i, NULL);
3840               else
3841                 {
3842                   proceed = true;
3843                   sra_stats.scalar_by_ref_to_by_val++;
3844                 }
3845             }
3846           else
3847             {
3848               int new_components = decide_one_param_reduction (repr);
3849
3850               if (new_components == 0)
3851                 {
3852                   VEC_replace (access_p, representatives, i, NULL);
3853                   adjustments_count++;
3854                 }
3855               else
3856                 {
3857                   adjustments_count += new_components;
3858                   sra_stats.aggregate_params_reduced++;
3859                   sra_stats.param_reductions_created += new_components;
3860                   proceed = true;
3861                 }
3862             }
3863         }
3864       else
3865         {
3866           if (no_accesses_p (repr))
3867             {
3868               proceed = true;
3869               sra_stats.deleted_unused_parameters++;
3870             }
3871           adjustments_count++;
3872         }
3873     }
3874
3875   if (!proceed && dump_file)
3876     fprintf (dump_file, "NOT proceeding to change params.\n");
3877
3878   if (proceed)
3879     adjustments = turn_representatives_into_adjustments (representatives,
3880                                                          adjustments_count);
3881   else
3882     adjustments = NULL;
3883
3884   VEC_free (access_p, heap, representatives);
3885   return adjustments;
3886 }
3887
3888 /* If a parameter replacement identified by ADJ does not yet exist in the form
3889    of declaration, create it and record it, otherwise return the previously
3890    created one.  */
3891
3892 static tree
3893 get_replaced_param_substitute (struct ipa_parm_adjustment *adj)
3894 {
3895   tree repl;
3896   if (!adj->new_ssa_base)
3897     {
3898       char *pretty_name = make_fancy_name (adj->base);
3899
3900       repl = create_tmp_reg (TREE_TYPE (adj->base), "ISR");
3901       DECL_NAME (repl) = get_identifier (pretty_name);
3902       obstack_free (&name_obstack, pretty_name);
3903
3904       get_var_ann (repl);
3905       add_referenced_var (repl);
3906       adj->new_ssa_base = repl;
3907     }
3908   else
3909     repl = adj->new_ssa_base;
3910   return repl;
3911 }
3912
3913 /* Find the first adjustment for a particular parameter BASE in a vector of
3914    ADJUSTMENTS which is not a copy_param.  Return NULL if there is no such
3915    adjustment. */
3916
3917 static struct ipa_parm_adjustment *
3918 get_adjustment_for_base (ipa_parm_adjustment_vec adjustments, tree base)
3919 {
3920   int i, len;
3921
3922   len = VEC_length (ipa_parm_adjustment_t, adjustments);
3923   for (i = 0; i < len; i++)
3924     {
3925       struct ipa_parm_adjustment *adj;
3926
3927       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
3928       if (!adj->copy_param && adj->base == base)
3929         return adj;
3930     }
3931
3932   return NULL;
3933 }
3934
3935 /* If the statement STMT defines an SSA_NAME of a parameter which is to be
3936    removed because its value is not used, replace the SSA_NAME with a one
3937    relating to a created VAR_DECL together all of its uses and return true.
3938    ADJUSTMENTS is a pointer to an adjustments vector.  */
3939
3940 static bool
3941 replace_removed_params_ssa_names (gimple stmt,
3942                                   ipa_parm_adjustment_vec adjustments)
3943 {
3944   struct ipa_parm_adjustment *adj;
3945   tree lhs, decl, repl, name;
3946
3947   if (gimple_code (stmt) == GIMPLE_PHI)
3948     lhs = gimple_phi_result (stmt);
3949   else if (is_gimple_assign (stmt))
3950     lhs = gimple_assign_lhs (stmt);
3951   else if (is_gimple_call (stmt))
3952     lhs = gimple_call_lhs (stmt);
3953   else
3954     gcc_unreachable ();
3955
3956   if (TREE_CODE (lhs) != SSA_NAME)
3957     return false;
3958   decl = SSA_NAME_VAR (lhs);
3959   if (TREE_CODE (decl) != PARM_DECL)
3960     return false;
3961
3962   adj = get_adjustment_for_base (adjustments, decl);
3963   if (!adj)
3964     return false;
3965
3966   repl = get_replaced_param_substitute (adj);
3967   name = make_ssa_name (repl, stmt);
3968
3969   if (dump_file)
3970     {
3971       fprintf (dump_file, "replacing an SSA name of a removed param ");
3972       print_generic_expr (dump_file, lhs, 0);
3973       fprintf (dump_file, " with ");
3974       print_generic_expr (dump_file, name, 0);
3975       fprintf (dump_file, "\n");
3976     }
3977
3978   if (is_gimple_assign (stmt))
3979     gimple_assign_set_lhs (stmt, name);
3980   else if (is_gimple_call (stmt))
3981     gimple_call_set_lhs (stmt, name);
3982   else
3983     gimple_phi_set_result (stmt, name);
3984
3985   replace_uses_by (lhs, name);
3986   release_ssa_name (lhs);
3987   return true;
3988 }
3989
3990 /* If the expression *EXPR should be replaced by a reduction of a parameter, do
3991    so.  ADJUSTMENTS is a pointer to a vector of adjustments.  CONVERT
3992    specifies whether the function should care about type incompatibility the
3993    current and new expressions.  If it is false, the function will leave
3994    incompatibility issues to the caller.  Return true iff the expression
3995    was modified. */
3996
3997 static bool
3998 sra_ipa_modify_expr (tree *expr, bool convert,
3999                      ipa_parm_adjustment_vec adjustments)
4000 {
4001   int i, len;
4002   struct ipa_parm_adjustment *adj, *cand = NULL;
4003   HOST_WIDE_INT offset, size, max_size;
4004   tree base, src;
4005
4006   len = VEC_length (ipa_parm_adjustment_t, adjustments);
4007
4008   if (TREE_CODE (*expr) == BIT_FIELD_REF
4009       || TREE_CODE (*expr) == IMAGPART_EXPR
4010       || TREE_CODE (*expr) == REALPART_EXPR)
4011     {
4012       expr = &TREE_OPERAND (*expr, 0);
4013       convert = true;
4014     }
4015
4016   base = get_ref_base_and_extent (*expr, &offset, &size, &max_size);
4017   if (!base || size == -1 || max_size == -1)
4018     return false;
4019
4020   if (TREE_CODE (base) == MEM_REF)
4021     {
4022       offset += mem_ref_offset (base).low * BITS_PER_UNIT;
4023       base = TREE_OPERAND (base, 0);
4024     }
4025
4026   base = get_ssa_base_param (base);
4027   if (!base || TREE_CODE (base) != PARM_DECL)
4028     return false;
4029
4030   for (i = 0; i < len; i++)
4031     {
4032       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
4033
4034       if (adj->base == base &&
4035           (adj->offset == offset || adj->remove_param))
4036         {
4037           cand = adj;
4038           break;
4039         }
4040     }
4041   if (!cand || cand->copy_param || cand->remove_param)
4042     return false;
4043
4044   if (cand->by_ref)
4045     src = build_simple_mem_ref (cand->reduction);
4046   else
4047     src = cand->reduction;
4048
4049   if (dump_file && (dump_flags & TDF_DETAILS))
4050     {
4051       fprintf (dump_file, "About to replace expr ");
4052       print_generic_expr (dump_file, *expr, 0);
4053       fprintf (dump_file, " with ");
4054       print_generic_expr (dump_file, src, 0);
4055       fprintf (dump_file, "\n");
4056     }
4057
4058   if (convert && !useless_type_conversion_p (TREE_TYPE (*expr), cand->type))
4059     {
4060       tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*expr), src);
4061       *expr = vce;
4062     }
4063   else
4064     *expr = src;
4065   return true;
4066 }
4067
4068 /* If the statement pointed to by STMT_PTR contains any expressions that need
4069    to replaced with a different one as noted by ADJUSTMENTS, do so.  Handle any
4070    potential type incompatibilities (GSI is used to accommodate conversion
4071    statements and must point to the statement).  Return true iff the statement
4072    was modified.  */
4073
4074 static bool
4075 sra_ipa_modify_assign (gimple *stmt_ptr, gimple_stmt_iterator *gsi,
4076                        ipa_parm_adjustment_vec adjustments)
4077 {
4078   gimple stmt = *stmt_ptr;
4079   tree *lhs_p, *rhs_p;
4080   bool any;
4081
4082   if (!gimple_assign_single_p (stmt))
4083     return false;
4084
4085   rhs_p = gimple_assign_rhs1_ptr (stmt);
4086   lhs_p = gimple_assign_lhs_ptr (stmt);
4087
4088   any = sra_ipa_modify_expr (rhs_p, false, adjustments);
4089   any |= sra_ipa_modify_expr (lhs_p, false, adjustments);
4090   if (any)
4091     {
4092       tree new_rhs = NULL_TREE;
4093
4094       if (!useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
4095         {
4096           if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
4097             {
4098               /* V_C_Es of constructors can cause trouble (PR 42714).  */
4099               if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
4100                 *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p));
4101               else
4102                 *rhs_p = build_constructor (TREE_TYPE (*lhs_p), 0);
4103             }
4104           else
4105             new_rhs = fold_build1_loc (gimple_location (stmt),
4106                                        VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
4107                                        *rhs_p);
4108         }
4109       else if (REFERENCE_CLASS_P (*rhs_p)
4110                && is_gimple_reg_type (TREE_TYPE (*lhs_p))
4111                && !is_gimple_reg (*lhs_p))
4112         /* This can happen when an assignment in between two single field
4113            structures is turned into an assignment in between two pointers to
4114            scalars (PR 42237).  */
4115         new_rhs = *rhs_p;
4116
4117       if (new_rhs)
4118         {
4119           tree tmp = force_gimple_operand_gsi (gsi, new_rhs, true, NULL_TREE,
4120                                                true, GSI_SAME_STMT);
4121
4122           gimple_assign_set_rhs_from_tree (gsi, tmp);
4123         }
4124
4125       return true;
4126     }
4127
4128   return false;
4129 }
4130
4131 /* Traverse the function body and all modifications as described in
4132    ADJUSTMENTS.  Return true iff the CFG has been changed.  */
4133
4134 static bool
4135 ipa_sra_modify_function_body (ipa_parm_adjustment_vec adjustments)
4136 {
4137   bool cfg_changed = false;
4138   basic_block bb;
4139
4140   FOR_EACH_BB (bb)
4141     {
4142       gimple_stmt_iterator gsi;
4143
4144       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4145         replace_removed_params_ssa_names (gsi_stmt (gsi), adjustments);
4146
4147       gsi = gsi_start_bb (bb);
4148       while (!gsi_end_p (gsi))
4149         {
4150           gimple stmt = gsi_stmt (gsi);
4151           bool modified = false;
4152           tree *t;
4153           unsigned i;
4154
4155           switch (gimple_code (stmt))
4156             {
4157             case GIMPLE_RETURN:
4158               t = gimple_return_retval_ptr (stmt);
4159               if (*t != NULL_TREE)
4160                 modified |= sra_ipa_modify_expr (t, true, adjustments);
4161               break;
4162
4163             case GIMPLE_ASSIGN:
4164               modified |= sra_ipa_modify_assign (&stmt, &gsi, adjustments);
4165               modified |= replace_removed_params_ssa_names (stmt, adjustments);
4166               break;
4167
4168             case GIMPLE_CALL:
4169               /* Operands must be processed before the lhs.  */
4170               for (i = 0; i < gimple_call_num_args (stmt); i++)
4171                 {
4172                   t = gimple_call_arg_ptr (stmt, i);
4173                   modified |= sra_ipa_modify_expr (t, true, adjustments);
4174                 }
4175
4176               if (gimple_call_lhs (stmt))
4177                 {
4178                   t = gimple_call_lhs_ptr (stmt);
4179                   modified |= sra_ipa_modify_expr (t, false, adjustments);
4180                   modified |= replace_removed_params_ssa_names (stmt,
4181                                                                 adjustments);
4182                 }
4183               break;
4184
4185             case GIMPLE_ASM:
4186               for (i = 0; i < gimple_asm_ninputs (stmt); i++)
4187                 {
4188                   t = &TREE_VALUE (gimple_asm_input_op (stmt, i));
4189                   modified |= sra_ipa_modify_expr (t, true, adjustments);
4190                 }
4191               for (i = 0; i < gimple_asm_noutputs (stmt); i++)
4192                 {
4193                   t = &TREE_VALUE (gimple_asm_output_op (stmt, i));
4194                   modified |= sra_ipa_modify_expr (t, false, adjustments);
4195                 }
4196               break;
4197
4198             default:
4199               break;
4200             }
4201
4202           if (modified)
4203             {
4204               update_stmt (stmt);
4205               if (maybe_clean_eh_stmt (stmt)
4206                   && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
4207                 cfg_changed = true;
4208             }
4209           gsi_next (&gsi);
4210         }
4211     }
4212
4213   return cfg_changed;
4214 }
4215
4216 /* Call gimple_debug_bind_reset_value on all debug statements describing
4217    gimple register parameters that are being removed or replaced.  */
4218
4219 static void
4220 sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments)
4221 {
4222   int i, len;
4223
4224   len = VEC_length (ipa_parm_adjustment_t, adjustments);
4225   for (i = 0; i < len; i++)
4226     {
4227       struct ipa_parm_adjustment *adj;
4228       imm_use_iterator ui;
4229       gimple stmt;
4230       tree name;
4231
4232       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
4233       if (adj->copy_param || !is_gimple_reg (adj->base))
4234         continue;
4235       name = gimple_default_def (cfun, adj->base);
4236       if (!name)
4237         continue;
4238       FOR_EACH_IMM_USE_STMT (stmt, ui, name)
4239         {
4240           /* All other users must have been removed by
4241              ipa_sra_modify_function_body.  */
4242           gcc_assert (is_gimple_debug (stmt));
4243           gimple_debug_bind_reset_value (stmt);
4244           update_stmt (stmt);
4245         }
4246     }
4247 }
4248
4249 /* Return true iff all callers have at least as many actual arguments as there
4250    are formal parameters in the current function.  */
4251
4252 static bool
4253 all_callers_have_enough_arguments_p (struct cgraph_node *node)
4254 {
4255   struct cgraph_edge *cs;
4256   for (cs = node->callers; cs; cs = cs->next_caller)
4257     if (!callsite_has_enough_arguments_p (cs->call_stmt))
4258       return false;
4259
4260   return true;
4261 }
4262
4263
4264 /* Convert all callers of NODE to pass parameters as given in ADJUSTMENTS.  */
4265
4266 static void
4267 convert_callers (struct cgraph_node *node, tree old_decl,
4268                  ipa_parm_adjustment_vec adjustments)
4269 {
4270   tree old_cur_fndecl = current_function_decl;
4271   struct cgraph_edge *cs;
4272   basic_block this_block;
4273   bitmap recomputed_callers = BITMAP_ALLOC (NULL);
4274
4275   for (cs = node->callers; cs; cs = cs->next_caller)
4276     {
4277       current_function_decl = cs->caller->decl;
4278       push_cfun (DECL_STRUCT_FUNCTION (cs->caller->decl));
4279
4280       if (dump_file)
4281         fprintf (dump_file, "Adjusting call (%i -> %i) %s -> %s\n",
4282                  cs->caller->uid, cs->callee->uid,
4283                  cgraph_node_name (cs->caller),
4284                  cgraph_node_name (cs->callee));
4285
4286       ipa_modify_call_arguments (cs, cs->call_stmt, adjustments);
4287
4288       pop_cfun ();
4289     }
4290
4291   for (cs = node->callers; cs; cs = cs->next_caller)
4292     if (bitmap_set_bit (recomputed_callers, cs->caller->uid))
4293       compute_inline_parameters (cs->caller);
4294   BITMAP_FREE (recomputed_callers);
4295
4296   current_function_decl = old_cur_fndecl;
4297
4298   if (!encountered_recursive_call)
4299     return;
4300
4301   FOR_EACH_BB (this_block)
4302     {
4303       gimple_stmt_iterator gsi;
4304
4305       for (gsi = gsi_start_bb (this_block); !gsi_end_p (gsi); gsi_next (&gsi))
4306         {
4307           gimple stmt = gsi_stmt (gsi);
4308           tree call_fndecl;
4309           if (gimple_code (stmt) != GIMPLE_CALL)
4310             continue;
4311           call_fndecl = gimple_call_fndecl (stmt);
4312           if (call_fndecl == old_decl)
4313             {
4314               if (dump_file)
4315                 fprintf (dump_file, "Adjusting recursive call");
4316               gimple_call_set_fndecl (stmt, node->decl);
4317               ipa_modify_call_arguments (NULL, stmt, adjustments);
4318             }
4319         }
4320     }
4321
4322   return;
4323 }
4324
4325 /* Perform all the modification required in IPA-SRA for NODE to have parameters
4326    as given in ADJUSTMENTS.  Return true iff the CFG has been changed.  */
4327
4328 static bool
4329 modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
4330 {
4331   struct cgraph_node *new_node;
4332   struct cgraph_edge *cs;
4333   bool cfg_changed;
4334   VEC (cgraph_edge_p, heap) * redirect_callers;
4335   int node_callers;
4336
4337   node_callers = 0;
4338   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
4339     node_callers++;
4340   redirect_callers = VEC_alloc (cgraph_edge_p, heap, node_callers);
4341   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
4342     VEC_quick_push (cgraph_edge_p, redirect_callers, cs);
4343
4344   rebuild_cgraph_edges ();
4345   pop_cfun ();
4346   current_function_decl = NULL_TREE;
4347
4348   new_node = cgraph_function_versioning (node, redirect_callers, NULL, NULL,
4349                                          NULL, NULL, "isra");
4350   current_function_decl = new_node->decl;
4351   push_cfun (DECL_STRUCT_FUNCTION (new_node->decl));
4352
4353   ipa_modify_formal_parameters (current_function_decl, adjustments, "ISRA");
4354   cfg_changed = ipa_sra_modify_function_body (adjustments);
4355   sra_ipa_reset_debug_stmts (adjustments);
4356   convert_callers (new_node, node->decl, adjustments);
4357   cgraph_make_node_local (new_node);
4358   return cfg_changed;
4359 }
4360
4361 /* Return false the function is apparently unsuitable for IPA-SRA based on it's
4362    attributes, return true otherwise.  NODE is the cgraph node of the current
4363    function.  */
4364
4365 static bool
4366 ipa_sra_preliminary_function_checks (struct cgraph_node *node)
4367 {
4368   if (!cgraph_node_can_be_local_p (node))
4369     {
4370       if (dump_file)
4371         fprintf (dump_file, "Function not local to this compilation unit.\n");
4372       return false;
4373     }
4374
4375   if (!tree_versionable_function_p (node->decl))
4376     {
4377       if (dump_file)
4378         fprintf (dump_file, "Function is not versionable.\n");
4379       return false;
4380     }
4381
4382   if (DECL_VIRTUAL_P (current_function_decl))
4383     {
4384       if (dump_file)
4385         fprintf (dump_file, "Function is a virtual method.\n");
4386       return false;
4387     }
4388
4389   if ((DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
4390       && node->global.size >= MAX_INLINE_INSNS_AUTO)
4391     {
4392       if (dump_file)
4393         fprintf (dump_file, "Function too big to be made truly local.\n");
4394       return false;
4395     }
4396
4397   if (!node->callers)
4398     {
4399       if (dump_file)
4400         fprintf (dump_file,
4401                  "Function has no callers in this compilation unit.\n");
4402       return false;
4403     }
4404
4405   if (cfun->stdarg)
4406     {
4407       if (dump_file)
4408         fprintf (dump_file, "Function uses stdarg. \n");
4409       return false;
4410     }
4411
4412   if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
4413     return false;
4414
4415   return true;
4416 }
4417
4418 /* Perform early interprocedural SRA.  */
4419
4420 static unsigned int
4421 ipa_early_sra (void)
4422 {
4423   struct cgraph_node *node = cgraph_node (current_function_decl);
4424   ipa_parm_adjustment_vec adjustments;
4425   int ret = 0;
4426
4427   if (!ipa_sra_preliminary_function_checks (node))
4428     return 0;
4429
4430   sra_initialize ();
4431   sra_mode = SRA_MODE_EARLY_IPA;
4432
4433   if (!find_param_candidates ())
4434     {
4435       if (dump_file)
4436         fprintf (dump_file, "Function has no IPA-SRA candidates.\n");
4437       goto simple_out;
4438     }
4439
4440   if (!all_callers_have_enough_arguments_p (node))
4441     {
4442       if (dump_file)
4443         fprintf (dump_file, "There are callers with insufficient number of "
4444                  "arguments.\n");
4445       goto simple_out;
4446     }
4447
4448   bb_dereferences = XCNEWVEC (HOST_WIDE_INT,
4449                                  func_param_count
4450                                  * last_basic_block_for_function (cfun));
4451   final_bbs = BITMAP_ALLOC (NULL);
4452
4453   scan_function ();
4454   if (encountered_apply_args)
4455     {
4456       if (dump_file)
4457         fprintf (dump_file, "Function calls  __builtin_apply_args().\n");
4458       goto out;
4459     }
4460
4461   if (encountered_unchangable_recursive_call)
4462     {
4463       if (dump_file)
4464         fprintf (dump_file, "Function calls itself with insufficient "
4465                  "number of arguments.\n");
4466       goto out;
4467     }
4468
4469   adjustments = analyze_all_param_acesses ();
4470   if (!adjustments)
4471     goto out;
4472   if (dump_file)
4473     ipa_dump_param_adjustments (dump_file, adjustments, current_function_decl);
4474
4475   if (modify_function (node, adjustments))
4476     ret = TODO_update_ssa | TODO_cleanup_cfg;
4477   else
4478     ret = TODO_update_ssa;
4479   VEC_free (ipa_parm_adjustment_t, heap, adjustments);
4480
4481   statistics_counter_event (cfun, "Unused parameters deleted",
4482                             sra_stats.deleted_unused_parameters);
4483   statistics_counter_event (cfun, "Scalar parameters converted to by-value",
4484                             sra_stats.scalar_by_ref_to_by_val);
4485   statistics_counter_event (cfun, "Aggregate parameters broken up",
4486                             sra_stats.aggregate_params_reduced);
4487   statistics_counter_event (cfun, "Aggregate parameter components created",
4488                             sra_stats.param_reductions_created);
4489
4490  out:
4491   BITMAP_FREE (final_bbs);
4492   free (bb_dereferences);
4493  simple_out:
4494   sra_deinitialize ();
4495   return ret;
4496 }
4497
4498 /* Return if early ipa sra shall be performed.  */
4499 static bool
4500 ipa_early_sra_gate (void)
4501 {
4502   return flag_ipa_sra && dbg_cnt (eipa_sra);
4503 }
4504
4505 struct gimple_opt_pass pass_early_ipa_sra =
4506 {
4507  {
4508   GIMPLE_PASS,
4509   "eipa_sra",                           /* name */
4510   ipa_early_sra_gate,                   /* gate */
4511   ipa_early_sra,                        /* execute */
4512   NULL,                                 /* sub */
4513   NULL,                                 /* next */
4514   0,                                    /* static_pass_number */
4515   TV_IPA_SRA,                           /* tv_id */
4516   0,                                    /* properties_required */
4517   0,                                    /* properties_provided */
4518   0,                                    /* properties_destroyed */
4519   0,                                    /* todo_flags_start */
4520   TODO_dump_func | TODO_dump_cgraph     /* todo_flags_finish */
4521  }
4522 };
4523
4524