]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/rtl.c
backport: As described in http://gcc.gnu.org/ml/gcc/2012-08/msg00015.html...
[thirdparty/gcc.git] / gcc / rtl.c
CommitLineData
0f40f9f7 1/* RTL utility routines.
187515f5 2 Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
a58a8e4b 3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
d652f226 4 Free Software Foundation, Inc.
6f29feb1 5
1322177d 6This file is part of GCC.
6f29feb1 7
1322177d
LB
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
9dcd6f09 10Software Foundation; either version 3, or (at your option) any later
1322177d 11version.
6f29feb1 12
1322177d
LB
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.
6f29feb1
JW
17
18You should have received a copy of the GNU General Public License
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
6f29feb1 21
45c8116d
ZW
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
6f29feb1 27#include "config.h"
45c8116d
ZW
28#endif
29
670ee920 30#include "system.h"
4977bab6
ZW
31#include "coretypes.h"
32#include "tm.h"
6f29feb1 33#include "rtl.h"
a3770a81 34#include "ggc.h"
4c714dd4
KG
35#ifdef GENERATOR_FILE
36# include "errors.h"
37#else
718f9c0f 38# include "diagnostic-core.h"
4c714dd4 39#endif
6f29feb1 40
6f29feb1
JW
41\f
42/* Indexed by rtx code, gives number of operands for an rtx with that code.
aa0b4465 43 Does NOT include rtx header data (code and links). */
6f29feb1 44
aa0b4465
ZW
45#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) sizeof FORMAT - 1 ,
46
86460bab 47const unsigned char rtx_length[NUM_RTX_CODE] = {
aa0b4465
ZW
48#include "rtl.def"
49};
50
51#undef DEF_RTL_EXPR
6f29feb1
JW
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
86460bab 57const char * const rtx_name[NUM_RTX_CODE] = {
6f29feb1
JW
58#include "rtl.def" /* rtl expressions are documented here */
59};
60
61#undef DEF_RTL_EXPR
62
6f29feb1
JW
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
6dc42e49 65 each character describes one operand. */
6f29feb1 66
86460bab 67const char * const rtx_format[NUM_RTX_CODE] = {
6f29feb1
JW
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'
c166a311
CH
75 "w" an integer of width HOST_BITS_PER_WIDE_INT
76 prints the integer
6f29feb1
JW
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
1f3b37a3
ZW
81 "T" like "s", but treated specially by the RTL reader;
82 only found in machine description patterns.
6f29feb1
JW
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
0dfa1860
MM
90 prints the uid of the insn.
91 "b" is a pointer to a bitmap header.
36a5eadd 92 "B" is a basic block pointer.
dc297297 93 "t" is a tree pointer. */
6f29feb1
JW
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
ec8e098d 103const enum rtx_class rtx_class[NUM_RTX_CODE] = {
f590cca1 104#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) CLASS,
6f29feb1
JW
105#include "rtl.def" /* rtl expressions are defined here */
106#undef DEF_RTL_EXPR
107};
108
e1de1560
RS
109/* Indexed by rtx code, gives the size of the rtx in bytes. */
110
aacd3885 111const unsigned char rtx_code_size[NUM_RTX_CODE] = {
e1de1560 112#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) \
f0184d42 113 (((ENUM) == CONST_INT || (ENUM) == CONST_DOUBLE \
9e412ca3 114 || (ENUM) == CONST_FIXED) \
e1de1560
RS
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
6f29feb1
JW
122/* Names for kinds of NOTEs and REG_NOTEs. */
123
a38e7aa5 124const char * const note_insn_name[NOTE_INSN_MAX] =
f590cca1 125{
826c9564
ZW
126#define DEF_INSN_NOTE(NAME) #NAME,
127#include "insn-notes.def"
128#undef DEF_INSN_NOTE
f590cca1
RH
129};
130
826c9564 131const char * const reg_note_name[REG_NOTE_MAX] =
f590cca1 132{
826c9564
ZW
133#define DEF_REG_NOTE(NAME) #NAME,
134#include "reg-notes.def"
135#undef DEF_REG_NOTE
f590cca1 136};
6f29feb1 137
439a7e54
DN
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;
439a7e54 142
956d6950 143\f
6f29feb1
JW
144/* Allocate an rtx vector of N elements.
145 Store the length, and initialize all elements to zero. */
146
147rtvec
0c20a65f 148rtvec_alloc (int n)
6f29feb1
JW
149{
150 rtvec rt;
f590cca1 151
a9429e29 152 rt = ggc_alloc_rtvec_sized (n);
a1105617 153 /* Clear out the vector. */
f8a83ee3 154 memset (&rt->elem[0], 0, n * sizeof (rtx));
6f29feb1 155
395d53bb 156 PUT_NUM_ELEM (rt, n);
439a7e54 157
7aa6d18a
SB
158 if (GATHER_STATISTICS)
159 {
160 rtvec_alloc_counts++;
161 rtvec_alloc_sizes += n * sizeof (rtx);
162 }
439a7e54 163
6f29feb1
JW
164 return rt;
165}
166
bd7960b1
RS
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
aacd3885
RS
181/* Return the number of bytes occupied by rtx value X. */
182
183unsigned int
f7d504c2 184rtx_size (const_rtx x)
aacd3885 185{
3fa9c136 186 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_HAS_BLOCK_INFO_P (x))
aacd3885
RS
187 return RTX_HDR_SIZE + sizeof (struct block_symbol);
188 return RTX_CODE_SIZE (GET_CODE (x));
189}
190
6f29feb1
JW
191/* Allocate an rtx of code CODE. The CODE is stored in the rtx;
192 all the rest is initialized to zero. */
193
194rtx
b9dcdee4 195rtx_alloc_stat (RTX_CODE code MEM_STAT_DECL)
6f29feb1 196{
a9429e29
LB
197 rtx rt = ggc_alloc_zone_rtx_def_stat (&rtl_zone, RTX_CODE_SIZE (code)
198 PASS_MEM_STAT);
a3770a81 199
f8a83ee3
ZW
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. */
2151a093 203
e1de1560 204 memset (rt, 0, RTX_HDR_SIZE);
6f29feb1 205 PUT_CODE (rt, code);
439a7e54 206
7aa6d18a
SB
207 if (GATHER_STATISTICS)
208 {
209 rtx_alloc_counts[code]++;
210 rtx_alloc_sizes[code] += RTX_CODE_SIZE (code);
211 }
439a7e54 212
6f29feb1
JW
213 return rt;
214}
9b404774 215
6f29feb1 216\f
6fb5fa3c
DB
217/* Return true if ORIG is a sharable CONST. */
218
219bool
f7d504c2 220shared_const_p (const_rtx orig)
6fb5fa3c
DB
221{
222 gcc_assert (GET_CODE (orig) == CONST);
b8698a0f 223
6fb5fa3c
DB
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
481683e1 228 && CONST_INT_P(XEXP (XEXP (orig, 0), 1)));
6fb5fa3c
DB
229}
230
231
6f29feb1
JW
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
0c20a65f 237copy_rtx (rtx orig)
6f29feb1 238{
b3694847
SS
239 rtx copy;
240 int i, j;
241 RTX_CODE code;
242 const char *format_ptr;
6f29feb1
JW
243
244 code = GET_CODE (orig);
245
246 switch (code)
247 {
248 case REG:
0ca5af51
AO
249 case DEBUG_EXPR:
250 case VALUE:
6f29feb1
JW
251 case CONST_INT:
252 case CONST_DOUBLE:
091a3ac7 253 case CONST_FIXED:
69ef87e2 254 case CONST_VECTOR:
6f29feb1
JW
255 case SYMBOL_REF:
256 case CODE_LABEL:
257 case PC:
258 case CC0:
3810076b 259 case RETURN:
26898771 260 case SIMPLE_RETURN:
cf526dcc 261 case SCRATCH:
0f41302f 262 /* SCRATCH must be shared because they represent distinct values. */
6f29feb1 263 return orig;
3e89ed8d
JH
264 case CLOBBER:
265 if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
266 return orig;
267 break;
cf526dcc
RK
268
269 case CONST:
6fb5fa3c 270 if (shared_const_p (orig))
cf526dcc
RK
271 return orig;
272 break;
273
cc81e625
JW
274 /* A MEM with a constant address is not sharable. The problem is that
275 the constant address may need to be reloaded. If the mem is shared,
276 then reloading one copy of this mem will cause all copies to appear
277 to have been reloaded. */
e9a25f70
JL
278
279 default:
280 break;
6f29feb1
JW
281 }
282
aacd3885
RS
283 /* Copy the various flags, fields, and other information. We assume
284 that all fields need copying, and then clear the fields that should
a4c6502a
MM
285 not be copied. That is the sensible default behavior, and forces
286 us to explicitly document why we are *not* copying a flag. */
aacd3885 287 copy = shallow_copy_rtx (orig);
a4c6502a
MM
288
289 /* We do not copy the USED flag, which is used as a mark bit during
290 walks over the RTL. */
5a63e069 291 RTX_FLAG (copy, used) = 0;
a4c6502a 292
6f29feb1
JW
293 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
294
295 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
aacd3885
RS
296 switch (*format_ptr++)
297 {
298 case 'e':
299 if (XEXP (orig, i) != NULL)
300 XEXP (copy, i) = copy_rtx (XEXP (orig, i));
301 break;
302
303 case 'E':
304 case 'V':
305 if (XVEC (orig, i) != NULL)
306 {
307 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
308 for (j = 0; j < XVECLEN (copy, i); j++)
309 XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
310 }
311 break;
312
313 case 't':
314 case 'w':
315 case 'i':
316 case 's':
317 case 'S':
318 case 'T':
319 case 'u':
320 case 'B':
321 case '0':
322 /* These are left unchanged. */
323 break;
324
325 default:
326 gcc_unreachable ();
327 }
6f29feb1 328 return copy;
6f29feb1 329}
ce9d4c6d
R
330
331/* Create a new copy of an rtx. Only copy just one level. */
8ac61af7 332
ce9d4c6d 333rtx
f7d504c2 334shallow_copy_rtx_stat (const_rtx orig MEM_STAT_DECL)
ce9d4c6d 335{
f7d504c2 336 const unsigned int size = rtx_size (orig);
a9429e29 337 rtx const copy = ggc_alloc_zone_rtx_def_stat (&rtl_zone, size PASS_MEM_STAT);
1634b18f 338 return (rtx) memcpy (copy, orig, size);
ce9d4c6d 339}
6f29feb1 340\f
1b3d8f8a
GK
341/* Nonzero when we are generating CONCATs. */
342int generating_concat_p;
4586b4ca
SB
343
344/* Nonzero when we are expanding trees to RTL. */
345int currently_expanding_to_rtl;
346
b5ee7789 347\f
e855c69d 348
b8698a0f 349/* Same as rtx_equal_p, but call CB on each pair of rtx if CB is not NULL.
7eb3f1f7
JJ
350 When the callback returns true, we continue with the new pair.
351 Whenever changing this function check if rtx_equal_p below doesn't need
352 changing as well. */
b5ee7789
CM
353
354int
e855c69d 355rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb)
b5ee7789 356{
b3694847
SS
357 int i;
358 int j;
359 enum rtx_code code;
360 const char *fmt;
e855c69d 361 rtx nx, ny;
b5ee7789
CM
362
363 if (x == y)
364 return 1;
365 if (x == 0 || y == 0)
366 return 0;
367
e855c69d
AB
368 /* Invoke the callback first. */
369 if (cb != NULL
370 && ((*cb) (&x, &y, &nx, &ny)))
371 return rtx_equal_p_cb (nx, ny, cb);
372
b5ee7789
CM
373 code = GET_CODE (x);
374 /* Rtx's of different codes cannot be equal. */
375 if (code != GET_CODE (y))
376 return 0;
377
378 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
379 (REG:SI x) and (REG:HI x) are NOT equivalent. */
380
381 if (GET_MODE (x) != GET_MODE (y))
382 return 0;
383
5932a4d4 384 /* MEMs referring to different address space are not equivalent. */
09e881c9
BE
385 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
386 return 0;
387
c13e8210
MM
388 /* Some RTL can be compared nonrecursively. */
389 switch (code)
390 {
391 case REG:
3fbd86b1 392 return (REGNO (x) == REGNO (y));
c13e8210
MM
393
394 case LABEL_REF:
395 return XEXP (x, 0) == XEXP (y, 0);
396
397 case SYMBOL_REF:
398 return XSTR (x, 0) == XSTR (y, 0);
399
0ca5af51 400 case DEBUG_EXPR:
b5b8b0ac 401 case VALUE:
c13e8210
MM
402 case SCRATCH:
403 case CONST_DOUBLE:
404 case CONST_INT:
091a3ac7 405 case CONST_FIXED:
c13e8210
MM
406 return 0;
407
c8a27c40
JJ
408 case DEBUG_IMPLICIT_PTR:
409 return DEBUG_IMPLICIT_PTR_DECL (x)
410 == DEBUG_IMPLICIT_PTR_DECL (y);
411
ddb555ed
JJ
412 case DEBUG_PARAMETER_REF:
413 return DEBUG_PARAMETER_REF_DECL (x)
414 == DEBUG_PARAMETER_REF_DECL (x);
415
a58a8e4b
JJ
416 case ENTRY_VALUE:
417 return rtx_equal_p_cb (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y), cb);
418
c13e8210
MM
419 default:
420 break;
421 }
b5ee7789
CM
422
423 /* Compare the elements. If any pair of corresponding elements
ce6e2d90 424 fail to match, return 0 for the whole thing. */
b5ee7789
CM
425
426 fmt = GET_RTX_FORMAT (code);
427 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
428 {
429 switch (fmt[i])
430 {
431 case 'w':
432 if (XWINT (x, i) != XWINT (y, i))
433 return 0;
434 break;
435
436 case 'n':
437 case 'i':
438 if (XINT (x, i) != XINT (y, i))
fee45723
JJ
439 {
440#ifndef GENERATOR_FILE
441 if (((code == ASM_OPERANDS && i == 6)
442 || (code == ASM_INPUT && i == 1))
443 && locator_eq (XINT (x, i), XINT (y, i)))
444 break;
445#endif
446 return 0;
447 }
b5ee7789
CM
448 break;
449
450 case 'V':
451 case 'E':
452 /* Two vectors must have the same length. */
453 if (XVECLEN (x, i) != XVECLEN (y, i))
454 return 0;
455
456 /* And the corresponding elements must match. */
457 for (j = 0; j < XVECLEN (x, i); j++)
b8698a0f 458 if (rtx_equal_p_cb (XVECEXP (x, i, j),
e855c69d 459 XVECEXP (y, i, j), cb) == 0)
b5ee7789
CM
460 return 0;
461 break;
462
463 case 'e':
e855c69d 464 if (rtx_equal_p_cb (XEXP (x, i), XEXP (y, i), cb) == 0)
b5ee7789
CM
465 return 0;
466 break;
467
468 case 'S':
469 case 's':
be006382
JDA
470 if ((XSTR (x, i) || XSTR (y, i))
471 && (! XSTR (x, i) || ! XSTR (y, i)
472 || strcmp (XSTR (x, i), XSTR (y, i))))
b5ee7789
CM
473 return 0;
474 break;
475
476 case 'u':
477 /* These are just backpointers, so they don't matter. */
478 break;
479
480 case '0':
481 case 't':
482 break;
483
484 /* It is believed that rtx's at this level will never
485 contain anything but integers and other rtx's,
486 except for within LABEL_REFs and SYMBOL_REFs. */
487 default:
41374e13 488 gcc_unreachable ();
b5ee7789
CM
489 }
490 }
491 return 1;
492}
439a7e54 493
e855c69d 494/* Return 1 if X and Y are identical-looking rtx's.
7eb3f1f7
JJ
495 This is the Lisp function EQUAL for rtx arguments.
496 Whenever changing this function check if rtx_equal_p_cb above doesn't need
497 changing as well. */
e855c69d
AB
498
499int
500rtx_equal_p (const_rtx x, const_rtx y)
501{
7eb3f1f7
JJ
502 int i;
503 int j;
504 enum rtx_code code;
505 const char *fmt;
506
507 if (x == y)
508 return 1;
509 if (x == 0 || y == 0)
510 return 0;
511
512 code = GET_CODE (x);
513 /* Rtx's of different codes cannot be equal. */
514 if (code != GET_CODE (y))
515 return 0;
516
517 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
518 (REG:SI x) and (REG:HI x) are NOT equivalent. */
519
520 if (GET_MODE (x) != GET_MODE (y))
521 return 0;
522
5932a4d4 523 /* MEMs referring to different address space are not equivalent. */
09e881c9
BE
524 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
525 return 0;
526
7eb3f1f7
JJ
527 /* Some RTL can be compared nonrecursively. */
528 switch (code)
529 {
530 case REG:
531 return (REGNO (x) == REGNO (y));
532
533 case LABEL_REF:
534 return XEXP (x, 0) == XEXP (y, 0);
535
536 case SYMBOL_REF:
537 return XSTR (x, 0) == XSTR (y, 0);
538
0ca5af51 539 case DEBUG_EXPR:
b5b8b0ac 540 case VALUE:
7eb3f1f7
JJ
541 case SCRATCH:
542 case CONST_DOUBLE:
543 case CONST_INT:
544 case CONST_FIXED:
545 return 0;
546
c8a27c40
JJ
547 case DEBUG_IMPLICIT_PTR:
548 return DEBUG_IMPLICIT_PTR_DECL (x)
549 == DEBUG_IMPLICIT_PTR_DECL (y);
550
ddb555ed
JJ
551 case DEBUG_PARAMETER_REF:
552 return DEBUG_PARAMETER_REF_DECL (x)
553 == DEBUG_PARAMETER_REF_DECL (y);
554
a58a8e4b
JJ
555 case ENTRY_VALUE:
556 return rtx_equal_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y));
557
7eb3f1f7
JJ
558 default:
559 break;
560 }
561
562 /* Compare the elements. If any pair of corresponding elements
563 fail to match, return 0 for the whole thing. */
564
565 fmt = GET_RTX_FORMAT (code);
566 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
567 {
568 switch (fmt[i])
569 {
570 case 'w':
571 if (XWINT (x, i) != XWINT (y, i))
572 return 0;
573 break;
574
575 case 'n':
576 case 'i':
577 if (XINT (x, i) != XINT (y, i))
fee45723
JJ
578 {
579#ifndef GENERATOR_FILE
580 if (((code == ASM_OPERANDS && i == 6)
581 || (code == ASM_INPUT && i == 1))
582 && locator_eq (XINT (x, i), XINT (y, i)))
583 break;
584#endif
585 return 0;
586 }
7eb3f1f7
JJ
587 break;
588
589 case 'V':
590 case 'E':
591 /* Two vectors must have the same length. */
592 if (XVECLEN (x, i) != XVECLEN (y, i))
593 return 0;
594
595 /* And the corresponding elements must match. */
596 for (j = 0; j < XVECLEN (x, i); j++)
597 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
598 return 0;
599 break;
600
601 case 'e':
602 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
603 return 0;
604 break;
605
606 case 'S':
607 case 's':
608 if ((XSTR (x, i) || XSTR (y, i))
609 && (! XSTR (x, i) || ! XSTR (y, i)
610 || strcmp (XSTR (x, i), XSTR (y, i))))
611 return 0;
612 break;
613
614 case 'u':
615 /* These are just backpointers, so they don't matter. */
616 break;
617
618 case '0':
619 case 't':
620 break;
621
622 /* It is believed that rtx's at this level will never
623 contain anything but integers and other rtx's,
624 except for within LABEL_REFs and SYMBOL_REFs. */
625 default:
626 gcc_unreachable ();
627 }
628 }
629 return 1;
e855c69d
AB
630}
631
d95828db
JJ
632/* Iteratively hash rtx X. */
633
634hashval_t
635iterative_hash_rtx (const_rtx x, hashval_t hash)
636{
637 enum rtx_code code;
638 enum machine_mode mode;
639 int i, j;
640 const char *fmt;
641
642 if (x == NULL_RTX)
643 return hash;
644 code = GET_CODE (x);
645 hash = iterative_hash_object (code, hash);
646 mode = GET_MODE (x);
647 hash = iterative_hash_object (mode, hash);
648 switch (code)
649 {
650 case REG:
651 i = REGNO (x);
652 return iterative_hash_object (i, hash);
653 case CONST_INT:
654 return iterative_hash_object (INTVAL (x), hash);
655 case SYMBOL_REF:
656 if (XSTR (x, 0))
657 return iterative_hash (XSTR (x, 0), strlen (XSTR (x, 0)) + 1,
658 hash);
659 return hash;
660 case LABEL_REF:
661 case DEBUG_EXPR:
662 case VALUE:
663 case SCRATCH:
664 case CONST_DOUBLE:
665 case CONST_FIXED:
666 case DEBUG_IMPLICIT_PTR:
ddb555ed 667 case DEBUG_PARAMETER_REF:
d95828db
JJ
668 return hash;
669 default:
670 break;
671 }
672
673 fmt = GET_RTX_FORMAT (code);
674 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
675 switch (fmt[i])
676 {
677 case 'w':
678 hash = iterative_hash_object (XWINT (x, i), hash);
679 break;
680 case 'n':
681 case 'i':
682 hash = iterative_hash_object (XINT (x, i), hash);
683 break;
684 case 'V':
685 case 'E':
686 j = XVECLEN (x, i);
687 hash = iterative_hash_object (j, hash);
688 for (j = 0; j < XVECLEN (x, i); j++)
689 hash = iterative_hash_rtx (XVECEXP (x, i, j), hash);
690 break;
691 case 'e':
692 hash = iterative_hash_rtx (XEXP (x, i), hash);
693 break;
694 case 'S':
695 case 's':
696 if (XSTR (x, i))
697 hash = iterative_hash (XSTR (x, 0), strlen (XSTR (x, 0)) + 1,
698 hash);
699 break;
700 default:
701 break;
702 }
703 return hash;
704}
705
83f676b3
RS
706void
707dump_rtx_statistics (void)
439a7e54 708{
439a7e54
DN
709 int i;
710 int total_counts = 0;
711 int total_sizes = 0;
7aa6d18a
SB
712
713 if (! GATHER_STATISTICS)
714 {
715 fprintf (stderr, "No RTX statistics\n");
716 return;
717 }
718
439a7e54
DN
719 fprintf (stderr, "\nRTX Kind Count Bytes\n");
720 fprintf (stderr, "---------------------------------------\n");
721 for (i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++)
722 if (rtx_alloc_counts[i])
723 {
724 fprintf (stderr, "%-20s %7d %10d\n", GET_RTX_NAME (i),
725 rtx_alloc_counts[i], rtx_alloc_sizes[i]);
726 total_counts += rtx_alloc_counts[i];
727 total_sizes += rtx_alloc_sizes[i];
728 }
729 if (rtvec_alloc_counts)
730 {
731 fprintf (stderr, "%-20s %7d %10d\n", "rtvec",
732 rtvec_alloc_counts, rtvec_alloc_sizes);
733 total_counts += rtvec_alloc_counts;
734 total_sizes += rtvec_alloc_sizes;
735 }
736 fprintf (stderr, "---------------------------------------\n");
737 fprintf (stderr, "%-20s %7d %10d\n",
738 "Total", total_counts, total_sizes);
739 fprintf (stderr, "---------------------------------------\n");
439a7e54 740}
b5ee7789 741\f
f4524c9e 742#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
ef178af3 743void
f7d504c2 744rtl_check_failed_bounds (const_rtx r, int n, const char *file, int line,
0c20a65f 745 const char *func)
ef178af3 746{
fce687f8 747 internal_error
9e637a26 748 ("RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d",
fce687f8
RK
749 n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
750 func, trim_filename (file), line);
ef178af3
ZW
751}
752
753void
f7d504c2 754rtl_check_failed_type1 (const_rtx r, int n, int c1, const char *file, int line,
0c20a65f 755 const char *func)
ef178af3 756{
fce687f8
RK
757 internal_error
758 ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
759 n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
760 func, trim_filename (file), line);
ef178af3
ZW
761}
762
763void
f7d504c2 764rtl_check_failed_type2 (const_rtx r, int n, int c1, int c2, const char *file,
0c20a65f 765 int line, const char *func)
ef178af3 766{
fce687f8
RK
767 internal_error
768 ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
769 n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
770 func, trim_filename (file), line);
ef178af3
ZW
771}
772
83ab3839 773void
f7d504c2 774rtl_check_failed_code1 (const_rtx r, enum rtx_code code, const char *file,
0c20a65f 775 int line, const char *func)
83ab3839 776{
9e637a26 777 internal_error ("RTL check: expected code '%s', have '%s' in %s, at %s:%d",
fce687f8
RK
778 GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
779 trim_filename (file), line);
83ab3839
RH
780}
781
782void
f7d504c2 783rtl_check_failed_code2 (const_rtx r, enum rtx_code code1, enum rtx_code code2,
0c20a65f 784 const char *file, int line, const char *func)
83ab3839 785{
fce687f8 786 internal_error
9e637a26 787 ("RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d",
fce687f8 788 GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
5ea1bc0e 789 func, trim_filename (file), line);
83ab3839
RH
790}
791
9e254451 792void
f7d504c2 793rtl_check_failed_code_mode (const_rtx r, enum rtx_code code, enum machine_mode mode,
9e254451
ILT
794 bool not_mode, const char *file, int line,
795 const char *func)
796{
797 internal_error ((not_mode
798 ? ("RTL check: expected code '%s' and not mode '%s', "
799 "have code '%s' and mode '%s' in %s, at %s:%d")
800 : ("RTL check: expected code '%s' and mode '%s', "
801 "have code '%s' and mode '%s' in %s, at %s:%d")),
802 GET_RTX_NAME (code), GET_MODE_NAME (mode),
803 GET_RTX_NAME (GET_CODE (r)), GET_MODE_NAME (GET_MODE (r)),
804 func, trim_filename (file), line);
805}
806
aacd3885
RS
807/* Report that line LINE of FILE tried to access the block symbol fields
808 of a non-block symbol. FUNC is the function that contains the line. */
809
810void
811rtl_check_failed_block_symbol (const char *file, int line, const char *func)
812{
813 internal_error
814 ("RTL check: attempt to treat non-block symbol as a block symbol "
815 "in %s, at %s:%d", func, trim_filename (file), line);
816}
817
ef178af3
ZW
818/* XXX Maybe print the vector? */
819void
f7d504c2 820rtvec_check_failed_bounds (const_rtvec r, int n, const char *file, int line,
0c20a65f 821 const char *func)
ef178af3 822{
fce687f8
RK
823 internal_error
824 ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
825 n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
ef178af3 826}
f4524c9e 827#endif /* ENABLE_RTL_CHECKING */
5a63e069
JJ
828
829#if defined ENABLE_RTL_FLAG_CHECKING
830void
f7d504c2 831rtl_check_failed_flag (const char *name, const_rtx r, const char *file,
0c20a65f 832 int line, const char *func)
5a63e069
JJ
833{
834 internal_error
9e637a26 835 ("RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d",
2d4cc6a7 836 name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
5a63e069
JJ
837}
838#endif /* ENABLE_RTL_FLAG_CHECKING */