rtl.c 16.2 KB
Newer Older
1
/* RTL utility routines.
2 3
   Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
   2003 Free Software Foundation, Inc.
Jim Wilson committed
4

5
This file is part of GCC.
Jim Wilson committed
6

7 8 9 10
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
Jim Wilson committed
11

12 13 14 15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Jim Wilson committed
16 17

You should have received a copy of the GNU General Public License
18 19 20
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */
Jim Wilson committed
21 22

#include "config.h"
23
#include "system.h"
24 25
#include "coretypes.h"
#include "tm.h"
Jim Wilson committed
26
#include "rtl.h"
27
#include "real.h"
28
#include "ggc.h"
29
#include "errors.h"
Jim Wilson committed
30 31 32


/* Indexed by rtx code, gives number of operands for an rtx with that code.
33
   Does NOT include rtx header data (code and links).  */
Jim Wilson committed
34

35 36
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   sizeof FORMAT - 1 ,

37
const unsigned char rtx_length[NUM_RTX_CODE] = {
38 39 40 41
#include "rtl.def"
};

#undef DEF_RTL_EXPR
Jim Wilson committed
42 43 44 45 46

/* Indexed by rtx code, gives the name of that kind of rtx, as a C string.  */

#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   NAME ,

47
const char * const rtx_name[NUM_RTX_CODE] = {
Jim Wilson committed
48 49 50 51 52 53 54 55
#include "rtl.def"		/* rtl expressions are documented here */
};

#undef DEF_RTL_EXPR

/* Indexed by machine mode, gives the name of that machine mode.
   This name does not include the letters "mode".  */

56
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  NAME,
Jim Wilson committed
57

58
const char * const mode_name[NUM_MACHINE_MODES] = {
Jim Wilson committed
59 60 61 62 63
#include "machmode.def"
};

#undef DEF_MACHMODE

64
/* Indexed by machine mode, gives the class mode for GET_MODE_CLASS.  */
Jim Wilson committed
65

66
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  CLASS,
Jim Wilson committed
67

68
const enum mode_class mode_class[NUM_MACHINE_MODES] = {
Jim Wilson committed
69 70 71 72 73
#include "machmode.def"
};

#undef DEF_MACHMODE

74 75 76
/* Indexed by machine mode, gives the length of the mode, in bits.
   GET_MODE_BITSIZE uses this.  */

77
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  BITSIZE,
78

79
const unsigned short mode_bitsize[NUM_MACHINE_MODES] = {
80 81 82 83 84
#include "machmode.def"
};

#undef DEF_MACHMODE

Jim Wilson committed
85 86 87
/* Indexed by machine mode, gives the length of the mode, in bytes.
   GET_MODE_SIZE uses this.  */

88
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  SIZE,
Jim Wilson committed
89

90
const unsigned char mode_size[NUM_MACHINE_MODES] = {
Jim Wilson committed
91 92 93 94 95 96 97 98
#include "machmode.def"
};

#undef DEF_MACHMODE

/* Indexed by machine mode, gives the length of the mode's subunit.
   GET_MODE_UNIT_SIZE uses this.  */

99
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  UNIT,
Jim Wilson committed
100

101
const unsigned char mode_unit_size[NUM_MACHINE_MODES] = {
Jim Wilson committed
102 103 104 105 106 107 108 109 110
#include "machmode.def"		/* machine modes are documented here */
};

#undef DEF_MACHMODE

/* Indexed by machine mode, gives next wider natural mode
   (QI -> HI -> SI -> DI, etc.)  Widening multiply instructions
   use this.  */

111
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  \
112
  (unsigned char) WIDER,
Jim Wilson committed
113

114
const unsigned char mode_wider_mode[NUM_MACHINE_MODES] = {
Jim Wilson committed
115 116 117 118 119
#include "machmode.def"		/* machine modes are documented here */
};

#undef DEF_MACHMODE

120
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  \
121
  ((BITSIZE) >= HOST_BITS_PER_WIDE_INT) ? ~(unsigned HOST_WIDE_INT) 0 : ((unsigned HOST_WIDE_INT) 1 << (BITSIZE)) - 1,
122 123 124

/* Indexed by machine mode, gives mask of significant bits in mode.  */

125
const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES] = {
126 127 128
#include "machmode.def"
};

129 130 131 132 133 134 135 136 137 138 139
#undef DEF_MACHMODE

#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) INNER,

/* Indexed by machine mode, gives the mode of the inner elements in a
   vector type.  */

const enum machine_mode inner_mode_array[NUM_MACHINE_MODES] = {
#include "machmode.def"
};

140 141
/* Indexed by mode class, gives the narrowest mode for each class.
   The Q modes are always of width 1 (2 for complex) - it is impossible
142 143 144 145 146 147
   for any mode to be narrower.

   Note that we use QImode instead of BImode for MODE_INT, since
   otherwise the middle end will try to use it for bitfields in
   structures and the like, which we do not want.  Only the target
   md file should generate BImode widgets.  */
148 149 150 151 152 153 154 155

const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS] = {
    /* MODE_RANDOM */		VOIDmode,
    /* MODE_INT */		QImode,
    /* MODE_FLOAT */		QFmode,
    /* MODE_PARTIAL_INT */	PQImode,
    /* MODE_CC */		CCmode,
    /* MODE_COMPLEX_INT */	CQImode,
Bernd Schmidt committed
156
    /* MODE_COMPLEX_FLOAT */	QCmode,
157
    /* MODE_VECTOR_INT */	V1DImode,
Bernd Schmidt committed
158
    /* MODE_VECTOR_FLOAT */	V2SFmode
159
};
160

161

Jim Wilson committed
162 163
/* Indexed by rtx code, gives a sequence of operand-types for
   rtx's of that code.  The sequence is a C string in which
164
   each character describes one operand.  */
Jim Wilson committed
165

166
const char * const rtx_format[NUM_RTX_CODE] = {
Jim Wilson committed
167 168 169 170 171 172 173
  /* "*" undefined.
         can cause a warning message
     "0" field is unused (or used in a phase-dependent manner)
         prints nothing
     "i" an integer
         prints the integer
     "n" like "i", but prints entries from `note_insn_name'
Charles Hannum committed
174 175
     "w" an integer of width HOST_BITS_PER_WIDE_INT
         prints the integer
Jim Wilson committed
176 177 178 179
     "s" a pointer to a string
         prints the string
     "S" like "s", but optional:
	 the containing rtx may end before this operand
180 181
     "T" like "s", but treated specially by the RTL reader;
         only found in machine description patterns.
Jim Wilson committed
182 183 184 185 186 187 188
     "e" a pointer to an rtl expression
         prints the expression
     "E" a pointer to a vector that points to a number of rtl expressions
         prints a list of the rtl expressions
     "V" like "E", but optional:
	 the containing rtx may end before this operand
     "u" a pointer to another insn
189 190
         prints the uid of the insn.
     "b" is a pointer to a bitmap header.
Geoffrey Keating committed
191
     "B" is a basic block pointer.
192
     "t" is a tree pointer.  */
Jim Wilson committed
193 194 195 196 197 198 199 200 201

#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   FORMAT ,
#include "rtl.def"		/* rtl expressions are defined here */
#undef DEF_RTL_EXPR
};

/* Indexed by rtx code, gives a character representing the "class" of
   that rtx code.  See rtl.def for documentation on the defined classes.  */

202
const char rtx_class[NUM_RTX_CODE] = {
203
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   CLASS,
Jim Wilson committed
204 205 206 207 208 209
#include "rtl.def"		/* rtl expressions are defined here */
#undef DEF_RTL_EXPR
};

/* Names for kinds of NOTEs and REG_NOTEs.  */

210
const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS] =
211
{
212
  "", "NOTE_INSN_DELETED",
213 214 215
  "NOTE_INSN_BLOCK_BEG", "NOTE_INSN_BLOCK_END",
  "NOTE_INSN_LOOP_BEG", "NOTE_INSN_LOOP_END",
  "NOTE_INSN_LOOP_CONT", "NOTE_INSN_LOOP_VTOP",
216
  "NOTE_INSN_LOOP_END_TOP_COND", "NOTE_INSN_FUNCTION_END",
217 218 219
  "NOTE_INSN_PROLOGUE_END", "NOTE_INSN_EPILOGUE_BEG",
  "NOTE_INSN_DELETED_LABEL", "NOTE_INSN_FUNCTION_BEG",
  "NOTE_INSN_EH_REGION_BEG", "NOTE_INSN_EH_REGION_END",
220
  "NOTE_INSN_REPEATED_LINE_NUMBER",
221 222
  "NOTE_INSN_BASIC_BLOCK", "NOTE_INSN_EXPECTED_VALUE",
  "NOTE_INSN_PREDICTION"
223 224 225 226 227
};

const char * const reg_note_name[] =
{
  "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_EQUAL",
228
  "REG_RETVAL", "REG_LIBCALL", "REG_NONNEG",
229 230
  "REG_NO_CONFLICT", "REG_UNUSED", "REG_CC_SETTER", "REG_CC_USER",
  "REG_LABEL", "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_BR_PROB",
231
  "REG_NOALIAS", "REG_SAVE_AREA", "REG_BR_PRED",
232
  "REG_FRAME_RELATED_EXPR", "REG_EH_CONTEXT", "REG_EH_REGION",
233
  "REG_SAVE_NOTE", "REG_MAYBE_DEAD", "REG_NORETURN",
234 235
  "REG_NON_LOCAL_GOTO", "REG_SETJMP", "REG_ALWAYS_RETURN",
  "REG_VTABLE_REF"
236
};
Jim Wilson committed
237

Jeff Law committed
238

Jim Wilson committed
239 240 241 242
/* Allocate an rtx vector of N elements.
   Store the length, and initialize all elements to zero.  */

rtvec
243
rtvec_alloc (int n)
Jim Wilson committed
244 245
{
  rtvec rt;
246

Mark Mitchell committed
247
  rt = ggc_alloc_rtvec (n);
248 249
  /* clear out the vector */
  memset (&rt->elem[0], 0, n * sizeof (rtx));
Jim Wilson committed
250

251
  PUT_NUM_ELEM (rt, n);
Jim Wilson committed
252 253 254 255 256 257 258
  return rt;
}

/* Allocate an rtx of code CODE.  The CODE is stored in the rtx;
   all the rest is initialized to zero.  */

rtx
259
rtx_alloc (RTX_CODE code)
Jim Wilson committed
260 261
{
  rtx rt;
262
  int n = GET_RTX_LENGTH (code);
Jim Wilson committed
263

Mark Mitchell committed
264
  rt = ggc_alloc_rtx (n);
265

266 267 268
  /* We want to clear everything up to the FLD array.  Normally, this
     is one int, but we don't want to assume that and it isn't very
     portable anyway; this is.  */
269

270
  memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion));
Jim Wilson committed
271 272 273
  PUT_CODE (rt, code);
  return rt;
}
274

Jim Wilson committed
275 276 277 278 279 280

/* Create a new copy of an rtx.
   Recursively copies the operands of the rtx,
   except for those few rtx codes that are sharable.  */

rtx
281
copy_rtx (rtx orig)
Jim Wilson committed
282
{
283 284 285 286
  rtx copy;
  int i, j;
  RTX_CODE code;
  const char *format_ptr;
Jim Wilson committed
287 288 289 290 291 292 293 294 295

  code = GET_CODE (orig);

  switch (code)
    {
    case REG:
    case QUEUED:
    case CONST_INT:
    case CONST_DOUBLE:
296
    case CONST_VECTOR:
Jim Wilson committed
297 298 299 300
    case SYMBOL_REF:
    case CODE_LABEL:
    case PC:
    case CC0:
301
    case SCRATCH:
Mike Stump committed
302
      /* SCRATCH must be shared because they represent distinct values.  */
303
    case ADDRESSOF:
Jim Wilson committed
304
      return orig;
305 306 307 308 309 310 311 312 313 314

    case CONST:
      /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
	 a LABEL_REF, it isn't sharable.  */
      if (GET_CODE (XEXP (orig, 0)) == PLUS
	  && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
	  && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
	return orig;
      break;

315 316 317 318
      /* A MEM with a constant address is not sharable.  The problem is that
	 the constant address may need to be reloaded.  If the mem is shared,
	 then reloading one copy of this mem will cause all copies to appear
	 to have been reloaded.  */
319 320 321

    default:
      break;
Jim Wilson committed
322 323 324
    }

  copy = rtx_alloc (code);
325 326 327 328 329

  /* Copy the various flags, and other information.  We assume that
     all fields need copying, and then clear the fields that should
     not be copied.  That is the sensible default behavior, and forces
     us to explicitly document why we are *not* copying a flag.  */
Kaveh R. Ghazi committed
330
  memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion));
331 332 333

  /* We do not copy the USED flag, which is used as a mark bit during
     walks over the RTL.  */
334
  RTX_FLAG (copy, used) = 0;
335

336
  /* We do not copy FRAME_RELATED for INSNs.  */
337
  if (GET_RTX_CLASS (code) == 'i')
338 339 340
    RTX_FLAG (copy, frame_related) = 0;
  RTX_FLAG (copy, jump) = RTX_FLAG (orig, jump);
  RTX_FLAG (copy, call) = RTX_FLAG (orig, call);
341

Jim Wilson committed
342 343 344 345
  format_ptr = GET_RTX_FORMAT (GET_CODE (copy));

  for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
    {
346
      copy->fld[i] = orig->fld[i];
Jim Wilson committed
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
      switch (*format_ptr++)
	{
	case 'e':
	  if (XEXP (orig, i) != NULL)
	    XEXP (copy, i) = copy_rtx (XEXP (orig, i));
	  break;

	case 'E':
	case 'V':
	  if (XVEC (orig, i) != NULL)
	    {
	      XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
	      for (j = 0; j < XVECLEN (copy, i); j++)
		XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
	    }
	  break;

364
	case 't':
Charles Hannum committed
365 366 367 368
	case 'w':
	case 'i':
	case 's':
	case 'S':
369
	case 'T':
370
	case 'u':
371
	case 'B':
372
	case '0':
373
	  /* These are left unchanged.  */
374
	  break;
375

Charles Hannum committed
376 377
	default:
	  abort ();
Jim Wilson committed
378 379 380 381
	}
    }
  return copy;
}
382 383

/* Create a new copy of an rtx.  Only copy just one level.  */
384

385
rtx
386
shallow_copy_rtx (rtx orig)
387
{
388
  RTX_CODE code = GET_CODE (orig);
389 390
  size_t n = GET_RTX_LENGTH (code);
  rtx copy = ggc_alloc_rtx (n);
391

392 393
  memcpy (copy, orig,
	  sizeof (struct rtx_def) + sizeof (rtunion) * (n - 1));
394 395 396

  return copy;
}
Jim Wilson committed
397

398 399
/* This is 1 until after the rtl generation pass.  */
int rtx_equal_function_value_matters;
400 401 402

/* Nonzero when we are generating CONCATs.  */
int generating_concat_p;
403 404 405 406 407

/* Return 1 if X and Y are identical-looking rtx's.
   This is the Lisp function EQUAL for rtx arguments.  */

int
408
rtx_equal_p (rtx x, rtx y)
409
{
410 411 412 413
  int i;
  int j;
  enum rtx_code code;
  const char *fmt;
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430

  if (x == y)
    return 1;
  if (x == 0 || y == 0)
    return 0;

  code = GET_CODE (x);
  /* Rtx's of different codes cannot be equal.  */
  if (code != GET_CODE (y))
    return 0;

  /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
     (REG:SI x) and (REG:HI x) are NOT equivalent.  */

  if (GET_MODE (x) != GET_MODE (y))
    return 0;

431 432 433 434
  /* Some RTL can be compared nonrecursively.  */
  switch (code)
    {
    case REG:
435 436 437 438 439
      /* Until rtl generation is complete, don't consider a reference
	 to the return register of the current function the same as
	 the return from a called function.  This eases the job of
	 function integration.  Once the distinction is no longer
	 needed, they can be considered equivalent.  */
440 441 442 443 444 445 446 447 448 449 450 451 452
      return (REGNO (x) == REGNO (y)
	      && (! rtx_equal_function_value_matters
		  || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));

    case LABEL_REF:
      return XEXP (x, 0) == XEXP (y, 0);

    case SYMBOL_REF:
      return XSTR (x, 0) == XSTR (y, 0);

    case SCRATCH:
    case CONST_DOUBLE:
    case CONST_INT:
453
    case CONST_VECTOR:
454 455 456 457 458
      return 0;

    default:
      break;
    }
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497

  /* Compare the elements.  If any pair of corresponding elements
     fail to match, return 0 for the whole things.  */

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      switch (fmt[i])
	{
	case 'w':
	  if (XWINT (x, i) != XWINT (y, i))
	    return 0;
	  break;

	case 'n':
	case 'i':
	  if (XINT (x, i) != XINT (y, i))
	    return 0;
	  break;

	case 'V':
	case 'E':
	  /* Two vectors must have the same length.  */
	  if (XVECLEN (x, i) != XVECLEN (y, i))
	    return 0;

	  /* And the corresponding elements must match.  */
	  for (j = 0; j < XVECLEN (x, i); j++)
	    if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
	      return 0;
	  break;

	case 'e':
	  if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
	    return 0;
	  break;

	case 'S':
	case 's':
498 499 500
	  if ((XSTR (x, i) || XSTR (y, i))
	      && (! XSTR (x, i) || ! XSTR (y, i)
		  || strcmp (XSTR (x, i), XSTR (y, i))))
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
	    return 0;
	  break;

	case 'u':
	  /* These are just backpointers, so they don't matter.  */
	  break;

	case '0':
	case 't':
	  break;

	  /* It is believed that rtx's at this level will never
	     contain anything but integers and other rtx's,
	     except for within LABEL_REFs and SYMBOL_REFs.  */
	default:
	  abort ();
	}
    }
  return 1;
}

522
#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
523
void
524 525
rtl_check_failed_bounds (rtx r, int n, const char *file, int line,
			 const char *func)
526
{
527 528 529 530
  internal_error
    ("RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d",
     n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
     func, trim_filename (file), line);
531 532 533
}

void
534 535
rtl_check_failed_type1 (rtx r, int n, int c1, const char *file, int line,
			const char *func)
536
{
537 538 539 540
  internal_error
    ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
     n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
     func, trim_filename (file), line);
541 542 543
}

void
544 545
rtl_check_failed_type2 (rtx r, int n, int c1, int c2, const char *file,
			int line, const char *func)
546
{
547 548 549 550
  internal_error
    ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
     n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
     func, trim_filename (file), line);
551 552
}

553
void
554 555
rtl_check_failed_code1 (rtx r, enum rtx_code code, const char *file,
			int line, const char *func)
556
{
557 558 559
  internal_error ("RTL check: expected code `%s', have `%s' in %s, at %s:%d",
		  GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
		  trim_filename (file), line);
560 561 562
}

void
563 564
rtl_check_failed_code2 (rtx r, enum rtx_code code1, enum rtx_code code2,
			const char *file, int line, const char *func)
565
{
566 567 568
  internal_error
    ("RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d",
     GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
569
     func, trim_filename (file), line);
570 571
}

572 573
/* XXX Maybe print the vector?  */
void
574 575
rtvec_check_failed_bounds (rtvec r, int n, const char *file, int line,
			   const char *func)
576
{
577 578 579
  internal_error
    ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
     n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
580
}
581
#endif /* ENABLE_RTL_CHECKING */
582 583 584

#if defined ENABLE_RTL_FLAG_CHECKING
void
585 586
rtl_check_failed_flag (const char *name, rtx r, const char *file,
		       int line, const char *func)
587 588
{
  internal_error
589 590
    ("RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d",
     name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
591 592
}
#endif /* ENABLE_RTL_FLAG_CHECKING */