]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/rtl.c
* dbgcnt.def (sched_breakdep): New counter.
[thirdparty/gcc.git] / gcc / rtl.c
CommitLineData
875d8740 1/* RTL utility routines.
1a3e3a66 2 Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
a5701bde 3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
d91f7526 4 Free Software Foundation, Inc.
759bebca 5
f12b58b3 6This file is part of GCC.
759bebca 7
f12b58b3 8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
8c4c00c1 10Software Foundation; either version 3, or (at your option) any later
f12b58b3 11version.
759bebca 12
f12b58b3 13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
759bebca 17
18You should have received a copy of the GNU General Public License
8c4c00c1 19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
759bebca 21
690ff52f 22/* This file is compiled twice: once for the generator programs
23 once for the compiler. */
24#ifdef GENERATOR_FILE
25#include "bconfig.h"
26#else
759bebca 27#include "config.h"
690ff52f 28#endif
29
405711de 30#include "system.h"
805e22b2 31#include "coretypes.h"
32#include "tm.h"
759bebca 33#include "rtl.h"
1bfd55c5 34#include "ggc.h"
690abe5d 35#ifdef GENERATOR_FILE
36# include "errors.h"
37#else
0b205f4c 38# include "diagnostic-core.h"
690abe5d 39#endif
759bebca 40
759bebca 41\f
42/* Indexed by rtx code, gives number of operands for an rtx with that code.
0e3985ee 43 Does NOT include rtx header data (code and links). */
759bebca 44
0e3985ee 45#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) sizeof FORMAT - 1 ,
46
1af5f160 47const unsigned char rtx_length[NUM_RTX_CODE] = {
0e3985ee 48#include "rtl.def"
49};
50
51#undef DEF_RTL_EXPR
759bebca 52
53/* Indexed by rtx code, gives the name of that kind of rtx, as a C string. */
54
55#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
56
1af5f160 57const char * const rtx_name[NUM_RTX_CODE] = {
759bebca 58#include "rtl.def" /* rtl expressions are documented here */
59};
60
61#undef DEF_RTL_EXPR
62
759bebca 63/* Indexed by rtx code, gives a sequence of operand-types for
64 rtx's of that code. The sequence is a C string in which
4bbea254 65 each character describes one operand. */
759bebca 66
1af5f160 67const char * const rtx_format[NUM_RTX_CODE] = {
759bebca 68 /* "*" undefined.
69 can cause a warning message
70 "0" field is unused (or used in a phase-dependent manner)
71 prints nothing
72 "i" an integer
73 prints the integer
74 "n" like "i", but prints entries from `note_insn_name'
d3115c90 75 "w" an integer of width HOST_BITS_PER_WIDE_INT
76 prints the integer
759bebca 77 "s" a pointer to a string
78 prints the string
79 "S" like "s", but optional:
80 the containing rtx may end before this operand
aa4c562d 81 "T" like "s", but treated specially by the RTL reader;
82 only found in machine description patterns.
759bebca 83 "e" a pointer to an rtl expression
84 prints the expression
85 "E" a pointer to a vector that points to a number of rtl expressions
86 prints a list of the rtl expressions
87 "V" like "E", but optional:
88 the containing rtx may end before this operand
89 "u" a pointer to another insn
a3426c4c 90 prints the uid of the insn.
91 "b" is a pointer to a bitmap header.
c849df63 92 "B" is a basic block pointer.
aa40f561 93 "t" is a tree pointer. */
759bebca 94
95#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
96#include "rtl.def" /* rtl expressions are defined here */
97#undef DEF_RTL_EXPR
98};
99
100/* Indexed by rtx code, gives a character representing the "class" of
101 that rtx code. See rtl.def for documentation on the defined classes. */
102
6720e96c 103const enum rtx_class rtx_class[NUM_RTX_CODE] = {
f220c8f0 104#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) CLASS,
759bebca 105#include "rtl.def" /* rtl expressions are defined here */
106#undef DEF_RTL_EXPR
107};
108
bf6b5685 109/* Indexed by rtx code, gives the size of the rtx in bytes. */
110
f2d0e9f1 111const unsigned char rtx_code_size[NUM_RTX_CODE] = {
bf6b5685 112#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) \
9a37e9c6 113 (((ENUM) == CONST_INT || (ENUM) == CONST_DOUBLE \
86e87ef6 114 || (ENUM) == CONST_FIXED) \
bf6b5685 115 ? RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (HOST_WIDE_INT) \
116 : RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (rtunion)),
117
118#include "rtl.def"
119#undef DEF_RTL_EXPR
120};
121
759bebca 122/* Names for kinds of NOTEs and REG_NOTEs. */
123
ad4583d9 124const char * const note_insn_name[NOTE_INSN_MAX] =
f220c8f0 125{
30f4db0d 126#define DEF_INSN_NOTE(NAME) #NAME,
127#include "insn-notes.def"
128#undef DEF_INSN_NOTE
f220c8f0 129};
130
30f4db0d 131const char * const reg_note_name[REG_NOTE_MAX] =
f220c8f0 132{
30f4db0d 133#define DEF_REG_NOTE(NAME) #NAME,
134#include "reg-notes.def"
135#undef DEF_REG_NOTE
f220c8f0 136};
759bebca 137
86736f9e 138static int rtx_alloc_counts[(int) LAST_AND_UNUSED_RTX_CODE];
139static int rtx_alloc_sizes[(int) LAST_AND_UNUSED_RTX_CODE];
140static int rtvec_alloc_counts;
141static int rtvec_alloc_sizes;
86736f9e 142
ad87de1e 143\f
759bebca 144/* Allocate an rtx vector of N elements.
145 Store the length, and initialize all elements to zero. */
146
147rtvec
3ad4992f 148rtvec_alloc (int n)
759bebca 149{
150 rtvec rt;
f220c8f0 151
ba72912a 152 rt = ggc_alloc_rtvec_sized (n);
aab2cf92 153 /* Clear out the vector. */
791ceafe 154 memset (&rt->elem[0], 0, n * sizeof (rtx));
759bebca 155
53d3f913 156 PUT_NUM_ELEM (rt, n);
86736f9e 157
ecd52ea9 158 if (GATHER_STATISTICS)
159 {
160 rtvec_alloc_counts++;
161 rtvec_alloc_sizes += n * sizeof (rtx);
162 }
86736f9e 163
759bebca 164 return rt;
165}
166
b447ca78 167/* Create a bitwise copy of VEC. */
168
169rtvec
170shallow_copy_rtvec (rtvec vec)
171{
172 rtvec newvec;
173 int n;
174
175 n = GET_NUM_ELEM (vec);
176 newvec = rtvec_alloc (n);
177 memcpy (&newvec->elem[0], &vec->elem[0], sizeof (rtx) * n);
178 return newvec;
179}
180
f2d0e9f1 181/* Return the number of bytes occupied by rtx value X. */
182
183unsigned int
dd9b9fc5 184rtx_size (const_rtx x)
f2d0e9f1 185{
6617cbc1 186 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_HAS_BLOCK_INFO_P (x))
f2d0e9f1 187 return RTX_HDR_SIZE + sizeof (struct block_symbol);
188 return RTX_CODE_SIZE (GET_CODE (x));
189}
190
759bebca 191/* Allocate an rtx of code CODE. The CODE is stored in the rtx;
192 all the rest is initialized to zero. */
193
194rtx
674b05f5 195rtx_alloc_stat (RTX_CODE code MEM_STAT_DECL)
759bebca 196{
ba72912a 197 rtx rt = ggc_alloc_zone_rtx_def_stat (&rtl_zone, RTX_CODE_SIZE (code)
198 PASS_MEM_STAT);
1bfd55c5 199
791ceafe 200 /* We want to clear everything up to the FLD array. Normally, this
201 is one int, but we don't want to assume that and it isn't very
202 portable anyway; this is. */
b56b76ec 203
bf6b5685 204 memset (rt, 0, RTX_HDR_SIZE);
759bebca 205 PUT_CODE (rt, code);
86736f9e 206
ecd52ea9 207 if (GATHER_STATISTICS)
208 {
209 rtx_alloc_counts[code]++;
210 rtx_alloc_sizes[code] += RTX_CODE_SIZE (code);
211 }
86736f9e 212
759bebca 213 return rt;
214}
c49a29c7 215
759bebca 216\f
3072d30e 217/* Return true if ORIG is a sharable CONST. */
218
219bool
dd9b9fc5 220shared_const_p (const_rtx orig)
3072d30e 221{
222 gcc_assert (GET_CODE (orig) == CONST);
48e1416a 223
3072d30e 224 /* CONST can be shared if it contains a SYMBOL_REF. If it contains
225 a LABEL_REF, it isn't sharable. */
226 return (GET_CODE (XEXP (orig, 0)) == PLUS
227 && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
971ba038 228 && CONST_INT_P(XEXP (XEXP (orig, 0), 1)));
3072d30e 229}
230
231
759bebca 232/* Create a new copy of an rtx.
233 Recursively copies the operands of the rtx,
234 except for those few rtx codes that are sharable. */
235
236rtx
3ad4992f 237copy_rtx (rtx orig)
759bebca 238{
19cb6b50 239 rtx copy;
240 int i, j;
241 RTX_CODE code;
242 const char *format_ptr;
759bebca 243
244 code = GET_CODE (orig);
245
246 switch (code)
247 {
248 case REG:
688ff29b 249 case DEBUG_EXPR:
250 case VALUE:
0349edce 251 CASE_CONST_ANY:
759bebca 252 case SYMBOL_REF:
253 case CODE_LABEL:
254 case PC:
255 case CC0:
1a860023 256 case RETURN:
9cb2517e 257 case SIMPLE_RETURN:
42e57659 258 case SCRATCH:
a92771b8 259 /* SCRATCH must be shared because they represent distinct values. */
759bebca 260 return orig;
c09425a0 261 case CLOBBER:
262 if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
263 return orig;
264 break;
42e57659 265
266 case CONST:
3072d30e 267 if (shared_const_p (orig))
42e57659 268 return orig;
269 break;
270
b4495254 271 /* A MEM with a constant address is not sharable. The problem is that
272 the constant address may need to be reloaded. If the mem is shared,
273 then reloading one copy of this mem will cause all copies to appear
274 to have been reloaded. */
0dbd1c74 275
276 default:
277 break;
759bebca 278 }
279
f2d0e9f1 280 /* Copy the various flags, fields, and other information. We assume
281 that all fields need copying, and then clear the fields that should
59241190 282 not be copied. That is the sensible default behavior, and forces
283 us to explicitly document why we are *not* copying a flag. */
f2d0e9f1 284 copy = shallow_copy_rtx (orig);
59241190 285
286 /* We do not copy the USED flag, which is used as a mark bit during
287 walks over the RTL. */
e7f75e15 288 RTX_FLAG (copy, used) = 0;
59241190 289
759bebca 290 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
291
292 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
f2d0e9f1 293 switch (*format_ptr++)
294 {
295 case 'e':
296 if (XEXP (orig, i) != NULL)
297 XEXP (copy, i) = copy_rtx (XEXP (orig, i));
298 break;
299
300 case 'E':
301 case 'V':
302 if (XVEC (orig, i) != NULL)
303 {
304 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
305 for (j = 0; j < XVECLEN (copy, i); j++)
306 XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
307 }
308 break;
309
310 case 't':
311 case 'w':
312 case 'i':
313 case 's':
314 case 'S':
315 case 'T':
316 case 'u':
317 case 'B':
318 case '0':
319 /* These are left unchanged. */
320 break;
321
322 default:
323 gcc_unreachable ();
324 }
759bebca 325 return copy;
759bebca 326}
57ff0c05 327
328/* Create a new copy of an rtx. Only copy just one level. */
2a631e19 329
57ff0c05 330rtx
dd9b9fc5 331shallow_copy_rtx_stat (const_rtx orig MEM_STAT_DECL)
57ff0c05 332{
dd9b9fc5 333 const unsigned int size = rtx_size (orig);
ba72912a 334 rtx const copy = ggc_alloc_zone_rtx_def_stat (&rtl_zone, size PASS_MEM_STAT);
f7f3687c 335 return (rtx) memcpy (copy, orig, size);
57ff0c05 336}
759bebca 337\f
316bc009 338/* Nonzero when we are generating CONCATs. */
339int generating_concat_p;
723c0ee7 340
341/* Nonzero when we are expanding trees to RTL. */
342int currently_expanding_to_rtl;
343
140cb7e4 344\f
e1ab7874 345
48e1416a 346/* Same as rtx_equal_p, but call CB on each pair of rtx if CB is not NULL.
331cf53a 347 When the callback returns true, we continue with the new pair.
348 Whenever changing this function check if rtx_equal_p below doesn't need
349 changing as well. */
140cb7e4 350
351int
e1ab7874 352rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb)
140cb7e4 353{
19cb6b50 354 int i;
355 int j;
356 enum rtx_code code;
357 const char *fmt;
e1ab7874 358 rtx nx, ny;
140cb7e4 359
360 if (x == y)
361 return 1;
362 if (x == 0 || y == 0)
363 return 0;
364
e1ab7874 365 /* Invoke the callback first. */
366 if (cb != NULL
367 && ((*cb) (&x, &y, &nx, &ny)))
368 return rtx_equal_p_cb (nx, ny, cb);
369
140cb7e4 370 code = GET_CODE (x);
371 /* Rtx's of different codes cannot be equal. */
372 if (code != GET_CODE (y))
373 return 0;
374
375 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
376 (REG:SI x) and (REG:HI x) are NOT equivalent. */
377
378 if (GET_MODE (x) != GET_MODE (y))
379 return 0;
380
04ec15fa 381 /* MEMs referring to different address space are not equivalent. */
bd1a81f7 382 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
383 return 0;
384
73f5c1e3 385 /* Some RTL can be compared nonrecursively. */
386 switch (code)
387 {
388 case REG:
011e6b51 389 return (REGNO (x) == REGNO (y));
73f5c1e3 390
391 case LABEL_REF:
392 return XEXP (x, 0) == XEXP (y, 0);
393
394 case SYMBOL_REF:
395 return XSTR (x, 0) == XSTR (y, 0);
396
688ff29b 397 case DEBUG_EXPR:
9845d120 398 case VALUE:
73f5c1e3 399 case SCRATCH:
0349edce 400 CASE_CONST_UNIQUE:
73f5c1e3 401 return 0;
402
f9c61ef7 403 case DEBUG_IMPLICIT_PTR:
404 return DEBUG_IMPLICIT_PTR_DECL (x)
405 == DEBUG_IMPLICIT_PTR_DECL (y);
406
841424cc 407 case DEBUG_PARAMETER_REF:
408 return DEBUG_PARAMETER_REF_DECL (x)
409 == DEBUG_PARAMETER_REF_DECL (x);
410
a5701bde 411 case ENTRY_VALUE:
412 return rtx_equal_p_cb (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y), cb);
413
73f5c1e3 414 default:
415 break;
416 }
140cb7e4 417
418 /* Compare the elements. If any pair of corresponding elements
e487406e 419 fail to match, return 0 for the whole thing. */
140cb7e4 420
421 fmt = GET_RTX_FORMAT (code);
422 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
423 {
424 switch (fmt[i])
425 {
426 case 'w':
427 if (XWINT (x, i) != XWINT (y, i))
428 return 0;
429 break;
430
431 case 'n':
432 case 'i':
433 if (XINT (x, i) != XINT (y, i))
6675c1b7 434 {
435#ifndef GENERATOR_FILE
436 if (((code == ASM_OPERANDS && i == 6)
437 || (code == ASM_INPUT && i == 1))
438 && locator_eq (XINT (x, i), XINT (y, i)))
439 break;
440#endif
441 return 0;
442 }
140cb7e4 443 break;
444
445 case 'V':
446 case 'E':
447 /* Two vectors must have the same length. */
448 if (XVECLEN (x, i) != XVECLEN (y, i))
449 return 0;
450
451 /* And the corresponding elements must match. */
452 for (j = 0; j < XVECLEN (x, i); j++)
48e1416a 453 if (rtx_equal_p_cb (XVECEXP (x, i, j),
e1ab7874 454 XVECEXP (y, i, j), cb) == 0)
140cb7e4 455 return 0;
456 break;
457
458 case 'e':
e1ab7874 459 if (rtx_equal_p_cb (XEXP (x, i), XEXP (y, i), cb) == 0)
140cb7e4 460 return 0;
461 break;
462
463 case 'S':
464 case 's':
100e94da 465 if ((XSTR (x, i) || XSTR (y, i))
466 && (! XSTR (x, i) || ! XSTR (y, i)
467 || strcmp (XSTR (x, i), XSTR (y, i))))
140cb7e4 468 return 0;
469 break;
470
471 case 'u':
472 /* These are just backpointers, so they don't matter. */
473 break;
474
475 case '0':
476 case 't':
477 break;
478
479 /* It is believed that rtx's at this level will never
480 contain anything but integers and other rtx's,
481 except for within LABEL_REFs and SYMBOL_REFs. */
482 default:
04e579b6 483 gcc_unreachable ();
140cb7e4 484 }
485 }
486 return 1;
487}
86736f9e 488
e1ab7874 489/* Return 1 if X and Y are identical-looking rtx's.
331cf53a 490 This is the Lisp function EQUAL for rtx arguments.
491 Whenever changing this function check if rtx_equal_p_cb above doesn't need
492 changing as well. */
e1ab7874 493
494int
495rtx_equal_p (const_rtx x, const_rtx y)
496{
331cf53a 497 int i;
498 int j;
499 enum rtx_code code;
500 const char *fmt;
501
502 if (x == y)
503 return 1;
504 if (x == 0 || y == 0)
505 return 0;
506
507 code = GET_CODE (x);
508 /* Rtx's of different codes cannot be equal. */
509 if (code != GET_CODE (y))
510 return 0;
511
512 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
513 (REG:SI x) and (REG:HI x) are NOT equivalent. */
514
515 if (GET_MODE (x) != GET_MODE (y))
516 return 0;
517
04ec15fa 518 /* MEMs referring to different address space are not equivalent. */
bd1a81f7 519 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
520 return 0;
521
331cf53a 522 /* Some RTL can be compared nonrecursively. */
523 switch (code)
524 {
525 case REG:
526 return (REGNO (x) == REGNO (y));
527
528 case LABEL_REF:
529 return XEXP (x, 0) == XEXP (y, 0);
530
531 case SYMBOL_REF:
532 return XSTR (x, 0) == XSTR (y, 0);
533
688ff29b 534 case DEBUG_EXPR:
9845d120 535 case VALUE:
331cf53a 536 case SCRATCH:
0349edce 537 CASE_CONST_UNIQUE:
331cf53a 538 return 0;
539
f9c61ef7 540 case DEBUG_IMPLICIT_PTR:
541 return DEBUG_IMPLICIT_PTR_DECL (x)
542 == DEBUG_IMPLICIT_PTR_DECL (y);
543
841424cc 544 case DEBUG_PARAMETER_REF:
545 return DEBUG_PARAMETER_REF_DECL (x)
546 == DEBUG_PARAMETER_REF_DECL (y);
547
a5701bde 548 case ENTRY_VALUE:
549 return rtx_equal_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y));
550
331cf53a 551 default:
552 break;
553 }
554
555 /* Compare the elements. If any pair of corresponding elements
556 fail to match, return 0 for the whole thing. */
557
558 fmt = GET_RTX_FORMAT (code);
559 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
560 {
561 switch (fmt[i])
562 {
563 case 'w':
564 if (XWINT (x, i) != XWINT (y, i))
565 return 0;
566 break;
567
568 case 'n':
569 case 'i':
570 if (XINT (x, i) != XINT (y, i))
6675c1b7 571 {
572#ifndef GENERATOR_FILE
573 if (((code == ASM_OPERANDS && i == 6)
574 || (code == ASM_INPUT && i == 1))
575 && locator_eq (XINT (x, i), XINT (y, i)))
576 break;
577#endif
578 return 0;
579 }
331cf53a 580 break;
581
582 case 'V':
583 case 'E':
584 /* Two vectors must have the same length. */
585 if (XVECLEN (x, i) != XVECLEN (y, i))
586 return 0;
587
588 /* And the corresponding elements must match. */
589 for (j = 0; j < XVECLEN (x, i); j++)
590 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
591 return 0;
592 break;
593
594 case 'e':
595 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
596 return 0;
597 break;
598
599 case 'S':
600 case 's':
601 if ((XSTR (x, i) || XSTR (y, i))
602 && (! XSTR (x, i) || ! XSTR (y, i)
603 || strcmp (XSTR (x, i), XSTR (y, i))))
604 return 0;
605 break;
606
607 case 'u':
608 /* These are just backpointers, so they don't matter. */
609 break;
610
611 case '0':
612 case 't':
613 break;
614
615 /* It is believed that rtx's at this level will never
616 contain anything but integers and other rtx's,
617 except for within LABEL_REFs and SYMBOL_REFs. */
618 default:
619 gcc_unreachable ();
620 }
621 }
622 return 1;
e1ab7874 623}
624
09279218 625/* Iteratively hash rtx X. */
626
627hashval_t
628iterative_hash_rtx (const_rtx x, hashval_t hash)
629{
630 enum rtx_code code;
631 enum machine_mode mode;
632 int i, j;
633 const char *fmt;
634
635 if (x == NULL_RTX)
636 return hash;
637 code = GET_CODE (x);
638 hash = iterative_hash_object (code, hash);
639 mode = GET_MODE (x);
640 hash = iterative_hash_object (mode, hash);
641 switch (code)
642 {
643 case REG:
644 i = REGNO (x);
645 return iterative_hash_object (i, hash);
646 case CONST_INT:
647 return iterative_hash_object (INTVAL (x), hash);
648 case SYMBOL_REF:
649 if (XSTR (x, 0))
650 return iterative_hash (XSTR (x, 0), strlen (XSTR (x, 0)) + 1,
651 hash);
652 return hash;
653 case LABEL_REF:
654 case DEBUG_EXPR:
655 case VALUE:
656 case SCRATCH:
657 case CONST_DOUBLE:
658 case CONST_FIXED:
659 case DEBUG_IMPLICIT_PTR:
841424cc 660 case DEBUG_PARAMETER_REF:
09279218 661 return hash;
662 default:
663 break;
664 }
665
666 fmt = GET_RTX_FORMAT (code);
667 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
668 switch (fmt[i])
669 {
670 case 'w':
671 hash = iterative_hash_object (XWINT (x, i), hash);
672 break;
673 case 'n':
674 case 'i':
675 hash = iterative_hash_object (XINT (x, i), hash);
676 break;
677 case 'V':
678 case 'E':
679 j = XVECLEN (x, i);
680 hash = iterative_hash_object (j, hash);
681 for (j = 0; j < XVECLEN (x, i); j++)
682 hash = iterative_hash_rtx (XVECEXP (x, i, j), hash);
683 break;
684 case 'e':
685 hash = iterative_hash_rtx (XEXP (x, i), hash);
686 break;
687 case 'S':
688 case 's':
689 if (XSTR (x, i))
690 hash = iterative_hash (XSTR (x, 0), strlen (XSTR (x, 0)) + 1,
691 hash);
692 break;
693 default:
694 break;
695 }
696 return hash;
697}
698
2e2fd8fe 699void
700dump_rtx_statistics (void)
86736f9e 701{
86736f9e 702 int i;
703 int total_counts = 0;
704 int total_sizes = 0;
ecd52ea9 705
706 if (! GATHER_STATISTICS)
707 {
708 fprintf (stderr, "No RTX statistics\n");
709 return;
710 }
711
86736f9e 712 fprintf (stderr, "\nRTX Kind Count Bytes\n");
713 fprintf (stderr, "---------------------------------------\n");
714 for (i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++)
715 if (rtx_alloc_counts[i])
716 {
717 fprintf (stderr, "%-20s %7d %10d\n", GET_RTX_NAME (i),
718 rtx_alloc_counts[i], rtx_alloc_sizes[i]);
719 total_counts += rtx_alloc_counts[i];
720 total_sizes += rtx_alloc_sizes[i];
721 }
722 if (rtvec_alloc_counts)
723 {
724 fprintf (stderr, "%-20s %7d %10d\n", "rtvec",
725 rtvec_alloc_counts, rtvec_alloc_sizes);
726 total_counts += rtvec_alloc_counts;
727 total_sizes += rtvec_alloc_sizes;
728 }
729 fprintf (stderr, "---------------------------------------\n");
730 fprintf (stderr, "%-20s %7d %10d\n",
731 "Total", total_counts, total_sizes);
732 fprintf (stderr, "---------------------------------------\n");
86736f9e 733}
140cb7e4 734\f
0c4e40c5 735#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
25999090 736void
dd9b9fc5 737rtl_check_failed_bounds (const_rtx r, int n, const char *file, int line,
3ad4992f 738 const char *func)
25999090 739{
0fc48b82 740 internal_error
1e5fcbe2 741 ("RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d",
0fc48b82 742 n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
743 func, trim_filename (file), line);
25999090 744}
745
746void
dd9b9fc5 747rtl_check_failed_type1 (const_rtx r, int n, int c1, const char *file, int line,
3ad4992f 748 const char *func)
25999090 749{
0fc48b82 750 internal_error
751 ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
752 n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
753 func, trim_filename (file), line);
25999090 754}
755
756void
dd9b9fc5 757rtl_check_failed_type2 (const_rtx r, int n, int c1, int c2, const char *file,
3ad4992f 758 int line, const char *func)
25999090 759{
0fc48b82 760 internal_error
761 ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
762 n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
763 func, trim_filename (file), line);
25999090 764}
765
005d995b 766void
dd9b9fc5 767rtl_check_failed_code1 (const_rtx r, enum rtx_code code, const char *file,
3ad4992f 768 int line, const char *func)
005d995b 769{
1e5fcbe2 770 internal_error ("RTL check: expected code '%s', have '%s' in %s, at %s:%d",
0fc48b82 771 GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
772 trim_filename (file), line);
005d995b 773}
774
775void
dd9b9fc5 776rtl_check_failed_code2 (const_rtx r, enum rtx_code code1, enum rtx_code code2,
3ad4992f 777 const char *file, int line, const char *func)
005d995b 778{
0fc48b82 779 internal_error
1e5fcbe2 780 ("RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d",
0fc48b82 781 GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
a194077b 782 func, trim_filename (file), line);
005d995b 783}
784
e8aaae4e 785void
dd9b9fc5 786rtl_check_failed_code_mode (const_rtx r, enum rtx_code code, enum machine_mode mode,
e8aaae4e 787 bool not_mode, const char *file, int line,
788 const char *func)
789{
790 internal_error ((not_mode
791 ? ("RTL check: expected code '%s' and not mode '%s', "
792 "have code '%s' and mode '%s' in %s, at %s:%d")
793 : ("RTL check: expected code '%s' and mode '%s', "
794 "have code '%s' and mode '%s' in %s, at %s:%d")),
795 GET_RTX_NAME (code), GET_MODE_NAME (mode),
796 GET_RTX_NAME (GET_CODE (r)), GET_MODE_NAME (GET_MODE (r)),
797 func, trim_filename (file), line);
798}
799
f2d0e9f1 800/* Report that line LINE of FILE tried to access the block symbol fields
801 of a non-block symbol. FUNC is the function that contains the line. */
802
803void
804rtl_check_failed_block_symbol (const char *file, int line, const char *func)
805{
806 internal_error
807 ("RTL check: attempt to treat non-block symbol as a block symbol "
808 "in %s, at %s:%d", func, trim_filename (file), line);
809}
810
25999090 811/* XXX Maybe print the vector? */
812void
dd9b9fc5 813rtvec_check_failed_bounds (const_rtvec r, int n, const char *file, int line,
3ad4992f 814 const char *func)
25999090 815{
0fc48b82 816 internal_error
817 ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
818 n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
25999090 819}
0c4e40c5 820#endif /* ENABLE_RTL_CHECKING */
e7f75e15 821
822#if defined ENABLE_RTL_FLAG_CHECKING
823void
dd9b9fc5 824rtl_check_failed_flag (const char *name, const_rtx r, const char *file,
3ad4992f 825 int line, const char *func)
e7f75e15 826{
827 internal_error
1e5fcbe2 828 ("RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d",
3c6858c6 829 name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
e7f75e15 830}
831#endif /* ENABLE_RTL_FLAG_CHECKING */