OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / tree-sra.c
1 /* Scalar Replacement of Aggregates (SRA) converts some structure
2    references into scalar references, exposing them to the scalar
3    optimizers.
4    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
5      Free Software Foundation, Inc.
6    Contributed by Diego Novillo <dnovillo@redhat.com>
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it
11 under the terms of the GNU General Public License as published by the
12 Free Software Foundation; either version 3, or (at your option) any
13 later version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "ggc.h"
29 #include "tree.h"
30
31 /* These RTL headers are needed for basic-block.h.  */
32 #include "rtl.h"
33 #include "tm_p.h"
34 #include "hard-reg-set.h"
35 #include "basic-block.h"
36 #include "diagnostic.h"
37 #include "langhooks.h"
38 #include "tree-inline.h"
39 #include "tree-flow.h"
40 #include "tree-gimple.h"
41 #include "tree-dump.h"
42 #include "tree-pass.h"
43 #include "timevar.h"
44 #include "flags.h"
45 #include "bitmap.h"
46 #include "obstack.h"
47 #include "target.h"
48 /* expr.h is needed for MOVE_RATIO.  */
49 #include "expr.h"
50 #include "params.h"
51
52
53 /* This object of this pass is to replace a non-addressable aggregate with a
54    set of independent variables.  Most of the time, all of these variables
55    will be scalars.  But a secondary objective is to break up larger
56    aggregates into smaller aggregates.  In the process we may find that some
57    bits of the larger aggregate can be deleted as unreferenced.
58
59    This substitution is done globally.  More localized substitutions would
60    be the purvey of a load-store motion pass.
61
62    The optimization proceeds in phases:
63
64      (1) Identify variables that have types that are candidates for
65          decomposition.
66
67      (2) Scan the function looking for the ways these variables are used.
68          In particular we're interested in the number of times a variable
69          (or member) is needed as a complete unit, and the number of times
70          a variable (or member) is copied.
71
72      (3) Based on the usage profile, instantiate substitution variables.
73
74      (4) Scan the function making replacements.
75 */
76
77
78 /* True if this is the "early" pass, before inlining.  */
79 static bool early_sra;
80
81 /* The set of todo flags to return from tree_sra.  */
82 static unsigned int todoflags;
83
84 /* The set of aggregate variables that are candidates for scalarization.  */
85 static bitmap sra_candidates;
86
87 /* Set of scalarizable PARM_DECLs that need copy-in operations at the
88    beginning of the function.  */
89 static bitmap needs_copy_in;
90
91 /* Sets of bit pairs that cache type decomposition and instantiation.  */
92 static bitmap sra_type_decomp_cache;
93 static bitmap sra_type_inst_cache;
94
95 /* One of these structures is created for each candidate aggregate and
96    each (accessed) member or group of members of such an aggregate.  */
97 struct sra_elt
98 {
99   /* A tree of the elements.  Used when we want to traverse everything.  */
100   struct sra_elt *parent;
101   struct sra_elt *groups;
102   struct sra_elt *children;
103   struct sra_elt *sibling;
104
105   /* If this element is a root, then this is the VAR_DECL.  If this is
106      a sub-element, this is some token used to identify the reference.
107      In the case of COMPONENT_REF, this is the FIELD_DECL.  In the case
108      of an ARRAY_REF, this is the (constant) index.  In the case of an
109      ARRAY_RANGE_REF, this is the (constant) RANGE_EXPR.  In the case
110      of a complex number, this is a zero or one.  */
111   tree element;
112
113   /* The type of the element.  */
114   tree type;
115
116   /* A VAR_DECL, for any sub-element we've decided to replace.  */
117   tree replacement;
118
119   /* The number of times the element is referenced as a whole.  I.e.
120      given "a.b.c", this would be incremented for C, but not for A or B.  */
121   unsigned int n_uses;
122
123   /* The number of times the element is copied to or from another
124      scalarizable element.  */
125   unsigned int n_copies;
126
127   /* True if TYPE is scalar.  */
128   bool is_scalar;
129
130   /* True if this element is a group of members of its parent.  */
131   bool is_group;
132
133   /* True if we saw something about this element that prevents scalarization,
134      such as non-constant indexing.  */
135   bool cannot_scalarize;
136
137   /* True if we've decided that structure-to-structure assignment
138      should happen via memcpy and not per-element.  */
139   bool use_block_copy;
140
141   /* True if everything under this element has been marked TREE_NO_WARNING.  */
142   bool all_no_warning;
143
144   /* A flag for use with/after random access traversals.  */
145   bool visited;
146
147   /* True if there is BIT_FIELD_REF on the lhs with a vector. */
148   bool is_vector_lhs;
149
150   /* 1 if the element is a field that is part of a block, 2 if the field
151      is the block itself, 0 if it's neither.  */
152   char in_bitfld_block;
153 };
154
155 #define IS_ELEMENT_FOR_GROUP(ELEMENT) (TREE_CODE (ELEMENT) == RANGE_EXPR)
156
157 #define FOR_EACH_ACTUAL_CHILD(CHILD, ELT)                       \
158   for ((CHILD) = (ELT)->is_group                                \
159                  ? next_child_for_group (NULL, (ELT))           \
160                  : (ELT)->children;                             \
161        (CHILD);                                                 \
162        (CHILD) = (ELT)->is_group                                \
163                  ? next_child_for_group ((CHILD), (ELT))        \
164                  : (CHILD)->sibling)
165
166 /* Helper function for above macro.  Return next child in group.  */
167 static struct sra_elt *
168 next_child_for_group (struct sra_elt *child, struct sra_elt *group)
169 {
170   gcc_assert (group->is_group);
171
172   /* Find the next child in the parent.  */
173   if (child)
174     child = child->sibling;
175   else
176     child = group->parent->children;
177
178   /* Skip siblings that do not belong to the group.  */
179   while (child)
180     {
181       tree g_elt = group->element;
182       if (TREE_CODE (g_elt) == RANGE_EXPR)
183         {
184           if (!tree_int_cst_lt (child->element, TREE_OPERAND (g_elt, 0))
185               && !tree_int_cst_lt (TREE_OPERAND (g_elt, 1), child->element))
186             break;
187         }
188       else
189         gcc_unreachable ();
190
191       child = child->sibling;
192     }
193
194   return child;
195 }
196
197 /* Random access to the child of a parent is performed by hashing.
198    This prevents quadratic behavior, and allows SRA to function
199    reasonably on larger records.  */
200 static htab_t sra_map;
201
202 /* All structures are allocated out of the following obstack.  */
203 static struct obstack sra_obstack;
204
205 /* Debugging functions.  */
206 static void dump_sra_elt_name (FILE *, struct sra_elt *);
207 extern void debug_sra_elt_name (struct sra_elt *);
208
209 /* Forward declarations.  */
210 static tree generate_element_ref (struct sra_elt *);
211 static tree sra_build_assignment (tree dst, tree src);
212 static void mark_all_v_defs (tree list);
213
214 \f
215 /* Return true if DECL is an SRA candidate.  */
216
217 static bool
218 is_sra_candidate_decl (tree decl)
219 {
220   return DECL_P (decl) && bitmap_bit_p (sra_candidates, DECL_UID (decl));
221 }
222
223 /* Return true if TYPE is a scalar type.  */
224
225 static bool
226 is_sra_scalar_type (tree type)
227 {
228   enum tree_code code = TREE_CODE (type);
229   return (code == INTEGER_TYPE || code == REAL_TYPE || code == VECTOR_TYPE
230           || code == FIXED_POINT_TYPE
231           || code == ENUMERAL_TYPE || code == BOOLEAN_TYPE
232           || code == POINTER_TYPE || code == OFFSET_TYPE
233           || code == REFERENCE_TYPE);
234 }
235
236 /* Return true if TYPE can be decomposed into a set of independent variables.
237
238    Note that this doesn't imply that all elements of TYPE can be
239    instantiated, just that if we decide to break up the type into
240    separate pieces that it can be done.  */
241
242 bool
243 sra_type_can_be_decomposed_p (tree type)
244 {
245   unsigned int cache = TYPE_UID (TYPE_MAIN_VARIANT (type)) * 2;
246   tree t;
247
248   /* Avoid searching the same type twice.  */
249   if (bitmap_bit_p (sra_type_decomp_cache, cache+0))
250     return true;
251   if (bitmap_bit_p (sra_type_decomp_cache, cache+1))
252     return false;
253
254   /* The type must have a definite nonzero size.  */
255   if (TYPE_SIZE (type) == NULL || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
256       || integer_zerop (TYPE_SIZE (type)))
257     goto fail;
258
259   /* The type must be a non-union aggregate.  */
260   switch (TREE_CODE (type))
261     {
262     case RECORD_TYPE:
263       {
264         bool saw_one_field = false;
265
266         for (t = TYPE_FIELDS (type); t ; t = TREE_CHAIN (t))
267           if (TREE_CODE (t) == FIELD_DECL)
268             {
269               /* Reject incorrectly represented bit fields.  */
270               if (DECL_BIT_FIELD (t)
271                   && (tree_low_cst (DECL_SIZE (t), 1)
272                       != TYPE_PRECISION (TREE_TYPE (t))))
273                 goto fail;
274
275               saw_one_field = true;
276             }
277
278         /* Record types must have at least one field.  */
279         if (!saw_one_field)
280           goto fail;
281       }
282       break;
283
284     case ARRAY_TYPE:
285       /* Array types must have a fixed lower and upper bound.  */
286       t = TYPE_DOMAIN (type);
287       if (t == NULL)
288         goto fail;
289       if (TYPE_MIN_VALUE (t) == NULL || !TREE_CONSTANT (TYPE_MIN_VALUE (t)))
290         goto fail;
291       if (TYPE_MAX_VALUE (t) == NULL || !TREE_CONSTANT (TYPE_MAX_VALUE (t)))
292         goto fail;
293       break;
294
295     case COMPLEX_TYPE:
296       break;
297
298     default:
299       goto fail;
300     }
301
302   bitmap_set_bit (sra_type_decomp_cache, cache+0);
303   return true;
304
305  fail:
306   bitmap_set_bit (sra_type_decomp_cache, cache+1);
307   return false;
308 }
309
310 /* Return true if DECL can be decomposed into a set of independent
311    (though not necessarily scalar) variables.  */
312
313 static bool
314 decl_can_be_decomposed_p (tree var)
315 {
316   /* Early out for scalars.  */
317   if (is_sra_scalar_type (TREE_TYPE (var)))
318     return false;
319
320   /* The variable must not be aliased.  */
321   if (!is_gimple_non_addressable (var))
322     {
323       if (dump_file && (dump_flags & TDF_DETAILS))
324         {
325           fprintf (dump_file, "Cannot scalarize variable ");
326           print_generic_expr (dump_file, var, dump_flags);
327           fprintf (dump_file, " because it must live in memory\n");
328         }
329       return false;
330     }
331
332   /* The variable must not be volatile.  */
333   if (TREE_THIS_VOLATILE (var))
334     {
335       if (dump_file && (dump_flags & TDF_DETAILS))
336         {
337           fprintf (dump_file, "Cannot scalarize variable ");
338           print_generic_expr (dump_file, var, dump_flags);
339           fprintf (dump_file, " because it is declared volatile\n");
340         }
341       return false;
342     }
343
344   /* We must be able to decompose the variable's type.  */
345   if (!sra_type_can_be_decomposed_p (TREE_TYPE (var)))
346     {
347       if (dump_file && (dump_flags & TDF_DETAILS))
348         {
349           fprintf (dump_file, "Cannot scalarize variable ");
350           print_generic_expr (dump_file, var, dump_flags);
351           fprintf (dump_file, " because its type cannot be decomposed\n");
352         }
353       return false;
354     }
355
356   /* HACK: if we decompose a va_list_type_node before inlining, then we'll
357      confuse tree-stdarg.c, and we won't be able to figure out which and
358      how many arguments are accessed.  This really should be improved in
359      tree-stdarg.c, as the decomposition is truely a win.  This could also
360      be fixed if the stdarg pass ran early, but this can't be done until
361      we've aliasing information early too.  See PR 30791.  */
362   if (early_sra
363       && TYPE_MAIN_VARIANT (TREE_TYPE (var))
364          == TYPE_MAIN_VARIANT (va_list_type_node))
365     return false;
366
367   return true;
368 }
369
370 /* Return true if TYPE can be *completely* decomposed into scalars.  */
371
372 static bool
373 type_can_instantiate_all_elements (tree type)
374 {
375   if (is_sra_scalar_type (type))
376     return true;
377   if (!sra_type_can_be_decomposed_p (type))
378     return false;
379
380   switch (TREE_CODE (type))
381     {
382     case RECORD_TYPE:
383       {
384         unsigned int cache = TYPE_UID (TYPE_MAIN_VARIANT (type)) * 2;
385         tree f;
386
387         if (bitmap_bit_p (sra_type_inst_cache, cache+0))
388           return true;
389         if (bitmap_bit_p (sra_type_inst_cache, cache+1))
390           return false;
391
392         for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
393           if (TREE_CODE (f) == FIELD_DECL)
394             {
395               if (!type_can_instantiate_all_elements (TREE_TYPE (f)))
396                 {
397                   bitmap_set_bit (sra_type_inst_cache, cache+1);
398                   return false;
399                 }
400             }
401
402         bitmap_set_bit (sra_type_inst_cache, cache+0);
403         return true;
404       }
405
406     case ARRAY_TYPE:
407       return type_can_instantiate_all_elements (TREE_TYPE (type));
408
409     case COMPLEX_TYPE:
410       return true;
411
412     default:
413       gcc_unreachable ();
414     }
415 }
416
417 /* Test whether ELT or some sub-element cannot be scalarized.  */
418
419 static bool
420 can_completely_scalarize_p (struct sra_elt *elt)
421 {
422   struct sra_elt *c;
423
424   if (elt->cannot_scalarize)
425     return false;
426
427   for (c = elt->children; c; c = c->sibling)
428     if (!can_completely_scalarize_p (c))
429       return false;
430
431   for (c = elt->groups; c; c = c->sibling)
432     if (!can_completely_scalarize_p (c))
433       return false;
434
435   return true;
436 }
437
438 \f
439 /* A simplified tree hashing algorithm that only handles the types of
440    trees we expect to find in sra_elt->element.  */
441
442 static hashval_t
443 sra_hash_tree (tree t)
444 {
445   hashval_t h;
446
447   switch (TREE_CODE (t))
448     {
449     case VAR_DECL:
450     case PARM_DECL:
451     case RESULT_DECL:
452       h = DECL_UID (t);
453       break;
454
455     case INTEGER_CST:
456       h = TREE_INT_CST_LOW (t) ^ TREE_INT_CST_HIGH (t);
457       break;
458
459     case RANGE_EXPR:
460       h = iterative_hash_expr (TREE_OPERAND (t, 0), 0);
461       h = iterative_hash_expr (TREE_OPERAND (t, 1), h);
462       break;
463
464     case FIELD_DECL:
465       /* We can have types that are compatible, but have different member
466          lists, so we can't hash fields by ID.  Use offsets instead.  */
467       h = iterative_hash_expr (DECL_FIELD_OFFSET (t), 0);
468       h = iterative_hash_expr (DECL_FIELD_BIT_OFFSET (t), h);
469       break;
470
471     case BIT_FIELD_REF:
472       /* Don't take operand 0 into account, that's our parent.  */
473       h = iterative_hash_expr (TREE_OPERAND (t, 1), 0);
474       h = iterative_hash_expr (TREE_OPERAND (t, 2), h);
475       break;
476
477     default:
478       gcc_unreachable ();
479     }
480
481   return h;
482 }
483
484 /* Hash function for type SRA_PAIR.  */
485
486 static hashval_t
487 sra_elt_hash (const void *x)
488 {
489   const struct sra_elt *e = x;
490   const struct sra_elt *p;
491   hashval_t h;
492
493   h = sra_hash_tree (e->element);
494
495   /* Take into account everything except bitfield blocks back up the
496      chain.  Given that chain lengths are rarely very long, this
497      should be acceptable.  If we truly identify this as a performance
498      problem, it should work to hash the pointer value
499      "e->parent".  */
500   for (p = e->parent; p ; p = p->parent)
501     if (!p->in_bitfld_block)
502       h = (h * 65521) ^ sra_hash_tree (p->element);
503
504   return h;
505 }
506
507 /* Equality function for type SRA_PAIR.  */
508
509 static int
510 sra_elt_eq (const void *x, const void *y)
511 {
512   const struct sra_elt *a = x;
513   const struct sra_elt *b = y;
514   tree ae, be;
515   const struct sra_elt *ap = a->parent;
516   const struct sra_elt *bp = b->parent;
517
518   if (ap)
519     while (ap->in_bitfld_block)
520       ap = ap->parent;
521   if (bp)
522     while (bp->in_bitfld_block)
523       bp = bp->parent;
524
525   if (ap != bp)
526     return false;
527
528   ae = a->element;
529   be = b->element;
530
531   if (ae == be)
532     return true;
533   if (TREE_CODE (ae) != TREE_CODE (be))
534     return false;
535
536   switch (TREE_CODE (ae))
537     {
538     case VAR_DECL:
539     case PARM_DECL:
540     case RESULT_DECL:
541       /* These are all pointer unique.  */
542       return false;
543
544     case INTEGER_CST:
545       /* Integers are not pointer unique, so compare their values.  */
546       return tree_int_cst_equal (ae, be);
547
548     case RANGE_EXPR:
549       return
550         tree_int_cst_equal (TREE_OPERAND (ae, 0), TREE_OPERAND (be, 0))
551         && tree_int_cst_equal (TREE_OPERAND (ae, 1), TREE_OPERAND (be, 1));
552
553     case FIELD_DECL:
554       /* Fields are unique within a record, but not between
555          compatible records.  */
556       if (DECL_FIELD_CONTEXT (ae) == DECL_FIELD_CONTEXT (be))
557         return false;
558       return fields_compatible_p (ae, be);
559
560     case BIT_FIELD_REF:
561       return
562         tree_int_cst_equal (TREE_OPERAND (ae, 1), TREE_OPERAND (be, 1))
563         && tree_int_cst_equal (TREE_OPERAND (ae, 2), TREE_OPERAND (be, 2));
564
565     default:
566       gcc_unreachable ();
567     }
568 }
569
570 /* Create or return the SRA_ELT structure for CHILD in PARENT.  PARENT
571    may be null, in which case CHILD must be a DECL.  */
572
573 static struct sra_elt *
574 lookup_element (struct sra_elt *parent, tree child, tree type,
575                 enum insert_option insert)
576 {
577   struct sra_elt dummy;
578   struct sra_elt **slot;
579   struct sra_elt *elt;
580
581   if (parent)
582     dummy.parent = parent->is_group ? parent->parent : parent;
583   else
584     dummy.parent = NULL;
585   dummy.element = child;
586
587   slot = (struct sra_elt **) htab_find_slot (sra_map, &dummy, insert);
588   if (!slot && insert == NO_INSERT)
589     return NULL;
590
591   elt = *slot;
592   if (!elt && insert == INSERT)
593     {
594       *slot = elt = obstack_alloc (&sra_obstack, sizeof (*elt));
595       memset (elt, 0, sizeof (*elt));
596
597       elt->parent = parent;
598       elt->element = child;
599       elt->type = type;
600       elt->is_scalar = is_sra_scalar_type (type);
601
602       if (parent)
603         {
604           if (IS_ELEMENT_FOR_GROUP (elt->element))
605             {
606               elt->is_group = true;
607               elt->sibling = parent->groups;
608               parent->groups = elt;
609             }
610           else
611             {
612               elt->sibling = parent->children;
613               parent->children = elt;
614             }
615         }
616
617       /* If this is a parameter, then if we want to scalarize, we have
618          one copy from the true function parameter.  Count it now.  */
619       if (TREE_CODE (child) == PARM_DECL)
620         {
621           elt->n_copies = 1;
622           bitmap_set_bit (needs_copy_in, DECL_UID (child));
623         }
624     }
625
626   return elt;
627 }
628
629 /* Create or return the SRA_ELT structure for EXPR if the expression
630    refers to a scalarizable variable.  */
631
632 static struct sra_elt *
633 maybe_lookup_element_for_expr (tree expr)
634 {
635   struct sra_elt *elt;
636   tree child;
637
638   switch (TREE_CODE (expr))
639     {
640     case VAR_DECL:
641     case PARM_DECL:
642     case RESULT_DECL:
643       if (is_sra_candidate_decl (expr))
644         return lookup_element (NULL, expr, TREE_TYPE (expr), INSERT);
645       return NULL;
646
647     case ARRAY_REF:
648       /* We can't scalarize variable array indices.  */
649       if (in_array_bounds_p (expr))
650         child = TREE_OPERAND (expr, 1);
651       else
652         return NULL;
653       break;
654
655     case ARRAY_RANGE_REF:
656       /* We can't scalarize variable array indices.  */
657       if (range_in_array_bounds_p (expr))
658         {
659           tree domain = TYPE_DOMAIN (TREE_TYPE (expr));
660           child = build2 (RANGE_EXPR, integer_type_node,
661                           TYPE_MIN_VALUE (domain), TYPE_MAX_VALUE (domain));
662         }
663       else
664         return NULL;
665       break;
666
667     case COMPONENT_REF:
668       {
669         tree type = TREE_TYPE (TREE_OPERAND (expr, 0));
670         /* Don't look through unions.  */
671         if (TREE_CODE (type) != RECORD_TYPE)
672           return NULL;
673         /* Neither through variable-sized records.  */
674         if (TYPE_SIZE (type) == NULL_TREE
675             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
676           return NULL;
677         child = TREE_OPERAND (expr, 1);
678       }
679       break;
680
681     case REALPART_EXPR:
682       child = integer_zero_node;
683       break;
684     case IMAGPART_EXPR:
685       child = integer_one_node;
686       break;
687
688     default:
689       return NULL;
690     }
691
692   elt = maybe_lookup_element_for_expr (TREE_OPERAND (expr, 0));
693   if (elt)
694     return lookup_element (elt, child, TREE_TYPE (expr), INSERT);
695   return NULL;
696 }
697
698 \f
699 /* Functions to walk just enough of the tree to see all scalarizable
700    references, and categorize them.  */
701
702 /* A set of callbacks for phases 2 and 4.  They'll be invoked for the
703    various kinds of references seen.  In all cases, *BSI is an iterator
704    pointing to the statement being processed.  */
705 struct sra_walk_fns
706 {
707   /* Invoked when ELT is required as a unit.  Note that ELT might refer to
708      a leaf node, in which case this is a simple scalar reference.  *EXPR_P
709      points to the location of the expression.  IS_OUTPUT is true if this
710      is a left-hand-side reference.  USE_ALL is true if we saw something we
711      couldn't quite identify and had to force the use of the entire object.  */
712   void (*use) (struct sra_elt *elt, tree *expr_p,
713                block_stmt_iterator *bsi, bool is_output, bool use_all);
714
715   /* Invoked when we have a copy between two scalarizable references.  */
716   void (*copy) (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
717                 block_stmt_iterator *bsi);
718
719   /* Invoked when ELT is initialized from a constant.  VALUE may be NULL,
720      in which case it should be treated as an empty CONSTRUCTOR.  */
721   void (*init) (struct sra_elt *elt, tree value, block_stmt_iterator *bsi);
722
723   /* Invoked when we have a copy between one scalarizable reference ELT
724      and one non-scalarizable reference OTHER without side-effects. 
725      IS_OUTPUT is true if ELT is on the left-hand side.  */
726   void (*ldst) (struct sra_elt *elt, tree other,
727                 block_stmt_iterator *bsi, bool is_output);
728
729   /* True during phase 2, false during phase 4.  */
730   /* ??? This is a hack.  */
731   bool initial_scan;
732 };
733
734 #ifdef ENABLE_CHECKING
735 /* Invoked via walk_tree, if *TP contains a candidate decl, return it.  */
736
737 static tree
738 sra_find_candidate_decl (tree *tp, int *walk_subtrees,
739                          void *data ATTRIBUTE_UNUSED)
740 {
741   tree t = *tp;
742   enum tree_code code = TREE_CODE (t);
743
744   if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
745     {
746       *walk_subtrees = 0;
747       if (is_sra_candidate_decl (t))
748         return t;
749     }
750   else if (TYPE_P (t))
751     *walk_subtrees = 0;
752
753   return NULL;
754 }
755 #endif
756
757 /* Walk most expressions looking for a scalarizable aggregate.
758    If we find one, invoke FNS->USE.  */
759
760 static void
761 sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
762                const struct sra_walk_fns *fns)
763 {
764   tree expr = *expr_p;
765   tree inner = expr;
766   bool disable_scalarization = false;
767   bool use_all_p = false;
768
769   /* We're looking to collect a reference expression between EXPR and INNER,
770      such that INNER is a scalarizable decl and all other nodes through EXPR
771      are references that we can scalarize.  If we come across something that
772      we can't scalarize, we reset EXPR.  This has the effect of making it
773      appear that we're referring to the larger expression as a whole.  */
774
775   while (1)
776     switch (TREE_CODE (inner))
777       {
778       case VAR_DECL:
779       case PARM_DECL:
780       case RESULT_DECL:
781         /* If there is a scalarizable decl at the bottom, then process it.  */
782         if (is_sra_candidate_decl (inner))
783           {
784             struct sra_elt *elt = maybe_lookup_element_for_expr (expr);
785             if (disable_scalarization)
786               elt->cannot_scalarize = true;
787             else
788               fns->use (elt, expr_p, bsi, is_output, use_all_p);
789           }
790         return;
791
792       case ARRAY_REF:
793         /* Non-constant index means any member may be accessed.  Prevent the
794            expression from being scalarized.  If we were to treat this as a
795            reference to the whole array, we can wind up with a single dynamic
796            index reference inside a loop being overridden by several constant
797            index references during loop setup.  It's possible that this could
798            be avoided by using dynamic usage counts based on BB trip counts
799            (based on loop analysis or profiling), but that hardly seems worth
800            the effort.  */
801         /* ??? Hack.  Figure out how to push this into the scan routines
802            without duplicating too much code.  */
803         if (!in_array_bounds_p (inner))
804           {
805             disable_scalarization = true;
806             goto use_all;
807           }
808         /* ??? Are we assured that non-constant bounds and stride will have
809            the same value everywhere?  I don't think Fortran will...  */
810         if (TREE_OPERAND (inner, 2) || TREE_OPERAND (inner, 3))
811           goto use_all;
812         inner = TREE_OPERAND (inner, 0);
813         break;
814
815       case ARRAY_RANGE_REF:
816         if (!range_in_array_bounds_p (inner))
817           {
818             disable_scalarization = true;
819             goto use_all;
820           }
821         /* ??? See above non-constant bounds and stride .  */
822         if (TREE_OPERAND (inner, 2) || TREE_OPERAND (inner, 3))
823           goto use_all;
824         inner = TREE_OPERAND (inner, 0);
825         break;
826
827       case COMPONENT_REF:
828         {
829           tree type = TREE_TYPE (TREE_OPERAND (inner, 0));
830           /* Don't look through unions.  */
831           if (TREE_CODE (type) != RECORD_TYPE)
832             goto use_all;
833           /* Neither through variable-sized records.  */
834           if (TYPE_SIZE (type) == NULL_TREE
835               || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
836             goto use_all;
837           inner = TREE_OPERAND (inner, 0);
838         }
839         break;
840
841       case REALPART_EXPR:
842       case IMAGPART_EXPR:
843         inner = TREE_OPERAND (inner, 0);
844         break;
845
846       case BIT_FIELD_REF:
847         /* A bit field reference to a specific vector is scalarized but for
848            ones for inputs need to be marked as used on the left hand size so
849            when we scalarize it, we can mark that variable as non renamable.  */
850         if (is_output
851             && TREE_CODE (TREE_TYPE (TREE_OPERAND (inner, 0))) == VECTOR_TYPE)
852           {
853             struct sra_elt *elt
854               = maybe_lookup_element_for_expr (TREE_OPERAND (inner, 0));
855             if (elt)
856               elt->is_vector_lhs = true;
857           }
858         /* A bit field reference (access to *multiple* fields simultaneously)
859            is not currently scalarized.  Consider this an access to the
860            complete outer element, to which walk_tree will bring us next.  */
861           
862         goto use_all;
863
864       case VIEW_CONVERT_EXPR:
865       case NOP_EXPR:
866         /* Similarly, a view/nop explicitly wants to look at an object in a
867            type other than the one we've scalarized.  */
868         goto use_all;
869
870       case WITH_SIZE_EXPR:
871         /* This is a transparent wrapper.  The entire inner expression really
872            is being used.  */
873         goto use_all;
874
875       use_all:
876         expr_p = &TREE_OPERAND (inner, 0);
877         inner = expr = *expr_p;
878         use_all_p = true;
879         break;
880
881       default:
882 #ifdef ENABLE_CHECKING
883         /* Validate that we're not missing any references.  */
884         gcc_assert (!walk_tree (&inner, sra_find_candidate_decl, NULL, NULL));
885 #endif
886         return;
887       }
888 }
889
890 /* Walk a TREE_LIST of values looking for scalarizable aggregates.
891    If we find one, invoke FNS->USE.  */
892
893 static void
894 sra_walk_tree_list (tree list, block_stmt_iterator *bsi, bool is_output,
895                     const struct sra_walk_fns *fns)
896 {
897   tree op;
898   for (op = list; op ; op = TREE_CHAIN (op))
899     sra_walk_expr (&TREE_VALUE (op), bsi, is_output, fns);
900 }
901
902 /* Walk the arguments of a CALL_EXPR looking for scalarizable aggregates.
903    If we find one, invoke FNS->USE.  */
904
905 static void
906 sra_walk_call_expr (tree expr, block_stmt_iterator *bsi,
907                     const struct sra_walk_fns *fns)
908 {
909   int i;
910   int nargs = call_expr_nargs (expr);
911   for (i = 0; i < nargs; i++)
912     sra_walk_expr (&CALL_EXPR_ARG (expr, i), bsi, false, fns);
913 }
914
915 /* Walk the inputs and outputs of an ASM_EXPR looking for scalarizable
916    aggregates.  If we find one, invoke FNS->USE.  */
917
918 static void
919 sra_walk_asm_expr (tree expr, block_stmt_iterator *bsi,
920                    const struct sra_walk_fns *fns)
921 {
922   sra_walk_tree_list (ASM_INPUTS (expr), bsi, false, fns);
923   sra_walk_tree_list (ASM_OUTPUTS (expr), bsi, true, fns);
924 }
925
926 /* Walk a GIMPLE_MODIFY_STMT and categorize the assignment appropriately.  */
927
928 static void
929 sra_walk_gimple_modify_stmt (tree expr, block_stmt_iterator *bsi,
930                              const struct sra_walk_fns *fns)
931 {
932   struct sra_elt *lhs_elt, *rhs_elt;
933   tree lhs, rhs;
934
935   lhs = GIMPLE_STMT_OPERAND (expr, 0);
936   rhs = GIMPLE_STMT_OPERAND (expr, 1);
937   lhs_elt = maybe_lookup_element_for_expr (lhs);
938   rhs_elt = maybe_lookup_element_for_expr (rhs);
939
940   /* If both sides are scalarizable, this is a COPY operation.  */
941   if (lhs_elt && rhs_elt)
942     {
943       fns->copy (lhs_elt, rhs_elt, bsi);
944       return;
945     }
946
947   /* If the RHS is scalarizable, handle it.  There are only two cases.  */
948   if (rhs_elt)
949     {
950       if (!rhs_elt->is_scalar && !TREE_SIDE_EFFECTS (lhs))
951         fns->ldst (rhs_elt, lhs, bsi, false);
952       else
953         fns->use (rhs_elt, &GIMPLE_STMT_OPERAND (expr, 1), bsi, false, false);
954     }
955
956   /* If it isn't scalarizable, there may be scalarizable variables within, so
957      check for a call or else walk the RHS to see if we need to do any
958      copy-in operations.  We need to do it before the LHS is scalarized so
959      that the statements get inserted in the proper place, before any
960      copy-out operations.  */
961   else
962     {
963       tree call = get_call_expr_in (rhs);
964       if (call)
965         sra_walk_call_expr (call, bsi, fns);
966       else
967         sra_walk_expr (&GIMPLE_STMT_OPERAND (expr, 1), bsi, false, fns);
968     }
969
970   /* Likewise, handle the LHS being scalarizable.  We have cases similar
971      to those above, but also want to handle RHS being constant.  */
972   if (lhs_elt)
973     {
974       /* If this is an assignment from a constant, or constructor, then
975          we have access to all of the elements individually.  Invoke INIT.  */
976       if (TREE_CODE (rhs) == COMPLEX_EXPR
977           || TREE_CODE (rhs) == COMPLEX_CST
978           || TREE_CODE (rhs) == CONSTRUCTOR)
979         fns->init (lhs_elt, rhs, bsi);
980
981       /* If this is an assignment from read-only memory, treat this as if
982          we'd been passed the constructor directly.  Invoke INIT.  */
983       else if (TREE_CODE (rhs) == VAR_DECL
984                && TREE_STATIC (rhs)
985                && TREE_READONLY (rhs)
986                && targetm.binds_local_p (rhs))
987         fns->init (lhs_elt, DECL_INITIAL (rhs), bsi);
988
989       /* If this is a copy from a non-scalarizable lvalue, invoke LDST.
990          The lvalue requirement prevents us from trying to directly scalarize
991          the result of a function call.  Which would result in trying to call
992          the function multiple times, and other evil things.  */
993       else if (!lhs_elt->is_scalar
994                && !TREE_SIDE_EFFECTS (rhs) && is_gimple_addressable (rhs))
995         fns->ldst (lhs_elt, rhs, bsi, true);
996
997       /* Otherwise we're being used in some context that requires the
998          aggregate to be seen as a whole.  Invoke USE.  */
999       else
1000         fns->use (lhs_elt, &GIMPLE_STMT_OPERAND (expr, 0), bsi, true, false);
1001     }
1002
1003   /* Similarly to above, LHS_ELT being null only means that the LHS as a
1004      whole is not a scalarizable reference.  There may be occurrences of
1005      scalarizable variables within, which implies a USE.  */
1006   else
1007     sra_walk_expr (&GIMPLE_STMT_OPERAND (expr, 0), bsi, true, fns);
1008 }
1009
1010 /* Entry point to the walk functions.  Search the entire function,
1011    invoking the callbacks in FNS on each of the references to
1012    scalarizable variables.  */
1013
1014 static void
1015 sra_walk_function (const struct sra_walk_fns *fns)
1016 {
1017   basic_block bb;
1018   block_stmt_iterator si, ni;
1019
1020   /* ??? Phase 4 could derive some benefit to walking the function in
1021      dominator tree order.  */
1022
1023   FOR_EACH_BB (bb)
1024     for (si = bsi_start (bb); !bsi_end_p (si); si = ni)
1025       {
1026         tree stmt, t;
1027         stmt_ann_t ann;
1028
1029         stmt = bsi_stmt (si);
1030         ann = stmt_ann (stmt);
1031
1032         ni = si;
1033         bsi_next (&ni);
1034
1035         /* If the statement has no virtual operands, then it doesn't
1036            make any structure references that we care about.  */
1037         if (gimple_aliases_computed_p (cfun)
1038             && ZERO_SSA_OPERANDS (stmt, (SSA_OP_VIRTUAL_DEFS | SSA_OP_VUSE)))
1039               continue;
1040
1041         switch (TREE_CODE (stmt))
1042           {
1043           case RETURN_EXPR:
1044             /* If we have "return <retval>" then the return value is
1045                already exposed for our pleasure.  Walk it as a USE to
1046                force all the components back in place for the return.
1047
1048                If we have an embedded assignment, then <retval> is of
1049                a type that gets returned in registers in this ABI, and
1050                we do not wish to extend their lifetimes.  Treat this
1051                as a USE of the variable on the RHS of this assignment.  */
1052
1053             t = TREE_OPERAND (stmt, 0);
1054             if (t == NULL_TREE)
1055               ;
1056             else if (TREE_CODE (t) == GIMPLE_MODIFY_STMT)
1057               sra_walk_expr (&GIMPLE_STMT_OPERAND (t, 1), &si, false, fns);
1058             else
1059               sra_walk_expr (&TREE_OPERAND (stmt, 0), &si, false, fns);
1060             break;
1061
1062           case GIMPLE_MODIFY_STMT:
1063             sra_walk_gimple_modify_stmt (stmt, &si, fns);
1064             break;
1065           case CALL_EXPR:
1066             sra_walk_call_expr (stmt, &si, fns);
1067             break;
1068           case ASM_EXPR:
1069             sra_walk_asm_expr (stmt, &si, fns);
1070             break;
1071
1072           default:
1073             break;
1074           }
1075       }
1076 }
1077 \f
1078 /* Phase One: Scan all referenced variables in the program looking for
1079    structures that could be decomposed.  */
1080
1081 static bool
1082 find_candidates_for_sra (void)
1083 {
1084   bool any_set = false;
1085   tree var;
1086   referenced_var_iterator rvi;
1087
1088   FOR_EACH_REFERENCED_VAR (var, rvi)
1089     {
1090       if (decl_can_be_decomposed_p (var))
1091         {
1092           bitmap_set_bit (sra_candidates, DECL_UID (var));
1093           any_set = true;
1094         }
1095     }
1096
1097   return any_set;
1098 }
1099
1100 \f
1101 /* Phase Two: Scan all references to scalarizable variables.  Count the
1102    number of times they are used or copied respectively.  */
1103
1104 /* Callbacks to fill in SRA_WALK_FNS.  Everything but USE is
1105    considered a copy, because we can decompose the reference such that
1106    the sub-elements needn't be contiguous.  */
1107
1108 static void
1109 scan_use (struct sra_elt *elt, tree *expr_p ATTRIBUTE_UNUSED,
1110           block_stmt_iterator *bsi ATTRIBUTE_UNUSED,
1111           bool is_output ATTRIBUTE_UNUSED, bool use_all ATTRIBUTE_UNUSED)
1112 {
1113   elt->n_uses += 1;
1114 }
1115
1116 static void
1117 scan_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
1118            block_stmt_iterator *bsi ATTRIBUTE_UNUSED)
1119 {
1120   lhs_elt->n_copies += 1;
1121   rhs_elt->n_copies += 1;
1122 }
1123
1124 static void
1125 scan_init (struct sra_elt *lhs_elt, tree rhs ATTRIBUTE_UNUSED,
1126            block_stmt_iterator *bsi ATTRIBUTE_UNUSED)
1127 {
1128   lhs_elt->n_copies += 1;
1129 }
1130
1131 static void
1132 scan_ldst (struct sra_elt *elt, tree other ATTRIBUTE_UNUSED,
1133            block_stmt_iterator *bsi ATTRIBUTE_UNUSED,
1134            bool is_output ATTRIBUTE_UNUSED)
1135 {
1136   elt->n_copies += 1;
1137 }
1138
1139 /* Dump the values we collected during the scanning phase.  */
1140
1141 static void
1142 scan_dump (struct sra_elt *elt)
1143 {
1144   struct sra_elt *c;
1145
1146   dump_sra_elt_name (dump_file, elt);
1147   fprintf (dump_file, ": n_uses=%u n_copies=%u\n", elt->n_uses, elt->n_copies);
1148
1149   for (c = elt->children; c ; c = c->sibling)
1150     scan_dump (c);
1151
1152   for (c = elt->groups; c ; c = c->sibling)
1153     scan_dump (c);
1154 }
1155
1156 /* Entry point to phase 2.  Scan the entire function, building up
1157    scalarization data structures, recording copies and uses.  */
1158
1159 static void
1160 scan_function (void)
1161 {
1162   static const struct sra_walk_fns fns = {
1163     scan_use, scan_copy, scan_init, scan_ldst, true
1164   };
1165
1166   sra_walk_function (&fns);
1167
1168   if (dump_file && (dump_flags & TDF_DETAILS))
1169     {
1170       referenced_var_iterator ri;
1171       tree var;
1172
1173       fputs ("\nScan results:\n", dump_file);
1174       FOR_EACH_REFERENCED_VAR_IN_BITMAP (sra_candidates, var, ri)
1175         {
1176           struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
1177           if (elt)
1178             scan_dump (elt);
1179         }
1180       fputc ('\n', dump_file);
1181     }
1182 }
1183 \f
1184 /* Phase Three: Make decisions about which variables to scalarize, if any.
1185    All elements to be scalarized have replacement variables made for them.  */
1186
1187 /* A subroutine of build_element_name.  Recursively build the element
1188    name on the obstack.  */
1189
1190 static void
1191 build_element_name_1 (struct sra_elt *elt)
1192 {
1193   tree t;
1194   char buffer[32];
1195
1196   if (elt->parent)
1197     {
1198       build_element_name_1 (elt->parent);
1199       obstack_1grow (&sra_obstack, '$');
1200
1201       if (TREE_CODE (elt->parent->type) == COMPLEX_TYPE)
1202         {
1203           if (elt->element == integer_zero_node)
1204             obstack_grow (&sra_obstack, "real", 4);
1205           else
1206             obstack_grow (&sra_obstack, "imag", 4);
1207           return;
1208         }
1209     }
1210
1211   t = elt->element;
1212   if (TREE_CODE (t) == INTEGER_CST)
1213     {
1214       /* ??? Eh.  Don't bother doing double-wide printing.  */
1215       sprintf (buffer, HOST_WIDE_INT_PRINT_DEC, TREE_INT_CST_LOW (t));
1216       obstack_grow (&sra_obstack, buffer, strlen (buffer));
1217     }
1218   else if (TREE_CODE (t) == BIT_FIELD_REF)
1219     {
1220       sprintf (buffer, "B" HOST_WIDE_INT_PRINT_DEC,
1221                tree_low_cst (TREE_OPERAND (t, 2), 1));
1222       obstack_grow (&sra_obstack, buffer, strlen (buffer));
1223       sprintf (buffer, "F" HOST_WIDE_INT_PRINT_DEC,
1224                tree_low_cst (TREE_OPERAND (t, 1), 1));
1225       obstack_grow (&sra_obstack, buffer, strlen (buffer));
1226     }
1227   else
1228     {
1229       tree name = DECL_NAME (t);
1230       if (name)
1231         obstack_grow (&sra_obstack, IDENTIFIER_POINTER (name),
1232                       IDENTIFIER_LENGTH (name));
1233       else
1234         {
1235           sprintf (buffer, "D%u", DECL_UID (t));
1236           obstack_grow (&sra_obstack, buffer, strlen (buffer));
1237         }
1238     }
1239 }
1240
1241 /* Construct a pretty variable name for an element's replacement variable.
1242    The name is built on the obstack.  */
1243
1244 static char *
1245 build_element_name (struct sra_elt *elt)
1246 {
1247   build_element_name_1 (elt);
1248   obstack_1grow (&sra_obstack, '\0');
1249   return XOBFINISH (&sra_obstack, char *);
1250 }
1251
1252 /* Instantiate an element as an independent variable.  */
1253
1254 static void
1255 instantiate_element (struct sra_elt *elt)
1256 {
1257   struct sra_elt *base_elt;
1258   tree var, base;
1259   bool nowarn = TREE_NO_WARNING (elt->element);
1260
1261   for (base_elt = elt; base_elt->parent; base_elt = base_elt->parent)
1262     if (!nowarn)
1263       nowarn = TREE_NO_WARNING (base_elt->parent->element);
1264   base = base_elt->element;
1265
1266   elt->replacement = var = make_rename_temp (elt->type, "SR");
1267
1268   if (DECL_P (elt->element)
1269       && !tree_int_cst_equal (DECL_SIZE (var), DECL_SIZE (elt->element)))
1270     {
1271       DECL_SIZE (var) = DECL_SIZE (elt->element);
1272       DECL_SIZE_UNIT (var) = DECL_SIZE_UNIT (elt->element);
1273
1274       elt->in_bitfld_block = 1;
1275       elt->replacement = build3 (BIT_FIELD_REF, elt->type, var,
1276                                  DECL_SIZE (var),
1277                                  BYTES_BIG_ENDIAN
1278                                  ? size_binop (MINUS_EXPR,
1279                                                TYPE_SIZE (elt->type),
1280                                                DECL_SIZE (var))
1281                                  : bitsize_int (0));
1282       if (!INTEGRAL_TYPE_P (elt->type)
1283           || TYPE_UNSIGNED (elt->type))
1284         BIT_FIELD_REF_UNSIGNED (elt->replacement) = 1;
1285     }
1286
1287   /* For vectors, if used on the left hand side with BIT_FIELD_REF,
1288      they are not a gimple register.  */
1289   if (TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE && elt->is_vector_lhs)
1290     DECL_GIMPLE_REG_P (var) = 0;
1291
1292   DECL_SOURCE_LOCATION (var) = DECL_SOURCE_LOCATION (base);
1293   DECL_ARTIFICIAL (var) = 1;
1294
1295   if (TREE_THIS_VOLATILE (elt->type))
1296     {
1297       TREE_THIS_VOLATILE (var) = 1;
1298       TREE_SIDE_EFFECTS (var) = 1;
1299     }
1300
1301   if (DECL_NAME (base) && !DECL_IGNORED_P (base))
1302     {
1303       char *pretty_name = build_element_name (elt);
1304       DECL_NAME (var) = get_identifier (pretty_name);
1305       obstack_free (&sra_obstack, pretty_name);
1306
1307       SET_DECL_DEBUG_EXPR (var, generate_element_ref (elt));
1308       DECL_DEBUG_EXPR_IS_FROM (var) = 1;
1309       
1310       DECL_IGNORED_P (var) = 0;
1311       TREE_NO_WARNING (var) = nowarn;
1312     }
1313   else
1314     {
1315       DECL_IGNORED_P (var) = 1;
1316       /* ??? We can't generate any warning that would be meaningful.  */
1317       TREE_NO_WARNING (var) = 1;
1318     }
1319
1320   /* Zero-initialize bit-field scalarization variables, to avoid
1321      triggering undefined behavior.  */
1322   if (TREE_CODE (elt->element) == BIT_FIELD_REF
1323       || (var != elt->replacement
1324           && TREE_CODE (elt->replacement) == BIT_FIELD_REF))
1325     {
1326       tree init = sra_build_assignment (var, fold_convert (TREE_TYPE (var),
1327                                                            integer_zero_node));
1328       insert_edge_copies (init, ENTRY_BLOCK_PTR);
1329       mark_all_v_defs (init);
1330     }
1331
1332   if (dump_file)
1333     {
1334       fputs ("  ", dump_file);
1335       dump_sra_elt_name (dump_file, elt);
1336       fputs (" -> ", dump_file);
1337       print_generic_expr (dump_file, var, dump_flags);
1338       fputc ('\n', dump_file);
1339     }
1340 }
1341
1342 /* Make one pass across an element tree deciding whether or not it's
1343    profitable to instantiate individual leaf scalars.
1344
1345    PARENT_USES and PARENT_COPIES are the sum of the N_USES and N_COPIES
1346    fields all the way up the tree.  */
1347
1348 static void
1349 decide_instantiation_1 (struct sra_elt *elt, unsigned int parent_uses,
1350                         unsigned int parent_copies)
1351 {
1352   if (dump_file && !elt->parent)
1353     {
1354       fputs ("Initial instantiation for ", dump_file);
1355       dump_sra_elt_name (dump_file, elt);
1356       fputc ('\n', dump_file);
1357     }
1358
1359   if (elt->cannot_scalarize)
1360     return;
1361
1362   if (elt->is_scalar)
1363     {
1364       /* The decision is simple: instantiate if we're used more frequently
1365          than the parent needs to be seen as a complete unit.  */
1366       if (elt->n_uses + elt->n_copies + parent_copies > parent_uses)
1367         instantiate_element (elt);
1368     }
1369   else
1370     {
1371       struct sra_elt *c, *group;
1372       unsigned int this_uses = elt->n_uses + parent_uses;
1373       unsigned int this_copies = elt->n_copies + parent_copies;
1374
1375       /* Consider groups of sub-elements as weighing in favour of
1376          instantiation whatever their size.  */
1377       for (group = elt->groups; group ; group = group->sibling)
1378         FOR_EACH_ACTUAL_CHILD (c, group)
1379           {
1380             c->n_uses += group->n_uses;
1381             c->n_copies += group->n_copies;
1382           }
1383
1384       for (c = elt->children; c ; c = c->sibling)
1385         decide_instantiation_1 (c, this_uses, this_copies);
1386     }
1387 }
1388
1389 /* Compute the size and number of all instantiated elements below ELT.
1390    We will only care about this if the size of the complete structure
1391    fits in a HOST_WIDE_INT, so we don't have to worry about overflow.  */
1392
1393 static unsigned int
1394 sum_instantiated_sizes (struct sra_elt *elt, unsigned HOST_WIDE_INT *sizep)
1395 {
1396   if (elt->replacement)
1397     {
1398       *sizep += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (elt->type));
1399       return 1;
1400     }
1401   else
1402     {
1403       struct sra_elt *c;
1404       unsigned int count = 0;
1405
1406       for (c = elt->children; c ; c = c->sibling)
1407         count += sum_instantiated_sizes (c, sizep);
1408
1409       return count;
1410     }
1411 }
1412
1413 /* Instantiate fields in ELT->TYPE that are not currently present as
1414    children of ELT.  */
1415
1416 static void instantiate_missing_elements (struct sra_elt *elt);
1417
1418 static struct sra_elt *
1419 instantiate_missing_elements_1 (struct sra_elt *elt, tree child, tree type)
1420 {
1421   struct sra_elt *sub = lookup_element (elt, child, type, INSERT);
1422   if (sub->is_scalar)
1423     {
1424       if (sub->replacement == NULL)
1425         instantiate_element (sub);
1426     }
1427   else
1428     instantiate_missing_elements (sub);
1429   return sub;
1430 }
1431
1432 /* Obtain the canonical type for field F of ELEMENT.  */
1433
1434 static tree
1435 canon_type_for_field (tree f, tree element)
1436 {
1437   tree field_type = TREE_TYPE (f);
1438
1439   /* canonicalize_component_ref() unwidens some bit-field types (not
1440      marked as DECL_BIT_FIELD in C++), so we must do the same, lest we
1441      may introduce type mismatches.  */
1442   if (INTEGRAL_TYPE_P (field_type)
1443       && DECL_MODE (f) != TYPE_MODE (field_type))
1444     field_type = TREE_TYPE (get_unwidened (build3 (COMPONENT_REF,
1445                                                    field_type,
1446                                                    element,
1447                                                    f, NULL_TREE),
1448                                            NULL_TREE));
1449
1450   return field_type;
1451 }
1452
1453 /* Look for adjacent fields of ELT starting at F that we'd like to
1454    scalarize as a single variable.  Return the last field of the
1455    group.  */
1456
1457 static tree
1458 try_instantiate_multiple_fields (struct sra_elt *elt, tree f)
1459 {
1460   int count;
1461   unsigned HOST_WIDE_INT align, bit, size, alchk;
1462   enum machine_mode mode;
1463   tree first = f, prev;
1464   tree type, var;
1465   struct sra_elt *block;
1466
1467   if (!is_sra_scalar_type (TREE_TYPE (f))
1468       || !host_integerp (DECL_FIELD_OFFSET (f), 1)
1469       || !host_integerp (DECL_FIELD_BIT_OFFSET (f), 1)
1470       || !host_integerp (DECL_SIZE (f), 1)
1471       || lookup_element (elt, f, NULL, NO_INSERT))
1472     return f;
1473
1474   block = elt;
1475
1476   /* For complex and array objects, there are going to be integer
1477      literals as child elements.  In this case, we can't just take the
1478      alignment and mode of the decl, so we instead rely on the element
1479      type.
1480
1481      ??? We could try to infer additional alignment from the full
1482      object declaration and the location of the sub-elements we're
1483      accessing.  */
1484   for (count = 0; !DECL_P (block->element); count++)
1485     block = block->parent;
1486
1487   align = DECL_ALIGN (block->element);
1488   alchk = GET_MODE_BITSIZE (DECL_MODE (block->element));
1489
1490   if (count)
1491     {
1492       type = TREE_TYPE (block->element);
1493       while (count--)
1494         type = TREE_TYPE (type);
1495
1496       align = TYPE_ALIGN (type);
1497       alchk = GET_MODE_BITSIZE (TYPE_MODE (type));
1498     }
1499
1500   if (align < alchk)
1501     align = alchk;
1502
1503   /* Coalescing wider fields is probably pointless and
1504      inefficient.  */
1505   if (align > BITS_PER_WORD)
1506     align = BITS_PER_WORD;
1507
1508   bit = tree_low_cst (DECL_FIELD_OFFSET (f), 1) * BITS_PER_UNIT
1509     + tree_low_cst (DECL_FIELD_BIT_OFFSET (f), 1);
1510   size = tree_low_cst (DECL_SIZE (f), 1);
1511
1512   alchk = align - 1;
1513   alchk = ~alchk;
1514
1515   if ((bit & alchk) != ((bit + size - 1) & alchk))
1516     return f;
1517
1518   /* Find adjacent fields in the same alignment word.  */
1519
1520   for (prev = f, f = TREE_CHAIN (f);
1521        f && TREE_CODE (f) == FIELD_DECL
1522          && is_sra_scalar_type (TREE_TYPE (f))
1523          && host_integerp (DECL_FIELD_OFFSET (f), 1)
1524          && host_integerp (DECL_FIELD_BIT_OFFSET (f), 1)
1525          && host_integerp (DECL_SIZE (f), 1)
1526          && !lookup_element (elt, f, NULL, NO_INSERT);
1527        prev = f, f = TREE_CHAIN (f))
1528     {
1529       unsigned HOST_WIDE_INT nbit, nsize;
1530
1531       nbit = tree_low_cst (DECL_FIELD_OFFSET (f), 1) * BITS_PER_UNIT
1532         + tree_low_cst (DECL_FIELD_BIT_OFFSET (f), 1);
1533       nsize = tree_low_cst (DECL_SIZE (f), 1);
1534
1535       if (bit + size == nbit)
1536         {
1537           if ((bit & alchk) != ((nbit + nsize - 1) & alchk))
1538             {
1539               /* If we're at an alignment boundary, don't bother
1540                  growing alignment such that we can include this next
1541                  field.  */
1542               if ((nbit & alchk)
1543                   || GET_MODE_BITSIZE (DECL_MODE (f)) <= align)
1544                 break;
1545
1546               align = GET_MODE_BITSIZE (DECL_MODE (f));
1547               alchk = align - 1;
1548               alchk = ~alchk;
1549
1550               if ((bit & alchk) != ((nbit + nsize - 1) & alchk))
1551                 break;
1552             }
1553           size += nsize;
1554         }
1555       else if (nbit + nsize == bit)
1556         {
1557           if ((nbit & alchk) != ((bit + size - 1) & alchk))
1558             {
1559               if ((bit & alchk)
1560                   || GET_MODE_BITSIZE (DECL_MODE (f)) <= align)
1561                 break;
1562
1563               align = GET_MODE_BITSIZE (DECL_MODE (f));
1564               alchk = align - 1;
1565               alchk = ~alchk;
1566
1567               if ((nbit & alchk) != ((bit + size - 1) & alchk))
1568                 break;
1569             }
1570           bit = nbit;
1571           size += nsize;
1572         }
1573       else
1574         break;
1575     }
1576
1577   f = prev;
1578
1579   if (f == first)
1580     return f;
1581
1582   gcc_assert ((bit & alchk) == ((bit + size - 1) & alchk));
1583
1584   /* Try to widen the bit range so as to cover padding bits as well.  */
1585
1586   if ((bit & ~alchk) || size != align)
1587     {
1588       unsigned HOST_WIDE_INT mbit = bit & alchk;
1589       unsigned HOST_WIDE_INT msize = align;
1590
1591       for (f = TYPE_FIELDS (elt->type);
1592            f; f = TREE_CHAIN (f))
1593         {
1594           unsigned HOST_WIDE_INT fbit, fsize;
1595
1596           /* Skip the fields from first to prev.  */
1597           if (f == first)
1598             {
1599               f = prev;
1600               continue;
1601             }
1602
1603           if (!(TREE_CODE (f) == FIELD_DECL
1604                 && host_integerp (DECL_FIELD_OFFSET (f), 1)
1605                 && host_integerp (DECL_FIELD_BIT_OFFSET (f), 1)))
1606             continue;
1607
1608           fbit = tree_low_cst (DECL_FIELD_OFFSET (f), 1) * BITS_PER_UNIT
1609             + tree_low_cst (DECL_FIELD_BIT_OFFSET (f), 1);
1610
1611           /* If we're past the selected word, we're fine.  */
1612           if ((bit & alchk) < (fbit & alchk))
1613             continue;
1614
1615           if (host_integerp (DECL_SIZE (f), 1))
1616             fsize = tree_low_cst (DECL_SIZE (f), 1);
1617           else
1618             /* Assume a variable-sized field takes up all space till
1619                the end of the word.  ??? Endianness issues?  */
1620             fsize = align - (fbit & alchk);
1621
1622           if ((fbit & alchk) < (bit & alchk))
1623             {
1624               /* A large field might start at a previous word and
1625                  extend into the selected word.  Exclude those
1626                  bits.  ??? Endianness issues? */
1627               HOST_WIDE_INT diff = fbit + fsize - mbit;
1628
1629               if (diff <= 0)
1630                 continue;
1631
1632               mbit += diff;
1633               msize -= diff;
1634             }
1635           else
1636             {
1637               /* Non-overlapping, great.  */
1638               if (fbit + fsize <= mbit
1639                   || mbit + msize <= fbit)
1640                 continue;
1641
1642               if (fbit <= mbit)
1643                 {
1644                   unsigned HOST_WIDE_INT diff = fbit + fsize - mbit;
1645                   mbit += diff;
1646                   msize -= diff;
1647                 }
1648               else if (fbit > mbit)
1649                 msize -= (mbit + msize - fbit);
1650               else
1651                 gcc_unreachable ();
1652             }
1653         }
1654
1655       bit = mbit;
1656       size = msize;
1657     }
1658
1659   /* Now we know the bit range we're interested in.  Find the smallest
1660      machine mode we can use to access it.  */
1661
1662   for (mode = smallest_mode_for_size (size, MODE_INT);
1663        ;
1664        mode = GET_MODE_WIDER_MODE (mode))
1665     {
1666       gcc_assert (mode != VOIDmode);
1667
1668       alchk = GET_MODE_PRECISION (mode) - 1;
1669       alchk = ~alchk;
1670
1671       if ((bit & alchk) == ((bit + size - 1) & alchk))
1672         break;
1673     }
1674
1675   gcc_assert (~alchk < align);
1676
1677   /* Create the field group as a single variable.  */
1678
1679   type = lang_hooks.types.type_for_mode (mode, 1);
1680   gcc_assert (type);
1681   var = build3 (BIT_FIELD_REF, type, NULL_TREE,
1682                 bitsize_int (size),
1683                 bitsize_int (bit));
1684   BIT_FIELD_REF_UNSIGNED (var) = 1;
1685
1686   block = instantiate_missing_elements_1 (elt, var, type);
1687   gcc_assert (block && block->is_scalar);
1688
1689   var = block->replacement;
1690
1691   if ((bit & ~alchk)
1692       || (HOST_WIDE_INT)size != tree_low_cst (DECL_SIZE (var), 1))
1693     {
1694       block->replacement = build3 (BIT_FIELD_REF,
1695                                    TREE_TYPE (block->element), var,
1696                                    bitsize_int (size),
1697                                    bitsize_int (bit & ~alchk));
1698       BIT_FIELD_REF_UNSIGNED (block->replacement) = 1;
1699     }
1700
1701   block->in_bitfld_block = 2;
1702
1703   /* Add the member fields to the group, such that they access
1704      portions of the group variable.  */
1705
1706   for (f = first; f != TREE_CHAIN (prev); f = TREE_CHAIN (f))
1707     {
1708       tree field_type = canon_type_for_field (f, elt->element);
1709       struct sra_elt *fld = lookup_element (block, f, field_type, INSERT);
1710
1711       gcc_assert (fld && fld->is_scalar && !fld->replacement);
1712
1713       fld->replacement = build3 (BIT_FIELD_REF, field_type, var,
1714                                  DECL_SIZE (f),
1715                                  bitsize_int
1716                                  ((TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f))
1717                                    * BITS_PER_UNIT
1718                                    + (TREE_INT_CST_LOW
1719                                       (DECL_FIELD_BIT_OFFSET (f))))
1720                                   & ~alchk));
1721       BIT_FIELD_REF_UNSIGNED (fld->replacement) = TYPE_UNSIGNED (field_type);
1722       fld->in_bitfld_block = 1;
1723     }
1724
1725   return prev;
1726 }
1727
1728 static void
1729 instantiate_missing_elements (struct sra_elt *elt)
1730 {
1731   tree type = elt->type;
1732
1733   switch (TREE_CODE (type))
1734     {
1735     case RECORD_TYPE:
1736       {
1737         tree f;
1738         for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
1739           if (TREE_CODE (f) == FIELD_DECL)
1740             {
1741               tree last = try_instantiate_multiple_fields (elt, f);
1742
1743               if (last != f)
1744                 {
1745                   f = last;
1746                   continue;
1747                 }
1748
1749               instantiate_missing_elements_1 (elt, f,
1750                                               canon_type_for_field
1751                                               (f, elt->element));
1752             }
1753         break;
1754       }
1755
1756     case ARRAY_TYPE:
1757       {
1758         tree i, max, subtype;
1759
1760         i = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
1761         max = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
1762         subtype = TREE_TYPE (type);
1763
1764         while (1)
1765           {
1766             instantiate_missing_elements_1 (elt, i, subtype);
1767             if (tree_int_cst_equal (i, max))
1768               break;
1769             i = int_const_binop (PLUS_EXPR, i, integer_one_node, true);
1770           }
1771
1772         break;
1773       }
1774
1775     case COMPLEX_TYPE:
1776       type = TREE_TYPE (type);
1777       instantiate_missing_elements_1 (elt, integer_zero_node, type);
1778       instantiate_missing_elements_1 (elt, integer_one_node, type);
1779       break;
1780
1781     default:
1782       gcc_unreachable ();
1783     }
1784 }
1785
1786 /* Return true if there is only one non aggregate field in the record, TYPE.
1787    Return false otherwise.  */
1788
1789 static bool
1790 single_scalar_field_in_record_p (tree type)
1791 {
1792    int num_fields = 0;
1793    tree field;
1794    if (TREE_CODE (type) != RECORD_TYPE)
1795      return false;
1796
1797    for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1798      if (TREE_CODE (field) == FIELD_DECL)
1799        {
1800          num_fields++;
1801
1802          if (num_fields == 2)
1803            return false;
1804          
1805          if (AGGREGATE_TYPE_P (TREE_TYPE (field)))
1806            return false;
1807        }
1808
1809    return true;
1810 }
1811
1812 /* Make one pass across an element tree deciding whether to perform block
1813    or element copies.  If we decide on element copies, instantiate all
1814    elements.  Return true if there are any instantiated sub-elements.  */
1815
1816 static bool
1817 decide_block_copy (struct sra_elt *elt)
1818 {
1819   struct sra_elt *c;
1820   bool any_inst;
1821
1822   /* We shouldn't be invoked on groups of sub-elements as they must
1823      behave like their parent as far as block copy is concerned.  */
1824   gcc_assert (!elt->is_group);
1825
1826   /* If scalarization is disabled, respect it.  */
1827   if (elt->cannot_scalarize)
1828     {
1829       elt->use_block_copy = 1;
1830
1831       if (dump_file)
1832         {
1833           fputs ("Scalarization disabled for ", dump_file);
1834           dump_sra_elt_name (dump_file, elt);
1835           fputc ('\n', dump_file);
1836         }
1837
1838       /* Disable scalarization of sub-elements */
1839       for (c = elt->children; c; c = c->sibling)
1840         {
1841           c->cannot_scalarize = 1;
1842           decide_block_copy (c);
1843         }
1844
1845       /* Groups behave like their parent.  */
1846       for (c = elt->groups; c; c = c->sibling)
1847         {
1848           c->cannot_scalarize = 1;
1849           c->use_block_copy = 1;
1850         }
1851
1852       return false;
1853     }
1854
1855   /* Don't decide if we've no uses and no groups.  */
1856   if (elt->n_uses == 0 && elt->n_copies == 0 && elt->groups == NULL)
1857     ;
1858
1859   else if (!elt->is_scalar)
1860     {
1861       tree size_tree = TYPE_SIZE_UNIT (elt->type);
1862       bool use_block_copy = true;
1863
1864       /* Tradeoffs for COMPLEX types pretty much always make it better
1865          to go ahead and split the components.  */
1866       if (TREE_CODE (elt->type) == COMPLEX_TYPE)
1867         use_block_copy = false;
1868
1869       /* Don't bother trying to figure out the rest if the structure is
1870          so large we can't do easy arithmetic.  This also forces block
1871          copies for variable sized structures.  */
1872       else if (host_integerp (size_tree, 1))
1873         {
1874           unsigned HOST_WIDE_INT full_size, inst_size = 0;
1875           unsigned int max_size, max_count, inst_count, full_count;
1876
1877           /* If the sra-max-structure-size parameter is 0, then the
1878              user has not overridden the parameter and we can choose a
1879              sensible default.  */
1880           max_size = SRA_MAX_STRUCTURE_SIZE
1881             ? SRA_MAX_STRUCTURE_SIZE
1882             : MOVE_RATIO * UNITS_PER_WORD;
1883           max_count = SRA_MAX_STRUCTURE_COUNT
1884             ? SRA_MAX_STRUCTURE_COUNT
1885             : MOVE_RATIO;
1886
1887           full_size = tree_low_cst (size_tree, 1);
1888           full_count = count_type_elements (elt->type, false);
1889           inst_count = sum_instantiated_sizes (elt, &inst_size);
1890
1891           /* If there is only one scalar field in the record, don't block copy.  */
1892           if (single_scalar_field_in_record_p (elt->type))
1893             use_block_copy = false;
1894
1895           /* ??? What to do here.  If there are two fields, and we've only
1896              instantiated one, then instantiating the other is clearly a win.
1897              If there are a large number of fields then the size of the copy
1898              is much more of a factor.  */
1899
1900           /* If the structure is small, and we've made copies, go ahead
1901              and instantiate, hoping that the copies will go away.  */
1902           if (full_size <= max_size
1903               && (full_count - inst_count) <= max_count
1904               && elt->n_copies > elt->n_uses)
1905             use_block_copy = false;
1906           else if (inst_count * 100 >= full_count * SRA_FIELD_STRUCTURE_RATIO
1907                    && inst_size * 100 >= full_size * SRA_FIELD_STRUCTURE_RATIO)
1908             use_block_copy = false;
1909
1910           /* In order to avoid block copy, we have to be able to instantiate
1911              all elements of the type.  See if this is possible.  */
1912           if (!use_block_copy
1913               && (!can_completely_scalarize_p (elt)
1914                   || !type_can_instantiate_all_elements (elt->type)))
1915             use_block_copy = true;
1916         }
1917
1918       elt->use_block_copy = use_block_copy;
1919
1920       /* Groups behave like their parent.  */
1921       for (c = elt->groups; c; c = c->sibling)
1922         c->use_block_copy = use_block_copy;
1923
1924       if (dump_file)
1925         {
1926           fprintf (dump_file, "Using %s for ",
1927                    use_block_copy ? "block-copy" : "element-copy");
1928           dump_sra_elt_name (dump_file, elt);
1929           fputc ('\n', dump_file);
1930         }
1931
1932       if (!use_block_copy)
1933         {
1934           instantiate_missing_elements (elt);
1935           return true;
1936         }
1937     }
1938
1939   any_inst = elt->replacement != NULL;
1940
1941   for (c = elt->children; c ; c = c->sibling)
1942     any_inst |= decide_block_copy (c);
1943
1944   return any_inst;
1945 }
1946
1947 /* Entry point to phase 3.  Instantiate scalar replacement variables.  */
1948
1949 static void
1950 decide_instantiations (void)
1951 {
1952   bool cleared_any;
1953   bitmap_head done_head;
1954   referenced_var_iterator ri;
1955   tree var;
1956
1957   /* We cannot clear bits from a bitmap we're iterating over,
1958      so save up all the bits to clear until the end.  */
1959   bitmap_initialize (&done_head, &bitmap_default_obstack);
1960   cleared_any = false;
1961
1962   FOR_EACH_REFERENCED_VAR_IN_BITMAP (sra_candidates, var, ri)
1963     {
1964       struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
1965       if (elt)
1966         {
1967           decide_instantiation_1 (elt, 0, 0);
1968           if (!decide_block_copy (elt))
1969             elt = NULL;
1970         }
1971       if (!elt)
1972         {
1973           bitmap_set_bit (&done_head, DECL_UID (var));
1974           cleared_any = true;
1975         }
1976     }
1977
1978   if (cleared_any)
1979     {
1980       bitmap_and_compl_into (sra_candidates, &done_head);
1981       bitmap_and_compl_into (needs_copy_in, &done_head);
1982     }
1983   bitmap_clear (&done_head);
1984   
1985   mark_set_for_renaming (sra_candidates);
1986
1987   if (dump_file)
1988     fputc ('\n', dump_file);
1989 }
1990
1991 \f
1992 /* Phase Four: Update the function to match the replacements created.  */
1993
1994 /* Mark all the variables in VDEF/VUSE operators for STMT for
1995    renaming. This becomes necessary when we modify all of a
1996    non-scalar.  */
1997
1998 static void
1999 mark_all_v_defs_1 (tree stmt)
2000 {
2001   tree sym;
2002   ssa_op_iter iter;
2003
2004   update_stmt_if_modified (stmt);
2005
2006   FOR_EACH_SSA_TREE_OPERAND (sym, stmt, iter, SSA_OP_ALL_VIRTUALS)
2007     {
2008       if (TREE_CODE (sym) == SSA_NAME)
2009         sym = SSA_NAME_VAR (sym);
2010       mark_sym_for_renaming (sym);
2011     }
2012 }
2013
2014
2015 /* Mark all the variables in virtual operands in all the statements in
2016    LIST for renaming.  */
2017
2018 static void
2019 mark_all_v_defs (tree list)
2020 {
2021   if (TREE_CODE (list) != STATEMENT_LIST)
2022     mark_all_v_defs_1 (list);
2023   else
2024     {
2025       tree_stmt_iterator i;
2026       for (i = tsi_start (list); !tsi_end_p (i); tsi_next (&i))
2027         mark_all_v_defs_1 (tsi_stmt (i));
2028     }
2029 }
2030
2031
2032 /* Mark every replacement under ELT with TREE_NO_WARNING.  */
2033
2034 static void
2035 mark_no_warning (struct sra_elt *elt)
2036 {
2037   if (!elt->all_no_warning)
2038     {
2039       if (elt->replacement)
2040         TREE_NO_WARNING (elt->replacement) = 1;
2041       else
2042         {
2043           struct sra_elt *c;
2044           FOR_EACH_ACTUAL_CHILD (c, elt)
2045             mark_no_warning (c);
2046         }
2047       elt->all_no_warning = true;
2048     }
2049 }
2050
2051 /* Build a single level component reference to ELT rooted at BASE.  */
2052
2053 static tree
2054 generate_one_element_ref (struct sra_elt *elt, tree base)
2055 {
2056   switch (TREE_CODE (TREE_TYPE (base)))
2057     {
2058     case RECORD_TYPE:
2059       {
2060         tree field = elt->element;
2061
2062         /* We can't test elt->in_bitfld_blk here because, when this is
2063            called from instantiate_element, we haven't set this field
2064            yet.  */
2065         if (TREE_CODE (field) == BIT_FIELD_REF)
2066           {
2067             tree ret = unshare_expr (field);
2068             TREE_OPERAND (ret, 0) = base;
2069             return ret;
2070           }
2071
2072         /* Watch out for compatible records with differing field lists.  */
2073         if (DECL_FIELD_CONTEXT (field) != TYPE_MAIN_VARIANT (TREE_TYPE (base)))
2074           field = find_compatible_field (TREE_TYPE (base), field);
2075
2076         return build3 (COMPONENT_REF, elt->type, base, field, NULL);
2077       }
2078
2079     case ARRAY_TYPE:
2080       if (TREE_CODE (elt->element) == RANGE_EXPR)
2081         return build4 (ARRAY_RANGE_REF, elt->type, base,
2082                        TREE_OPERAND (elt->element, 0), NULL, NULL);
2083       else
2084         return build4 (ARRAY_REF, elt->type, base, elt->element, NULL, NULL);
2085
2086     case COMPLEX_TYPE:
2087       if (elt->element == integer_zero_node)
2088         return build1 (REALPART_EXPR, elt->type, base);
2089       else
2090         return build1 (IMAGPART_EXPR, elt->type, base);
2091
2092     default:
2093       gcc_unreachable ();
2094     }
2095 }
2096
2097 /* Build a full component reference to ELT rooted at its native variable.  */
2098
2099 static tree
2100 generate_element_ref (struct sra_elt *elt)
2101 {
2102   if (elt->parent)
2103     return generate_one_element_ref (elt, generate_element_ref (elt->parent));
2104   else
2105     return elt->element;
2106 }
2107
2108 /* Return true if BF is a bit-field that we can handle like a scalar.  */
2109
2110 static bool
2111 scalar_bitfield_p (tree bf)
2112 {
2113   return (TREE_CODE (bf) == BIT_FIELD_REF
2114           && (is_gimple_reg (TREE_OPERAND (bf, 0))
2115               || (TYPE_MODE (TREE_TYPE (TREE_OPERAND (bf, 0))) != BLKmode
2116                   && (!TREE_SIDE_EFFECTS (TREE_OPERAND (bf, 0))
2117                       || (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE
2118                                                        (TREE_OPERAND (bf, 0))))
2119                           <= BITS_PER_WORD)))));
2120 }
2121
2122 /* Create an assignment statement from SRC to DST.  */
2123
2124 static tree
2125 sra_build_assignment (tree dst, tree src)
2126 {
2127   /* Turning BIT_FIELD_REFs into bit operations enables other passes
2128      to do a much better job at optimizing the code.
2129      From dst = BIT_FIELD_REF <var, sz, off> we produce
2130
2131         SR.1 = (scalar type) var;
2132         SR.2 = SR.1 >> off;
2133         SR.3 = SR.2 & ((1 << sz) - 1);
2134         ... possible sign extension of SR.3 ...
2135         dst = (destination type) SR.3;
2136    */
2137   if (scalar_bitfield_p (src))
2138     {
2139       tree var, shift, width;
2140       tree utype, stype, stmp, utmp;
2141       tree list, stmt;
2142       bool unsignedp = BIT_FIELD_REF_UNSIGNED (src);
2143
2144       var = TREE_OPERAND (src, 0);
2145       width = TREE_OPERAND (src, 1);
2146       /* The offset needs to be adjusted to a right shift quantity
2147          depending on the endianess.  */
2148       if (BYTES_BIG_ENDIAN)
2149         {
2150           tree tmp = size_binop (PLUS_EXPR, width, TREE_OPERAND (src, 2));
2151           shift = size_binop (MINUS_EXPR, TYPE_SIZE (TREE_TYPE (var)), tmp);
2152         }
2153       else
2154         shift = TREE_OPERAND (src, 2);
2155
2156       /* In weird cases we have non-integral types for the source or
2157          destination object.
2158          ???  For unknown reasons we also want an unsigned scalar type.  */
2159       stype = TREE_TYPE (var);
2160       if (!INTEGRAL_TYPE_P (stype))
2161         stype = lang_hooks.types.type_for_size (TREE_INT_CST_LOW
2162                                                 (TYPE_SIZE (stype)), 1);
2163       else if (!TYPE_UNSIGNED (stype))
2164         stype = unsigned_type_for (stype);
2165
2166       utype = TREE_TYPE (dst);
2167       if (!INTEGRAL_TYPE_P (utype))
2168         utype = lang_hooks.types.type_for_size (TREE_INT_CST_LOW
2169                                                 (TYPE_SIZE (utype)), 1);
2170       else if (!TYPE_UNSIGNED (utype))
2171         utype = unsigned_type_for (utype);
2172
2173       list = NULL;
2174       stmp = make_rename_temp (stype, "SR");
2175
2176       /* Convert the base var of the BIT_FIELD_REF to the scalar type
2177          we use for computation if we cannot use it directly.  */
2178       if (!useless_type_conversion_p (stype, TREE_TYPE (var)))
2179         {
2180           if (INTEGRAL_TYPE_P (TREE_TYPE (var)))
2181             stmt = build_gimple_modify_stmt (stmp,
2182                                              fold_convert (stype, var));
2183           else
2184             stmt = build_gimple_modify_stmt (stmp,
2185                                              fold_build1 (VIEW_CONVERT_EXPR,
2186                                                           stype, var));
2187           append_to_statement_list (stmt, &list);
2188           var = stmp;
2189         }
2190
2191       if (!integer_zerop (shift))
2192         {
2193           stmt = build_gimple_modify_stmt (stmp,
2194                                            fold_build2 (RSHIFT_EXPR, stype,
2195                                                         var, shift));
2196           append_to_statement_list (stmt, &list);
2197           var = stmp;
2198         }
2199
2200       /* If we need a masking operation, produce one.  */
2201       if (TREE_INT_CST_LOW (width) == TYPE_PRECISION (stype))
2202         unsignedp = true;
2203       else
2204         {
2205           tree one = build_int_cst_wide (stype, 1, 0);
2206           tree mask = int_const_binop (LSHIFT_EXPR, one, width, 0);
2207           mask = int_const_binop (MINUS_EXPR, mask, one, 0);
2208
2209           stmt = build_gimple_modify_stmt (stmp,
2210                                            fold_build2 (BIT_AND_EXPR, stype,
2211                                                         var, mask));
2212           append_to_statement_list (stmt, &list);
2213           var = stmp;
2214         }
2215
2216       /* After shifting and masking, convert to the target type.  */
2217       utmp = stmp;
2218       if (!useless_type_conversion_p (utype, stype))
2219         {
2220           utmp = make_rename_temp (utype, "SR");
2221
2222           stmt = build_gimple_modify_stmt (utmp, fold_convert (utype, var));
2223           append_to_statement_list (stmt, &list);
2224
2225           var = utmp;
2226         }
2227
2228       /* Perform sign extension, if required.
2229          ???  This should never be necessary.  */
2230       if (!unsignedp)
2231         {
2232           tree signbit = int_const_binop (LSHIFT_EXPR,
2233                                           build_int_cst_wide (utype, 1, 0),
2234                                           size_binop (MINUS_EXPR, width,
2235                                                       bitsize_int (1)), 0);
2236
2237           stmt = build_gimple_modify_stmt (utmp,
2238                                            fold_build2 (BIT_XOR_EXPR, utype,
2239                                                         var, signbit));
2240           append_to_statement_list (stmt, &list);
2241
2242           stmt = build_gimple_modify_stmt (utmp,
2243                                            fold_build2 (MINUS_EXPR, utype,
2244                                                         utmp, signbit));
2245           append_to_statement_list (stmt, &list);
2246
2247           var = utmp;
2248         }
2249
2250       /* Finally, move and convert to the destination.  */
2251       if (!useless_type_conversion_p (TREE_TYPE (dst), TREE_TYPE (var)))
2252         {
2253           if (INTEGRAL_TYPE_P (TREE_TYPE (dst)))
2254             var = fold_convert (TREE_TYPE (dst), var);
2255           else
2256             var = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (dst), var);
2257         }
2258       stmt = build_gimple_modify_stmt (dst, var);
2259       append_to_statement_list (stmt, &list);
2260
2261       return list;
2262     }
2263
2264   /* It was hoped that we could perform some type sanity checking
2265      here, but since front-ends can emit accesses of fields in types
2266      different from their nominal types and copy structures containing
2267      them as a whole, we'd have to handle such differences here.
2268      Since such accesses under different types require compatibility
2269      anyway, there's little point in making tests and/or adding
2270      conversions to ensure the types of src and dst are the same.
2271      So we just assume type differences at this point are ok.
2272      The only exception we make here are pointer types, which can be different
2273      in e.g. structurally equal, but non-identical RECORD_TYPEs.  */
2274   if (POINTER_TYPE_P (TREE_TYPE (dst))
2275       && !useless_type_conversion_p (TREE_TYPE (dst), TREE_TYPE (src)))
2276     src = fold_convert (TREE_TYPE (dst), src);
2277
2278   return build_gimple_modify_stmt (dst, src);
2279 }
2280
2281 /* BIT_FIELD_REFs must not be shared.  sra_build_elt_assignment()
2282    takes care of assignments, but we must create copies for uses.  */
2283 #define REPLDUP(t) (TREE_CODE (t) != BIT_FIELD_REF ? (t) : unshare_expr (t))
2284
2285 /* Emit an assignment from SRC to DST, but if DST is a scalarizable
2286    BIT_FIELD_REF, turn it into bit operations.  */
2287
2288 static tree
2289 sra_build_bf_assignment (tree dst, tree src)
2290 {
2291   tree var, type, utype, tmp, tmp2, tmp3;
2292   tree list, stmt;
2293   tree cst, cst2, mask;
2294   tree minshift, maxshift;
2295
2296   if (TREE_CODE (dst) != BIT_FIELD_REF)
2297     return sra_build_assignment (dst, src);
2298
2299   var = TREE_OPERAND (dst, 0);
2300
2301   if (!scalar_bitfield_p (dst))
2302     return sra_build_assignment (REPLDUP (dst), src);
2303
2304   list = NULL;
2305
2306   cst = fold_convert (bitsizetype, TREE_OPERAND (dst, 2));
2307   cst2 = size_binop (PLUS_EXPR,
2308                      fold_convert (bitsizetype, TREE_OPERAND (dst, 1)),
2309                      cst);
2310
2311   if (BYTES_BIG_ENDIAN)
2312     {
2313       maxshift = size_binop (MINUS_EXPR, TYPE_SIZE (TREE_TYPE (var)), cst);
2314       minshift = size_binop (MINUS_EXPR, TYPE_SIZE (TREE_TYPE (var)), cst2);
2315     }
2316   else
2317     {
2318       maxshift = cst2;
2319       minshift = cst;
2320     }
2321
2322   type = TREE_TYPE (var);
2323   if (!INTEGRAL_TYPE_P (type))
2324     type = lang_hooks.types.type_for_size
2325       (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (var))), 1);
2326   if (TYPE_UNSIGNED (type))
2327     utype = type;
2328   else
2329     utype = unsigned_type_for (type);
2330
2331   mask = build_int_cst_wide (utype, 1, 0);
2332   if (TREE_INT_CST_LOW (maxshift) == TYPE_PRECISION (utype))
2333     cst = build_int_cst_wide (utype, 0, 0);
2334   else
2335     cst = int_const_binop (LSHIFT_EXPR, mask, maxshift, true);
2336   if (integer_zerop (minshift))
2337     cst2 = mask;
2338   else
2339     cst2 = int_const_binop (LSHIFT_EXPR, mask, minshift, true);
2340   mask = int_const_binop (MINUS_EXPR, cst, cst2, true);
2341   mask = fold_build1 (BIT_NOT_EXPR, utype, mask);
2342
2343   if (TYPE_MAIN_VARIANT (utype) != TYPE_MAIN_VARIANT (TREE_TYPE (var))
2344       && !integer_zerop (mask))
2345     {
2346       tmp = var;
2347       if (!is_gimple_variable (tmp))
2348         tmp = unshare_expr (var);
2349
2350       tmp2 = make_rename_temp (utype, "SR");
2351
2352       if (INTEGRAL_TYPE_P (TREE_TYPE (var)))
2353         stmt = build_gimple_modify_stmt (tmp2, fold_convert (utype, tmp));
2354       else
2355         stmt = build_gimple_modify_stmt (tmp2, fold_build1 (VIEW_CONVERT_EXPR,
2356                                                             utype, tmp));
2357       append_to_statement_list (stmt, &list);
2358     }
2359   else
2360     tmp2 = var;
2361
2362   if (!integer_zerop (mask))
2363     {
2364       tmp = make_rename_temp (utype, "SR");
2365       stmt = build_gimple_modify_stmt (tmp,
2366                                        fold_build2 (BIT_AND_EXPR, utype,
2367                                                     tmp2, mask));
2368       append_to_statement_list (stmt, &list);
2369     }
2370   else
2371     tmp = mask;
2372
2373   if (is_gimple_reg (src) && INTEGRAL_TYPE_P (TREE_TYPE (src)))
2374     tmp2 = src;
2375   else if (INTEGRAL_TYPE_P (TREE_TYPE (src)))
2376     {
2377       tmp2 = make_rename_temp (TREE_TYPE (src), "SR");
2378       stmt = sra_build_assignment (tmp2, src);
2379       append_to_statement_list (stmt, &list);
2380     }
2381   else
2382     {
2383       tmp2 = make_rename_temp
2384         (lang_hooks.types.type_for_size
2385          (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (src))),
2386           1), "SR");
2387       stmt = sra_build_assignment (tmp2, fold_build1 (VIEW_CONVERT_EXPR,
2388                                                       TREE_TYPE (tmp2), src));
2389       append_to_statement_list (stmt, &list);
2390     }
2391
2392   if (!TYPE_UNSIGNED (TREE_TYPE (tmp2)))
2393     {
2394       tree ut = unsigned_type_for (TREE_TYPE (tmp2));
2395       tmp3 = make_rename_temp (ut, "SR");
2396       tmp2 = fold_convert (ut, tmp2);
2397       stmt = sra_build_assignment (tmp3, tmp2);
2398       append_to_statement_list (stmt, &list);
2399
2400       tmp2 = fold_build1 (BIT_NOT_EXPR, utype, mask);
2401       tmp2 = int_const_binop (RSHIFT_EXPR, tmp2, minshift, true);
2402       tmp2 = fold_convert (ut, tmp2);
2403       tmp2 = fold_build2 (BIT_AND_EXPR, ut, tmp3, tmp2);
2404
2405       if (tmp3 != tmp2)
2406         {
2407           tmp3 = make_rename_temp (ut, "SR");
2408           stmt = sra_build_assignment (tmp3, tmp2);
2409           append_to_statement_list (stmt, &list);
2410         }
2411
2412       tmp2 = tmp3;
2413     }
2414
2415   if (TYPE_MAIN_VARIANT (TREE_TYPE (tmp2)) != TYPE_MAIN_VARIANT (utype))
2416     {
2417       tmp3 = make_rename_temp (utype, "SR");
2418       tmp2 = fold_convert (utype, tmp2);
2419       stmt = sra_build_assignment (tmp3, tmp2);
2420       append_to_statement_list (stmt, &list);
2421       tmp2 = tmp3;
2422     }
2423
2424   if (!integer_zerop (minshift))
2425     {
2426       tmp3 = make_rename_temp (utype, "SR");
2427       stmt = build_gimple_modify_stmt (tmp3,
2428                                        fold_build2 (LSHIFT_EXPR, utype,
2429                                                     tmp2, minshift));
2430       append_to_statement_list (stmt, &list);
2431       tmp2 = tmp3;
2432     }
2433
2434   if (utype != TREE_TYPE (var))
2435     tmp3 = make_rename_temp (utype, "SR");
2436   else
2437     tmp3 = var;
2438   stmt = build_gimple_modify_stmt (tmp3,
2439                                    fold_build2 (BIT_IOR_EXPR, utype,
2440                                                 tmp, tmp2));
2441   append_to_statement_list (stmt, &list);
2442
2443   if (tmp3 != var)
2444     {
2445       if (TREE_TYPE (var) == type)
2446         stmt = build_gimple_modify_stmt (var,
2447                                          fold_convert (type, tmp3));
2448       else
2449         stmt = build_gimple_modify_stmt (var,
2450                                          fold_build1 (VIEW_CONVERT_EXPR,
2451                                                       TREE_TYPE (var), tmp3));
2452       append_to_statement_list (stmt, &list);
2453     }
2454
2455   return list;
2456 }
2457
2458 /* Expand an assignment of SRC to the scalarized representation of
2459    ELT.  If it is a field group, try to widen the assignment to cover
2460    the full variable.  */
2461
2462 static tree
2463 sra_build_elt_assignment (struct sra_elt *elt, tree src)
2464 {
2465   tree dst = elt->replacement;
2466   tree var, tmp, cst, cst2, list, stmt;
2467
2468   if (TREE_CODE (dst) != BIT_FIELD_REF
2469       || !elt->in_bitfld_block)
2470     return sra_build_assignment (REPLDUP (dst), src);
2471
2472   var = TREE_OPERAND (dst, 0);
2473
2474   /* Try to widen the assignment to the entire variable.
2475      We need the source to be a BIT_FIELD_REF as well, such that, for
2476      BIT_FIELD_REF<d,sz,dp> = BIT_FIELD_REF<s,sz,sp>,
2477      by design, conditions are met such that we can turn it into
2478      d = BIT_FIELD_REF<s,dw,sp-dp>.  */
2479   if (elt->in_bitfld_block == 2
2480       && TREE_CODE (src) == BIT_FIELD_REF)
2481     {
2482       cst = TYPE_SIZE (TREE_TYPE (var));
2483       cst2 = size_binop (MINUS_EXPR, TREE_OPERAND (src, 2),
2484                          TREE_OPERAND (dst, 2));
2485
2486       src = TREE_OPERAND (src, 0);
2487
2488       /* Avoid full-width bit-fields.  */
2489       if (integer_zerop (cst2)
2490           && tree_int_cst_equal (cst, TYPE_SIZE (TREE_TYPE (src))))
2491         {
2492           if (INTEGRAL_TYPE_P (TREE_TYPE (src))
2493               && !TYPE_UNSIGNED (TREE_TYPE (src)))
2494             src = fold_convert (unsigned_type_for (TREE_TYPE (src)), src);
2495
2496           /* If a single conversion won't do, we'll need a statement
2497              list.  */
2498           if (TYPE_MAIN_VARIANT (TREE_TYPE (var))
2499               != TYPE_MAIN_VARIANT (TREE_TYPE (src)))
2500             {
2501               list = NULL;
2502
2503               if (!INTEGRAL_TYPE_P (TREE_TYPE (src)))
2504                 src = fold_build1 (VIEW_CONVERT_EXPR,
2505                                    lang_hooks.types.type_for_size
2506                                    (TREE_INT_CST_LOW
2507                                     (TYPE_SIZE (TREE_TYPE (src))),
2508                                     1), src);
2509               gcc_assert (TYPE_UNSIGNED (TREE_TYPE (src)));
2510
2511               tmp = make_rename_temp (TREE_TYPE (src), "SR");
2512               stmt = build_gimple_modify_stmt (tmp, src);
2513               append_to_statement_list (stmt, &list);
2514
2515               stmt = sra_build_assignment (var,
2516                                            fold_convert (TREE_TYPE (var),
2517                                                          tmp));
2518               append_to_statement_list (stmt, &list);
2519
2520               return list;
2521             }
2522
2523           src = fold_convert (TREE_TYPE (var), src);
2524         }
2525       else
2526         {
2527           src = fold_build3 (BIT_FIELD_REF, TREE_TYPE (var), src, cst, cst2);
2528           BIT_FIELD_REF_UNSIGNED (src) = 1;
2529         }
2530
2531       return sra_build_assignment (var, src);
2532     }
2533
2534   return sra_build_bf_assignment (dst, src);
2535 }
2536
2537 /* Generate a set of assignment statements in *LIST_P to copy all
2538    instantiated elements under ELT to or from the equivalent structure
2539    rooted at EXPR.  COPY_OUT controls the direction of the copy, with
2540    true meaning to copy out of EXPR into ELT.  */
2541
2542 static void
2543 generate_copy_inout (struct sra_elt *elt, bool copy_out, tree expr,
2544                      tree *list_p)
2545 {
2546   struct sra_elt *c;
2547   tree t;
2548
2549   if (!copy_out && TREE_CODE (expr) == SSA_NAME
2550       && TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
2551     {
2552       tree r, i;
2553
2554       c = lookup_element (elt, integer_zero_node, NULL, NO_INSERT);
2555       r = c->replacement;
2556       c = lookup_element (elt, integer_one_node, NULL, NO_INSERT);
2557       i = c->replacement;
2558
2559       t = build2 (COMPLEX_EXPR, elt->type, r, i);
2560       t = sra_build_bf_assignment (expr, t);
2561       SSA_NAME_DEF_STMT (expr) = t;
2562       append_to_statement_list (t, list_p);
2563     }
2564   else if (elt->replacement)
2565     {
2566       if (copy_out)
2567         t = sra_build_elt_assignment (elt, expr);
2568       else
2569         t = sra_build_bf_assignment (expr, REPLDUP (elt->replacement));
2570       append_to_statement_list (t, list_p);
2571     }
2572   else
2573     {
2574       FOR_EACH_ACTUAL_CHILD (c, elt)
2575         {
2576           t = generate_one_element_ref (c, unshare_expr (expr));
2577           generate_copy_inout (c, copy_out, t, list_p);
2578         }
2579     }
2580 }
2581
2582 /* Generate a set of assignment statements in *LIST_P to copy all instantiated
2583    elements under SRC to their counterparts under DST.  There must be a 1-1
2584    correspondence of instantiated elements.  */
2585
2586 static void
2587 generate_element_copy (struct sra_elt *dst, struct sra_elt *src, tree *list_p)
2588 {
2589   struct sra_elt *dc, *sc;
2590
2591   FOR_EACH_ACTUAL_CHILD (dc, dst)
2592     {
2593       sc = lookup_element (src, dc->element, NULL, NO_INSERT);
2594       if (!sc && dc->in_bitfld_block == 2)
2595         {
2596           struct sra_elt *dcs;
2597
2598           FOR_EACH_ACTUAL_CHILD (dcs, dc)
2599             {
2600               sc = lookup_element (src, dcs->element, NULL, NO_INSERT);
2601               gcc_assert (sc);
2602               generate_element_copy (dcs, sc, list_p);
2603             }
2604
2605           continue;
2606         }
2607
2608       /* If DST and SRC are structs with the same elements, but do not have
2609          the same TYPE_MAIN_VARIANT, then lookup of DST FIELD_DECL in SRC
2610          will fail.  Try harder by finding the corresponding FIELD_DECL
2611          in SRC.  */
2612       if (!sc)
2613         {
2614           tree f;
2615
2616           gcc_assert (useless_type_conversion_p (dst->type, src->type));
2617           gcc_assert (TREE_CODE (dc->element) == FIELD_DECL);
2618           for (f = TYPE_FIELDS (src->type); f ; f = TREE_CHAIN (f))
2619             if (simple_cst_equal (DECL_FIELD_OFFSET (f),
2620                                   DECL_FIELD_OFFSET (dc->element)) > 0
2621                 && simple_cst_equal (DECL_FIELD_BIT_OFFSET (f),
2622                                      DECL_FIELD_BIT_OFFSET (dc->element)) > 0
2623                 && simple_cst_equal (DECL_SIZE (f),
2624                                      DECL_SIZE (dc->element)) > 0
2625                 && (useless_type_conversion_p (TREE_TYPE (dc->element),
2626                                                TREE_TYPE (f))
2627                     || (POINTER_TYPE_P (TREE_TYPE (dc->element))
2628                         && POINTER_TYPE_P (TREE_TYPE (f)))))
2629               break;
2630           gcc_assert (f != NULL_TREE);
2631           sc = lookup_element (src, f, NULL, NO_INSERT);
2632         }
2633
2634       generate_element_copy (dc, sc, list_p);
2635     }
2636
2637   if (dst->replacement)
2638     {
2639       tree t;
2640
2641       gcc_assert (src->replacement);
2642
2643       t = sra_build_elt_assignment (dst, REPLDUP (src->replacement));
2644       append_to_statement_list (t, list_p);
2645     }
2646 }
2647
2648 /* Generate a set of assignment statements in *LIST_P to zero all instantiated
2649    elements under ELT.  In addition, do not assign to elements that have been
2650    marked VISITED but do reset the visited flag; this allows easy coordination
2651    with generate_element_init.  */
2652
2653 static void
2654 generate_element_zero (struct sra_elt *elt, tree *list_p)
2655 {
2656   struct sra_elt *c;
2657
2658   if (elt->visited)
2659     {
2660       elt->visited = false;
2661       return;
2662     }
2663
2664   if (!elt->in_bitfld_block)
2665     FOR_EACH_ACTUAL_CHILD (c, elt)
2666       generate_element_zero (c, list_p);
2667
2668   if (elt->replacement)
2669     {
2670       tree t;
2671
2672       gcc_assert (elt->is_scalar);
2673       t = fold_convert (elt->type, integer_zero_node);
2674
2675       t = sra_build_elt_assignment (elt, t);
2676       append_to_statement_list (t, list_p);
2677     }
2678 }
2679
2680 /* Generate an assignment VAR = INIT, where INIT may need gimplification.
2681    Add the result to *LIST_P.  */
2682
2683 static void
2684 generate_one_element_init (struct sra_elt *elt, tree init, tree *list_p)
2685 {
2686   /* The replacement can be almost arbitrarily complex.  Gimplify.  */
2687   tree stmt = sra_build_elt_assignment (elt, init);
2688   gimplify_and_add (stmt, list_p);
2689 }
2690
2691 /* Generate a set of assignment statements in *LIST_P to set all instantiated
2692    elements under ELT with the contents of the initializer INIT.  In addition,
2693    mark all assigned elements VISITED; this allows easy coordination with
2694    generate_element_zero.  Return false if we found a case we couldn't
2695    handle.  */
2696
2697 static bool
2698 generate_element_init_1 (struct sra_elt *elt, tree init, tree *list_p)
2699 {
2700   bool result = true;
2701   enum tree_code init_code;
2702   struct sra_elt *sub;
2703   tree t;
2704   unsigned HOST_WIDE_INT idx;
2705   tree value, purpose;
2706
2707   /* We can be passed DECL_INITIAL of a static variable.  It might have a
2708      conversion, which we strip off here.  */
2709   STRIP_USELESS_TYPE_CONVERSION (init);
2710   init_code = TREE_CODE (init);
2711
2712   if (elt->is_scalar)
2713     {
2714       if (elt->replacement)
2715         {
2716           generate_one_element_init (elt, init, list_p);
2717           elt->visited = true;
2718         }
2719       return result;
2720     }
2721
2722   switch (init_code)
2723     {
2724     case COMPLEX_CST:
2725     case COMPLEX_EXPR:
2726       FOR_EACH_ACTUAL_CHILD (sub, elt)
2727         {
2728           if (sub->element == integer_zero_node)
2729             t = (init_code == COMPLEX_EXPR
2730                  ? TREE_OPERAND (init, 0) : TREE_REALPART (init));
2731           else
2732             t = (init_code == COMPLEX_EXPR
2733                  ? TREE_OPERAND (init, 1) : TREE_IMAGPART (init));
2734           result &= generate_element_init_1 (sub, t, list_p);
2735         }
2736       break;
2737
2738     case CONSTRUCTOR:
2739       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, purpose, value)
2740         {
2741           if (TREE_CODE (purpose) == RANGE_EXPR)
2742             {
2743               tree lower = TREE_OPERAND (purpose, 0);
2744               tree upper = TREE_OPERAND (purpose, 1);
2745
2746               while (1)
2747                 {
2748                   sub = lookup_element (elt, lower, NULL, NO_INSERT);
2749                   if (sub != NULL)
2750                     result &= generate_element_init_1 (sub, value, list_p);
2751                   if (tree_int_cst_equal (lower, upper))
2752                     break;
2753                   lower = int_const_binop (PLUS_EXPR, lower,
2754                                            integer_one_node, true);
2755                 }
2756             }
2757           else
2758             {
2759               sub = lookup_element (elt, purpose, NULL, NO_INSERT);
2760               if (sub != NULL)
2761                 result &= generate_element_init_1 (sub, value, list_p);
2762             }
2763         }
2764       break;
2765
2766     default:
2767       elt->visited = true;
2768       result = false;
2769     }
2770
2771   return result;
2772 }
2773
2774 /* A wrapper function for generate_element_init_1 that handles cleanup after
2775    gimplification.  */
2776
2777 static bool
2778 generate_element_init (struct sra_elt *elt, tree init, tree *list_p)
2779 {
2780   bool ret;
2781
2782   push_gimplify_context ();
2783   ret = generate_element_init_1 (elt, init, list_p);
2784   pop_gimplify_context (NULL);
2785
2786   /* The replacement can expose previously unreferenced variables.  */
2787   if (ret && *list_p)
2788     {
2789       tree_stmt_iterator i;
2790
2791       for (i = tsi_start (*list_p); !tsi_end_p (i); tsi_next (&i))
2792         find_new_referenced_vars (tsi_stmt_ptr (i));
2793     }
2794
2795   return ret;
2796 }
2797
2798 /* Insert STMT on all the outgoing edges out of BB.  Note that if BB
2799    has more than one edge, STMT will be replicated for each edge.  Also,
2800    abnormal edges will be ignored.  */
2801
2802 void
2803 insert_edge_copies (tree stmt, basic_block bb)
2804 {
2805   edge e;
2806   edge_iterator ei;
2807   bool first_copy;
2808
2809   first_copy = true;
2810   FOR_EACH_EDGE (e, ei, bb->succs)
2811     {
2812       /* We don't need to insert copies on abnormal edges.  The
2813          value of the scalar replacement is not guaranteed to
2814          be valid through an abnormal edge.  */
2815       if (!(e->flags & EDGE_ABNORMAL))
2816         {
2817           if (first_copy)
2818             {
2819               bsi_insert_on_edge (e, stmt);
2820               first_copy = false;
2821             }
2822           else
2823             bsi_insert_on_edge (e, unsave_expr_now (stmt));
2824         }
2825     }
2826 }
2827
2828 /* Helper function to insert LIST before BSI, and set up line number info.  */
2829
2830 void
2831 sra_insert_before (block_stmt_iterator *bsi, tree list)
2832 {
2833   tree stmt = bsi_stmt (*bsi);
2834
2835   if (EXPR_HAS_LOCATION (stmt))
2836     annotate_all_with_locus (&list, EXPR_LOCATION (stmt));
2837   bsi_insert_before (bsi, list, BSI_SAME_STMT);
2838 }
2839
2840 /* Similarly, but insert after BSI.  Handles insertion onto edges as well.  */
2841
2842 void
2843 sra_insert_after (block_stmt_iterator *bsi, tree list)
2844 {
2845   tree stmt = bsi_stmt (*bsi);
2846
2847   if (EXPR_HAS_LOCATION (stmt))
2848     annotate_all_with_locus (&list, EXPR_LOCATION (stmt));
2849
2850   if (stmt_ends_bb_p (stmt))
2851     insert_edge_copies (list, bsi->bb);
2852   else
2853     bsi_insert_after (bsi, list, BSI_SAME_STMT);
2854 }
2855
2856 /* Similarly, but replace the statement at BSI.  */
2857
2858 static void
2859 sra_replace (block_stmt_iterator *bsi, tree list)
2860 {
2861   sra_insert_before (bsi, list);
2862   bsi_remove (bsi, false);
2863   if (bsi_end_p (*bsi))
2864     *bsi = bsi_last (bsi->bb);
2865   else
2866     bsi_prev (bsi);
2867 }
2868
2869 /* Data structure that bitfield_overlaps_p fills in with information
2870    about the element passed in and how much of it overlaps with the
2871    bit-range passed it to.  */
2872
2873 struct bitfield_overlap_info
2874 {
2875   /* The bit-length of an element.  */
2876   tree field_len;
2877
2878   /* The bit-position of the element in its parent.  */
2879   tree field_pos;
2880
2881   /* The number of bits of the element that overlap with the incoming
2882      bit range.  */
2883   tree overlap_len;
2884
2885   /* The first bit of the element that overlaps with the incoming bit
2886      range.  */
2887   tree overlap_pos;
2888 };
2889
2890 /* Return true if a BIT_FIELD_REF<(FLD->parent), BLEN, BPOS>
2891    expression (referenced as BF below) accesses any of the bits in FLD,
2892    false if it doesn't.  If DATA is non-null, its field_len and
2893    field_pos are filled in such that BIT_FIELD_REF<(FLD->parent),
2894    field_len, field_pos> (referenced as BFLD below) represents the
2895    entire field FLD->element, and BIT_FIELD_REF<BFLD, overlap_len,
2896    overlap_pos> represents the portion of the entire field that
2897    overlaps with BF.  */
2898
2899 static bool
2900 bitfield_overlaps_p (tree blen, tree bpos, struct sra_elt *fld,
2901                      struct bitfield_overlap_info *data)
2902 {
2903   tree flen, fpos;
2904   bool ret;
2905
2906   if (TREE_CODE (fld->element) == FIELD_DECL)
2907     {
2908       flen = fold_convert (bitsizetype, DECL_SIZE (fld->element));
2909       fpos = fold_convert (bitsizetype, DECL_FIELD_OFFSET (fld->element));
2910       fpos = size_binop (MULT_EXPR, fpos, bitsize_int (BITS_PER_UNIT));
2911       fpos = size_binop (PLUS_EXPR, fpos, DECL_FIELD_BIT_OFFSET (fld->element));
2912     }
2913   else if (TREE_CODE (fld->element) == BIT_FIELD_REF)
2914     {
2915       flen = fold_convert (bitsizetype, TREE_OPERAND (fld->element, 1));
2916       fpos = fold_convert (bitsizetype, TREE_OPERAND (fld->element, 2));
2917     }
2918   else if (TREE_CODE (fld->element) == INTEGER_CST)
2919     {
2920       flen = fold_convert (bitsizetype, TYPE_SIZE (fld->type));
2921       fpos = fold_convert (bitsizetype, fld->element);
2922       fpos = size_binop (MULT_EXPR, flen, fpos);
2923     }
2924   else
2925     gcc_unreachable ();
2926
2927   gcc_assert (host_integerp (blen, 1)
2928               && host_integerp (bpos, 1)
2929               && host_integerp (flen, 1)
2930               && host_integerp (fpos, 1));
2931
2932   ret = ((!tree_int_cst_lt (fpos, bpos)
2933           && tree_int_cst_lt (size_binop (MINUS_EXPR, fpos, bpos),
2934                               blen))
2935          || (!tree_int_cst_lt (bpos, fpos)
2936              && tree_int_cst_lt (size_binop (MINUS_EXPR, bpos, fpos),
2937                                  flen)));
2938
2939   if (!ret)
2940     return ret;
2941
2942   if (data)
2943     {
2944       tree bend, fend;
2945
2946       data->field_len = flen;
2947       data->field_pos = fpos;
2948
2949       fend = size_binop (PLUS_EXPR, fpos, flen);
2950       bend = size_binop (PLUS_EXPR, bpos, blen);
2951
2952       if (tree_int_cst_lt (bend, fend))
2953         data->overlap_len = size_binop (MINUS_EXPR, bend, fpos);
2954       else
2955         data->overlap_len = NULL;
2956
2957       if (tree_int_cst_lt (fpos, bpos))
2958         {
2959           data->overlap_pos = size_binop (MINUS_EXPR, bpos, fpos);
2960           data->overlap_len = size_binop (MINUS_EXPR,
2961                                           data->overlap_len
2962                                           ? data->overlap_len
2963                                           : data->field_len,
2964                                           data->overlap_pos);
2965         }
2966       else
2967         data->overlap_pos = NULL;
2968     }
2969
2970   return ret;
2971 }
2972
2973 /* Add to LISTP a sequence of statements that copies BLEN bits between
2974    VAR and the scalarized elements of ELT, starting a bit VPOS of VAR
2975    and at bit BPOS of ELT.  The direction of the copy is given by
2976    TO_VAR.  */
2977
2978 static void
2979 sra_explode_bitfield_assignment (tree var, tree vpos, bool to_var,
2980                                  tree *listp, tree blen, tree bpos,
2981                                  struct sra_elt *elt)
2982 {
2983   struct sra_elt *fld;
2984   struct bitfield_overlap_info flp;
2985
2986   FOR_EACH_ACTUAL_CHILD (fld, elt)
2987     {
2988       tree flen, fpos;
2989
2990       if (!bitfield_overlaps_p (blen, bpos, fld, &flp))
2991         continue;
2992
2993       flen = flp.overlap_len ? flp.overlap_len : flp.field_len;
2994       fpos = flp.overlap_pos ? flp.overlap_pos : bitsize_int (0);
2995
2996       if (fld->replacement)
2997         {
2998           tree infld, invar, st, type;
2999
3000           infld = fld->replacement;
3001
3002           type = TREE_TYPE (infld);
3003           if (TYPE_PRECISION (type) != TREE_INT_CST_LOW (flen))
3004             type = lang_hooks.types.type_for_size (TREE_INT_CST_LOW (flen), 1);
3005
3006           if (TREE_CODE (infld) == BIT_FIELD_REF)
3007             {
3008               fpos = size_binop (PLUS_EXPR, fpos, TREE_OPERAND (infld, 2));
3009               infld = TREE_OPERAND (infld, 0);
3010             }
3011           else if (BYTES_BIG_ENDIAN && DECL_P (fld->element)
3012                    && !tree_int_cst_equal (TYPE_SIZE (TREE_TYPE (infld)),
3013                                            DECL_SIZE (fld->element)))
3014             {
3015               fpos = size_binop (PLUS_EXPR, fpos,
3016                                  TYPE_SIZE (TREE_TYPE (infld)));
3017               fpos = size_binop (MINUS_EXPR, fpos,
3018                                  DECL_SIZE (fld->element));
3019             }
3020
3021           infld = fold_build3 (BIT_FIELD_REF, type, infld, flen, fpos);
3022           BIT_FIELD_REF_UNSIGNED (infld) = 1;
3023
3024           invar = size_binop (MINUS_EXPR, flp.field_pos, bpos);
3025           if (flp.overlap_pos)
3026             invar = size_binop (PLUS_EXPR, invar, flp.overlap_pos);
3027           invar = size_binop (PLUS_EXPR, invar, vpos);
3028
3029           invar = fold_build3 (BIT_FIELD_REF, type, var, flen, invar);
3030           BIT_FIELD_REF_UNSIGNED (invar) = 1;
3031
3032           if (to_var)
3033             st = sra_build_bf_assignment (invar, infld);
3034           else
3035             st = sra_build_bf_assignment (infld, invar);
3036
3037           append_to_statement_list (st, listp);
3038         }
3039       else
3040         {
3041           tree sub = size_binop (MINUS_EXPR, flp.field_pos, bpos);
3042           sub = size_binop (PLUS_EXPR, vpos, sub);
3043           if (flp.overlap_pos)
3044             sub = size_binop (PLUS_EXPR, sub, flp.overlap_pos);
3045
3046           sra_explode_bitfield_assignment (var, sub, to_var, listp,
3047                                            flen, fpos, fld);
3048         }
3049     }
3050 }
3051
3052 /* Add to LISTBEFOREP statements that copy scalarized members of ELT
3053    that overlap with BIT_FIELD_REF<(ELT->element), BLEN, BPOS> back
3054    into the full variable, and to LISTAFTERP, if non-NULL, statements
3055    that copy the (presumably modified) overlapping portions of the
3056    full variable back to the scalarized variables.  */
3057
3058 static void
3059 sra_sync_for_bitfield_assignment (tree *listbeforep, tree *listafterp,
3060                                   tree blen, tree bpos,
3061                                   struct sra_elt *elt)
3062 {
3063   struct sra_elt *fld;
3064   struct bitfield_overlap_info flp;
3065
3066   FOR_EACH_ACTUAL_CHILD (fld, elt)
3067     if (bitfield_overlaps_p (blen, bpos, fld, &flp))
3068       {
3069         if (fld->replacement || (!flp.overlap_len && !flp.overlap_pos))
3070           {
3071             generate_copy_inout (fld, false, generate_element_ref (fld),
3072                                  listbeforep);
3073             mark_no_warning (fld);
3074             if (listafterp)
3075               generate_copy_inout (fld, true, generate_element_ref (fld),
3076                                    listafterp);
3077           }
3078         else
3079           {
3080             tree flen = flp.overlap_len ? flp.overlap_len : flp.field_len;
3081             tree fpos = flp.overlap_pos ? flp.overlap_pos : bitsize_int (0);
3082
3083             sra_sync_for_bitfield_assignment (listbeforep, listafterp,
3084                                               flen, fpos, fld);
3085           }
3086       }
3087 }
3088
3089 /* Scalarize a USE.  To recap, this is either a simple reference to ELT,
3090    if elt is scalar, or some occurrence of ELT that requires a complete
3091    aggregate.  IS_OUTPUT is true if ELT is being modified.  */
3092
3093 static void
3094 scalarize_use (struct sra_elt *elt, tree *expr_p, block_stmt_iterator *bsi,
3095                bool is_output, bool use_all)
3096 {
3097   tree stmt = bsi_stmt (*bsi);
3098   tree bfexpr;
3099
3100   if (elt->replacement)
3101     {
3102       tree replacement = elt->replacement;
3103
3104       /* If we have a replacement, then updating the reference is as
3105          simple as modifying the existing statement in place.  */
3106       if (is_output
3107           && TREE_CODE (elt->replacement) == BIT_FIELD_REF
3108           && is_gimple_reg (TREE_OPERAND (elt->replacement, 0))
3109           && TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
3110           && &GIMPLE_STMT_OPERAND (stmt, 0) == expr_p)
3111         {
3112           tree newstmt = sra_build_elt_assignment
3113             (elt, GIMPLE_STMT_OPERAND (stmt, 1));
3114           if (TREE_CODE (newstmt) != STATEMENT_LIST)
3115             {
3116               tree list = NULL;
3117               append_to_statement_list (newstmt, &list);
3118               newstmt = list;
3119             }
3120           sra_replace (bsi, newstmt);
3121           return;
3122         }
3123       else if (!is_output
3124                && TREE_CODE (elt->replacement) == BIT_FIELD_REF
3125                && TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
3126                && &GIMPLE_STMT_OPERAND (stmt, 1) == expr_p)
3127         {
3128           tree tmp = make_rename_temp
3129             (TREE_TYPE (GIMPLE_STMT_OPERAND (stmt, 0)), "SR");
3130           tree newstmt = sra_build_assignment (tmp, REPLDUP (elt->replacement));
3131
3132           if (TREE_CODE (newstmt) != STATEMENT_LIST)
3133             {
3134               tree list = NULL;
3135               append_to_statement_list (newstmt, &list);
3136               newstmt = list;
3137             }
3138           sra_insert_before (bsi, newstmt);
3139           replacement = tmp;
3140         }
3141       if (is_output)
3142           mark_all_v_defs (stmt);
3143       *expr_p = REPLDUP (replacement);
3144       update_stmt (stmt);
3145     }
3146   else if (use_all && is_output
3147            && TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
3148            && TREE_CODE (bfexpr
3149                          = GIMPLE_STMT_OPERAND (stmt, 0)) == BIT_FIELD_REF
3150            && &TREE_OPERAND (bfexpr, 0) == expr_p
3151            && INTEGRAL_TYPE_P (TREE_TYPE (bfexpr))
3152            && TREE_CODE (TREE_TYPE (*expr_p)) == RECORD_TYPE)
3153     {
3154       tree listbefore = NULL, listafter = NULL;
3155       tree blen = fold_convert (bitsizetype, TREE_OPERAND (bfexpr, 1));
3156       tree bpos = fold_convert (bitsizetype, TREE_OPERAND (bfexpr, 2));
3157       bool update = false;
3158
3159       if (!elt->use_block_copy)
3160         {
3161           tree type = TREE_TYPE (bfexpr);
3162           tree var = make_rename_temp (type, "SR"), tmp, st, vpos;
3163
3164           GIMPLE_STMT_OPERAND (stmt, 0) = var;
3165           update = true;
3166
3167           if (!TYPE_UNSIGNED (type))
3168             {
3169               type = unsigned_type_for (type);
3170               tmp = make_rename_temp (type, "SR");
3171               st = build_gimple_modify_stmt (tmp,
3172                                              fold_convert (type, var));
3173               append_to_statement_list (st, &listafter);
3174               var = tmp;
3175             }
3176
3177           /* If VAR is wider than BLEN bits, it is padded at the
3178              most-significant end.  We want to set VPOS such that
3179              <BIT_FIELD_REF VAR BLEN VPOS> would refer to the
3180              least-significant BLEN bits of VAR.  */
3181           if (BYTES_BIG_ENDIAN)
3182             vpos = size_binop (MINUS_EXPR, TYPE_SIZE (type), blen);
3183           else
3184             vpos = bitsize_int (0);
3185           sra_explode_bitfield_assignment
3186             (var, vpos, false, &listafter, blen, bpos, elt);
3187         }
3188       else
3189         sra_sync_for_bitfield_assignment
3190           (&listbefore, &listafter, blen, bpos, elt);
3191
3192       if (listbefore)
3193         {
3194           mark_all_v_defs (listbefore);
3195           sra_insert_before (bsi, listbefore);
3196         }
3197       if (listafter)
3198         {
3199           mark_all_v_defs (listafter);
3200           sra_insert_after (bsi, listafter);
3201         }
3202
3203       if (update)
3204         update_stmt (stmt);
3205     }
3206   else if (use_all && !is_output
3207            && TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
3208            && TREE_CODE (bfexpr
3209                          = GIMPLE_STMT_OPERAND (stmt, 1)) == BIT_FIELD_REF
3210            && &TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 0) == expr_p
3211            && INTEGRAL_TYPE_P (TREE_TYPE (bfexpr))
3212            && TREE_CODE (TREE_TYPE (*expr_p)) == RECORD_TYPE)
3213     {
3214       tree list = NULL;
3215       tree blen = fold_convert (bitsizetype, TREE_OPERAND (bfexpr, 1));
3216       tree bpos = fold_convert (bitsizetype, TREE_OPERAND (bfexpr, 2));
3217       bool update = false;
3218
3219       if (!elt->use_block_copy)
3220         {
3221           tree type = TREE_TYPE (bfexpr);
3222           tree var, vpos;
3223
3224           if (!TYPE_UNSIGNED (type))
3225             type = unsigned_type_for (type);
3226
3227           var = make_rename_temp (type, "SR");
3228
3229           append_to_statement_list (build_gimple_modify_stmt
3230                                     (var, build_int_cst_wide (type, 0, 0)),
3231                                     &list);
3232
3233           /* If VAR is wider than BLEN bits, it is padded at the
3234              most-significant end.  We want to set VPOS such that
3235              <BIT_FIELD_REF VAR BLEN VPOS> would refer to the
3236              least-significant BLEN bits of VAR.  */
3237           if (BYTES_BIG_ENDIAN)
3238             vpos = size_binop (MINUS_EXPR, TYPE_SIZE (type), blen);
3239           else
3240             vpos = bitsize_int (0);
3241           sra_explode_bitfield_assignment
3242             (var, vpos, true, &list, blen, bpos, elt);
3243
3244           GIMPLE_STMT_OPERAND (stmt, 1) = var;
3245           update = true;
3246         }
3247       else
3248         sra_sync_for_bitfield_assignment
3249           (&list, NULL, blen, bpos, elt);
3250
3251       if (list)
3252         {
3253           mark_all_v_defs (list);
3254           sra_insert_before (bsi, list);
3255         }
3256
3257       if (update)
3258         update_stmt (stmt);
3259     }
3260   else
3261     {
3262       tree list = NULL;
3263
3264       /* Otherwise we need some copies.  If ELT is being read, then we
3265          want to store all (modified) sub-elements back into the
3266          structure before the reference takes place.  If ELT is being
3267          written, then we want to load the changed values back into
3268          our shadow variables.  */
3269       /* ??? We don't check modified for reads, we just always write all of
3270          the values.  We should be able to record the SSA number of the VOP
3271          for which the values were last read.  If that number matches the
3272          SSA number of the VOP in the current statement, then we needn't
3273          emit an assignment.  This would also eliminate double writes when
3274          a structure is passed as more than one argument to a function call.
3275          This optimization would be most effective if sra_walk_function
3276          processed the blocks in dominator order.  */
3277
3278       generate_copy_inout (elt, is_output, generate_element_ref (elt), &list);
3279       if (list == NULL)
3280         return;
3281       mark_all_v_defs (list);
3282       if (is_output)
3283         sra_insert_after (bsi, list);
3284       else
3285         {
3286           sra_insert_before (bsi, list);
3287           if (use_all)
3288             mark_no_warning (elt);
3289         }
3290     }
3291 }
3292
3293 /* Scalarize a COPY.  To recap, this is an assignment statement between
3294    two scalarizable references, LHS_ELT and RHS_ELT.  */
3295
3296 static void
3297 scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
3298                 block_stmt_iterator *bsi)
3299 {
3300   tree list, stmt;
3301
3302   if (lhs_elt->replacement && rhs_elt->replacement)
3303     {
3304       /* If we have two scalar operands, modify the existing statement.  */
3305       stmt = bsi_stmt (*bsi);
3306
3307       /* See the commentary in sra_walk_function concerning
3308          RETURN_EXPR, and why we should never see one here.  */
3309       gcc_assert (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT);
3310
3311       GIMPLE_STMT_OPERAND (stmt, 0) = lhs_elt->replacement;
3312       GIMPLE_STMT_OPERAND (stmt, 1) = REPLDUP (rhs_elt->replacement);
3313       update_stmt (stmt);
3314     }
3315   else if (lhs_elt->use_block_copy || rhs_elt->use_block_copy)
3316     {
3317       /* If either side requires a block copy, then sync the RHS back
3318          to the original structure, leave the original assignment
3319          statement (which will perform the block copy), then load the
3320          LHS values out of its now-updated original structure.  */
3321       /* ??? Could perform a modified pair-wise element copy.  That
3322          would at least allow those elements that are instantiated in
3323          both structures to be optimized well.  */
3324
3325       list = NULL;
3326       generate_copy_inout (rhs_elt, false,
3327                            generate_element_ref (rhs_elt), &list);
3328       if (list)
3329         {
3330           mark_all_v_defs (list);
3331           sra_insert_before (bsi, list);
3332         }
3333
3334       list = NULL;
3335       generate_copy_inout (lhs_elt, true,
3336                            generate_element_ref (lhs_elt), &list);
3337       if (list)
3338         {
3339           mark_all_v_defs (list);
3340           sra_insert_after (bsi, list);
3341         }
3342     }
3343   else
3344     {
3345       /* Otherwise both sides must be fully instantiated.  In which
3346          case perform pair-wise element assignments and replace the
3347          original block copy statement.  */
3348
3349       stmt = bsi_stmt (*bsi);
3350       mark_all_v_defs (stmt);
3351
3352       list = NULL;
3353       generate_element_copy (lhs_elt, rhs_elt, &list);
3354       gcc_assert (list);
3355       mark_all_v_defs (list);
3356       sra_replace (bsi, list);
3357     }
3358 }
3359
3360 /* Scalarize an INIT.  To recap, this is an assignment to a scalarizable
3361    reference from some form of constructor: CONSTRUCTOR, COMPLEX_CST or
3362    COMPLEX_EXPR.  If RHS is NULL, it should be treated as an empty
3363    CONSTRUCTOR.  */
3364
3365 static void
3366 scalarize_init (struct sra_elt *lhs_elt, tree rhs, block_stmt_iterator *bsi)
3367 {
3368   bool result = true;
3369   tree list = NULL, init_list = NULL;
3370
3371   /* Generate initialization statements for all members extant in the RHS.  */
3372   if (rhs)
3373     {
3374       /* Unshare the expression just in case this is from a decl's initial.  */
3375       rhs = unshare_expr (rhs);
3376       result = generate_element_init (lhs_elt, rhs, &init_list);
3377     }
3378
3379   /* CONSTRUCTOR is defined such that any member not mentioned is assigned
3380      a zero value.  Initialize the rest of the instantiated elements.  */
3381   generate_element_zero (lhs_elt, &list);
3382   append_to_statement_list (init_list, &list);
3383
3384   if (!result)
3385     {
3386       /* If we failed to convert the entire initializer, then we must
3387          leave the structure assignment in place and must load values
3388          from the structure into the slots for which we did not find
3389          constants.  The easiest way to do this is to generate a complete
3390          copy-out, and then follow that with the constant assignments
3391          that we were able to build.  DCE will clean things up.  */
3392       tree list0 = NULL;
3393       generate_copy_inout (lhs_elt, true, generate_element_ref (lhs_elt),
3394                            &list0);
3395       append_to_statement_list (list, &list0);
3396       list = list0;
3397     }
3398
3399   if (lhs_elt->use_block_copy || !result)
3400     {
3401       /* Since LHS is not fully instantiated, we must leave the structure
3402          assignment in place.  Treating this case differently from a USE
3403          exposes constants to later optimizations.  */
3404       if (list)
3405         {
3406           mark_all_v_defs (list);
3407           sra_insert_after (bsi, list);
3408         }
3409     }
3410   else
3411     {
3412       /* The LHS is fully instantiated.  The list of initializations
3413          replaces the original structure assignment.  */
3414       gcc_assert (list);
3415       mark_all_v_defs (bsi_stmt (*bsi));
3416       mark_all_v_defs (list);
3417       sra_replace (bsi, list);
3418     }
3419 }
3420
3421 /* A subroutine of scalarize_ldst called via walk_tree.  Set TREE_NO_TRAP
3422    on all INDIRECT_REFs.  */
3423
3424 static tree
3425 mark_notrap (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3426 {
3427   tree t = *tp;
3428
3429   if (TREE_CODE (t) == INDIRECT_REF)
3430     {
3431       TREE_THIS_NOTRAP (t) = 1;
3432       *walk_subtrees = 0;
3433     }
3434   else if (IS_TYPE_OR_DECL_P (t))
3435     *walk_subtrees = 0;
3436
3437   return NULL;
3438 }
3439
3440 /* Scalarize a LDST.  To recap, this is an assignment between one scalarizable
3441    reference ELT and one non-scalarizable reference OTHER.  IS_OUTPUT is true
3442    if ELT is on the left-hand side.  */
3443
3444 static void
3445 scalarize_ldst (struct sra_elt *elt, tree other,
3446                 block_stmt_iterator *bsi, bool is_output)
3447 {
3448   /* Shouldn't have gotten called for a scalar.  */
3449   gcc_assert (!elt->replacement);
3450
3451   if (elt->use_block_copy)
3452     {
3453       /* Since ELT is not fully instantiated, we have to leave the
3454          block copy in place.  Treat this as a USE.  */
3455       scalarize_use (elt, NULL, bsi, is_output, false);
3456     }
3457   else
3458     {
3459       /* The interesting case is when ELT is fully instantiated.  In this
3460          case we can have each element stored/loaded directly to/from the
3461          corresponding slot in OTHER.  This avoids a block copy.  */
3462
3463       tree list = NULL, stmt = bsi_stmt (*bsi);
3464
3465       mark_all_v_defs (stmt);
3466       generate_copy_inout (elt, is_output, other, &list);
3467       gcc_assert (list);
3468       mark_all_v_defs (list);
3469
3470       /* Preserve EH semantics.  */
3471       if (stmt_ends_bb_p (stmt))
3472         {
3473           tree_stmt_iterator tsi;
3474           tree first, blist = NULL;
3475           bool thr = tree_could_throw_p (stmt);
3476
3477           /* If the last statement of this BB created an EH edge
3478              before scalarization, we have to locate the first
3479              statement that can throw in the new statement list and
3480              use that as the last statement of this BB, such that EH
3481              semantics is preserved.  All statements up to this one
3482              are added to the same BB.  All other statements in the
3483              list will be added to normal outgoing edges of the same
3484              BB.  If they access any memory, it's the same memory, so
3485              we can assume they won't throw.  */
3486           tsi = tsi_start (list);
3487           for (first = tsi_stmt (tsi);
3488                thr && !tsi_end_p (tsi) && !tree_could_throw_p (first);
3489                first = tsi_stmt (tsi))
3490             {
3491               tsi_delink (&tsi);
3492               append_to_statement_list (first, &blist);
3493             }
3494
3495           /* Extract the first remaining statement from LIST, this is
3496              the EH statement if there is one.  */
3497           tsi_delink (&tsi);
3498
3499           if (blist)
3500             sra_insert_before (bsi, blist);
3501
3502           /* Replace the old statement with this new representative.  */
3503           bsi_replace (bsi, first, true);
3504
3505           if (!tsi_end_p (tsi))
3506             {
3507               /* If any reference would trap, then they all would.  And more
3508                  to the point, the first would.  Therefore none of the rest
3509                  will trap since the first didn't.  Indicate this by
3510                  iterating over the remaining statements and set
3511                  TREE_THIS_NOTRAP in all INDIRECT_REFs.  */
3512               do
3513                 {
3514                   walk_tree (tsi_stmt_ptr (tsi), mark_notrap, NULL, NULL);
3515                   tsi_next (&tsi);
3516                 }
3517               while (!tsi_end_p (tsi));
3518
3519               insert_edge_copies (list, bsi->bb);
3520             }
3521         }
3522       else
3523         sra_replace (bsi, list);
3524     }
3525 }
3526
3527 /* Generate initializations for all scalarizable parameters.  */
3528
3529 static void
3530 scalarize_parms (void)
3531 {
3532   tree list = NULL;
3533   referenced_var_iterator ri;
3534   tree var;
3535
3536   FOR_EACH_REFERENCED_VAR_IN_BITMAP (needs_copy_in, var, ri)
3537     {
3538       struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
3539       generate_copy_inout (elt, true, var, &list);
3540     }
3541
3542   if (list)
3543     {
3544       insert_edge_copies (list, ENTRY_BLOCK_PTR);
3545       mark_all_v_defs (list);
3546     }
3547 }
3548
3549 /* Entry point to phase 4.  Update the function to match replacements.  */
3550
3551 static void
3552 scalarize_function (void)
3553 {
3554   static const struct sra_walk_fns fns = {
3555     scalarize_use, scalarize_copy, scalarize_init, scalarize_ldst, false
3556   };
3557
3558   sra_walk_function (&fns);
3559   scalarize_parms ();
3560   bsi_commit_edge_inserts ();
3561 }
3562
3563 \f
3564 /* Debug helper function.  Print ELT in a nice human-readable format.  */
3565
3566 static void
3567 dump_sra_elt_name (FILE *f, struct sra_elt *elt)
3568 {
3569   if (elt->parent && TREE_CODE (elt->parent->type) == COMPLEX_TYPE)
3570     {
3571       fputs (elt->element == integer_zero_node ? "__real__ " : "__imag__ ", f);
3572       dump_sra_elt_name (f, elt->parent);
3573     }
3574   else
3575     {
3576       if (elt->parent)
3577         dump_sra_elt_name (f, elt->parent);
3578       if (DECL_P (elt->element))
3579         {
3580           if (TREE_CODE (elt->element) == FIELD_DECL)
3581             fputc ('.', f);
3582           print_generic_expr (f, elt->element, dump_flags);
3583         }
3584       else if (TREE_CODE (elt->element) == BIT_FIELD_REF)
3585         fprintf (f, "$B" HOST_WIDE_INT_PRINT_DEC "F" HOST_WIDE_INT_PRINT_DEC,
3586                  tree_low_cst (TREE_OPERAND (elt->element, 2), 1),
3587                  tree_low_cst (TREE_OPERAND (elt->element, 1), 1));
3588       else if (TREE_CODE (elt->element) == RANGE_EXPR)
3589         fprintf (f, "["HOST_WIDE_INT_PRINT_DEC".."HOST_WIDE_INT_PRINT_DEC"]",
3590                  TREE_INT_CST_LOW (TREE_OPERAND (elt->element, 0)),
3591                  TREE_INT_CST_LOW (TREE_OPERAND (elt->element, 1)));
3592       else
3593         fprintf (f, "[" HOST_WIDE_INT_PRINT_DEC "]",
3594                  TREE_INT_CST_LOW (elt->element));
3595     }
3596 }
3597
3598 /* Likewise, but callable from the debugger.  */
3599
3600 void
3601 debug_sra_elt_name (struct sra_elt *elt)
3602 {
3603   dump_sra_elt_name (stderr, elt);
3604   fputc ('\n', stderr);
3605 }
3606
3607 void 
3608 sra_init_cache (void)
3609 {
3610   if (sra_type_decomp_cache) 
3611     return;
3612
3613   sra_type_decomp_cache = BITMAP_ALLOC (NULL);
3614   sra_type_inst_cache = BITMAP_ALLOC (NULL);
3615 }
3616
3617 /* Main entry point.  */
3618
3619 static unsigned int
3620 tree_sra (void)
3621 {
3622   /* Initialize local variables.  */
3623   todoflags = 0;
3624   gcc_obstack_init (&sra_obstack);
3625   sra_candidates = BITMAP_ALLOC (NULL);
3626   needs_copy_in = BITMAP_ALLOC (NULL);
3627   sra_init_cache ();
3628   sra_map = htab_create (101, sra_elt_hash, sra_elt_eq, NULL);
3629
3630   /* Scan.  If we find anything, instantiate and scalarize.  */
3631   if (find_candidates_for_sra ())
3632     {
3633       scan_function ();
3634       decide_instantiations ();
3635       scalarize_function ();
3636       if (!bitmap_empty_p (sra_candidates))
3637         todoflags |= TODO_rebuild_alias;
3638     }
3639
3640   /* Free allocated memory.  */
3641   htab_delete (sra_map);
3642   sra_map = NULL;
3643   BITMAP_FREE (sra_candidates);
3644   BITMAP_FREE (needs_copy_in);
3645   BITMAP_FREE (sra_type_decomp_cache);
3646   BITMAP_FREE (sra_type_inst_cache);
3647   obstack_free (&sra_obstack, NULL);
3648   return todoflags;
3649 }
3650
3651 static unsigned int
3652 tree_sra_early (void)
3653 {
3654   unsigned int ret;
3655
3656   early_sra = true;
3657   ret = tree_sra ();
3658   early_sra = false;
3659
3660   return ret & ~TODO_rebuild_alias;
3661 }
3662
3663 static bool
3664 gate_sra (void)
3665 {
3666   return flag_tree_sra != 0;
3667 }
3668
3669 struct tree_opt_pass pass_sra_early =
3670 {
3671   "esra",                               /* name */
3672   gate_sra,                             /* gate */
3673   tree_sra_early,                       /* execute */
3674   NULL,                                 /* sub */
3675   NULL,                                 /* next */
3676   0,                                    /* static_pass_number */
3677   TV_TREE_SRA,                          /* tv_id */
3678   PROP_cfg | PROP_ssa,                  /* properties_required */
3679   0,                                    /* properties_provided */
3680   0,                                    /* properties_destroyed */
3681   0,                                    /* todo_flags_start */
3682   TODO_dump_func
3683   | TODO_update_ssa
3684   | TODO_ggc_collect
3685   | TODO_verify_ssa,                    /* todo_flags_finish */
3686   0                                     /* letter */
3687 };
3688
3689 struct tree_opt_pass pass_sra =
3690 {
3691   "sra",                                /* name */
3692   gate_sra,                             /* gate */
3693   tree_sra,                             /* execute */
3694   NULL,                                 /* sub */
3695   NULL,                                 /* next */
3696   0,                                    /* static_pass_number */
3697   TV_TREE_SRA,                          /* tv_id */
3698   PROP_cfg | PROP_ssa,                  /* properties_required */
3699   0,                                    /* properties_provided */
3700   0,                                    /* properties_destroyed */
3701   0,                                    /* todo_flags_start */
3702   TODO_dump_func
3703   | TODO_update_ssa
3704   | TODO_ggc_collect
3705   | TODO_verify_ssa,                    /* todo_flags_finish */
3706   0                                     /* letter */
3707 };