tree-sra.c (sra_walk_function): Don't rely on aliases being build.
[gcc.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 Free Software Foundation, Inc.
5 Contributed by Diego Novillo <dnovillo@redhat.com>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA. */
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 /* The set of todo flags to return from tree_sra. */
79 static unsigned int todoflags;
80
81 /* The set of aggregate variables that are candidates for scalarization. */
82 static bitmap sra_candidates;
83
84 /* Set of scalarizable PARM_DECLs that need copy-in operations at the
85 beginning of the function. */
86 static bitmap needs_copy_in;
87
88 /* Sets of bit pairs that cache type decomposition and instantiation. */
89 static bitmap sra_type_decomp_cache;
90 static bitmap sra_type_inst_cache;
91
92 /* One of these structures is created for each candidate aggregate and
93 each (accessed) member or group of members of such an aggregate. */
94 struct sra_elt
95 {
96 /* A tree of the elements. Used when we want to traverse everything. */
97 struct sra_elt *parent;
98 struct sra_elt *groups;
99 struct sra_elt *children;
100 struct sra_elt *sibling;
101
102 /* If this element is a root, then this is the VAR_DECL. If this is
103 a sub-element, this is some token used to identify the reference.
104 In the case of COMPONENT_REF, this is the FIELD_DECL. In the case
105 of an ARRAY_REF, this is the (constant) index. In the case of an
106 ARRAY_RANGE_REF, this is the (constant) RANGE_EXPR. In the case
107 of a complex number, this is a zero or one. */
108 tree element;
109
110 /* The type of the element. */
111 tree type;
112
113 /* A VAR_DECL, for any sub-element we've decided to replace. */
114 tree replacement;
115
116 /* The number of times the element is referenced as a whole. I.e.
117 given "a.b.c", this would be incremented for C, but not for A or B. */
118 unsigned int n_uses;
119
120 /* The number of times the element is copied to or from another
121 scalarizable element. */
122 unsigned int n_copies;
123
124 /* True if TYPE is scalar. */
125 bool is_scalar;
126
127 /* True if this element is a group of members of its parent. */
128 bool is_group;
129
130 /* True if we saw something about this element that prevents scalarization,
131 such as non-constant indexing. */
132 bool cannot_scalarize;
133
134 /* True if we've decided that structure-to-structure assignment
135 should happen via memcpy and not per-element. */
136 bool use_block_copy;
137
138 /* True if everything under this element has been marked TREE_NO_WARNING. */
139 bool all_no_warning;
140
141 /* A flag for use with/after random access traversals. */
142 bool visited;
143
144 /* True if there is BIT_FIELD_REF on the lhs with a vector. */
145 bool is_vector_lhs;
146 };
147
148 #define IS_ELEMENT_FOR_GROUP(ELEMENT) (TREE_CODE (ELEMENT) == RANGE_EXPR)
149
150 #define FOR_EACH_ACTUAL_CHILD(CHILD, ELT) \
151 for ((CHILD) = (ELT)->is_group \
152 ? next_child_for_group (NULL, (ELT)) \
153 : (ELT)->children; \
154 (CHILD); \
155 (CHILD) = (ELT)->is_group \
156 ? next_child_for_group ((CHILD), (ELT)) \
157 : (CHILD)->sibling)
158
159 /* Helper function for above macro. Return next child in group. */
160 static struct sra_elt *
161 next_child_for_group (struct sra_elt *child, struct sra_elt *group)
162 {
163 gcc_assert (group->is_group);
164
165 /* Find the next child in the parent. */
166 if (child)
167 child = child->sibling;
168 else
169 child = group->parent->children;
170
171 /* Skip siblings that do not belong to the group. */
172 while (child)
173 {
174 tree g_elt = group->element;
175 if (TREE_CODE (g_elt) == RANGE_EXPR)
176 {
177 if (!tree_int_cst_lt (child->element, TREE_OPERAND (g_elt, 0))
178 && !tree_int_cst_lt (TREE_OPERAND (g_elt, 1), child->element))
179 break;
180 }
181 else
182 gcc_unreachable ();
183
184 child = child->sibling;
185 }
186
187 return child;
188 }
189
190 /* Random access to the child of a parent is performed by hashing.
191 This prevents quadratic behavior, and allows SRA to function
192 reasonably on larger records. */
193 static htab_t sra_map;
194
195 /* All structures are allocated out of the following obstack. */
196 static struct obstack sra_obstack;
197
198 /* Debugging functions. */
199 static void dump_sra_elt_name (FILE *, struct sra_elt *);
200 extern void debug_sra_elt_name (struct sra_elt *);
201
202 /* Forward declarations. */
203 static tree generate_element_ref (struct sra_elt *);
204 \f
205 /* Return true if DECL is an SRA candidate. */
206
207 static bool
208 is_sra_candidate_decl (tree decl)
209 {
210 return DECL_P (decl) && bitmap_bit_p (sra_candidates, DECL_UID (decl));
211 }
212
213 /* Return true if TYPE is a scalar type. */
214
215 static bool
216 is_sra_scalar_type (tree type)
217 {
218 enum tree_code code = TREE_CODE (type);
219 return (code == INTEGER_TYPE || code == REAL_TYPE || code == VECTOR_TYPE
220 || code == ENUMERAL_TYPE || code == BOOLEAN_TYPE
221 || code == POINTER_TYPE || code == OFFSET_TYPE
222 || code == REFERENCE_TYPE);
223 }
224
225 /* Return true if TYPE can be decomposed into a set of independent variables.
226
227 Note that this doesn't imply that all elements of TYPE can be
228 instantiated, just that if we decide to break up the type into
229 separate pieces that it can be done. */
230
231 bool
232 sra_type_can_be_decomposed_p (tree type)
233 {
234 unsigned int cache = TYPE_UID (TYPE_MAIN_VARIANT (type)) * 2;
235 tree t;
236
237 /* Avoid searching the same type twice. */
238 if (bitmap_bit_p (sra_type_decomp_cache, cache+0))
239 return true;
240 if (bitmap_bit_p (sra_type_decomp_cache, cache+1))
241 return false;
242
243 /* The type must have a definite nonzero size. */
244 if (TYPE_SIZE (type) == NULL || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
245 || integer_zerop (TYPE_SIZE (type)))
246 goto fail;
247
248 /* The type must be a non-union aggregate. */
249 switch (TREE_CODE (type))
250 {
251 case RECORD_TYPE:
252 {
253 bool saw_one_field = false;
254
255 for (t = TYPE_FIELDS (type); t ; t = TREE_CHAIN (t))
256 if (TREE_CODE (t) == FIELD_DECL)
257 {
258 /* Reject incorrectly represented bit fields. */
259 if (DECL_BIT_FIELD (t)
260 && (tree_low_cst (DECL_SIZE (t), 1)
261 != TYPE_PRECISION (TREE_TYPE (t))))
262 goto fail;
263
264 saw_one_field = true;
265 }
266
267 /* Record types must have at least one field. */
268 if (!saw_one_field)
269 goto fail;
270 }
271 break;
272
273 case ARRAY_TYPE:
274 /* Array types must have a fixed lower and upper bound. */
275 t = TYPE_DOMAIN (type);
276 if (t == NULL)
277 goto fail;
278 if (TYPE_MIN_VALUE (t) == NULL || !TREE_CONSTANT (TYPE_MIN_VALUE (t)))
279 goto fail;
280 if (TYPE_MAX_VALUE (t) == NULL || !TREE_CONSTANT (TYPE_MAX_VALUE (t)))
281 goto fail;
282 break;
283
284 case COMPLEX_TYPE:
285 break;
286
287 default:
288 goto fail;
289 }
290
291 bitmap_set_bit (sra_type_decomp_cache, cache+0);
292 return true;
293
294 fail:
295 bitmap_set_bit (sra_type_decomp_cache, cache+1);
296 return false;
297 }
298
299 /* Return true if DECL can be decomposed into a set of independent
300 (though not necessarily scalar) variables. */
301
302 static bool
303 decl_can_be_decomposed_p (tree var)
304 {
305 /* Early out for scalars. */
306 if (is_sra_scalar_type (TREE_TYPE (var)))
307 return false;
308
309 /* The variable must not be aliased. */
310 if (!is_gimple_non_addressable (var))
311 {
312 if (dump_file && (dump_flags & TDF_DETAILS))
313 {
314 fprintf (dump_file, "Cannot scalarize variable ");
315 print_generic_expr (dump_file, var, dump_flags);
316 fprintf (dump_file, " because it must live in memory\n");
317 }
318 return false;
319 }
320
321 /* The variable must not be volatile. */
322 if (TREE_THIS_VOLATILE (var))
323 {
324 if (dump_file && (dump_flags & TDF_DETAILS))
325 {
326 fprintf (dump_file, "Cannot scalarize variable ");
327 print_generic_expr (dump_file, var, dump_flags);
328 fprintf (dump_file, " because it is declared volatile\n");
329 }
330 return false;
331 }
332
333 /* We must be able to decompose the variable's type. */
334 if (!sra_type_can_be_decomposed_p (TREE_TYPE (var)))
335 {
336 if (dump_file && (dump_flags & TDF_DETAILS))
337 {
338 fprintf (dump_file, "Cannot scalarize variable ");
339 print_generic_expr (dump_file, var, dump_flags);
340 fprintf (dump_file, " because its type cannot be decomposed\n");
341 }
342 return false;
343 }
344
345 return true;
346 }
347
348 /* Return true if TYPE can be *completely* decomposed into scalars. */
349
350 static bool
351 type_can_instantiate_all_elements (tree type)
352 {
353 if (is_sra_scalar_type (type))
354 return true;
355 if (!sra_type_can_be_decomposed_p (type))
356 return false;
357
358 switch (TREE_CODE (type))
359 {
360 case RECORD_TYPE:
361 {
362 unsigned int cache = TYPE_UID (TYPE_MAIN_VARIANT (type)) * 2;
363 tree f;
364
365 if (bitmap_bit_p (sra_type_inst_cache, cache+0))
366 return true;
367 if (bitmap_bit_p (sra_type_inst_cache, cache+1))
368 return false;
369
370 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
371 if (TREE_CODE (f) == FIELD_DECL)
372 {
373 if (!type_can_instantiate_all_elements (TREE_TYPE (f)))
374 {
375 bitmap_set_bit (sra_type_inst_cache, cache+1);
376 return false;
377 }
378 }
379
380 bitmap_set_bit (sra_type_inst_cache, cache+0);
381 return true;
382 }
383
384 case ARRAY_TYPE:
385 return type_can_instantiate_all_elements (TREE_TYPE (type));
386
387 case COMPLEX_TYPE:
388 return true;
389
390 default:
391 gcc_unreachable ();
392 }
393 }
394
395 /* Test whether ELT or some sub-element cannot be scalarized. */
396
397 static bool
398 can_completely_scalarize_p (struct sra_elt *elt)
399 {
400 struct sra_elt *c;
401
402 if (elt->cannot_scalarize)
403 return false;
404
405 for (c = elt->children; c; c = c->sibling)
406 if (!can_completely_scalarize_p (c))
407 return false;
408
409 for (c = elt->groups; c; c = c->sibling)
410 if (!can_completely_scalarize_p (c))
411 return false;
412
413 return true;
414 }
415
416 \f
417 /* A simplified tree hashing algorithm that only handles the types of
418 trees we expect to find in sra_elt->element. */
419
420 static hashval_t
421 sra_hash_tree (tree t)
422 {
423 hashval_t h;
424
425 switch (TREE_CODE (t))
426 {
427 case VAR_DECL:
428 case PARM_DECL:
429 case RESULT_DECL:
430 h = DECL_UID (t);
431 break;
432
433 case INTEGER_CST:
434 h = TREE_INT_CST_LOW (t) ^ TREE_INT_CST_HIGH (t);
435 break;
436
437 case RANGE_EXPR:
438 h = iterative_hash_expr (TREE_OPERAND (t, 0), 0);
439 h = iterative_hash_expr (TREE_OPERAND (t, 1), h);
440 break;
441
442 case FIELD_DECL:
443 /* We can have types that are compatible, but have different member
444 lists, so we can't hash fields by ID. Use offsets instead. */
445 h = iterative_hash_expr (DECL_FIELD_OFFSET (t), 0);
446 h = iterative_hash_expr (DECL_FIELD_BIT_OFFSET (t), h);
447 break;
448
449 default:
450 gcc_unreachable ();
451 }
452
453 return h;
454 }
455
456 /* Hash function for type SRA_PAIR. */
457
458 static hashval_t
459 sra_elt_hash (const void *x)
460 {
461 const struct sra_elt *e = x;
462 const struct sra_elt *p;
463 hashval_t h;
464
465 h = sra_hash_tree (e->element);
466
467 /* Take into account everything back up the chain. Given that chain
468 lengths are rarely very long, this should be acceptable. If we
469 truly identify this as a performance problem, it should work to
470 hash the pointer value "e->parent". */
471 for (p = e->parent; p ; p = p->parent)
472 h = (h * 65521) ^ sra_hash_tree (p->element);
473
474 return h;
475 }
476
477 /* Equality function for type SRA_PAIR. */
478
479 static int
480 sra_elt_eq (const void *x, const void *y)
481 {
482 const struct sra_elt *a = x;
483 const struct sra_elt *b = y;
484 tree ae, be;
485
486 if (a->parent != b->parent)
487 return false;
488
489 ae = a->element;
490 be = b->element;
491
492 if (ae == be)
493 return true;
494 if (TREE_CODE (ae) != TREE_CODE (be))
495 return false;
496
497 switch (TREE_CODE (ae))
498 {
499 case VAR_DECL:
500 case PARM_DECL:
501 case RESULT_DECL:
502 /* These are all pointer unique. */
503 return false;
504
505 case INTEGER_CST:
506 /* Integers are not pointer unique, so compare their values. */
507 return tree_int_cst_equal (ae, be);
508
509 case RANGE_EXPR:
510 return
511 tree_int_cst_equal (TREE_OPERAND (ae, 0), TREE_OPERAND (be, 0))
512 && tree_int_cst_equal (TREE_OPERAND (ae, 1), TREE_OPERAND (be, 1));
513
514 case FIELD_DECL:
515 /* Fields are unique within a record, but not between
516 compatible records. */
517 if (DECL_FIELD_CONTEXT (ae) == DECL_FIELD_CONTEXT (be))
518 return false;
519 return fields_compatible_p (ae, be);
520
521 default:
522 gcc_unreachable ();
523 }
524 }
525
526 /* Create or return the SRA_ELT structure for CHILD in PARENT. PARENT
527 may be null, in which case CHILD must be a DECL. */
528
529 static struct sra_elt *
530 lookup_element (struct sra_elt *parent, tree child, tree type,
531 enum insert_option insert)
532 {
533 struct sra_elt dummy;
534 struct sra_elt **slot;
535 struct sra_elt *elt;
536
537 if (parent)
538 dummy.parent = parent->is_group ? parent->parent : parent;
539 else
540 dummy.parent = NULL;
541 dummy.element = child;
542
543 slot = (struct sra_elt **) htab_find_slot (sra_map, &dummy, insert);
544 if (!slot && insert == NO_INSERT)
545 return NULL;
546
547 elt = *slot;
548 if (!elt && insert == INSERT)
549 {
550 *slot = elt = obstack_alloc (&sra_obstack, sizeof (*elt));
551 memset (elt, 0, sizeof (*elt));
552
553 elt->parent = parent;
554 elt->element = child;
555 elt->type = type;
556 elt->is_scalar = is_sra_scalar_type (type);
557
558 if (parent)
559 {
560 if (IS_ELEMENT_FOR_GROUP (elt->element))
561 {
562 elt->is_group = true;
563 elt->sibling = parent->groups;
564 parent->groups = elt;
565 }
566 else
567 {
568 elt->sibling = parent->children;
569 parent->children = elt;
570 }
571 }
572
573 /* If this is a parameter, then if we want to scalarize, we have
574 one copy from the true function parameter. Count it now. */
575 if (TREE_CODE (child) == PARM_DECL)
576 {
577 elt->n_copies = 1;
578 bitmap_set_bit (needs_copy_in, DECL_UID (child));
579 }
580 }
581
582 return elt;
583 }
584
585 /* Create or return the SRA_ELT structure for EXPR if the expression
586 refers to a scalarizable variable. */
587
588 static struct sra_elt *
589 maybe_lookup_element_for_expr (tree expr)
590 {
591 struct sra_elt *elt;
592 tree child;
593
594 switch (TREE_CODE (expr))
595 {
596 case VAR_DECL:
597 case PARM_DECL:
598 case RESULT_DECL:
599 if (is_sra_candidate_decl (expr))
600 return lookup_element (NULL, expr, TREE_TYPE (expr), INSERT);
601 return NULL;
602
603 case ARRAY_REF:
604 /* We can't scalarize variable array indices. */
605 if (in_array_bounds_p (expr))
606 child = TREE_OPERAND (expr, 1);
607 else
608 return NULL;
609 break;
610
611 case ARRAY_RANGE_REF:
612 /* We can't scalarize variable array indices. */
613 if (range_in_array_bounds_p (expr))
614 {
615 tree domain = TYPE_DOMAIN (TREE_TYPE (expr));
616 child = build2 (RANGE_EXPR, integer_type_node,
617 TYPE_MIN_VALUE (domain), TYPE_MAX_VALUE (domain));
618 }
619 else
620 return NULL;
621 break;
622
623 case COMPONENT_REF:
624 /* Don't look through unions. */
625 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) != RECORD_TYPE)
626 return NULL;
627 child = TREE_OPERAND (expr, 1);
628 break;
629
630 case REALPART_EXPR:
631 child = integer_zero_node;
632 break;
633 case IMAGPART_EXPR:
634 child = integer_one_node;
635 break;
636
637 default:
638 return NULL;
639 }
640
641 elt = maybe_lookup_element_for_expr (TREE_OPERAND (expr, 0));
642 if (elt)
643 return lookup_element (elt, child, TREE_TYPE (expr), INSERT);
644 return NULL;
645 }
646
647 \f
648 /* Functions to walk just enough of the tree to see all scalarizable
649 references, and categorize them. */
650
651 /* A set of callbacks for phases 2 and 4. They'll be invoked for the
652 various kinds of references seen. In all cases, *BSI is an iterator
653 pointing to the statement being processed. */
654 struct sra_walk_fns
655 {
656 /* Invoked when ELT is required as a unit. Note that ELT might refer to
657 a leaf node, in which case this is a simple scalar reference. *EXPR_P
658 points to the location of the expression. IS_OUTPUT is true if this
659 is a left-hand-side reference. USE_ALL is true if we saw something we
660 couldn't quite identify and had to force the use of the entire object. */
661 void (*use) (struct sra_elt *elt, tree *expr_p,
662 block_stmt_iterator *bsi, bool is_output, bool use_all);
663
664 /* Invoked when we have a copy between two scalarizable references. */
665 void (*copy) (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
666 block_stmt_iterator *bsi);
667
668 /* Invoked when ELT is initialized from a constant. VALUE may be NULL,
669 in which case it should be treated as an empty CONSTRUCTOR. */
670 void (*init) (struct sra_elt *elt, tree value, block_stmt_iterator *bsi);
671
672 /* Invoked when we have a copy between one scalarizable reference ELT
673 and one non-scalarizable reference OTHER. IS_OUTPUT is true if ELT
674 is on the left-hand side. */
675 void (*ldst) (struct sra_elt *elt, tree other,
676 block_stmt_iterator *bsi, bool is_output);
677
678 /* True during phase 2, false during phase 4. */
679 /* ??? This is a hack. */
680 bool initial_scan;
681 };
682
683 #ifdef ENABLE_CHECKING
684 /* Invoked via walk_tree, if *TP contains a candidate decl, return it. */
685
686 static tree
687 sra_find_candidate_decl (tree *tp, int *walk_subtrees,
688 void *data ATTRIBUTE_UNUSED)
689 {
690 tree t = *tp;
691 enum tree_code code = TREE_CODE (t);
692
693 if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
694 {
695 *walk_subtrees = 0;
696 if (is_sra_candidate_decl (t))
697 return t;
698 }
699 else if (TYPE_P (t))
700 *walk_subtrees = 0;
701
702 return NULL;
703 }
704 #endif
705
706 /* Walk most expressions looking for a scalarizable aggregate.
707 If we find one, invoke FNS->USE. */
708
709 static void
710 sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
711 const struct sra_walk_fns *fns)
712 {
713 tree expr = *expr_p;
714 tree inner = expr;
715 bool disable_scalarization = false;
716 bool use_all_p = false;
717
718 /* We're looking to collect a reference expression between EXPR and INNER,
719 such that INNER is a scalarizable decl and all other nodes through EXPR
720 are references that we can scalarize. If we come across something that
721 we can't scalarize, we reset EXPR. This has the effect of making it
722 appear that we're referring to the larger expression as a whole. */
723
724 while (1)
725 switch (TREE_CODE (inner))
726 {
727 case VAR_DECL:
728 case PARM_DECL:
729 case RESULT_DECL:
730 /* If there is a scalarizable decl at the bottom, then process it. */
731 if (is_sra_candidate_decl (inner))
732 {
733 struct sra_elt *elt = maybe_lookup_element_for_expr (expr);
734 if (disable_scalarization)
735 elt->cannot_scalarize = true;
736 else
737 fns->use (elt, expr_p, bsi, is_output, use_all_p);
738 }
739 return;
740
741 case ARRAY_REF:
742 /* Non-constant index means any member may be accessed. Prevent the
743 expression from being scalarized. If we were to treat this as a
744 reference to the whole array, we can wind up with a single dynamic
745 index reference inside a loop being overridden by several constant
746 index references during loop setup. It's possible that this could
747 be avoided by using dynamic usage counts based on BB trip counts
748 (based on loop analysis or profiling), but that hardly seems worth
749 the effort. */
750 /* ??? Hack. Figure out how to push this into the scan routines
751 without duplicating too much code. */
752 if (!in_array_bounds_p (inner))
753 {
754 disable_scalarization = true;
755 goto use_all;
756 }
757 /* ??? Are we assured that non-constant bounds and stride will have
758 the same value everywhere? I don't think Fortran will... */
759 if (TREE_OPERAND (inner, 2) || TREE_OPERAND (inner, 3))
760 goto use_all;
761 inner = TREE_OPERAND (inner, 0);
762 break;
763
764 case ARRAY_RANGE_REF:
765 if (!range_in_array_bounds_p (inner))
766 {
767 disable_scalarization = true;
768 goto use_all;
769 }
770 /* ??? See above non-constant bounds and stride . */
771 if (TREE_OPERAND (inner, 2) || TREE_OPERAND (inner, 3))
772 goto use_all;
773 inner = TREE_OPERAND (inner, 0);
774 break;
775
776 case COMPONENT_REF:
777 /* A reference to a union member constitutes a reference to the
778 entire union. */
779 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (inner, 0))) != RECORD_TYPE)
780 goto use_all;
781 /* ??? See above re non-constant stride. */
782 if (TREE_OPERAND (inner, 2))
783 goto use_all;
784 inner = TREE_OPERAND (inner, 0);
785 break;
786
787 case REALPART_EXPR:
788 case IMAGPART_EXPR:
789 inner = TREE_OPERAND (inner, 0);
790 break;
791
792 case BIT_FIELD_REF:
793 /* A bit field reference to a specific vector is scalarized but for
794 ones for inputs need to be marked as used on the left hand size so
795 when we scalarize it, we can mark that variable as non renamable. */
796 if (is_output && TREE_CODE (TREE_TYPE (TREE_OPERAND (inner, 0))) == VECTOR_TYPE)
797 {
798 struct sra_elt *elt = maybe_lookup_element_for_expr (TREE_OPERAND (inner, 0));
799 elt->is_vector_lhs = true;
800 }
801 /* A bit field reference (access to *multiple* fields simultaneously)
802 is not currently scalarized. Consider this an access to the
803 complete outer element, to which walk_tree will bring us next. */
804
805 goto use_all;
806
807 case VIEW_CONVERT_EXPR:
808 case NOP_EXPR:
809 /* Similarly, a view/nop explicitly wants to look at an object in a
810 type other than the one we've scalarized. */
811 goto use_all;
812
813 case WITH_SIZE_EXPR:
814 /* This is a transparent wrapper. The entire inner expression really
815 is being used. */
816 goto use_all;
817
818 use_all:
819 expr_p = &TREE_OPERAND (inner, 0);
820 inner = expr = *expr_p;
821 use_all_p = true;
822 break;
823
824 default:
825 #ifdef ENABLE_CHECKING
826 /* Validate that we're not missing any references. */
827 gcc_assert (!walk_tree (&inner, sra_find_candidate_decl, NULL, NULL));
828 #endif
829 return;
830 }
831 }
832
833 /* Walk a TREE_LIST of values looking for scalarizable aggregates.
834 If we find one, invoke FNS->USE. */
835
836 static void
837 sra_walk_tree_list (tree list, block_stmt_iterator *bsi, bool is_output,
838 const struct sra_walk_fns *fns)
839 {
840 tree op;
841 for (op = list; op ; op = TREE_CHAIN (op))
842 sra_walk_expr (&TREE_VALUE (op), bsi, is_output, fns);
843 }
844
845 /* Walk the arguments of a CALL_EXPR looking for scalarizable aggregates.
846 If we find one, invoke FNS->USE. */
847
848 static void
849 sra_walk_call_expr (tree expr, block_stmt_iterator *bsi,
850 const struct sra_walk_fns *fns)
851 {
852 sra_walk_tree_list (TREE_OPERAND (expr, 1), bsi, false, fns);
853 }
854
855 /* Walk the inputs and outputs of an ASM_EXPR looking for scalarizable
856 aggregates. If we find one, invoke FNS->USE. */
857
858 static void
859 sra_walk_asm_expr (tree expr, block_stmt_iterator *bsi,
860 const struct sra_walk_fns *fns)
861 {
862 sra_walk_tree_list (ASM_INPUTS (expr), bsi, false, fns);
863 sra_walk_tree_list (ASM_OUTPUTS (expr), bsi, true, fns);
864 }
865
866 /* Walk a GIMPLE_MODIFY_STMT and categorize the assignment appropriately. */
867
868 static void
869 sra_walk_gimple_modify_stmt (tree expr, block_stmt_iterator *bsi,
870 const struct sra_walk_fns *fns)
871 {
872 struct sra_elt *lhs_elt, *rhs_elt;
873 tree lhs, rhs;
874
875 lhs = GIMPLE_STMT_OPERAND (expr, 0);
876 rhs = GIMPLE_STMT_OPERAND (expr, 1);
877 lhs_elt = maybe_lookup_element_for_expr (lhs);
878 rhs_elt = maybe_lookup_element_for_expr (rhs);
879
880 /* If both sides are scalarizable, this is a COPY operation. */
881 if (lhs_elt && rhs_elt)
882 {
883 fns->copy (lhs_elt, rhs_elt, bsi);
884 return;
885 }
886
887 /* If the RHS is scalarizable, handle it. There are only two cases. */
888 if (rhs_elt)
889 {
890 if (!rhs_elt->is_scalar)
891 fns->ldst (rhs_elt, lhs, bsi, false);
892 else
893 fns->use (rhs_elt, &GIMPLE_STMT_OPERAND (expr, 1), bsi, false, false);
894 }
895
896 /* If it isn't scalarizable, there may be scalarizable variables within, so
897 check for a call or else walk the RHS to see if we need to do any
898 copy-in operations. We need to do it before the LHS is scalarized so
899 that the statements get inserted in the proper place, before any
900 copy-out operations. */
901 else
902 {
903 tree call = get_call_expr_in (rhs);
904 if (call)
905 sra_walk_call_expr (call, bsi, fns);
906 else
907 sra_walk_expr (&GIMPLE_STMT_OPERAND (expr, 1), bsi, false, fns);
908 }
909
910 /* Likewise, handle the LHS being scalarizable. We have cases similar
911 to those above, but also want to handle RHS being constant. */
912 if (lhs_elt)
913 {
914 /* If this is an assignment from a constant, or constructor, then
915 we have access to all of the elements individually. Invoke INIT. */
916 if (TREE_CODE (rhs) == COMPLEX_EXPR
917 || TREE_CODE (rhs) == COMPLEX_CST
918 || TREE_CODE (rhs) == CONSTRUCTOR)
919 fns->init (lhs_elt, rhs, bsi);
920
921 /* If this is an assignment from read-only memory, treat this as if
922 we'd been passed the constructor directly. Invoke INIT. */
923 else if (TREE_CODE (rhs) == VAR_DECL
924 && TREE_STATIC (rhs)
925 && TREE_READONLY (rhs)
926 && targetm.binds_local_p (rhs))
927 fns->init (lhs_elt, DECL_INITIAL (rhs), bsi);
928
929 /* If this is a copy from a non-scalarizable lvalue, invoke LDST.
930 The lvalue requirement prevents us from trying to directly scalarize
931 the result of a function call. Which would result in trying to call
932 the function multiple times, and other evil things. */
933 else if (!lhs_elt->is_scalar && is_gimple_addressable (rhs))
934 fns->ldst (lhs_elt, rhs, bsi, true);
935
936 /* Otherwise we're being used in some context that requires the
937 aggregate to be seen as a whole. Invoke USE. */
938 else
939 fns->use (lhs_elt, &GIMPLE_STMT_OPERAND (expr, 0), bsi, true, false);
940 }
941
942 /* Similarly to above, LHS_ELT being null only means that the LHS as a
943 whole is not a scalarizable reference. There may be occurrences of
944 scalarizable variables within, which implies a USE. */
945 else
946 sra_walk_expr (&GIMPLE_STMT_OPERAND (expr, 0), bsi, true, fns);
947 }
948
949 /* Entry point to the walk functions. Search the entire function,
950 invoking the callbacks in FNS on each of the references to
951 scalarizable variables. */
952
953 static void
954 sra_walk_function (const struct sra_walk_fns *fns)
955 {
956 basic_block bb;
957 block_stmt_iterator si, ni;
958
959 /* ??? Phase 4 could derive some benefit to walking the function in
960 dominator tree order. */
961
962 FOR_EACH_BB (bb)
963 for (si = bsi_start (bb); !bsi_end_p (si); si = ni)
964 {
965 tree stmt, t;
966 stmt_ann_t ann;
967
968 stmt = bsi_stmt (si);
969 ann = stmt_ann (stmt);
970
971 ni = si;
972 bsi_next (&ni);
973
974 /* If the statement has no virtual operands, then it doesn't
975 make any structure references that we care about. */
976 if (gimple_aliases_computed_p (cfun)
977 && ZERO_SSA_OPERANDS (stmt, (SSA_OP_VIRTUAL_DEFS | SSA_OP_VUSE)))
978 continue;
979
980 switch (TREE_CODE (stmt))
981 {
982 case RETURN_EXPR:
983 /* If we have "return <retval>" then the return value is
984 already exposed for our pleasure. Walk it as a USE to
985 force all the components back in place for the return.
986
987 If we have an embedded assignment, then <retval> is of
988 a type that gets returned in registers in this ABI, and
989 we do not wish to extend their lifetimes. Treat this
990 as a USE of the variable on the RHS of this assignment. */
991
992 t = TREE_OPERAND (stmt, 0);
993 if (t == NULL_TREE)
994 ;
995 else if (TREE_CODE (t) == GIMPLE_MODIFY_STMT)
996 sra_walk_expr (&GIMPLE_STMT_OPERAND (t, 1), &si, false, fns);
997 else
998 sra_walk_expr (&TREE_OPERAND (stmt, 0), &si, false, fns);
999 break;
1000
1001 case GIMPLE_MODIFY_STMT:
1002 sra_walk_gimple_modify_stmt (stmt, &si, fns);
1003 break;
1004 case CALL_EXPR:
1005 sra_walk_call_expr (stmt, &si, fns);
1006 break;
1007 case ASM_EXPR:
1008 sra_walk_asm_expr (stmt, &si, fns);
1009 break;
1010
1011 default:
1012 break;
1013 }
1014 }
1015 }
1016 \f
1017 /* Phase One: Scan all referenced variables in the program looking for
1018 structures that could be decomposed. */
1019
1020 static bool
1021 find_candidates_for_sra (void)
1022 {
1023 bool any_set = false;
1024 tree var;
1025 referenced_var_iterator rvi;
1026
1027 FOR_EACH_REFERENCED_VAR (var, rvi)
1028 {
1029 if (decl_can_be_decomposed_p (var))
1030 {
1031 bitmap_set_bit (sra_candidates, DECL_UID (var));
1032 any_set = true;
1033 }
1034 }
1035
1036 return any_set;
1037 }
1038
1039 \f
1040 /* Phase Two: Scan all references to scalarizable variables. Count the
1041 number of times they are used or copied respectively. */
1042
1043 /* Callbacks to fill in SRA_WALK_FNS. Everything but USE is
1044 considered a copy, because we can decompose the reference such that
1045 the sub-elements needn't be contiguous. */
1046
1047 static void
1048 scan_use (struct sra_elt *elt, tree *expr_p ATTRIBUTE_UNUSED,
1049 block_stmt_iterator *bsi ATTRIBUTE_UNUSED,
1050 bool is_output ATTRIBUTE_UNUSED, bool use_all ATTRIBUTE_UNUSED)
1051 {
1052 elt->n_uses += 1;
1053 }
1054
1055 static void
1056 scan_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
1057 block_stmt_iterator *bsi ATTRIBUTE_UNUSED)
1058 {
1059 lhs_elt->n_copies += 1;
1060 rhs_elt->n_copies += 1;
1061 }
1062
1063 static void
1064 scan_init (struct sra_elt *lhs_elt, tree rhs ATTRIBUTE_UNUSED,
1065 block_stmt_iterator *bsi ATTRIBUTE_UNUSED)
1066 {
1067 lhs_elt->n_copies += 1;
1068 }
1069
1070 static void
1071 scan_ldst (struct sra_elt *elt, tree other ATTRIBUTE_UNUSED,
1072 block_stmt_iterator *bsi ATTRIBUTE_UNUSED,
1073 bool is_output ATTRIBUTE_UNUSED)
1074 {
1075 elt->n_copies += 1;
1076 }
1077
1078 /* Dump the values we collected during the scanning phase. */
1079
1080 static void
1081 scan_dump (struct sra_elt *elt)
1082 {
1083 struct sra_elt *c;
1084
1085 dump_sra_elt_name (dump_file, elt);
1086 fprintf (dump_file, ": n_uses=%u n_copies=%u\n", elt->n_uses, elt->n_copies);
1087
1088 for (c = elt->children; c ; c = c->sibling)
1089 scan_dump (c);
1090
1091 for (c = elt->groups; c ; c = c->sibling)
1092 scan_dump (c);
1093 }
1094
1095 /* Entry point to phase 2. Scan the entire function, building up
1096 scalarization data structures, recording copies and uses. */
1097
1098 static void
1099 scan_function (void)
1100 {
1101 static const struct sra_walk_fns fns = {
1102 scan_use, scan_copy, scan_init, scan_ldst, true
1103 };
1104 bitmap_iterator bi;
1105
1106 sra_walk_function (&fns);
1107
1108 if (dump_file && (dump_flags & TDF_DETAILS))
1109 {
1110 unsigned i;
1111
1112 fputs ("\nScan results:\n", dump_file);
1113 EXECUTE_IF_SET_IN_BITMAP (sra_candidates, 0, i, bi)
1114 {
1115 tree var = referenced_var (i);
1116 struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
1117 if (elt)
1118 scan_dump (elt);
1119 }
1120 fputc ('\n', dump_file);
1121 }
1122 }
1123 \f
1124 /* Phase Three: Make decisions about which variables to scalarize, if any.
1125 All elements to be scalarized have replacement variables made for them. */
1126
1127 /* A subroutine of build_element_name. Recursively build the element
1128 name on the obstack. */
1129
1130 static void
1131 build_element_name_1 (struct sra_elt *elt)
1132 {
1133 tree t;
1134 char buffer[32];
1135
1136 if (elt->parent)
1137 {
1138 build_element_name_1 (elt->parent);
1139 obstack_1grow (&sra_obstack, '$');
1140
1141 if (TREE_CODE (elt->parent->type) == COMPLEX_TYPE)
1142 {
1143 if (elt->element == integer_zero_node)
1144 obstack_grow (&sra_obstack, "real", 4);
1145 else
1146 obstack_grow (&sra_obstack, "imag", 4);
1147 return;
1148 }
1149 }
1150
1151 t = elt->element;
1152 if (TREE_CODE (t) == INTEGER_CST)
1153 {
1154 /* ??? Eh. Don't bother doing double-wide printing. */
1155 sprintf (buffer, HOST_WIDE_INT_PRINT_DEC, TREE_INT_CST_LOW (t));
1156 obstack_grow (&sra_obstack, buffer, strlen (buffer));
1157 }
1158 else
1159 {
1160 tree name = DECL_NAME (t);
1161 if (name)
1162 obstack_grow (&sra_obstack, IDENTIFIER_POINTER (name),
1163 IDENTIFIER_LENGTH (name));
1164 else
1165 {
1166 sprintf (buffer, "D%u", DECL_UID (t));
1167 obstack_grow (&sra_obstack, buffer, strlen (buffer));
1168 }
1169 }
1170 }
1171
1172 /* Construct a pretty variable name for an element's replacement variable.
1173 The name is built on the obstack. */
1174
1175 static char *
1176 build_element_name (struct sra_elt *elt)
1177 {
1178 build_element_name_1 (elt);
1179 obstack_1grow (&sra_obstack, '\0');
1180 return XOBFINISH (&sra_obstack, char *);
1181 }
1182
1183 /* Instantiate an element as an independent variable. */
1184
1185 static void
1186 instantiate_element (struct sra_elt *elt)
1187 {
1188 struct sra_elt *base_elt;
1189 tree var, base;
1190
1191 for (base_elt = elt; base_elt->parent; base_elt = base_elt->parent)
1192 continue;
1193 base = base_elt->element;
1194
1195 elt->replacement = var = make_rename_temp (elt->type, "SR");
1196
1197 /* For vectors, if used on the left hand side with BIT_FIELD_REF,
1198 they are not a gimple register. */
1199 if (TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE && elt->is_vector_lhs)
1200 DECL_GIMPLE_REG_P (var) = 0;
1201
1202 DECL_SOURCE_LOCATION (var) = DECL_SOURCE_LOCATION (base);
1203 DECL_ARTIFICIAL (var) = 1;
1204
1205 if (TREE_THIS_VOLATILE (elt->type))
1206 {
1207 TREE_THIS_VOLATILE (var) = 1;
1208 TREE_SIDE_EFFECTS (var) = 1;
1209 }
1210
1211 if (DECL_NAME (base) && !DECL_IGNORED_P (base))
1212 {
1213 char *pretty_name = build_element_name (elt);
1214 DECL_NAME (var) = get_identifier (pretty_name);
1215 obstack_free (&sra_obstack, pretty_name);
1216
1217 SET_DECL_DEBUG_EXPR (var, generate_element_ref (elt));
1218 DECL_DEBUG_EXPR_IS_FROM (var) = 1;
1219
1220 DECL_IGNORED_P (var) = 0;
1221 TREE_NO_WARNING (var) = TREE_NO_WARNING (base);
1222 }
1223 else
1224 {
1225 DECL_IGNORED_P (var) = 1;
1226 /* ??? We can't generate any warning that would be meaningful. */
1227 TREE_NO_WARNING (var) = 1;
1228 }
1229
1230 if (dump_file)
1231 {
1232 fputs (" ", dump_file);
1233 dump_sra_elt_name (dump_file, elt);
1234 fputs (" -> ", dump_file);
1235 print_generic_expr (dump_file, var, dump_flags);
1236 fputc ('\n', dump_file);
1237 }
1238 }
1239
1240 /* Make one pass across an element tree deciding whether or not it's
1241 profitable to instantiate individual leaf scalars.
1242
1243 PARENT_USES and PARENT_COPIES are the sum of the N_USES and N_COPIES
1244 fields all the way up the tree. */
1245
1246 static void
1247 decide_instantiation_1 (struct sra_elt *elt, unsigned int parent_uses,
1248 unsigned int parent_copies)
1249 {
1250 if (dump_file && !elt->parent)
1251 {
1252 fputs ("Initial instantiation for ", dump_file);
1253 dump_sra_elt_name (dump_file, elt);
1254 fputc ('\n', dump_file);
1255 }
1256
1257 if (elt->cannot_scalarize)
1258 return;
1259
1260 if (elt->is_scalar)
1261 {
1262 /* The decision is simple: instantiate if we're used more frequently
1263 than the parent needs to be seen as a complete unit. */
1264 if (elt->n_uses + elt->n_copies + parent_copies > parent_uses)
1265 instantiate_element (elt);
1266 }
1267 else
1268 {
1269 struct sra_elt *c, *group;
1270 unsigned int this_uses = elt->n_uses + parent_uses;
1271 unsigned int this_copies = elt->n_copies + parent_copies;
1272
1273 /* Consider groups of sub-elements as weighing in favour of
1274 instantiation whatever their size. */
1275 for (group = elt->groups; group ; group = group->sibling)
1276 FOR_EACH_ACTUAL_CHILD (c, group)
1277 {
1278 c->n_uses += group->n_uses;
1279 c->n_copies += group->n_copies;
1280 }
1281
1282 for (c = elt->children; c ; c = c->sibling)
1283 decide_instantiation_1 (c, this_uses, this_copies);
1284 }
1285 }
1286
1287 /* Compute the size and number of all instantiated elements below ELT.
1288 We will only care about this if the size of the complete structure
1289 fits in a HOST_WIDE_INT, so we don't have to worry about overflow. */
1290
1291 static unsigned int
1292 sum_instantiated_sizes (struct sra_elt *elt, unsigned HOST_WIDE_INT *sizep)
1293 {
1294 if (elt->replacement)
1295 {
1296 *sizep += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (elt->type));
1297 return 1;
1298 }
1299 else
1300 {
1301 struct sra_elt *c;
1302 unsigned int count = 0;
1303
1304 for (c = elt->children; c ; c = c->sibling)
1305 count += sum_instantiated_sizes (c, sizep);
1306
1307 return count;
1308 }
1309 }
1310
1311 /* Instantiate fields in ELT->TYPE that are not currently present as
1312 children of ELT. */
1313
1314 static void instantiate_missing_elements (struct sra_elt *elt);
1315
1316 static void
1317 instantiate_missing_elements_1 (struct sra_elt *elt, tree child, tree type)
1318 {
1319 struct sra_elt *sub = lookup_element (elt, child, type, INSERT);
1320 if (sub->is_scalar)
1321 {
1322 if (sub->replacement == NULL)
1323 instantiate_element (sub);
1324 }
1325 else
1326 instantiate_missing_elements (sub);
1327 }
1328
1329 static void
1330 instantiate_missing_elements (struct sra_elt *elt)
1331 {
1332 tree type = elt->type;
1333
1334 switch (TREE_CODE (type))
1335 {
1336 case RECORD_TYPE:
1337 {
1338 tree f;
1339 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
1340 if (TREE_CODE (f) == FIELD_DECL)
1341 instantiate_missing_elements_1 (elt, f, TREE_TYPE (f));
1342 break;
1343 }
1344
1345 case ARRAY_TYPE:
1346 {
1347 tree i, max, subtype;
1348
1349 i = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
1350 max = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
1351 subtype = TREE_TYPE (type);
1352
1353 while (1)
1354 {
1355 instantiate_missing_elements_1 (elt, i, subtype);
1356 if (tree_int_cst_equal (i, max))
1357 break;
1358 i = int_const_binop (PLUS_EXPR, i, integer_one_node, true);
1359 }
1360
1361 break;
1362 }
1363
1364 case COMPLEX_TYPE:
1365 type = TREE_TYPE (type);
1366 instantiate_missing_elements_1 (elt, integer_zero_node, type);
1367 instantiate_missing_elements_1 (elt, integer_one_node, type);
1368 break;
1369
1370 default:
1371 gcc_unreachable ();
1372 }
1373 }
1374
1375 /* Return true if there is only one non aggregate field in the record, TYPE.
1376 Return false otherwise. */
1377
1378 static bool
1379 single_scalar_field_in_record_p (tree type)
1380 {
1381 int num_fields = 0;
1382 tree field;
1383 if (TREE_CODE (type) != RECORD_TYPE)
1384 return false;
1385
1386 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1387 if (TREE_CODE (field) == FIELD_DECL)
1388 {
1389 num_fields++;
1390
1391 if (num_fields == 2)
1392 return false;
1393
1394 if (AGGREGATE_TYPE_P (TREE_TYPE (field)))
1395 return false;
1396 }
1397
1398 return true;
1399 }
1400
1401 /* Make one pass across an element tree deciding whether to perform block
1402 or element copies. If we decide on element copies, instantiate all
1403 elements. Return true if there are any instantiated sub-elements. */
1404
1405 static bool
1406 decide_block_copy (struct sra_elt *elt)
1407 {
1408 struct sra_elt *c;
1409 bool any_inst;
1410
1411 /* We shouldn't be invoked on groups of sub-elements as they must
1412 behave like their parent as far as block copy is concerned. */
1413 gcc_assert (!elt->is_group);
1414
1415 /* If scalarization is disabled, respect it. */
1416 if (elt->cannot_scalarize)
1417 {
1418 elt->use_block_copy = 1;
1419
1420 if (dump_file)
1421 {
1422 fputs ("Scalarization disabled for ", dump_file);
1423 dump_sra_elt_name (dump_file, elt);
1424 fputc ('\n', dump_file);
1425 }
1426
1427 /* Disable scalarization of sub-elements */
1428 for (c = elt->children; c; c = c->sibling)
1429 {
1430 c->cannot_scalarize = 1;
1431 decide_block_copy (c);
1432 }
1433
1434 /* Groups behave like their parent. */
1435 for (c = elt->groups; c; c = c->sibling)
1436 {
1437 c->cannot_scalarize = 1;
1438 c->use_block_copy = 1;
1439 }
1440
1441 return false;
1442 }
1443
1444 /* Don't decide if we've no uses. */
1445 if (elt->n_uses == 0 && elt->n_copies == 0)
1446 ;
1447
1448 else if (!elt->is_scalar)
1449 {
1450 tree size_tree = TYPE_SIZE_UNIT (elt->type);
1451 bool use_block_copy = true;
1452
1453 /* Tradeoffs for COMPLEX types pretty much always make it better
1454 to go ahead and split the components. */
1455 if (TREE_CODE (elt->type) == COMPLEX_TYPE)
1456 use_block_copy = false;
1457
1458 /* Don't bother trying to figure out the rest if the structure is
1459 so large we can't do easy arithmetic. This also forces block
1460 copies for variable sized structures. */
1461 else if (host_integerp (size_tree, 1))
1462 {
1463 unsigned HOST_WIDE_INT full_size, inst_size = 0;
1464 unsigned int max_size, max_count, inst_count, full_count;
1465
1466 /* If the sra-max-structure-size parameter is 0, then the
1467 user has not overridden the parameter and we can choose a
1468 sensible default. */
1469 max_size = SRA_MAX_STRUCTURE_SIZE
1470 ? SRA_MAX_STRUCTURE_SIZE
1471 : MOVE_RATIO * UNITS_PER_WORD;
1472 max_count = SRA_MAX_STRUCTURE_COUNT
1473 ? SRA_MAX_STRUCTURE_COUNT
1474 : MOVE_RATIO;
1475
1476 full_size = tree_low_cst (size_tree, 1);
1477 full_count = count_type_elements (elt->type, false);
1478 inst_count = sum_instantiated_sizes (elt, &inst_size);
1479
1480 /* If there is only one scalar field in the record, don't block copy. */
1481 if (single_scalar_field_in_record_p (elt->type))
1482 use_block_copy = false;
1483
1484 /* ??? What to do here. If there are two fields, and we've only
1485 instantiated one, then instantiating the other is clearly a win.
1486 If there are a large number of fields then the size of the copy
1487 is much more of a factor. */
1488
1489 /* If the structure is small, and we've made copies, go ahead
1490 and instantiate, hoping that the copies will go away. */
1491 if (full_size <= max_size
1492 && (full_count - inst_count) <= max_count
1493 && elt->n_copies > elt->n_uses)
1494 use_block_copy = false;
1495 else if (inst_count * 100 >= full_count * SRA_FIELD_STRUCTURE_RATIO
1496 && inst_size * 100 >= full_size * SRA_FIELD_STRUCTURE_RATIO)
1497 use_block_copy = false;
1498
1499 /* In order to avoid block copy, we have to be able to instantiate
1500 all elements of the type. See if this is possible. */
1501 if (!use_block_copy
1502 && (!can_completely_scalarize_p (elt)
1503 || !type_can_instantiate_all_elements (elt->type)))
1504 use_block_copy = true;
1505 }
1506
1507 elt->use_block_copy = use_block_copy;
1508
1509 /* Groups behave like their parent. */
1510 for (c = elt->groups; c; c = c->sibling)
1511 c->use_block_copy = use_block_copy;
1512
1513 if (dump_file)
1514 {
1515 fprintf (dump_file, "Using %s for ",
1516 use_block_copy ? "block-copy" : "element-copy");
1517 dump_sra_elt_name (dump_file, elt);
1518 fputc ('\n', dump_file);
1519 }
1520
1521 if (!use_block_copy)
1522 {
1523 instantiate_missing_elements (elt);
1524 return true;
1525 }
1526 }
1527
1528 any_inst = elt->replacement != NULL;
1529
1530 for (c = elt->children; c ; c = c->sibling)
1531 any_inst |= decide_block_copy (c);
1532
1533 return any_inst;
1534 }
1535
1536 /* Entry point to phase 3. Instantiate scalar replacement variables. */
1537
1538 static void
1539 decide_instantiations (void)
1540 {
1541 unsigned int i;
1542 bool cleared_any;
1543 bitmap_head done_head;
1544 bitmap_iterator bi;
1545
1546 /* We cannot clear bits from a bitmap we're iterating over,
1547 so save up all the bits to clear until the end. */
1548 bitmap_initialize (&done_head, &bitmap_default_obstack);
1549 cleared_any = false;
1550
1551 EXECUTE_IF_SET_IN_BITMAP (sra_candidates, 0, i, bi)
1552 {
1553 tree var = referenced_var (i);
1554 struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
1555 if (elt)
1556 {
1557 decide_instantiation_1 (elt, 0, 0);
1558 if (!decide_block_copy (elt))
1559 elt = NULL;
1560 }
1561 if (!elt)
1562 {
1563 bitmap_set_bit (&done_head, i);
1564 cleared_any = true;
1565 }
1566 }
1567
1568 if (cleared_any)
1569 {
1570 bitmap_and_compl_into (sra_candidates, &done_head);
1571 bitmap_and_compl_into (needs_copy_in, &done_head);
1572 }
1573 bitmap_clear (&done_head);
1574
1575 if (!bitmap_empty_p (sra_candidates))
1576 todoflags |= TODO_update_smt_usage;
1577
1578 mark_set_for_renaming (sra_candidates);
1579
1580 if (dump_file)
1581 fputc ('\n', dump_file);
1582 }
1583
1584 \f
1585 /* Phase Four: Update the function to match the replacements created. */
1586
1587 /* Mark all the variables in VDEF/VUSE operators for STMT for
1588 renaming. This becomes necessary when we modify all of a
1589 non-scalar. */
1590
1591 static void
1592 mark_all_v_defs_1 (tree stmt)
1593 {
1594 tree sym;
1595 ssa_op_iter iter;
1596
1597 update_stmt_if_modified (stmt);
1598
1599 FOR_EACH_SSA_TREE_OPERAND (sym, stmt, iter, SSA_OP_ALL_VIRTUALS)
1600 {
1601 if (TREE_CODE (sym) == SSA_NAME)
1602 sym = SSA_NAME_VAR (sym);
1603 mark_sym_for_renaming (sym);
1604 }
1605 }
1606
1607
1608 /* Mark all the variables in virtual operands in all the statements in
1609 LIST for renaming. */
1610
1611 static void
1612 mark_all_v_defs (tree list)
1613 {
1614 if (TREE_CODE (list) != STATEMENT_LIST)
1615 mark_all_v_defs_1 (list);
1616 else
1617 {
1618 tree_stmt_iterator i;
1619 for (i = tsi_start (list); !tsi_end_p (i); tsi_next (&i))
1620 mark_all_v_defs_1 (tsi_stmt (i));
1621 }
1622 }
1623
1624
1625 /* Mark every replacement under ELT with TREE_NO_WARNING. */
1626
1627 static void
1628 mark_no_warning (struct sra_elt *elt)
1629 {
1630 if (!elt->all_no_warning)
1631 {
1632 if (elt->replacement)
1633 TREE_NO_WARNING (elt->replacement) = 1;
1634 else
1635 {
1636 struct sra_elt *c;
1637 FOR_EACH_ACTUAL_CHILD (c, elt)
1638 mark_no_warning (c);
1639 }
1640 elt->all_no_warning = true;
1641 }
1642 }
1643
1644 /* Build a single level component reference to ELT rooted at BASE. */
1645
1646 static tree
1647 generate_one_element_ref (struct sra_elt *elt, tree base)
1648 {
1649 switch (TREE_CODE (TREE_TYPE (base)))
1650 {
1651 case RECORD_TYPE:
1652 {
1653 tree field = elt->element;
1654
1655 /* Watch out for compatible records with differing field lists. */
1656 if (DECL_FIELD_CONTEXT (field) != TYPE_MAIN_VARIANT (TREE_TYPE (base)))
1657 field = find_compatible_field (TREE_TYPE (base), field);
1658
1659 return build3 (COMPONENT_REF, elt->type, base, field, NULL);
1660 }
1661
1662 case ARRAY_TYPE:
1663 todoflags |= TODO_update_smt_usage;
1664 if (TREE_CODE (elt->element) == RANGE_EXPR)
1665 return build4 (ARRAY_RANGE_REF, elt->type, base,
1666 TREE_OPERAND (elt->element, 0), NULL, NULL);
1667 else
1668 return build4 (ARRAY_REF, elt->type, base, elt->element, NULL, NULL);
1669
1670 case COMPLEX_TYPE:
1671 if (elt->element == integer_zero_node)
1672 return build1 (REALPART_EXPR, elt->type, base);
1673 else
1674 return build1 (IMAGPART_EXPR, elt->type, base);
1675
1676 default:
1677 gcc_unreachable ();
1678 }
1679 }
1680
1681 /* Build a full component reference to ELT rooted at its native variable. */
1682
1683 static tree
1684 generate_element_ref (struct sra_elt *elt)
1685 {
1686 if (elt->parent)
1687 return generate_one_element_ref (elt, generate_element_ref (elt->parent));
1688 else
1689 return elt->element;
1690 }
1691
1692 /* Generate a set of assignment statements in *LIST_P to copy all
1693 instantiated elements under ELT to or from the equivalent structure
1694 rooted at EXPR. COPY_OUT controls the direction of the copy, with
1695 true meaning to copy out of EXPR into ELT. */
1696
1697 static void
1698 generate_copy_inout (struct sra_elt *elt, bool copy_out, tree expr,
1699 tree *list_p)
1700 {
1701 struct sra_elt *c;
1702 tree t;
1703
1704 if (!copy_out && TREE_CODE (expr) == SSA_NAME
1705 && TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
1706 {
1707 tree r, i;
1708
1709 c = lookup_element (elt, integer_zero_node, NULL, NO_INSERT);
1710 r = c->replacement;
1711 c = lookup_element (elt, integer_one_node, NULL, NO_INSERT);
1712 i = c->replacement;
1713
1714 t = build2 (COMPLEX_EXPR, elt->type, r, i);
1715 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, expr, t);
1716 SSA_NAME_DEF_STMT (expr) = t;
1717 append_to_statement_list (t, list_p);
1718 }
1719 else if (elt->replacement)
1720 {
1721 if (copy_out)
1722 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, elt->replacement, expr);
1723 else
1724 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, expr, elt->replacement);
1725 append_to_statement_list (t, list_p);
1726 }
1727 else
1728 {
1729 FOR_EACH_ACTUAL_CHILD (c, elt)
1730 {
1731 t = generate_one_element_ref (c, unshare_expr (expr));
1732 generate_copy_inout (c, copy_out, t, list_p);
1733 }
1734 }
1735 }
1736
1737 /* Generate a set of assignment statements in *LIST_P to copy all instantiated
1738 elements under SRC to their counterparts under DST. There must be a 1-1
1739 correspondence of instantiated elements. */
1740
1741 static void
1742 generate_element_copy (struct sra_elt *dst, struct sra_elt *src, tree *list_p)
1743 {
1744 struct sra_elt *dc, *sc;
1745
1746 FOR_EACH_ACTUAL_CHILD (dc, dst)
1747 {
1748 sc = lookup_element (src, dc->element, NULL, NO_INSERT);
1749 gcc_assert (sc);
1750 generate_element_copy (dc, sc, list_p);
1751 }
1752
1753 if (dst->replacement)
1754 {
1755 tree t;
1756
1757 gcc_assert (src->replacement);
1758
1759 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, dst->replacement,
1760 src->replacement);
1761 append_to_statement_list (t, list_p);
1762 }
1763 }
1764
1765 /* Generate a set of assignment statements in *LIST_P to zero all instantiated
1766 elements under ELT. In addition, do not assign to elements that have been
1767 marked VISITED but do reset the visited flag; this allows easy coordination
1768 with generate_element_init. */
1769
1770 static void
1771 generate_element_zero (struct sra_elt *elt, tree *list_p)
1772 {
1773 struct sra_elt *c;
1774
1775 if (elt->visited)
1776 {
1777 elt->visited = false;
1778 return;
1779 }
1780
1781 FOR_EACH_ACTUAL_CHILD (c, elt)
1782 generate_element_zero (c, list_p);
1783
1784 if (elt->replacement)
1785 {
1786 tree t;
1787
1788 gcc_assert (elt->is_scalar);
1789 t = fold_convert (elt->type, integer_zero_node);
1790
1791 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, elt->replacement, t);
1792 append_to_statement_list (t, list_p);
1793 }
1794 }
1795
1796 /* Generate an assignment VAR = INIT, where INIT may need gimplification.
1797 Add the result to *LIST_P. */
1798
1799 static void
1800 generate_one_element_init (tree var, tree init, tree *list_p)
1801 {
1802 /* The replacement can be almost arbitrarily complex. Gimplify. */
1803 tree stmt = build2 (GIMPLE_MODIFY_STMT, void_type_node, var, init);
1804 gimplify_and_add (stmt, list_p);
1805 }
1806
1807 /* Generate a set of assignment statements in *LIST_P to set all instantiated
1808 elements under ELT with the contents of the initializer INIT. In addition,
1809 mark all assigned elements VISITED; this allows easy coordination with
1810 generate_element_zero. Return false if we found a case we couldn't
1811 handle. */
1812
1813 static bool
1814 generate_element_init_1 (struct sra_elt *elt, tree init, tree *list_p)
1815 {
1816 bool result = true;
1817 enum tree_code init_code;
1818 struct sra_elt *sub;
1819 tree t;
1820 unsigned HOST_WIDE_INT idx;
1821 tree value, purpose;
1822
1823 /* We can be passed DECL_INITIAL of a static variable. It might have a
1824 conversion, which we strip off here. */
1825 STRIP_USELESS_TYPE_CONVERSION (init);
1826 init_code = TREE_CODE (init);
1827
1828 if (elt->is_scalar)
1829 {
1830 if (elt->replacement)
1831 {
1832 generate_one_element_init (elt->replacement, init, list_p);
1833 elt->visited = true;
1834 }
1835 return result;
1836 }
1837
1838 switch (init_code)
1839 {
1840 case COMPLEX_CST:
1841 case COMPLEX_EXPR:
1842 FOR_EACH_ACTUAL_CHILD (sub, elt)
1843 {
1844 if (sub->element == integer_zero_node)
1845 t = (init_code == COMPLEX_EXPR
1846 ? TREE_OPERAND (init, 0) : TREE_REALPART (init));
1847 else
1848 t = (init_code == COMPLEX_EXPR
1849 ? TREE_OPERAND (init, 1) : TREE_IMAGPART (init));
1850 result &= generate_element_init_1 (sub, t, list_p);
1851 }
1852 break;
1853
1854 case CONSTRUCTOR:
1855 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, purpose, value)
1856 {
1857 if (TREE_CODE (purpose) == RANGE_EXPR)
1858 {
1859 tree lower = TREE_OPERAND (purpose, 0);
1860 tree upper = TREE_OPERAND (purpose, 1);
1861
1862 while (1)
1863 {
1864 sub = lookup_element (elt, lower, NULL, NO_INSERT);
1865 if (sub != NULL)
1866 result &= generate_element_init_1 (sub, value, list_p);
1867 if (tree_int_cst_equal (lower, upper))
1868 break;
1869 lower = int_const_binop (PLUS_EXPR, lower,
1870 integer_one_node, true);
1871 }
1872 }
1873 else
1874 {
1875 sub = lookup_element (elt, purpose, NULL, NO_INSERT);
1876 if (sub != NULL)
1877 result &= generate_element_init_1 (sub, value, list_p);
1878 }
1879 }
1880 break;
1881
1882 default:
1883 elt->visited = true;
1884 result = false;
1885 }
1886
1887 return result;
1888 }
1889
1890 /* A wrapper function for generate_element_init_1 that handles cleanup after
1891 gimplification. */
1892
1893 static bool
1894 generate_element_init (struct sra_elt *elt, tree init, tree *list_p)
1895 {
1896 bool ret;
1897
1898 push_gimplify_context ();
1899 ret = generate_element_init_1 (elt, init, list_p);
1900 pop_gimplify_context (NULL);
1901
1902 /* The replacement can expose previously unreferenced variables. */
1903 if (ret && *list_p)
1904 {
1905 tree_stmt_iterator i;
1906
1907 for (i = tsi_start (*list_p); !tsi_end_p (i); tsi_next (&i))
1908 find_new_referenced_vars (tsi_stmt_ptr (i));
1909 }
1910
1911 return ret;
1912 }
1913
1914 /* Insert STMT on all the outgoing edges out of BB. Note that if BB
1915 has more than one edge, STMT will be replicated for each edge. Also,
1916 abnormal edges will be ignored. */
1917
1918 void
1919 insert_edge_copies (tree stmt, basic_block bb)
1920 {
1921 edge e;
1922 edge_iterator ei;
1923 bool first_copy;
1924
1925 first_copy = true;
1926 FOR_EACH_EDGE (e, ei, bb->succs)
1927 {
1928 /* We don't need to insert copies on abnormal edges. The
1929 value of the scalar replacement is not guaranteed to
1930 be valid through an abnormal edge. */
1931 if (!(e->flags & EDGE_ABNORMAL))
1932 {
1933 if (first_copy)
1934 {
1935 bsi_insert_on_edge (e, stmt);
1936 first_copy = false;
1937 }
1938 else
1939 bsi_insert_on_edge (e, unsave_expr_now (stmt));
1940 }
1941 }
1942 }
1943
1944 /* Helper function to insert LIST before BSI, and set up line number info. */
1945
1946 void
1947 sra_insert_before (block_stmt_iterator *bsi, tree list)
1948 {
1949 tree stmt = bsi_stmt (*bsi);
1950
1951 if (EXPR_HAS_LOCATION (stmt))
1952 annotate_all_with_locus (&list, EXPR_LOCATION (stmt));
1953 bsi_insert_before (bsi, list, BSI_SAME_STMT);
1954 }
1955
1956 /* Similarly, but insert after BSI. Handles insertion onto edges as well. */
1957
1958 void
1959 sra_insert_after (block_stmt_iterator *bsi, tree list)
1960 {
1961 tree stmt = bsi_stmt (*bsi);
1962
1963 if (EXPR_HAS_LOCATION (stmt))
1964 annotate_all_with_locus (&list, EXPR_LOCATION (stmt));
1965
1966 if (stmt_ends_bb_p (stmt))
1967 insert_edge_copies (list, bsi->bb);
1968 else
1969 bsi_insert_after (bsi, list, BSI_SAME_STMT);
1970 }
1971
1972 /* Similarly, but replace the statement at BSI. */
1973
1974 static void
1975 sra_replace (block_stmt_iterator *bsi, tree list)
1976 {
1977 sra_insert_before (bsi, list);
1978 bsi_remove (bsi, false);
1979 if (bsi_end_p (*bsi))
1980 *bsi = bsi_last (bsi->bb);
1981 else
1982 bsi_prev (bsi);
1983 }
1984
1985 /* Scalarize a USE. To recap, this is either a simple reference to ELT,
1986 if elt is scalar, or some occurrence of ELT that requires a complete
1987 aggregate. IS_OUTPUT is true if ELT is being modified. */
1988
1989 static void
1990 scalarize_use (struct sra_elt *elt, tree *expr_p, block_stmt_iterator *bsi,
1991 bool is_output, bool use_all)
1992 {
1993 tree list = NULL, stmt = bsi_stmt (*bsi);
1994
1995 if (elt->replacement)
1996 {
1997 /* If we have a replacement, then updating the reference is as
1998 simple as modifying the existing statement in place. */
1999 if (is_output)
2000 mark_all_v_defs (stmt);
2001 *expr_p = elt->replacement;
2002 update_stmt (stmt);
2003 }
2004 else
2005 {
2006 /* Otherwise we need some copies. If ELT is being read, then we want
2007 to store all (modified) sub-elements back into the structure before
2008 the reference takes place. If ELT is being written, then we want to
2009 load the changed values back into our shadow variables. */
2010 /* ??? We don't check modified for reads, we just always write all of
2011 the values. We should be able to record the SSA number of the VOP
2012 for which the values were last read. If that number matches the
2013 SSA number of the VOP in the current statement, then we needn't
2014 emit an assignment. This would also eliminate double writes when
2015 a structure is passed as more than one argument to a function call.
2016 This optimization would be most effective if sra_walk_function
2017 processed the blocks in dominator order. */
2018
2019 generate_copy_inout (elt, is_output, generate_element_ref (elt), &list);
2020 if (list == NULL)
2021 return;
2022 mark_all_v_defs (list);
2023 if (is_output)
2024 sra_insert_after (bsi, list);
2025 else
2026 {
2027 sra_insert_before (bsi, list);
2028 if (use_all)
2029 mark_no_warning (elt);
2030 }
2031 }
2032 }
2033
2034 /* Scalarize a COPY. To recap, this is an assignment statement between
2035 two scalarizable references, LHS_ELT and RHS_ELT. */
2036
2037 static void
2038 scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
2039 block_stmt_iterator *bsi)
2040 {
2041 tree list, stmt;
2042
2043 if (lhs_elt->replacement && rhs_elt->replacement)
2044 {
2045 /* If we have two scalar operands, modify the existing statement. */
2046 stmt = bsi_stmt (*bsi);
2047
2048 /* See the commentary in sra_walk_function concerning
2049 RETURN_EXPR, and why we should never see one here. */
2050 gcc_assert (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT);
2051
2052 GIMPLE_STMT_OPERAND (stmt, 0) = lhs_elt->replacement;
2053 GIMPLE_STMT_OPERAND (stmt, 1) = rhs_elt->replacement;
2054 update_stmt (stmt);
2055 }
2056 else if (lhs_elt->use_block_copy || rhs_elt->use_block_copy)
2057 {
2058 /* If either side requires a block copy, then sync the RHS back
2059 to the original structure, leave the original assignment
2060 statement (which will perform the block copy), then load the
2061 LHS values out of its now-updated original structure. */
2062 /* ??? Could perform a modified pair-wise element copy. That
2063 would at least allow those elements that are instantiated in
2064 both structures to be optimized well. */
2065
2066 list = NULL;
2067 generate_copy_inout (rhs_elt, false,
2068 generate_element_ref (rhs_elt), &list);
2069 if (list)
2070 {
2071 mark_all_v_defs (list);
2072 sra_insert_before (bsi, list);
2073 }
2074
2075 list = NULL;
2076 generate_copy_inout (lhs_elt, true,
2077 generate_element_ref (lhs_elt), &list);
2078 if (list)
2079 {
2080 mark_all_v_defs (list);
2081 sra_insert_after (bsi, list);
2082 }
2083 }
2084 else
2085 {
2086 /* Otherwise both sides must be fully instantiated. In which
2087 case perform pair-wise element assignments and replace the
2088 original block copy statement. */
2089
2090 stmt = bsi_stmt (*bsi);
2091 mark_all_v_defs (stmt);
2092
2093 list = NULL;
2094 generate_element_copy (lhs_elt, rhs_elt, &list);
2095 gcc_assert (list);
2096 mark_all_v_defs (list);
2097 sra_replace (bsi, list);
2098 }
2099 }
2100
2101 /* Scalarize an INIT. To recap, this is an assignment to a scalarizable
2102 reference from some form of constructor: CONSTRUCTOR, COMPLEX_CST or
2103 COMPLEX_EXPR. If RHS is NULL, it should be treated as an empty
2104 CONSTRUCTOR. */
2105
2106 static void
2107 scalarize_init (struct sra_elt *lhs_elt, tree rhs, block_stmt_iterator *bsi)
2108 {
2109 bool result = true;
2110 tree list = NULL;
2111
2112 /* Generate initialization statements for all members extant in the RHS. */
2113 if (rhs)
2114 {
2115 /* Unshare the expression just in case this is from a decl's initial. */
2116 rhs = unshare_expr (rhs);
2117 result = generate_element_init (lhs_elt, rhs, &list);
2118 }
2119
2120 /* CONSTRUCTOR is defined such that any member not mentioned is assigned
2121 a zero value. Initialize the rest of the instantiated elements. */
2122 generate_element_zero (lhs_elt, &list);
2123
2124 if (!result)
2125 {
2126 /* If we failed to convert the entire initializer, then we must
2127 leave the structure assignment in place and must load values
2128 from the structure into the slots for which we did not find
2129 constants. The easiest way to do this is to generate a complete
2130 copy-out, and then follow that with the constant assignments
2131 that we were able to build. DCE will clean things up. */
2132 tree list0 = NULL;
2133 generate_copy_inout (lhs_elt, true, generate_element_ref (lhs_elt),
2134 &list0);
2135 append_to_statement_list (list, &list0);
2136 list = list0;
2137 }
2138
2139 if (lhs_elt->use_block_copy || !result)
2140 {
2141 /* Since LHS is not fully instantiated, we must leave the structure
2142 assignment in place. Treating this case differently from a USE
2143 exposes constants to later optimizations. */
2144 if (list)
2145 {
2146 mark_all_v_defs (list);
2147 sra_insert_after (bsi, list);
2148 }
2149 }
2150 else
2151 {
2152 /* The LHS is fully instantiated. The list of initializations
2153 replaces the original structure assignment. */
2154 gcc_assert (list);
2155 mark_all_v_defs (bsi_stmt (*bsi));
2156 mark_all_v_defs (list);
2157 sra_replace (bsi, list);
2158 }
2159 }
2160
2161 /* A subroutine of scalarize_ldst called via walk_tree. Set TREE_NO_TRAP
2162 on all INDIRECT_REFs. */
2163
2164 static tree
2165 mark_notrap (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2166 {
2167 tree t = *tp;
2168
2169 if (TREE_CODE (t) == INDIRECT_REF)
2170 {
2171 TREE_THIS_NOTRAP (t) = 1;
2172 *walk_subtrees = 0;
2173 }
2174 else if (IS_TYPE_OR_DECL_P (t))
2175 *walk_subtrees = 0;
2176
2177 return NULL;
2178 }
2179
2180 /* Scalarize a LDST. To recap, this is an assignment between one scalarizable
2181 reference ELT and one non-scalarizable reference OTHER. IS_OUTPUT is true
2182 if ELT is on the left-hand side. */
2183
2184 static void
2185 scalarize_ldst (struct sra_elt *elt, tree other,
2186 block_stmt_iterator *bsi, bool is_output)
2187 {
2188 /* Shouldn't have gotten called for a scalar. */
2189 gcc_assert (!elt->replacement);
2190
2191 if (elt->use_block_copy)
2192 {
2193 /* Since ELT is not fully instantiated, we have to leave the
2194 block copy in place. Treat this as a USE. */
2195 scalarize_use (elt, NULL, bsi, is_output, false);
2196 }
2197 else
2198 {
2199 /* The interesting case is when ELT is fully instantiated. In this
2200 case we can have each element stored/loaded directly to/from the
2201 corresponding slot in OTHER. This avoids a block copy. */
2202
2203 tree list = NULL, stmt = bsi_stmt (*bsi);
2204
2205 mark_all_v_defs (stmt);
2206 generate_copy_inout (elt, is_output, other, &list);
2207 mark_all_v_defs (list);
2208 gcc_assert (list);
2209
2210 /* Preserve EH semantics. */
2211 if (stmt_ends_bb_p (stmt))
2212 {
2213 tree_stmt_iterator tsi;
2214 tree first;
2215
2216 /* Extract the first statement from LIST. */
2217 tsi = tsi_start (list);
2218 first = tsi_stmt (tsi);
2219 tsi_delink (&tsi);
2220
2221 /* Replace the old statement with this new representative. */
2222 bsi_replace (bsi, first, true);
2223
2224 if (!tsi_end_p (tsi))
2225 {
2226 /* If any reference would trap, then they all would. And more
2227 to the point, the first would. Therefore none of the rest
2228 will trap since the first didn't. Indicate this by
2229 iterating over the remaining statements and set
2230 TREE_THIS_NOTRAP in all INDIRECT_REFs. */
2231 do
2232 {
2233 walk_tree (tsi_stmt_ptr (tsi), mark_notrap, NULL, NULL);
2234 tsi_next (&tsi);
2235 }
2236 while (!tsi_end_p (tsi));
2237
2238 insert_edge_copies (list, bsi->bb);
2239 }
2240 }
2241 else
2242 sra_replace (bsi, list);
2243 }
2244 }
2245
2246 /* Generate initializations for all scalarizable parameters. */
2247
2248 static void
2249 scalarize_parms (void)
2250 {
2251 tree list = NULL;
2252 unsigned i;
2253 bitmap_iterator bi;
2254
2255 EXECUTE_IF_SET_IN_BITMAP (needs_copy_in, 0, i, bi)
2256 {
2257 tree var = referenced_var (i);
2258 struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
2259 generate_copy_inout (elt, true, var, &list);
2260 }
2261
2262 if (list)
2263 {
2264 insert_edge_copies (list, ENTRY_BLOCK_PTR);
2265 mark_all_v_defs (list);
2266 }
2267 }
2268
2269 /* Entry point to phase 4. Update the function to match replacements. */
2270
2271 static void
2272 scalarize_function (void)
2273 {
2274 static const struct sra_walk_fns fns = {
2275 scalarize_use, scalarize_copy, scalarize_init, scalarize_ldst, false
2276 };
2277
2278 sra_walk_function (&fns);
2279 scalarize_parms ();
2280 bsi_commit_edge_inserts ();
2281 }
2282
2283 \f
2284 /* Debug helper function. Print ELT in a nice human-readable format. */
2285
2286 static void
2287 dump_sra_elt_name (FILE *f, struct sra_elt *elt)
2288 {
2289 if (elt->parent && TREE_CODE (elt->parent->type) == COMPLEX_TYPE)
2290 {
2291 fputs (elt->element == integer_zero_node ? "__real__ " : "__imag__ ", f);
2292 dump_sra_elt_name (f, elt->parent);
2293 }
2294 else
2295 {
2296 if (elt->parent)
2297 dump_sra_elt_name (f, elt->parent);
2298 if (DECL_P (elt->element))
2299 {
2300 if (TREE_CODE (elt->element) == FIELD_DECL)
2301 fputc ('.', f);
2302 print_generic_expr (f, elt->element, dump_flags);
2303 }
2304 else if (TREE_CODE (elt->element) == RANGE_EXPR)
2305 fprintf (f, "["HOST_WIDE_INT_PRINT_DEC".."HOST_WIDE_INT_PRINT_DEC"]",
2306 TREE_INT_CST_LOW (TREE_OPERAND (elt->element, 0)),
2307 TREE_INT_CST_LOW (TREE_OPERAND (elt->element, 1)));
2308 else
2309 fprintf (f, "[" HOST_WIDE_INT_PRINT_DEC "]",
2310 TREE_INT_CST_LOW (elt->element));
2311 }
2312 }
2313
2314 /* Likewise, but callable from the debugger. */
2315
2316 void
2317 debug_sra_elt_name (struct sra_elt *elt)
2318 {
2319 dump_sra_elt_name (stderr, elt);
2320 fputc ('\n', stderr);
2321 }
2322
2323 void
2324 sra_init_cache (void)
2325 {
2326 if (sra_type_decomp_cache)
2327 return;
2328
2329 sra_type_decomp_cache = BITMAP_ALLOC (NULL);
2330 sra_type_inst_cache = BITMAP_ALLOC (NULL);
2331 }
2332
2333 /* Main entry point. */
2334
2335 static unsigned int
2336 tree_sra (void)
2337 {
2338 /* Initialize local variables. */
2339 todoflags = 0;
2340 gcc_obstack_init (&sra_obstack);
2341 sra_candidates = BITMAP_ALLOC (NULL);
2342 needs_copy_in = BITMAP_ALLOC (NULL);
2343 sra_init_cache ();
2344 sra_map = htab_create (101, sra_elt_hash, sra_elt_eq, NULL);
2345
2346 /* Scan. If we find anything, instantiate and scalarize. */
2347 if (find_candidates_for_sra ())
2348 {
2349 scan_function ();
2350 decide_instantiations ();
2351 scalarize_function ();
2352 }
2353
2354 /* Free allocated memory. */
2355 htab_delete (sra_map);
2356 sra_map = NULL;
2357 BITMAP_FREE (sra_candidates);
2358 BITMAP_FREE (needs_copy_in);
2359 BITMAP_FREE (sra_type_decomp_cache);
2360 BITMAP_FREE (sra_type_inst_cache);
2361 obstack_free (&sra_obstack, NULL);
2362 return todoflags;
2363 }
2364
2365 static bool
2366 gate_sra (void)
2367 {
2368 return flag_tree_sra != 0;
2369 }
2370
2371 struct tree_opt_pass pass_sra =
2372 {
2373 "sra", /* name */
2374 gate_sra, /* gate */
2375 tree_sra, /* execute */
2376 NULL, /* sub */
2377 NULL, /* next */
2378 0, /* static_pass_number */
2379 TV_TREE_SRA, /* tv_id */
2380 PROP_cfg | PROP_ssa, /* properties_required */
2381 0, /* properties_provided */
2382 0, /* properties_destroyed */
2383 0, /* todo_flags_start */
2384 TODO_dump_func
2385 | TODO_update_ssa
2386 | TODO_ggc_collect
2387 | TODO_verify_ssa, /* todo_flags_finish */
2388 0 /* letter */
2389 };