1/* Coalesce SSA_NAMES together for the out-of-ssa pass.
2 Copyright (C) 2004-2023 Free Software Foundation, Inc.
3 Contributed by Andrew MacLeod <amacleod@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "backend.h"
25#include "tree.h"
26#include "gimple.h"
27#include "predict.h"
28#include "memmodel.h"
29#include "tm_p.h"
30#include "ssa.h"
31#include "tree-ssa.h"
32#include "tree-pretty-print.h"
33#include "diagnostic-core.h"
34#include "dumpfile.h"
35#include "gimple-iterator.h"
36#include "tree-ssa-live.h"
37#include "tree-ssa-coalesce.h"
38#include "explow.h"
39#include "tree-dfa.h"
40#include "stor-layout.h"
41#include "gimple-lower-bitint.h"
42
43/* This set of routines implements a coalesce_list. This is an object which
44 is used to track pairs of ssa_names which are desirable to coalesce
45 together to avoid copies. Costs are associated with each pair, and when
46 all desired information has been collected, the object can be used to
47 order the pairs for processing. */
48
49/* This structure defines a pair entry. */
50
51struct coalesce_pair
52{
53 int first_element;
54 int second_element;
55 int cost;
56
57 /* A count of the number of unique partitions this pair would conflict
58 with if coalescing was successful. This is the secondary sort key,
59 given two pairs with equal costs, we will prefer the pair with a smaller
60 conflict set.
61
62 This is lazily initialized when we discover two coalescing pairs have
63 the same primary cost.
64
65 Note this is not updated and propagated as pairs are coalesced. */
66 int conflict_count;
67
68 /* The order in which coalescing pairs are discovered is recorded in this
69 field, which is used as the final tie breaker when sorting coalesce
70 pairs. */
71 int index;
72};
73
74/* This represents a conflict graph. Implemented as an array of bitmaps.
75 A full matrix is used for conflicts rather than just upper triangular form.
76 this makes it much simpler and faster to perform conflict merges. */
77
78struct ssa_conflicts
79{
80 bitmap_obstack obstack; /* A place to allocate our bitmaps. */
81 vec<bitmap> conflicts;
82};
83
84/* The narrow API of the qsort comparison function doesn't allow easy
85 access to additional arguments. So we have two globals (ick) to hold
86 the data we need. They're initialized before the call to qsort and
87 wiped immediately after. */
88static ssa_conflicts *conflicts_;
89static var_map map_;
90
91/* Coalesce pair hashtable helpers. */
92
93struct coalesce_pair_hasher : nofree_ptr_hash <coalesce_pair>
94{
95 static inline hashval_t hash (const coalesce_pair *);
96 static inline bool equal (const coalesce_pair *, const coalesce_pair *);
97};
98
99/* Hash function for coalesce list. Calculate hash for PAIR. */
100
101inline hashval_t
102coalesce_pair_hasher::hash (const coalesce_pair *pair)
103{
104 hashval_t a = (hashval_t)(pair->first_element);
105 hashval_t b = (hashval_t)(pair->second_element);
106
107 return b * (b - 1) / 2 + a;
108}
109
110/* Equality function for coalesce list hash table. Compare PAIR1 and PAIR2,
111 returning TRUE if the two pairs are equivalent. */
112
113inline bool
114coalesce_pair_hasher::equal (const coalesce_pair *p1, const coalesce_pair *p2)
115{
116 return (p1->first_element == p2->first_element
117 && p1->second_element == p2->second_element);
118}
119
120typedef hash_table<coalesce_pair_hasher> coalesce_table_type;
121typedef coalesce_table_type::iterator coalesce_iterator_type;
122
123
124struct cost_one_pair
125{
126 int first_element;
127 int second_element;
128 cost_one_pair *next;
129};
130
131/* This structure maintains the list of coalesce pairs. */
132
133struct coalesce_list
134{
135 coalesce_table_type *list; /* Hash table. */
136 coalesce_pair **sorted; /* List when sorted. */
137 int num_sorted; /* Number in the sorted list. */
138 cost_one_pair *cost_one_list;/* Single use coalesces with cost 1. */
139 obstack ob;
140};
141
142#define NO_BEST_COALESCE -1
143#define MUST_COALESCE_COST INT_MAX
144
145
146/* Return cost of execution of copy instruction with FREQUENCY. */
147
148static inline int
149coalesce_cost (int frequency, bool optimize_for_size)
150{
151 /* Base costs on BB frequencies bounded by 1. */
152 int cost = frequency;
153
154 if (!cost)
155 cost = 1;
156
157 if (optimize_for_size)
158 cost = 1;
159
160 return cost;
161}
162
163
164/* Return the cost of executing a copy instruction in basic block BB. */
165
166static inline int
167coalesce_cost_bb (basic_block bb)
168{
169 return coalesce_cost (frequency: bb->count.to_frequency (cfun),
170 optimize_for_size: optimize_bb_for_size_p (bb));
171}
172
173
174/* Return the cost of executing a copy instruction on edge E. */
175
176static inline int
177coalesce_cost_edge (edge e)
178{
179 int mult = 1;
180
181 /* Inserting copy on critical edge costs more than inserting it elsewhere. */
182 if (EDGE_CRITICAL_P (e))
183 mult = 2;
184 if (e->flags & EDGE_ABNORMAL)
185 return MUST_COALESCE_COST;
186 if (e->flags & EDGE_EH)
187 {
188 edge e2;
189 edge_iterator ei;
190 FOR_EACH_EDGE (e2, ei, e->dest->preds)
191 if (e2 != e)
192 {
193 /* Putting code on EH edge that leads to BB
194 with multiple predecestors imply splitting of
195 edge too. */
196 if (mult < 2)
197 mult = 2;
198 /* If there are multiple EH predecestors, we
199 also copy EH regions and produce separate
200 landing pad. This is expensive. */
201 if (e2->flags & EDGE_EH)
202 {
203 mult = 5;
204 break;
205 }
206 }
207 }
208
209 return coalesce_cost (EDGE_FREQUENCY (e),
210 optimize_for_size: optimize_edge_for_size_p (e)) * mult;
211}
212
213
214/* Retrieve a pair to coalesce from the cost_one_list in CL. Returns the
215 2 elements via P1 and P2. 1 is returned by the function if there is a pair,
216 NO_BEST_COALESCE is returned if there aren't any. */
217
218static inline int
219pop_cost_one_pair (coalesce_list *cl, int *p1, int *p2)
220{
221 cost_one_pair *ptr;
222
223 ptr = cl->cost_one_list;
224 if (!ptr)
225 return NO_BEST_COALESCE;
226
227 *p1 = ptr->first_element;
228 *p2 = ptr->second_element;
229 cl->cost_one_list = ptr->next;
230
231 return 1;
232}
233
234/* Retrieve the most expensive remaining pair to coalesce from CL. Returns the
235 2 elements via P1 and P2. Their calculated cost is returned by the function.
236 NO_BEST_COALESCE is returned if the coalesce list is empty. */
237
238static inline int
239pop_best_coalesce (coalesce_list *cl, int *p1, int *p2)
240{
241 coalesce_pair *node;
242 int ret;
243
244 if (cl->sorted == NULL)
245 return pop_cost_one_pair (cl, p1, p2);
246
247 if (cl->num_sorted == 0)
248 return pop_cost_one_pair (cl, p1, p2);
249
250 node = cl->sorted[--(cl->num_sorted)];
251 *p1 = node->first_element;
252 *p2 = node->second_element;
253 ret = node->cost;
254
255 return ret;
256}
257
258
259/* Create a new empty coalesce list object and return it. */
260
261static inline coalesce_list *
262create_coalesce_list (void)
263{
264 coalesce_list *list;
265 unsigned size = num_ssa_names * 3;
266
267 if (size < 40)
268 size = 40;
269
270 list = (coalesce_list *) xmalloc (sizeof (struct coalesce_list));
271 list->list = new coalesce_table_type (size);
272 list->sorted = NULL;
273 list->num_sorted = 0;
274 list->cost_one_list = NULL;
275 gcc_obstack_init (&list->ob);
276 return list;
277}
278
279
280/* Delete coalesce list CL. */
281
282static inline void
283delete_coalesce_list (coalesce_list *cl)
284{
285 gcc_assert (cl->cost_one_list == NULL);
286 delete cl->list;
287 cl->list = NULL;
288 free (ptr: cl->sorted);
289 gcc_assert (cl->num_sorted == 0);
290 obstack_free (&cl->ob, NULL);
291 free (ptr: cl);
292}
293
294/* Return the number of unique coalesce pairs in CL. */
295
296static inline int
297num_coalesce_pairs (coalesce_list *cl)
298{
299 return cl->list->elements ();
300}
301
302/* Find a matching coalesce pair object in CL for the pair P1 and P2. If
303 one isn't found, return NULL if CREATE is false, otherwise create a new
304 coalesce pair object and return it. */
305
306static coalesce_pair *
307find_coalesce_pair (coalesce_list *cl, int p1, int p2, bool create)
308{
309 struct coalesce_pair p;
310 coalesce_pair **slot;
311 unsigned int hash;
312
313 /* Normalize so that p1 is the smaller value. */
314 if (p2 < p1)
315 {
316 p.first_element = p2;
317 p.second_element = p1;
318 }
319 else
320 {
321 p.first_element = p1;
322 p.second_element = p2;
323 }
324
325 hash = coalesce_pair_hasher::hash (pair: &p);
326 slot = cl->list->find_slot_with_hash (comparable: &p, hash, insert: create ? INSERT : NO_INSERT);
327 if (!slot)
328 return NULL;
329
330 if (!*slot)
331 {
332 struct coalesce_pair * pair = XOBNEW (&cl->ob, struct coalesce_pair);
333 gcc_assert (cl->sorted == NULL);
334 pair->first_element = p.first_element;
335 pair->second_element = p.second_element;
336 pair->cost = 0;
337 pair->index = num_coalesce_pairs (cl);
338 pair->conflict_count = 0;
339 *slot = pair;
340 }
341
342 return (struct coalesce_pair *) *slot;
343}
344
345static inline void
346add_cost_one_coalesce (coalesce_list *cl, int p1, int p2)
347{
348 cost_one_pair *pair;
349
350 pair = XOBNEW (&cl->ob, cost_one_pair);
351 pair->first_element = p1;
352 pair->second_element = p2;
353 pair->next = cl->cost_one_list;
354 cl->cost_one_list = pair;
355}
356
357
358/* Add a coalesce between P1 and P2 in list CL with a cost of VALUE. */
359
360static inline void
361add_coalesce (coalesce_list *cl, int p1, int p2, int value)
362{
363 coalesce_pair *node;
364
365 gcc_assert (cl->sorted == NULL);
366 if (p1 == p2)
367 return;
368
369 node = find_coalesce_pair (cl, p1, p2, create: true);
370
371 /* Once the value is at least MUST_COALESCE_COST - 1, leave it that way. */
372 if (node->cost < MUST_COALESCE_COST - 1)
373 {
374 if (value < MUST_COALESCE_COST - 1)
375 node->cost += value;
376 else
377 node->cost = value;
378 }
379}
380
381/* Compute and record how many unique conflicts would exist for the
382 representative partition for each coalesce pair in CL.
383
384 CONFLICTS is the conflict graph and MAP is the current partition view. */
385
386static void
387initialize_conflict_count (coalesce_pair *p,
388 ssa_conflicts *conflicts,
389 var_map map)
390{
391 int p1 = var_to_partition (map, ssa_name (p->first_element));
392 int p2 = var_to_partition (map, ssa_name (p->second_element));
393
394 /* 4 cases. If both P1 and P2 have conflicts, then build their
395 union and count the members. Else handle the degenerate cases
396 in the obvious ways. */
397 if (conflicts->conflicts[p1] && conflicts->conflicts[p2])
398 p->conflict_count = bitmap_count_unique_bits (conflicts->conflicts[p1],
399 conflicts->conflicts[p2]);
400 else if (conflicts->conflicts[p1])
401 p->conflict_count = bitmap_count_bits (conflicts->conflicts[p1]);
402 else if (conflicts->conflicts[p2])
403 p->conflict_count = bitmap_count_bits (conflicts->conflicts[p2]);
404 else
405 p->conflict_count = 0;
406}
407
408
409/* Comparison function to allow qsort to sort P1 and P2 in Ascending order. */
410
411static int
412compare_pairs (const void *p1, const void *p2)
413{
414 coalesce_pair *const *const pp1 = (coalesce_pair *const *) p1;
415 coalesce_pair *const *const pp2 = (coalesce_pair *const *) p2;
416 int result;
417
418 result = (* pp1)->cost - (* pp2)->cost;
419 /* We use the size of the resulting conflict set as the secondary sort key.
420 Given two equal costing coalesce pairs, we want to prefer the pair that
421 has the smaller conflict set. */
422 if (result == 0)
423 {
424 if (flag_expensive_optimizations)
425 {
426 /* Lazily initialize the conflict counts as it's fairly expensive
427 to compute. */
428 if ((*pp2)->conflict_count == 0)
429 initialize_conflict_count (p: *pp2, conflicts: conflicts_, map: map_);
430 if ((*pp1)->conflict_count == 0)
431 initialize_conflict_count (p: *pp1, conflicts: conflicts_, map: map_);
432
433 result = (*pp2)->conflict_count - (*pp1)->conflict_count;
434 }
435
436 /* And if everything else is equal, then sort based on which
437 coalesce pair was found first. */
438 if (result == 0)
439 result = (*pp2)->index - (*pp1)->index;
440 }
441
442 return result;
443}
444
445/* Iterate over CL using ITER, returning values in PAIR. */
446
447#define FOR_EACH_PARTITION_PAIR(PAIR, ITER, CL) \
448 FOR_EACH_HASH_TABLE_ELEMENT (*(CL)->list, (PAIR), coalesce_pair_p, (ITER))
449
450
451/* Prepare CL for removal of preferred pairs. When finished they are sorted
452 in order from most important coalesce to least important. */
453
454static void
455sort_coalesce_list (coalesce_list *cl, ssa_conflicts *conflicts, var_map map)
456{
457 unsigned x, num;
458 coalesce_pair *p;
459 coalesce_iterator_type ppi;
460
461 gcc_assert (cl->sorted == NULL);
462
463 num = num_coalesce_pairs (cl);
464 cl->num_sorted = num;
465 if (num == 0)
466 return;
467
468 /* Allocate a vector for the pair pointers. */
469 cl->sorted = XNEWVEC (coalesce_pair *, num);
470
471 /* Populate the vector with pointers to the pairs. */
472 x = 0;
473 FOR_EACH_PARTITION_PAIR (p, ppi, cl)
474 cl->sorted[x++] = p;
475 gcc_assert (x == num);
476
477 /* Already sorted. */
478 if (num == 1)
479 return;
480
481 /* We don't want to depend on qsort_r, so we have to stuff away
482 additional data into globals so it can be referenced in
483 compare_pairs. */
484 conflicts_ = conflicts;
485 map_ = map;
486 qsort (cl->sorted, num, sizeof (coalesce_pair *), compare_pairs);
487 conflicts_ = NULL;
488 map_ = NULL;
489}
490
491
492/* Send debug info for coalesce list CL to file F. */
493
494static void
495dump_coalesce_list (FILE *f, coalesce_list *cl)
496{
497 coalesce_pair *node;
498 coalesce_iterator_type ppi;
499
500 int x;
501 tree var;
502
503 if (cl->sorted == NULL)
504 {
505 fprintf (stream: f, format: "Coalesce List:\n");
506 FOR_EACH_PARTITION_PAIR (node, ppi, cl)
507 {
508 tree var1 = ssa_name (node->first_element);
509 tree var2 = ssa_name (node->second_element);
510 print_generic_expr (f, var1, TDF_SLIM);
511 fprintf (stream: f, format: " <-> ");
512 print_generic_expr (f, var2, TDF_SLIM);
513 fprintf (stream: f, format: " (%1d, %1d), ", node->cost, node->conflict_count);
514 fprintf (stream: f, format: "\n");
515 }
516 }
517 else
518 {
519 fprintf (stream: f, format: "Sorted Coalesce list:\n");
520 for (x = cl->num_sorted - 1 ; x >=0; x--)
521 {
522 node = cl->sorted[x];
523 fprintf (stream: f, format: "(%d, %d) ", node->cost, node->conflict_count);
524 var = ssa_name (node->first_element);
525 print_generic_expr (f, var, TDF_SLIM);
526 fprintf (stream: f, format: " <-> ");
527 var = ssa_name (node->second_element);
528 print_generic_expr (f, var, TDF_SLIM);
529 fprintf (stream: f, format: "\n");
530 }
531 }
532}
533
534
535/* Return an empty new conflict graph for SIZE elements. */
536
537static inline ssa_conflicts *
538ssa_conflicts_new (unsigned size)
539{
540 ssa_conflicts *ptr;
541
542 ptr = XNEW (ssa_conflicts);
543 bitmap_obstack_initialize (&ptr->obstack);
544 ptr->conflicts.create (nelems: size);
545 ptr->conflicts.safe_grow_cleared (len: size, exact: true);
546 return ptr;
547}
548
549
550/* Free storage for conflict graph PTR. */
551
552static inline void
553ssa_conflicts_delete (ssa_conflicts *ptr)
554{
555 bitmap_obstack_release (&ptr->obstack);
556 ptr->conflicts.release ();
557 free (ptr: ptr);
558}
559
560
561/* Test if elements X and Y conflict in graph PTR. */
562
563static inline bool
564ssa_conflicts_test_p (ssa_conflicts *ptr, unsigned x, unsigned y)
565{
566 bitmap bx = ptr->conflicts[x];
567 bitmap by = ptr->conflicts[y];
568
569 gcc_checking_assert (x != y);
570
571 if (bx)
572 /* Avoid the lookup if Y has no conflicts. */
573 return by ? bitmap_bit_p (bx, y) : false;
574 else
575 return false;
576}
577
578
579/* Add a conflict with Y to the bitmap for X in graph PTR. */
580
581static inline void
582ssa_conflicts_add_one (ssa_conflicts *ptr, unsigned x, unsigned y)
583{
584 bitmap bx = ptr->conflicts[x];
585 /* If there are no conflicts yet, allocate the bitmap and set bit. */
586 if (! bx)
587 bx = ptr->conflicts[x] = BITMAP_ALLOC (obstack: &ptr->obstack);
588 bitmap_set_bit (bx, y);
589}
590
591
592/* Add conflicts between X and Y in graph PTR. */
593
594static inline void
595ssa_conflicts_add (ssa_conflicts *ptr, unsigned x, unsigned y)
596{
597 gcc_checking_assert (x != y);
598 ssa_conflicts_add_one (ptr, x, y);
599 ssa_conflicts_add_one (ptr, x: y, y: x);
600}
601
602
603/* Merge all Y's conflict into X in graph PTR. */
604
605static inline void
606ssa_conflicts_merge (ssa_conflicts *ptr, unsigned x, unsigned y)
607{
608 unsigned z;
609 bitmap_iterator bi;
610 bitmap bx = ptr->conflicts[x];
611 bitmap by = ptr->conflicts[y];
612
613 gcc_checking_assert (x != y);
614 if (! by)
615 return;
616
617 /* Add a conflict between X and every one Y has. If the bitmap doesn't
618 exist, then it has already been coalesced, and we don't need to add a
619 conflict. */
620 EXECUTE_IF_SET_IN_BITMAP (by, 0, z, bi)
621 {
622 bitmap bz = ptr->conflicts[z];
623 if (bz)
624 {
625 bool was_there = bitmap_clear_bit (bz, y);
626 gcc_checking_assert (was_there);
627 bitmap_set_bit (bz, x);
628 }
629 }
630
631 if (bx)
632 {
633 /* If X has conflicts, add Y's to X. */
634 bitmap_ior_into (bx, by);
635 BITMAP_FREE (by);
636 ptr->conflicts[y] = NULL;
637 }
638 else
639 {
640 /* If X has no conflicts, simply use Y's. */
641 ptr->conflicts[x] = by;
642 ptr->conflicts[y] = NULL;
643 }
644}
645
646
647/* Dump a conflicts graph. */
648
649static void
650ssa_conflicts_dump (FILE *file, ssa_conflicts *ptr)
651{
652 unsigned x;
653 bitmap b;
654
655 fprintf (stream: file, format: "\nConflict graph:\n");
656
657 FOR_EACH_VEC_ELT (ptr->conflicts, x, b)
658 if (b)
659 {
660 fprintf (stream: file, format: "%d: ", x);
661 dump_bitmap (file, map: b);
662 }
663}
664
665
666/* This structure is used to efficiently record the current status of live
667 SSA_NAMES when building a conflict graph.
668 LIVE_BASE_VAR has a bit set for each base variable which has at least one
669 ssa version live.
670 LIVE_BASE_PARTITIONS is an array of bitmaps using the basevar table as an
671 index, and is used to track what partitions of each base variable are
672 live. This makes it easy to add conflicts between just live partitions
673 with the same base variable.
674 The values in LIVE_BASE_PARTITIONS are only valid if the base variable is
675 marked as being live. This delays clearing of these bitmaps until
676 they are actually needed again. */
677
678class live_track
679{
680public:
681 bitmap_obstack obstack; /* A place to allocate our bitmaps. */
682 bitmap_head live_base_var; /* Indicates if a basevar is live. */
683 bitmap_head *live_base_partitions; /* Live partitions for each basevar. */
684 var_map map; /* Var_map being used for partition mapping. */
685};
686
687
688/* This routine will create a new live track structure based on the partitions
689 in MAP. */
690
691static live_track *
692new_live_track (var_map map)
693{
694 live_track *ptr;
695 int lim, x;
696
697 /* Make sure there is a partition view in place. */
698 gcc_assert (map->partition_to_base_index != NULL);
699
700 ptr = XNEW (live_track);
701 ptr->map = map;
702 lim = num_basevars (map);
703 bitmap_obstack_initialize (&ptr->obstack);
704 ptr->live_base_partitions = XNEWVEC (bitmap_head, lim);
705 bitmap_initialize (head: &ptr->live_base_var, obstack: &ptr->obstack);
706 for (x = 0; x < lim; x++)
707 bitmap_initialize (head: &ptr->live_base_partitions[x], obstack: &ptr->obstack);
708 return ptr;
709}
710
711
712/* This routine will free the memory associated with PTR. */
713
714static void
715delete_live_track (live_track *ptr)
716{
717 bitmap_obstack_release (&ptr->obstack);
718 XDELETEVEC (ptr->live_base_partitions);
719 XDELETE (ptr);
720}
721
722
723/* This function will remove PARTITION from the live list in PTR. */
724
725static inline void
726live_track_remove_partition (live_track *ptr, int partition)
727{
728 int root;
729
730 root = basevar_index (map: ptr->map, partition);
731 bitmap_clear_bit (&ptr->live_base_partitions[root], partition);
732 /* If the element list is empty, make the base variable not live either. */
733 if (bitmap_empty_p (map: &ptr->live_base_partitions[root]))
734 bitmap_clear_bit (&ptr->live_base_var, root);
735}
736
737
738/* This function will adds PARTITION to the live list in PTR. */
739
740static inline void
741live_track_add_partition (live_track *ptr, int partition)
742{
743 int root;
744
745 root = basevar_index (map: ptr->map, partition);
746 /* If this base var wasn't live before, it is now. Clear the element list
747 since it was delayed until needed. */
748 if (bitmap_set_bit (&ptr->live_base_var, root))
749 bitmap_clear (&ptr->live_base_partitions[root]);
750 bitmap_set_bit (&ptr->live_base_partitions[root], partition);
751
752}
753
754
755/* Clear the live bit for VAR in PTR. */
756
757static inline void
758live_track_clear_var (live_track *ptr, tree var)
759{
760 int p;
761
762 p = var_to_partition (map: ptr->map, var);
763 if (p != NO_PARTITION)
764 live_track_remove_partition (ptr, partition: p);
765}
766
767
768/* Return TRUE if VAR is live in PTR. */
769
770static inline bool
771live_track_live_p (live_track *ptr, tree var)
772{
773 int p, root;
774
775 p = var_to_partition (map: ptr->map, var);
776 if (p != NO_PARTITION)
777 {
778 root = basevar_index (map: ptr->map, partition: p);
779 if (bitmap_bit_p (&ptr->live_base_var, root))
780 return bitmap_bit_p (&ptr->live_base_partitions[root], p);
781 }
782 return false;
783}
784
785
786/* This routine will add USE to PTR. USE will be marked as live in both the
787 ssa live map and the live bitmap for the root of USE. */
788
789static inline void
790live_track_process_use (live_track *ptr, tree use)
791{
792 int p;
793
794 p = var_to_partition (map: ptr->map, var: use);
795 if (p == NO_PARTITION)
796 return;
797
798 /* Mark as live in the appropriate live list. */
799 live_track_add_partition (ptr, partition: p);
800}
801
802
803/* This routine will process a DEF in PTR. DEF will be removed from the live
804 lists, and if there are any other live partitions with the same base
805 variable, conflicts will be added to GRAPH. */
806
807static inline void
808live_track_process_def (live_track *ptr, tree def, ssa_conflicts *graph)
809{
810 int p, root;
811 bitmap b;
812 unsigned x;
813 bitmap_iterator bi;
814
815 p = var_to_partition (map: ptr->map, var: def);
816 if (p == NO_PARTITION)
817 return;
818
819 /* Clear the liveness bit. */
820 live_track_remove_partition (ptr, partition: p);
821
822 /* If the bitmap isn't empty now, conflicts need to be added. */
823 root = basevar_index (map: ptr->map, partition: p);
824 if (bitmap_bit_p (&ptr->live_base_var, root))
825 {
826 b = &ptr->live_base_partitions[root];
827 EXECUTE_IF_SET_IN_BITMAP (b, 0, x, bi)
828 ssa_conflicts_add (ptr: graph, x: p, y: x);
829 }
830}
831
832
833/* Initialize PTR with the partitions set in INIT. */
834
835static inline void
836live_track_init (live_track *ptr, bitmap init)
837{
838 unsigned p;
839 bitmap_iterator bi;
840
841 /* Mark all live on exit partitions. */
842 EXECUTE_IF_SET_IN_BITMAP (init, 0, p, bi)
843 live_track_add_partition (ptr, partition: p);
844}
845
846
847/* This routine will clear all live partitions in PTR. */
848
849static inline void
850live_track_clear_base_vars (live_track *ptr)
851{
852 /* Simply clear the live base list. Anything marked as live in the element
853 lists will be cleared later if/when the base variable ever comes alive
854 again. */
855 bitmap_clear (&ptr->live_base_var);
856}
857
858
859/* Build a conflict graph based on LIVEINFO. Any partitions which are in the
860 partition view of the var_map liveinfo is based on get entries in the
861 conflict graph. Only conflicts between ssa_name partitions with the same
862 base variable are added. */
863
864static ssa_conflicts *
865build_ssa_conflict_graph (tree_live_info_p liveinfo)
866{
867 ssa_conflicts *graph;
868 var_map map;
869 basic_block bb;
870 ssa_op_iter iter;
871 live_track *live;
872 basic_block entry;
873
874 /* If inter-variable coalescing is enabled, we may attempt to
875 coalesce variables from different base variables, including
876 different parameters, so we have to make sure default defs live
877 at the entry block conflict with each other. */
878 if (flag_tree_coalesce_vars)
879 entry = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
880 else
881 entry = NULL;
882
883 map = live_var_map (live: liveinfo);
884 graph = ssa_conflicts_new (size: num_var_partitions (map));
885
886 live = new_live_track (map);
887
888 for (unsigned i = 0; liveinfo->map->vec_bbs.iterate (ix: i, ptr: &bb); ++i)
889 {
890 /* Start with live on exit temporaries. */
891 live_track_init (ptr: live, init: live_on_exit (live: liveinfo, bb));
892
893 for (gimple_stmt_iterator gsi = gsi_last_bb (bb); !gsi_end_p (i: gsi);
894 gsi_prev (i: &gsi))
895 {
896 tree var;
897 gimple *stmt = gsi_stmt (i: gsi);
898
899 /* A copy between 2 partitions does not introduce an interference
900 by itself. If they did, you would never be able to coalesce
901 two things which are copied. If the two variables really do
902 conflict, they will conflict elsewhere in the program.
903
904 This is handled by simply removing the SRC of the copy from the
905 live list, and processing the stmt normally. */
906 if (is_gimple_assign (gs: stmt))
907 {
908 tree lhs = gimple_assign_lhs (gs: stmt);
909 tree rhs1 = gimple_assign_rhs1 (gs: stmt);
910 if (gimple_assign_copy_p (stmt)
911 && TREE_CODE (lhs) == SSA_NAME
912 && TREE_CODE (rhs1) == SSA_NAME)
913 live_track_clear_var (ptr: live, var: rhs1);
914 }
915 else if (is_gimple_debug (gs: stmt))
916 continue;
917
918 if (map->bitint)
919 {
920 build_bitint_stmt_ssa_conflicts (stmt, live, graph, map->bitint,
921 live_track_process_def,
922 live_track_process_use);
923 continue;
924 }
925
926 /* For stmts with more than one SSA_NAME definition pretend all the
927 SSA_NAME outputs but the first one are live at this point, so
928 that conflicts are added in between all those even when they are
929 actually not really live after the asm, because expansion might
930 copy those into pseudos after the asm and if multiple outputs
931 share the same partition, it might overwrite those that should
932 be live. E.g.
933 asm volatile (".." : "=r" (a) : "=r" (b) : "0" (a), "1" (a));
934 return a;
935 See PR70593. */
936 bool first = true;
937 FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
938 if (first)
939 first = false;
940 else
941 live_track_process_use (ptr: live, use: var);
942
943 FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
944 live_track_process_def (ptr: live, def: var, graph);
945
946 FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
947 live_track_process_use (ptr: live, use: var);
948 }
949
950 /* If result of a PHI is unused, looping over the statements will not
951 record any conflicts since the def was never live. Since the PHI node
952 is going to be translated out of SSA form, it will insert a copy.
953 There must be a conflict recorded between the result of the PHI and
954 any variables that are live. Otherwise the out-of-ssa translation
955 may create incorrect code. */
956 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (i: gsi);
957 gsi_next (i: &gsi))
958 {
959 gphi *phi = gsi.phi ();
960 tree result = PHI_RESULT (phi);
961 if (virtual_operand_p (op: result))
962 continue;
963 if (live_track_live_p (ptr: live, var: result))
964 live_track_process_def (ptr: live, def: result, graph);
965 }
966
967 /* Pretend there are defs for params' default defs at the start
968 of the (post-)entry block. This will prevent PARM_DECLs from
969 coalescing into the same partition. Although RESULT_DECLs'
970 default defs don't have a useful initial value, we have to
971 prevent them from coalescing with PARM_DECLs' default defs
972 too, otherwise assign_parms would attempt to assign different
973 RTL to the same partition. */
974 if (bb == entry)
975 {
976 unsigned i;
977 tree var;
978
979 FOR_EACH_SSA_NAME (i, var, cfun)
980 {
981 if (!SSA_NAME_IS_DEFAULT_DEF (var)
982 || !SSA_NAME_VAR (var)
983 || VAR_P (SSA_NAME_VAR (var)))
984 continue;
985
986 live_track_process_def (ptr: live, def: var, graph);
987 /* Process a use too, so that it remains live and
988 conflicts with other parms' default defs, even unused
989 ones. */
990 live_track_process_use (ptr: live, use: var);
991 }
992 }
993
994 live_track_clear_base_vars (ptr: live);
995 }
996
997 delete_live_track (ptr: live);
998 return graph;
999}
1000
1001/* Print a failure to coalesce a MUST_COALESCE pair X and Y. */
1002
1003static inline void
1004fail_abnormal_edge_coalesce (int x, int y)
1005{
1006 fprintf (stderr, format: "\nUnable to coalesce ssa_names %d and %d",x, y);
1007 fprintf (stderr, format: " which are marked as MUST COALESCE.\n");
1008 print_generic_expr (stderr, ssa_name (x), TDF_SLIM);
1009 fprintf (stderr, format: " and ");
1010 print_generic_stmt (stderr, ssa_name (y), TDF_SLIM);
1011
1012 internal_error ("SSA corruption");
1013}
1014
1015/* If VAR is an SSA_NAME associated with a PARM_DECL or a RESULT_DECL,
1016 and the DECL's default def is unused (i.e., it was introduced by
1017 create_default_def for out-of-ssa), mark VAR and the default def for
1018 coalescing. */
1019
1020static void
1021coalesce_with_default (tree var, coalesce_list *cl, bitmap used_in_copy)
1022{
1023 if (SSA_NAME_IS_DEFAULT_DEF (var)
1024 || !SSA_NAME_VAR (var)
1025 || VAR_P (SSA_NAME_VAR (var)))
1026 return;
1027
1028 tree ssa = ssa_default_def (cfun, SSA_NAME_VAR (var));
1029 if (!has_zero_uses (var: ssa))
1030 return;
1031
1032 add_cost_one_coalesce (cl, SSA_NAME_VERSION (ssa), SSA_NAME_VERSION (var));
1033 bitmap_set_bit (used_in_copy, SSA_NAME_VERSION (var));
1034 /* Default defs will have their used_in_copy bits set at the beginning of
1035 populate_coalesce_list_for_outofssa. */
1036}
1037
1038
1039/* Given var_map MAP for a region, this function creates and returns a coalesce
1040 list as well as recording related ssa names in USED_IN_COPIES for use later
1041 in the out-of-ssa or live range computation process. */
1042
1043static coalesce_list *
1044create_coalesce_list_for_region (var_map map, bitmap used_in_copy)
1045{
1046 gimple_stmt_iterator gsi;
1047 basic_block bb;
1048 coalesce_list *cl = create_coalesce_list ();
1049 gimple *stmt;
1050 int v1, v2, cost;
1051
1052 for (unsigned j = 0; map->vec_bbs.iterate (ix: j, ptr: &bb); ++j)
1053 {
1054 tree arg;
1055
1056 for (gphi_iterator gpi = gsi_start_phis (bb);
1057 !gsi_end_p (i: gpi);
1058 gsi_next (i: &gpi))
1059 {
1060 gphi *phi = gpi.phi ();
1061 size_t i;
1062 int ver;
1063 tree res;
1064 bool saw_copy = false;
1065
1066 res = gimple_phi_result (gs: phi);
1067 if (virtual_operand_p (op: res))
1068 continue;
1069 ver = SSA_NAME_VERSION (res);
1070 if (map->bitint && !bitmap_bit_p (map->bitint, ver))
1071 continue;
1072
1073 /* Register ssa_names and coalesces between the args and the result
1074 of all PHI. */
1075 for (i = 0; i < gimple_phi_num_args (gs: phi); i++)
1076 {
1077 edge e = gimple_phi_arg_edge (phi, i);
1078 arg = PHI_ARG_DEF (phi, i);
1079 if (TREE_CODE (arg) != SSA_NAME)
1080 continue;
1081
1082 if (gimple_can_coalesce_p (arg, res)
1083 || (e->flags & EDGE_ABNORMAL))
1084 {
1085 saw_copy = true;
1086 bitmap_set_bit (used_in_copy, SSA_NAME_VERSION (arg));
1087 if ((e->flags & EDGE_ABNORMAL) == 0)
1088 {
1089 int cost = coalesce_cost_edge (e);
1090 if (cost == 1 && has_single_use (var: arg))
1091 add_cost_one_coalesce (cl, p1: ver, SSA_NAME_VERSION (arg));
1092 else
1093 add_coalesce (cl, p1: ver, SSA_NAME_VERSION (arg), value: cost);
1094 }
1095 }
1096 }
1097 if (saw_copy)
1098 bitmap_set_bit (used_in_copy, ver);
1099 }
1100
1101 for (gsi = gsi_start_bb (bb); !gsi_end_p (i: gsi); gsi_next (i: &gsi))
1102 {
1103 stmt = gsi_stmt (i: gsi);
1104
1105 if (is_gimple_debug (gs: stmt))
1106 continue;
1107
1108 /* Check for copy coalesces. */
1109 switch (gimple_code (g: stmt))
1110 {
1111 case GIMPLE_ASSIGN:
1112 {
1113 tree lhs = gimple_assign_lhs (gs: stmt);
1114 tree rhs1 = gimple_assign_rhs1 (gs: stmt);
1115 if (gimple_assign_ssa_name_copy_p (stmt)
1116 && gimple_can_coalesce_p (lhs, rhs1))
1117 {
1118 v1 = SSA_NAME_VERSION (lhs);
1119 v2 = SSA_NAME_VERSION (rhs1);
1120 if (map->bitint && !bitmap_bit_p (map->bitint, v1))
1121 break;
1122 cost = coalesce_cost_bb (bb);
1123 add_coalesce (cl, p1: v1, p2: v2, value: cost);
1124 bitmap_set_bit (used_in_copy, v1);
1125 bitmap_set_bit (used_in_copy, v2);
1126 }
1127 }
1128 break;
1129
1130 case GIMPLE_RETURN:
1131 {
1132 tree res = DECL_RESULT (current_function_decl);
1133 if (VOID_TYPE_P (TREE_TYPE (res))
1134 || !is_gimple_reg (res))
1135 break;
1136 tree rhs1 = gimple_return_retval (gs: as_a <greturn *> (p: stmt));
1137 if (!rhs1)
1138 break;
1139 tree lhs = ssa_default_def (cfun, res);
1140 if (map->bitint && !lhs)
1141 break;
1142 gcc_assert (lhs);
1143 if (TREE_CODE (rhs1) == SSA_NAME
1144 && gimple_can_coalesce_p (lhs, rhs1))
1145 {
1146 v1 = SSA_NAME_VERSION (lhs);
1147 v2 = SSA_NAME_VERSION (rhs1);
1148 if (map->bitint && !bitmap_bit_p (map->bitint, v1))
1149 break;
1150 cost = coalesce_cost_bb (bb);
1151 add_coalesce (cl, p1: v1, p2: v2, value: cost);
1152 bitmap_set_bit (used_in_copy, v1);
1153 bitmap_set_bit (used_in_copy, v2);
1154 }
1155 break;
1156 }
1157
1158 case GIMPLE_ASM:
1159 {
1160 gasm *asm_stmt = as_a <gasm *> (p: stmt);
1161 unsigned long noutputs, i;
1162 unsigned long ninputs;
1163 tree *outputs, link;
1164 noutputs = gimple_asm_noutputs (asm_stmt);
1165 ninputs = gimple_asm_ninputs (asm_stmt);
1166 outputs = (tree *) alloca (noutputs * sizeof (tree));
1167 for (i = 0; i < noutputs; ++i)
1168 {
1169 link = gimple_asm_output_op (asm_stmt, index: i);
1170 outputs[i] = TREE_VALUE (link);
1171 }
1172
1173 for (i = 0; i < ninputs; ++i)
1174 {
1175 const char *constraint;
1176 tree input;
1177 char *end;
1178 unsigned long match;
1179
1180 link = gimple_asm_input_op (asm_stmt, index: i);
1181 constraint
1182 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1183 input = TREE_VALUE (link);
1184
1185 if (TREE_CODE (input) != SSA_NAME)
1186 continue;
1187
1188 match = strtoul (nptr: constraint, endptr: &end, base: 10);
1189 if (match >= noutputs || end == constraint)
1190 continue;
1191
1192 if (TREE_CODE (outputs[match]) != SSA_NAME)
1193 continue;
1194
1195 v1 = SSA_NAME_VERSION (outputs[match]);
1196 v2 = SSA_NAME_VERSION (input);
1197 if (map->bitint && !bitmap_bit_p (map->bitint, v1))
1198 continue;
1199
1200 if (gimple_can_coalesce_p (outputs[match], input))
1201 {
1202 cost = coalesce_cost (REG_BR_PROB_BASE,
1203 optimize_for_size: optimize_bb_for_size_p (bb));
1204 add_coalesce (cl, p1: v1, p2: v2, value: cost);
1205 bitmap_set_bit (used_in_copy, v1);
1206 bitmap_set_bit (used_in_copy, v2);
1207 }
1208 }
1209 break;
1210 }
1211
1212 default:
1213 break;
1214 }
1215 }
1216 }
1217
1218 return cl;
1219}
1220
1221
1222/* Hashtable support for storing SSA names hashed by their SSA_NAME_VAR. */
1223
1224struct ssa_name_var_hash : nofree_ptr_hash <tree_node>
1225{
1226 static inline hashval_t hash (const tree_node *);
1227 static inline int equal (const tree_node *, const tree_node *);
1228};
1229
1230inline hashval_t
1231ssa_name_var_hash::hash (const_tree n)
1232{
1233 return DECL_UID (SSA_NAME_VAR (n));
1234}
1235
1236inline int
1237ssa_name_var_hash::equal (const tree_node *n1, const tree_node *n2)
1238{
1239 return SSA_NAME_VAR (n1) == SSA_NAME_VAR (n2);
1240}
1241
1242
1243/* This function populates coalesce list CL as well as recording related ssa
1244 names in USED_IN_COPIES for use later in the out-of-ssa process. */
1245
1246static void
1247populate_coalesce_list_for_outofssa (coalesce_list *cl, bitmap used_in_copy)
1248{
1249 tree var;
1250 tree first;
1251 int v1, v2, cost;
1252 unsigned i;
1253
1254 /* Process result decls and live on entry variables for entry into the
1255 coalesce list. */
1256 first = NULL_TREE;
1257 FOR_EACH_SSA_NAME (i, var, cfun)
1258 {
1259 if (!virtual_operand_p (op: var))
1260 {
1261 coalesce_with_default (var, cl, used_in_copy);
1262
1263 /* Add coalesces between all the result decls. */
1264 if (SSA_NAME_VAR (var)
1265 && TREE_CODE (SSA_NAME_VAR (var)) == RESULT_DECL)
1266 {
1267 bitmap_set_bit (used_in_copy, SSA_NAME_VERSION (var));
1268 if (first == NULL_TREE)
1269 first = var;
1270 else
1271 {
1272 gcc_assert (gimple_can_coalesce_p (var, first));
1273 v1 = SSA_NAME_VERSION (first);
1274 v2 = SSA_NAME_VERSION (var);
1275 cost = coalesce_cost_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
1276 add_coalesce (cl, p1: v1, p2: v2, value: cost);
1277 }
1278 }
1279 /* Mark any default_def variables as being in the coalesce list
1280 since they will have to be coalesced with the base variable. If
1281 not marked as present, they won't be in the coalesce view. */
1282 if (SSA_NAME_IS_DEFAULT_DEF (var)
1283 && (!has_zero_uses (var)
1284 || (SSA_NAME_VAR (var)
1285 && !VAR_P (SSA_NAME_VAR (var)))))
1286 bitmap_set_bit (used_in_copy, SSA_NAME_VERSION (var));
1287 }
1288 }
1289
1290 /* If this optimization is disabled, we need to coalesce all the
1291 names originating from the same SSA_NAME_VAR so debug info
1292 remains undisturbed. */
1293 if (!flag_tree_coalesce_vars)
1294 {
1295 tree a;
1296 hash_table<ssa_name_var_hash> ssa_name_hash (10);
1297
1298 FOR_EACH_SSA_NAME (i, a, cfun)
1299 {
1300 if (SSA_NAME_VAR (a)
1301 && !DECL_IGNORED_P (SSA_NAME_VAR (a))
1302 && (!has_zero_uses (var: a) || !SSA_NAME_IS_DEFAULT_DEF (a)
1303 || !VAR_P (SSA_NAME_VAR (a))))
1304 {
1305 tree *slot = ssa_name_hash.find_slot (value: a, insert: INSERT);
1306
1307 if (!*slot)
1308 *slot = a;
1309 else
1310 {
1311 /* If the variable is a PARM_DECL or a RESULT_DECL, we
1312 _require_ that all the names originating from it be
1313 coalesced, because there must be a single partition
1314 containing all the names so that it can be assigned
1315 the canonical RTL location of the DECL safely.
1316 If in_lto_p, a function could have been compiled
1317 originally with optimizations and only the link
1318 performed at -O0, so we can't actually require it. */
1319 const int cost
1320 = (VAR_P (SSA_NAME_VAR (a)) || in_lto_p)
1321 ? MUST_COALESCE_COST - 1 : MUST_COALESCE_COST;
1322 add_coalesce (cl, SSA_NAME_VERSION (a),
1323 SSA_NAME_VERSION (*slot), value: cost);
1324 bitmap_set_bit (used_in_copy, SSA_NAME_VERSION (a));
1325 bitmap_set_bit (used_in_copy, SSA_NAME_VERSION (*slot));
1326 }
1327 }
1328 }
1329 }
1330}
1331
1332
1333/* Attempt to coalesce ssa versions X and Y together using the partition
1334 mapping in MAP and checking conflicts in GRAPH. Output any debug info to
1335 DEBUG, if it is nun-NULL. */
1336
1337static inline bool
1338attempt_coalesce (var_map map, ssa_conflicts *graph, int x, int y,
1339 FILE *debug)
1340{
1341 int z;
1342 tree var1, var2;
1343 int p1, p2;
1344
1345 p1 = var_to_partition (map, ssa_name (x));
1346 p2 = var_to_partition (map, ssa_name (y));
1347
1348 if (debug)
1349 {
1350 fprintf (stream: debug, format: "(%d)", x);
1351 print_generic_expr (debug, partition_to_var (map, i: p1), TDF_SLIM);
1352 fprintf (stream: debug, format: " & (%d)", y);
1353 print_generic_expr (debug, partition_to_var (map, i: p2), TDF_SLIM);
1354 }
1355
1356 if (p1 == p2)
1357 {
1358 if (debug)
1359 fprintf (stream: debug, format: ": Already Coalesced.\n");
1360 return true;
1361 }
1362
1363 if (debug)
1364 fprintf (stream: debug, format: " [map: %d, %d] ", p1, p2);
1365
1366
1367 if (!ssa_conflicts_test_p (ptr: graph, x: p1, y: p2))
1368 {
1369 var1 = partition_to_var (map, i: p1);
1370 var2 = partition_to_var (map, i: p2);
1371
1372 z = var_union (map, var1, var2);
1373 if (z == NO_PARTITION)
1374 {
1375 if (debug)
1376 fprintf (stream: debug, format: ": Unable to perform partition union.\n");
1377 return false;
1378 }
1379
1380 /* z is the new combined partition. Remove the other partition from
1381 the list, and merge the conflicts. */
1382 if (z == p1)
1383 ssa_conflicts_merge (ptr: graph, x: p1, y: p2);
1384 else
1385 ssa_conflicts_merge (ptr: graph, x: p2, y: p1);
1386
1387 if (debug)
1388 fprintf (stream: debug, format: ": Success -> %d\n", z);
1389
1390 return true;
1391 }
1392
1393 if (debug)
1394 fprintf (stream: debug, format: ": Fail due to conflict\n");
1395
1396 return false;
1397}
1398
1399
1400/* Attempt to Coalesce partitions in MAP which occur in the list CL using
1401 GRAPH. Debug output is sent to DEBUG if it is non-NULL. */
1402
1403static void
1404coalesce_partitions (var_map map, ssa_conflicts *graph, coalesce_list *cl,
1405 FILE *debug)
1406{
1407 int x = 0, y = 0;
1408 tree var1, var2;
1409 int cost;
1410 basic_block bb;
1411 edge e;
1412 edge_iterator ei;
1413
1414 /* First, coalesce all the copies across abnormal edges. These are not placed
1415 in the coalesce list because they do not need to be sorted, and simply
1416 consume extra memory/compilation time in large programs. */
1417
1418 FOR_EACH_BB_FN (bb, cfun)
1419 {
1420 FOR_EACH_EDGE (e, ei, bb->preds)
1421 if (e->flags & EDGE_ABNORMAL)
1422 {
1423 gphi_iterator gsi;
1424 for (gsi = gsi_start_phis (bb); !gsi_end_p (i: gsi);
1425 gsi_next (i: &gsi))
1426 {
1427 gphi *phi = gsi.phi ();
1428 tree res = PHI_RESULT (phi);
1429 if (virtual_operand_p (op: res))
1430 continue;
1431 tree arg = PHI_ARG_DEF (phi, e->dest_idx);
1432 if (SSA_NAME_IS_DEFAULT_DEF (arg)
1433 && (!SSA_NAME_VAR (arg)
1434 || TREE_CODE (SSA_NAME_VAR (arg)) != PARM_DECL))
1435 continue;
1436
1437 int v1 = SSA_NAME_VERSION (res);
1438 int v2 = SSA_NAME_VERSION (arg);
1439
1440 if (debug)
1441 fprintf (stream: debug, format: "Abnormal coalesce: ");
1442
1443 if (!attempt_coalesce (map, graph, x: v1, y: v2, debug))
1444 fail_abnormal_edge_coalesce (x: v1, y: v2);
1445 }
1446 }
1447 }
1448
1449 /* Now process the items in the coalesce list. */
1450
1451 while ((cost = pop_best_coalesce (cl, p1: &x, p2: &y)) != NO_BEST_COALESCE)
1452 {
1453 var1 = ssa_name (x);
1454 var2 = ssa_name (y);
1455
1456 /* Assert the coalesces have the same base variable. */
1457 gcc_assert (gimple_can_coalesce_p (var1, var2));
1458
1459 if (debug)
1460 fprintf (stream: debug, format: "Coalesce list: ");
1461 attempt_coalesce (map, graph, x, y, debug);
1462 }
1463}
1464
1465
1466/* Output partition map MAP with coalescing plan PART to file F. */
1467
1468void
1469dump_part_var_map (FILE *f, partition part, var_map map)
1470{
1471 int t;
1472 unsigned x, y;
1473 int p;
1474
1475 fprintf (stream: f, format: "\nCoalescible Partition map \n\n");
1476
1477 for (x = 0; x < map->num_partitions; x++)
1478 {
1479 if (map->view_to_partition != NULL)
1480 p = map->view_to_partition[x];
1481 else
1482 p = x;
1483
1484 if (ssa_name (p) == NULL_TREE
1485 || virtual_operand_p (ssa_name (p)))
1486 continue;
1487
1488 t = 0;
1489 for (y = 1; y < num_ssa_names; y++)
1490 {
1491 tree var = version_to_var (map, version: y);
1492 if (!var)
1493 continue;
1494 int q = var_to_partition (map, var);
1495 p = partition_find (part, q);
1496 gcc_assert (map->partition_to_base_index[q]
1497 == map->partition_to_base_index[p]);
1498
1499 if (p == (int)x)
1500 {
1501 if (t++ == 0)
1502 {
1503 fprintf (stream: f, format: "Partition %d, base %d (", x,
1504 map->partition_to_base_index[q]);
1505 print_generic_expr (f, partition_to_var (map, i: q), TDF_SLIM);
1506 fprintf (stream: f, format: " - ");
1507 }
1508 fprintf (stream: f, format: "%d ", y);
1509 }
1510 }
1511 if (t != 0)
1512 fprintf (stream: f, format: ")\n");
1513 }
1514 fprintf (stream: f, format: "\n");
1515}
1516
1517/* Given SSA_NAMEs NAME1 and NAME2, return true if they are candidates for
1518 coalescing together, false otherwise.
1519
1520 This must stay consistent with compute_samebase_partition_bases and
1521 compute_optimized_partition_bases. */
1522
1523bool
1524gimple_can_coalesce_p (tree name1, tree name2)
1525{
1526 /* First check the SSA_NAME's associated DECL. Without
1527 optimization, we only want to coalesce if they have the same DECL
1528 or both have no associated DECL. */
1529 tree var1 = SSA_NAME_VAR (name1);
1530 tree var2 = SSA_NAME_VAR (name2);
1531 var1 = (var1 && (!VAR_P (var1) || !DECL_IGNORED_P (var1))) ? var1 : NULL_TREE;
1532 var2 = (var2 && (!VAR_P (var2) || !DECL_IGNORED_P (var2))) ? var2 : NULL_TREE;
1533 if (var1 != var2 && !flag_tree_coalesce_vars)
1534 return false;
1535
1536 /* Now check the types. If the types are the same, then we should
1537 try to coalesce V1 and V2. */
1538 tree t1 = TREE_TYPE (name1);
1539 tree t2 = TREE_TYPE (name2);
1540 if (t1 == t2)
1541 {
1542 check_modes:
1543 /* If the base variables are the same, we're good: none of the
1544 other tests below could possibly fail. */
1545 var1 = SSA_NAME_VAR (name1);
1546 var2 = SSA_NAME_VAR (name2);
1547 if (var1 == var2)
1548 return true;
1549
1550 /* We don't want to coalesce two SSA names if one of the base
1551 variables is supposed to be a register while the other is
1552 supposed to be on the stack. Anonymous SSA names most often
1553 take registers, but when not optimizing, user variables
1554 should go on the stack, so coalescing them with the anonymous
1555 variable as the partition leader would end up assigning the
1556 user variable to a register. Don't do that! */
1557 bool reg1 = use_register_for_decl (name1);
1558 bool reg2 = use_register_for_decl (name2);
1559 if (reg1 != reg2)
1560 return false;
1561
1562 /* Check that the promoted modes and unsignedness are the same.
1563 We don't want to coalesce if the promoted modes would be
1564 different, or if they would sign-extend differently. Only
1565 PARM_DECLs and RESULT_DECLs have different promotion rules,
1566 so skip the test if both are variables, or both are anonymous
1567 SSA_NAMEs. */
1568 int unsigned1, unsigned2;
1569 return ((!var1 || VAR_P (var1)) && (!var2 || VAR_P (var2)))
1570 || ((promote_ssa_mode (name1, &unsigned1)
1571 == promote_ssa_mode (name2, &unsigned2))
1572 && unsigned1 == unsigned2);
1573 }
1574
1575 /* If alignment requirements are different, we can't coalesce. */
1576 if (MINIMUM_ALIGNMENT (t1,
1577 var1 ? DECL_MODE (var1) : TYPE_MODE (t1),
1578 var1 ? LOCAL_DECL_ALIGNMENT (var1) : TYPE_ALIGN (t1))
1579 != MINIMUM_ALIGNMENT (t2,
1580 var2 ? DECL_MODE (var2) : TYPE_MODE (t2),
1581 var2 ? LOCAL_DECL_ALIGNMENT (var2) : TYPE_ALIGN (t2)))
1582 return false;
1583
1584 /* If the types are not the same, see whether they are compatible. This
1585 (for example) allows coalescing when the types are fundamentally the
1586 same, but just have different names. */
1587 if (types_compatible_p (type1: t1, type2: t2))
1588 goto check_modes;
1589
1590 return false;
1591}
1592
1593/* Fill in MAP's partition_to_base_index, with one index for each
1594 partition of SSA names USED_IN_COPIES and related by CL coalesce
1595 possibilities. This must match gimple_can_coalesce_p in the
1596 optimized case. */
1597
1598static void
1599compute_optimized_partition_bases (var_map map, bitmap used_in_copies,
1600 coalesce_list *cl)
1601{
1602 int parts = num_var_partitions (map);
1603 partition tentative = partition_new (parts);
1604
1605 /* Partition the SSA versions so that, for each coalescible
1606 pair, both of its members are in the same partition in
1607 TENTATIVE. */
1608 gcc_assert (!cl->sorted);
1609 coalesce_pair *node;
1610 coalesce_iterator_type ppi;
1611 FOR_EACH_PARTITION_PAIR (node, ppi, cl)
1612 {
1613 tree v1 = ssa_name (node->first_element);
1614 int p1 = partition_find (tentative, var_to_partition (map, v1));
1615 tree v2 = ssa_name (node->second_element);
1616 int p2 = partition_find (tentative, var_to_partition (map, v2));
1617
1618 if (p1 == p2)
1619 continue;
1620
1621 partition_union (tentative, p1, p2);
1622 }
1623
1624 /* We have to deal with cost one pairs too. */
1625 for (cost_one_pair *co = cl->cost_one_list; co; co = co->next)
1626 {
1627 tree v1 = ssa_name (co->first_element);
1628 int p1 = partition_find (tentative, var_to_partition (map, v1));
1629 tree v2 = ssa_name (co->second_element);
1630 int p2 = partition_find (tentative, var_to_partition (map, v2));
1631
1632 if (p1 == p2)
1633 continue;
1634
1635 partition_union (tentative, p1, p2);
1636 }
1637
1638 /* And also with abnormal edges. */
1639 basic_block bb;
1640 edge e;
1641 unsigned i;
1642 edge_iterator ei;
1643 for (i = 0; map->vec_bbs.iterate (ix: i, ptr: &bb); ++i)
1644 {
1645 FOR_EACH_EDGE (e, ei, bb->preds)
1646 if (e->flags & EDGE_ABNORMAL)
1647 {
1648 gphi_iterator gsi;
1649 for (gsi = gsi_start_phis (bb); !gsi_end_p (i: gsi);
1650 gsi_next (i: &gsi))
1651 {
1652 gphi *phi = gsi.phi ();
1653 tree res = PHI_RESULT (phi);
1654 if (virtual_operand_p (op: res))
1655 continue;
1656 tree arg = PHI_ARG_DEF (phi, e->dest_idx);
1657 if (SSA_NAME_IS_DEFAULT_DEF (arg)
1658 && (!SSA_NAME_VAR (arg)
1659 || TREE_CODE (SSA_NAME_VAR (arg)) != PARM_DECL))
1660 continue;
1661
1662 int p1 = partition_find (tentative, var_to_partition (map, res));
1663 int p2 = partition_find (tentative, var_to_partition (map, arg));
1664
1665 if (p1 == p2)
1666 continue;
1667
1668 partition_union (tentative, p1, p2);
1669 }
1670 }
1671 }
1672
1673 if (map->bitint
1674 && flag_tree_coalesce_vars
1675 && (optimize > 1 || parts < 500))
1676 for (i = 0; i < (unsigned) parts; ++i)
1677 {
1678 tree s1 = partition_to_var (map, i);
1679 int p1 = partition_find (tentative, i);
1680 for (unsigned j = i + 1; j < (unsigned) parts; ++j)
1681 {
1682 tree s2 = partition_to_var (map, i: j);
1683 if (s1 == s2)
1684 continue;
1685 if (tree_int_cst_equal (TYPE_SIZE (TREE_TYPE (s1)),
1686 TYPE_SIZE (TREE_TYPE (s2))))
1687 {
1688 int p2 = partition_find (tentative, j);
1689
1690 if (p1 == p2)
1691 continue;
1692
1693 partition_union (tentative, p1, p2);
1694 if (partition_find (tentative, i) != p1)
1695 break;
1696 }
1697 }
1698 }
1699
1700 map->partition_to_base_index = XCNEWVEC (int, parts);
1701 auto_vec<unsigned int> index_map (parts);
1702 if (parts)
1703 index_map.quick_grow (len: parts);
1704
1705 const unsigned no_part = -1;
1706 unsigned count = parts;
1707 while (count)
1708 index_map[--count] = no_part;
1709
1710 /* Initialize MAP's mapping from partition to base index, using
1711 as base indices an enumeration of the TENTATIVE partitions in
1712 which each SSA version ended up, so that we compute conflicts
1713 between all SSA versions that ended up in the same potential
1714 coalesce partition. */
1715 bitmap_iterator bi;
1716 EXECUTE_IF_SET_IN_BITMAP (used_in_copies, 0, i, bi)
1717 {
1718 int pidx = var_to_partition (map, ssa_name (i));
1719 int base = partition_find (tentative, pidx);
1720 if (index_map[base] != no_part)
1721 continue;
1722 index_map[base] = count++;
1723 }
1724
1725 map->num_basevars = count;
1726
1727 EXECUTE_IF_SET_IN_BITMAP (used_in_copies, 0, i, bi)
1728 {
1729 int pidx = var_to_partition (map, ssa_name (i));
1730 int base = partition_find (tentative, pidx);
1731 gcc_assert (index_map[base] < count);
1732 map->partition_to_base_index[pidx] = index_map[base];
1733 }
1734
1735 if (dump_file && (dump_flags & TDF_DETAILS))
1736 dump_part_var_map (f: dump_file, part: tentative, map);
1737
1738 partition_delete (tentative);
1739}
1740
1741/* For the bitint lowering pass, try harder. Partitions which contain
1742 SSA_NAME default def of a PARM_DECL or have RESULT_DECL need to have
1743 compatible types because they will use that RESULT_DECL or PARM_DECL.
1744 Other partitions can have even incompatible _BitInt types, as long
1745 as they have the same size - those will use VAR_DECLs which are just
1746 arrays of the limbs. */
1747
1748static void
1749coalesce_bitint (var_map map, ssa_conflicts *graph)
1750{
1751 unsigned n = num_var_partitions (map);
1752 if (optimize <= 1 && n > 500)
1753 return;
1754
1755 bool try_same_size = false;
1756 FILE *debug_file = (dump_flags & TDF_DETAILS) ? dump_file : NULL;
1757 for (unsigned i = 0; i < n; ++i)
1758 {
1759 tree s1 = partition_to_var (map, i);
1760 if ((unsigned) var_to_partition (map, var: s1) != i)
1761 continue;
1762 int v1 = SSA_NAME_VERSION (s1);
1763 for (unsigned j = i + 1; j < n; ++j)
1764 {
1765 tree s2 = partition_to_var (map, i: j);
1766 if (s1 == s2 || (unsigned) var_to_partition (map, var: s2) != j)
1767 continue;
1768 if (!types_compatible_p (TREE_TYPE (s1), TREE_TYPE (s2)))
1769 {
1770 if (!try_same_size
1771 && tree_int_cst_equal (TYPE_SIZE (TREE_TYPE (s1)),
1772 TYPE_SIZE (TREE_TYPE (s2))))
1773 try_same_size = true;
1774 continue;
1775 }
1776 int v2 = SSA_NAME_VERSION (s2);
1777 if (attempt_coalesce (map, graph, x: v1, y: v2, debug: debug_file)
1778 && partition_to_var (map, i) != s1)
1779 break;
1780 }
1781 }
1782
1783 if (!try_same_size)
1784 return;
1785
1786 unsigned i;
1787 bitmap_iterator bi;
1788 bitmap same_type = NULL;
1789
1790 EXECUTE_IF_SET_IN_BITMAP (map->bitint, 0, i, bi)
1791 {
1792 tree s = ssa_name (i);
1793 if (!SSA_NAME_VAR (s))
1794 continue;
1795 if (TREE_CODE (SSA_NAME_VAR (s)) != RESULT_DECL
1796 && (TREE_CODE (SSA_NAME_VAR (s)) != PARM_DECL
1797 || !SSA_NAME_IS_DEFAULT_DEF (s)))
1798 continue;
1799 if (same_type == NULL)
1800 same_type = BITMAP_ALLOC (NULL);
1801 int p = var_to_partition (map, var: s);
1802 bitmap_set_bit (same_type, p);
1803 }
1804
1805 for (i = 0; i < n; ++i)
1806 {
1807 if (same_type && bitmap_bit_p (same_type, i))
1808 continue;
1809 tree s1 = partition_to_var (map, i);
1810 if ((unsigned) var_to_partition (map, var: s1) != i)
1811 continue;
1812 int v1 = SSA_NAME_VERSION (s1);
1813 for (unsigned j = i + 1; j < n; ++j)
1814 {
1815 if (same_type && bitmap_bit_p (same_type, j))
1816 continue;
1817
1818 tree s2 = partition_to_var (map, i: j);
1819 if (s1 == s2 || (unsigned) var_to_partition (map, var: s2) != j)
1820 continue;
1821
1822 if (!tree_int_cst_equal (TYPE_SIZE (TREE_TYPE (s1)),
1823 TYPE_SIZE (TREE_TYPE (s2))))
1824 continue;
1825
1826 int v2 = SSA_NAME_VERSION (s2);
1827 if (attempt_coalesce (map, graph, x: v1, y: v2, debug: debug_file)
1828 && partition_to_var (map, i) != s1)
1829 break;
1830 }
1831 }
1832
1833 BITMAP_FREE (same_type);
1834}
1835
1836/* Given an initial var_map MAP, coalesce variables and return a partition map
1837 with the resulting coalesce. Note that this function is called in either
1838 live range computation context or out-of-ssa context, indicated by MAP. */
1839
1840extern void
1841coalesce_ssa_name (var_map map)
1842{
1843 tree_live_info_p liveinfo;
1844 ssa_conflicts *graph;
1845 coalesce_list *cl;
1846 auto_bitmap used_in_copies;
1847
1848 bitmap_tree_view (used_in_copies);
1849 cl = create_coalesce_list_for_region (map, used_in_copy: used_in_copies);
1850 if (map->outofssa_p)
1851 populate_coalesce_list_for_outofssa (cl, used_in_copy: used_in_copies);
1852 bitmap_list_view (used_in_copies);
1853 if (map->bitint)
1854 bitmap_ior_into (used_in_copies, map->bitint);
1855
1856 if (dump_file && (dump_flags & TDF_DETAILS))
1857 dump_var_map (dump_file, map);
1858
1859 partition_view_bitmap (map, used_in_copies);
1860
1861 compute_optimized_partition_bases (map, used_in_copies, cl);
1862
1863 if (num_var_partitions (map) < 1)
1864 {
1865 delete_coalesce_list (cl);
1866 return;
1867 }
1868
1869 if (dump_file && (dump_flags & TDF_DETAILS))
1870 dump_var_map (dump_file, map);
1871
1872 liveinfo = calculate_live_ranges (map, false);
1873
1874 if (dump_file && (dump_flags & TDF_DETAILS))
1875 dump_live_info (dump_file, liveinfo, LIVEDUMP_ENTRY);
1876
1877 /* Build a conflict graph. */
1878 graph = build_ssa_conflict_graph (liveinfo);
1879 delete_tree_live_info (liveinfo);
1880 if (dump_file && (dump_flags & TDF_DETAILS))
1881 ssa_conflicts_dump (file: dump_file, ptr: graph);
1882
1883 sort_coalesce_list (cl, conflicts: graph, map);
1884
1885 if (dump_file && (dump_flags & TDF_DETAILS))
1886 {
1887 fprintf (stream: dump_file, format: "\nAfter sorting:\n");
1888 dump_coalesce_list (f: dump_file, cl);
1889 }
1890
1891 /* First, coalesce all live on entry variables to their base variable.
1892 This will ensure the first use is coming from the correct location. */
1893
1894 if (dump_file && (dump_flags & TDF_DETAILS))
1895 dump_var_map (dump_file, map);
1896
1897 /* Now coalesce everything in the list. */
1898 coalesce_partitions (map, graph, cl,
1899 debug: ((dump_flags & TDF_DETAILS) ? dump_file : NULL));
1900
1901 delete_coalesce_list (cl);
1902
1903 if (map->bitint && flag_tree_coalesce_vars)
1904 coalesce_bitint (map, graph);
1905
1906 ssa_conflicts_delete (ptr: graph);
1907}
1908

source code of gcc/tree-ssa-coalesce.cc