rtl.c 24.9 KB
Newer Older
1
/* RTL utility routines.
2
   Copyright (C) 1987-2019 Free Software Foundation, Inc.
Jim Wilson committed
3

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

6 7
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
8
Software Foundation; either version 3, or (at your option) any later
9
version.
Jim Wilson committed
10

11 12 13 14
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
15 16

You should have received a copy of the GNU General Public License
17 18
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
Jim Wilson committed
19

20 21 22 23 24
/* This file is compiled twice: once for the generator programs
   once for the compiler.  */
#ifdef GENERATOR_FILE
#include "bconfig.h"
#else
Jim Wilson committed
25
#include "config.h"
26 27
#endif

28
#include "system.h"
29 30
#include "coretypes.h"
#include "tm.h"
31
#include "rtl.h"
32 33 34
#ifdef GENERATOR_FILE
# include "errors.h"
#else
Andi Kleen committed
35
# include "rtlhash.h"
36
# include "diagnostic-core.h"
37
#endif
Jim Wilson committed
38 39 40

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

43 44
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   sizeof FORMAT - 1 ,

45
const unsigned char rtx_length[NUM_RTX_CODE] = {
46 47 48 49
#include "rtl.def"
};

#undef DEF_RTL_EXPR
Jim Wilson committed
50 51 52 53 54

/* 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 ,

55
const char * const rtx_name[NUM_RTX_CODE] = {
Jim Wilson committed
56 57 58 59 60 61 62
#include "rtl.def"		/* rtl expressions are documented here */
};

#undef DEF_RTL_EXPR

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

65
const char * const rtx_format[NUM_RTX_CODE] = {
Jim Wilson committed
66 67 68 69 70 71 72
  /* "*" 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
73 74
     "w" an integer of width HOST_BITS_PER_WIDE_INT
         prints the integer
Jim Wilson committed
75 76 77 78
     "s" a pointer to a string
         prints the string
     "S" like "s", but optional:
	 the containing rtx may end before this operand
79 80
     "T" like "s", but treated specially by the RTL reader;
         only found in machine description patterns.
Jim Wilson committed
81 82 83 84 85 86 87
     "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
88 89
         prints the uid of the insn.
     "b" is a pointer to a bitmap header.
Geoffrey Keating committed
90
     "B" is a basic block pointer.
91
     "t" is a tree pointer.
92 93
     "r" a register.
     "p" is a poly_uint16 offset.  */
Jim Wilson committed
94 95 96 97 98 99 100 101 102

#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.  */

103
const enum rtx_class rtx_class[NUM_RTX_CODE] = {
104
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   CLASS,
Jim Wilson committed
105 106 107 108
#include "rtl.def"		/* rtl expressions are defined here */
#undef DEF_RTL_EXPR
};

109 110 111 112 113 114 115 116 117 118 119 120
/* Whether rtxs with the given code code store data in the hwint field.  */

#define RTX_CODE_HWINT_P_1(ENUM)					\
    ((ENUM) == CONST_INT || (ENUM) == CONST_DOUBLE			\
     || (ENUM) == CONST_FIXED || (ENUM) == CONST_WIDE_INT)
#ifdef GENERATOR_FILE
#define RTX_CODE_HWINT_P(ENUM)						\
    (RTX_CODE_HWINT_P_1 (ENUM) || (ENUM) == EQ_ATTR_ALT)
#else
#define RTX_CODE_HWINT_P RTX_CODE_HWINT_P_1
#endif

121 122
/* Indexed by rtx code, gives the size of the rtx in bytes.  */

123
const unsigned char rtx_code_size[NUM_RTX_CODE] = {
124
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)				\
125
  (RTX_CODE_HWINT_P (ENUM)						\
126
   ? RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (HOST_WIDE_INT)	\
127 128
   : (ENUM) == REG							\
   ? RTX_HDR_SIZE + sizeof (reg_info)					\
129 130 131 132 133 134
   : RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (rtunion)),

#include "rtl.def"
#undef DEF_RTL_EXPR
};

Jim Wilson committed
135 136
/* Names for kinds of NOTEs and REG_NOTEs.  */

137
const char * const note_insn_name[NOTE_INSN_MAX] =
138
{
139 140 141
#define DEF_INSN_NOTE(NAME) #NAME,
#include "insn-notes.def"
#undef DEF_INSN_NOTE
142 143
};

144
const char * const reg_note_name[REG_NOTE_MAX] =
145
{
146 147 148
#define DEF_REG_NOTE(NAME) #NAME,
#include "reg-notes.def"
#undef DEF_REG_NOTE
149
};
Jim Wilson committed
150

151 152 153 154
static size_t rtx_alloc_counts[(int) LAST_AND_UNUSED_RTX_CODE];
static size_t rtx_alloc_sizes[(int) LAST_AND_UNUSED_RTX_CODE];
static size_t rtvec_alloc_counts;
static size_t rtvec_alloc_sizes;
155

Jeff Law committed
156

Jim Wilson committed
157 158 159 160
/* Allocate an rtx vector of N elements.
   Store the length, and initialize all elements to zero.  */

rtvec
161
rtvec_alloc (int n)
Jim Wilson committed
162 163
{
  rtvec rt;
164

165
  rt = ggc_alloc_rtvec_sized (n);
166
  /* Clear out the vector.  */
167
  memset (&rt->elem[0], 0, n * sizeof (rtx));
Jim Wilson committed
168

169
  PUT_NUM_ELEM (rt, n);
170

171 172 173 174 175
  if (GATHER_STATISTICS)
    {
      rtvec_alloc_counts++;
      rtvec_alloc_sizes += n * sizeof (rtx);
    }
176

Jim Wilson committed
177 178 179
  return rt;
}

180 181 182 183 184 185 186 187 188 189 190 191 192 193
/* Create a bitwise copy of VEC.  */

rtvec
shallow_copy_rtvec (rtvec vec)
{
  rtvec newvec;
  int n;

  n = GET_NUM_ELEM (vec);
  newvec = rtvec_alloc (n);
  memcpy (&newvec->elem[0], &vec->elem[0], sizeof (rtx) * n);
  return newvec;
}

194 195 196
/* Return the number of bytes occupied by rtx value X.  */

unsigned int
197
rtx_size (const_rtx x)
198
{
Kenneth Zadeck committed
199 200 201 202 203
  if (CONST_WIDE_INT_P (x))
    return (RTX_HDR_SIZE
	    + sizeof (struct hwivec_def)
	    + ((CONST_WIDE_INT_NUNITS (x) - 1)
	       * sizeof (HOST_WIDE_INT)));
204 205 206 207
  if (CONST_POLY_INT_P (x))
    return (RTX_HDR_SIZE
	    + sizeof (struct const_poly_int_def)
	    + CONST_POLY_INT_COEFFS (x).extra_size ());
208
  if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_HAS_BLOCK_INFO_P (x))
209 210 211 212
    return RTX_HDR_SIZE + sizeof (struct block_symbol);
  return RTX_CODE_SIZE (GET_CODE (x));
}

Kenneth Zadeck committed
213 214
/* Allocate an rtx of code CODE with EXTRA bytes in it.  The CODE is
   stored in the rtx; all the rest is initialized to zero.  */
Jim Wilson committed
215 216

rtx
Kenneth Zadeck committed
217
rtx_alloc_stat_v (RTX_CODE code MEM_STAT_DECL, int extra)
Jim Wilson committed
218
{
Kenneth Zadeck committed
219 220
  rtx rt = ggc_alloc_rtx_def_stat (RTX_CODE_SIZE (code) + extra
				   PASS_MEM_STAT);
221

222 223 224
  /* 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.  */
225

226
  memset (rt, 0, RTX_HDR_SIZE);
Jim Wilson committed
227
  PUT_CODE (rt, code);
228

229 230 231 232 233
  if (GATHER_STATISTICS)
    {
      rtx_alloc_counts[code]++;
      rtx_alloc_sizes[code] += RTX_CODE_SIZE (code);
    }
234

Jim Wilson committed
235 236
  return rt;
}
237

Kenneth Zadeck committed
238 239 240 241
/* Allocate an rtx of code CODE.  The CODE is stored in the rtx;
   all the rest is initialized to zero.  */

rtx
242
rtx_alloc (RTX_CODE code MEM_STAT_DECL)
Kenneth Zadeck committed
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
{
  return rtx_alloc_stat_v (code PASS_MEM_STAT, 0);
}

/* Write the wide constant X to OUTFILE.  */

void
cwi_output_hex (FILE *outfile, const_rtx x)
{
  int i = CWI_GET_NUM_ELEM (x);
  gcc_assert (i > 0);
  if (CWI_ELT (x, i - 1) == 0)
    /* The HOST_WIDE_INT_PRINT_HEX prepends a 0x only if the val is
       non zero.  We want all numbers to have a 0x prefix.  */
    fprintf (outfile, "0x");
  fprintf (outfile, HOST_WIDE_INT_PRINT_HEX, CWI_ELT (x, --i));
  while (--i >= 0)
    fprintf (outfile, HOST_WIDE_INT_PRINT_PADDED_HEX, CWI_ELT (x, i));
}

Jim Wilson committed
263

264 265 266
/* Return true if ORIG is a sharable CONST.  */

bool
267
shared_const_p (const_rtx orig)
268 269
{
  gcc_assert (GET_CODE (orig) == CONST);
H.J. Lu committed
270

271 272
  /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
     a LABEL_REF, it isn't sharable.  */
273
  poly_int64 offset;
274 275
  return (GET_CODE (XEXP (orig, 0)) == PLUS
	  && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
276
	  && poly_int_rtx_p (XEXP (XEXP (orig, 0), 1), &offset));
277 278 279
}


Jim Wilson committed
280 281 282 283 284
/* Create a new copy of an rtx.
   Recursively copies the operands of the rtx,
   except for those few rtx codes that are sharable.  */

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

  code = GET_CODE (orig);

  switch (code)
    {
    case REG:
297 298
    case DEBUG_EXPR:
    case VALUE:
299
    CASE_CONST_ANY:
Jim Wilson committed
300 301 302 303
    case SYMBOL_REF:
    case CODE_LABEL:
    case PC:
    case CC0:
304
    case RETURN:
305
    case SIMPLE_RETURN:
306
    case SCRATCH:
Mike Stump committed
307
      /* SCRATCH must be shared because they represent distinct values.  */
Jim Wilson committed
308
      return orig;
309
    case CLOBBER:
310 311 312 313 314
      /* Share clobbers of hard registers (like cc0), but do not share pseudo reg
         clobbers or clobbers of hard registers that originated as pseudos.
         This is needed to allow safe register renaming.  */
      if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER
	  && ORIGINAL_REGNO (XEXP (orig, 0)) == REGNO (XEXP (orig, 0)))
315 316
	return orig;
      break;
317

318 319 320 321
    case CLOBBER_HIGH:
	gcc_assert (REG_P (XEXP (orig, 0)));
	return orig;

322
    case CONST:
323
      if (shared_const_p (orig))
324 325 326
	return orig;
      break;

327 328 329 330
      /* 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.  */
331 332 333

    default:
      break;
Jim Wilson committed
334 335
    }

336 337
  /* Copy the various flags, fields, and other information.  We assume
     that all fields need copying, and then clear the fields that should
338 339
     not be copied.  That is the sensible default behavior, and forces
     us to explicitly document why we are *not* copying a flag.  */
340
  copy = shallow_copy_rtx (orig);
341

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

  for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
    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;

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

      default:
	gcc_unreachable ();
      }
Jim Wilson committed
378 379
  return copy;
}
380 381

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

383
rtx
384
shallow_copy_rtx (const_rtx orig MEM_STAT_DECL)
385
{
386
  const unsigned int size = rtx_size (orig);
Diego Novillo committed
387
  rtx const copy = ggc_alloc_rtx_def_stat (size PASS_MEM_STAT);
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
  memcpy (copy, orig, size);
  switch (GET_CODE (orig))
    {
      /* RTX codes copy_rtx_if_shared_1 considers are shareable,
	 the used flag is often used for other purposes.  */
    case REG:
    case DEBUG_EXPR:
    case VALUE:
    CASE_CONST_ANY:
    case SYMBOL_REF:
    case CODE_LABEL:
    case PC:
    case CC0:
    case RETURN:
    case SIMPLE_RETURN:
    case SCRATCH:
      break;
    default:
      /* For all other RTXes clear the used flag on the copy.  */
      RTX_FLAG (copy, used) = 0;
      break;
    }
  return copy;
411
}
Jim Wilson committed
412

413 414
/* Nonzero when we are generating CONCATs.  */
int generating_concat_p;
415 416 417 418

/* Nonzero when we are expanding trees to RTL.  */
int currently_expanding_to_rtl;

419

420

H.J. Lu committed
421
/* Same as rtx_equal_p, but call CB on each pair of rtx if CB is not NULL.
422 423 424
   When the callback returns true, we continue with the new pair.
   Whenever changing this function check if rtx_equal_p below doesn't need
   changing as well.  */
425 426

int
427
rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb)
428
{
429 430 431 432
  int i;
  int j;
  enum rtx_code code;
  const char *fmt;
433
  rtx nx, ny;
434 435 436 437 438 439

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

440 441 442 443 444
  /* Invoke the callback first.  */
  if (cb != NULL
      && ((*cb) (&x, &y, &nx, &ny)))
    return rtx_equal_p_cb (nx, ny, cb);

445 446 447 448 449 450 451 452 453 454 455
  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;

456
  /* MEMs referring to different address space are not equivalent.  */
457 458 459
  if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
    return 0;

460 461 462 463
  /* Some RTL can be compared nonrecursively.  */
  switch (code)
    {
    case REG:
464
      return (REGNO (x) == REGNO (y));
465 466

    case LABEL_REF:
467
      return label_ref_label (x) == label_ref_label (y);
468 469 470 471

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

472
    case DEBUG_EXPR:
473
    case VALUE:
474
    case SCRATCH:
475
    CASE_CONST_UNIQUE:
476 477
      return 0;

478 479 480 481
    case DEBUG_IMPLICIT_PTR:
      return DEBUG_IMPLICIT_PTR_DECL (x)
	     == DEBUG_IMPLICIT_PTR_DECL (y);

482 483
    case DEBUG_PARAMETER_REF:
      return DEBUG_PARAMETER_REF_DECL (x)
484
	     == DEBUG_PARAMETER_REF_DECL (y);
485

486 487 488
    case ENTRY_VALUE:
      return rtx_equal_p_cb (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y), cb);

489 490 491
    default:
      break;
    }
492 493

  /* Compare the elements.  If any pair of corresponding elements
Eric Christopher committed
494
     fail to match, return 0 for the whole thing.  */
495 496 497 498 499 500 501 502 503 504 505 506 507 508

  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))
509 510 511 512
	    {
#ifndef GENERATOR_FILE
	      if (((code == ASM_OPERANDS && i == 6)
		   || (code == ASM_INPUT && i == 1))
513
		  && XINT (x, i) == XINT (y, i))
514 515 516 517
		break;
#endif
	      return 0;
	    }
518 519
	  break;

520 521 522 523 524
	case 'p':
	  if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
	    return 0;
	  break;

525 526 527 528 529 530 531 532
	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++)
H.J. Lu committed
533
	    if (rtx_equal_p_cb (XVECEXP (x, i, j),
534
                                XVECEXP (y, i, j), cb) == 0)
535 536 537 538
	      return 0;
	  break;

	case 'e':
539
	  if (rtx_equal_p_cb (XEXP (x, i), XEXP (y, i), cb) == 0)
540 541 542 543 544
	    return 0;
	  break;

	case 'S':
	case 's':
545 546 547
	  if ((XSTR (x, i) || XSTR (y, i))
	      && (! XSTR (x, i) || ! XSTR (y, i)
		  || strcmp (XSTR (x, i), XSTR (y, i))))
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
	    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:
563
	  gcc_unreachable ();
564 565 566 567
	}
    }
  return 1;
}
568

569
/* Return 1 if X and Y are identical-looking rtx's.
570 571 572
   This is the Lisp function EQUAL for rtx arguments.
   Whenever changing this function check if rtx_equal_p_cb above doesn't need
   changing as well.  */
573 574 575 576

int
rtx_equal_p (const_rtx x, const_rtx y)
{
577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597
  int i;
  int j;
  enum rtx_code code;
  const char *fmt;

  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;

598
  /* MEMs referring to different address space are not equivalent.  */
599 600 601
  if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
    return 0;

602 603 604 605 606 607 608
  /* Some RTL can be compared nonrecursively.  */
  switch (code)
    {
    case REG:
      return (REGNO (x) == REGNO (y));

    case LABEL_REF:
609
      return label_ref_label (x) == label_ref_label (y);
610 611 612 613

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

614
    case DEBUG_EXPR:
615
    case VALUE:
616
    case SCRATCH:
617
    CASE_CONST_UNIQUE:
618 619
      return 0;

620 621 622 623
    case DEBUG_IMPLICIT_PTR:
      return DEBUG_IMPLICIT_PTR_DECL (x)
	     == DEBUG_IMPLICIT_PTR_DECL (y);

624 625 626 627
    case DEBUG_PARAMETER_REF:
      return DEBUG_PARAMETER_REF_DECL (x)
	     == DEBUG_PARAMETER_REF_DECL (y);

628 629 630
    case ENTRY_VALUE:
      return rtx_equal_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y));

631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
    default:
      break;
    }

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

  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))
651 652 653 654
	    {
#ifndef GENERATOR_FILE
	      if (((code == ASM_OPERANDS && i == 6)
		   || (code == ASM_INPUT && i == 1))
655
		  && XINT (x, i) == XINT (y, i))
656 657 658 659
		break;
#endif
	      return 0;
	    }
660 661
	  break;

662 663 664 665 666
	case 'p':
	  if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
	    return 0;
	  break;

667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707
	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':
	  if ((XSTR (x, i) || XSTR (y, i))
	      && (! XSTR (x, i) || ! XSTR (y, i)
		  || strcmp (XSTR (x, i), XSTR (y, i))))
	    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:
	  gcc_unreachable ();
	}
    }
  return 1;
708 709
}

710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
/* Return true if all elements of VEC are equal.  */

bool
rtvec_all_equal_p (const_rtvec vec)
{
  const_rtx first = RTVEC_ELT (vec, 0);
  /* Optimize the important special case of a vector of constants.
     The main use of this function is to detect whether every element
     of CONST_VECTOR is the same.  */
  switch (GET_CODE (first))
    {
    CASE_CONST_UNIQUE:
      for (int i = 1, n = GET_NUM_ELEM (vec); i < n; ++i)
	if (first != RTVEC_ELT (vec, i))
	  return false;
      return true;

    default:
      for (int i = 1, n = GET_NUM_ELEM (vec); i < n; ++i)
	if (!rtx_equal_p (first, RTVEC_ELT (vec, i)))
	  return false;
      return true;
    }
}

735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
/* Return an indication of which type of insn should have X as a body.
   In generator files, this can be UNKNOWN if the answer is only known
   at (GCC) runtime.  Otherwise the value is CODE_LABEL, INSN, CALL_INSN
   or JUMP_INSN.  */

enum rtx_code
classify_insn (rtx x)
{
  if (LABEL_P (x))
    return CODE_LABEL;
  if (GET_CODE (x) == CALL)
    return CALL_INSN;
  if (ANY_RETURN_P (x))
    return JUMP_INSN;
  if (GET_CODE (x) == SET)
    {
      if (GET_CODE (SET_DEST (x)) == PC)
	return JUMP_INSN;
      else if (GET_CODE (SET_SRC (x)) == CALL)
	return CALL_INSN;
      else
	return INSN;
    }
  if (GET_CODE (x) == PARALLEL)
    {
      int j;
761
      bool has_return_p = false;
762 763 764
      for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
	if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
	  return CALL_INSN;
765
	else if (ANY_RETURN_P (XVECEXP (x, 0, j)))
766
	  has_return_p = true;
767 768 769 770 771 772
	else if (GET_CODE (XVECEXP (x, 0, j)) == SET
		 && GET_CODE (SET_DEST (XVECEXP (x, 0, j))) == PC)
	  return JUMP_INSN;
	else if (GET_CODE (XVECEXP (x, 0, j)) == SET
		 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
	  return CALL_INSN;
773 774
      if (has_return_p)
	return JUMP_INSN;
775 776 777 778 779 780 781 782 783 784 785 786 787
    }
#ifdef GENERATOR_FILE
  if (GET_CODE (x) == MATCH_OPERAND
      || GET_CODE (x) == MATCH_OPERATOR
      || GET_CODE (x) == MATCH_PARALLEL
      || GET_CODE (x) == MATCH_OP_DUP
      || GET_CODE (x) == MATCH_DUP
      || GET_CODE (x) == PARALLEL)
    return UNKNOWN;
#endif
  return INSN;
}

788 789 790 791 792 793 794 795 796 797 798
/* Comparator of indices based on rtx_alloc_counts.  */

static int
rtx_count_cmp (const void *p1, const void *p2)
{
  const unsigned *n1 = (const unsigned *)p1;
  const unsigned *n2 = (const unsigned *)p2;

  return rtx_alloc_counts[*n1] - rtx_alloc_counts[*n2];
}

799 800
void
dump_rtx_statistics (void)
801 802 803
{
  int total_counts = 0;
  int total_sizes = 0;
804 805 806 807 808 809 810

  if (! GATHER_STATISTICS)
    {
      fprintf (stderr, "No RTX statistics\n");
      return;
    }

811 812 813 814 815 816 817 818 819 820 821 822 823
  fprintf (stderr, "\nRTX Kind                   Count     Bytes\n");
  fprintf (stderr, "-------------------------------------------\n");

  auto_vec<unsigned> indices (LAST_AND_UNUSED_RTX_CODE);
  for (unsigned i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++)
    indices.quick_push (i);
  indices.qsort (rtx_count_cmp);

  for (unsigned i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++)
    {
      unsigned j = indices[i];
      if (rtx_alloc_counts[j])
	{
824
	  fprintf (stderr, "%-24s " PRsa (6) " " PRsa (9) "\n",
825 826 827 828 829 830 831 832
		   GET_RTX_NAME (j),
		   SIZE_AMOUNT (rtx_alloc_counts[j]),
		   SIZE_AMOUNT (rtx_alloc_sizes[j]));
	  total_counts += rtx_alloc_counts[j];
	  total_sizes += rtx_alloc_sizes[j];
	}
    }

833 834
  if (rtvec_alloc_counts)
    {
835
      fprintf (stderr, "%-24s " PRsa (6) " " PRsa (9) "\n", "rtvec",
836 837
	       SIZE_AMOUNT (rtvec_alloc_counts),
	       SIZE_AMOUNT (rtvec_alloc_sizes));
838 839 840
      total_counts += rtvec_alloc_counts;
      total_sizes += rtvec_alloc_sizes;
    }
841
  fprintf (stderr, "-----------------------------------------------\n");
842
  fprintf (stderr, "%-24s " PRsa (6) " " PRsa (9) "\n",
843 844 845
	   "Total", SIZE_AMOUNT (total_counts),
	   SIZE_AMOUNT (total_sizes));
  fprintf (stderr, "-----------------------------------------------\n");
846
}
847

848
#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
849
void
850
rtl_check_failed_bounds (const_rtx r, int n, const char *file, int line,
851
			 const char *func)
852
{
853
  internal_error
854
    ("RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d",
855 856
     n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
     func, trim_filename (file), line);
857 858 859
}

void
860
rtl_check_failed_type1 (const_rtx r, int n, int c1, const char *file, int line,
861
			const char *func)
862
{
863 864 865 866
  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);
867 868 869
}

void
870
rtl_check_failed_type2 (const_rtx r, int n, int c1, int c2, const char *file,
871
			int line, const char *func)
872
{
873 874 875 876
  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);
877 878
}

879
void
880
rtl_check_failed_code1 (const_rtx r, enum rtx_code code, const char *file,
881
			int line, const char *func)
882
{
883
  internal_error ("RTL check: expected code '%s', have '%s' in %s, at %s:%d",
884 885
		  GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
		  trim_filename (file), line);
886 887 888
}

void
889
rtl_check_failed_code2 (const_rtx r, enum rtx_code code1, enum rtx_code code2,
890
			const char *file, int line, const char *func)
891
{
892
  internal_error
893
    ("RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d",
894
     GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
895
     func, trim_filename (file), line);
896 897
}

898
void
899 900 901 902 903 904 905 906 907 908 909
rtl_check_failed_code3 (const_rtx r, enum rtx_code code1, enum rtx_code code2,
			enum rtx_code code3, const char *file, int line,
			const char *func)
{
  internal_error
    ("RTL check: expected code '%s', '%s' or '%s', have '%s' in %s, at %s:%d",
     GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (code3),
     GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
}

void
910
rtl_check_failed_code_mode (const_rtx r, enum rtx_code code, machine_mode mode,
911 912 913 914 915 916 917 918 919 920 921 922 923
			    bool not_mode, const char *file, int line,
			    const char *func)
{
  internal_error ((not_mode
		   ? ("RTL check: expected code '%s' and not mode '%s', "
		      "have code '%s' and mode '%s' in %s, at %s:%d")
		   : ("RTL check: expected code '%s' and mode '%s', "
		      "have code '%s' and mode '%s' in %s, at %s:%d")),
		  GET_RTX_NAME (code), GET_MODE_NAME (mode),
		  GET_RTX_NAME (GET_CODE (r)), GET_MODE_NAME (GET_MODE (r)),
		  func, trim_filename (file), line);
}

924 925 926 927 928 929 930 931 932 933 934
/* Report that line LINE of FILE tried to access the block symbol fields
   of a non-block symbol.  FUNC is the function that contains the line.  */

void
rtl_check_failed_block_symbol (const char *file, int line, const char *func)
{
  internal_error
    ("RTL check: attempt to treat non-block symbol as a block symbol "
     "in %s, at %s:%d", func, trim_filename (file), line);
}

935 936
/* XXX Maybe print the vector?  */
void
Kenneth Zadeck committed
937 938 939 940 941 942 943 944 945 946
cwi_check_failed_bounds (const_rtx x, int n, const char *file, int line,
			 const char *func)
{
  internal_error
    ("RTL check: access of hwi elt %d of vector with last elt %d in %s, at %s:%d",
     n, CWI_GET_NUM_ELEM (x) - 1, func, trim_filename (file), line);
}

/* XXX Maybe print the vector?  */
void
947
rtvec_check_failed_bounds (const_rtvec r, int n, const char *file, int line,
948
			   const char *func)
949
{
950 951 952
  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);
953
}
954
#endif /* ENABLE_RTL_CHECKING */
955 956 957

#if defined ENABLE_RTL_FLAG_CHECKING
void
958
rtl_check_failed_flag (const char *name, const_rtx r, const char *file,
959
		       int line, const char *func)
960 961
{
  internal_error
962
    ("RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d",
963
     name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
964 965
}
#endif /* ENABLE_RTL_FLAG_CHECKING */