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 
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 
145 /* Allocate an rtx vector of N elements.
146    Store the length, and initialize all elements to zero.  */
147 
148 rtvec
rtvec_alloc(int n)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
shallow_copy_rtvec(rtvec vec)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
rtx_size(const_rtx x)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
rtx_alloc_stat_v(RTX_CODE code MEM_STAT_DECL,int extra)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
rtx_alloc_stat(RTX_CODE code MEM_STAT_DECL)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
cwi_output_hex(FILE * outfile,const_rtx x)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 
248 /* Return true if ORIG is a sharable CONST.  */
249 
250 bool
shared_const_p(const_rtx orig)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
copy_rtx(rtx orig)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
shallow_copy_rtx_stat(const_rtx orig MEM_STAT_DECL)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 
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 
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
rtx_equal_p_cb(const_rtx x,const_rtx y,rtx_equal_p_callback_function cb)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
rtx_equal_p(const_rtx x,const_rtx y)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
rtvec_all_equal_p(const_rtvec vec)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
classify_insn(rtx x)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
dump_rtx_statistics(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 
774 #if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
775 void
rtl_check_failed_bounds(const_rtx r,int n,const char * file,int line,const char * func)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
rtl_check_failed_type1(const_rtx r,int n,int c1,const char * file,int line,const char * func)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
rtl_check_failed_type2(const_rtx r,int n,int c1,int c2,const char * file,int line,const char * func)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
rtl_check_failed_code1(const_rtx r,enum rtx_code code,const char * file,int line,const char * func)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
rtl_check_failed_code2(const_rtx r,enum rtx_code code1,enum rtx_code code2,const char * file,int line,const char * func)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
rtl_check_failed_code_mode(const_rtx r,enum rtx_code code,machine_mode mode,bool not_mode,const char * file,int line,const char * func)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
rtl_check_failed_block_symbol(const char * file,int line,const char * func)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
cwi_check_failed_bounds(const_rtx x,int n,const char * file,int line,const char * func)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
rtvec_check_failed_bounds(const_rtvec r,int n,const char * file,int line,const char * func)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
rtl_check_failed_flag(const char * name,const_rtx r,const char * file,int line,const char * func)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 */
881