1 /* IRA conflict builder.
2 Copyright (C) 2006-2015 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/>. */
23 #include "coretypes.h"
32 #include "insn-config.h"
33 #include "diagnostic-core.h"
35 #include "sparseset.h"
38 #include "alloc-pool.h"
40 #include "addresses.h"
42 /* This file contains code responsible for allocno conflict creation,
43 allocno copy creation and allocno info accumulation on upper level
46 /* ira_allocnos_num array of arrays of bits, recording whether two
47 allocno's conflict (can't go in the same hardware register).
49 Some arrays will be used as conflict bit vector of the
50 corresponding allocnos see function build_object_conflicts. */
51 static IRA_INT_TYPE
**conflicts
;
53 /* Macro to test a conflict of C1 and C2 in `conflicts'. */
54 #define OBJECTS_CONFLICT_P(C1, C2) \
55 (OBJECT_MIN (C1) <= OBJECT_CONFLICT_ID (C2) \
56 && OBJECT_CONFLICT_ID (C2) <= OBJECT_MAX (C1) \
57 && TEST_MINMAX_SET_BIT (conflicts[OBJECT_CONFLICT_ID (C1)], \
58 OBJECT_CONFLICT_ID (C2), \
59 OBJECT_MIN (C1), OBJECT_MAX (C1)))
62 /* Record a conflict between objects OBJ1 and OBJ2. If necessary,
63 canonicalize the conflict by recording it for lower-order subobjects
64 of the corresponding allocnos. */
66 record_object_conflict (ira_object_t obj1
, ira_object_t obj2
)
68 ira_allocno_t a1
= OBJECT_ALLOCNO (obj1
);
69 ira_allocno_t a2
= OBJECT_ALLOCNO (obj2
);
70 int w1
= OBJECT_SUBWORD (obj1
);
71 int w2
= OBJECT_SUBWORD (obj2
);
74 /* Canonicalize the conflict. If two identically-numbered words
75 conflict, always record this as a conflict between words 0. That
76 is the only information we need, and it is easier to test for if
77 it is collected in each allocno's lowest-order object. */
78 if (w1
== w2
&& w1
> 0)
80 obj1
= ALLOCNO_OBJECT (a1
, 0);
81 obj2
= ALLOCNO_OBJECT (a2
, 0);
83 id1
= OBJECT_CONFLICT_ID (obj1
);
84 id2
= OBJECT_CONFLICT_ID (obj2
);
86 SET_MINMAX_SET_BIT (conflicts
[id1
], id2
, OBJECT_MIN (obj1
),
88 SET_MINMAX_SET_BIT (conflicts
[id2
], id1
, OBJECT_MIN (obj2
),
92 /* Build allocno conflict table by processing allocno live ranges.
93 Return true if the table was built. The table is not built if it
96 build_conflict_bit_table (void)
100 enum reg_class aclass
;
101 int object_set_words
, allocated_words_num
, conflict_bit_vec_words_num
;
103 ira_allocno_t allocno
;
104 ira_allocno_iterator ai
;
105 sparseset objects_live
;
107 ira_allocno_object_iterator aoi
;
109 allocated_words_num
= 0;
110 FOR_EACH_ALLOCNO (allocno
, ai
)
111 FOR_EACH_ALLOCNO_OBJECT (allocno
, obj
, aoi
)
113 if (OBJECT_MAX (obj
) < OBJECT_MIN (obj
))
115 conflict_bit_vec_words_num
116 = ((OBJECT_MAX (obj
) - OBJECT_MIN (obj
) + IRA_INT_BITS
)
118 allocated_words_num
+= conflict_bit_vec_words_num
;
119 if ((uint64_t) allocated_words_num
* sizeof (IRA_INT_TYPE
)
120 > (uint64_t) IRA_MAX_CONFLICT_TABLE_SIZE
* 1024 * 1024)
122 if (internal_flag_ira_verbose
> 0 && ira_dump_file
!= NULL
)
125 "+++Conflict table will be too big(>%dMB) -- don't use it\n",
126 IRA_MAX_CONFLICT_TABLE_SIZE
);
131 conflicts
= (IRA_INT_TYPE
**) ira_allocate (sizeof (IRA_INT_TYPE
*)
133 allocated_words_num
= 0;
134 FOR_EACH_ALLOCNO (allocno
, ai
)
135 FOR_EACH_ALLOCNO_OBJECT (allocno
, obj
, aoi
)
137 int id
= OBJECT_CONFLICT_ID (obj
);
138 if (OBJECT_MAX (obj
) < OBJECT_MIN (obj
))
140 conflicts
[id
] = NULL
;
143 conflict_bit_vec_words_num
144 = ((OBJECT_MAX (obj
) - OBJECT_MIN (obj
) + IRA_INT_BITS
)
146 allocated_words_num
+= conflict_bit_vec_words_num
;
148 = (IRA_INT_TYPE
*) ira_allocate (sizeof (IRA_INT_TYPE
)
149 * conflict_bit_vec_words_num
);
150 memset (conflicts
[id
], 0,
151 sizeof (IRA_INT_TYPE
) * conflict_bit_vec_words_num
);
154 object_set_words
= (ira_objects_num
+ IRA_INT_BITS
- 1) / IRA_INT_BITS
;
155 if (internal_flag_ira_verbose
> 0 && ira_dump_file
!= NULL
)
158 "+++Allocating %ld bytes for conflict table (uncompressed size %ld)\n",
159 (long) allocated_words_num
* sizeof (IRA_INT_TYPE
),
160 (long) object_set_words
* ira_objects_num
* sizeof (IRA_INT_TYPE
));
162 objects_live
= sparseset_alloc (ira_objects_num
);
163 for (i
= 0; i
< ira_max_point
; i
++)
165 for (r
= ira_start_point_ranges
[i
]; r
!= NULL
; r
= r
->start_next
)
167 ira_object_t obj
= r
->object
;
168 ira_allocno_t allocno
= OBJECT_ALLOCNO (obj
);
169 int id
= OBJECT_CONFLICT_ID (obj
);
171 gcc_assert (id
< ira_objects_num
);
173 aclass
= ALLOCNO_CLASS (allocno
);
174 EXECUTE_IF_SET_IN_SPARSESET (objects_live
, j
)
176 ira_object_t live_obj
= ira_object_id_map
[j
];
177 ira_allocno_t live_a
= OBJECT_ALLOCNO (live_obj
);
178 enum reg_class live_aclass
= ALLOCNO_CLASS (live_a
);
180 if (ira_reg_classes_intersect_p
[aclass
][live_aclass
]
181 /* Don't set up conflict for the allocno with itself. */
182 && live_a
!= allocno
)
184 record_object_conflict (obj
, live_obj
);
187 sparseset_set_bit (objects_live
, id
);
190 for (r
= ira_finish_point_ranges
[i
]; r
!= NULL
; r
= r
->finish_next
)
191 sparseset_clear_bit (objects_live
, OBJECT_CONFLICT_ID (r
->object
));
193 sparseset_free (objects_live
);
197 /* Return true iff allocnos A1 and A2 cannot be allocated to the same
198 register due to conflicts. */
201 allocnos_conflict_for_copy_p (ira_allocno_t a1
, ira_allocno_t a2
)
203 /* Due to the fact that we canonicalize conflicts (see
204 record_object_conflict), we only need to test for conflicts of
205 the lowest order words. */
206 ira_object_t obj1
= ALLOCNO_OBJECT (a1
, 0);
207 ira_object_t obj2
= ALLOCNO_OBJECT (a2
, 0);
209 return OBJECTS_CONFLICT_P (obj1
, obj2
);
212 /* Check that X is REG or SUBREG of REG. */
213 #define REG_SUBREG_P(x) \
214 (REG_P (x) || (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))))
216 /* Return X if X is a REG, otherwise it should be SUBREG of REG and
217 the function returns the reg in this case. *OFFSET will be set to
218 0 in the first case or the regno offset in the first case. */
220 go_through_subreg (rtx x
, int *offset
)
227 ira_assert (GET_CODE (x
) == SUBREG
);
228 reg
= SUBREG_REG (x
);
229 ira_assert (REG_P (reg
));
230 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
231 *offset
= subreg_regno_offset (REGNO (reg
), GET_MODE (reg
),
232 SUBREG_BYTE (x
), GET_MODE (x
));
234 *offset
= (SUBREG_BYTE (x
) / REGMODE_NATURAL_SIZE (GET_MODE (x
)));
238 /* Process registers REG1 and REG2 in move INSN with execution
239 frequency FREQ. The function also processes the registers in a
240 potential move insn (INSN == NULL in this case) with frequency
241 FREQ. The function can modify hard register costs of the
242 corresponding allocnos or create a copy involving the corresponding
243 allocnos. The function does nothing if the both registers are hard
244 registers. When nothing is changed, the function returns
247 process_regs_for_copy (rtx reg1
, rtx reg2
, bool constraint_p
,
248 rtx_insn
*insn
, int freq
)
250 int allocno_preferenced_hard_regno
, cost
, index
, offset1
, offset2
;
253 reg_class_t rclass
, aclass
;
257 gcc_assert (REG_SUBREG_P (reg1
) && REG_SUBREG_P (reg2
));
258 only_regs_p
= REG_P (reg1
) && REG_P (reg2
);
259 reg1
= go_through_subreg (reg1
, &offset1
);
260 reg2
= go_through_subreg (reg2
, &offset2
);
261 /* Set up hard regno preferenced by allocno. If allocno gets the
262 hard regno the copy (or potential move) insn will be removed. */
263 if (HARD_REGISTER_P (reg1
))
265 if (HARD_REGISTER_P (reg2
))
267 allocno_preferenced_hard_regno
= REGNO (reg1
) + offset1
- offset2
;
268 a
= ira_curr_regno_allocno_map
[REGNO (reg2
)];
270 else if (HARD_REGISTER_P (reg2
))
272 allocno_preferenced_hard_regno
= REGNO (reg2
) + offset2
- offset1
;
273 a
= ira_curr_regno_allocno_map
[REGNO (reg1
)];
277 ira_allocno_t a1
= ira_curr_regno_allocno_map
[REGNO (reg1
)];
278 ira_allocno_t a2
= ira_curr_regno_allocno_map
[REGNO (reg2
)];
280 if (!allocnos_conflict_for_copy_p (a1
, a2
) && offset1
== offset2
)
282 cp
= ira_add_allocno_copy (a1
, a2
, freq
, constraint_p
, insn
,
283 ira_curr_loop_tree_node
);
284 bitmap_set_bit (ira_curr_loop_tree_node
->local_copies
, cp
->num
);
291 if (! IN_RANGE (allocno_preferenced_hard_regno
,
292 0, FIRST_PSEUDO_REGISTER
- 1))
293 /* Can not be tied. */
295 rclass
= REGNO_REG_CLASS (allocno_preferenced_hard_regno
);
296 mode
= ALLOCNO_MODE (a
);
297 aclass
= ALLOCNO_CLASS (a
);
298 if (only_regs_p
&& insn
!= NULL_RTX
299 && reg_class_size
[rclass
] <= ira_reg_class_max_nregs
[rclass
][mode
])
300 /* It is already taken into account in ira-costs.c. */
302 index
= ira_class_hard_reg_index
[aclass
][allocno_preferenced_hard_regno
];
304 /* Can not be tied. It is not in the allocno class. */
306 ira_init_register_move_cost_if_necessary (mode
);
307 if (HARD_REGISTER_P (reg1
))
308 cost
= ira_register_move_cost
[mode
][aclass
][rclass
] * freq
;
310 cost
= ira_register_move_cost
[mode
][rclass
][aclass
] * freq
;
313 ira_allocate_and_set_costs
314 (&ALLOCNO_HARD_REG_COSTS (a
), aclass
,
315 ALLOCNO_CLASS_COST (a
));
316 ira_allocate_and_set_costs
317 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a
), aclass
, 0);
318 ALLOCNO_HARD_REG_COSTS (a
)[index
] -= cost
;
319 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
)[index
] -= cost
;
320 if (ALLOCNO_HARD_REG_COSTS (a
)[index
] < ALLOCNO_CLASS_COST (a
))
321 ALLOCNO_CLASS_COST (a
) = ALLOCNO_HARD_REG_COSTS (a
)[index
];
322 ira_add_allocno_pref (a
, allocno_preferenced_hard_regno
, freq
);
323 a
= ira_parent_or_cap_allocno (a
);
329 /* Process all of the output registers of the current insn which are
330 not bound (BOUND_P) and the input register REG (its operand number
331 OP_NUM) which dies in the insn as if there were a move insn between
332 them with frequency FREQ. */
334 process_reg_shuffles (rtx reg
, int op_num
, int freq
, bool *bound_p
)
339 gcc_assert (REG_SUBREG_P (reg
));
340 for (i
= 0; i
< recog_data
.n_operands
; i
++)
342 another_reg
= recog_data
.operand
[i
];
344 if (!REG_SUBREG_P (another_reg
) || op_num
== i
345 || recog_data
.operand_type
[i
] != OP_OUT
349 process_regs_for_copy (reg
, another_reg
, false, NULL
, freq
);
353 /* Process INSN and create allocno copies if necessary. For example,
354 it might be because INSN is a pseudo-register move or INSN is two
357 add_insn_allocno_copies (rtx_insn
*insn
)
359 rtx set
, operand
, dup
;
360 bool bound_p
[MAX_RECOG_OPERANDS
];
364 freq
= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn
));
367 if ((set
= single_set (insn
)) != NULL_RTX
368 && REG_SUBREG_P (SET_DEST (set
)) && REG_SUBREG_P (SET_SRC (set
))
369 && ! side_effects_p (set
)
370 && find_reg_note (insn
, REG_DEAD
,
371 REG_P (SET_SRC (set
))
373 : SUBREG_REG (SET_SRC (set
))) != NULL_RTX
)
375 process_regs_for_copy (SET_SRC (set
), SET_DEST (set
),
379 /* Fast check of possibility of constraint or shuffle copies. If
380 there are no dead registers, there will be no such copies. */
381 if (! find_reg_note (insn
, REG_DEAD
, NULL_RTX
))
383 ira_setup_alts (insn
, alts
);
384 for (i
= 0; i
< recog_data
.n_operands
; i
++)
386 for (i
= 0; i
< recog_data
.n_operands
; i
++)
388 operand
= recog_data
.operand
[i
];
389 if (! REG_SUBREG_P (operand
))
391 if ((n
= ira_get_dup_out_num (i
, alts
)) >= 0)
394 dup
= recog_data
.operand
[n
];
395 if (REG_SUBREG_P (dup
)
396 && find_reg_note (insn
, REG_DEAD
,
399 : SUBREG_REG (operand
)) != NULL_RTX
)
400 process_regs_for_copy (operand
, dup
, true, NULL
,
404 for (i
= 0; i
< recog_data
.n_operands
; i
++)
406 operand
= recog_data
.operand
[i
];
407 if (REG_SUBREG_P (operand
)
408 && find_reg_note (insn
, REG_DEAD
,
410 ? operand
: SUBREG_REG (operand
)) != NULL_RTX
)
411 /* If an operand dies, prefer its hard register for the output
412 operands by decreasing the hard register cost or creating
413 the corresponding allocno copies. The cost will not
414 correspond to a real move insn cost, so make the frequency
416 process_reg_shuffles (operand
, i
, freq
< 8 ? 1 : freq
/ 8, bound_p
);
420 /* Add copies originated from BB given by LOOP_TREE_NODE. */
422 add_copies (ira_loop_tree_node_t loop_tree_node
)
427 bb
= loop_tree_node
->bb
;
430 FOR_BB_INSNS (bb
, insn
)
431 if (NONDEBUG_INSN_P (insn
))
432 add_insn_allocno_copies (insn
);
435 /* Propagate copies the corresponding allocnos on upper loop tree
438 propagate_copies (void)
441 ira_copy_iterator ci
;
442 ira_allocno_t a1
, a2
, parent_a1
, parent_a2
;
444 FOR_EACH_COPY (cp
, ci
)
448 if (ALLOCNO_LOOP_TREE_NODE (a1
) == ira_loop_tree_root
)
450 ira_assert ((ALLOCNO_LOOP_TREE_NODE (a2
) != ira_loop_tree_root
));
451 parent_a1
= ira_parent_or_cap_allocno (a1
);
452 parent_a2
= ira_parent_or_cap_allocno (a2
);
453 ira_assert (parent_a1
!= NULL
&& parent_a2
!= NULL
);
454 if (! allocnos_conflict_for_copy_p (parent_a1
, parent_a2
))
455 ira_add_allocno_copy (parent_a1
, parent_a2
, cp
->freq
,
456 cp
->constraint_p
, cp
->insn
, cp
->loop_tree_node
);
460 /* Array used to collect all conflict allocnos for given allocno. */
461 static ira_object_t
*collected_conflict_objects
;
463 /* Build conflict vectors or bit conflict vectors (whatever is more
464 profitable) for object OBJ from the conflict table. */
466 build_object_conflicts (ira_object_t obj
)
468 int i
, px
, parent_num
;
469 ira_allocno_t parent_a
, another_parent_a
;
470 ira_object_t parent_obj
;
471 ira_allocno_t a
= OBJECT_ALLOCNO (obj
);
472 IRA_INT_TYPE
*object_conflicts
;
473 minmax_set_iterator asi
;
474 int parent_min
, parent_max ATTRIBUTE_UNUSED
;
476 object_conflicts
= conflicts
[OBJECT_CONFLICT_ID (obj
)];
478 FOR_EACH_BIT_IN_MINMAX_SET (object_conflicts
,
479 OBJECT_MIN (obj
), OBJECT_MAX (obj
), i
, asi
)
481 ira_object_t another_obj
= ira_object_id_map
[i
];
482 ira_allocno_t another_a
= OBJECT_ALLOCNO (obj
);
484 ira_assert (ira_reg_classes_intersect_p
485 [ALLOCNO_CLASS (a
)][ALLOCNO_CLASS (another_a
)]);
486 collected_conflict_objects
[px
++] = another_obj
;
488 if (ira_conflict_vector_profitable_p (obj
, px
))
491 ira_allocate_conflict_vec (obj
, px
);
492 vec
= OBJECT_CONFLICT_VEC (obj
);
493 memcpy (vec
, collected_conflict_objects
, sizeof (ira_object_t
) * px
);
495 OBJECT_NUM_CONFLICTS (obj
) = px
;
499 int conflict_bit_vec_words_num
;
501 OBJECT_CONFLICT_ARRAY (obj
) = object_conflicts
;
502 if (OBJECT_MAX (obj
) < OBJECT_MIN (obj
))
503 conflict_bit_vec_words_num
= 0;
505 conflict_bit_vec_words_num
506 = ((OBJECT_MAX (obj
) - OBJECT_MIN (obj
) + IRA_INT_BITS
)
508 OBJECT_CONFLICT_ARRAY_SIZE (obj
)
509 = conflict_bit_vec_words_num
* sizeof (IRA_INT_TYPE
);
512 parent_a
= ira_parent_or_cap_allocno (a
);
513 if (parent_a
== NULL
)
515 ira_assert (ALLOCNO_CLASS (a
) == ALLOCNO_CLASS (parent_a
));
516 ira_assert (ALLOCNO_NUM_OBJECTS (a
) == ALLOCNO_NUM_OBJECTS (parent_a
));
517 parent_obj
= ALLOCNO_OBJECT (parent_a
, OBJECT_SUBWORD (obj
));
518 parent_num
= OBJECT_CONFLICT_ID (parent_obj
);
519 parent_min
= OBJECT_MIN (parent_obj
);
520 parent_max
= OBJECT_MAX (parent_obj
);
521 FOR_EACH_BIT_IN_MINMAX_SET (object_conflicts
,
522 OBJECT_MIN (obj
), OBJECT_MAX (obj
), i
, asi
)
524 ira_object_t another_obj
= ira_object_id_map
[i
];
525 ira_allocno_t another_a
= OBJECT_ALLOCNO (another_obj
);
526 int another_word
= OBJECT_SUBWORD (another_obj
);
528 ira_assert (ira_reg_classes_intersect_p
529 [ALLOCNO_CLASS (a
)][ALLOCNO_CLASS (another_a
)]);
531 another_parent_a
= ira_parent_or_cap_allocno (another_a
);
532 if (another_parent_a
== NULL
)
534 ira_assert (ALLOCNO_NUM (another_parent_a
) >= 0);
535 ira_assert (ALLOCNO_CLASS (another_a
)
536 == ALLOCNO_CLASS (another_parent_a
));
537 ira_assert (ALLOCNO_NUM_OBJECTS (another_a
)
538 == ALLOCNO_NUM_OBJECTS (another_parent_a
));
539 SET_MINMAX_SET_BIT (conflicts
[parent_num
],
540 OBJECT_CONFLICT_ID (ALLOCNO_OBJECT (another_parent_a
,
542 parent_min
, parent_max
);
546 /* Build conflict vectors or bit conflict vectors (whatever is more
547 profitable) of all allocnos from the conflict table. */
549 build_conflicts (void)
552 ira_allocno_t a
, cap
;
554 collected_conflict_objects
555 = (ira_object_t
*) ira_allocate (sizeof (ira_object_t
)
557 for (i
= max_reg_num () - 1; i
>= FIRST_PSEUDO_REGISTER
; i
--)
558 for (a
= ira_regno_allocno_map
[i
];
560 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
562 int j
, nregs
= ALLOCNO_NUM_OBJECTS (a
);
563 for (j
= 0; j
< nregs
; j
++)
565 ira_object_t obj
= ALLOCNO_OBJECT (a
, j
);
566 build_object_conflicts (obj
);
567 for (cap
= ALLOCNO_CAP (a
); cap
!= NULL
; cap
= ALLOCNO_CAP (cap
))
569 ira_object_t cap_obj
= ALLOCNO_OBJECT (cap
, j
);
570 gcc_assert (ALLOCNO_NUM_OBJECTS (cap
) == ALLOCNO_NUM_OBJECTS (a
));
571 build_object_conflicts (cap_obj
);
575 ira_free (collected_conflict_objects
);
580 /* Print hard reg set SET with TITLE to FILE. */
582 print_hard_reg_set (FILE *file
, const char *title
, HARD_REG_SET set
)
587 for (start
= -1, i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
589 if (TEST_HARD_REG_BIT (set
, i
))
591 if (i
== 0 || ! TEST_HARD_REG_BIT (set
, i
- 1))
595 && (i
== FIRST_PSEUDO_REGISTER
- 1 || ! TEST_HARD_REG_BIT (set
, i
)))
598 fprintf (file
, " %d", start
);
599 else if (start
== i
- 2)
600 fprintf (file
, " %d %d", start
, start
+ 1);
602 fprintf (file
, " %d-%d", start
, i
- 1);
610 print_allocno_conflicts (FILE * file
, bool reg_p
, ira_allocno_t a
)
612 HARD_REG_SET conflicting_hard_regs
;
617 fprintf (file
, ";; r%d", ALLOCNO_REGNO (a
));
620 fprintf (file
, ";; a%d(r%d,", ALLOCNO_NUM (a
), ALLOCNO_REGNO (a
));
621 if ((bb
= ALLOCNO_LOOP_TREE_NODE (a
)->bb
) != NULL
)
622 fprintf (file
, "b%d", bb
->index
);
624 fprintf (file
, "l%d", ALLOCNO_LOOP_TREE_NODE (a
)->loop_num
);
628 fputs (" conflicts:", file
);
629 n
= ALLOCNO_NUM_OBJECTS (a
);
630 for (i
= 0; i
< n
; i
++)
632 ira_object_t obj
= ALLOCNO_OBJECT (a
, i
);
633 ira_object_t conflict_obj
;
634 ira_object_conflict_iterator oci
;
636 if (OBJECT_CONFLICT_ARRAY (obj
) == NULL
)
639 fprintf (file
, "\n;; subobject %d:", i
);
640 FOR_EACH_OBJECT_CONFLICT (obj
, conflict_obj
, oci
)
642 ira_allocno_t conflict_a
= OBJECT_ALLOCNO (conflict_obj
);
644 fprintf (file
, " r%d,", ALLOCNO_REGNO (conflict_a
));
647 fprintf (file
, " a%d(r%d", ALLOCNO_NUM (conflict_a
),
648 ALLOCNO_REGNO (conflict_a
));
649 if (ALLOCNO_NUM_OBJECTS (conflict_a
) > 1)
650 fprintf (file
, ",w%d", OBJECT_SUBWORD (conflict_obj
));
651 if ((bb
= ALLOCNO_LOOP_TREE_NODE (conflict_a
)->bb
) != NULL
)
652 fprintf (file
, ",b%d", bb
->index
);
654 fprintf (file
, ",l%d",
655 ALLOCNO_LOOP_TREE_NODE (conflict_a
)->loop_num
);
659 COPY_HARD_REG_SET (conflicting_hard_regs
, OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
));
660 AND_COMPL_HARD_REG_SET (conflicting_hard_regs
, ira_no_alloc_regs
);
661 AND_HARD_REG_SET (conflicting_hard_regs
,
662 reg_class_contents
[ALLOCNO_CLASS (a
)]);
663 print_hard_reg_set (file
, "\n;; total conflict hard regs:",
664 conflicting_hard_regs
);
666 COPY_HARD_REG_SET (conflicting_hard_regs
, OBJECT_CONFLICT_HARD_REGS (obj
));
667 AND_COMPL_HARD_REG_SET (conflicting_hard_regs
, ira_no_alloc_regs
);
668 AND_HARD_REG_SET (conflicting_hard_regs
,
669 reg_class_contents
[ALLOCNO_CLASS (a
)]);
670 print_hard_reg_set (file
, ";; conflict hard regs:",
671 conflicting_hard_regs
);
677 /* Print information about allocno or only regno (if REG_P) conflicts
680 print_conflicts (FILE *file
, bool reg_p
)
683 ira_allocno_iterator ai
;
685 FOR_EACH_ALLOCNO (a
, ai
)
686 print_allocno_conflicts (file
, reg_p
, a
);
689 /* Print information about allocno or only regno (if REG_P) conflicts
692 ira_debug_conflicts (bool reg_p
)
694 print_conflicts (stderr
, reg_p
);
699 /* Entry function which builds allocno conflicts and allocno copies
700 and accumulate some allocno info on upper level regions. */
702 ira_build_conflicts (void)
706 ira_allocno_iterator ai
;
707 HARD_REG_SET temp_hard_reg_set
;
711 ira_conflicts_p
= build_conflict_bit_table ();
715 ira_object_iterator oi
;
718 ira_traverse_loop_tree (true, ira_loop_tree_root
, add_copies
, NULL
);
719 /* We need finished conflict table for the subsequent call. */
720 if (flag_ira_region
== IRA_REGION_ALL
721 || flag_ira_region
== IRA_REGION_MIXED
)
724 /* Now we can free memory for the conflict table (see function
725 build_object_conflicts for details). */
726 FOR_EACH_OBJECT (obj
, oi
)
728 if (OBJECT_CONFLICT_ARRAY (obj
) != conflicts
[OBJECT_CONFLICT_ID (obj
)])
729 ira_free (conflicts
[OBJECT_CONFLICT_ID (obj
)]);
731 ira_free (conflicts
);
734 base
= base_reg_class (VOIDmode
, ADDR_SPACE_GENERIC
, ADDRESS
, SCRATCH
);
735 if (! targetm
.class_likely_spilled_p (base
))
736 CLEAR_HARD_REG_SET (temp_hard_reg_set
);
739 COPY_HARD_REG_SET (temp_hard_reg_set
, reg_class_contents
[base
]);
740 AND_COMPL_HARD_REG_SET (temp_hard_reg_set
, ira_no_alloc_regs
);
741 AND_HARD_REG_SET (temp_hard_reg_set
, call_used_reg_set
);
743 FOR_EACH_ALLOCNO (a
, ai
)
745 int i
, n
= ALLOCNO_NUM_OBJECTS (a
);
747 for (i
= 0; i
< n
; i
++)
749 ira_object_t obj
= ALLOCNO_OBJECT (a
, i
);
750 rtx allocno_reg
= regno_reg_rtx
[ALLOCNO_REGNO (a
)];
752 if ((! flag_caller_saves
&& ALLOCNO_CALLS_CROSSED_NUM (a
) != 0)
753 /* For debugging purposes don't put user defined variables in
754 callee-clobbered registers. However, do allow parameters
755 in callee-clobbered registers to improve debugging. This
756 is a bit of a fragile hack. */
758 && REG_USERVAR_P (allocno_reg
)
759 && ! reg_is_parm_p (allocno_reg
)))
761 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
),
763 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
),
766 else if (ALLOCNO_CALLS_CROSSED_NUM (a
) != 0)
768 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
),
769 no_caller_save_reg_set
);
770 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
),
772 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
),
773 no_caller_save_reg_set
);
774 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
),
778 /* Now we deal with paradoxical subreg cases where certain registers
779 cannot be accessed in the widest mode. */
780 machine_mode outer_mode
= ALLOCNO_WMODE (a
);
781 machine_mode inner_mode
= ALLOCNO_MODE (a
);
782 if (GET_MODE_SIZE (outer_mode
) > GET_MODE_SIZE (inner_mode
))
784 enum reg_class aclass
= ALLOCNO_CLASS (a
);
785 for (int j
= ira_class_hard_regs_num
[aclass
] - 1; j
>= 0; --j
)
787 int inner_regno
= ira_class_hard_regs
[aclass
][j
];
788 int outer_regno
= simplify_subreg_regno (inner_regno
,
792 || !in_hard_reg_set_p (reg_class_contents
[aclass
],
793 outer_mode
, outer_regno
))
794 SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj
),
799 if (ALLOCNO_CALLS_CROSSED_NUM (a
) != 0)
803 /* Allocnos bigger than the saved part of call saved
804 regs must conflict with them. */
805 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
806 if (!TEST_HARD_REG_BIT (call_used_reg_set
, regno
)
807 && HARD_REGNO_CALL_PART_CLOBBERED (regno
,
810 SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj
), regno
);
811 SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
),
817 if (optimize
&& ira_conflicts_p
818 && internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
819 print_conflicts (ira_dump_file
, false);