]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ira-conflicts.c
Remove IOR_HARD_REG_SET
[thirdparty/gcc.git] / gcc / ira-conflicts.c
CommitLineData
058e97ec 1/* IRA conflict builder.
a5544970 2 Copyright (C) 2006-2019 Free Software Foundation, Inc.
058e97ec
VM
3 Contributed by Vladimir Makarov <vmakarov@redhat.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for 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"
c7131fb2 24#include "backend.h"
957060b5 25#include "target.h"
058e97ec 26#include "rtl.h"
957060b5 27#include "predict.h"
4d0cdd0c 28#include "memmodel.h"
058e97ec 29#include "tm_p.h"
058e97ec 30#include "insn-config.h"
957060b5
AM
31#include "regs.h"
32#include "ira.h"
33#include "ira-int.h"
058e97ec 34#include "params.h"
058e97ec 35#include "sparseset.h"
9c7c70ee 36#include "addresses.h"
058e97ec
VM
37
38/* This file contains code responsible for allocno conflict creation,
39 allocno copy creation and allocno info accumulation on upper level
40 regions. */
41
42/* ira_allocnos_num array of arrays of bits, recording whether two
43 allocno's conflict (can't go in the same hardware register).
44
45 Some arrays will be used as conflict bit vector of the
ac0ab4f7 46 corresponding allocnos see function build_object_conflicts. */
058e97ec
VM
47static IRA_INT_TYPE **conflicts;
48
a49ae217 49/* Macro to test a conflict of C1 and C2 in `conflicts'. */
ac0ab4f7 50#define OBJECTS_CONFLICT_P(C1, C2) \
a49ae217
BS
51 (OBJECT_MIN (C1) <= OBJECT_CONFLICT_ID (C2) \
52 && OBJECT_CONFLICT_ID (C2) <= OBJECT_MAX (C1) \
53 && TEST_MINMAX_SET_BIT (conflicts[OBJECT_CONFLICT_ID (C1)], \
54 OBJECT_CONFLICT_ID (C2), \
55 OBJECT_MIN (C1), OBJECT_MAX (C1)))
058e97ec
VM
56
57\f
ac0ab4f7
BS
58/* Record a conflict between objects OBJ1 and OBJ2. If necessary,
59 canonicalize the conflict by recording it for lower-order subobjects
2b9c63a2 60 of the corresponding allocnos. */
ac0ab4f7
BS
61static void
62record_object_conflict (ira_object_t obj1, ira_object_t obj2)
63{
64 ira_allocno_t a1 = OBJECT_ALLOCNO (obj1);
65 ira_allocno_t a2 = OBJECT_ALLOCNO (obj2);
66 int w1 = OBJECT_SUBWORD (obj1);
67 int w2 = OBJECT_SUBWORD (obj2);
68 int id1, id2;
69
70 /* Canonicalize the conflict. If two identically-numbered words
71 conflict, always record this as a conflict between words 0. That
72 is the only information we need, and it is easier to test for if
73 it is collected in each allocno's lowest-order object. */
74 if (w1 == w2 && w1 > 0)
75 {
76 obj1 = ALLOCNO_OBJECT (a1, 0);
77 obj2 = ALLOCNO_OBJECT (a2, 0);
78 }
79 id1 = OBJECT_CONFLICT_ID (obj1);
80 id2 = OBJECT_CONFLICT_ID (obj2);
81
82 SET_MINMAX_SET_BIT (conflicts[id1], id2, OBJECT_MIN (obj1),
83 OBJECT_MAX (obj1));
84 SET_MINMAX_SET_BIT (conflicts[id2], id1, OBJECT_MIN (obj2),
85 OBJECT_MAX (obj2));
86}
87
311aab06
VM
88/* Build allocno conflict table by processing allocno live ranges.
89 Return true if the table was built. The table is not built if it
90 is too big. */
91static bool
058e97ec
VM
92build_conflict_bit_table (void)
93{
a49ae217 94 int i;
058e97ec 95 unsigned int j;
1756cb66 96 enum reg_class aclass;
a49ae217 97 int object_set_words, allocated_words_num, conflict_bit_vec_words_num;
b14151b5 98 live_range_t r;
a49ae217 99 ira_allocno_t allocno;
058e97ec 100 ira_allocno_iterator ai;
a49ae217 101 sparseset objects_live;
ac0ab4f7
BS
102 ira_object_t obj;
103 ira_allocno_object_iterator aoi;
058e97ec 104
311aab06
VM
105 allocated_words_num = 0;
106 FOR_EACH_ALLOCNO (allocno, ai)
ac0ab4f7
BS
107 FOR_EACH_ALLOCNO_OBJECT (allocno, obj, aoi)
108 {
109 if (OBJECT_MAX (obj) < OBJECT_MIN (obj))
311aab06 110 continue;
ac0ab4f7
BS
111 conflict_bit_vec_words_num
112 = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
113 / IRA_INT_BITS);
114 allocated_words_num += conflict_bit_vec_words_num;
a9243bfc
RB
115 if ((uint64_t) allocated_words_num * sizeof (IRA_INT_TYPE)
116 > (uint64_t) IRA_MAX_CONFLICT_TABLE_SIZE * 1024 * 1024)
ac0ab4f7
BS
117 {
118 if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
119 fprintf
120 (ira_dump_file,
121 "+++Conflict table will be too big(>%dMB) -- don't use it\n",
122 IRA_MAX_CONFLICT_TABLE_SIZE);
123 return false;
124 }
125 }
a49ae217 126
058e97ec 127 conflicts = (IRA_INT_TYPE **) ira_allocate (sizeof (IRA_INT_TYPE *)
a49ae217 128 * ira_objects_num);
058e97ec
VM
129 allocated_words_num = 0;
130 FOR_EACH_ALLOCNO (allocno, ai)
ac0ab4f7
BS
131 FOR_EACH_ALLOCNO_OBJECT (allocno, obj, aoi)
132 {
133 int id = OBJECT_CONFLICT_ID (obj);
134 if (OBJECT_MAX (obj) < OBJECT_MIN (obj))
135 {
136 conflicts[id] = NULL;
137 continue;
138 }
139 conflict_bit_vec_words_num
140 = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
141 / IRA_INT_BITS);
142 allocated_words_num += conflict_bit_vec_words_num;
143 conflicts[id]
144 = (IRA_INT_TYPE *) ira_allocate (sizeof (IRA_INT_TYPE)
145 * conflict_bit_vec_words_num);
146 memset (conflicts[id], 0,
147 sizeof (IRA_INT_TYPE) * conflict_bit_vec_words_num);
148 }
a49ae217
BS
149
150 object_set_words = (ira_objects_num + IRA_INT_BITS - 1) / IRA_INT_BITS;
058e97ec
VM
151 if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
152 fprintf
153 (ira_dump_file,
154 "+++Allocating %ld bytes for conflict table (uncompressed size %ld)\n",
155 (long) allocated_words_num * sizeof (IRA_INT_TYPE),
a49ae217
BS
156 (long) object_set_words * ira_objects_num * sizeof (IRA_INT_TYPE));
157
158 objects_live = sparseset_alloc (ira_objects_num);
058e97ec
VM
159 for (i = 0; i < ira_max_point; i++)
160 {
161 for (r = ira_start_point_ranges[i]; r != NULL; r = r->start_next)
162 {
9140d27b
BS
163 ira_object_t obj = r->object;
164 ira_allocno_t allocno = OBJECT_ALLOCNO (obj);
a49ae217
BS
165 int id = OBJECT_CONFLICT_ID (obj);
166
ac0ab4f7
BS
167 gcc_assert (id < ira_objects_num);
168
1756cb66 169 aclass = ALLOCNO_CLASS (allocno);
a49ae217 170 EXECUTE_IF_SET_IN_SPARSESET (objects_live, j)
058e97ec 171 {
ac0ab4f7
BS
172 ira_object_t live_obj = ira_object_id_map[j];
173 ira_allocno_t live_a = OBJECT_ALLOCNO (live_obj);
1756cb66 174 enum reg_class live_aclass = ALLOCNO_CLASS (live_a);
a49ae217 175
1756cb66 176 if (ira_reg_classes_intersect_p[aclass][live_aclass]
058e97ec 177 /* Don't set up conflict for the allocno with itself. */
ac0ab4f7 178 && live_a != allocno)
058e97ec 179 {
ac0ab4f7 180 record_object_conflict (obj, live_obj);
058e97ec
VM
181 }
182 }
60408d8b 183 sparseset_set_bit (objects_live, id);
058e97ec 184 }
b8698a0f 185
058e97ec 186 for (r = ira_finish_point_ranges[i]; r != NULL; r = r->finish_next)
ac0ab4f7 187 sparseset_clear_bit (objects_live, OBJECT_CONFLICT_ID (r->object));
058e97ec 188 }
a49ae217 189 sparseset_free (objects_live);
311aab06 190 return true;
058e97ec 191}
058e97ec 192\f
a49ae217
BS
193/* Return true iff allocnos A1 and A2 cannot be allocated to the same
194 register due to conflicts. */
195
196static bool
ac0ab4f7 197allocnos_conflict_for_copy_p (ira_allocno_t a1, ira_allocno_t a2)
a49ae217 198{
ac0ab4f7
BS
199 /* Due to the fact that we canonicalize conflicts (see
200 record_object_conflict), we only need to test for conflicts of
201 the lowest order words. */
202 ira_object_t obj1 = ALLOCNO_OBJECT (a1, 0);
203 ira_object_t obj2 = ALLOCNO_OBJECT (a2, 0);
1756cb66 204
a49ae217
BS
205 return OBJECTS_CONFLICT_P (obj1, obj2);
206}
058e97ec 207
a7f32992
VM
208/* Check that X is REG or SUBREG of REG. */
209#define REG_SUBREG_P(x) \
210 (REG_P (x) || (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))))
211
212/* Return X if X is a REG, otherwise it should be SUBREG of REG and
213 the function returns the reg in this case. *OFFSET will be set to
214 0 in the first case or the regno offset in the first case. */
215static rtx
216go_through_subreg (rtx x, int *offset)
217{
218 rtx reg;
219
220 *offset = 0;
221 if (REG_P (x))
222 return x;
223 ira_assert (GET_CODE (x) == SUBREG);
224 reg = SUBREG_REG (x);
225 ira_assert (REG_P (reg));
226 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
227 *offset = subreg_regno_offset (REGNO (reg), GET_MODE (reg),
228 SUBREG_BYTE (x), GET_MODE (x));
91914e56
RS
229 else if (!can_div_trunc_p (SUBREG_BYTE (x),
230 REGMODE_NATURAL_SIZE (GET_MODE (x)), offset))
231 /* Checked by validate_subreg. We must know at compile time which
232 inner hard registers are being accessed. */
233 gcc_unreachable ();
a7f32992
VM
234 return reg;
235}
236
058e97ec
VM
237/* Process registers REG1 and REG2 in move INSN with execution
238 frequency FREQ. The function also processes the registers in a
239 potential move insn (INSN == NULL in this case) with frequency
240 FREQ. The function can modify hard register costs of the
241 corresponding allocnos or create a copy involving the corresponding
242 allocnos. The function does nothing if the both registers are hard
243 registers. When nothing is changed, the function returns
244 FALSE. */
245static bool
548a6322 246process_regs_for_copy (rtx reg1, rtx reg2, bool constraint_p,
070a1983 247 rtx_insn *insn, int freq)
058e97ec 248{
496071ca 249 int allocno_preferenced_hard_regno, cost, index, offset1, offset2;
a7f32992 250 bool only_regs_p;
058e97ec 251 ira_allocno_t a;
a8c44c52 252 reg_class_t rclass, aclass;
ef4bddc2 253 machine_mode mode;
058e97ec
VM
254 ira_copy_t cp;
255
a7f32992
VM
256 gcc_assert (REG_SUBREG_P (reg1) && REG_SUBREG_P (reg2));
257 only_regs_p = REG_P (reg1) && REG_P (reg2);
258 reg1 = go_through_subreg (reg1, &offset1);
259 reg2 = go_through_subreg (reg2, &offset2);
496071ca
VM
260 /* Set up hard regno preferenced by allocno. If allocno gets the
261 hard regno the copy (or potential move) insn will be removed. */
058e97ec
VM
262 if (HARD_REGISTER_P (reg1))
263 {
264 if (HARD_REGISTER_P (reg2))
265 return false;
496071ca 266 allocno_preferenced_hard_regno = REGNO (reg1) + offset1 - offset2;
058e97ec
VM
267 a = ira_curr_regno_allocno_map[REGNO (reg2)];
268 }
269 else if (HARD_REGISTER_P (reg2))
270 {
496071ca 271 allocno_preferenced_hard_regno = REGNO (reg2) + offset2 - offset1;
058e97ec
VM
272 a = ira_curr_regno_allocno_map[REGNO (reg1)];
273 }
a49ae217 274 else
058e97ec 275 {
a49ae217
BS
276 ira_allocno_t a1 = ira_curr_regno_allocno_map[REGNO (reg1)];
277 ira_allocno_t a2 = ira_curr_regno_allocno_map[REGNO (reg2)];
2608d841 278
ac0ab4f7 279 if (!allocnos_conflict_for_copy_p (a1, a2) && offset1 == offset2)
a49ae217
BS
280 {
281 cp = ira_add_allocno_copy (a1, a2, freq, constraint_p, insn,
282 ira_curr_loop_tree_node);
283 bitmap_set_bit (ira_curr_loop_tree_node->local_copies, cp->num);
284 return true;
285 }
286 else
287 return false;
058e97ec 288 }
a49ae217 289
1756cb66
VM
290 if (! IN_RANGE (allocno_preferenced_hard_regno,
291 0, FIRST_PSEUDO_REGISTER - 1))
67914693 292 /* Cannot be tied. */
496071ca
VM
293 return false;
294 rclass = REGNO_REG_CLASS (allocno_preferenced_hard_regno);
058e97ec 295 mode = ALLOCNO_MODE (a);
1756cb66 296 aclass = ALLOCNO_CLASS (a);
4cda38d5 297 if (only_regs_p && insn != NULL_RTX
a8c44c52 298 && reg_class_size[rclass] <= ira_reg_class_max_nregs [rclass][mode])
058e97ec
VM
299 /* It is already taken into account in ira-costs.c. */
300 return false;
1756cb66 301 index = ira_class_hard_reg_index[aclass][allocno_preferenced_hard_regno];
058e97ec 302 if (index < 0)
67914693 303 /* Cannot be tied. It is not in the allocno class. */
058e97ec 304 return false;
1756cb66 305 ira_init_register_move_cost_if_necessary (mode);
058e97ec 306 if (HARD_REGISTER_P (reg1))
1756cb66 307 cost = ira_register_move_cost[mode][aclass][rclass] * freq;
058e97ec 308 else
1756cb66 309 cost = ira_register_move_cost[mode][rclass][aclass] * freq;
029da7d4 310 do
cb1ca6ac
VM
311 {
312 ira_allocate_and_set_costs
1756cb66
VM
313 (&ALLOCNO_HARD_REG_COSTS (a), aclass,
314 ALLOCNO_CLASS_COST (a));
cb1ca6ac 315 ira_allocate_and_set_costs
1756cb66 316 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a), aclass, 0);
cb1ca6ac
VM
317 ALLOCNO_HARD_REG_COSTS (a)[index] -= cost;
318 ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[index] -= cost;
1756cb66
VM
319 if (ALLOCNO_HARD_REG_COSTS (a)[index] < ALLOCNO_CLASS_COST (a))
320 ALLOCNO_CLASS_COST (a) = ALLOCNO_HARD_REG_COSTS (a)[index];
3b6d1699 321 ira_add_allocno_pref (a, allocno_preferenced_hard_regno, freq);
029da7d4 322 a = ira_parent_or_cap_allocno (a);
cb1ca6ac 323 }
029da7d4 324 while (a != NULL);
058e97ec
VM
325 return true;
326}
327
b09495c1
VM
328/* Process all of the output registers of the current insn which are
329 not bound (BOUND_P) and the input register REG (its operand number
330 OP_NUM) which dies in the insn as if there were a move insn between
331 them with frequency FREQ. */
058e97ec 332static void
b09495c1 333process_reg_shuffles (rtx reg, int op_num, int freq, bool *bound_p)
058e97ec
VM
334{
335 int i;
336 rtx another_reg;
337
a7f32992 338 gcc_assert (REG_SUBREG_P (reg));
058e97ec
VM
339 for (i = 0; i < recog_data.n_operands; i++)
340 {
341 another_reg = recog_data.operand[i];
b8698a0f 342
a7f32992 343 if (!REG_SUBREG_P (another_reg) || op_num == i
b09495c1
VM
344 || recog_data.operand_type[i] != OP_OUT
345 || bound_p[i])
058e97ec 346 continue;
b8698a0f 347
070a1983 348 process_regs_for_copy (reg, another_reg, false, NULL, freq);
058e97ec
VM
349 }
350}
351
352/* Process INSN and create allocno copies if necessary. For example,
353 it might be because INSN is a pseudo-register move or INSN is two
354 operand insn. */
355static void
070a1983 356add_insn_allocno_copies (rtx_insn *insn)
058e97ec 357{
56592e03 358 rtx set, operand, dup;
3b6d1699
VM
359 bool bound_p[MAX_RECOG_OPERANDS];
360 int i, n, freq;
73bb8fe9 361 alternative_mask alts;
a49ae217 362
058e97ec
VM
363 freq = REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn));
364 if (freq == 0)
365 freq = 1;
366 if ((set = single_set (insn)) != NULL_RTX
a7f32992 367 && REG_SUBREG_P (SET_DEST (set)) && REG_SUBREG_P (SET_SRC (set))
058e97ec 368 && ! side_effects_p (set)
a7f32992
VM
369 && find_reg_note (insn, REG_DEAD,
370 REG_P (SET_SRC (set))
371 ? SET_SRC (set)
372 : SUBREG_REG (SET_SRC (set))) != NULL_RTX)
058e97ec 373 {
3b6d1699 374 process_regs_for_copy (SET_SRC (set), SET_DEST (set),
1756cb66 375 false, insn, freq);
b09495c1
VM
376 return;
377 }
56592e03
VM
378 /* Fast check of possibility of constraint or shuffle copies. If
379 there are no dead registers, there will be no such copies. */
380 if (! find_reg_note (insn, REG_DEAD, NULL_RTX))
b09495c1 381 return;
73bb8fe9 382 alts = ira_setup_alts (insn);
b09495c1
VM
383 for (i = 0; i < recog_data.n_operands; i++)
384 bound_p[i] = false;
385 for (i = 0; i < recog_data.n_operands; i++)
386 {
387 operand = recog_data.operand[i];
388 if (! REG_SUBREG_P (operand))
389 continue;
3b6d1699
VM
390 if ((n = ira_get_dup_out_num (i, alts)) >= 0)
391 {
392 bound_p[n] = true;
393 dup = recog_data.operand[n];
394 if (REG_SUBREG_P (dup)
395 && find_reg_note (insn, REG_DEAD,
396 REG_P (operand)
397 ? operand
398 : SUBREG_REG (operand)) != NULL_RTX)
070a1983 399 process_regs_for_copy (operand, dup, true, NULL,
3b6d1699
VM
400 freq);
401 }
b09495c1
VM
402 }
403 for (i = 0; i < recog_data.n_operands; i++)
404 {
405 operand = recog_data.operand[i];
406 if (REG_SUBREG_P (operand)
407 && find_reg_note (insn, REG_DEAD,
408 REG_P (operand)
409 ? operand : SUBREG_REG (operand)) != NULL_RTX)
410 /* If an operand dies, prefer its hard register for the output
411 operands by decreasing the hard register cost or creating
412 the corresponding allocno copies. The cost will not
413 correspond to a real move insn cost, so make the frequency
414 smaller. */
415 process_reg_shuffles (operand, i, freq < 8 ? 1 : freq / 8, bound_p);
058e97ec
VM
416 }
417}
418
419/* Add copies originated from BB given by LOOP_TREE_NODE. */
420static void
421add_copies (ira_loop_tree_node_t loop_tree_node)
422{
423 basic_block bb;
070a1983 424 rtx_insn *insn;
058e97ec
VM
425
426 bb = loop_tree_node->bb;
427 if (bb == NULL)
428 return;
429 FOR_BB_INSNS (bb, insn)
b5b8b0ac 430 if (NONDEBUG_INSN_P (insn))
058e97ec
VM
431 add_insn_allocno_copies (insn);
432}
433
434/* Propagate copies the corresponding allocnos on upper loop tree
435 level. */
436static void
437propagate_copies (void)
438{
439 ira_copy_t cp;
440 ira_copy_iterator ci;
441 ira_allocno_t a1, a2, parent_a1, parent_a2;
058e97ec
VM
442
443 FOR_EACH_COPY (cp, ci)
444 {
445 a1 = cp->first;
446 a2 = cp->second;
447 if (ALLOCNO_LOOP_TREE_NODE (a1) == ira_loop_tree_root)
448 continue;
449 ira_assert ((ALLOCNO_LOOP_TREE_NODE (a2) != ira_loop_tree_root));
029da7d4
BS
450 parent_a1 = ira_parent_or_cap_allocno (a1);
451 parent_a2 = ira_parent_or_cap_allocno (a2);
058e97ec 452 ira_assert (parent_a1 != NULL && parent_a2 != NULL);
ac0ab4f7 453 if (! allocnos_conflict_for_copy_p (parent_a1, parent_a2))
548a6322
VM
454 ira_add_allocno_copy (parent_a1, parent_a2, cp->freq,
455 cp->constraint_p, cp->insn, cp->loop_tree_node);
058e97ec
VM
456 }
457}
458
058e97ec 459/* Array used to collect all conflict allocnos for given allocno. */
a49ae217 460static ira_object_t *collected_conflict_objects;
058e97ec
VM
461
462/* Build conflict vectors or bit conflict vectors (whatever is more
ac0ab4f7 463 profitable) for object OBJ from the conflict table. */
058e97ec 464static void
ac0ab4f7 465build_object_conflicts (ira_object_t obj)
058e97ec
VM
466{
467 int i, px, parent_num;
a49ae217 468 ira_allocno_t parent_a, another_parent_a;
ac0ab4f7
BS
469 ira_object_t parent_obj;
470 ira_allocno_t a = OBJECT_ALLOCNO (obj);
471 IRA_INT_TYPE *object_conflicts;
42ce1cc4 472 minmax_set_iterator asi;
5c82436e 473 int parent_min, parent_max ATTRIBUTE_UNUSED;
058e97ec 474
ac0ab4f7 475 object_conflicts = conflicts[OBJECT_CONFLICT_ID (obj)];
058e97ec 476 px = 0;
ac0ab4f7 477 FOR_EACH_BIT_IN_MINMAX_SET (object_conflicts,
a49ae217 478 OBJECT_MIN (obj), OBJECT_MAX (obj), i, asi)
058e97ec 479 {
a49ae217
BS
480 ira_object_t another_obj = ira_object_id_map[i];
481 ira_allocno_t another_a = OBJECT_ALLOCNO (obj);
1756cb66 482
7db7ed3c 483 ira_assert (ira_reg_classes_intersect_p
1756cb66 484 [ALLOCNO_CLASS (a)][ALLOCNO_CLASS (another_a)]);
a49ae217 485 collected_conflict_objects[px++] = another_obj;
058e97ec 486 }
a49ae217 487 if (ira_conflict_vector_profitable_p (obj, px))
058e97ec 488 {
ac0ab4f7 489 ira_object_t *vec;
a49ae217
BS
490 ira_allocate_conflict_vec (obj, px);
491 vec = OBJECT_CONFLICT_VEC (obj);
492 memcpy (vec, collected_conflict_objects, sizeof (ira_object_t) * px);
058e97ec 493 vec[px] = NULL;
a49ae217 494 OBJECT_NUM_CONFLICTS (obj) = px;
058e97ec
VM
495 }
496 else
497 {
ac0ab4f7 498 int conflict_bit_vec_words_num;
1756cb66 499
ac0ab4f7 500 OBJECT_CONFLICT_ARRAY (obj) = object_conflicts;
a49ae217 501 if (OBJECT_MAX (obj) < OBJECT_MIN (obj))
058e97ec
VM
502 conflict_bit_vec_words_num = 0;
503 else
504 conflict_bit_vec_words_num
a49ae217 505 = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
058e97ec 506 / IRA_INT_BITS);
a49ae217 507 OBJECT_CONFLICT_ARRAY_SIZE (obj)
058e97ec
VM
508 = conflict_bit_vec_words_num * sizeof (IRA_INT_TYPE);
509 }
ac0ab4f7 510
029da7d4
BS
511 parent_a = ira_parent_or_cap_allocno (a);
512 if (parent_a == NULL)
058e97ec 513 return;
1756cb66 514 ira_assert (ALLOCNO_CLASS (a) == ALLOCNO_CLASS (parent_a));
ac0ab4f7
BS
515 ira_assert (ALLOCNO_NUM_OBJECTS (a) == ALLOCNO_NUM_OBJECTS (parent_a));
516 parent_obj = ALLOCNO_OBJECT (parent_a, OBJECT_SUBWORD (obj));
a49ae217 517 parent_num = OBJECT_CONFLICT_ID (parent_obj);
1756cb66
VM
518 parent_min = OBJECT_MIN (parent_obj);
519 parent_max = OBJECT_MAX (parent_obj);
ac0ab4f7 520 FOR_EACH_BIT_IN_MINMAX_SET (object_conflicts,
a49ae217 521 OBJECT_MIN (obj), OBJECT_MAX (obj), i, asi)
058e97ec 522 {
a49ae217
BS
523 ira_object_t another_obj = ira_object_id_map[i];
524 ira_allocno_t another_a = OBJECT_ALLOCNO (another_obj);
ac0ab4f7 525 int another_word = OBJECT_SUBWORD (another_obj);
a49ae217 526
7db7ed3c 527 ira_assert (ira_reg_classes_intersect_p
1756cb66 528 [ALLOCNO_CLASS (a)][ALLOCNO_CLASS (another_a)]);
ac0ab4f7 529
029da7d4
BS
530 another_parent_a = ira_parent_or_cap_allocno (another_a);
531 if (another_parent_a == NULL)
058e97ec
VM
532 continue;
533 ira_assert (ALLOCNO_NUM (another_parent_a) >= 0);
1756cb66
VM
534 ira_assert (ALLOCNO_CLASS (another_a)
535 == ALLOCNO_CLASS (another_parent_a));
ac0ab4f7
BS
536 ira_assert (ALLOCNO_NUM_OBJECTS (another_a)
537 == ALLOCNO_NUM_OBJECTS (another_parent_a));
42ce1cc4 538 SET_MINMAX_SET_BIT (conflicts[parent_num],
ac0ab4f7 539 OBJECT_CONFLICT_ID (ALLOCNO_OBJECT (another_parent_a,
1756cb66
VM
540 another_word)),
541 parent_min, parent_max);
058e97ec
VM
542 }
543}
544
545/* Build conflict vectors or bit conflict vectors (whatever is more
546 profitable) of all allocnos from the conflict table. */
547static void
548build_conflicts (void)
549{
550 int i;
551 ira_allocno_t a, cap;
552
a49ae217
BS
553 collected_conflict_objects
554 = (ira_object_t *) ira_allocate (sizeof (ira_object_t)
555 * ira_objects_num);
058e97ec
VM
556 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
557 for (a = ira_regno_allocno_map[i];
558 a != NULL;
559 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
560 {
ac0ab4f7
BS
561 int j, nregs = ALLOCNO_NUM_OBJECTS (a);
562 for (j = 0; j < nregs; j++)
563 {
564 ira_object_t obj = ALLOCNO_OBJECT (a, j);
565 build_object_conflicts (obj);
566 for (cap = ALLOCNO_CAP (a); cap != NULL; cap = ALLOCNO_CAP (cap))
567 {
568 ira_object_t cap_obj = ALLOCNO_OBJECT (cap, j);
569 gcc_assert (ALLOCNO_NUM_OBJECTS (cap) == ALLOCNO_NUM_OBJECTS (a));
570 build_object_conflicts (cap_obj);
571 }
572 }
058e97ec 573 }
a49ae217 574 ira_free (collected_conflict_objects);
058e97ec
VM
575}
576
577\f
578
579/* Print hard reg set SET with TITLE to FILE. */
580static void
581print_hard_reg_set (FILE *file, const char *title, HARD_REG_SET set)
582{
583 int i, start;
584
edb30094 585 fputs (title, file);
058e97ec
VM
586 for (start = -1, i = 0; i < FIRST_PSEUDO_REGISTER; i++)
587 {
588 if (TEST_HARD_REG_BIT (set, i))
589 {
590 if (i == 0 || ! TEST_HARD_REG_BIT (set, i - 1))
591 start = i;
592 }
593 if (start >= 0
594 && (i == FIRST_PSEUDO_REGISTER - 1 || ! TEST_HARD_REG_BIT (set, i)))
595 {
596 if (start == i - 1)
597 fprintf (file, " %d", start);
598 else if (start == i - 2)
599 fprintf (file, " %d %d", start, start + 1);
600 else
601 fprintf (file, " %d-%d", start, i - 1);
602 start = -1;
603 }
604 }
edb30094 605 putc ('\n', file);
058e97ec
VM
606}
607
058e97ec 608static void
e4f36d31 609print_allocno_conflicts (FILE * file, bool reg_p, ira_allocno_t a)
058e97ec 610{
058e97ec 611 HARD_REG_SET conflicting_hard_regs;
e4f36d31 612 basic_block bb;
ac0ab4f7 613 int n, i;
058e97ec 614
e4f36d31
JL
615 if (reg_p)
616 fprintf (file, ";; r%d", ALLOCNO_REGNO (a));
617 else
058e97ec 618 {
e4f36d31
JL
619 fprintf (file, ";; a%d(r%d,", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
620 if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
621 fprintf (file, "b%d", bb->index);
058e97ec 622 else
2608d841 623 fprintf (file, "l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
e4f36d31
JL
624 putc (')', file);
625 }
a49ae217 626
e4f36d31 627 fputs (" conflicts:", file);
ac0ab4f7
BS
628 n = ALLOCNO_NUM_OBJECTS (a);
629 for (i = 0; i < n; i++)
630 {
631 ira_object_t obj = ALLOCNO_OBJECT (a, i);
632 ira_object_t conflict_obj;
633 ira_object_conflict_iterator oci;
634
635 if (OBJECT_CONFLICT_ARRAY (obj) == NULL)
38de8b39
PB
636 {
637 fprintf (file, "\n;; total conflict hard regs:\n");
638 fprintf (file, ";; conflict hard regs:\n\n");
639 continue;
640 }
641
ac0ab4f7
BS
642 if (n > 1)
643 fprintf (file, "\n;; subobject %d:", i);
644 FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
645 {
646 ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
647 if (reg_p)
648 fprintf (file, " r%d,", ALLOCNO_REGNO (conflict_a));
649 else
650 {
651 fprintf (file, " a%d(r%d", ALLOCNO_NUM (conflict_a),
652 ALLOCNO_REGNO (conflict_a));
653 if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1)
654 fprintf (file, ",w%d", OBJECT_SUBWORD (conflict_obj));
655 if ((bb = ALLOCNO_LOOP_TREE_NODE (conflict_a)->bb) != NULL)
656 fprintf (file, ",b%d", bb->index);
657 else
658 fprintf (file, ",l%d",
2608d841 659 ALLOCNO_LOOP_TREE_NODE (conflict_a)->loop_num);
ac0ab4f7
BS
660 putc (')', file);
661 }
662 }
6576d245 663 conflicting_hard_regs = OBJECT_TOTAL_CONFLICT_HARD_REGS (obj);
ac0ab4f7 664 AND_COMPL_HARD_REG_SET (conflicting_hard_regs, ira_no_alloc_regs);
dc333d8f 665 conflicting_hard_regs &= reg_class_contents[ALLOCNO_CLASS (a)];
ac0ab4f7
BS
666 print_hard_reg_set (file, "\n;; total conflict hard regs:",
667 conflicting_hard_regs);
668
6576d245 669 conflicting_hard_regs = OBJECT_CONFLICT_HARD_REGS (obj);
ac0ab4f7 670 AND_COMPL_HARD_REG_SET (conflicting_hard_regs, ira_no_alloc_regs);
dc333d8f 671 conflicting_hard_regs &= reg_class_contents[ALLOCNO_CLASS (a)];
ac0ab4f7
BS
672 print_hard_reg_set (file, ";; conflict hard regs:",
673 conflicting_hard_regs);
674 putc ('\n', file);
675 }
a49ae217 676
058e97ec
VM
677}
678
e4f36d31
JL
679/* Print information about allocno or only regno (if REG_P) conflicts
680 to FILE. */
681static void
682print_conflicts (FILE *file, bool reg_p)
683{
684 ira_allocno_t a;
685 ira_allocno_iterator ai;
686
687 FOR_EACH_ALLOCNO (a, ai)
688 print_allocno_conflicts (file, reg_p, a);
38de8b39 689 putc ('\n', file);
e4f36d31
JL
690}
691
058e97ec
VM
692/* Print information about allocno or only regno (if REG_P) conflicts
693 to stderr. */
694void
695ira_debug_conflicts (bool reg_p)
696{
697 print_conflicts (stderr, reg_p);
698}
699
700\f
701
702/* Entry function which builds allocno conflicts and allocno copies
703 and accumulate some allocno info on upper level regions. */
704void
705ira_build_conflicts (void)
706{
86fc3d06 707 enum reg_class base;
058e97ec
VM
708 ira_allocno_t a;
709 ira_allocno_iterator ai;
7db7ed3c 710 HARD_REG_SET temp_hard_reg_set;
058e97ec 711
311aab06 712 if (ira_conflicts_p)
058e97ec 713 {
311aab06
VM
714 ira_conflicts_p = build_conflict_bit_table ();
715 if (ira_conflicts_p)
058e97ec 716 {
a49ae217
BS
717 ira_object_t obj;
718 ira_object_iterator oi;
719
311aab06 720 build_conflicts ();
e6a7da82 721 ira_traverse_loop_tree (true, ira_loop_tree_root, add_copies, NULL);
311aab06
VM
722 /* We need finished conflict table for the subsequent call. */
723 if (flag_ira_region == IRA_REGION_ALL
724 || flag_ira_region == IRA_REGION_MIXED)
725 propagate_copies ();
a49ae217 726
311aab06 727 /* Now we can free memory for the conflict table (see function
ac0ab4f7 728 build_object_conflicts for details). */
a49ae217 729 FOR_EACH_OBJECT (obj, oi)
311aab06 730 {
a49ae217
BS
731 if (OBJECT_CONFLICT_ARRAY (obj) != conflicts[OBJECT_CONFLICT_ID (obj)])
732 ira_free (conflicts[OBJECT_CONFLICT_ID (obj)]);
311aab06
VM
733 }
734 ira_free (conflicts);
058e97ec 735 }
058e97ec 736 }
86fc3d06
UW
737 base = base_reg_class (VOIDmode, ADDR_SPACE_GENERIC, ADDRESS, SCRATCH);
738 if (! targetm.class_likely_spilled_p (base))
7db7ed3c
VM
739 CLEAR_HARD_REG_SET (temp_hard_reg_set);
740 else
741 {
6576d245 742 temp_hard_reg_set = reg_class_contents[base];
7db7ed3c 743 AND_COMPL_HARD_REG_SET (temp_hard_reg_set, ira_no_alloc_regs);
dc333d8f 744 temp_hard_reg_set &= call_used_reg_set;
7db7ed3c 745 }
058e97ec
VM
746 FOR_EACH_ALLOCNO (a, ai)
747 {
ac0ab4f7 748 int i, n = ALLOCNO_NUM_OBJECTS (a);
1756cb66 749
ac0ab4f7 750 for (i = 0; i < n; i++)
058e97ec 751 {
ac0ab4f7 752 ira_object_t obj = ALLOCNO_OBJECT (a, i);
80ec73f4 753 machine_mode obj_mode = obj->allocno->mode;
e6d46b5a 754 rtx allocno_reg = regno_reg_rtx [ALLOCNO_REGNO (a)];
ac0ab4f7
BS
755
756 if ((! flag_caller_saves && ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
757 /* For debugging purposes don't put user defined variables in
a698cc03
JL
758 callee-clobbered registers. However, do allow parameters
759 in callee-clobbered registers to improve debugging. This
760 is a bit of a fragile hack. */
761 || (optimize == 0
762 && REG_USERVAR_P (allocno_reg)
763 && ! reg_is_parm_p (allocno_reg)))
ac0ab4f7 764 {
44942965
RS
765 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= call_used_reg_set;
766 OBJECT_CONFLICT_HARD_REGS (obj) |= call_used_reg_set;
ac0ab4f7
BS
767 }
768 else if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
769 {
44942965
RS
770 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= no_caller_save_reg_set;
771 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= temp_hard_reg_set;
772 OBJECT_CONFLICT_HARD_REGS (obj) |= no_caller_save_reg_set;
773 OBJECT_CONFLICT_HARD_REGS (obj) |= temp_hard_reg_set;
ac0ab4f7 774 }
0644953e 775
d1bb282e
DS
776 /* Now we deal with paradoxical subreg cases where certain registers
777 cannot be accessed in the widest mode. */
ef4bddc2
RS
778 machine_mode outer_mode = ALLOCNO_WMODE (a);
779 machine_mode inner_mode = ALLOCNO_MODE (a);
03a95621 780 if (paradoxical_subreg_p (outer_mode, inner_mode))
d1bb282e
DS
781 {
782 enum reg_class aclass = ALLOCNO_CLASS (a);
783 for (int j = ira_class_hard_regs_num[aclass] - 1; j >= 0; --j)
784 {
785 int inner_regno = ira_class_hard_regs[aclass][j];
786 int outer_regno = simplify_subreg_regno (inner_regno,
787 inner_mode, 0,
788 outer_mode);
789 if (outer_regno < 0
790 || !in_hard_reg_set_p (reg_class_contents[aclass],
791 outer_mode, outer_regno))
31b61548
VM
792 {
793 SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
794 inner_regno);
795 SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj),
796 inner_regno);
797 }
d1bb282e
DS
798 }
799 }
800
0644953e
AK
801 if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
802 {
803 int regno;
804
805 /* Allocnos bigger than the saved part of call saved
806 regs must conflict with them. */
807 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
808 if (!TEST_HARD_REG_BIT (call_used_reg_set, regno)
473574ee 809 && targetm.hard_regno_call_part_clobbered (NULL, regno,
80ec73f4 810 obj_mode))
0644953e
AK
811 {
812 SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno);
813 SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
814 regno);
815 }
816 }
058e97ec
VM
817 }
818 }
311aab06
VM
819 if (optimize && ira_conflicts_p
820 && internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
058e97ec
VM
821 print_conflicts (ira_dump_file, false);
822}