ssa.c (compute_conservative_reg_partition): Declare with void arguments.
[gcc.git] / gcc / conflict.c
1 /* Register conflict graph computation routines.
2 Copyright (C) 2000 Free Software Foundation, Inc.
3 Contributed by CodeSourcery, LLC
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 /* References:
23
24 Building an Optimizing Compiler
25 Robert Morgan
26 Butterworth-Heinemann, 1998 */
27
28 #include "config.h"
29 #include "system.h"
30
31 #include "obstack.h"
32 #include "hashtab.h"
33 #include "rtl.h"
34 #include "basic-block.h"
35
36 /* Use malloc to allocate obstack chunks. */
37 #define obstack_chunk_alloc xmalloc
38 #define obstack_chunk_free free
39
40 /* A register conflict graph is an undirected graph containing nodes
41 for some or all of the regs used in a function. Arcs represent
42 conflicts, i.e. two nodes are connected by an arc if there is a
43 point in the function at which the regs corresponding to the two
44 nodes are both live.
45
46 The conflict graph is represented by the data structures described
47 in Morgan section 11.3.1. Nodes are not stored explicitly; only
48 arcs are. An arc stores the numbers of the regs it connects.
49
50 Arcs can be located by two methods:
51
52 - The two reg numbers for each arc are hashed into a single
53 value, and the arc is placed in a hash table according to this
54 value. This permits quick determination of whether a specific
55 conflict is present in the graph.
56
57 - Additionally, the arc data structures are threaded by a set of
58 linked lists by single reg number. Since each arc references
59 two regs, there are two next pointers, one for the
60 smaller-numbered reg and one for the larger-numbered reg. This
61 permits the quick enumeration of conflicts for a single
62 register.
63
64 Arcs are allocated from an obstack. */
65
66 /* An arc in a conflict graph. */
67
68 struct conflict_graph_arc_def
69 {
70 /* The next element of the list of conflicts involving the
71 smaller-numbered reg, as an index in the table of arcs of this
72 graph. Contains NULL if this is the tail. */
73 struct conflict_graph_arc_def *smaller_next;
74
75 /* The next element of the list of conflicts involving the
76 larger-numbered reg, as an index in the table of arcs of this
77 graph. Contains NULL if this is the tail. */
78 struct conflict_graph_arc_def *larger_next;
79
80 /* The smaller-numbered reg involved in this conflict. */
81 int smaller;
82
83 /* The larger-numbered reg involved in this conflict. */
84 int larger;
85 };
86
87 typedef struct conflict_graph_arc_def *conflict_graph_arc;
88
89
90 /* A conflict graph. */
91
92 struct conflict_graph_def
93 {
94 /* A hash table of arcs. Used to search for a specific conflict. */
95 htab_t arc_hash_table;
96
97 /* The number of regs this conflict graph handles. */
98 int num_regs;
99
100 /* For each reg, the arc at the head of a list that threads through
101 all the arcs involving that reg. An entry is NULL if no
102 conflicts exist involving that reg. */
103 conflict_graph_arc *neighbor_heads;
104
105 /* Arcs are allocated from here. */
106 struct obstack arc_obstack;
107 };
108
109 /* The initial capacity (number of conflict arcs) for newly-created
110 conflict graphs. */
111 #define INITIAL_ARC_CAPACITY (64)
112
113
114 /* Computes the hash value of the conflict graph arc connecting regs
115 R1__ and R2__. R1__ is assumed to be smaller or equal to R2__. */
116 #define CONFLICT_HASH_FN(r1__, r2__) ((r2__) * ((r2__) - 1) / 2 + (r1__))
117
118 static unsigned arc_hash
119 PARAMS ((const void *arcp));
120 static int arc_eq
121 PARAMS ((const void *arcp1, const void *arcp2));
122 static int print_conflict
123 PARAMS ((int reg1, int reg2, void *contextp));
124 static void mark_reg
125 PARAMS ((rtx reg, rtx setter, void *data));
126
127
128 /* Callback function to compute the hash value of an arc. Uses
129 current_graph to locate the graph to which the arc belongs. */
130
131 static unsigned
132 arc_hash (arcp)
133 const void *arcp;
134 {
135 conflict_graph_arc arc = (conflict_graph_arc) arcp;
136 return CONFLICT_HASH_FN (arc->smaller, arc->larger);
137 }
138
139 /* Callback function to determine the equality of two arcs in the hash
140 table. */
141
142 static int
143 arc_eq (arcp1, arcp2)
144 const void *arcp1;
145 const void *arcp2;
146 {
147 conflict_graph_arc arc1 = (conflict_graph_arc) arcp1;
148 conflict_graph_arc arc2 = (conflict_graph_arc) arcp2;
149 return arc1->smaller == arc2->smaller && arc1->larger == arc2->larger;
150 }
151
152 /* Creates an empty conflict graph to hold conflicts among NUM_REGS
153 registers. */
154
155 conflict_graph
156 conflict_graph_new (num_regs)
157 int num_regs;
158 {
159 conflict_graph graph =
160 (conflict_graph) xmalloc (sizeof (struct conflict_graph_def));
161 graph->num_regs = num_regs;
162
163 /* Set up the hash table. No delete action is specified; memory
164 management of arcs is through the obstack. */
165 graph->arc_hash_table =
166 htab_create (INITIAL_ARC_CAPACITY, &arc_hash, &arc_eq, NULL);
167
168 /* Create an obstack for allocating arcs. */
169 obstack_init (&(graph->arc_obstack));
170
171 /* Create and zero the lookup table by register number. */
172 graph->neighbor_heads = (conflict_graph_arc *)
173 xmalloc (num_regs * sizeof (conflict_graph_arc));
174 memset (graph->neighbor_heads, 0,
175 num_regs * sizeof (conflict_graph_arc));
176
177 return graph;
178 }
179
180 /* Deletes a conflict graph. */
181
182 void
183 conflict_graph_delete (graph)
184 conflict_graph graph;
185 {
186 obstack_free (&(graph->arc_obstack), NULL);
187 htab_delete (graph->arc_hash_table);
188 free (graph->neighbor_heads);
189 free (graph);
190 }
191
192 /* Adds a conflict to GRAPH between regs REG1 and REG2, which must be
193 distinct. Returns non-zero, unless the conflict is already present
194 in GRAPH, in which case it does nothing and returns zero. */
195
196 int
197 conflict_graph_add (graph, reg1, reg2)
198 conflict_graph graph;
199 int reg1;
200 int reg2;
201 {
202 int smaller = MIN (reg1, reg2);
203 int larger = MAX (reg1, reg2);
204 struct conflict_graph_arc_def dummy;
205 conflict_graph_arc arc;
206 void **slot;
207
208 /* A reg cannot conflict with itself. */
209 if (reg1 == reg2)
210 abort ();
211
212 dummy.smaller = smaller;
213 dummy.larger = larger;
214 slot = htab_find_slot (graph->arc_hash_table, (void *) &dummy, 1);
215
216 /* If the conflict is already there, do nothing. */
217 if (*slot != NULL)
218 return 0;
219
220 /* Allocate an arc. */
221 arc = (conflict_graph_arc)
222 obstack_alloc (&(graph->arc_obstack),
223 sizeof (struct conflict_graph_arc_def));
224
225 /* Record the reg numbers. */
226 arc->smaller = smaller;
227 arc->larger = larger;
228
229 /* Link the conflict into into two lists, one for each reg. */
230 arc->smaller_next = graph->neighbor_heads[smaller];
231 graph->neighbor_heads[smaller] = arc;
232 arc->larger_next = graph->neighbor_heads[larger];
233 graph->neighbor_heads[larger] = arc;
234
235 /* Put it in the hash table. */
236 *slot = (void *) arc;
237
238 return 1;
239 }
240
241 /* Returns non-zero if a conflict exists in GRAPH between regs REG1
242 and REG2. */
243
244 int
245 conflict_graph_conflict_p (graph, reg1, reg2)
246 conflict_graph graph;
247 int reg1;
248 int reg2;
249 {
250 /* Build an arc to search for. */
251 struct conflict_graph_arc_def arc;
252 arc.smaller = MIN (reg1, reg2);
253 arc.larger = MAX (reg1, reg2);
254
255 return htab_find (graph->arc_hash_table, (void *) &arc) != NULL;
256 }
257
258 /* Calls ENUM_FN for each conflict in GRAPH involving REG. EXTRA is
259 passed back to ENUM_FN. */
260
261 void
262 conflict_graph_enum (graph, reg, enum_fn, extra)
263 conflict_graph graph;
264 int reg;
265 conflict_graph_enum_fn enum_fn;
266 void *extra;
267 {
268 conflict_graph_arc arc = graph->neighbor_heads[reg];
269 while (arc != NULL)
270 {
271 /* Invoke the callback. */
272 if ((*enum_fn) (arc->smaller, arc->larger, extra))
273 /* Stop if requested. */
274 break;
275
276 /* Which next pointer to follow depends on whether REG is the
277 smaller or larger reg in this conflict. */
278 if (reg < arc->larger)
279 arc = arc->smaller_next;
280 else
281 arc = arc->larger_next;
282 }
283 }
284
285 /* For each conflict between a register x and SRC in GRAPH, adds a
286 conflict to GRAPH between x and TARGET. */
287
288 void
289 conflict_graph_merge_regs (graph, target, src)
290 conflict_graph graph;
291 int target;
292 int src;
293 {
294 conflict_graph_arc arc = graph->neighbor_heads[src];
295
296 if (target == src)
297 return;
298
299 while (arc != NULL)
300 {
301 int other = arc->smaller;
302 if (other == src)
303 other = arc->larger;
304
305 conflict_graph_add (graph, target, other);
306
307 /* Which next pointer to follow depends on whether REG is the
308 smaller or larger reg in this conflict. */
309 if (src < arc->larger)
310 arc = arc->smaller_next;
311 else
312 arc = arc->larger_next;
313 }
314 }
315
316 /* Holds context information while a conflict graph is being traversed
317 for printing. */
318
319 struct print_context
320 {
321 /* The file pointer to which we're printing. */
322 FILE *fp;
323
324 /* The reg whose conflicts we're printing. */
325 int reg;
326
327 /* Whether a conflict has already been printed for this reg. */
328 int started;
329 };
330
331 /* Callback function when enumerating conflicts during printing. */
332
333 static int
334 print_conflict (reg1, reg2, contextp)
335 int reg1;
336 int reg2;
337 void *contextp;
338 {
339 struct print_context *context = (struct print_context *) contextp;
340 int reg;
341
342 /* If this is the first conflict printed for this reg, start a new
343 line. */
344 if (! context->started)
345 {
346 fprintf (context->fp, " %d:", context->reg);
347 context->started = 1;
348 }
349
350 /* Figure out the reg whose conflicts we're printing. The other reg
351 is the interesting one. */
352 if (reg1 == context->reg)
353 reg = reg2;
354 else if (reg2 == context->reg)
355 reg = reg1;
356 else
357 abort ();
358
359 /* Print the conflict. */
360 fprintf (context->fp, " %d", reg);
361
362 /* Continue enumerating. */
363 return 0;
364 }
365
366 /* Prints the conflicts in GRAPH to FP. */
367
368 void
369 conflict_graph_print (graph, fp)
370 conflict_graph graph;
371 FILE *fp;
372 {
373 int reg;
374 struct print_context context;
375 context.fp = fp;
376
377 fprintf (fp, "Conflicts:\n");
378 /* Loop over registers supported in this graph. */
379 for (reg = 0; reg < graph->num_regs; ++reg)
380 {
381 context.reg = reg;
382 context.started = 0;
383 /* Scan the conflicts for reg, printing as we go. A label for
384 this line will be printed the first time a conflict is
385 printed for the reg; we won't start a new line if this reg
386 has no conflicts. */
387 conflict_graph_enum (graph, reg, &print_conflict, &context);
388 /* If this reg does have conflicts, end the line. */
389 if (context.started)
390 fputc ('\n', fp);
391 }
392 }
393
394 /* Callback function for note_stores. */
395
396 static void
397 mark_reg (reg, setter, data)
398 rtx reg;
399 rtx setter ATTRIBUTE_UNUSED;
400 void *data;
401 {
402 regset set = (regset) data;
403
404 if (GET_CODE (reg) == SUBREG)
405 reg = SUBREG_REG (reg);
406
407 /* We're only interested in regs. */
408 if (GET_CODE (reg) != REG)
409 return;
410
411 SET_REGNO_REG_SET (set, REGNO (reg));
412 }
413
414 /* Allocates a conflict graph and computes conflicts over the current
415 function for the registers set in REGS. The caller is responsible
416 for deallocating the return value.
417
418 Preconditions: the flow graph must be in SSA form, and life
419 analysis (specifically, regs live at exit from each block) must be
420 up-to-date.
421
422 This algorithm determines conflicts by walking the insns in each
423 block backwards. We maintain the set of live regs at each insn,
424 starting with the regs live on exit from the block. For each insn:
425
426 1. If a reg is set in this insns, it must be born here, since
427 we're in SSA. Therefore, it was not live before this insns,
428 so remove it from the set of live regs.
429
430 2. For each reg born in this insn, record a conflict between it
431 and every other reg live coming into this insn. For each
432 existing conflict, one of the two regs must be born while the
433 other is alive. See Morgan or elsewhere for a proof of this.
434
435 3. Regs clobbered by this insn must have been live coming into
436 it, so record them as such.
437
438 The resulting conflict graph is not built for regs in REGS
439 themselves; rather, partition P is used to obtain the canonical reg
440 for each of these. The nodes of the conflict graph are these
441 canonical regs instead. */
442
443 conflict_graph
444 conflict_graph_compute (regs, p)
445 regset regs;
446 partition p;
447 {
448 int b;
449 conflict_graph graph = conflict_graph_new (max_reg_num ());
450
451 for (b = n_basic_blocks; --b >= 0; )
452 {
453 basic_block bb = BASIC_BLOCK (b);
454 regset_head live_head;
455 regset live = &live_head;
456 regset_head born_head;
457 regset born = &born_head;
458 rtx insn;
459 rtx head;
460
461 INIT_REG_SET (live);
462 INIT_REG_SET (born);
463
464 /* Start with the regs that are live on exit, limited to those
465 we're interested in. */
466 COPY_REG_SET (live, bb->global_live_at_end);
467 AND_REG_SET (live, regs);
468
469 /* Walk the instruction stream backwards. */
470 head = bb->head;
471 insn = bb->end;
472 for (insn = bb->end;
473 insn != head;
474 insn = PREV_INSN (insn))
475 {
476 int born_reg;
477 int live_reg;
478 rtx link;
479
480 /* Are we interested in this insn? */
481 if (INSN_P (insn))
482 {
483 /* Determine which regs are set in this insn. Since
484 we're in SSA form, if a reg is set here it isn't set
485 anywhere elso, so this insn is where the reg is born. */
486 CLEAR_REG_SET (born);
487 note_stores (PATTERN (insn), mark_reg, (void *) born);
488 #ifdef AUTO_INC_DEC
489 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
490 if (REG_NOTE_KIND (link) == REG_INC)
491 mark_reg (XEXP (link, 0), NULL_RTX, NULL);
492 #endif
493 AND_REG_SET (born, regs);
494
495 /* Regs born here were not live before this insn. */
496 AND_COMPL_REG_SET (live, born);
497
498 /* For every reg born here, add a conflict with every other
499 reg live coming into this insn. */
500 EXECUTE_IF_SET_IN_REG_SET (born,
501 FIRST_PSEUDO_REGISTER,
502 born_reg, {
503 EXECUTE_IF_SET_IN_REG_SET (live,
504 FIRST_PSEUDO_REGISTER,
505 live_reg, {
506 /* Build the conflict graph in terms of canonical
507 regnos. */
508 int b = partition_find (p, born_reg);
509 int l = partition_find (p, live_reg);
510 if (b != l)
511 conflict_graph_add (graph, b, l);
512 });
513 });
514
515 /* Morgan's algorithm checks the operands of the insn
516 and adds them to the set of live regs. Instead, we
517 use death information added by life analysis. Regs
518 dead after this instruction were live before it. */
519 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
520 if (REG_NOTE_KIND (link) == REG_DEAD)
521 {
522 int regno = REGNO (XEXP (link, 0));
523 if (REGNO_REG_SET_P (regs, regno))
524 SET_REGNO_REG_SET (live, regno);
525 }
526 }
527 }
528 }
529
530 return graph;
531 }