xref: /netbsd-src/external/gpl3/gcc/dist/gcc/rtl.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* RTL utility routines.
2    Copyright (C) 1987-2022 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      "p" is a poly_uint16 offset.  */
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 
103 const enum rtx_class rtx_class[NUM_RTX_CODE] = {
104 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   CLASS,
105 #include "rtl.def"		/* rtl expressions are defined here */
106 #undef DEF_RTL_EXPR
107 };
108 
109 /* Whether rtxs with the given code store data in the hwint field.  */
110 
111 #define RTX_CODE_HWINT_P_1(ENUM)					\
112     ((ENUM) == CONST_INT || (ENUM) == CONST_DOUBLE			\
113      || (ENUM) == CONST_FIXED || (ENUM) == CONST_WIDE_INT)
114 #ifdef GENERATOR_FILE
115 #define RTX_CODE_HWINT_P(ENUM)						\
116     (RTX_CODE_HWINT_P_1 (ENUM) || (ENUM) == EQ_ATTR_ALT)
117 #else
118 #define RTX_CODE_HWINT_P RTX_CODE_HWINT_P_1
119 #endif
120 
121 /* Indexed by rtx code, gives the size of the rtx in bytes.  */
122 
123 const unsigned char rtx_code_size[NUM_RTX_CODE] = {
124 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)				\
125   (RTX_CODE_HWINT_P (ENUM)						\
126    ? RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (HOST_WIDE_INT)	\
127    : (ENUM) == REG							\
128    ? RTX_HDR_SIZE + sizeof (reg_info)					\
129    : RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (rtunion)),
130 
131 #include "rtl.def"
132 #undef DEF_RTL_EXPR
133 };
134 
135 /* Names for kinds of NOTEs and REG_NOTEs.  */
136 
137 const char * const note_insn_name[NOTE_INSN_MAX] =
138 {
139 #define DEF_INSN_NOTE(NAME) #NAME,
140 #include "insn-notes.def"
141 #undef DEF_INSN_NOTE
142 };
143 
144 const char * const reg_note_name[REG_NOTE_MAX] =
145 {
146 #define DEF_REG_NOTE(NAME) #NAME,
147 #include "reg-notes.def"
148 #undef DEF_REG_NOTE
149 };
150 
151 static size_t rtx_alloc_counts[(int) LAST_AND_UNUSED_RTX_CODE];
152 static size_t rtx_alloc_sizes[(int) LAST_AND_UNUSED_RTX_CODE];
153 static size_t rtvec_alloc_counts;
154 static size_t rtvec_alloc_sizes;
155 
156 
157 /* Allocate an rtx vector of N elements.
158    Store the length, and initialize all elements to zero.  */
159 
160 rtvec
rtvec_alloc(size_t n)161 rtvec_alloc (size_t n)
162 {
163   rtvec rt;
164 
165   /* rtvec_def.num_elem is an int.  */
166   gcc_assert (n < INT_MAX);
167 
168   rt = ggc_alloc_rtvec_sized (n);
169   /* Clear out the vector.  */
170   memset (&rt->elem[0], 0, n * sizeof (rtx));
171 
172   PUT_NUM_ELEM (rt, n);
173 
174   if (GATHER_STATISTICS)
175     {
176       rtvec_alloc_counts++;
177       rtvec_alloc_sizes += n * sizeof (rtx);
178     }
179 
180   return rt;
181 }
182 
183 /* Create a bitwise copy of VEC.  */
184 
185 rtvec
shallow_copy_rtvec(rtvec vec)186 shallow_copy_rtvec (rtvec vec)
187 {
188   rtvec newvec;
189   int n;
190 
191   n = GET_NUM_ELEM (vec);
192   newvec = rtvec_alloc (n);
193   memcpy (&newvec->elem[0], &vec->elem[0], sizeof (rtx) * n);
194   return newvec;
195 }
196 
197 /* Return the number of bytes occupied by rtx value X.  */
198 
199 unsigned int
rtx_size(const_rtx x)200 rtx_size (const_rtx x)
201 {
202   if (CONST_WIDE_INT_P (x))
203     return (RTX_HDR_SIZE
204 	    + sizeof (struct hwivec_def)
205 	    + ((CONST_WIDE_INT_NUNITS (x) - 1)
206 	       * sizeof (HOST_WIDE_INT)));
207   if (CONST_POLY_INT_P (x))
208     return (RTX_HDR_SIZE
209 	    + sizeof (struct const_poly_int_def)
210 	    + CONST_POLY_INT_COEFFS (x).extra_size ());
211   if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_HAS_BLOCK_INFO_P (x))
212     return RTX_HDR_SIZE + sizeof (struct block_symbol);
213   return RTX_CODE_SIZE (GET_CODE (x));
214 }
215 
216 /* Allocate an rtx of code CODE with EXTRA bytes in it.  The CODE is
217    stored in the rtx; all the rest is initialized to zero.  */
218 
219 rtx
rtx_alloc_stat_v(RTX_CODE code MEM_STAT_DECL,int extra)220 rtx_alloc_stat_v (RTX_CODE code MEM_STAT_DECL, int extra)
221 {
222   rtx rt = ggc_alloc_rtx_def_stat (RTX_CODE_SIZE (code) + extra
223 				   PASS_MEM_STAT);
224 
225   rtx_init (rt, code);
226 
227   if (GATHER_STATISTICS)
228     {
229       rtx_alloc_counts[code]++;
230       rtx_alloc_sizes[code] += RTX_CODE_SIZE (code);
231     }
232 
233   return rt;
234 }
235 
236 /* Allocate an rtx of code CODE.  The CODE is stored in the rtx;
237    all the rest is initialized to zero.  */
238 
239 rtx
rtx_alloc(RTX_CODE code MEM_STAT_DECL)240 rtx_alloc (RTX_CODE code MEM_STAT_DECL)
241 {
242   return rtx_alloc_stat_v (code PASS_MEM_STAT, 0);
243 }
244 
245 /* Write the wide constant X to OUTFILE.  */
246 
247 void
cwi_output_hex(FILE * outfile,const_rtx x)248 cwi_output_hex (FILE *outfile, const_rtx x)
249 {
250   int i = CWI_GET_NUM_ELEM (x);
251   gcc_assert (i > 0);
252   if (CWI_ELT (x, i - 1) == 0)
253     /* The HOST_WIDE_INT_PRINT_HEX prepends a 0x only if the val is
254        non zero.  We want all numbers to have a 0x prefix.  */
255     fprintf (outfile, "0x");
256   fprintf (outfile, HOST_WIDE_INT_PRINT_HEX, CWI_ELT (x, --i));
257   while (--i >= 0)
258     fprintf (outfile, HOST_WIDE_INT_PRINT_PADDED_HEX, CWI_ELT (x, i));
259 }
260 
261 
262 /* Return true if ORIG is a sharable CONST.  */
263 
264 bool
shared_const_p(const_rtx orig)265 shared_const_p (const_rtx orig)
266 {
267   gcc_assert (GET_CODE (orig) == CONST);
268 
269   /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
270      a LABEL_REF, it isn't sharable.  */
271   poly_int64 offset;
272   return (GET_CODE (XEXP (orig, 0)) == PLUS
273 	  && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
274 	  && poly_int_rtx_p (XEXP (XEXP (orig, 0), 1), &offset));
275 }
276 
277 
278 /* Create a new copy of an rtx.
279    Recursively copies the operands of the rtx,
280    except for those few rtx codes that are sharable.  */
281 
282 rtx
copy_rtx(rtx orig)283 copy_rtx (rtx orig)
284 {
285   rtx copy;
286   int i, j;
287   RTX_CODE code;
288   const char *format_ptr;
289 
290   code = GET_CODE (orig);
291 
292   switch (code)
293     {
294     case REG:
295     case DEBUG_EXPR:
296     case VALUE:
297     CASE_CONST_ANY:
298     case SYMBOL_REF:
299     case CODE_LABEL:
300     case PC:
301     case RETURN:
302     case SIMPLE_RETURN:
303     case SCRATCH:
304       /* SCRATCH must be shared because they represent distinct values.  */
305       return orig;
306     case CLOBBER:
307       /* Share clobbers of hard registers, but do not share pseudo reg
308          clobbers or clobbers of hard registers that originated as pseudos.
309          This is needed to allow safe register renaming.  */
310       if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER
311 	  && ORIGINAL_REGNO (XEXP (orig, 0)) == REGNO (XEXP (orig, 0)))
312 	return orig;
313       break;
314 
315     case CONST:
316       if (shared_const_p (orig))
317 	return orig;
318       break;
319 
320       /* A MEM with a constant address is not sharable.  The problem is that
321 	 the constant address may need to be reloaded.  If the mem is shared,
322 	 then reloading one copy of this mem will cause all copies to appear
323 	 to have been reloaded.  */
324 
325     default:
326       break;
327     }
328 
329   /* Copy the various flags, fields, and other information.  We assume
330      that all fields need copying, and then clear the fields that should
331      not be copied.  That is the sensible default behavior, and forces
332      us to explicitly document why we are *not* copying a flag.  */
333   copy = shallow_copy_rtx (orig);
334 
335   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
336 
337   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
338     switch (*format_ptr++)
339       {
340       case 'e':
341 	if (XEXP (orig, i) != NULL)
342 	  XEXP (copy, i) = copy_rtx (XEXP (orig, i));
343 	break;
344 
345       case 'E':
346       case 'V':
347 	if (XVEC (orig, i) != NULL)
348 	  {
349 	    XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
350 	    for (j = 0; j < XVECLEN (copy, i); j++)
351 	      XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
352 	  }
353 	break;
354 
355       case 't':
356       case 'w':
357       case 'i':
358       case 'p':
359       case 's':
360       case 'S':
361       case 'T':
362       case 'u':
363       case 'B':
364       case '0':
365 	/* These are left unchanged.  */
366 	break;
367 
368       default:
369 	gcc_unreachable ();
370       }
371   return copy;
372 }
373 
374 /* Create a new copy of an rtx.  Only copy just one level.  */
375 
376 rtx
shallow_copy_rtx(const_rtx orig MEM_STAT_DECL)377 shallow_copy_rtx (const_rtx orig MEM_STAT_DECL)
378 {
379   const unsigned int size = rtx_size (orig);
380   rtx const copy = ggc_alloc_rtx_def_stat (size PASS_MEM_STAT);
381   memcpy (copy, orig, size);
382   switch (GET_CODE (orig))
383     {
384       /* RTX codes copy_rtx_if_shared_1 considers are shareable,
385 	 the used flag is often used for other purposes.  */
386     case REG:
387     case DEBUG_EXPR:
388     case VALUE:
389     CASE_CONST_ANY:
390     case SYMBOL_REF:
391     case CODE_LABEL:
392     case PC:
393     case RETURN:
394     case SIMPLE_RETURN:
395     case SCRATCH:
396       break;
397     default:
398       /* For all other RTXes clear the used flag on the copy.
399 	 CALL_INSN use "used" flag to indicate it's a fake call.  */
400       if (!INSN_P (orig))
401 	RTX_FLAG (copy, used) = 0;
402       break;
403     }
404   return copy;
405 }
406 
407 /* Nonzero when we are generating CONCATs.  */
408 int generating_concat_p;
409 
410 /* Nonzero when we are expanding trees to RTL.  */
411 int currently_expanding_to_rtl;
412 
413 
414 
415 /* Same as rtx_equal_p, but call CB on each pair of rtx if CB is not NULL.
416    When the callback returns true, we continue with the new pair.
417    Whenever changing this function check if rtx_equal_p below doesn't need
418    changing as well.  */
419 
420 int
rtx_equal_p_cb(const_rtx x,const_rtx y,rtx_equal_p_callback_function cb)421 rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb)
422 {
423   int i;
424   int j;
425   enum rtx_code code;
426   const char *fmt;
427   rtx nx, ny;
428 
429   if (x == y)
430     return 1;
431   if (x == 0 || y == 0)
432     return 0;
433 
434   /* Invoke the callback first.  */
435   if (cb != NULL
436       && ((*cb) (&x, &y, &nx, &ny)))
437     return rtx_equal_p_cb (nx, ny, cb);
438 
439   code = GET_CODE (x);
440   /* Rtx's of different codes cannot be equal.  */
441   if (code != GET_CODE (y))
442     return 0;
443 
444   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
445      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
446 
447   if (GET_MODE (x) != GET_MODE (y))
448     return 0;
449 
450   /* MEMs referring to different address space are not equivalent.  */
451   if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
452     return 0;
453 
454   /* Some RTL can be compared nonrecursively.  */
455   switch (code)
456     {
457     case REG:
458       return (REGNO (x) == REGNO (y));
459 
460     case LABEL_REF:
461       return label_ref_label (x) == label_ref_label (y);
462 
463     case SYMBOL_REF:
464       return XSTR (x, 0) == XSTR (y, 0);
465 
466     case DEBUG_EXPR:
467     case VALUE:
468     case SCRATCH:
469     CASE_CONST_UNIQUE:
470       return 0;
471 
472     case CONST_VECTOR:
473       if (!same_vector_encodings_p (x, y))
474 	return false;
475       break;
476 
477     case DEBUG_IMPLICIT_PTR:
478       return DEBUG_IMPLICIT_PTR_DECL (x)
479 	     == DEBUG_IMPLICIT_PTR_DECL (y);
480 
481     case DEBUG_PARAMETER_REF:
482       return DEBUG_PARAMETER_REF_DECL (x)
483 	     == DEBUG_PARAMETER_REF_DECL (y);
484 
485     case ENTRY_VALUE:
486       return rtx_equal_p_cb (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y), cb);
487 
488     default:
489       break;
490     }
491 
492   /* Compare the elements.  If any pair of corresponding elements
493      fail to match, return 0 for the whole thing.  */
494 
495   fmt = GET_RTX_FORMAT (code);
496   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
497     {
498       switch (fmt[i])
499 	{
500 	case 'w':
501 	  if (XWINT (x, i) != XWINT (y, i))
502 	    return 0;
503 	  break;
504 
505 	case 'n':
506 	case 'i':
507 	  if (XINT (x, i) != XINT (y, i))
508 	    {
509 #ifndef GENERATOR_FILE
510 	      if (((code == ASM_OPERANDS && i == 6)
511 		   || (code == ASM_INPUT && i == 1))
512 		  && XINT (x, i) == XINT (y, i))
513 		break;
514 #endif
515 	      return 0;
516 	    }
517 	  break;
518 
519 	case 'p':
520 	  if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
521 	    return 0;
522 	  break;
523 
524 	case 'V':
525 	case 'E':
526 	  /* Two vectors must have the same length.  */
527 	  if (XVECLEN (x, i) != XVECLEN (y, i))
528 	    return 0;
529 
530 	  /* And the corresponding elements must match.  */
531 	  for (j = 0; j < XVECLEN (x, i); j++)
532 	    if (rtx_equal_p_cb (XVECEXP (x, i, j),
533                                 XVECEXP (y, i, j), cb) == 0)
534 	      return 0;
535 	  break;
536 
537 	case 'e':
538 	  if (rtx_equal_p_cb (XEXP (x, i), XEXP (y, i), cb) == 0)
539 	    return 0;
540 	  break;
541 
542 	case 'S':
543 	case 's':
544 	  if ((XSTR (x, i) || XSTR (y, i))
545 	      && (! XSTR (x, i) || ! XSTR (y, i)
546 		  || strcmp (XSTR (x, i), XSTR (y, i))))
547 	    return 0;
548 	  break;
549 
550 	case 'u':
551 	  /* These are just backpointers, so they don't matter.  */
552 	  break;
553 
554 	case '0':
555 	case 't':
556 	  break;
557 
558 	  /* It is believed that rtx's at this level will never
559 	     contain anything but integers and other rtx's,
560 	     except for within LABEL_REFs and SYMBOL_REFs.  */
561 	default:
562 	  gcc_unreachable ();
563 	}
564     }
565   return 1;
566 }
567 
568 /* Return 1 if X and Y are identical-looking rtx's.
569    This is the Lisp function EQUAL for rtx arguments.
570    Whenever changing this function check if rtx_equal_p_cb above doesn't need
571    changing as well.  */
572 
573 int
rtx_equal_p(const_rtx x,const_rtx y)574 rtx_equal_p (const_rtx x, const_rtx y)
575 {
576   int i;
577   int j;
578   enum rtx_code code;
579   const char *fmt;
580 
581   if (x == y)
582     return 1;
583   if (x == 0 || y == 0)
584     return 0;
585 
586   code = GET_CODE (x);
587   /* Rtx's of different codes cannot be equal.  */
588   if (code != GET_CODE (y))
589     return 0;
590 
591   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
592      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
593 
594   if (GET_MODE (x) != GET_MODE (y))
595     return 0;
596 
597   /* MEMs referring to different address space are not equivalent.  */
598   if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
599     return 0;
600 
601   /* Some RTL can be compared nonrecursively.  */
602   switch (code)
603     {
604     case REG:
605       return (REGNO (x) == REGNO (y));
606 
607     case LABEL_REF:
608       return label_ref_label (x) == label_ref_label (y);
609 
610     case SYMBOL_REF:
611       return XSTR (x, 0) == XSTR (y, 0);
612 
613     case DEBUG_EXPR:
614     case VALUE:
615     case SCRATCH:
616     CASE_CONST_UNIQUE:
617       return 0;
618 
619     case CONST_VECTOR:
620       if (!same_vector_encodings_p (x, y))
621 	return false;
622       break;
623 
624     case DEBUG_IMPLICIT_PTR:
625       return DEBUG_IMPLICIT_PTR_DECL (x)
626 	     == DEBUG_IMPLICIT_PTR_DECL (y);
627 
628     case DEBUG_PARAMETER_REF:
629       return DEBUG_PARAMETER_REF_DECL (x)
630 	     == DEBUG_PARAMETER_REF_DECL (y);
631 
632     case ENTRY_VALUE:
633       return rtx_equal_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y));
634 
635     default:
636       break;
637     }
638 
639   /* Compare the elements.  If any pair of corresponding elements
640      fail to match, return 0 for the whole thing.  */
641 
642   fmt = GET_RTX_FORMAT (code);
643   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
644     {
645       switch (fmt[i])
646 	{
647 	case 'w':
648 	  if (XWINT (x, i) != XWINT (y, i))
649 	    return 0;
650 	  break;
651 
652 	case 'n':
653 	case 'i':
654 	  if (XINT (x, i) != XINT (y, i))
655 	    {
656 #ifndef GENERATOR_FILE
657 	      if (((code == ASM_OPERANDS && i == 6)
658 		   || (code == ASM_INPUT && i == 1))
659 		  && XINT (x, i) == XINT (y, i))
660 		break;
661 #endif
662 	      return 0;
663 	    }
664 	  break;
665 
666 	case 'p':
667 	  if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
668 	    return 0;
669 	  break;
670 
671 	case 'V':
672 	case 'E':
673 	  /* Two vectors must have the same length.  */
674 	  if (XVECLEN (x, i) != XVECLEN (y, i))
675 	    return 0;
676 
677 	  /* And the corresponding elements must match.  */
678 	  for (j = 0; j < XVECLEN (x, i); j++)
679 	    if (rtx_equal_p (XVECEXP (x, i, j),  XVECEXP (y, i, j)) == 0)
680 	      return 0;
681 	  break;
682 
683 	case 'e':
684 	  if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
685 	    return 0;
686 	  break;
687 
688 	case 'S':
689 	case 's':
690 	  if ((XSTR (x, i) || XSTR (y, i))
691 	      && (! XSTR (x, i) || ! XSTR (y, i)
692 		  || strcmp (XSTR (x, i), XSTR (y, i))))
693 	    return 0;
694 	  break;
695 
696 	case 'u':
697 	  /* These are just backpointers, so they don't matter.  */
698 	  break;
699 
700 	case '0':
701 	case 't':
702 	  break;
703 
704 	  /* It is believed that rtx's at this level will never
705 	     contain anything but integers and other rtx's,
706 	     except for within LABEL_REFs and SYMBOL_REFs.  */
707 	default:
708 	  gcc_unreachable ();
709 	}
710     }
711   return 1;
712 }
713 
714 /* Return true if all elements of VEC are equal.  */
715 
716 bool
rtvec_all_equal_p(const_rtvec vec)717 rtvec_all_equal_p (const_rtvec vec)
718 {
719   const_rtx first = RTVEC_ELT (vec, 0);
720   /* Optimize the important special case of a vector of constants.
721      The main use of this function is to detect whether every element
722      of CONST_VECTOR is the same.  */
723   switch (GET_CODE (first))
724     {
725     CASE_CONST_UNIQUE:
726       for (int i = 1, n = GET_NUM_ELEM (vec); i < n; ++i)
727 	if (first != RTVEC_ELT (vec, i))
728 	  return false;
729       return true;
730 
731     default:
732       for (int i = 1, n = GET_NUM_ELEM (vec); i < n; ++i)
733 	if (!rtx_equal_p (first, RTVEC_ELT (vec, i)))
734 	  return false;
735       return true;
736     }
737 }
738 
739 /* Return true if VEC contains a linear series of integers
740    { START, START+1, START+2, ... }.  */
741 
742 bool
rtvec_series_p(rtvec vec,int start)743 rtvec_series_p (rtvec vec, int start)
744 {
745   for (int i = 0; i < GET_NUM_ELEM (vec); i++)
746     {
747       rtx x = RTVEC_ELT (vec, i);
748       if (!CONST_INT_P (x) || INTVAL (x) != i + start)
749 	return false;
750     }
751   return true;
752 }
753 
754 /* Return an indication of which type of insn should have X as a body.
755    In generator files, this can be UNKNOWN if the answer is only known
756    at (GCC) runtime.  Otherwise the value is CODE_LABEL, INSN, CALL_INSN
757    or JUMP_INSN.  */
758 
759 enum rtx_code
classify_insn(rtx x)760 classify_insn (rtx x)
761 {
762   if (LABEL_P (x))
763     return CODE_LABEL;
764   if (GET_CODE (x) == CALL)
765     return CALL_INSN;
766   if (ANY_RETURN_P (x))
767     return JUMP_INSN;
768   if (GET_CODE (x) == ASM_OPERANDS && ASM_OPERANDS_LABEL_LENGTH (x))
769     return JUMP_INSN;
770   if (GET_CODE (x) == SET)
771     {
772       if (GET_CODE (SET_DEST (x)) == PC)
773 	return JUMP_INSN;
774       else if (GET_CODE (SET_SRC (x)) == CALL)
775 	return CALL_INSN;
776       else
777 	return INSN;
778     }
779   if (GET_CODE (x) == PARALLEL)
780     {
781       int j;
782       bool has_return_p = false;
783       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
784 	if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
785 	  return CALL_INSN;
786 	else if (ANY_RETURN_P (XVECEXP (x, 0, j)))
787 	  has_return_p = true;
788 	else if (GET_CODE (XVECEXP (x, 0, j)) == SET
789 		 && GET_CODE (SET_DEST (XVECEXP (x, 0, j))) == PC)
790 	  return JUMP_INSN;
791 	else if (GET_CODE (XVECEXP (x, 0, j)) == SET
792 		 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
793 	  return CALL_INSN;
794       if (has_return_p)
795 	return JUMP_INSN;
796       if (GET_CODE (XVECEXP (x, 0, 0)) == ASM_OPERANDS
797 	  && ASM_OPERANDS_LABEL_LENGTH (XVECEXP (x, 0, 0)))
798 	return JUMP_INSN;
799     }
800 #ifdef GENERATOR_FILE
801   if (GET_CODE (x) == MATCH_OPERAND
802       || GET_CODE (x) == MATCH_OPERATOR
803       || GET_CODE (x) == MATCH_PARALLEL
804       || GET_CODE (x) == MATCH_OP_DUP
805       || GET_CODE (x) == MATCH_DUP
806       || GET_CODE (x) == PARALLEL)
807     return UNKNOWN;
808 #endif
809   return INSN;
810 }
811 
812 /* Comparator of indices based on rtx_alloc_counts.  */
813 
814 static int
rtx_count_cmp(const void * p1,const void * p2)815 rtx_count_cmp (const void *p1, const void *p2)
816 {
817   const unsigned *n1 = (const unsigned *)p1;
818   const unsigned *n2 = (const unsigned *)p2;
819 
820   return rtx_alloc_counts[*n1] - rtx_alloc_counts[*n2];
821 }
822 
823 void
dump_rtx_statistics(void)824 dump_rtx_statistics (void)
825 {
826   int total_counts = 0;
827   int total_sizes = 0;
828 
829   if (! GATHER_STATISTICS)
830     {
831       fprintf (stderr, "No RTX statistics\n");
832       return;
833     }
834 
835   fprintf (stderr, "\nRTX Kind                   Count     Bytes\n");
836   fprintf (stderr, "-------------------------------------------\n");
837 
838   auto_vec<unsigned> indices (LAST_AND_UNUSED_RTX_CODE);
839   for (unsigned i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++)
840     indices.quick_push (i);
841   indices.qsort (rtx_count_cmp);
842 
843   for (unsigned i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++)
844     {
845       unsigned j = indices[i];
846       if (rtx_alloc_counts[j])
847 	{
848 	  fprintf (stderr, "%-24s " PRsa (6) " " PRsa (9) "\n",
849 		   GET_RTX_NAME (j),
850 		   SIZE_AMOUNT (rtx_alloc_counts[j]),
851 		   SIZE_AMOUNT (rtx_alloc_sizes[j]));
852 	  total_counts += rtx_alloc_counts[j];
853 	  total_sizes += rtx_alloc_sizes[j];
854 	}
855     }
856 
857   if (rtvec_alloc_counts)
858     {
859       fprintf (stderr, "%-24s " PRsa (6) " " PRsa (9) "\n", "rtvec",
860 	       SIZE_AMOUNT (rtvec_alloc_counts),
861 	       SIZE_AMOUNT (rtvec_alloc_sizes));
862       total_counts += rtvec_alloc_counts;
863       total_sizes += rtvec_alloc_sizes;
864     }
865   fprintf (stderr, "-----------------------------------------------\n");
866   fprintf (stderr, "%-24s " PRsa (6) " " PRsa (9) "\n",
867 	   "Total", SIZE_AMOUNT (total_counts),
868 	   SIZE_AMOUNT (total_sizes));
869   fprintf (stderr, "-----------------------------------------------\n");
870 }
871 
872 #if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
873 
874 /* Disable warnings about missing quoting in GCC diagnostics for
875    the internal_error calls.  Their format strings deliberately don't
876    follow GCC diagnostic conventions.  */
877 #if __GNUC__ >= 10
878 #pragma GCC diagnostic push
879 #pragma GCC diagnostic ignored "-Wformat-diag"
880 #endif
881 
882 void
rtl_check_failed_bounds(const_rtx r,int n,const char * file,int line,const char * func)883 rtl_check_failed_bounds (const_rtx r, int n, const char *file, int line,
884 			 const char *func)
885 {
886   internal_error
887     ("RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d",
888      n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
889      func, trim_filename (file), line);
890 }
891 
892 void
rtl_check_failed_type1(const_rtx r,int n,int c1,const char * file,int line,const char * func)893 rtl_check_failed_type1 (const_rtx r, int n, int c1, const char *file, int line,
894 			const char *func)
895 {
896   internal_error
897     ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
898      n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
899      func, trim_filename (file), line);
900 }
901 
902 void
rtl_check_failed_type2(const_rtx r,int n,int c1,int c2,const char * file,int line,const char * func)903 rtl_check_failed_type2 (const_rtx r, int n, int c1, int c2, const char *file,
904 			int line, const char *func)
905 {
906   internal_error
907     ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
908      n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
909      func, trim_filename (file), line);
910 }
911 
912 void
rtl_check_failed_code1(const_rtx r,enum rtx_code code,const char * file,int line,const char * func)913 rtl_check_failed_code1 (const_rtx r, enum rtx_code code, const char *file,
914 			int line, const char *func)
915 {
916   internal_error ("RTL check: expected code '%s', have '%s' in %s, at %s:%d",
917 		  GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
918 		  trim_filename (file), line);
919 }
920 
921 void
rtl_check_failed_code2(const_rtx r,enum rtx_code code1,enum rtx_code code2,const char * file,int line,const char * func)922 rtl_check_failed_code2 (const_rtx r, enum rtx_code code1, enum rtx_code code2,
923 			const char *file, int line, const char *func)
924 {
925   internal_error
926     ("RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d",
927      GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
928      func, trim_filename (file), line);
929 }
930 
931 void
rtl_check_failed_code3(const_rtx r,enum rtx_code code1,enum rtx_code code2,enum rtx_code code3,const char * file,int line,const char * func)932 rtl_check_failed_code3 (const_rtx r, enum rtx_code code1, enum rtx_code code2,
933 			enum rtx_code code3, const char *file, int line,
934 			const char *func)
935 {
936   internal_error
937     ("RTL check: expected code '%s', '%s' or '%s', have '%s' in %s, at %s:%d",
938      GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (code3),
939      GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
940 }
941 
942 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)943 rtl_check_failed_code_mode (const_rtx r, enum rtx_code code, machine_mode mode,
944 			    bool not_mode, const char *file, int line,
945 			    const char *func)
946 {
947   internal_error ((not_mode
948 		   ? ("RTL check: expected code '%s' and not mode '%s', "
949 		      "have code '%s' and mode '%s' in %s, at %s:%d")
950 		   : ("RTL check: expected code '%s' and mode '%s', "
951 		      "have code '%s' and mode '%s' in %s, at %s:%d")),
952 		  GET_RTX_NAME (code), GET_MODE_NAME (mode),
953 		  GET_RTX_NAME (GET_CODE (r)), GET_MODE_NAME (GET_MODE (r)),
954 		  func, trim_filename (file), line);
955 }
956 
957 #if __GNUC__ >= 10
958 #pragma GCC diagnostic pop
959 #endif
960 
961 /* Report that line LINE of FILE tried to access the block symbol fields
962    of a non-block symbol.  FUNC is the function that contains the line.  */
963 
964 void
rtl_check_failed_block_symbol(const char * file,int line,const char * func)965 rtl_check_failed_block_symbol (const char *file, int line, const char *func)
966 {
967   internal_error
968     ("RTL check: attempt to treat non-block symbol as a block symbol "
969      "in %s, at %s:%d", func, trim_filename (file), line);
970 }
971 
972 /* XXX Maybe print the vector?  */
973 void
cwi_check_failed_bounds(const_rtx x,int n,const char * file,int line,const char * func)974 cwi_check_failed_bounds (const_rtx x, int n, const char *file, int line,
975 			 const char *func)
976 {
977   internal_error
978     ("RTL check: access of hwi elt %d of vector with last elt %d in %s, at %s:%d",
979      n, CWI_GET_NUM_ELEM (x) - 1, func, trim_filename (file), line);
980 }
981 
982 /* XXX Maybe print the vector?  */
983 void
rtvec_check_failed_bounds(const_rtvec r,int n,const char * file,int line,const char * func)984 rtvec_check_failed_bounds (const_rtvec r, int n, const char *file, int line,
985 			   const char *func)
986 {
987   internal_error
988     ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
989      n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
990 }
991 #endif /* ENABLE_RTL_CHECKING */
992 
993 #if defined ENABLE_RTL_FLAG_CHECKING
994 void
rtl_check_failed_flag(const char * name,const_rtx r,const char * file,int line,const char * func)995 rtl_check_failed_flag (const char *name, const_rtx r, const char *file,
996 		       int line, const char *func)
997 {
998   internal_error
999     ("RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d",
1000      name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
1001 }
1002 #endif /* ENABLE_RTL_FLAG_CHECKING */
1003