regstat.cc revision 1.1 1 1.1 mrg /* Scanning of rtl for dataflow analysis.
2 1.1 mrg Copyright (C) 2007-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Kenneth Zadeck (zadeck (at) naturalbridge.com).
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg
22 1.1 mrg #include "config.h"
23 1.1 mrg #include "system.h"
24 1.1 mrg #include "coretypes.h"
25 1.1 mrg #include "backend.h"
26 1.1 mrg #include "rtl.h"
27 1.1 mrg #include "predict.h"
28 1.1 mrg #include "df.h"
29 1.1 mrg #include "regs.h"
30 1.1 mrg
31 1.1 mrg
32 1.1 mrg struct regstat_n_sets_and_refs_t *regstat_n_sets_and_refs;
33 1.1 mrg
34 1.1 mrg /*----------------------------------------------------------------------------
35 1.1 mrg REG_N_SETS and REG_N_REFS.
36 1.1 mrg ----------------------------------------------------------------------------*/
37 1.1 mrg
38 1.1 mrg /* If a pass need to change these values in some magical way or the
39 1.1 mrg pass needs to have accurate values for these and is not using
40 1.1 mrg incremental df scanning, then it should use REG_N_SETS and
41 1.1 mrg REG_N_USES. If the pass is doing incremental scanning then it
42 1.1 mrg should be getting the info from DF_REG_DEF_COUNT and
43 1.1 mrg DF_REG_USE_COUNT. */
44 1.1 mrg
45 1.1 mrg void
46 1.1 mrg regstat_init_n_sets_and_refs (void)
47 1.1 mrg {
48 1.1 mrg unsigned int i;
49 1.1 mrg unsigned int max_regno = max_reg_num ();
50 1.1 mrg
51 1.1 mrg timevar_push (TV_REG_STATS);
52 1.1 mrg df_grow_reg_info ();
53 1.1 mrg gcc_assert (!regstat_n_sets_and_refs);
54 1.1 mrg
55 1.1 mrg regstat_n_sets_and_refs = XNEWVEC (struct regstat_n_sets_and_refs_t, max_regno);
56 1.1 mrg
57 1.1 mrg if (MAY_HAVE_DEBUG_BIND_INSNS)
58 1.1 mrg for (i = 0; i < max_regno; i++)
59 1.1 mrg {
60 1.1 mrg int use_count;
61 1.1 mrg df_ref use;
62 1.1 mrg
63 1.1 mrg use_count = DF_REG_USE_COUNT (i);
64 1.1 mrg for (use = DF_REG_USE_CHAIN (i); use; use = DF_REF_NEXT_REG (use))
65 1.1 mrg if (DF_REF_INSN_INFO (use) && DEBUG_INSN_P (DF_REF_INSN (use)))
66 1.1 mrg use_count--;
67 1.1 mrg
68 1.1 mrg
69 1.1 mrg SET_REG_N_SETS (i, DF_REG_DEF_COUNT (i));
70 1.1 mrg SET_REG_N_REFS (i, use_count + REG_N_SETS (i));
71 1.1 mrg }
72 1.1 mrg else
73 1.1 mrg for (i = 0; i < max_regno; i++)
74 1.1 mrg {
75 1.1 mrg SET_REG_N_SETS (i, DF_REG_DEF_COUNT (i));
76 1.1 mrg SET_REG_N_REFS (i, DF_REG_USE_COUNT (i) + REG_N_SETS (i));
77 1.1 mrg }
78 1.1 mrg timevar_pop (TV_REG_STATS);
79 1.1 mrg
80 1.1 mrg }
81 1.1 mrg
82 1.1 mrg
83 1.1 mrg /* Free the array that holds the REG_N_SETS and REG_N_REFS. */
84 1.1 mrg
85 1.1 mrg void
86 1.1 mrg regstat_free_n_sets_and_refs (void)
87 1.1 mrg {
88 1.1 mrg gcc_assert (regstat_n_sets_and_refs);
89 1.1 mrg free (regstat_n_sets_and_refs);
90 1.1 mrg regstat_n_sets_and_refs = NULL;
91 1.1 mrg }
92 1.1 mrg
93 1.1 mrg
94 1.1 mrg /*----------------------------------------------------------------------------
95 1.1 mrg REGISTER INFORMATION
96 1.1 mrg
97 1.1 mrg Process REG_N_DEATHS, REG_N_CALLS_CROSSED, and REG_BASIC_BLOCK.
98 1.1 mrg
99 1.1 mrg ----------------------------------------------------------------------------*/
100 1.1 mrg
101 1.1 mrg static bitmap setjmp_crosses;
102 1.1 mrg struct reg_info_t *reg_info_p;
103 1.1 mrg
104 1.1 mrg /* The number allocated elements of reg_info_p. */
105 1.1 mrg size_t reg_info_p_size;
106 1.1 mrg
107 1.1 mrg /* Compute register info: lifetime, bb, and number of defs and uses
108 1.1 mrg for basic block BB. LIVE is a scratch bitvector used here. */
109 1.1 mrg
110 1.1 mrg static void
111 1.1 mrg regstat_bb_compute_ri (basic_block bb, bitmap live)
112 1.1 mrg {
113 1.1 mrg rtx_insn *insn;
114 1.1 mrg df_ref def, use;
115 1.1 mrg bitmap_iterator bi;
116 1.1 mrg unsigned int regno;
117 1.1 mrg
118 1.1 mrg bitmap_copy (live, df_get_live_out (bb));
119 1.1 mrg
120 1.1 mrg /* Process the regs live at the end of the block. Mark them as
121 1.1 mrg not local to any one basic block. */
122 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (live, 0, regno, bi)
123 1.1 mrg REG_BASIC_BLOCK (regno) = REG_BLOCK_GLOBAL;
124 1.1 mrg
125 1.1 mrg /* Process the artificial defs and uses at the bottom of the block
126 1.1 mrg to begin processing. */
127 1.1 mrg FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
128 1.1 mrg if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0)
129 1.1 mrg bitmap_clear_bit (live, DF_REF_REGNO (def));
130 1.1 mrg
131 1.1 mrg FOR_EACH_ARTIFICIAL_USE (use, bb->index)
132 1.1 mrg if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == 0)
133 1.1 mrg {
134 1.1 mrg regno = DF_REF_REGNO (use);
135 1.1 mrg bitmap_set_bit (live, regno);
136 1.1 mrg }
137 1.1 mrg
138 1.1 mrg FOR_BB_INSNS_REVERSE (bb, insn)
139 1.1 mrg {
140 1.1 mrg struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
141 1.1 mrg bitmap_iterator bi;
142 1.1 mrg rtx link;
143 1.1 mrg
144 1.1 mrg if (!NONDEBUG_INSN_P (insn))
145 1.1 mrg continue;
146 1.1 mrg
147 1.1 mrg link = REG_NOTES (insn);
148 1.1 mrg while (link)
149 1.1 mrg {
150 1.1 mrg if (REG_NOTE_KIND (link) == REG_DEAD)
151 1.1 mrg REG_N_DEATHS (REGNO (XEXP (link, 0)))++;
152 1.1 mrg link = XEXP (link, 1);
153 1.1 mrg }
154 1.1 mrg
155 1.1 mrg /* Process the defs. */
156 1.1 mrg if (CALL_P (insn))
157 1.1 mrg {
158 1.1 mrg bool set_jump = (find_reg_note (insn, REG_SETJMP, NULL) != NULL);
159 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (live, 0, regno, bi)
160 1.1 mrg {
161 1.1 mrg REG_N_CALLS_CROSSED (regno)++;
162 1.1 mrg
163 1.1 mrg /* We have a problem with any pseudoreg that lives
164 1.1 mrg across the setjmp. ANSI says that if a user variable
165 1.1 mrg does not change in value between the setjmp and the
166 1.1 mrg longjmp, then the longjmp preserves it. This
167 1.1 mrg includes longjmp from a place where the pseudo
168 1.1 mrg appears dead. (In principle, the value still exists
169 1.1 mrg if it is in scope.) If the pseudo goes in a hard
170 1.1 mrg reg, some other value may occupy that hard reg where
171 1.1 mrg this pseudo is dead, thus clobbering the pseudo.
172 1.1 mrg Conclusion: such a pseudo must not go in a hard
173 1.1 mrg reg. */
174 1.1 mrg if (set_jump)
175 1.1 mrg bitmap_set_bit (setjmp_crosses, regno);
176 1.1 mrg }
177 1.1 mrg }
178 1.1 mrg
179 1.1 mrg /* All of the defs except the return value are some sort of
180 1.1 mrg clobber. This code is for the return. */
181 1.1 mrg FOR_EACH_INSN_INFO_DEF (def, insn_info)
182 1.1 mrg {
183 1.1 mrg if ((!CALL_P (insn))
184 1.1 mrg || (!(DF_REF_FLAGS (def)
185 1.1 mrg & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))))
186 1.1 mrg {
187 1.1 mrg unsigned int dregno = DF_REF_REGNO (def);
188 1.1 mrg
189 1.1 mrg /* Kill this register if it is not a subreg store or
190 1.1 mrg conditional store.
191 1.1 mrg ??? This means that any partial store is live from
192 1.1 mrg the last use in a basic block to the start of this
193 1.1 mrg basic block. */
194 1.1 mrg if (!(DF_REF_FLAGS (def)
195 1.1 mrg & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
196 1.1 mrg bitmap_clear_bit (live, dregno);
197 1.1 mrg
198 1.1 mrg if (dregno >= FIRST_PSEUDO_REGISTER)
199 1.1 mrg {
200 1.1 mrg REG_FREQ (dregno) += REG_FREQ_FROM_BB (bb);
201 1.1 mrg REG_FREQ (dregno) =
202 1.1 mrg MIN (REG_FREQ (dregno), REG_FREQ_MAX);
203 1.1 mrg
204 1.1 mrg if (REG_BASIC_BLOCK (dregno) == REG_BLOCK_UNKNOWN)
205 1.1 mrg REG_BASIC_BLOCK (dregno) = bb->index;
206 1.1 mrg else if (REG_BASIC_BLOCK (dregno) != bb->index)
207 1.1 mrg REG_BASIC_BLOCK (dregno) = REG_BLOCK_GLOBAL;
208 1.1 mrg }
209 1.1 mrg }
210 1.1 mrg }
211 1.1 mrg
212 1.1 mrg FOR_EACH_INSN_INFO_USE (use, insn_info)
213 1.1 mrg {
214 1.1 mrg unsigned int uregno = DF_REF_REGNO (use);
215 1.1 mrg
216 1.1 mrg if (uregno >= FIRST_PSEUDO_REGISTER)
217 1.1 mrg {
218 1.1 mrg REG_FREQ (uregno) += REG_FREQ_FROM_BB (bb);
219 1.1 mrg REG_FREQ (uregno) =
220 1.1 mrg MIN (REG_FREQ (uregno), REG_FREQ_MAX);
221 1.1 mrg
222 1.1 mrg if (REG_BASIC_BLOCK (uregno) == REG_BLOCK_UNKNOWN)
223 1.1 mrg REG_BASIC_BLOCK (uregno) = bb->index;
224 1.1 mrg else if (REG_BASIC_BLOCK (uregno) != bb->index)
225 1.1 mrg REG_BASIC_BLOCK (uregno) = REG_BLOCK_GLOBAL;
226 1.1 mrg }
227 1.1 mrg }
228 1.1 mrg }
229 1.1 mrg }
230 1.1 mrg
231 1.1 mrg
232 1.1 mrg /* Compute register info: lifetime, bb, and number of defs and uses. */
233 1.1 mrg void
234 1.1 mrg regstat_compute_ri (void)
235 1.1 mrg {
236 1.1 mrg basic_block bb;
237 1.1 mrg bitmap live = BITMAP_ALLOC (&df_bitmap_obstack);
238 1.1 mrg unsigned int regno;
239 1.1 mrg bitmap_iterator bi;
240 1.1 mrg
241 1.1 mrg /* Initialize everything. */
242 1.1 mrg
243 1.1 mrg gcc_assert (!reg_info_p);
244 1.1 mrg
245 1.1 mrg timevar_push (TV_REG_STATS);
246 1.1 mrg setjmp_crosses = BITMAP_ALLOC (&df_bitmap_obstack);
247 1.1 mrg max_regno = max_reg_num ();
248 1.1 mrg reg_info_p_size = max_regno;
249 1.1 mrg reg_info_p = XCNEWVEC (struct reg_info_t, max_regno);
250 1.1 mrg
251 1.1 mrg FOR_EACH_BB_FN (bb, cfun)
252 1.1 mrg {
253 1.1 mrg regstat_bb_compute_ri (bb, live);
254 1.1 mrg }
255 1.1 mrg
256 1.1 mrg BITMAP_FREE (live);
257 1.1 mrg
258 1.1 mrg /* See the setjmp comment in regstat_bb_compute_ri. */
259 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (setjmp_crosses, FIRST_PSEUDO_REGISTER, regno, bi)
260 1.1 mrg {
261 1.1 mrg REG_BASIC_BLOCK (regno) = REG_BLOCK_UNKNOWN;
262 1.1 mrg }
263 1.1 mrg
264 1.1 mrg timevar_pop (TV_REG_STATS);
265 1.1 mrg }
266 1.1 mrg
267 1.1 mrg
268 1.1 mrg /* Free all storage associated with the problem. */
269 1.1 mrg
270 1.1 mrg void
271 1.1 mrg regstat_free_ri (void)
272 1.1 mrg {
273 1.1 mrg gcc_assert (reg_info_p);
274 1.1 mrg reg_info_p_size = 0;
275 1.1 mrg free (reg_info_p);
276 1.1 mrg reg_info_p = NULL;
277 1.1 mrg
278 1.1 mrg BITMAP_FREE (setjmp_crosses);
279 1.1 mrg }
280 1.1 mrg
281 1.1 mrg
282 1.1 mrg /* Return a bitmap containing the set of registers that cross a setjmp.
283 1.1 mrg The client should not change or delete this bitmap. */
284 1.1 mrg
285 1.1 mrg bitmap
286 1.1 mrg regstat_get_setjmp_crosses (void)
287 1.1 mrg {
288 1.1 mrg return setjmp_crosses;
289 1.1 mrg }
290 1.1 mrg
291 1.1 mrg /*----------------------------------------------------------------------------
292 1.1 mrg Process REG_N_CALLS_CROSSED.
293 1.1 mrg
294 1.1 mrg This is used by sched_deps. A good implementation of sched-deps
295 1.1 mrg would really process the blocks directly rather than going through
296 1.1 mrg lists of insns. If it did this, it could use the exact regs that
297 1.1 mrg cross an individual call rather than using this info that merges
298 1.1 mrg the info for all calls.
299 1.1 mrg
300 1.1 mrg ----------------------------------------------------------------------------*/
301 1.1 mrg
302 1.1 mrg
303 1.1 mrg
304 1.1 mrg /* Compute calls crossed for BB. Live is a scratch bitvector. */
305 1.1 mrg
306 1.1 mrg static void
307 1.1 mrg regstat_bb_compute_calls_crossed (unsigned int bb_index, bitmap live)
308 1.1 mrg {
309 1.1 mrg basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
310 1.1 mrg rtx_insn *insn;
311 1.1 mrg df_ref def, use;
312 1.1 mrg
313 1.1 mrg bitmap_copy (live, df_get_live_out (bb));
314 1.1 mrg
315 1.1 mrg /* Process the artificial defs and uses at the bottom of the block
316 1.1 mrg to begin processing. */
317 1.1 mrg FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
318 1.1 mrg if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0)
319 1.1 mrg bitmap_clear_bit (live, DF_REF_REGNO (def));
320 1.1 mrg
321 1.1 mrg FOR_EACH_ARTIFICIAL_USE (use, bb_index)
322 1.1 mrg if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == 0)
323 1.1 mrg bitmap_set_bit (live, DF_REF_REGNO (use));
324 1.1 mrg
325 1.1 mrg FOR_BB_INSNS_REVERSE (bb, insn)
326 1.1 mrg {
327 1.1 mrg if (!NONDEBUG_INSN_P (insn))
328 1.1 mrg continue;
329 1.1 mrg
330 1.1 mrg gcc_assert (INSN_UID (insn) < (int) DF_INSN_SIZE ());
331 1.1 mrg struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
332 1.1 mrg unsigned int regno;
333 1.1 mrg
334 1.1 mrg /* Process the defs. */
335 1.1 mrg if (CALL_P (insn))
336 1.1 mrg {
337 1.1 mrg bitmap_iterator bi;
338 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (live, 0, regno, bi)
339 1.1 mrg {
340 1.1 mrg REG_N_CALLS_CROSSED (regno)++;
341 1.1 mrg }
342 1.1 mrg }
343 1.1 mrg
344 1.1 mrg /* All of the defs except the return value are some sort of
345 1.1 mrg clobber. This code is for the return. */
346 1.1 mrg FOR_EACH_INSN_INFO_DEF (def, insn_info)
347 1.1 mrg {
348 1.1 mrg if ((!CALL_P (insn))
349 1.1 mrg || (!(DF_REF_FLAGS (def) & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))))
350 1.1 mrg {
351 1.1 mrg /* Kill this register if it is not a subreg store or conditional store. */
352 1.1 mrg if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
353 1.1 mrg bitmap_clear_bit (live, DF_REF_REGNO (def));
354 1.1 mrg }
355 1.1 mrg }
356 1.1 mrg
357 1.1 mrg FOR_EACH_INSN_INFO_USE (use, insn_info)
358 1.1 mrg bitmap_set_bit (live, DF_REF_REGNO (use));
359 1.1 mrg }
360 1.1 mrg }
361 1.1 mrg
362 1.1 mrg
363 1.1 mrg /* Compute register info: lifetime, bb, and number of defs and uses. */
364 1.1 mrg void
365 1.1 mrg regstat_compute_calls_crossed (void)
366 1.1 mrg {
367 1.1 mrg basic_block bb;
368 1.1 mrg bitmap live = BITMAP_ALLOC (&df_bitmap_obstack);
369 1.1 mrg
370 1.1 mrg /* Initialize everything. */
371 1.1 mrg gcc_assert (!reg_info_p);
372 1.1 mrg
373 1.1 mrg timevar_push (TV_REG_STATS);
374 1.1 mrg max_regno = max_reg_num ();
375 1.1 mrg reg_info_p_size = max_regno;
376 1.1 mrg reg_info_p = XCNEWVEC (struct reg_info_t, max_regno);
377 1.1 mrg
378 1.1 mrg FOR_EACH_BB_FN (bb, cfun)
379 1.1 mrg {
380 1.1 mrg regstat_bb_compute_calls_crossed (bb->index, live);
381 1.1 mrg }
382 1.1 mrg
383 1.1 mrg BITMAP_FREE (live);
384 1.1 mrg timevar_pop (TV_REG_STATS);
385 1.1 mrg }
386 1.1 mrg
387 1.1 mrg
388 1.1 mrg /* Free all storage associated with the problem. */
389 1.1 mrg
390 1.1 mrg void
391 1.1 mrg regstat_free_calls_crossed (void)
392 1.1 mrg {
393 1.1 mrg gcc_assert (reg_info_p);
394 1.1 mrg reg_info_p_size = 0;
395 1.1 mrg free (reg_info_p);
396 1.1 mrg reg_info_p = NULL;
397 1.1 mrg }
398 1.1 mrg
399 1.1 mrg /* Dump the register info to FILE. */
400 1.1 mrg
401 1.1 mrg void
402 1.1 mrg dump_reg_info (FILE *file)
403 1.1 mrg {
404 1.1 mrg unsigned int i, max = max_reg_num ();
405 1.1 mrg if (reload_completed)
406 1.1 mrg return;
407 1.1 mrg
408 1.1 mrg if (reg_info_p_size < max)
409 1.1 mrg max = reg_info_p_size;
410 1.1 mrg
411 1.1 mrg fprintf (file, "%d registers.\n", max);
412 1.1 mrg for (i = FIRST_PSEUDO_REGISTER; i < max; i++)
413 1.1 mrg {
414 1.1 mrg enum reg_class rclass, altclass;
415 1.1 mrg
416 1.1 mrg if (regstat_n_sets_and_refs)
417 1.1 mrg fprintf (file, "\nRegister %d used %d times",
418 1.1 mrg i, REG_N_REFS (i));
419 1.1 mrg else if (df)
420 1.1 mrg fprintf (file, "\nRegister %d used %d times",
421 1.1 mrg i, DF_REG_USE_COUNT (i) + DF_REG_DEF_COUNT (i));
422 1.1 mrg
423 1.1 mrg if (REG_BASIC_BLOCK (i) >= NUM_FIXED_BLOCKS)
424 1.1 mrg fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
425 1.1 mrg if (regstat_n_sets_and_refs)
426 1.1 mrg fprintf (file, "; set %d time%s", REG_N_SETS (i),
427 1.1 mrg (REG_N_SETS (i) == 1) ? "" : "s");
428 1.1 mrg else if (df)
429 1.1 mrg fprintf (file, "; set %d time%s", DF_REG_DEF_COUNT (i),
430 1.1 mrg (DF_REG_DEF_COUNT (i) == 1) ? "" : "s");
431 1.1 mrg if (regno_reg_rtx[i] != NULL && REG_USERVAR_P (regno_reg_rtx[i]))
432 1.1 mrg fputs ("; user var", file);
433 1.1 mrg if (REG_N_DEATHS (i) != 1)
434 1.1 mrg fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
435 1.1 mrg if (REG_N_CALLS_CROSSED (i) == 1)
436 1.1 mrg fputs ("; crosses 1 call", file);
437 1.1 mrg else if (REG_N_CALLS_CROSSED (i))
438 1.1 mrg fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
439 1.1 mrg if (regno_reg_rtx[i] != NULL
440 1.1 mrg && maybe_ne (PSEUDO_REGNO_BYTES (i), UNITS_PER_WORD))
441 1.1 mrg {
442 1.1 mrg fprintf (file, "; ");
443 1.1 mrg print_dec (PSEUDO_REGNO_BYTES (i), file, SIGNED);
444 1.1 mrg fprintf (file, " bytes");
445 1.1 mrg }
446 1.1 mrg
447 1.1 mrg rclass = reg_preferred_class (i);
448 1.1 mrg altclass = reg_alternate_class (i);
449 1.1 mrg if (rclass != GENERAL_REGS || altclass != ALL_REGS)
450 1.1 mrg {
451 1.1 mrg if (altclass == ALL_REGS || rclass == ALL_REGS)
452 1.1 mrg fprintf (file, "; pref %s", reg_class_names[(int) rclass]);
453 1.1 mrg else if (altclass == NO_REGS)
454 1.1 mrg fprintf (file, "; %s or none", reg_class_names[(int) rclass]);
455 1.1 mrg else
456 1.1 mrg fprintf (file, "; pref %s, else %s",
457 1.1 mrg reg_class_names[(int) rclass],
458 1.1 mrg reg_class_names[(int) altclass]);
459 1.1 mrg }
460 1.1 mrg
461 1.1 mrg if (regno_reg_rtx[i] != NULL && REG_POINTER (regno_reg_rtx[i]))
462 1.1 mrg fputs ("; pointer", file);
463 1.1 mrg fputs (".\n", file);
464 1.1 mrg }
465 1.1 mrg }
466 1.1 mrg
467