1 /* Integrated Register Allocator. Changing code and generating moves.
2 Copyright (C) 2006-2016 Free Software Foundation, Inc.
3 Contributed by Vladimir Makarov <vmakarov@redhat.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* When we have more one region, we need to change the original RTL
22 code after coloring. Let us consider two allocnos representing the
23 same pseudo-register outside and inside a region respectively.
24 They can get different hard-registers. The reload pass works on
25 pseudo registers basis and there is no way to say the reload that
26 pseudo could be in different registers and it is even more
27 difficult to say in what places of the code the pseudo should have
28 particular hard-registers. So in this case IRA has to create and
29 use a new pseudo-register inside the region and adds code to move
30 allocno values on the region's borders. This is done by the code
33 The code makes top-down traversal of the regions and generate new
34 pseudos and the move code on the region borders. In some
35 complicated cases IRA can create a new pseudo used temporarily to
36 move allocno values when a swap of values stored in two
37 hard-registers is needed (e.g. two allocnos representing different
38 pseudos outside region got respectively hard registers 1 and 2 and
39 the corresponding allocnos inside the region got respectively hard
40 registers 2 and 1). At this stage, the new pseudo is marked as
43 IRA still creates the pseudo-register and the moves on the region
44 borders even when the both corresponding allocnos were assigned to
45 the same hard-register. It is done because, if the reload pass for
46 some reason spills a pseudo-register representing the original
47 pseudo outside or inside the region, the effect will be smaller
48 because another pseudo will still be in the hard-register. In most
49 cases, this is better then spilling the original pseudo in its
50 whole live-range. If reload does not change the allocation for the
51 two pseudo-registers, the trivial move will be removed by
52 post-reload optimizations.
54 IRA does not generate a new pseudo and moves for the allocno values
55 if the both allocnos representing an original pseudo inside and
56 outside region assigned to the same hard register when the register
57 pressure in the region for the corresponding pressure class is less
58 than number of available hard registers for given pressure class.
60 IRA also does some optimizations to remove redundant moves which is
61 transformed into stores by the reload pass on CFG edges
62 representing exits from the region.
64 IRA tries to reduce duplication of code generated on CFG edges
65 which are enters and exits to/from regions by moving some code to
66 the edge sources or destinations when it is possible. */
70 #include "coretypes.h"
76 #include "insn-config.h"
87 /* Data used to emit live range split insns and to flattening IR. */
88 ira_emit_data_t ira_allocno_emit_data
;
90 /* Definitions for vectors of pointers. */
93 /* Pointers to data allocated for allocnos being created during
94 emitting. Usually there are quite few such allocnos because they
95 are created only for resolving loop in register shuffling. */
96 static vec
<void_p
> new_allocno_emit_data_vec
;
98 /* Allocate and initiate the emit data. */
100 ira_initiate_emit_data (void)
103 ira_allocno_iterator ai
;
105 ira_allocno_emit_data
106 = (ira_emit_data_t
) ira_allocate (ira_allocnos_num
107 * sizeof (struct ira_emit_data
));
108 memset (ira_allocno_emit_data
, 0,
109 ira_allocnos_num
* sizeof (struct ira_emit_data
));
110 FOR_EACH_ALLOCNO (a
, ai
)
111 ALLOCNO_ADD_DATA (a
) = ira_allocno_emit_data
+ ALLOCNO_NUM (a
);
112 new_allocno_emit_data_vec
.create (50);
116 /* Free the emit data. */
118 ira_finish_emit_data (void)
122 ira_allocno_iterator ai
;
124 ira_free (ira_allocno_emit_data
);
125 FOR_EACH_ALLOCNO (a
, ai
)
126 ALLOCNO_ADD_DATA (a
) = NULL
;
127 for (;new_allocno_emit_data_vec
.length () != 0;)
129 p
= new_allocno_emit_data_vec
.pop ();
132 new_allocno_emit_data_vec
.release ();
135 /* Create and return a new allocno with given REGNO and
136 LOOP_TREE_NODE. Allocate emit data for it. */
138 create_new_allocno (int regno
, ira_loop_tree_node_t loop_tree_node
)
142 a
= ira_create_allocno (regno
, false, loop_tree_node
);
143 ALLOCNO_ADD_DATA (a
) = ira_allocate (sizeof (struct ira_emit_data
));
144 memset (ALLOCNO_ADD_DATA (a
), 0, sizeof (struct ira_emit_data
));
145 new_allocno_emit_data_vec
.safe_push (ALLOCNO_ADD_DATA (a
));
151 /* See comments below. */
152 typedef struct move
*move_t
;
154 /* The structure represents an allocno move. Both allocnos have the
155 same original regno but different allocation. */
158 /* The allocnos involved in the move. */
159 ira_allocno_t from
, to
;
160 /* The next move in the move sequence. */
162 /* Used for finding dependencies. */
164 /* The size of the following array. */
166 /* Moves on which given move depends on. Dependency can be cyclic.
167 It means we need a temporary to generates the moves. Sequence
168 A1->A2, B1->B2 where A1 and B2 are assigned to reg R1 and A2 and
169 B1 are assigned to reg R2 is an example of the cyclic
172 /* First insn generated for the move. */
176 /* Array of moves (indexed by BB index) which should be put at the
177 start/end of the corresponding basic blocks. */
178 static move_t
*at_bb_start
, *at_bb_end
;
180 /* Max regno before renaming some pseudo-registers. For example, the
181 same pseudo-register can be renamed in a loop if its allocation is
182 different outside the loop. */
183 static int max_regno_before_changing
;
185 /* Return new move of allocnos TO and FROM. */
187 create_move (ira_allocno_t to
, ira_allocno_t from
)
191 move
= (move_t
) ira_allocate (sizeof (struct move
));
198 move
->visited_p
= false;
202 /* Free memory for MOVE and its dependencies. */
204 free_move (move_t move
)
206 if (move
->deps
!= NULL
)
207 ira_free (move
->deps
);
211 /* Free memory for list of the moves given by its HEAD. */
213 free_move_list (move_t head
)
217 for (; head
!= NULL
; head
= next
)
224 /* Return TRUE if the move list LIST1 and LIST2 are equal (two
225 moves are equal if they involve the same allocnos). */
227 eq_move_lists_p (move_t list1
, move_t list2
)
229 for (; list1
!= NULL
&& list2
!= NULL
;
230 list1
= list1
->next
, list2
= list2
->next
)
231 if (list1
->from
!= list2
->from
|| list1
->to
!= list2
->to
)
233 return list1
== list2
;
236 /* Print move list LIST into file F. */
238 print_move_list (FILE *f
, move_t list
)
240 for (; list
!= NULL
; list
= list
->next
)
241 fprintf (f
, " a%dr%d->a%dr%d",
242 ALLOCNO_NUM (list
->from
), ALLOCNO_REGNO (list
->from
),
243 ALLOCNO_NUM (list
->to
), ALLOCNO_REGNO (list
->to
));
247 extern void ira_debug_move_list (move_t list
);
249 /* Print move list LIST into stderr. */
251 ira_debug_move_list (move_t list
)
253 print_move_list (stderr
, list
);
256 /* This recursive function changes pseudo-registers in *LOC if it is
257 necessary. The function returns TRUE if a change was done. */
259 change_regs (rtx
*loc
)
261 int i
, regno
, result
= false;
266 if (*loc
== NULL_RTX
)
268 code
= GET_CODE (*loc
);
271 regno
= REGNO (*loc
);
272 if (regno
< FIRST_PSEUDO_REGISTER
)
274 if (regno
>= max_regno_before_changing
)
275 /* It is a shared register which was changed already. */
277 if (ira_curr_regno_allocno_map
[regno
] == NULL
)
279 reg
= allocno_emit_reg (ira_curr_regno_allocno_map
[regno
]);
286 fmt
= GET_RTX_FORMAT (code
);
287 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
290 result
= change_regs (&XEXP (*loc
, i
)) || result
;
291 else if (fmt
[i
] == 'E')
295 for (j
= XVECLEN (*loc
, i
) - 1; j
>= 0; j
--)
296 result
= change_regs (&XVECEXP (*loc
, i
, j
)) || result
;
303 change_regs_in_insn (rtx_insn
**insn_ptr
)
306 bool result
= change_regs (&rtx
);
307 *insn_ptr
= as_a
<rtx_insn
*> (rtx
);
311 /* Attach MOVE to the edge E. The move is attached to the head of the
312 list if HEAD_P is TRUE. */
314 add_to_edge_list (edge e
, move_t move
, bool head_p
)
318 if (head_p
|| e
->aux
== NULL
)
320 move
->next
= (move_t
) e
->aux
;
325 for (last
= (move_t
) e
->aux
; last
->next
!= NULL
; last
= last
->next
)
332 /* Create and return new pseudo-register with the same attributes as
335 ira_create_new_reg (rtx original_reg
)
339 new_reg
= gen_reg_rtx (GET_MODE (original_reg
));
340 ORIGINAL_REGNO (new_reg
) = ORIGINAL_REGNO (original_reg
);
341 REG_USERVAR_P (new_reg
) = REG_USERVAR_P (original_reg
);
342 REG_POINTER (new_reg
) = REG_POINTER (original_reg
);
343 REG_ATTRS (new_reg
) = REG_ATTRS (original_reg
);
344 if (internal_flag_ira_verbose
> 3 && ira_dump_file
!= NULL
)
345 fprintf (ira_dump_file
, " Creating newreg=%i from oldreg=%i\n",
346 REGNO (new_reg
), REGNO (original_reg
));
347 ira_expand_reg_equiv ();
351 /* Return TRUE if loop given by SUBNODE inside the loop given by
354 subloop_tree_node_p (ira_loop_tree_node_t subnode
, ira_loop_tree_node_t node
)
356 for (; subnode
!= NULL
; subnode
= subnode
->parent
)
362 /* Set up member `reg' to REG for allocnos which has the same regno as
363 ALLOCNO and which are inside the loop corresponding to ALLOCNO. */
365 set_allocno_reg (ira_allocno_t allocno
, rtx reg
)
369 ira_loop_tree_node_t node
;
371 node
= ALLOCNO_LOOP_TREE_NODE (allocno
);
372 for (a
= ira_regno_allocno_map
[ALLOCNO_REGNO (allocno
)];
374 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
375 if (subloop_tree_node_p (ALLOCNO_LOOP_TREE_NODE (a
), node
))
376 ALLOCNO_EMIT_DATA (a
)->reg
= reg
;
377 for (a
= ALLOCNO_CAP (allocno
); a
!= NULL
; a
= ALLOCNO_CAP (a
))
378 ALLOCNO_EMIT_DATA (a
)->reg
= reg
;
379 regno
= ALLOCNO_REGNO (allocno
);
382 if (a
== NULL
|| (a
= ALLOCNO_CAP (a
)) == NULL
)
387 a
= node
->regno_allocno_map
[regno
];
391 if (ALLOCNO_EMIT_DATA (a
)->child_renamed_p
)
393 ALLOCNO_EMIT_DATA (a
)->child_renamed_p
= true;
397 /* Return true if there is an entry to given loop not from its parent
398 (or grandparent) block. For example, it is possible for two
399 adjacent loops inside another loop. */
401 entered_from_non_parent_p (ira_loop_tree_node_t loop_node
)
403 ira_loop_tree_node_t bb_node
, src_loop_node
, parent
;
407 for (bb_node
= loop_node
->children
;
409 bb_node
= bb_node
->next
)
410 if (bb_node
->bb
!= NULL
)
412 FOR_EACH_EDGE (e
, ei
, bb_node
->bb
->preds
)
413 if (e
->src
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
)
414 && (src_loop_node
= IRA_BB_NODE (e
->src
)->parent
) != loop_node
)
416 for (parent
= src_loop_node
->parent
;
418 parent
= parent
->parent
)
419 if (parent
== loop_node
)
422 /* That is an exit from a nested loop -- skip it. */
424 for (parent
= loop_node
->parent
;
426 parent
= parent
->parent
)
427 if (src_loop_node
== parent
)
436 /* Set up ENTERED_FROM_NON_PARENT_P for each loop region. */
438 setup_entered_from_non_parent_p (void)
443 ira_assert (current_loops
!= NULL
);
444 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun
), i
, loop
)
445 if (ira_loop_nodes
[i
].regno_allocno_map
!= NULL
)
446 ira_loop_nodes
[i
].entered_from_non_parent_p
447 = entered_from_non_parent_p (&ira_loop_nodes
[i
]);
450 /* Return TRUE if move of SRC_ALLOCNO (assigned to hard register) to
451 DEST_ALLOCNO (assigned to memory) can be removed because it does
452 not change value of the destination. One possible reason for this
453 is the situation when SRC_ALLOCNO is not modified in the
454 corresponding loop. */
456 store_can_be_removed_p (ira_allocno_t src_allocno
, ira_allocno_t dest_allocno
)
458 int regno
, orig_regno
;
460 ira_loop_tree_node_t node
;
462 ira_assert (ALLOCNO_CAP_MEMBER (src_allocno
) == NULL
463 && ALLOCNO_CAP_MEMBER (dest_allocno
) == NULL
);
464 orig_regno
= ALLOCNO_REGNO (src_allocno
);
465 regno
= REGNO (allocno_emit_reg (dest_allocno
));
466 for (node
= ALLOCNO_LOOP_TREE_NODE (src_allocno
);
470 a
= node
->regno_allocno_map
[orig_regno
];
471 ira_assert (a
!= NULL
);
472 if (REGNO (allocno_emit_reg (a
)) == (unsigned) regno
)
473 /* We achieved the destination and everything is ok. */
475 else if (bitmap_bit_p (node
->modified_regnos
, orig_regno
))
477 else if (node
->entered_from_non_parent_p
)
478 /* If there is a path from a destination loop block to the
479 source loop header containing basic blocks of non-parents
480 (grandparents) of the source loop, we should have checked
481 modifications of the pseudo on this path too to decide
482 about possibility to remove the store. It could be done by
483 solving a data-flow problem. Unfortunately such global
484 solution would complicate IR flattening. Therefore we just
485 prohibit removal of the store in such complicated case. */
488 /* It is actually a loop entry -- do not remove the store. */
492 /* Generate and attach moves to the edge E. This looks at the final
493 regnos of allocnos living on the edge with the same original regno
494 to figure out when moves should be generated. */
496 generate_edge_moves (edge e
)
498 ira_loop_tree_node_t src_loop_node
, dest_loop_node
;
501 ira_allocno_t src_allocno
, dest_allocno
, *src_map
, *dest_map
;
503 bitmap regs_live_in_dest
, regs_live_out_src
;
505 src_loop_node
= IRA_BB_NODE (e
->src
)->parent
;
506 dest_loop_node
= IRA_BB_NODE (e
->dest
)->parent
;
508 if (src_loop_node
== dest_loop_node
)
510 src_map
= src_loop_node
->regno_allocno_map
;
511 dest_map
= dest_loop_node
->regno_allocno_map
;
512 regs_live_in_dest
= df_get_live_in (e
->dest
);
513 regs_live_out_src
= df_get_live_out (e
->src
);
514 EXECUTE_IF_SET_IN_REG_SET (regs_live_in_dest
,
515 FIRST_PSEUDO_REGISTER
, regno
, bi
)
516 if (bitmap_bit_p (regs_live_out_src
, regno
))
518 src_allocno
= src_map
[regno
];
519 dest_allocno
= dest_map
[regno
];
520 if (REGNO (allocno_emit_reg (src_allocno
))
521 == REGNO (allocno_emit_reg (dest_allocno
)))
523 /* Remove unnecessary stores at the region exit. We should do
524 this for readonly memory for sure and this is guaranteed by
525 that we never generate moves on region borders (see
526 checking in function change_loop). */
527 if (ALLOCNO_HARD_REGNO (dest_allocno
) < 0
528 && ALLOCNO_HARD_REGNO (src_allocno
) >= 0
529 && store_can_be_removed_p (src_allocno
, dest_allocno
))
531 ALLOCNO_EMIT_DATA (src_allocno
)->mem_optimized_dest
= dest_allocno
;
532 ALLOCNO_EMIT_DATA (dest_allocno
)->mem_optimized_dest_p
= true;
533 if (internal_flag_ira_verbose
> 3 && ira_dump_file
!= NULL
)
534 fprintf (ira_dump_file
, " Remove r%d:a%d->a%d(mem)\n",
535 regno
, ALLOCNO_NUM (src_allocno
),
536 ALLOCNO_NUM (dest_allocno
));
539 move
= create_move (dest_allocno
, src_allocno
);
540 add_to_edge_list (e
, move
, true);
544 /* Bitmap of allocnos local for the current loop. */
545 static bitmap local_allocno_bitmap
;
547 /* This bitmap is used to find that we need to generate and to use a
548 new pseudo-register when processing allocnos with the same original
550 static bitmap used_regno_bitmap
;
552 /* This bitmap contains regnos of allocnos which were renamed locally
553 because the allocnos correspond to disjoint live ranges in loops
554 with a common parent. */
555 static bitmap renamed_regno_bitmap
;
557 /* Change (if necessary) pseudo-registers inside loop given by loop
560 change_loop (ira_loop_tree_node_t node
)
566 ira_allocno_t allocno
, parent_allocno
, *map
;
569 enum reg_class aclass
, pclass
;
570 ira_loop_tree_node_t parent
;
572 if (node
!= ira_loop_tree_root
)
574 ira_assert (current_loops
!= NULL
);
576 if (node
->bb
!= NULL
)
578 FOR_BB_INSNS (node
->bb
, insn
)
579 if (INSN_P (insn
) && change_regs_in_insn (&insn
))
581 df_insn_rescan (insn
);
582 df_notes_rescan (insn
);
587 if (internal_flag_ira_verbose
> 3 && ira_dump_file
!= NULL
)
588 fprintf (ira_dump_file
,
589 " Changing RTL for loop %d (header bb%d)\n",
590 node
->loop_num
, node
->loop
->header
->index
);
592 parent
= ira_curr_loop_tree_node
->parent
;
593 map
= parent
->regno_allocno_map
;
594 EXECUTE_IF_SET_IN_REG_SET (ira_curr_loop_tree_node
->border_allocnos
,
597 allocno
= ira_allocnos
[i
];
598 regno
= ALLOCNO_REGNO (allocno
);
599 aclass
= ALLOCNO_CLASS (allocno
);
600 pclass
= ira_pressure_class_translate
[aclass
];
601 parent_allocno
= map
[regno
];
602 ira_assert (regno
< ira_reg_equiv_len
);
603 /* We generate the same hard register move because the
604 reload pass can put an allocno into memory in this case
605 we will have live range splitting. If it does not happen
606 such the same hard register moves will be removed. The
607 worst case when the both allocnos are put into memory by
608 the reload is very rare. */
609 if (parent_allocno
!= NULL
610 && (ALLOCNO_HARD_REGNO (allocno
)
611 == ALLOCNO_HARD_REGNO (parent_allocno
))
612 && (ALLOCNO_HARD_REGNO (allocno
) < 0
613 || (parent
->reg_pressure
[pclass
] + 1
614 <= ira_class_hard_regs_num
[pclass
])
615 || TEST_HARD_REG_BIT (ira_prohibited_mode_move_regs
616 [ALLOCNO_MODE (allocno
)],
617 ALLOCNO_HARD_REGNO (allocno
))
618 /* don't create copies because reload can spill an
619 allocno set by copy although the allocno will not
621 || ira_equiv_no_lvalue_p (regno
)
622 || (pic_offset_table_rtx
!= NULL
623 && (ALLOCNO_REGNO (allocno
)
624 == (int) REGNO (pic_offset_table_rtx
)))))
626 original_reg
= allocno_emit_reg (allocno
);
627 if (parent_allocno
== NULL
628 || (REGNO (allocno_emit_reg (parent_allocno
))
629 == REGNO (original_reg
)))
631 if (internal_flag_ira_verbose
> 3 && ira_dump_file
)
632 fprintf (ira_dump_file
, " %i vs parent %i:",
633 ALLOCNO_HARD_REGNO (allocno
),
634 ALLOCNO_HARD_REGNO (parent_allocno
));
635 set_allocno_reg (allocno
, ira_create_new_reg (original_reg
));
639 /* Rename locals: Local allocnos with same regno in different loops
640 might get the different hard register. So we need to change
642 bitmap_and_compl (local_allocno_bitmap
,
643 ira_curr_loop_tree_node
->all_allocnos
,
644 ira_curr_loop_tree_node
->border_allocnos
);
645 EXECUTE_IF_SET_IN_REG_SET (local_allocno_bitmap
, 0, i
, bi
)
647 allocno
= ira_allocnos
[i
];
648 regno
= ALLOCNO_REGNO (allocno
);
649 if (ALLOCNO_CAP_MEMBER (allocno
) != NULL
)
651 used_p
= !bitmap_set_bit (used_regno_bitmap
, regno
);
652 ALLOCNO_EMIT_DATA (allocno
)->somewhere_renamed_p
= true;
655 bitmap_set_bit (renamed_regno_bitmap
, regno
);
656 set_allocno_reg (allocno
, ira_create_new_reg (allocno_emit_reg (allocno
)));
660 /* Process to set up flag somewhere_renamed_p. */
662 set_allocno_somewhere_renamed_p (void)
665 ira_allocno_t allocno
;
666 ira_allocno_iterator ai
;
668 FOR_EACH_ALLOCNO (allocno
, ai
)
670 regno
= ALLOCNO_REGNO (allocno
);
671 if (bitmap_bit_p (renamed_regno_bitmap
, regno
)
672 && REGNO (allocno_emit_reg (allocno
)) == regno
)
673 ALLOCNO_EMIT_DATA (allocno
)->somewhere_renamed_p
= true;
677 /* Return TRUE if move lists on all edges given in vector VEC are
680 eq_edge_move_lists_p (vec
<edge
, va_gc
> *vec
)
685 list
= (move_t
) EDGE_I (vec
, 0)->aux
;
686 for (i
= EDGE_COUNT (vec
) - 1; i
> 0; i
--)
687 if (! eq_move_lists_p (list
, (move_t
) EDGE_I (vec
, i
)->aux
))
692 /* Look at all entry edges (if START_P) or exit edges of basic block
693 BB and put move lists at the BB start or end if it is possible. In
694 other words, this decreases code duplication of allocno moves. */
696 unify_moves (basic_block bb
, bool start_p
)
701 vec
<edge
, va_gc
> *vec
;
703 vec
= (start_p
? bb
->preds
: bb
->succs
);
704 if (EDGE_COUNT (vec
) == 0 || ! eq_edge_move_lists_p (vec
))
707 list
= (move_t
) e
->aux
;
708 if (! start_p
&& control_flow_insn_p (BB_END (bb
)))
711 for (i
= EDGE_COUNT (vec
) - 1; i
> 0; i
--)
714 free_move_list ((move_t
) e
->aux
);
718 at_bb_start
[bb
->index
] = list
;
720 at_bb_end
[bb
->index
] = list
;
723 /* Last move (in move sequence being processed) setting up the
724 corresponding hard register. */
725 static move_t hard_regno_last_set
[FIRST_PSEUDO_REGISTER
];
727 /* If the element value is equal to CURR_TICK then the corresponding
728 element in `hard_regno_last_set' is defined and correct. */
729 static int hard_regno_last_set_check
[FIRST_PSEUDO_REGISTER
];
731 /* Last move (in move sequence being processed) setting up the
732 corresponding allocno. */
733 static move_t
*allocno_last_set
;
735 /* If the element value is equal to CURR_TICK then the corresponding
736 element in . `allocno_last_set' is defined and correct. */
737 static int *allocno_last_set_check
;
739 /* Definition of vector of moves. */
741 /* This vec contains moves sorted topologically (depth-first) on their
743 static vec
<move_t
> move_vec
;
745 /* The variable value is used to check correctness of values of
746 elements of arrays `hard_regno_last_set' and
747 `allocno_last_set_check'. */
748 static int curr_tick
;
750 /* This recursive function traverses dependencies of MOVE and produces
751 topological sorting (in depth-first order). */
753 traverse_moves (move_t move
)
759 move
->visited_p
= true;
760 for (i
= move
->deps_num
- 1; i
>= 0; i
--)
761 traverse_moves (move
->deps
[i
]);
762 move_vec
.safe_push (move
);
765 /* Remove unnecessary moves in the LIST, makes topological sorting,
766 and removes cycles on hard reg dependencies by introducing new
767 allocnos assigned to memory and additional moves. It returns the
770 modify_move_list (move_t list
)
772 int i
, n
, nregs
, hard_regno
;
773 ira_allocno_t to
, from
;
774 move_t move
, new_move
, set_move
, first
, last
;
778 /* Create move deps. */
780 for (move
= list
; move
!= NULL
; move
= move
->next
)
783 if ((hard_regno
= ALLOCNO_HARD_REGNO (to
)) < 0)
785 nregs
= hard_regno_nregs
[hard_regno
][ALLOCNO_MODE (to
)];
786 for (i
= 0; i
< nregs
; i
++)
788 hard_regno_last_set
[hard_regno
+ i
] = move
;
789 hard_regno_last_set_check
[hard_regno
+ i
] = curr_tick
;
792 for (move
= list
; move
!= NULL
; move
= move
->next
)
796 if ((hard_regno
= ALLOCNO_HARD_REGNO (from
)) >= 0)
798 nregs
= hard_regno_nregs
[hard_regno
][ALLOCNO_MODE (from
)];
799 for (n
= i
= 0; i
< nregs
; i
++)
800 if (hard_regno_last_set_check
[hard_regno
+ i
] == curr_tick
801 && (ALLOCNO_REGNO (hard_regno_last_set
[hard_regno
+ i
]->to
)
802 != ALLOCNO_REGNO (from
)))
804 move
->deps
= (move_t
*) ira_allocate (n
* sizeof (move_t
));
805 for (n
= i
= 0; i
< nregs
; i
++)
806 if (hard_regno_last_set_check
[hard_regno
+ i
] == curr_tick
807 && (ALLOCNO_REGNO (hard_regno_last_set
[hard_regno
+ i
]->to
)
808 != ALLOCNO_REGNO (from
)))
809 move
->deps
[n
++] = hard_regno_last_set
[hard_regno
+ i
];
813 /* Topological sorting: */
814 move_vec
.truncate (0);
815 for (move
= list
; move
!= NULL
; move
= move
->next
)
816 traverse_moves (move
);
818 for (i
= (int) move_vec
.length () - 1; i
>= 0; i
--)
826 first
= move_vec
.last ();
827 /* Removing cycles: */
829 move_vec
.truncate (0);
830 for (move
= first
; move
!= NULL
; move
= move
->next
)
834 if ((hard_regno
= ALLOCNO_HARD_REGNO (from
)) >= 0)
836 nregs
= hard_regno_nregs
[hard_regno
][ALLOCNO_MODE (from
)];
837 for (i
= 0; i
< nregs
; i
++)
838 if (hard_regno_last_set_check
[hard_regno
+ i
] == curr_tick
839 && ALLOCNO_HARD_REGNO
840 (hard_regno_last_set
[hard_regno
+ i
]->to
) >= 0)
843 ira_allocno_t new_allocno
;
845 set_move
= hard_regno_last_set
[hard_regno
+ i
];
846 /* It does not matter what loop_tree_node (of TO or
847 FROM) to use for the new allocno because of
848 subsequent IRA internal representation
851 = create_new_allocno (ALLOCNO_REGNO (set_move
->to
),
852 ALLOCNO_LOOP_TREE_NODE (set_move
->to
));
853 ALLOCNO_MODE (new_allocno
) = ALLOCNO_MODE (set_move
->to
);
854 ira_set_allocno_class (new_allocno
,
855 ALLOCNO_CLASS (set_move
->to
));
856 ira_create_allocno_objects (new_allocno
);
857 ALLOCNO_ASSIGNED_P (new_allocno
) = true;
858 ALLOCNO_HARD_REGNO (new_allocno
) = -1;
859 ALLOCNO_EMIT_DATA (new_allocno
)->reg
860 = ira_create_new_reg (allocno_emit_reg (set_move
->to
));
862 /* Make it possibly conflicting with all earlier
863 created allocnos. Cases where temporary allocnos
864 created to remove the cycles are quite rare. */
865 n
= ALLOCNO_NUM_OBJECTS (new_allocno
);
866 gcc_assert (n
== ALLOCNO_NUM_OBJECTS (set_move
->to
));
867 for (j
= 0; j
< n
; j
++)
869 ira_object_t new_obj
= ALLOCNO_OBJECT (new_allocno
, j
);
871 OBJECT_MIN (new_obj
) = 0;
872 OBJECT_MAX (new_obj
) = ira_objects_num
- 1;
875 new_move
= create_move (set_move
->to
, new_allocno
);
876 set_move
->to
= new_allocno
;
877 move_vec
.safe_push (new_move
);
878 ira_move_loops_num
++;
879 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
880 fprintf (ira_dump_file
,
881 " Creating temporary allocno a%dr%d\n",
882 ALLOCNO_NUM (new_allocno
),
883 REGNO (allocno_emit_reg (new_allocno
)));
886 if ((hard_regno
= ALLOCNO_HARD_REGNO (to
)) < 0)
888 nregs
= hard_regno_nregs
[hard_regno
][ALLOCNO_MODE (to
)];
889 for (i
= 0; i
< nregs
; i
++)
891 hard_regno_last_set
[hard_regno
+ i
] = move
;
892 hard_regno_last_set_check
[hard_regno
+ i
] = curr_tick
;
895 for (i
= (int) move_vec
.length () - 1; i
>= 0; i
--)
905 /* Generate RTX move insns from the move list LIST. This updates
906 allocation cost using move execution frequency FREQ. */
908 emit_move_list (move_t list
, int freq
)
911 int to_regno
, from_regno
, cost
, regno
;
912 rtx_insn
*result
, *insn
;
915 enum reg_class aclass
;
919 for (; list
!= NULL
; list
= list
->next
)
922 to
= allocno_emit_reg (list
->to
);
923 to_regno
= REGNO (to
);
924 from
= allocno_emit_reg (list
->from
);
925 from_regno
= REGNO (from
);
926 emit_move_insn (to
, from
);
927 list
->insn
= get_insns ();
929 for (insn
= list
->insn
; insn
!= NULL_RTX
; insn
= NEXT_INSN (insn
))
931 /* The reload needs to have set up insn codes. If the
932 reload sets up insn codes by itself, it may fail because
933 insns will have hard registers instead of pseudos and
934 there may be no machine insn with given hard
936 recog_memoized (insn
);
937 /* Add insn to equiv init insn list if it is necessary.
938 Otherwise reload will not remove this insn if it decides
939 to use the equivalence. */
940 if ((set
= single_set (insn
)) != NULL_RTX
)
942 dest
= SET_DEST (set
);
943 if (GET_CODE (dest
) == SUBREG
)
944 dest
= SUBREG_REG (dest
);
945 ira_assert (REG_P (dest
));
946 regno
= REGNO (dest
);
947 if (regno
>= ira_reg_equiv_len
948 || (ira_reg_equiv
[regno
].invariant
== NULL_RTX
949 && ira_reg_equiv
[regno
].constant
== NULL_RTX
))
950 continue; /* regno has no equivalence. */
951 ira_assert ((int) reg_equivs
->length () > regno
);
952 reg_equiv_init (regno
)
953 = gen_rtx_INSN_LIST (VOIDmode
, insn
, reg_equiv_init (regno
));
957 ira_update_equiv_info_by_shuffle_insn (to_regno
, from_regno
, list
->insn
);
958 emit_insn (list
->insn
);
959 mode
= ALLOCNO_MODE (list
->to
);
960 aclass
= ALLOCNO_CLASS (list
->to
);
962 if (ALLOCNO_HARD_REGNO (list
->to
) < 0)
964 if (ALLOCNO_HARD_REGNO (list
->from
) >= 0)
966 cost
= ira_memory_move_cost
[mode
][aclass
][0] * freq
;
967 ira_store_cost
+= cost
;
970 else if (ALLOCNO_HARD_REGNO (list
->from
) < 0)
972 if (ALLOCNO_HARD_REGNO (list
->to
) >= 0)
974 cost
= ira_memory_move_cost
[mode
][aclass
][0] * freq
;
975 ira_load_cost
+= cost
;
980 ira_init_register_move_cost_if_necessary (mode
);
981 cost
= ira_register_move_cost
[mode
][aclass
][aclass
] * freq
;
982 ira_shuffle_cost
+= cost
;
984 ira_overall_cost
+= cost
;
986 result
= get_insns ();
991 /* Generate RTX move insns from move lists attached to basic blocks
999 rtx_insn
*insns
, *tmp
;
1001 FOR_EACH_BB_FN (bb
, cfun
)
1003 if (at_bb_start
[bb
->index
] != NULL
)
1005 at_bb_start
[bb
->index
] = modify_move_list (at_bb_start
[bb
->index
]);
1006 insns
= emit_move_list (at_bb_start
[bb
->index
],
1007 REG_FREQ_FROM_BB (bb
));
1010 tmp
= NEXT_INSN (tmp
);
1011 if (NOTE_INSN_BASIC_BLOCK_P (tmp
))
1012 tmp
= NEXT_INSN (tmp
);
1013 if (tmp
== BB_HEAD (bb
))
1014 emit_insn_before (insns
, tmp
);
1015 else if (tmp
!= NULL_RTX
)
1016 emit_insn_after (insns
, PREV_INSN (tmp
));
1018 emit_insn_after (insns
, get_last_insn ());
1021 if (at_bb_end
[bb
->index
] != NULL
)
1023 at_bb_end
[bb
->index
] = modify_move_list (at_bb_end
[bb
->index
]);
1024 insns
= emit_move_list (at_bb_end
[bb
->index
], REG_FREQ_FROM_BB (bb
));
1025 ira_assert (! control_flow_insn_p (BB_END (bb
)));
1026 emit_insn_after (insns
, BB_END (bb
));
1029 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1033 ira_assert ((e
->flags
& EDGE_ABNORMAL
) == 0
1034 || ! EDGE_CRITICAL_P (e
));
1035 e
->aux
= modify_move_list ((move_t
) e
->aux
);
1037 (emit_move_list ((move_t
) e
->aux
,
1038 REG_FREQ_FROM_EDGE_FREQ (EDGE_FREQUENCY (e
))),
1040 if (e
->src
->next_bb
!= e
->dest
)
1041 ira_additional_jumps_num
++;
1046 /* Update costs of A and corresponding allocnos on upper levels on the
1047 loop tree from reading (if READ_P) or writing A on an execution
1050 update_costs (ira_allocno_t a
, bool read_p
, int freq
)
1052 ira_loop_tree_node_t parent
;
1056 ALLOCNO_NREFS (a
)++;
1057 ALLOCNO_FREQ (a
) += freq
;
1058 ALLOCNO_MEMORY_COST (a
)
1059 += (ira_memory_move_cost
[ALLOCNO_MODE (a
)][ALLOCNO_CLASS (a
)]
1060 [read_p
? 1 : 0] * freq
);
1061 if (ALLOCNO_CAP (a
) != NULL
)
1062 a
= ALLOCNO_CAP (a
);
1063 else if ((parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
) == NULL
1064 || (a
= parent
->regno_allocno_map
[ALLOCNO_REGNO (a
)]) == NULL
)
1069 /* Process moves from LIST with execution FREQ to add ranges, copies,
1070 and modify costs for allocnos involved in the moves. All regnos
1071 living through the list is in LIVE_THROUGH, and the loop tree node
1072 used to find corresponding allocnos is NODE. */
1074 add_range_and_copies_from_move_list (move_t list
, ira_loop_tree_node_t node
,
1075 bitmap live_through
, int freq
)
1084 HARD_REG_SET hard_regs_live
;
1089 EXECUTE_IF_SET_IN_BITMAP (live_through
, FIRST_PSEUDO_REGISTER
, regno
, bi
)
1091 REG_SET_TO_HARD_REG_SET (hard_regs_live
, live_through
);
1092 /* This is a trick to guarantee that new ranges is not merged with
1095 start
= ira_max_point
;
1096 for (move
= list
; move
!= NULL
; move
= move
->next
)
1098 ira_allocno_t from
= move
->from
;
1099 ira_allocno_t to
= move
->to
;
1102 bitmap_clear_bit (live_through
, ALLOCNO_REGNO (from
));
1103 bitmap_clear_bit (live_through
, ALLOCNO_REGNO (to
));
1105 nr
= ALLOCNO_NUM_OBJECTS (to
);
1106 for (i
= 0; i
< nr
; i
++)
1108 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
1109 if (OBJECT_CONFLICT_ARRAY (to_obj
) == NULL
)
1111 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
1112 fprintf (ira_dump_file
, " Allocate conflicts for a%dr%d\n",
1113 ALLOCNO_NUM (to
), REGNO (allocno_emit_reg (to
)));
1114 ira_allocate_object_conflicts (to_obj
, n
);
1117 ior_hard_reg_conflicts (from
, &hard_regs_live
);
1118 ior_hard_reg_conflicts (to
, &hard_regs_live
);
1120 update_costs (from
, true, freq
);
1121 update_costs (to
, false, freq
);
1122 cp
= ira_add_allocno_copy (from
, to
, freq
, false, move
->insn
, NULL
);
1123 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
1124 fprintf (ira_dump_file
, " Adding cp%d:a%dr%d-a%dr%d\n",
1125 cp
->num
, ALLOCNO_NUM (cp
->first
),
1126 REGNO (allocno_emit_reg (cp
->first
)),
1127 ALLOCNO_NUM (cp
->second
),
1128 REGNO (allocno_emit_reg (cp
->second
)));
1130 nr
= ALLOCNO_NUM_OBJECTS (from
);
1131 for (i
= 0; i
< nr
; i
++)
1133 ira_object_t from_obj
= ALLOCNO_OBJECT (from
, i
);
1134 r
= OBJECT_LIVE_RANGES (from_obj
);
1135 if (r
== NULL
|| r
->finish
>= 0)
1137 ira_add_live_range_to_object (from_obj
, start
, ira_max_point
);
1138 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
1139 fprintf (ira_dump_file
,
1140 " Adding range [%d..%d] to allocno a%dr%d\n",
1141 start
, ira_max_point
, ALLOCNO_NUM (from
),
1142 REGNO (allocno_emit_reg (from
)));
1146 r
->finish
= ira_max_point
;
1147 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
1148 fprintf (ira_dump_file
,
1149 " Adding range [%d..%d] to allocno a%dr%d\n",
1150 r
->start
, ira_max_point
, ALLOCNO_NUM (from
),
1151 REGNO (allocno_emit_reg (from
)));
1155 nr
= ALLOCNO_NUM_OBJECTS (to
);
1156 for (i
= 0; i
< nr
; i
++)
1158 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
1159 ira_add_live_range_to_object (to_obj
, ira_max_point
, -1);
1163 for (move
= list
; move
!= NULL
; move
= move
->next
)
1166 nr
= ALLOCNO_NUM_OBJECTS (move
->to
);
1167 for (i
= 0; i
< nr
; i
++)
1169 ira_object_t to_obj
= ALLOCNO_OBJECT (move
->to
, i
);
1170 r
= OBJECT_LIVE_RANGES (to_obj
);
1173 r
->finish
= ira_max_point
- 1;
1174 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
1175 fprintf (ira_dump_file
,
1176 " Adding range [%d..%d] to allocno a%dr%d\n",
1177 r
->start
, r
->finish
, ALLOCNO_NUM (move
->to
),
1178 REGNO (allocno_emit_reg (move
->to
)));
1182 EXECUTE_IF_SET_IN_BITMAP (live_through
, FIRST_PSEUDO_REGISTER
, regno
, bi
)
1187 a
= node
->regno_allocno_map
[regno
];
1188 if ((to
= ALLOCNO_EMIT_DATA (a
)->mem_optimized_dest
) != NULL
)
1190 nr
= ALLOCNO_NUM_OBJECTS (a
);
1191 for (i
= 0; i
< nr
; i
++)
1193 ira_object_t obj
= ALLOCNO_OBJECT (a
, i
);
1194 ira_add_live_range_to_object (obj
, start
, ira_max_point
- 1);
1196 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
1199 " Adding range [%d..%d] to live through %s allocno a%dr%d\n",
1200 start
, ira_max_point
- 1,
1201 to
!= NULL
? "upper level" : "",
1202 ALLOCNO_NUM (a
), REGNO (allocno_emit_reg (a
)));
1206 /* Process all move list to add ranges, conflicts, copies, and modify
1207 costs for allocnos involved in the moves. */
1209 add_ranges_and_copies (void)
1214 ira_loop_tree_node_t node
;
1215 bitmap live_through
;
1217 live_through
= ira_allocate_bitmap ();
1218 FOR_EACH_BB_FN (bb
, cfun
)
1220 /* It does not matter what loop_tree_node (of source or
1221 destination block) to use for searching allocnos by their
1222 regnos because of subsequent IR flattening. */
1223 node
= IRA_BB_NODE (bb
)->parent
;
1224 bitmap_copy (live_through
, df_get_live_in (bb
));
1225 add_range_and_copies_from_move_list
1226 (at_bb_start
[bb
->index
], node
, live_through
, REG_FREQ_FROM_BB (bb
));
1227 bitmap_copy (live_through
, df_get_live_out (bb
));
1228 add_range_and_copies_from_move_list
1229 (at_bb_end
[bb
->index
], node
, live_through
, REG_FREQ_FROM_BB (bb
));
1230 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1232 bitmap_and (live_through
,
1233 df_get_live_in (e
->dest
), df_get_live_out (bb
));
1234 add_range_and_copies_from_move_list
1235 ((move_t
) e
->aux
, node
, live_through
,
1236 REG_FREQ_FROM_EDGE_FREQ (EDGE_FREQUENCY (e
)));
1239 ira_free_bitmap (live_through
);
1242 /* The entry function changes code and generates shuffling allocnos on
1243 region borders for the regional (LOOPS_P is TRUE in this case)
1244 register allocation. */
1246 ira_emit (bool loops_p
)
1253 ira_allocno_iterator ai
;
1256 FOR_EACH_ALLOCNO (a
, ai
)
1257 ALLOCNO_EMIT_DATA (a
)->reg
= regno_reg_rtx
[ALLOCNO_REGNO (a
)];
1260 sz
= sizeof (move_t
) * last_basic_block_for_fn (cfun
);
1261 at_bb_start
= (move_t
*) ira_allocate (sz
);
1262 memset (at_bb_start
, 0, sz
);
1263 at_bb_end
= (move_t
*) ira_allocate (sz
);
1264 memset (at_bb_end
, 0, sz
);
1265 local_allocno_bitmap
= ira_allocate_bitmap ();
1266 used_regno_bitmap
= ira_allocate_bitmap ();
1267 renamed_regno_bitmap
= ira_allocate_bitmap ();
1268 max_regno_before_changing
= max_reg_num ();
1269 ira_traverse_loop_tree (true, ira_loop_tree_root
, change_loop
, NULL
);
1270 set_allocno_somewhere_renamed_p ();
1271 ira_free_bitmap (used_regno_bitmap
);
1272 ira_free_bitmap (renamed_regno_bitmap
);
1273 ira_free_bitmap (local_allocno_bitmap
);
1274 setup_entered_from_non_parent_p ();
1275 FOR_EACH_BB_FN (bb
, cfun
)
1277 at_bb_start
[bb
->index
] = NULL
;
1278 at_bb_end
[bb
->index
] = NULL
;
1279 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1280 if (e
->dest
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
1281 generate_edge_moves (e
);
1284 = (move_t
*) ira_allocate (sizeof (move_t
) * max_reg_num ());
1285 allocno_last_set_check
1286 = (int *) ira_allocate (sizeof (int) * max_reg_num ());
1287 memset (allocno_last_set_check
, 0, sizeof (int) * max_reg_num ());
1288 memset (hard_regno_last_set_check
, 0, sizeof (hard_regno_last_set_check
));
1290 FOR_EACH_BB_FN (bb
, cfun
)
1291 unify_moves (bb
, true);
1292 FOR_EACH_BB_FN (bb
, cfun
)
1293 unify_moves (bb
, false);
1294 move_vec
.create (ira_allocnos_num
);
1296 add_ranges_and_copies ();
1298 FOR_EACH_BB_FN (bb
, cfun
)
1300 free_move_list (at_bb_start
[bb
->index
]);
1301 free_move_list (at_bb_end
[bb
->index
]);
1302 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1304 free_move_list ((move_t
) e
->aux
);
1308 move_vec
.release ();
1309 ira_free (allocno_last_set_check
);
1310 ira_free (allocno_last_set
);
1311 commit_edge_insertions ();
1312 /* Fix insn codes. It is necessary to do it before reload because
1313 reload assumes initial insn codes defined. The insn codes can be
1314 invalidated by CFG infrastructure for example in jump
1316 FOR_EACH_BB_FN (bb
, cfun
)
1317 FOR_BB_INSNS_REVERSE (bb
, insn
)
1319 recog_memoized (insn
);
1320 ira_free (at_bb_end
);
1321 ira_free (at_bb_start
);