Collections.java (UnmodifiableMap.toArray): Imported changes from Classpath.
[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
797 && TREE_CODE (TREE_TYPE (TREE_OPERAND (inner, 0))) == VECTOR_TYPE)
798 {
799 struct sra_elt *elt
800 = maybe_lookup_element_for_expr (TREE_OPERAND (inner, 0));
801 if (elt)
802 elt->is_vector_lhs = true;
803 }
804 /* A bit field reference (access to *multiple* fields simultaneously)
805 is not currently scalarized. Consider this an access to the
806 complete outer element, to which walk_tree will bring us next. */
807
808 goto use_all;
809
810 case VIEW_CONVERT_EXPR:
811 case NOP_EXPR:
812 /* Similarly, a view/nop explicitly wants to look at an object in a
813 type other than the one we've scalarized. */
814 goto use_all;
815
816 case WITH_SIZE_EXPR:
817 /* This is a transparent wrapper. The entire inner expression really
818 is being used. */
819 goto use_all;
820
821 use_all:
822 expr_p = &TREE_OPERAND (inner, 0);
823 inner = expr = *expr_p;
824 use_all_p = true;
825 break;
826
827 default:
828 #ifdef ENABLE_CHECKING
829 /* Validate that we're not missing any references. */
830 gcc_assert (!walk_tree (&inner, sra_find_candidate_decl, NULL, NULL));
831 #endif
832 return;
833 }
834 }
835
836 /* Walk a TREE_LIST of values looking for scalarizable aggregates.
837 If we find one, invoke FNS->USE. */
838
839 static void
840 sra_walk_tree_list (tree list, block_stmt_iterator *bsi, bool is_output,
841 const struct sra_walk_fns *fns)
842 {
843 tree op;
844 for (op = list; op ; op = TREE_CHAIN (op))
845 sra_walk_expr (&TREE_VALUE (op), bsi, is_output, fns);
846 }
847
848 /* Walk the arguments of a CALL_EXPR looking for scalarizable aggregates.
849 If we find one, invoke FNS->USE. */
850
851 static void
852 sra_walk_call_expr (tree expr, block_stmt_iterator *bsi,
853 const struct sra_walk_fns *fns)
854 {
855 sra_walk_tree_list (TREE_OPERAND (expr, 1), bsi, false, fns);
856 }
857
858 /* Walk the inputs and outputs of an ASM_EXPR looking for scalarizable
859 aggregates. If we find one, invoke FNS->USE. */
860
861 static void
862 sra_walk_asm_expr (tree expr, block_stmt_iterator *bsi,
863 const struct sra_walk_fns *fns)
864 {
865 sra_walk_tree_list (ASM_INPUTS (expr), bsi, false, fns);
866 sra_walk_tree_list (ASM_OUTPUTS (expr), bsi, true, fns);
867 }
868
869 /* Walk a GIMPLE_MODIFY_STMT and categorize the assignment appropriately. */
870
871 static void
872 sra_walk_gimple_modify_stmt (tree expr, block_stmt_iterator *bsi,
873 const struct sra_walk_fns *fns)
874 {
875 struct sra_elt *lhs_elt, *rhs_elt;
876 tree lhs, rhs;
877
878 lhs = GIMPLE_STMT_OPERAND (expr, 0);
879 rhs = GIMPLE_STMT_OPERAND (expr, 1);
880 lhs_elt = maybe_lookup_element_for_expr (lhs);
881 rhs_elt = maybe_lookup_element_for_expr (rhs);
882
883 /* If both sides are scalarizable, this is a COPY operation. */
884 if (lhs_elt && rhs_elt)
885 {
886 fns->copy (lhs_elt, rhs_elt, bsi);
887 return;
888 }
889
890 /* If the RHS is scalarizable, handle it. There are only two cases. */
891 if (rhs_elt)
892 {
893 if (!rhs_elt->is_scalar)
894 fns->ldst (rhs_elt, lhs, bsi, false);
895 else
896 fns->use (rhs_elt, &GIMPLE_STMT_OPERAND (expr, 1), bsi, false, false);
897 }
898
899 /* If it isn't scalarizable, there may be scalarizable variables within, so
900 check for a call or else walk the RHS to see if we need to do any
901 copy-in operations. We need to do it before the LHS is scalarized so
902 that the statements get inserted in the proper place, before any
903 copy-out operations. */
904 else
905 {
906 tree call = get_call_expr_in (rhs);
907 if (call)
908 sra_walk_call_expr (call, bsi, fns);
909 else
910 sra_walk_expr (&GIMPLE_STMT_OPERAND (expr, 1), bsi, false, fns);
911 }
912
913 /* Likewise, handle the LHS being scalarizable. We have cases similar
914 to those above, but also want to handle RHS being constant. */
915 if (lhs_elt)
916 {
917 /* If this is an assignment from a constant, or constructor, then
918 we have access to all of the elements individually. Invoke INIT. */
919 if (TREE_CODE (rhs) == COMPLEX_EXPR
920 || TREE_CODE (rhs) == COMPLEX_CST
921 || TREE_CODE (rhs) == CONSTRUCTOR)
922 fns->init (lhs_elt, rhs, bsi);
923
924 /* If this is an assignment from read-only memory, treat this as if
925 we'd been passed the constructor directly. Invoke INIT. */
926 else if (TREE_CODE (rhs) == VAR_DECL
927 && TREE_STATIC (rhs)
928 && TREE_READONLY (rhs)
929 && targetm.binds_local_p (rhs))
930 fns->init (lhs_elt, DECL_INITIAL (rhs), bsi);
931
932 /* If this is a copy from a non-scalarizable lvalue, invoke LDST.
933 The lvalue requirement prevents us from trying to directly scalarize
934 the result of a function call. Which would result in trying to call
935 the function multiple times, and other evil things. */
936 else if (!lhs_elt->is_scalar && is_gimple_addressable (rhs))
937 fns->ldst (lhs_elt, rhs, bsi, true);
938
939 /* Otherwise we're being used in some context that requires the
940 aggregate to be seen as a whole. Invoke USE. */
941 else
942 fns->use (lhs_elt, &GIMPLE_STMT_OPERAND (expr, 0), bsi, true, false);
943 }
944
945 /* Similarly to above, LHS_ELT being null only means that the LHS as a
946 whole is not a scalarizable reference. There may be occurrences of
947 scalarizable variables within, which implies a USE. */
948 else
949 sra_walk_expr (&GIMPLE_STMT_OPERAND (expr, 0), bsi, true, fns);
950 }
951
952 /* Entry point to the walk functions. Search the entire function,
953 invoking the callbacks in FNS on each of the references to
954 scalarizable variables. */
955
956 static void
957 sra_walk_function (const struct sra_walk_fns *fns)
958 {
959 basic_block bb;
960 block_stmt_iterator si, ni;
961
962 /* ??? Phase 4 could derive some benefit to walking the function in
963 dominator tree order. */
964
965 FOR_EACH_BB (bb)
966 for (si = bsi_start (bb); !bsi_end_p (si); si = ni)
967 {
968 tree stmt, t;
969 stmt_ann_t ann;
970
971 stmt = bsi_stmt (si);
972 ann = stmt_ann (stmt);
973
974 ni = si;
975 bsi_next (&ni);
976
977 /* If the statement has no virtual operands, then it doesn't
978 make any structure references that we care about. */
979 if (gimple_aliases_computed_p (cfun)
980 && ZERO_SSA_OPERANDS (stmt, (SSA_OP_VIRTUAL_DEFS | SSA_OP_VUSE)))
981 continue;
982
983 switch (TREE_CODE (stmt))
984 {
985 case RETURN_EXPR:
986 /* If we have "return <retval>" then the return value is
987 already exposed for our pleasure. Walk it as a USE to
988 force all the components back in place for the return.
989
990 If we have an embedded assignment, then <retval> is of
991 a type that gets returned in registers in this ABI, and
992 we do not wish to extend their lifetimes. Treat this
993 as a USE of the variable on the RHS of this assignment. */
994
995 t = TREE_OPERAND (stmt, 0);
996 if (t == NULL_TREE)
997 ;
998 else if (TREE_CODE (t) == GIMPLE_MODIFY_STMT)
999 sra_walk_expr (&GIMPLE_STMT_OPERAND (t, 1), &si, false, fns);
1000 else
1001 sra_walk_expr (&TREE_OPERAND (stmt, 0), &si, false, fns);
1002 break;
1003
1004 case GIMPLE_MODIFY_STMT:
1005 sra_walk_gimple_modify_stmt (stmt, &si, fns);
1006 break;
1007 case CALL_EXPR:
1008 sra_walk_call_expr (stmt, &si, fns);
1009 break;
1010 case ASM_EXPR:
1011 sra_walk_asm_expr (stmt, &si, fns);
1012 break;
1013
1014 default:
1015 break;
1016 }
1017 }
1018 }
1019 \f
1020 /* Phase One: Scan all referenced variables in the program looking for
1021 structures that could be decomposed. */
1022
1023 static bool
1024 find_candidates_for_sra (void)
1025 {
1026 bool any_set = false;
1027 tree var;
1028 referenced_var_iterator rvi;
1029
1030 FOR_EACH_REFERENCED_VAR (var, rvi)
1031 {
1032 if (decl_can_be_decomposed_p (var))
1033 {
1034 bitmap_set_bit (sra_candidates, DECL_UID (var));
1035 any_set = true;
1036 }
1037 }
1038
1039 return any_set;
1040 }
1041
1042 \f
1043 /* Phase Two: Scan all references to scalarizable variables. Count the
1044 number of times they are used or copied respectively. */
1045
1046 /* Callbacks to fill in SRA_WALK_FNS. Everything but USE is
1047 considered a copy, because we can decompose the reference such that
1048 the sub-elements needn't be contiguous. */
1049
1050 static void
1051 scan_use (struct sra_elt *elt, tree *expr_p ATTRIBUTE_UNUSED,
1052 block_stmt_iterator *bsi ATTRIBUTE_UNUSED,
1053 bool is_output ATTRIBUTE_UNUSED, bool use_all ATTRIBUTE_UNUSED)
1054 {
1055 elt->n_uses += 1;
1056 }
1057
1058 static void
1059 scan_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
1060 block_stmt_iterator *bsi ATTRIBUTE_UNUSED)
1061 {
1062 lhs_elt->n_copies += 1;
1063 rhs_elt->n_copies += 1;
1064 }
1065
1066 static void
1067 scan_init (struct sra_elt *lhs_elt, tree rhs ATTRIBUTE_UNUSED,
1068 block_stmt_iterator *bsi ATTRIBUTE_UNUSED)
1069 {
1070 lhs_elt->n_copies += 1;
1071 }
1072
1073 static void
1074 scan_ldst (struct sra_elt *elt, tree other ATTRIBUTE_UNUSED,
1075 block_stmt_iterator *bsi ATTRIBUTE_UNUSED,
1076 bool is_output ATTRIBUTE_UNUSED)
1077 {
1078 elt->n_copies += 1;
1079 }
1080
1081 /* Dump the values we collected during the scanning phase. */
1082
1083 static void
1084 scan_dump (struct sra_elt *elt)
1085 {
1086 struct sra_elt *c;
1087
1088 dump_sra_elt_name (dump_file, elt);
1089 fprintf (dump_file, ": n_uses=%u n_copies=%u\n", elt->n_uses, elt->n_copies);
1090
1091 for (c = elt->children; c ; c = c->sibling)
1092 scan_dump (c);
1093
1094 for (c = elt->groups; c ; c = c->sibling)
1095 scan_dump (c);
1096 }
1097
1098 /* Entry point to phase 2. Scan the entire function, building up
1099 scalarization data structures, recording copies and uses. */
1100
1101 static void
1102 scan_function (void)
1103 {
1104 static const struct sra_walk_fns fns = {
1105 scan_use, scan_copy, scan_init, scan_ldst, true
1106 };
1107 bitmap_iterator bi;
1108
1109 sra_walk_function (&fns);
1110
1111 if (dump_file && (dump_flags & TDF_DETAILS))
1112 {
1113 unsigned i;
1114
1115 fputs ("\nScan results:\n", dump_file);
1116 EXECUTE_IF_SET_IN_BITMAP (sra_candidates, 0, i, bi)
1117 {
1118 tree var = referenced_var (i);
1119 struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
1120 if (elt)
1121 scan_dump (elt);
1122 }
1123 fputc ('\n', dump_file);
1124 }
1125 }
1126 \f
1127 /* Phase Three: Make decisions about which variables to scalarize, if any.
1128 All elements to be scalarized have replacement variables made for them. */
1129
1130 /* A subroutine of build_element_name. Recursively build the element
1131 name on the obstack. */
1132
1133 static void
1134 build_element_name_1 (struct sra_elt *elt)
1135 {
1136 tree t;
1137 char buffer[32];
1138
1139 if (elt->parent)
1140 {
1141 build_element_name_1 (elt->parent);
1142 obstack_1grow (&sra_obstack, '$');
1143
1144 if (TREE_CODE (elt->parent->type) == COMPLEX_TYPE)
1145 {
1146 if (elt->element == integer_zero_node)
1147 obstack_grow (&sra_obstack, "real", 4);
1148 else
1149 obstack_grow (&sra_obstack, "imag", 4);
1150 return;
1151 }
1152 }
1153
1154 t = elt->element;
1155 if (TREE_CODE (t) == INTEGER_CST)
1156 {
1157 /* ??? Eh. Don't bother doing double-wide printing. */
1158 sprintf (buffer, HOST_WIDE_INT_PRINT_DEC, TREE_INT_CST_LOW (t));
1159 obstack_grow (&sra_obstack, buffer, strlen (buffer));
1160 }
1161 else
1162 {
1163 tree name = DECL_NAME (t);
1164 if (name)
1165 obstack_grow (&sra_obstack, IDENTIFIER_POINTER (name),
1166 IDENTIFIER_LENGTH (name));
1167 else
1168 {
1169 sprintf (buffer, "D%u", DECL_UID (t));
1170 obstack_grow (&sra_obstack, buffer, strlen (buffer));
1171 }
1172 }
1173 }
1174
1175 /* Construct a pretty variable name for an element's replacement variable.
1176 The name is built on the obstack. */
1177
1178 static char *
1179 build_element_name (struct sra_elt *elt)
1180 {
1181 build_element_name_1 (elt);
1182 obstack_1grow (&sra_obstack, '\0');
1183 return XOBFINISH (&sra_obstack, char *);
1184 }
1185
1186 /* Instantiate an element as an independent variable. */
1187
1188 static void
1189 instantiate_element (struct sra_elt *elt)
1190 {
1191 struct sra_elt *base_elt;
1192 tree var, base;
1193
1194 for (base_elt = elt; base_elt->parent; base_elt = base_elt->parent)
1195 continue;
1196 base = base_elt->element;
1197
1198 elt->replacement = var = make_rename_temp (elt->type, "SR");
1199
1200 /* For vectors, if used on the left hand side with BIT_FIELD_REF,
1201 they are not a gimple register. */
1202 if (TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE && elt->is_vector_lhs)
1203 DECL_GIMPLE_REG_P (var) = 0;
1204
1205 DECL_SOURCE_LOCATION (var) = DECL_SOURCE_LOCATION (base);
1206 DECL_ARTIFICIAL (var) = 1;
1207
1208 if (TREE_THIS_VOLATILE (elt->type))
1209 {
1210 TREE_THIS_VOLATILE (var) = 1;
1211 TREE_SIDE_EFFECTS (var) = 1;
1212 }
1213
1214 if (DECL_NAME (base) && !DECL_IGNORED_P (base))
1215 {
1216 char *pretty_name = build_element_name (elt);
1217 DECL_NAME (var) = get_identifier (pretty_name);
1218 obstack_free (&sra_obstack, pretty_name);
1219
1220 SET_DECL_DEBUG_EXPR (var, generate_element_ref (elt));
1221 DECL_DEBUG_EXPR_IS_FROM (var) = 1;
1222
1223 DECL_IGNORED_P (var) = 0;
1224 TREE_NO_WARNING (var) = TREE_NO_WARNING (base);
1225 }
1226 else
1227 {
1228 DECL_IGNORED_P (var) = 1;
1229 /* ??? We can't generate any warning that would be meaningful. */
1230 TREE_NO_WARNING (var) = 1;
1231 }
1232
1233 if (dump_file)
1234 {
1235 fputs (" ", dump_file);
1236 dump_sra_elt_name (dump_file, elt);
1237 fputs (" -> ", dump_file);
1238 print_generic_expr (dump_file, var, dump_flags);
1239 fputc ('\n', dump_file);
1240 }
1241 }
1242
1243 /* Make one pass across an element tree deciding whether or not it's
1244 profitable to instantiate individual leaf scalars.
1245
1246 PARENT_USES and PARENT_COPIES are the sum of the N_USES and N_COPIES
1247 fields all the way up the tree. */
1248
1249 static void
1250 decide_instantiation_1 (struct sra_elt *elt, unsigned int parent_uses,
1251 unsigned int parent_copies)
1252 {
1253 if (dump_file && !elt->parent)
1254 {
1255 fputs ("Initial instantiation for ", dump_file);
1256 dump_sra_elt_name (dump_file, elt);
1257 fputc ('\n', dump_file);
1258 }
1259
1260 if (elt->cannot_scalarize)
1261 return;
1262
1263 if (elt->is_scalar)
1264 {
1265 /* The decision is simple: instantiate if we're used more frequently
1266 than the parent needs to be seen as a complete unit. */
1267 if (elt->n_uses + elt->n_copies + parent_copies > parent_uses)
1268 instantiate_element (elt);
1269 }
1270 else
1271 {
1272 struct sra_elt *c, *group;
1273 unsigned int this_uses = elt->n_uses + parent_uses;
1274 unsigned int this_copies = elt->n_copies + parent_copies;
1275
1276 /* Consider groups of sub-elements as weighing in favour of
1277 instantiation whatever their size. */
1278 for (group = elt->groups; group ; group = group->sibling)
1279 FOR_EACH_ACTUAL_CHILD (c, group)
1280 {
1281 c->n_uses += group->n_uses;
1282 c->n_copies += group->n_copies;
1283 }
1284
1285 for (c = elt->children; c ; c = c->sibling)
1286 decide_instantiation_1 (c, this_uses, this_copies);
1287 }
1288 }
1289
1290 /* Compute the size and number of all instantiated elements below ELT.
1291 We will only care about this if the size of the complete structure
1292 fits in a HOST_WIDE_INT, so we don't have to worry about overflow. */
1293
1294 static unsigned int
1295 sum_instantiated_sizes (struct sra_elt *elt, unsigned HOST_WIDE_INT *sizep)
1296 {
1297 if (elt->replacement)
1298 {
1299 *sizep += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (elt->type));
1300 return 1;
1301 }
1302 else
1303 {
1304 struct sra_elt *c;
1305 unsigned int count = 0;
1306
1307 for (c = elt->children; c ; c = c->sibling)
1308 count += sum_instantiated_sizes (c, sizep);
1309
1310 return count;
1311 }
1312 }
1313
1314 /* Instantiate fields in ELT->TYPE that are not currently present as
1315 children of ELT. */
1316
1317 static void instantiate_missing_elements (struct sra_elt *elt);
1318
1319 static void
1320 instantiate_missing_elements_1 (struct sra_elt *elt, tree child, tree type)
1321 {
1322 struct sra_elt *sub = lookup_element (elt, child, type, INSERT);
1323 if (sub->is_scalar)
1324 {
1325 if (sub->replacement == NULL)
1326 instantiate_element (sub);
1327 }
1328 else
1329 instantiate_missing_elements (sub);
1330 }
1331
1332 static void
1333 instantiate_missing_elements (struct sra_elt *elt)
1334 {
1335 tree type = elt->type;
1336
1337 switch (TREE_CODE (type))
1338 {
1339 case RECORD_TYPE:
1340 {
1341 tree f;
1342 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
1343 if (TREE_CODE (f) == FIELD_DECL)
1344 instantiate_missing_elements_1 (elt, f, TREE_TYPE (f));
1345 break;
1346 }
1347
1348 case ARRAY_TYPE:
1349 {
1350 tree i, max, subtype;
1351
1352 i = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
1353 max = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
1354 subtype = TREE_TYPE (type);
1355
1356 while (1)
1357 {
1358 instantiate_missing_elements_1 (elt, i, subtype);
1359 if (tree_int_cst_equal (i, max))
1360 break;
1361 i = int_const_binop (PLUS_EXPR, i, integer_one_node, true);
1362 }
1363
1364 break;
1365 }
1366
1367 case COMPLEX_TYPE:
1368 type = TREE_TYPE (type);
1369 instantiate_missing_elements_1 (elt, integer_zero_node, type);
1370 instantiate_missing_elements_1 (elt, integer_one_node, type);
1371 break;
1372
1373 default:
1374 gcc_unreachable ();
1375 }
1376 }
1377
1378 /* Return true if there is only one non aggregate field in the record, TYPE.
1379 Return false otherwise. */
1380
1381 static bool
1382 single_scalar_field_in_record_p (tree type)
1383 {
1384 int num_fields = 0;
1385 tree field;
1386 if (TREE_CODE (type) != RECORD_TYPE)
1387 return false;
1388
1389 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1390 if (TREE_CODE (field) == FIELD_DECL)
1391 {
1392 num_fields++;
1393
1394 if (num_fields == 2)
1395 return false;
1396
1397 if (AGGREGATE_TYPE_P (TREE_TYPE (field)))
1398 return false;
1399 }
1400
1401 return true;
1402 }
1403
1404 /* Make one pass across an element tree deciding whether to perform block
1405 or element copies. If we decide on element copies, instantiate all
1406 elements. Return true if there are any instantiated sub-elements. */
1407
1408 static bool
1409 decide_block_copy (struct sra_elt *elt)
1410 {
1411 struct sra_elt *c;
1412 bool any_inst;
1413
1414 /* We shouldn't be invoked on groups of sub-elements as they must
1415 behave like their parent as far as block copy is concerned. */
1416 gcc_assert (!elt->is_group);
1417
1418 /* If scalarization is disabled, respect it. */
1419 if (elt->cannot_scalarize)
1420 {
1421 elt->use_block_copy = 1;
1422
1423 if (dump_file)
1424 {
1425 fputs ("Scalarization disabled for ", dump_file);
1426 dump_sra_elt_name (dump_file, elt);
1427 fputc ('\n', dump_file);
1428 }
1429
1430 /* Disable scalarization of sub-elements */
1431 for (c = elt->children; c; c = c->sibling)
1432 {
1433 c->cannot_scalarize = 1;
1434 decide_block_copy (c);
1435 }
1436
1437 /* Groups behave like their parent. */
1438 for (c = elt->groups; c; c = c->sibling)
1439 {
1440 c->cannot_scalarize = 1;
1441 c->use_block_copy = 1;
1442 }
1443
1444 return false;
1445 }
1446
1447 /* Don't decide if we've no uses. */
1448 if (elt->n_uses == 0 && elt->n_copies == 0)
1449 ;
1450
1451 else if (!elt->is_scalar)
1452 {
1453 tree size_tree = TYPE_SIZE_UNIT (elt->type);
1454 bool use_block_copy = true;
1455
1456 /* Tradeoffs for COMPLEX types pretty much always make it better
1457 to go ahead and split the components. */
1458 if (TREE_CODE (elt->type) == COMPLEX_TYPE)
1459 use_block_copy = false;
1460
1461 /* Don't bother trying to figure out the rest if the structure is
1462 so large we can't do easy arithmetic. This also forces block
1463 copies for variable sized structures. */
1464 else if (host_integerp (size_tree, 1))
1465 {
1466 unsigned HOST_WIDE_INT full_size, inst_size = 0;
1467 unsigned int max_size, max_count, inst_count, full_count;
1468
1469 /* If the sra-max-structure-size parameter is 0, then the
1470 user has not overridden the parameter and we can choose a
1471 sensible default. */
1472 max_size = SRA_MAX_STRUCTURE_SIZE
1473 ? SRA_MAX_STRUCTURE_SIZE
1474 : MOVE_RATIO * UNITS_PER_WORD;
1475 max_count = SRA_MAX_STRUCTURE_COUNT
1476 ? SRA_MAX_STRUCTURE_COUNT
1477 : MOVE_RATIO;
1478
1479 full_size = tree_low_cst (size_tree, 1);
1480 full_count = count_type_elements (elt->type, false);
1481 inst_count = sum_instantiated_sizes (elt, &inst_size);
1482
1483 /* If there is only one scalar field in the record, don't block copy. */
1484 if (single_scalar_field_in_record_p (elt->type))
1485 use_block_copy = false;
1486
1487 /* ??? What to do here. If there are two fields, and we've only
1488 instantiated one, then instantiating the other is clearly a win.
1489 If there are a large number of fields then the size of the copy
1490 is much more of a factor. */
1491
1492 /* If the structure is small, and we've made copies, go ahead
1493 and instantiate, hoping that the copies will go away. */
1494 if (full_size <= max_size
1495 && (full_count - inst_count) <= max_count
1496 && elt->n_copies > elt->n_uses)
1497 use_block_copy = false;
1498 else if (inst_count * 100 >= full_count * SRA_FIELD_STRUCTURE_RATIO
1499 && inst_size * 100 >= full_size * SRA_FIELD_STRUCTURE_RATIO)
1500 use_block_copy = false;
1501
1502 /* In order to avoid block copy, we have to be able to instantiate
1503 all elements of the type. See if this is possible. */
1504 if (!use_block_copy
1505 && (!can_completely_scalarize_p (elt)
1506 || !type_can_instantiate_all_elements (elt->type)))
1507 use_block_copy = true;
1508 }
1509
1510 elt->use_block_copy = use_block_copy;
1511
1512 /* Groups behave like their parent. */
1513 for (c = elt->groups; c; c = c->sibling)
1514 c->use_block_copy = use_block_copy;
1515
1516 if (dump_file)
1517 {
1518 fprintf (dump_file, "Using %s for ",
1519 use_block_copy ? "block-copy" : "element-copy");
1520 dump_sra_elt_name (dump_file, elt);
1521 fputc ('\n', dump_file);
1522 }
1523
1524 if (!use_block_copy)
1525 {
1526 instantiate_missing_elements (elt);
1527 return true;
1528 }
1529 }
1530
1531 any_inst = elt->replacement != NULL;
1532
1533 for (c = elt->children; c ; c = c->sibling)
1534 any_inst |= decide_block_copy (c);
1535
1536 return any_inst;
1537 }
1538
1539 /* Entry point to phase 3. Instantiate scalar replacement variables. */
1540
1541 static void
1542 decide_instantiations (void)
1543 {
1544 unsigned int i;
1545 bool cleared_any;
1546 bitmap_head done_head;
1547 bitmap_iterator bi;
1548
1549 /* We cannot clear bits from a bitmap we're iterating over,
1550 so save up all the bits to clear until the end. */
1551 bitmap_initialize (&done_head, &bitmap_default_obstack);
1552 cleared_any = false;
1553
1554 EXECUTE_IF_SET_IN_BITMAP (sra_candidates, 0, i, bi)
1555 {
1556 tree var = referenced_var (i);
1557 struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
1558 if (elt)
1559 {
1560 decide_instantiation_1 (elt, 0, 0);
1561 if (!decide_block_copy (elt))
1562 elt = NULL;
1563 }
1564 if (!elt)
1565 {
1566 bitmap_set_bit (&done_head, i);
1567 cleared_any = true;
1568 }
1569 }
1570
1571 if (cleared_any)
1572 {
1573 bitmap_and_compl_into (sra_candidates, &done_head);
1574 bitmap_and_compl_into (needs_copy_in, &done_head);
1575 }
1576 bitmap_clear (&done_head);
1577
1578 if (!bitmap_empty_p (sra_candidates))
1579 todoflags |= TODO_update_smt_usage;
1580
1581 mark_set_for_renaming (sra_candidates);
1582
1583 if (dump_file)
1584 fputc ('\n', dump_file);
1585 }
1586
1587 \f
1588 /* Phase Four: Update the function to match the replacements created. */
1589
1590 /* Mark all the variables in VDEF/VUSE operators for STMT for
1591 renaming. This becomes necessary when we modify all of a
1592 non-scalar. */
1593
1594 static void
1595 mark_all_v_defs_1 (tree stmt)
1596 {
1597 tree sym;
1598 ssa_op_iter iter;
1599
1600 update_stmt_if_modified (stmt);
1601
1602 FOR_EACH_SSA_TREE_OPERAND (sym, stmt, iter, SSA_OP_ALL_VIRTUALS)
1603 {
1604 if (TREE_CODE (sym) == SSA_NAME)
1605 sym = SSA_NAME_VAR (sym);
1606 mark_sym_for_renaming (sym);
1607 }
1608 }
1609
1610
1611 /* Mark all the variables in virtual operands in all the statements in
1612 LIST for renaming. */
1613
1614 static void
1615 mark_all_v_defs (tree list)
1616 {
1617 if (TREE_CODE (list) != STATEMENT_LIST)
1618 mark_all_v_defs_1 (list);
1619 else
1620 {
1621 tree_stmt_iterator i;
1622 for (i = tsi_start (list); !tsi_end_p (i); tsi_next (&i))
1623 mark_all_v_defs_1 (tsi_stmt (i));
1624 }
1625 }
1626
1627
1628 /* Mark every replacement under ELT with TREE_NO_WARNING. */
1629
1630 static void
1631 mark_no_warning (struct sra_elt *elt)
1632 {
1633 if (!elt->all_no_warning)
1634 {
1635 if (elt->replacement)
1636 TREE_NO_WARNING (elt->replacement) = 1;
1637 else
1638 {
1639 struct sra_elt *c;
1640 FOR_EACH_ACTUAL_CHILD (c, elt)
1641 mark_no_warning (c);
1642 }
1643 elt->all_no_warning = true;
1644 }
1645 }
1646
1647 /* Build a single level component reference to ELT rooted at BASE. */
1648
1649 static tree
1650 generate_one_element_ref (struct sra_elt *elt, tree base)
1651 {
1652 switch (TREE_CODE (TREE_TYPE (base)))
1653 {
1654 case RECORD_TYPE:
1655 {
1656 tree field = elt->element;
1657
1658 /* Watch out for compatible records with differing field lists. */
1659 if (DECL_FIELD_CONTEXT (field) != TYPE_MAIN_VARIANT (TREE_TYPE (base)))
1660 field = find_compatible_field (TREE_TYPE (base), field);
1661
1662 return build3 (COMPONENT_REF, elt->type, base, field, NULL);
1663 }
1664
1665 case ARRAY_TYPE:
1666 todoflags |= TODO_update_smt_usage;
1667 if (TREE_CODE (elt->element) == RANGE_EXPR)
1668 return build4 (ARRAY_RANGE_REF, elt->type, base,
1669 TREE_OPERAND (elt->element, 0), NULL, NULL);
1670 else
1671 return build4 (ARRAY_REF, elt->type, base, elt->element, NULL, NULL);
1672
1673 case COMPLEX_TYPE:
1674 if (elt->element == integer_zero_node)
1675 return build1 (REALPART_EXPR, elt->type, base);
1676 else
1677 return build1 (IMAGPART_EXPR, elt->type, base);
1678
1679 default:
1680 gcc_unreachable ();
1681 }
1682 }
1683
1684 /* Build a full component reference to ELT rooted at its native variable. */
1685
1686 static tree
1687 generate_element_ref (struct sra_elt *elt)
1688 {
1689 if (elt->parent)
1690 return generate_one_element_ref (elt, generate_element_ref (elt->parent));
1691 else
1692 return elt->element;
1693 }
1694
1695 /* Generate a set of assignment statements in *LIST_P to copy all
1696 instantiated elements under ELT to or from the equivalent structure
1697 rooted at EXPR. COPY_OUT controls the direction of the copy, with
1698 true meaning to copy out of EXPR into ELT. */
1699
1700 static void
1701 generate_copy_inout (struct sra_elt *elt, bool copy_out, tree expr,
1702 tree *list_p)
1703 {
1704 struct sra_elt *c;
1705 tree t;
1706
1707 if (!copy_out && TREE_CODE (expr) == SSA_NAME
1708 && TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
1709 {
1710 tree r, i;
1711
1712 c = lookup_element (elt, integer_zero_node, NULL, NO_INSERT);
1713 r = c->replacement;
1714 c = lookup_element (elt, integer_one_node, NULL, NO_INSERT);
1715 i = c->replacement;
1716
1717 t = build2 (COMPLEX_EXPR, elt->type, r, i);
1718 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, expr, t);
1719 SSA_NAME_DEF_STMT (expr) = t;
1720 append_to_statement_list (t, list_p);
1721 }
1722 else if (elt->replacement)
1723 {
1724 if (copy_out)
1725 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, elt->replacement, expr);
1726 else
1727 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, expr, elt->replacement);
1728 append_to_statement_list (t, list_p);
1729 }
1730 else
1731 {
1732 FOR_EACH_ACTUAL_CHILD (c, elt)
1733 {
1734 t = generate_one_element_ref (c, unshare_expr (expr));
1735 generate_copy_inout (c, copy_out, t, list_p);
1736 }
1737 }
1738 }
1739
1740 /* Generate a set of assignment statements in *LIST_P to copy all instantiated
1741 elements under SRC to their counterparts under DST. There must be a 1-1
1742 correspondence of instantiated elements. */
1743
1744 static void
1745 generate_element_copy (struct sra_elt *dst, struct sra_elt *src, tree *list_p)
1746 {
1747 struct sra_elt *dc, *sc;
1748
1749 FOR_EACH_ACTUAL_CHILD (dc, dst)
1750 {
1751 sc = lookup_element (src, dc->element, NULL, NO_INSERT);
1752 gcc_assert (sc);
1753 generate_element_copy (dc, sc, list_p);
1754 }
1755
1756 if (dst->replacement)
1757 {
1758 tree t;
1759
1760 gcc_assert (src->replacement);
1761
1762 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, dst->replacement,
1763 src->replacement);
1764 append_to_statement_list (t, list_p);
1765 }
1766 }
1767
1768 /* Generate a set of assignment statements in *LIST_P to zero all instantiated
1769 elements under ELT. In addition, do not assign to elements that have been
1770 marked VISITED but do reset the visited flag; this allows easy coordination
1771 with generate_element_init. */
1772
1773 static void
1774 generate_element_zero (struct sra_elt *elt, tree *list_p)
1775 {
1776 struct sra_elt *c;
1777
1778 if (elt->visited)
1779 {
1780 elt->visited = false;
1781 return;
1782 }
1783
1784 FOR_EACH_ACTUAL_CHILD (c, elt)
1785 generate_element_zero (c, list_p);
1786
1787 if (elt->replacement)
1788 {
1789 tree t;
1790
1791 gcc_assert (elt->is_scalar);
1792 t = fold_convert (elt->type, integer_zero_node);
1793
1794 t = build2 (GIMPLE_MODIFY_STMT, void_type_node, elt->replacement, t);
1795 append_to_statement_list (t, list_p);
1796 }
1797 }
1798
1799 /* Generate an assignment VAR = INIT, where INIT may need gimplification.
1800 Add the result to *LIST_P. */
1801
1802 static void
1803 generate_one_element_init (tree var, tree init, tree *list_p)
1804 {
1805 /* The replacement can be almost arbitrarily complex. Gimplify. */
1806 tree stmt = build2 (GIMPLE_MODIFY_STMT, void_type_node, var, init);
1807 gimplify_and_add (stmt, list_p);
1808 }
1809
1810 /* Generate a set of assignment statements in *LIST_P to set all instantiated
1811 elements under ELT with the contents of the initializer INIT. In addition,
1812 mark all assigned elements VISITED; this allows easy coordination with
1813 generate_element_zero. Return false if we found a case we couldn't
1814 handle. */
1815
1816 static bool
1817 generate_element_init_1 (struct sra_elt *elt, tree init, tree *list_p)
1818 {
1819 bool result = true;
1820 enum tree_code init_code;
1821 struct sra_elt *sub;
1822 tree t;
1823 unsigned HOST_WIDE_INT idx;
1824 tree value, purpose;
1825
1826 /* We can be passed DECL_INITIAL of a static variable. It might have a
1827 conversion, which we strip off here. */
1828 STRIP_USELESS_TYPE_CONVERSION (init);
1829 init_code = TREE_CODE (init);
1830
1831 if (elt->is_scalar)
1832 {
1833 if (elt->replacement)
1834 {
1835 generate_one_element_init (elt->replacement, init, list_p);
1836 elt->visited = true;
1837 }
1838 return result;
1839 }
1840
1841 switch (init_code)
1842 {
1843 case COMPLEX_CST:
1844 case COMPLEX_EXPR:
1845 FOR_EACH_ACTUAL_CHILD (sub, elt)
1846 {
1847 if (sub->element == integer_zero_node)
1848 t = (init_code == COMPLEX_EXPR
1849 ? TREE_OPERAND (init, 0) : TREE_REALPART (init));
1850 else
1851 t = (init_code == COMPLEX_EXPR
1852 ? TREE_OPERAND (init, 1) : TREE_IMAGPART (init));
1853 result &= generate_element_init_1 (sub, t, list_p);
1854 }
1855 break;
1856
1857 case CONSTRUCTOR:
1858 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, purpose, value)
1859 {
1860 if (TREE_CODE (purpose) == RANGE_EXPR)
1861 {
1862 tree lower = TREE_OPERAND (purpose, 0);
1863 tree upper = TREE_OPERAND (purpose, 1);
1864
1865 while (1)
1866 {
1867 sub = lookup_element (elt, lower, NULL, NO_INSERT);
1868 if (sub != NULL)
1869 result &= generate_element_init_1 (sub, value, list_p);
1870 if (tree_int_cst_equal (lower, upper))
1871 break;
1872 lower = int_const_binop (PLUS_EXPR, lower,
1873 integer_one_node, true);
1874 }
1875 }
1876 else
1877 {
1878 sub = lookup_element (elt, purpose, NULL, NO_INSERT);
1879 if (sub != NULL)
1880 result &= generate_element_init_1 (sub, value, list_p);
1881 }
1882 }
1883 break;
1884
1885 default:
1886 elt->visited = true;
1887 result = false;
1888 }
1889
1890 return result;
1891 }
1892
1893 /* A wrapper function for generate_element_init_1 that handles cleanup after
1894 gimplification. */
1895
1896 static bool
1897 generate_element_init (struct sra_elt *elt, tree init, tree *list_p)
1898 {
1899 bool ret;
1900
1901 push_gimplify_context ();
1902 ret = generate_element_init_1 (elt, init, list_p);
1903 pop_gimplify_context (NULL);
1904
1905 /* The replacement can expose previously unreferenced variables. */
1906 if (ret && *list_p)
1907 {
1908 tree_stmt_iterator i;
1909
1910 for (i = tsi_start (*list_p); !tsi_end_p (i); tsi_next (&i))
1911 find_new_referenced_vars (tsi_stmt_ptr (i));
1912 }
1913
1914 return ret;
1915 }
1916
1917 /* Insert STMT on all the outgoing edges out of BB. Note that if BB
1918 has more than one edge, STMT will be replicated for each edge. Also,
1919 abnormal edges will be ignored. */
1920
1921 void
1922 insert_edge_copies (tree stmt, basic_block bb)
1923 {
1924 edge e;
1925 edge_iterator ei;
1926 bool first_copy;
1927
1928 first_copy = true;
1929 FOR_EACH_EDGE (e, ei, bb->succs)
1930 {
1931 /* We don't need to insert copies on abnormal edges. The
1932 value of the scalar replacement is not guaranteed to
1933 be valid through an abnormal edge. */
1934 if (!(e->flags & EDGE_ABNORMAL))
1935 {
1936 if (first_copy)
1937 {
1938 bsi_insert_on_edge (e, stmt);
1939 first_copy = false;
1940 }
1941 else
1942 bsi_insert_on_edge (e, unsave_expr_now (stmt));
1943 }
1944 }
1945 }
1946
1947 /* Helper function to insert LIST before BSI, and set up line number info. */
1948
1949 void
1950 sra_insert_before (block_stmt_iterator *bsi, tree list)
1951 {
1952 tree stmt = bsi_stmt (*bsi);
1953
1954 if (EXPR_HAS_LOCATION (stmt))
1955 annotate_all_with_locus (&list, EXPR_LOCATION (stmt));
1956 bsi_insert_before (bsi, list, BSI_SAME_STMT);
1957 }
1958
1959 /* Similarly, but insert after BSI. Handles insertion onto edges as well. */
1960
1961 void
1962 sra_insert_after (block_stmt_iterator *bsi, tree list)
1963 {
1964 tree stmt = bsi_stmt (*bsi);
1965
1966 if (EXPR_HAS_LOCATION (stmt))
1967 annotate_all_with_locus (&list, EXPR_LOCATION (stmt));
1968
1969 if (stmt_ends_bb_p (stmt))
1970 insert_edge_copies (list, bsi->bb);
1971 else
1972 bsi_insert_after (bsi, list, BSI_SAME_STMT);
1973 }
1974
1975 /* Similarly, but replace the statement at BSI. */
1976
1977 static void
1978 sra_replace (block_stmt_iterator *bsi, tree list)
1979 {
1980 sra_insert_before (bsi, list);
1981 bsi_remove (bsi, false);
1982 if (bsi_end_p (*bsi))
1983 *bsi = bsi_last (bsi->bb);
1984 else
1985 bsi_prev (bsi);
1986 }
1987
1988 /* Scalarize a USE. To recap, this is either a simple reference to ELT,
1989 if elt is scalar, or some occurrence of ELT that requires a complete
1990 aggregate. IS_OUTPUT is true if ELT is being modified. */
1991
1992 static void
1993 scalarize_use (struct sra_elt *elt, tree *expr_p, block_stmt_iterator *bsi,
1994 bool is_output, bool use_all)
1995 {
1996 tree list = NULL, stmt = bsi_stmt (*bsi);
1997
1998 if (elt->replacement)
1999 {
2000 /* If we have a replacement, then updating the reference is as
2001 simple as modifying the existing statement in place. */
2002 if (is_output)
2003 mark_all_v_defs (stmt);
2004 *expr_p = elt->replacement;
2005 update_stmt (stmt);
2006 }
2007 else
2008 {
2009 /* Otherwise we need some copies. If ELT is being read, then we want
2010 to store all (modified) sub-elements back into the structure before
2011 the reference takes place. If ELT is being written, then we want to
2012 load the changed values back into our shadow variables. */
2013 /* ??? We don't check modified for reads, we just always write all of
2014 the values. We should be able to record the SSA number of the VOP
2015 for which the values were last read. If that number matches the
2016 SSA number of the VOP in the current statement, then we needn't
2017 emit an assignment. This would also eliminate double writes when
2018 a structure is passed as more than one argument to a function call.
2019 This optimization would be most effective if sra_walk_function
2020 processed the blocks in dominator order. */
2021
2022 generate_copy_inout (elt, is_output, generate_element_ref (elt), &list);
2023 if (list == NULL)
2024 return;
2025 mark_all_v_defs (list);
2026 if (is_output)
2027 sra_insert_after (bsi, list);
2028 else
2029 {
2030 sra_insert_before (bsi, list);
2031 if (use_all)
2032 mark_no_warning (elt);
2033 }
2034 }
2035 }
2036
2037 /* Scalarize a COPY. To recap, this is an assignment statement between
2038 two scalarizable references, LHS_ELT and RHS_ELT. */
2039
2040 static void
2041 scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
2042 block_stmt_iterator *bsi)
2043 {
2044 tree list, stmt;
2045
2046 if (lhs_elt->replacement && rhs_elt->replacement)
2047 {
2048 /* If we have two scalar operands, modify the existing statement. */
2049 stmt = bsi_stmt (*bsi);
2050
2051 /* See the commentary in sra_walk_function concerning
2052 RETURN_EXPR, and why we should never see one here. */
2053 gcc_assert (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT);
2054
2055 GIMPLE_STMT_OPERAND (stmt, 0) = lhs_elt->replacement;
2056 GIMPLE_STMT_OPERAND (stmt, 1) = rhs_elt->replacement;
2057 update_stmt (stmt);
2058 }
2059 else if (lhs_elt->use_block_copy || rhs_elt->use_block_copy)
2060 {
2061 /* If either side requires a block copy, then sync the RHS back
2062 to the original structure, leave the original assignment
2063 statement (which will perform the block copy), then load the
2064 LHS values out of its now-updated original structure. */
2065 /* ??? Could perform a modified pair-wise element copy. That
2066 would at least allow those elements that are instantiated in
2067 both structures to be optimized well. */
2068
2069 list = NULL;
2070 generate_copy_inout (rhs_elt, false,
2071 generate_element_ref (rhs_elt), &list);
2072 if (list)
2073 {
2074 mark_all_v_defs (list);
2075 sra_insert_before (bsi, list);
2076 }
2077
2078 list = NULL;
2079 generate_copy_inout (lhs_elt, true,
2080 generate_element_ref (lhs_elt), &list);
2081 if (list)
2082 {
2083 mark_all_v_defs (list);
2084 sra_insert_after (bsi, list);
2085 }
2086 }
2087 else
2088 {
2089 /* Otherwise both sides must be fully instantiated. In which
2090 case perform pair-wise element assignments and replace the
2091 original block copy statement. */
2092
2093 stmt = bsi_stmt (*bsi);
2094 mark_all_v_defs (stmt);
2095
2096 list = NULL;
2097 generate_element_copy (lhs_elt, rhs_elt, &list);
2098 gcc_assert (list);
2099 mark_all_v_defs (list);
2100 sra_replace (bsi, list);
2101 }
2102 }
2103
2104 /* Scalarize an INIT. To recap, this is an assignment to a scalarizable
2105 reference from some form of constructor: CONSTRUCTOR, COMPLEX_CST or
2106 COMPLEX_EXPR. If RHS is NULL, it should be treated as an empty
2107 CONSTRUCTOR. */
2108
2109 static void
2110 scalarize_init (struct sra_elt *lhs_elt, tree rhs, block_stmt_iterator *bsi)
2111 {
2112 bool result = true;
2113 tree list = NULL;
2114
2115 /* Generate initialization statements for all members extant in the RHS. */
2116 if (rhs)
2117 {
2118 /* Unshare the expression just in case this is from a decl's initial. */
2119 rhs = unshare_expr (rhs);
2120 result = generate_element_init (lhs_elt, rhs, &list);
2121 }
2122
2123 /* CONSTRUCTOR is defined such that any member not mentioned is assigned
2124 a zero value. Initialize the rest of the instantiated elements. */
2125 generate_element_zero (lhs_elt, &list);
2126
2127 if (!result)
2128 {
2129 /* If we failed to convert the entire initializer, then we must
2130 leave the structure assignment in place and must load values
2131 from the structure into the slots for which we did not find
2132 constants. The easiest way to do this is to generate a complete
2133 copy-out, and then follow that with the constant assignments
2134 that we were able to build. DCE will clean things up. */
2135 tree list0 = NULL;
2136 generate_copy_inout (lhs_elt, true, generate_element_ref (lhs_elt),
2137 &list0);
2138 append_to_statement_list (list, &list0);
2139 list = list0;
2140 }
2141
2142 if (lhs_elt->use_block_copy || !result)
2143 {
2144 /* Since LHS is not fully instantiated, we must leave the structure
2145 assignment in place. Treating this case differently from a USE
2146 exposes constants to later optimizations. */
2147 if (list)
2148 {
2149 mark_all_v_defs (list);
2150 sra_insert_after (bsi, list);
2151 }
2152 }
2153 else
2154 {
2155 /* The LHS is fully instantiated. The list of initializations
2156 replaces the original structure assignment. */
2157 gcc_assert (list);
2158 mark_all_v_defs (bsi_stmt (*bsi));
2159 mark_all_v_defs (list);
2160 sra_replace (bsi, list);
2161 }
2162 }
2163
2164 /* A subroutine of scalarize_ldst called via walk_tree. Set TREE_NO_TRAP
2165 on all INDIRECT_REFs. */
2166
2167 static tree
2168 mark_notrap (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2169 {
2170 tree t = *tp;
2171
2172 if (TREE_CODE (t) == INDIRECT_REF)
2173 {
2174 TREE_THIS_NOTRAP (t) = 1;
2175 *walk_subtrees = 0;
2176 }
2177 else if (IS_TYPE_OR_DECL_P (t))
2178 *walk_subtrees = 0;
2179
2180 return NULL;
2181 }
2182
2183 /* Scalarize a LDST. To recap, this is an assignment between one scalarizable
2184 reference ELT and one non-scalarizable reference OTHER. IS_OUTPUT is true
2185 if ELT is on the left-hand side. */
2186
2187 static void
2188 scalarize_ldst (struct sra_elt *elt, tree other,
2189 block_stmt_iterator *bsi, bool is_output)
2190 {
2191 /* Shouldn't have gotten called for a scalar. */
2192 gcc_assert (!elt->replacement);
2193
2194 if (elt->use_block_copy)
2195 {
2196 /* Since ELT is not fully instantiated, we have to leave the
2197 block copy in place. Treat this as a USE. */
2198 scalarize_use (elt, NULL, bsi, is_output, false);
2199 }
2200 else
2201 {
2202 /* The interesting case is when ELT is fully instantiated. In this
2203 case we can have each element stored/loaded directly to/from the
2204 corresponding slot in OTHER. This avoids a block copy. */
2205
2206 tree list = NULL, stmt = bsi_stmt (*bsi);
2207
2208 mark_all_v_defs (stmt);
2209 generate_copy_inout (elt, is_output, other, &list);
2210 mark_all_v_defs (list);
2211 gcc_assert (list);
2212
2213 /* Preserve EH semantics. */
2214 if (stmt_ends_bb_p (stmt))
2215 {
2216 tree_stmt_iterator tsi;
2217 tree first;
2218
2219 /* Extract the first statement from LIST. */
2220 tsi = tsi_start (list);
2221 first = tsi_stmt (tsi);
2222 tsi_delink (&tsi);
2223
2224 /* Replace the old statement with this new representative. */
2225 bsi_replace (bsi, first, true);
2226
2227 if (!tsi_end_p (tsi))
2228 {
2229 /* If any reference would trap, then they all would. And more
2230 to the point, the first would. Therefore none of the rest
2231 will trap since the first didn't. Indicate this by
2232 iterating over the remaining statements and set
2233 TREE_THIS_NOTRAP in all INDIRECT_REFs. */
2234 do
2235 {
2236 walk_tree (tsi_stmt_ptr (tsi), mark_notrap, NULL, NULL);
2237 tsi_next (&tsi);
2238 }
2239 while (!tsi_end_p (tsi));
2240
2241 insert_edge_copies (list, bsi->bb);
2242 }
2243 }
2244 else
2245 sra_replace (bsi, list);
2246 }
2247 }
2248
2249 /* Generate initializations for all scalarizable parameters. */
2250
2251 static void
2252 scalarize_parms (void)
2253 {
2254 tree list = NULL;
2255 unsigned i;
2256 bitmap_iterator bi;
2257
2258 EXECUTE_IF_SET_IN_BITMAP (needs_copy_in, 0, i, bi)
2259 {
2260 tree var = referenced_var (i);
2261 struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
2262 generate_copy_inout (elt, true, var, &list);
2263 }
2264
2265 if (list)
2266 {
2267 insert_edge_copies (list, ENTRY_BLOCK_PTR);
2268 mark_all_v_defs (list);
2269 }
2270 }
2271
2272 /* Entry point to phase 4. Update the function to match replacements. */
2273
2274 static void
2275 scalarize_function (void)
2276 {
2277 static const struct sra_walk_fns fns = {
2278 scalarize_use, scalarize_copy, scalarize_init, scalarize_ldst, false
2279 };
2280
2281 sra_walk_function (&fns);
2282 scalarize_parms ();
2283 bsi_commit_edge_inserts ();
2284 }
2285
2286 \f
2287 /* Debug helper function. Print ELT in a nice human-readable format. */
2288
2289 static void
2290 dump_sra_elt_name (FILE *f, struct sra_elt *elt)
2291 {
2292 if (elt->parent && TREE_CODE (elt->parent->type) == COMPLEX_TYPE)
2293 {
2294 fputs (elt->element == integer_zero_node ? "__real__ " : "__imag__ ", f);
2295 dump_sra_elt_name (f, elt->parent);
2296 }
2297 else
2298 {
2299 if (elt->parent)
2300 dump_sra_elt_name (f, elt->parent);
2301 if (DECL_P (elt->element))
2302 {
2303 if (TREE_CODE (elt->element) == FIELD_DECL)
2304 fputc ('.', f);
2305 print_generic_expr (f, elt->element, dump_flags);
2306 }
2307 else if (TREE_CODE (elt->element) == RANGE_EXPR)
2308 fprintf (f, "["HOST_WIDE_INT_PRINT_DEC".."HOST_WIDE_INT_PRINT_DEC"]",
2309 TREE_INT_CST_LOW (TREE_OPERAND (elt->element, 0)),
2310 TREE_INT_CST_LOW (TREE_OPERAND (elt->element, 1)));
2311 else
2312 fprintf (f, "[" HOST_WIDE_INT_PRINT_DEC "]",
2313 TREE_INT_CST_LOW (elt->element));
2314 }
2315 }
2316
2317 /* Likewise, but callable from the debugger. */
2318
2319 void
2320 debug_sra_elt_name (struct sra_elt *elt)
2321 {
2322 dump_sra_elt_name (stderr, elt);
2323 fputc ('\n', stderr);
2324 }
2325
2326 void
2327 sra_init_cache (void)
2328 {
2329 if (sra_type_decomp_cache)
2330 return;
2331
2332 sra_type_decomp_cache = BITMAP_ALLOC (NULL);
2333 sra_type_inst_cache = BITMAP_ALLOC (NULL);
2334 }
2335
2336 /* Main entry point. */
2337
2338 static unsigned int
2339 tree_sra (void)
2340 {
2341 /* Initialize local variables. */
2342 todoflags = 0;
2343 gcc_obstack_init (&sra_obstack);
2344 sra_candidates = BITMAP_ALLOC (NULL);
2345 needs_copy_in = BITMAP_ALLOC (NULL);
2346 sra_init_cache ();
2347 sra_map = htab_create (101, sra_elt_hash, sra_elt_eq, NULL);
2348
2349 /* Scan. If we find anything, instantiate and scalarize. */
2350 if (find_candidates_for_sra ())
2351 {
2352 scan_function ();
2353 decide_instantiations ();
2354 scalarize_function ();
2355 }
2356
2357 /* Free allocated memory. */
2358 htab_delete (sra_map);
2359 sra_map = NULL;
2360 BITMAP_FREE (sra_candidates);
2361 BITMAP_FREE (needs_copy_in);
2362 BITMAP_FREE (sra_type_decomp_cache);
2363 BITMAP_FREE (sra_type_inst_cache);
2364 obstack_free (&sra_obstack, NULL);
2365 return todoflags;
2366 }
2367
2368 static bool
2369 gate_sra (void)
2370 {
2371 return flag_tree_sra != 0;
2372 }
2373
2374 struct tree_opt_pass pass_sra =
2375 {
2376 "sra", /* name */
2377 gate_sra, /* gate */
2378 tree_sra, /* execute */
2379 NULL, /* sub */
2380 NULL, /* next */
2381 0, /* static_pass_number */
2382 TV_TREE_SRA, /* tv_id */
2383 PROP_cfg | PROP_ssa, /* properties_required */
2384 0, /* properties_provided */
2385 0, /* properties_destroyed */
2386 0, /* todo_flags_start */
2387 TODO_dump_func
2388 | TODO_update_ssa
2389 | TODO_ggc_collect
2390 | TODO_verify_ssa, /* todo_flags_finish */
2391 0 /* letter */
2392 };