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