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