PR target/66563
[official-gcc.git] / gcc / ira-conflicts.c
blobb999c59940a64cb4aa10d28606384f5cb5c09095
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
10 version.
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
15 for more details.
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 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "regs.h"
26 #include "rtl.h"
27 #include "tm_p.h"
28 #include "target.h"
29 #include "flags.h"
30 #include "hard-reg-set.h"
31 #include "predict.h"
32 #include "function.h"
33 #include "basic-block.h"
34 #include "insn-config.h"
35 #include "recog.h"
36 #include "diagnostic-core.h"
37 #include "params.h"
38 #include "df.h"
39 #include "sparseset.h"
40 #include "ira-int.h"
41 #include "addresses.h"
43 /* This file contains code responsible for allocno conflict creation,
44 allocno copy creation and allocno info accumulation on upper level
45 regions. */
47 /* ira_allocnos_num array of arrays of bits, recording whether two
48 allocno's conflict (can't go in the same hardware register).
50 Some arrays will be used as conflict bit vector of the
51 corresponding allocnos see function build_object_conflicts. */
52 static IRA_INT_TYPE **conflicts;
54 /* Macro to test a conflict of C1 and C2 in `conflicts'. */
55 #define OBJECTS_CONFLICT_P(C1, C2) \
56 (OBJECT_MIN (C1) <= OBJECT_CONFLICT_ID (C2) \
57 && OBJECT_CONFLICT_ID (C2) <= OBJECT_MAX (C1) \
58 && TEST_MINMAX_SET_BIT (conflicts[OBJECT_CONFLICT_ID (C1)], \
59 OBJECT_CONFLICT_ID (C2), \
60 OBJECT_MIN (C1), OBJECT_MAX (C1)))
63 /* Record a conflict between objects OBJ1 and OBJ2. If necessary,
64 canonicalize the conflict by recording it for lower-order subobjects
65 of the corresponding allocnos. */
66 static void
67 record_object_conflict (ira_object_t obj1, ira_object_t obj2)
69 ira_allocno_t a1 = OBJECT_ALLOCNO (obj1);
70 ira_allocno_t a2 = OBJECT_ALLOCNO (obj2);
71 int w1 = OBJECT_SUBWORD (obj1);
72 int w2 = OBJECT_SUBWORD (obj2);
73 int id1, id2;
75 /* Canonicalize the conflict. If two identically-numbered words
76 conflict, always record this as a conflict between words 0. That
77 is the only information we need, and it is easier to test for if
78 it is collected in each allocno's lowest-order object. */
79 if (w1 == w2 && w1 > 0)
81 obj1 = ALLOCNO_OBJECT (a1, 0);
82 obj2 = ALLOCNO_OBJECT (a2, 0);
84 id1 = OBJECT_CONFLICT_ID (obj1);
85 id2 = OBJECT_CONFLICT_ID (obj2);
87 SET_MINMAX_SET_BIT (conflicts[id1], id2, OBJECT_MIN (obj1),
88 OBJECT_MAX (obj1));
89 SET_MINMAX_SET_BIT (conflicts[id2], id1, OBJECT_MIN (obj2),
90 OBJECT_MAX (obj2));
93 /* Build allocno conflict table by processing allocno live ranges.
94 Return true if the table was built. The table is not built if it
95 is too big. */
96 static bool
97 build_conflict_bit_table (void)
99 int i;
100 unsigned int j;
101 enum reg_class aclass;
102 int object_set_words, allocated_words_num, conflict_bit_vec_words_num;
103 live_range_t r;
104 ira_allocno_t allocno;
105 ira_allocno_iterator ai;
106 sparseset objects_live;
107 ira_object_t obj;
108 ira_allocno_object_iterator aoi;
110 allocated_words_num = 0;
111 FOR_EACH_ALLOCNO (allocno, ai)
112 FOR_EACH_ALLOCNO_OBJECT (allocno, obj, aoi)
114 if (OBJECT_MAX (obj) < OBJECT_MIN (obj))
115 continue;
116 conflict_bit_vec_words_num
117 = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
118 / IRA_INT_BITS);
119 allocated_words_num += conflict_bit_vec_words_num;
120 if ((uint64_t) allocated_words_num * sizeof (IRA_INT_TYPE)
121 > (uint64_t) IRA_MAX_CONFLICT_TABLE_SIZE * 1024 * 1024)
123 if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
124 fprintf
125 (ira_dump_file,
126 "+++Conflict table will be too big(>%dMB) -- don't use it\n",
127 IRA_MAX_CONFLICT_TABLE_SIZE);
128 return false;
132 conflicts = (IRA_INT_TYPE **) ira_allocate (sizeof (IRA_INT_TYPE *)
133 * ira_objects_num);
134 allocated_words_num = 0;
135 FOR_EACH_ALLOCNO (allocno, ai)
136 FOR_EACH_ALLOCNO_OBJECT (allocno, obj, aoi)
138 int id = OBJECT_CONFLICT_ID (obj);
139 if (OBJECT_MAX (obj) < OBJECT_MIN (obj))
141 conflicts[id] = NULL;
142 continue;
144 conflict_bit_vec_words_num
145 = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
146 / IRA_INT_BITS);
147 allocated_words_num += conflict_bit_vec_words_num;
148 conflicts[id]
149 = (IRA_INT_TYPE *) ira_allocate (sizeof (IRA_INT_TYPE)
150 * conflict_bit_vec_words_num);
151 memset (conflicts[id], 0,
152 sizeof (IRA_INT_TYPE) * conflict_bit_vec_words_num);
155 object_set_words = (ira_objects_num + IRA_INT_BITS - 1) / IRA_INT_BITS;
156 if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
157 fprintf
158 (ira_dump_file,
159 "+++Allocating %ld bytes for conflict table (uncompressed size %ld)\n",
160 (long) allocated_words_num * sizeof (IRA_INT_TYPE),
161 (long) object_set_words * ira_objects_num * sizeof (IRA_INT_TYPE));
163 objects_live = sparseset_alloc (ira_objects_num);
164 for (i = 0; i < ira_max_point; i++)
166 for (r = ira_start_point_ranges[i]; r != NULL; r = r->start_next)
168 ira_object_t obj = r->object;
169 ira_allocno_t allocno = OBJECT_ALLOCNO (obj);
170 int id = OBJECT_CONFLICT_ID (obj);
172 gcc_assert (id < ira_objects_num);
174 aclass = ALLOCNO_CLASS (allocno);
175 EXECUTE_IF_SET_IN_SPARSESET (objects_live, j)
177 ira_object_t live_obj = ira_object_id_map[j];
178 ira_allocno_t live_a = OBJECT_ALLOCNO (live_obj);
179 enum reg_class live_aclass = ALLOCNO_CLASS (live_a);
181 if (ira_reg_classes_intersect_p[aclass][live_aclass]
182 /* Don't set up conflict for the allocno with itself. */
183 && live_a != allocno)
185 record_object_conflict (obj, live_obj);
188 sparseset_set_bit (objects_live, id);
191 for (r = ira_finish_point_ranges[i]; r != NULL; r = r->finish_next)
192 sparseset_clear_bit (objects_live, OBJECT_CONFLICT_ID (r->object));
194 sparseset_free (objects_live);
195 return true;
198 /* Return true iff allocnos A1 and A2 cannot be allocated to the same
199 register due to conflicts. */
201 static bool
202 allocnos_conflict_for_copy_p (ira_allocno_t a1, ira_allocno_t a2)
204 /* Due to the fact that we canonicalize conflicts (see
205 record_object_conflict), we only need to test for conflicts of
206 the lowest order words. */
207 ira_object_t obj1 = ALLOCNO_OBJECT (a1, 0);
208 ira_object_t obj2 = ALLOCNO_OBJECT (a2, 0);
210 return OBJECTS_CONFLICT_P (obj1, obj2);
213 /* Check that X is REG or SUBREG of REG. */
214 #define REG_SUBREG_P(x) \
215 (REG_P (x) || (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))))
217 /* Return X if X is a REG, otherwise it should be SUBREG of REG and
218 the function returns the reg in this case. *OFFSET will be set to
219 0 in the first case or the regno offset in the first case. */
220 static rtx
221 go_through_subreg (rtx x, int *offset)
223 rtx reg;
225 *offset = 0;
226 if (REG_P (x))
227 return x;
228 ira_assert (GET_CODE (x) == SUBREG);
229 reg = SUBREG_REG (x);
230 ira_assert (REG_P (reg));
231 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
232 *offset = subreg_regno_offset (REGNO (reg), GET_MODE (reg),
233 SUBREG_BYTE (x), GET_MODE (x));
234 else
235 *offset = (SUBREG_BYTE (x) / REGMODE_NATURAL_SIZE (GET_MODE (x)));
236 return reg;
239 /* Process registers REG1 and REG2 in move INSN with execution
240 frequency FREQ. The function also processes the registers in a
241 potential move insn (INSN == NULL in this case) with frequency
242 FREQ. The function can modify hard register costs of the
243 corresponding allocnos or create a copy involving the corresponding
244 allocnos. The function does nothing if the both registers are hard
245 registers. When nothing is changed, the function returns
246 FALSE. */
247 static bool
248 process_regs_for_copy (rtx reg1, rtx reg2, bool constraint_p,
249 rtx_insn *insn, int freq)
251 int allocno_preferenced_hard_regno, cost, index, offset1, offset2;
252 bool only_regs_p;
253 ira_allocno_t a;
254 reg_class_t rclass, aclass;
255 machine_mode mode;
256 ira_copy_t cp;
258 gcc_assert (REG_SUBREG_P (reg1) && REG_SUBREG_P (reg2));
259 only_regs_p = REG_P (reg1) && REG_P (reg2);
260 reg1 = go_through_subreg (reg1, &offset1);
261 reg2 = go_through_subreg (reg2, &offset2);
262 /* Set up hard regno preferenced by allocno. If allocno gets the
263 hard regno the copy (or potential move) insn will be removed. */
264 if (HARD_REGISTER_P (reg1))
266 if (HARD_REGISTER_P (reg2))
267 return false;
268 allocno_preferenced_hard_regno = REGNO (reg1) + offset1 - offset2;
269 a = ira_curr_regno_allocno_map[REGNO (reg2)];
271 else if (HARD_REGISTER_P (reg2))
273 allocno_preferenced_hard_regno = REGNO (reg2) + offset2 - offset1;
274 a = ira_curr_regno_allocno_map[REGNO (reg1)];
276 else
278 ira_allocno_t a1 = ira_curr_regno_allocno_map[REGNO (reg1)];
279 ira_allocno_t a2 = ira_curr_regno_allocno_map[REGNO (reg2)];
281 if (!allocnos_conflict_for_copy_p (a1, a2) && offset1 == offset2)
283 cp = ira_add_allocno_copy (a1, a2, freq, constraint_p, insn,
284 ira_curr_loop_tree_node);
285 bitmap_set_bit (ira_curr_loop_tree_node->local_copies, cp->num);
286 return true;
288 else
289 return false;
292 if (! IN_RANGE (allocno_preferenced_hard_regno,
293 0, FIRST_PSEUDO_REGISTER - 1))
294 /* Can not be tied. */
295 return false;
296 rclass = REGNO_REG_CLASS (allocno_preferenced_hard_regno);
297 mode = ALLOCNO_MODE (a);
298 aclass = ALLOCNO_CLASS (a);
299 if (only_regs_p && insn != NULL_RTX
300 && reg_class_size[rclass] <= ira_reg_class_max_nregs [rclass][mode])
301 /* It is already taken into account in ira-costs.c. */
302 return false;
303 index = ira_class_hard_reg_index[aclass][allocno_preferenced_hard_regno];
304 if (index < 0)
305 /* Can not be tied. It is not in the allocno class. */
306 return false;
307 ira_init_register_move_cost_if_necessary (mode);
308 if (HARD_REGISTER_P (reg1))
309 cost = ira_register_move_cost[mode][aclass][rclass] * freq;
310 else
311 cost = ira_register_move_cost[mode][rclass][aclass] * freq;
314 ira_allocate_and_set_costs
315 (&ALLOCNO_HARD_REG_COSTS (a), aclass,
316 ALLOCNO_CLASS_COST (a));
317 ira_allocate_and_set_costs
318 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a), aclass, 0);
319 ALLOCNO_HARD_REG_COSTS (a)[index] -= cost;
320 ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[index] -= cost;
321 if (ALLOCNO_HARD_REG_COSTS (a)[index] < ALLOCNO_CLASS_COST (a))
322 ALLOCNO_CLASS_COST (a) = ALLOCNO_HARD_REG_COSTS (a)[index];
323 ira_add_allocno_pref (a, allocno_preferenced_hard_regno, freq);
324 a = ira_parent_or_cap_allocno (a);
326 while (a != NULL);
327 return true;
330 /* Process all of the output registers of the current insn which are
331 not bound (BOUND_P) and the input register REG (its operand number
332 OP_NUM) which dies in the insn as if there were a move insn between
333 them with frequency FREQ. */
334 static void
335 process_reg_shuffles (rtx reg, int op_num, int freq, bool *bound_p)
337 int i;
338 rtx another_reg;
340 gcc_assert (REG_SUBREG_P (reg));
341 for (i = 0; i < recog_data.n_operands; i++)
343 another_reg = recog_data.operand[i];
345 if (!REG_SUBREG_P (another_reg) || op_num == i
346 || recog_data.operand_type[i] != OP_OUT
347 || bound_p[i])
348 continue;
350 process_regs_for_copy (reg, another_reg, false, NULL, freq);
354 /* Process INSN and create allocno copies if necessary. For example,
355 it might be because INSN is a pseudo-register move or INSN is two
356 operand insn. */
357 static void
358 add_insn_allocno_copies (rtx_insn *insn)
360 rtx set, operand, dup;
361 bool bound_p[MAX_RECOG_OPERANDS];
362 int i, n, freq;
363 HARD_REG_SET alts;
365 freq = REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn));
366 if (freq == 0)
367 freq = 1;
368 if ((set = single_set (insn)) != NULL_RTX
369 && REG_SUBREG_P (SET_DEST (set)) && REG_SUBREG_P (SET_SRC (set))
370 && ! side_effects_p (set)
371 && find_reg_note (insn, REG_DEAD,
372 REG_P (SET_SRC (set))
373 ? SET_SRC (set)
374 : SUBREG_REG (SET_SRC (set))) != NULL_RTX)
376 process_regs_for_copy (SET_SRC (set), SET_DEST (set),
377 false, insn, freq);
378 return;
380 /* Fast check of possibility of constraint or shuffle copies. If
381 there are no dead registers, there will be no such copies. */
382 if (! find_reg_note (insn, REG_DEAD, NULL_RTX))
383 return;
384 ira_setup_alts (insn, alts);
385 for (i = 0; i < recog_data.n_operands; i++)
386 bound_p[i] = false;
387 for (i = 0; i < recog_data.n_operands; i++)
389 operand = recog_data.operand[i];
390 if (! REG_SUBREG_P (operand))
391 continue;
392 if ((n = ira_get_dup_out_num (i, alts)) >= 0)
394 bound_p[n] = true;
395 dup = recog_data.operand[n];
396 if (REG_SUBREG_P (dup)
397 && find_reg_note (insn, REG_DEAD,
398 REG_P (operand)
399 ? operand
400 : SUBREG_REG (operand)) != NULL_RTX)
401 process_regs_for_copy (operand, dup, true, NULL,
402 freq);
405 for (i = 0; i < recog_data.n_operands; i++)
407 operand = recog_data.operand[i];
408 if (REG_SUBREG_P (operand)
409 && find_reg_note (insn, REG_DEAD,
410 REG_P (operand)
411 ? operand : SUBREG_REG (operand)) != NULL_RTX)
412 /* If an operand dies, prefer its hard register for the output
413 operands by decreasing the hard register cost or creating
414 the corresponding allocno copies. The cost will not
415 correspond to a real move insn cost, so make the frequency
416 smaller. */
417 process_reg_shuffles (operand, i, freq < 8 ? 1 : freq / 8, bound_p);
421 /* Add copies originated from BB given by LOOP_TREE_NODE. */
422 static void
423 add_copies (ira_loop_tree_node_t loop_tree_node)
425 basic_block bb;
426 rtx_insn *insn;
428 bb = loop_tree_node->bb;
429 if (bb == NULL)
430 return;
431 FOR_BB_INSNS (bb, insn)
432 if (NONDEBUG_INSN_P (insn))
433 add_insn_allocno_copies (insn);
436 /* Propagate copies the corresponding allocnos on upper loop tree
437 level. */
438 static void
439 propagate_copies (void)
441 ira_copy_t cp;
442 ira_copy_iterator ci;
443 ira_allocno_t a1, a2, parent_a1, parent_a2;
445 FOR_EACH_COPY (cp, ci)
447 a1 = cp->first;
448 a2 = cp->second;
449 if (ALLOCNO_LOOP_TREE_NODE (a1) == ira_loop_tree_root)
450 continue;
451 ira_assert ((ALLOCNO_LOOP_TREE_NODE (a2) != ira_loop_tree_root));
452 parent_a1 = ira_parent_or_cap_allocno (a1);
453 parent_a2 = ira_parent_or_cap_allocno (a2);
454 ira_assert (parent_a1 != NULL && parent_a2 != NULL);
455 if (! allocnos_conflict_for_copy_p (parent_a1, parent_a2))
456 ira_add_allocno_copy (parent_a1, parent_a2, cp->freq,
457 cp->constraint_p, cp->insn, cp->loop_tree_node);
461 /* Array used to collect all conflict allocnos for given allocno. */
462 static ira_object_t *collected_conflict_objects;
464 /* Build conflict vectors or bit conflict vectors (whatever is more
465 profitable) for object OBJ from the conflict table. */
466 static void
467 build_object_conflicts (ira_object_t obj)
469 int i, px, parent_num;
470 ira_allocno_t parent_a, another_parent_a;
471 ira_object_t parent_obj;
472 ira_allocno_t a = OBJECT_ALLOCNO (obj);
473 IRA_INT_TYPE *object_conflicts;
474 minmax_set_iterator asi;
475 int parent_min, parent_max ATTRIBUTE_UNUSED;
477 object_conflicts = conflicts[OBJECT_CONFLICT_ID (obj)];
478 px = 0;
479 FOR_EACH_BIT_IN_MINMAX_SET (object_conflicts,
480 OBJECT_MIN (obj), OBJECT_MAX (obj), i, asi)
482 ira_object_t another_obj = ira_object_id_map[i];
483 ira_allocno_t another_a = OBJECT_ALLOCNO (obj);
485 ira_assert (ira_reg_classes_intersect_p
486 [ALLOCNO_CLASS (a)][ALLOCNO_CLASS (another_a)]);
487 collected_conflict_objects[px++] = another_obj;
489 if (ira_conflict_vector_profitable_p (obj, px))
491 ira_object_t *vec;
492 ira_allocate_conflict_vec (obj, px);
493 vec = OBJECT_CONFLICT_VEC (obj);
494 memcpy (vec, collected_conflict_objects, sizeof (ira_object_t) * px);
495 vec[px] = NULL;
496 OBJECT_NUM_CONFLICTS (obj) = px;
498 else
500 int conflict_bit_vec_words_num;
502 OBJECT_CONFLICT_ARRAY (obj) = object_conflicts;
503 if (OBJECT_MAX (obj) < OBJECT_MIN (obj))
504 conflict_bit_vec_words_num = 0;
505 else
506 conflict_bit_vec_words_num
507 = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
508 / IRA_INT_BITS);
509 OBJECT_CONFLICT_ARRAY_SIZE (obj)
510 = conflict_bit_vec_words_num * sizeof (IRA_INT_TYPE);
513 parent_a = ira_parent_or_cap_allocno (a);
514 if (parent_a == NULL)
515 return;
516 ira_assert (ALLOCNO_CLASS (a) == ALLOCNO_CLASS (parent_a));
517 ira_assert (ALLOCNO_NUM_OBJECTS (a) == ALLOCNO_NUM_OBJECTS (parent_a));
518 parent_obj = ALLOCNO_OBJECT (parent_a, OBJECT_SUBWORD (obj));
519 parent_num = OBJECT_CONFLICT_ID (parent_obj);
520 parent_min = OBJECT_MIN (parent_obj);
521 parent_max = OBJECT_MAX (parent_obj);
522 FOR_EACH_BIT_IN_MINMAX_SET (object_conflicts,
523 OBJECT_MIN (obj), OBJECT_MAX (obj), i, asi)
525 ira_object_t another_obj = ira_object_id_map[i];
526 ira_allocno_t another_a = OBJECT_ALLOCNO (another_obj);
527 int another_word = OBJECT_SUBWORD (another_obj);
529 ira_assert (ira_reg_classes_intersect_p
530 [ALLOCNO_CLASS (a)][ALLOCNO_CLASS (another_a)]);
532 another_parent_a = ira_parent_or_cap_allocno (another_a);
533 if (another_parent_a == NULL)
534 continue;
535 ira_assert (ALLOCNO_NUM (another_parent_a) >= 0);
536 ira_assert (ALLOCNO_CLASS (another_a)
537 == ALLOCNO_CLASS (another_parent_a));
538 ira_assert (ALLOCNO_NUM_OBJECTS (another_a)
539 == ALLOCNO_NUM_OBJECTS (another_parent_a));
540 SET_MINMAX_SET_BIT (conflicts[parent_num],
541 OBJECT_CONFLICT_ID (ALLOCNO_OBJECT (another_parent_a,
542 another_word)),
543 parent_min, parent_max);
547 /* Build conflict vectors or bit conflict vectors (whatever is more
548 profitable) of all allocnos from the conflict table. */
549 static void
550 build_conflicts (void)
552 int i;
553 ira_allocno_t a, cap;
555 collected_conflict_objects
556 = (ira_object_t *) ira_allocate (sizeof (ira_object_t)
557 * ira_objects_num);
558 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
559 for (a = ira_regno_allocno_map[i];
560 a != NULL;
561 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
563 int j, nregs = ALLOCNO_NUM_OBJECTS (a);
564 for (j = 0; j < nregs; j++)
566 ira_object_t obj = ALLOCNO_OBJECT (a, j);
567 build_object_conflicts (obj);
568 for (cap = ALLOCNO_CAP (a); cap != NULL; cap = ALLOCNO_CAP (cap))
570 ira_object_t cap_obj = ALLOCNO_OBJECT (cap, j);
571 gcc_assert (ALLOCNO_NUM_OBJECTS (cap) == ALLOCNO_NUM_OBJECTS (a));
572 build_object_conflicts (cap_obj);
576 ira_free (collected_conflict_objects);
581 /* Print hard reg set SET with TITLE to FILE. */
582 static void
583 print_hard_reg_set (FILE *file, const char *title, HARD_REG_SET set)
585 int i, start;
587 fputs (title, file);
588 for (start = -1, i = 0; i < FIRST_PSEUDO_REGISTER; i++)
590 if (TEST_HARD_REG_BIT (set, i))
592 if (i == 0 || ! TEST_HARD_REG_BIT (set, i - 1))
593 start = i;
595 if (start >= 0
596 && (i == FIRST_PSEUDO_REGISTER - 1 || ! TEST_HARD_REG_BIT (set, i)))
598 if (start == i - 1)
599 fprintf (file, " %d", start);
600 else if (start == i - 2)
601 fprintf (file, " %d %d", start, start + 1);
602 else
603 fprintf (file, " %d-%d", start, i - 1);
604 start = -1;
607 putc ('\n', file);
610 static void
611 print_allocno_conflicts (FILE * file, bool reg_p, ira_allocno_t a)
613 HARD_REG_SET conflicting_hard_regs;
614 basic_block bb;
615 int n, i;
617 if (reg_p)
618 fprintf (file, ";; r%d", ALLOCNO_REGNO (a));
619 else
621 fprintf (file, ";; a%d(r%d,", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
622 if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
623 fprintf (file, "b%d", bb->index);
624 else
625 fprintf (file, "l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
626 putc (')', file);
629 fputs (" conflicts:", file);
630 n = ALLOCNO_NUM_OBJECTS (a);
631 for (i = 0; i < n; i++)
633 ira_object_t obj = ALLOCNO_OBJECT (a, i);
634 ira_object_t conflict_obj;
635 ira_object_conflict_iterator oci;
637 if (OBJECT_CONFLICT_ARRAY (obj) == NULL)
638 continue;
639 if (n > 1)
640 fprintf (file, "\n;; subobject %d:", i);
641 FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
643 ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
644 if (reg_p)
645 fprintf (file, " r%d,", ALLOCNO_REGNO (conflict_a));
646 else
648 fprintf (file, " a%d(r%d", ALLOCNO_NUM (conflict_a),
649 ALLOCNO_REGNO (conflict_a));
650 if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1)
651 fprintf (file, ",w%d", OBJECT_SUBWORD (conflict_obj));
652 if ((bb = ALLOCNO_LOOP_TREE_NODE (conflict_a)->bb) != NULL)
653 fprintf (file, ",b%d", bb->index);
654 else
655 fprintf (file, ",l%d",
656 ALLOCNO_LOOP_TREE_NODE (conflict_a)->loop_num);
657 putc (')', file);
660 COPY_HARD_REG_SET (conflicting_hard_regs, OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
661 AND_COMPL_HARD_REG_SET (conflicting_hard_regs, ira_no_alloc_regs);
662 AND_HARD_REG_SET (conflicting_hard_regs,
663 reg_class_contents[ALLOCNO_CLASS (a)]);
664 print_hard_reg_set (file, "\n;; total conflict hard regs:",
665 conflicting_hard_regs);
667 COPY_HARD_REG_SET (conflicting_hard_regs, OBJECT_CONFLICT_HARD_REGS (obj));
668 AND_COMPL_HARD_REG_SET (conflicting_hard_regs, ira_no_alloc_regs);
669 AND_HARD_REG_SET (conflicting_hard_regs,
670 reg_class_contents[ALLOCNO_CLASS (a)]);
671 print_hard_reg_set (file, ";; conflict hard regs:",
672 conflicting_hard_regs);
673 putc ('\n', file);
678 /* Print information about allocno or only regno (if REG_P) conflicts
679 to FILE. */
680 static void
681 print_conflicts (FILE *file, bool reg_p)
683 ira_allocno_t a;
684 ira_allocno_iterator ai;
686 FOR_EACH_ALLOCNO (a, ai)
687 print_allocno_conflicts (file, reg_p, a);
690 /* Print information about allocno or only regno (if REG_P) conflicts
691 to stderr. */
692 void
693 ira_debug_conflicts (bool reg_p)
695 print_conflicts (stderr, reg_p);
700 /* Entry function which builds allocno conflicts and allocno copies
701 and accumulate some allocno info on upper level regions. */
702 void
703 ira_build_conflicts (void)
705 enum reg_class base;
706 ira_allocno_t a;
707 ira_allocno_iterator ai;
708 HARD_REG_SET temp_hard_reg_set;
710 if (ira_conflicts_p)
712 ira_conflicts_p = build_conflict_bit_table ();
713 if (ira_conflicts_p)
715 ira_object_t obj;
716 ira_object_iterator oi;
718 build_conflicts ();
719 ira_traverse_loop_tree (true, ira_loop_tree_root, add_copies, NULL);
720 /* We need finished conflict table for the subsequent call. */
721 if (flag_ira_region == IRA_REGION_ALL
722 || flag_ira_region == IRA_REGION_MIXED)
723 propagate_copies ();
725 /* Now we can free memory for the conflict table (see function
726 build_object_conflicts for details). */
727 FOR_EACH_OBJECT (obj, oi)
729 if (OBJECT_CONFLICT_ARRAY (obj) != conflicts[OBJECT_CONFLICT_ID (obj)])
730 ira_free (conflicts[OBJECT_CONFLICT_ID (obj)]);
732 ira_free (conflicts);
735 base = base_reg_class (VOIDmode, ADDR_SPACE_GENERIC, ADDRESS, SCRATCH);
736 if (! targetm.class_likely_spilled_p (base))
737 CLEAR_HARD_REG_SET (temp_hard_reg_set);
738 else
740 COPY_HARD_REG_SET (temp_hard_reg_set, reg_class_contents[base]);
741 AND_COMPL_HARD_REG_SET (temp_hard_reg_set, ira_no_alloc_regs);
742 AND_HARD_REG_SET (temp_hard_reg_set, call_used_reg_set);
744 FOR_EACH_ALLOCNO (a, ai)
746 int i, n = ALLOCNO_NUM_OBJECTS (a);
748 for (i = 0; i < n; i++)
750 ira_object_t obj = ALLOCNO_OBJECT (a, i);
751 rtx allocno_reg = regno_reg_rtx [ALLOCNO_REGNO (a)];
753 if ((! flag_caller_saves && ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
754 /* For debugging purposes don't put user defined variables in
755 callee-clobbered registers. However, do allow parameters
756 in callee-clobbered registers to improve debugging. This
757 is a bit of a fragile hack. */
758 || (optimize == 0
759 && REG_USERVAR_P (allocno_reg)
760 && ! reg_is_parm_p (allocno_reg)))
762 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
763 call_used_reg_set);
764 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
765 call_used_reg_set);
767 else if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
769 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
770 no_caller_save_reg_set);
771 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
772 temp_hard_reg_set);
773 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
774 no_caller_save_reg_set);
775 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
776 temp_hard_reg_set);
779 /* Now we deal with paradoxical subreg cases where certain registers
780 cannot be accessed in the widest mode. */
781 machine_mode outer_mode = ALLOCNO_WMODE (a);
782 machine_mode inner_mode = ALLOCNO_MODE (a);
783 if (GET_MODE_SIZE (outer_mode) > GET_MODE_SIZE (inner_mode))
785 enum reg_class aclass = ALLOCNO_CLASS (a);
786 for (int j = ira_class_hard_regs_num[aclass] - 1; j >= 0; --j)
788 int inner_regno = ira_class_hard_regs[aclass][j];
789 int outer_regno = simplify_subreg_regno (inner_regno,
790 inner_mode, 0,
791 outer_mode);
792 if (outer_regno < 0
793 || !in_hard_reg_set_p (reg_class_contents[aclass],
794 outer_mode, outer_regno))
795 SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj),
796 inner_regno);
800 if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
802 int regno;
804 /* Allocnos bigger than the saved part of call saved
805 regs must conflict with them. */
806 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
807 if (!TEST_HARD_REG_BIT (call_used_reg_set, regno)
808 && HARD_REGNO_CALL_PART_CLOBBERED (regno,
809 obj->allocno->mode))
811 SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno);
812 SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
813 regno);
818 if (optimize && ira_conflicts_p
819 && internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
820 print_conflicts (ira_dump_file, false);