OSDN Git Service

* ssa.c (compute_conservative_reg_partition): Declare with
[pf3gnuchains/gcc-fork.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 }