poly_int: loop versioning threshold
[official-gcc.git] / gcc / genrecog.c
blobce2f26272afdb62936de9ef1eec28df4e00c3972
1 /* Generate code from machine description to recognize rtl as insns.
2 Copyright (C) 1987-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
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/>. */
21 /* This program is used to produce insn-recog.c, which contains a
22 function called `recog' plus its subroutines. These functions
23 contain a decision tree that recognizes whether an rtx, the
24 argument given to recog, is a valid instruction.
26 recog returns -1 if the rtx is not valid. If the rtx is valid,
27 recog returns a nonnegative number which is the insn code number
28 for the pattern that matched. This is the same as the order in the
29 machine description of the entry that matched. This number can be
30 used as an index into various insn_* tables, such as insn_template,
31 insn_outfun, and insn_n_operands (found in insn-output.c).
33 The third argument to recog is an optional pointer to an int. If
34 present, recog will accept a pattern if it matches except for
35 missing CLOBBER expressions at the end. In that case, the value
36 pointed to by the optional pointer will be set to the number of
37 CLOBBERs that need to be added (it should be initialized to zero by
38 the caller). If it is set nonzero, the caller should allocate a
39 PARALLEL of the appropriate size, copy the initial entries, and
40 call add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.
42 This program also generates the function `split_insns', which
43 returns 0 if the rtl could not be split, or it returns the split
44 rtl as an INSN list.
46 This program also generates the function `peephole2_insns', which
47 returns 0 if the rtl could not be matched. If there was a match,
48 the new rtl is returned in an INSN list, and LAST_INSN will point
49 to the last recognized insn in the old sequence.
52 At a high level, the algorithm used in this file is as follows:
54 1. Build up a decision tree for each routine, using the following
55 approach to matching an rtx:
57 - First determine the "shape" of the rtx, based on GET_CODE,
58 XVECLEN and XINT. This phase examines SET_SRCs before SET_DESTs
59 since SET_SRCs tend to be more distinctive. It examines other
60 operands in numerical order, since the canonicalization rules
61 prefer putting complex operands of commutative operators first.
63 - Next check modes and predicates. This phase examines all
64 operands in numerical order, even for SETs, since the mode of a
65 SET_DEST is exact while the mode of a SET_SRC can be VOIDmode
66 for constant integers.
68 - Next check match_dups.
70 - Finally check the C condition and (where appropriate) pnum_clobbers.
72 2. Try to optimize the tree by removing redundant tests, CSEing tests,
73 folding tests together, etc.
75 3. Look for common subtrees and split them out into "pattern" routines.
76 These common subtrees can be identical or they can differ in mode,
77 code, or integer (usually an UNSPEC or UNSPEC_VOLATILE code).
78 In the latter case the users of the pattern routine pass the
79 appropriate mode, etc., as argument. For example, if two patterns
80 contain:
82 (plus:SI (match_operand:SI 1 "register_operand")
83 (match_operand:SI 2 "register_operand"))
85 we can split the associated matching code out into a subroutine.
86 If a pattern contains:
88 (minus:DI (match_operand:DI 1 "register_operand")
89 (match_operand:DI 2 "register_operand"))
91 then we can consider using the same matching routine for both
92 the plus and minus expressions, passing PLUS and SImode in the
93 former case and MINUS and DImode in the latter case.
95 The main aim of this phase is to reduce the compile time of the
96 insn-recog.c code and to reduce the amount of object code in
97 insn-recog.o.
99 4. Split the matching trees into functions, trying to limit the
100 size of each function to a sensible amount.
102 Again, the main aim of this phase is to reduce the compile time
103 of insn-recog.c. (It doesn't help with the size of insn-recog.o.)
105 5. Write out C++ code for each function. */
107 #include "bconfig.h"
108 #define INCLUDE_ALGORITHM
109 #include "system.h"
110 #include "coretypes.h"
111 #include "tm.h"
112 #include "rtl.h"
113 #include "errors.h"
114 #include "read-md.h"
115 #include "gensupport.h"
117 #undef GENERATOR_FILE
118 enum true_rtx_doe {
119 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) TRUE_##ENUM,
120 #include "rtl.def"
121 #undef DEF_RTL_EXPR
122 FIRST_GENERATOR_RTX_CODE
124 #define NUM_TRUE_RTX_CODE ((int) FIRST_GENERATOR_RTX_CODE)
125 #define GENERATOR_FILE 1
127 /* Debugging variables to control which optimizations are performed.
128 Note that disabling merge_states_p leads to very large output. */
129 static const bool merge_states_p = true;
130 static const bool collapse_optional_decisions_p = true;
131 static const bool cse_tests_p = true;
132 static const bool simplify_tests_p = true;
133 static const bool use_operand_variables_p = true;
134 static const bool use_subroutines_p = true;
135 static const bool use_pattern_routines_p = true;
137 /* Whether to add comments for optional tests that we decided to keep.
138 Can be useful when debugging the generator itself but is noise when
139 debugging the generated code. */
140 static const bool mark_optional_transitions_p = false;
142 /* Whether pattern routines should calculate positions relative to their
143 rtx parameter rather than use absolute positions. This e.g. allows
144 a pattern routine to be shared between a plain SET and a PARALLEL
145 that includes a SET.
147 In principle it sounds like this should be useful, especially for
148 recog_for_combine, where the plain SET form is generated automatically
149 from a PARALLEL of a single SET and some CLOBBERs. In practice it doesn't
150 seem to help much and leads to slightly bigger object files. */
151 static const bool relative_patterns_p = false;
153 /* Whether pattern routines should be allowed to test whether pnum_clobbers
154 is null. This requires passing pnum_clobbers around as a parameter. */
155 static const bool pattern_have_num_clobbers_p = true;
157 /* Whether pattern routines should be allowed to test .md file C conditions.
158 This requires passing insn around as a parameter, in case the C
159 condition refers to it. In practice this tends to lead to bigger
160 object files. */
161 static const bool pattern_c_test_p = false;
163 /* Whether to require each parameter passed to a pattern routine to be
164 unique. Disabling this check for example allows unary operators with
165 matching modes (like NEG) and unary operators with mismatched modes
166 (like ZERO_EXTEND) to be matched by a single pattern. However, we then
167 often have cases where the same value is passed too many times. */
168 static const bool force_unique_params_p = true;
170 /* The maximum (approximate) depth of block nesting that an individual
171 routine or subroutine should have. This limit is about keeping the
172 output readable rather than reducing compile time. */
173 static const unsigned int MAX_DEPTH = 6;
175 /* The minimum number of pseudo-statements that a state must have before
176 we split it out into a subroutine. */
177 static const unsigned int MIN_NUM_STATEMENTS = 5;
179 /* The number of pseudo-statements a state can have before we consider
180 splitting out substates into subroutines. This limit is about avoiding
181 compile-time problems with very big functions (and also about keeping
182 functions within --param optimization limits, etc.). */
183 static const unsigned int MAX_NUM_STATEMENTS = 200;
185 /* The minimum number of pseudo-statements that can be used in a pattern
186 routine. */
187 static const unsigned int MIN_COMBINE_COST = 4;
189 /* The maximum number of arguments that a pattern routine can have.
190 The idea is to prevent one pattern getting a ridiculous number of
191 arguments when it would be more beneficial to have a separate pattern
192 routine instead. */
193 static const unsigned int MAX_PATTERN_PARAMS = 5;
195 /* The maximum operand number plus one. */
196 int num_operands;
198 /* Ways of obtaining an rtx to be tested. */
199 enum position_type {
200 /* PATTERN (peep2_next_insn (ARG)). */
201 POS_PEEP2_INSN,
203 /* XEXP (BASE, ARG). */
204 POS_XEXP,
206 /* XVECEXP (BASE, 0, ARG). */
207 POS_XVECEXP0
210 /* The position of an rtx relative to X0. Each useful position is
211 represented by exactly one instance of this structure. */
212 struct position
214 /* The parent rtx. This is the root position for POS_PEEP2_INSNs. */
215 struct position *base;
217 /* A position with the same BASE and TYPE, but with the next value
218 of ARG. */
219 struct position *next;
221 /* A list of all POS_XEXP positions that use this one as their base,
222 chained by NEXT fields. The first entry represents XEXP (this, 0),
223 the second represents XEXP (this, 1), and so on. */
224 struct position *xexps;
226 /* A list of POS_XVECEXP0 positions that use this one as their base,
227 chained by NEXT fields. The first entry represents XVECEXP (this, 0, 0),
228 the second represents XVECEXP (this, 0, 1), and so on. */
229 struct position *xvecexp0s;
231 /* The type of position. */
232 enum position_type type;
234 /* The argument to TYPE (shown as ARG in the position_type comments). */
235 int arg;
237 /* The instruction to which the position belongs. */
238 unsigned int insn_id;
240 /* The depth of this position relative to the instruction pattern.
241 E.g. if the instruction pattern is a SET, the SET itself has a
242 depth of 0 while the SET_DEST and SET_SRC have depths of 1. */
243 unsigned int depth;
245 /* A unique identifier for this position. */
246 unsigned int id;
249 enum routine_type {
250 SUBPATTERN, RECOG, SPLIT, PEEPHOLE2
253 /* The root position (x0). */
254 static struct position root_pos;
256 /* The number of positions created. Also one higher than the maximum
257 position id. */
258 static unsigned int num_positions = 1;
260 /* A list of all POS_PEEP2_INSNs. The entry for insn 0 is the root position,
261 since we are given that instruction's pattern as x0. */
262 static struct position *peep2_insn_pos_list = &root_pos;
264 /* Return a position with the given BASE, TYPE and ARG. NEXT_PTR
265 points to where the unique object that represents the position
266 should be stored. Create the object if it doesn't already exist,
267 otherwise reuse the object that is already there. */
269 static struct position *
270 next_position (struct position **next_ptr, struct position *base,
271 enum position_type type, int arg)
273 struct position *pos;
275 pos = *next_ptr;
276 if (!pos)
278 pos = XCNEW (struct position);
279 pos->type = type;
280 pos->arg = arg;
281 if (type == POS_PEEP2_INSN)
283 pos->base = 0;
284 pos->insn_id = arg;
285 pos->depth = base->depth;
287 else
289 pos->base = base;
290 pos->insn_id = base->insn_id;
291 pos->depth = base->depth + 1;
293 pos->id = num_positions++;
294 *next_ptr = pos;
296 return pos;
299 /* Compare positions POS1 and POS2 lexicographically. */
301 static int
302 compare_positions (struct position *pos1, struct position *pos2)
304 int diff;
306 diff = pos1->depth - pos2->depth;
307 if (diff < 0)
309 pos2 = pos2->base;
310 while (pos1->depth != pos2->depth);
311 else if (diff > 0)
313 pos1 = pos1->base;
314 while (pos1->depth != pos2->depth);
315 while (pos1 != pos2)
317 diff = (int) pos1->type - (int) pos2->type;
318 if (diff == 0)
319 diff = pos1->arg - pos2->arg;
320 pos1 = pos1->base;
321 pos2 = pos2->base;
323 return diff;
326 /* Return the most deeply-nested position that is common to both
327 POS1 and POS2. If the positions are from different instructions,
328 return the one with the lowest insn_id. */
330 static struct position *
331 common_position (struct position *pos1, struct position *pos2)
333 if (pos1->insn_id != pos2->insn_id)
334 return pos1->insn_id < pos2->insn_id ? pos1 : pos2;
335 if (pos1->depth > pos2->depth)
336 std::swap (pos1, pos2);
337 while (pos1->depth != pos2->depth)
338 pos2 = pos2->base;
339 while (pos1 != pos2)
341 pos1 = pos1->base;
342 pos2 = pos2->base;
344 return pos1;
347 /* Search for and return operand N, stop when reaching node STOP. */
349 static rtx
350 find_operand (rtx pattern, int n, rtx stop)
352 const char *fmt;
353 RTX_CODE code;
354 int i, j, len;
355 rtx r;
357 if (pattern == stop)
358 return stop;
360 code = GET_CODE (pattern);
361 if ((code == MATCH_SCRATCH
362 || code == MATCH_OPERAND
363 || code == MATCH_OPERATOR
364 || code == MATCH_PARALLEL)
365 && XINT (pattern, 0) == n)
366 return pattern;
368 fmt = GET_RTX_FORMAT (code);
369 len = GET_RTX_LENGTH (code);
370 for (i = 0; i < len; i++)
372 switch (fmt[i])
374 case 'e': case 'u':
375 if ((r = find_operand (XEXP (pattern, i), n, stop)) != NULL_RTX)
376 return r;
377 break;
379 case 'V':
380 if (! XVEC (pattern, i))
381 break;
382 /* Fall through. */
384 case 'E':
385 for (j = 0; j < XVECLEN (pattern, i); j++)
386 if ((r = find_operand (XVECEXP (pattern, i, j), n, stop))
387 != NULL_RTX)
388 return r;
389 break;
391 case 'r': case 'p': case 'i': case 'w': case '0': case 's':
392 break;
394 default:
395 gcc_unreachable ();
399 return NULL;
402 /* Search for and return operand M, such that it has a matching
403 constraint for operand N. */
405 static rtx
406 find_matching_operand (rtx pattern, int n)
408 const char *fmt;
409 RTX_CODE code;
410 int i, j, len;
411 rtx r;
413 code = GET_CODE (pattern);
414 if (code == MATCH_OPERAND
415 && (XSTR (pattern, 2)[0] == '0' + n
416 || (XSTR (pattern, 2)[0] == '%'
417 && XSTR (pattern, 2)[1] == '0' + n)))
418 return pattern;
420 fmt = GET_RTX_FORMAT (code);
421 len = GET_RTX_LENGTH (code);
422 for (i = 0; i < len; i++)
424 switch (fmt[i])
426 case 'e': case 'u':
427 if ((r = find_matching_operand (XEXP (pattern, i), n)))
428 return r;
429 break;
431 case 'V':
432 if (! XVEC (pattern, i))
433 break;
434 /* Fall through. */
436 case 'E':
437 for (j = 0; j < XVECLEN (pattern, i); j++)
438 if ((r = find_matching_operand (XVECEXP (pattern, i, j), n)))
439 return r;
440 break;
442 case 'r': case 'p': case 'i': case 'w': case '0': case 's':
443 break;
445 default:
446 gcc_unreachable ();
450 return NULL;
453 /* In DEFINE_EXPAND, DEFINE_SPLIT, and DEFINE_PEEPHOLE2, we
454 don't use the MATCH_OPERAND constraint, only the predicate.
455 This is confusing to folks doing new ports, so help them
456 not make the mistake. */
458 static bool
459 constraints_supported_in_insn_p (rtx insn)
461 return !(GET_CODE (insn) == DEFINE_EXPAND
462 || GET_CODE (insn) == DEFINE_SPLIT
463 || GET_CODE (insn) == DEFINE_PEEPHOLE2);
466 /* Return the name of the predicate matched by MATCH_RTX. */
468 static const char *
469 predicate_name (rtx match_rtx)
471 if (GET_CODE (match_rtx) == MATCH_SCRATCH)
472 return "scratch_operand";
473 else
474 return XSTR (match_rtx, 1);
477 /* Return true if OPERAND is a MATCH_OPERAND using a special predicate
478 function. */
480 static bool
481 special_predicate_operand_p (rtx operand)
483 if (GET_CODE (operand) == MATCH_OPERAND)
485 const char *pred_name = predicate_name (operand);
486 if (pred_name[0] != 0)
488 const struct pred_data *pred;
490 pred = lookup_predicate (pred_name);
491 return pred != NULL && pred->special;
495 return false;
498 /* Check for various errors in PATTERN, which is part of INFO.
499 SET is nonnull for a destination, and is the complete set pattern.
500 SET_CODE is '=' for normal sets, and '+' within a context that
501 requires in-out constraints. */
503 static void
504 validate_pattern (rtx pattern, md_rtx_info *info, rtx set, int set_code)
506 const char *fmt;
507 RTX_CODE code;
508 size_t i, len;
509 int j;
511 code = GET_CODE (pattern);
512 switch (code)
514 case MATCH_SCRATCH:
516 const char constraints0 = XSTR (pattern, 1)[0];
518 if (!constraints_supported_in_insn_p (info->def))
520 if (constraints0)
522 error_at (info->loc, "constraints not supported in %s",
523 GET_RTX_NAME (GET_CODE (info->def)));
525 return;
528 /* If a MATCH_SCRATCH is used in a context requiring an write-only
529 or read/write register, validate that. */
530 if (set_code == '='
531 && constraints0
532 && constraints0 != '='
533 && constraints0 != '+')
535 error_at (info->loc, "operand %d missing output reload",
536 XINT (pattern, 0));
538 return;
540 case MATCH_DUP:
541 case MATCH_OP_DUP:
542 case MATCH_PAR_DUP:
543 if (find_operand (info->def, XINT (pattern, 0), pattern) == pattern)
544 error_at (info->loc, "operand %i duplicated before defined",
545 XINT (pattern, 0));
546 break;
547 case MATCH_OPERAND:
548 case MATCH_OPERATOR:
550 const char *pred_name = XSTR (pattern, 1);
551 const struct pred_data *pred;
552 const char *c_test;
554 c_test = get_c_test (info->def);
556 if (pred_name[0] != 0)
558 pred = lookup_predicate (pred_name);
559 if (!pred)
560 error_at (info->loc, "unknown predicate '%s'", pred_name);
562 else
563 pred = 0;
565 if (code == MATCH_OPERAND)
567 const char *constraints = XSTR (pattern, 2);
568 const char constraints0 = constraints[0];
570 if (!constraints_supported_in_insn_p (info->def))
572 if (constraints0)
574 error_at (info->loc, "constraints not supported in %s",
575 GET_RTX_NAME (GET_CODE (info->def)));
579 /* A MATCH_OPERAND that is a SET should have an output reload. */
580 else if (set && constraints0)
582 if (set_code == '+')
584 if (constraints0 == '+')
586 /* If we've only got an output reload for this operand,
587 we'd better have a matching input operand. */
588 else if (constraints0 == '='
589 && find_matching_operand (info->def,
590 XINT (pattern, 0)))
592 else
593 error_at (info->loc, "operand %d missing in-out reload",
594 XINT (pattern, 0));
596 else if (constraints0 != '=' && constraints0 != '+')
597 error_at (info->loc, "operand %d missing output reload",
598 XINT (pattern, 0));
601 /* For matching constraint in MATCH_OPERAND, the digit must be a
602 smaller number than the number of the operand that uses it in the
603 constraint. */
604 while (1)
606 while (constraints[0]
607 && (constraints[0] == ' ' || constraints[0] == ','))
608 constraints++;
609 if (!constraints[0])
610 break;
612 if (constraints[0] >= '0' && constraints[0] <= '9')
614 int val;
616 sscanf (constraints, "%d", &val);
617 if (val >= XINT (pattern, 0))
618 error_at (info->loc, "constraint digit %d is not"
619 " smaller than operand %d",
620 val, XINT (pattern, 0));
623 while (constraints[0] && constraints[0] != ',')
624 constraints++;
628 /* Allowing non-lvalues in destinations -- particularly CONST_INT --
629 while not likely to occur at runtime, results in less efficient
630 code from insn-recog.c. */
631 if (set && pred && pred->allows_non_lvalue)
632 error_at (info->loc, "destination operand %d allows non-lvalue",
633 XINT (pattern, 0));
635 /* A modeless MATCH_OPERAND can be handy when we can check for
636 multiple modes in the c_test. In most other cases, it is a
637 mistake. Only DEFINE_INSN is eligible, since SPLIT and
638 PEEP2 can FAIL within the output pattern. Exclude special
639 predicates, which check the mode themselves. Also exclude
640 predicates that allow only constants. Exclude the SET_DEST
641 of a call instruction, as that is a common idiom. */
643 if (GET_MODE (pattern) == VOIDmode
644 && code == MATCH_OPERAND
645 && GET_CODE (info->def) == DEFINE_INSN
646 && pred
647 && !pred->special
648 && pred->allows_non_const
649 && strstr (c_test, "operands") == NULL
650 && ! (set
651 && GET_CODE (set) == SET
652 && GET_CODE (SET_SRC (set)) == CALL))
653 message_at (info->loc, "warning: operand %d missing mode?",
654 XINT (pattern, 0));
655 return;
658 case SET:
660 machine_mode dmode, smode;
661 rtx dest, src;
663 dest = SET_DEST (pattern);
664 src = SET_SRC (pattern);
666 /* STRICT_LOW_PART is a wrapper. Its argument is the real
667 destination, and it's mode should match the source. */
668 if (GET_CODE (dest) == STRICT_LOW_PART)
669 dest = XEXP (dest, 0);
671 /* Find the referent for a DUP. */
673 if (GET_CODE (dest) == MATCH_DUP
674 || GET_CODE (dest) == MATCH_OP_DUP
675 || GET_CODE (dest) == MATCH_PAR_DUP)
676 dest = find_operand (info->def, XINT (dest, 0), NULL);
678 if (GET_CODE (src) == MATCH_DUP
679 || GET_CODE (src) == MATCH_OP_DUP
680 || GET_CODE (src) == MATCH_PAR_DUP)
681 src = find_operand (info->def, XINT (src, 0), NULL);
683 dmode = GET_MODE (dest);
684 smode = GET_MODE (src);
686 /* Mode checking is not performed for special predicates. */
687 if (special_predicate_operand_p (src)
688 || special_predicate_operand_p (dest))
691 /* The operands of a SET must have the same mode unless one
692 is VOIDmode. */
693 else if (dmode != VOIDmode && smode != VOIDmode && dmode != smode)
694 error_at (info->loc, "mode mismatch in set: %smode vs %smode",
695 GET_MODE_NAME (dmode), GET_MODE_NAME (smode));
697 /* If only one of the operands is VOIDmode, and PC or CC0 is
698 not involved, it's probably a mistake. */
699 else if (dmode != smode
700 && GET_CODE (dest) != PC
701 && GET_CODE (dest) != CC0
702 && GET_CODE (src) != PC
703 && GET_CODE (src) != CC0
704 && !CONST_INT_P (src)
705 && !CONST_WIDE_INT_P (src)
706 && GET_CODE (src) != CALL)
708 const char *which;
709 which = (dmode == VOIDmode ? "destination" : "source");
710 message_at (info->loc, "warning: %s missing a mode?", which);
713 if (dest != SET_DEST (pattern))
714 validate_pattern (dest, info, pattern, '=');
715 validate_pattern (SET_DEST (pattern), info, pattern, '=');
716 validate_pattern (SET_SRC (pattern), info, NULL_RTX, 0);
717 return;
720 case CLOBBER:
721 validate_pattern (SET_DEST (pattern), info, pattern, '=');
722 return;
724 case ZERO_EXTRACT:
725 validate_pattern (XEXP (pattern, 0), info, set, set ? '+' : 0);
726 validate_pattern (XEXP (pattern, 1), info, NULL_RTX, 0);
727 validate_pattern (XEXP (pattern, 2), info, NULL_RTX, 0);
728 return;
730 case STRICT_LOW_PART:
731 validate_pattern (XEXP (pattern, 0), info, set, set ? '+' : 0);
732 return;
734 case LABEL_REF:
735 if (GET_MODE (XEXP (pattern, 0)) != VOIDmode)
736 error_at (info->loc, "operand to label_ref %smode not VOIDmode",
737 GET_MODE_NAME (GET_MODE (XEXP (pattern, 0))));
738 break;
740 case VEC_SELECT:
741 if (GET_MODE (pattern) != VOIDmode)
743 machine_mode mode = GET_MODE (pattern);
744 machine_mode imode = GET_MODE (XEXP (pattern, 0));
745 machine_mode emode
746 = VECTOR_MODE_P (mode) ? GET_MODE_INNER (mode) : mode;
747 if (GET_CODE (XEXP (pattern, 1)) == PARALLEL)
749 int expected = VECTOR_MODE_P (mode) ? GET_MODE_NUNITS (mode) : 1;
750 if (XVECLEN (XEXP (pattern, 1), 0) != expected)
751 error_at (info->loc,
752 "vec_select parallel with %d elements, expected %d",
753 XVECLEN (XEXP (pattern, 1), 0), expected);
754 else if (VECTOR_MODE_P (imode))
756 unsigned int nelems = GET_MODE_NUNITS (imode);
757 int i;
758 for (i = 0; i < expected; ++i)
759 if (CONST_INT_P (XVECEXP (XEXP (pattern, 1), 0, i))
760 && (UINTVAL (XVECEXP (XEXP (pattern, 1), 0, i))
761 >= nelems))
762 error_at (info->loc,
763 "out of bounds selector %u in vec_select, "
764 "expected at most %u",
765 (unsigned)
766 UINTVAL (XVECEXP (XEXP (pattern, 1), 0, i)),
767 nelems - 1);
770 if (imode != VOIDmode && !VECTOR_MODE_P (imode))
771 error_at (info->loc, "%smode of first vec_select operand is not a "
772 "vector mode", GET_MODE_NAME (imode));
773 else if (imode != VOIDmode && GET_MODE_INNER (imode) != emode)
774 error_at (info->loc, "element mode mismatch between vec_select "
775 "%smode and its operand %smode",
776 GET_MODE_NAME (emode),
777 GET_MODE_NAME (GET_MODE_INNER (imode)));
779 break;
781 default:
782 break;
785 fmt = GET_RTX_FORMAT (code);
786 len = GET_RTX_LENGTH (code);
787 for (i = 0; i < len; i++)
789 switch (fmt[i])
791 case 'e': case 'u':
792 validate_pattern (XEXP (pattern, i), info, NULL_RTX, 0);
793 break;
795 case 'E':
796 for (j = 0; j < XVECLEN (pattern, i); j++)
797 validate_pattern (XVECEXP (pattern, i, j), info, NULL_RTX, 0);
798 break;
800 case 'r': case 'p': case 'i': case 'w': case '0': case 's':
801 break;
803 default:
804 gcc_unreachable ();
809 /* Simple list structure for items of type T, for use when being part
810 of a list is an inherent property of T. T must have members equivalent
811 to "T *prev, *next;" and a function "void set_parent (list_head <T> *)"
812 to set the parent list. */
813 template <typename T>
814 struct list_head
816 /* A range of linked items. */
817 struct range
819 range (T *);
820 range (T *, T *);
822 T *start, *end;
823 void set_parent (list_head *);
826 list_head ();
827 range release ();
828 void push_back (range);
829 range remove (range);
830 void replace (range, range);
831 T *singleton () const;
833 T *first, *last;
836 /* Create a range [START_IN, START_IN]. */
838 template <typename T>
839 list_head <T>::range::range (T *start_in) : start (start_in), end (start_in) {}
841 /* Create a range [START_IN, END_IN], linked by next and prev fields. */
843 template <typename T>
844 list_head <T>::range::range (T *start_in, T *end_in)
845 : start (start_in), end (end_in) {}
847 template <typename T>
848 void
849 list_head <T>::range::set_parent (list_head <T> *owner)
851 for (T *item = start; item != end; item = item->next)
852 item->set_parent (owner);
853 end->set_parent (owner);
856 template <typename T>
857 list_head <T>::list_head () : first (0), last (0) {}
859 /* Add R to the end of the list. */
861 template <typename T>
862 void
863 list_head <T>::push_back (range r)
865 if (last)
866 last->next = r.start;
867 else
868 first = r.start;
869 r.start->prev = last;
870 last = r.end;
871 r.set_parent (this);
874 /* Remove R from the list. R remains valid and can be inserted into
875 other lists. */
877 template <typename T>
878 typename list_head <T>::range
879 list_head <T>::remove (range r)
881 if (r.start->prev)
882 r.start->prev->next = r.end->next;
883 else
884 first = r.end->next;
885 if (r.end->next)
886 r.end->next->prev = r.start->prev;
887 else
888 last = r.start->prev;
889 r.start->prev = 0;
890 r.end->next = 0;
891 r.set_parent (0);
892 return r;
895 /* Replace OLDR with NEWR. OLDR remains valid and can be inserted into
896 other lists. */
898 template <typename T>
899 void
900 list_head <T>::replace (range oldr, range newr)
902 newr.start->prev = oldr.start->prev;
903 newr.end->next = oldr.end->next;
905 oldr.start->prev = 0;
906 oldr.end->next = 0;
907 oldr.set_parent (0);
909 if (newr.start->prev)
910 newr.start->prev->next = newr.start;
911 else
912 first = newr.start;
913 if (newr.end->next)
914 newr.end->next->prev = newr.end;
915 else
916 last = newr.end;
917 newr.set_parent (this);
920 /* Empty the list and return the previous contents as a range that can
921 be inserted into other lists. */
923 template <typename T>
924 typename list_head <T>::range
925 list_head <T>::release ()
927 range r (first, last);
928 first = 0;
929 last = 0;
930 r.set_parent (0);
931 return r;
934 /* If the list contains a single item, return that item, otherwise return
935 null. */
937 template <typename T>
939 list_head <T>::singleton () const
941 return first == last ? first : 0;
944 struct state;
946 /* Describes a possible successful return from a routine. */
947 struct acceptance_type
949 /* The type of routine we're returning from. */
950 routine_type type : 16;
952 /* True if this structure only really represents a partial match,
953 and if we must call a subroutine of type TYPE to complete the match.
954 In this case we'll call the subroutine and, if it succeeds, return
955 whatever the subroutine returned.
957 False if this structure presents a full match. */
958 unsigned int partial_p : 1;
960 union
962 /* If PARTIAL_P, this is the number of the subroutine to call. */
963 int subroutine_id;
965 /* Valid if !PARTIAL_P. */
966 struct
968 /* The identifier of the matching pattern. For SUBPATTERNs this
969 value belongs to an ad-hoc routine-specific enum. For the
970 others it's the number of an .md file pattern. */
971 int code;
972 union
974 /* For RECOG, the number of clobbers that must be added to the
975 pattern in order for it to match CODE. */
976 int num_clobbers;
978 /* For PEEPHOLE2, the number of additional instructions that were
979 included in the optimization. */
980 int match_len;
981 } u;
982 } full;
983 } u;
986 bool
987 operator == (const acceptance_type &a, const acceptance_type &b)
989 if (a.partial_p != b.partial_p)
990 return false;
991 if (a.partial_p)
992 return a.u.subroutine_id == b.u.subroutine_id;
993 else
994 return a.u.full.code == b.u.full.code;
997 bool
998 operator != (const acceptance_type &a, const acceptance_type &b)
1000 return !operator == (a, b);
1003 /* Represents a parameter to a pattern routine. */
1004 struct parameter
1006 /* The C type of parameter. */
1007 enum type_enum {
1008 /* Represents an invalid parameter. */
1009 UNSET,
1011 /* A machine_mode parameter. */
1012 MODE,
1014 /* An rtx_code parameter. */
1015 CODE,
1017 /* An int parameter. */
1018 INT,
1020 /* An unsigned int parameter. */
1021 UINT,
1023 /* A HOST_WIDE_INT parameter. */
1024 WIDE_INT
1027 parameter ();
1028 parameter (type_enum, bool, uint64_t);
1030 /* The type of the parameter. */
1031 type_enum type;
1033 /* True if the value passed is variable, false if it is constant. */
1034 bool is_param;
1036 /* If IS_PARAM, this is the number of the variable passed, for an "i%d"
1037 format string. If !IS_PARAM, this is the constant value passed. */
1038 uint64_t value;
1041 parameter::parameter ()
1042 : type (UNSET), is_param (false), value (0) {}
1044 parameter::parameter (type_enum type_in, bool is_param_in, uint64_t value_in)
1045 : type (type_in), is_param (is_param_in), value (value_in) {}
1047 bool
1048 operator == (const parameter &param1, const parameter &param2)
1050 return (param1.type == param2.type
1051 && param1.is_param == param2.is_param
1052 && param1.value == param2.value);
1055 bool
1056 operator != (const parameter &param1, const parameter &param2)
1058 return !operator == (param1, param2);
1061 /* Represents a routine that matches a partial rtx pattern, returning
1062 an ad-hoc enum value on success and -1 on failure. The routine can
1063 be used by any subroutine type. The match can be parameterized by
1064 things like mode, code and UNSPEC number. */
1065 struct pattern_routine
1067 /* The state that implements the pattern. */
1068 state *s;
1070 /* The deepest root position from which S can access all the rtxes it needs.
1071 This is NULL if the pattern doesn't need an rtx input, usually because
1072 all matching is done on operands[] instead. */
1073 position *pos;
1075 /* A unique identifier for the routine. */
1076 unsigned int pattern_id;
1078 /* True if the routine takes pnum_clobbers as argument. */
1079 bool pnum_clobbers_p;
1081 /* True if the routine takes the enclosing instruction as argument. */
1082 bool insn_p;
1084 /* The types of the other parameters to the routine, if any. */
1085 auto_vec <parameter::type_enum, MAX_PATTERN_PARAMS> param_types;
1088 /* All defined patterns. */
1089 static vec <pattern_routine *> patterns;
1091 /* Represents one use of a pattern routine. */
1092 struct pattern_use
1094 /* The pattern routine to use. */
1095 pattern_routine *routine;
1097 /* The values to pass as parameters. This vector has the same length
1098 as ROUTINE->PARAM_TYPES. */
1099 auto_vec <parameter, MAX_PATTERN_PARAMS> params;
1102 /* Represents a test performed by a decision. */
1103 struct rtx_test
1105 rtx_test ();
1107 /* The types of test that can be performed. Most of them take as input
1108 an rtx X. Some also take as input a transition label LABEL; the others
1109 are booleans for which the transition label is always "true".
1111 The order of the enum isn't important. */
1112 enum kind_enum {
1113 /* Check GET_CODE (X) == LABEL. */
1114 CODE,
1116 /* Check GET_MODE (X) == LABEL. */
1117 MODE,
1119 /* Check REGNO (X) == LABEL. */
1120 REGNO_FIELD,
1122 /* Check known_eq (SUBREG_BYTE (X), LABEL). */
1123 SUBREG_FIELD,
1125 /* Check XINT (X, u.opno) == LABEL. */
1126 INT_FIELD,
1128 /* Check XWINT (X, u.opno) == LABEL. */
1129 WIDE_INT_FIELD,
1131 /* Check XVECLEN (X, 0) == LABEL. */
1132 VECLEN,
1134 /* Check peep2_current_count >= u.min_len. */
1135 PEEP2_COUNT,
1137 /* Check XVECLEN (X, 0) >= u.min_len. */
1138 VECLEN_GE,
1140 /* Check whether X is a cached const_int with value u.integer. */
1141 SAVED_CONST_INT,
1143 /* Check u.predicate.data (X, u.predicate.mode). */
1144 PREDICATE,
1146 /* Check rtx_equal_p (X, operands[u.opno]). */
1147 DUPLICATE,
1149 /* Check whether X matches pattern u.pattern. */
1150 PATTERN,
1152 /* Check whether pnum_clobbers is nonnull (RECOG only). */
1153 HAVE_NUM_CLOBBERS,
1155 /* Check whether general C test u.string holds. In general the condition
1156 needs access to "insn" and the full operand list. */
1157 C_TEST,
1159 /* Execute operands[u.opno] = X. (Always succeeds.) */
1160 SET_OP,
1162 /* Accept u.acceptance. Always succeeds for SUBPATTERN, RECOG and SPLIT.
1163 May fail for PEEPHOLE2 if the define_peephole2 C code executes FAIL. */
1164 ACCEPT
1167 /* The position of rtx X in the above description, relative to the
1168 incoming instruction "insn". The position is null if the test
1169 doesn't take an X as input. */
1170 position *pos;
1172 /* Which element of operands[] already contains POS, or -1 if no element
1173 is known to hold POS. */
1174 int pos_operand;
1176 /* The type of test and its parameters, as described above. */
1177 kind_enum kind;
1178 union
1180 int opno;
1181 int min_len;
1182 struct
1184 bool is_param;
1185 int value;
1186 } integer;
1187 struct
1189 const struct pred_data *data;
1190 /* True if the mode is taken from a machine_mode parameter
1191 to the routine rather than a constant machine_mode. If true,
1192 MODE is the number of the parameter (for an "i%d" format string),
1193 otherwise it is the mode itself. */
1194 bool mode_is_param;
1195 unsigned int mode;
1196 } predicate;
1197 pattern_use *pattern;
1198 const char *string;
1199 acceptance_type acceptance;
1200 } u;
1202 static rtx_test code (position *);
1203 static rtx_test mode (position *);
1204 static rtx_test regno_field (position *);
1205 static rtx_test subreg_field (position *);
1206 static rtx_test int_field (position *, int);
1207 static rtx_test wide_int_field (position *, int);
1208 static rtx_test veclen (position *);
1209 static rtx_test peep2_count (int);
1210 static rtx_test veclen_ge (position *, int);
1211 static rtx_test predicate (position *, const pred_data *, machine_mode);
1212 static rtx_test duplicate (position *, int);
1213 static rtx_test pattern (position *, pattern_use *);
1214 static rtx_test have_num_clobbers ();
1215 static rtx_test c_test (const char *);
1216 static rtx_test set_op (position *, int);
1217 static rtx_test accept (const acceptance_type &);
1219 bool terminal_p () const;
1220 bool single_outcome_p () const;
1222 private:
1223 rtx_test (position *, kind_enum);
1226 rtx_test::rtx_test () {}
1228 rtx_test::rtx_test (position *pos_in, kind_enum kind_in)
1229 : pos (pos_in), pos_operand (-1), kind (kind_in) {}
1231 rtx_test
1232 rtx_test::code (position *pos)
1234 return rtx_test (pos, rtx_test::CODE);
1237 rtx_test
1238 rtx_test::mode (position *pos)
1240 return rtx_test (pos, rtx_test::MODE);
1243 rtx_test
1244 rtx_test::regno_field (position *pos)
1246 rtx_test res (pos, rtx_test::REGNO_FIELD);
1247 return res;
1250 rtx_test
1251 rtx_test::subreg_field (position *pos)
1253 rtx_test res (pos, rtx_test::SUBREG_FIELD);
1254 return res;
1257 rtx_test
1258 rtx_test::int_field (position *pos, int opno)
1260 rtx_test res (pos, rtx_test::INT_FIELD);
1261 res.u.opno = opno;
1262 return res;
1265 rtx_test
1266 rtx_test::wide_int_field (position *pos, int opno)
1268 rtx_test res (pos, rtx_test::WIDE_INT_FIELD);
1269 res.u.opno = opno;
1270 return res;
1273 rtx_test
1274 rtx_test::veclen (position *pos)
1276 return rtx_test (pos, rtx_test::VECLEN);
1279 rtx_test
1280 rtx_test::peep2_count (int min_len)
1282 rtx_test res (0, rtx_test::PEEP2_COUNT);
1283 res.u.min_len = min_len;
1284 return res;
1287 rtx_test
1288 rtx_test::veclen_ge (position *pos, int min_len)
1290 rtx_test res (pos, rtx_test::VECLEN_GE);
1291 res.u.min_len = min_len;
1292 return res;
1295 rtx_test
1296 rtx_test::predicate (position *pos, const struct pred_data *data,
1297 machine_mode mode)
1299 rtx_test res (pos, rtx_test::PREDICATE);
1300 res.u.predicate.data = data;
1301 res.u.predicate.mode_is_param = false;
1302 res.u.predicate.mode = mode;
1303 return res;
1306 rtx_test
1307 rtx_test::duplicate (position *pos, int opno)
1309 rtx_test res (pos, rtx_test::DUPLICATE);
1310 res.u.opno = opno;
1311 return res;
1314 rtx_test
1315 rtx_test::pattern (position *pos, pattern_use *pattern)
1317 rtx_test res (pos, rtx_test::PATTERN);
1318 res.u.pattern = pattern;
1319 return res;
1322 rtx_test
1323 rtx_test::have_num_clobbers ()
1325 return rtx_test (0, rtx_test::HAVE_NUM_CLOBBERS);
1328 rtx_test
1329 rtx_test::c_test (const char *string)
1331 rtx_test res (0, rtx_test::C_TEST);
1332 res.u.string = string;
1333 return res;
1336 rtx_test
1337 rtx_test::set_op (position *pos, int opno)
1339 rtx_test res (pos, rtx_test::SET_OP);
1340 res.u.opno = opno;
1341 return res;
1344 rtx_test
1345 rtx_test::accept (const acceptance_type &acceptance)
1347 rtx_test res (0, rtx_test::ACCEPT);
1348 res.u.acceptance = acceptance;
1349 return res;
1352 /* Return true if the test represents an unconditionally successful match. */
1354 bool
1355 rtx_test::terminal_p () const
1357 return kind == rtx_test::ACCEPT && u.acceptance.type != PEEPHOLE2;
1360 /* Return true if the test is a boolean that is always true. */
1362 bool
1363 rtx_test::single_outcome_p () const
1365 return terminal_p () || kind == rtx_test::SET_OP;
1368 bool
1369 operator == (const rtx_test &a, const rtx_test &b)
1371 if (a.pos != b.pos || a.kind != b.kind)
1372 return false;
1373 switch (a.kind)
1375 case rtx_test::CODE:
1376 case rtx_test::MODE:
1377 case rtx_test::REGNO_FIELD:
1378 case rtx_test::SUBREG_FIELD:
1379 case rtx_test::VECLEN:
1380 case rtx_test::HAVE_NUM_CLOBBERS:
1381 return true;
1383 case rtx_test::PEEP2_COUNT:
1384 case rtx_test::VECLEN_GE:
1385 return a.u.min_len == b.u.min_len;
1387 case rtx_test::INT_FIELD:
1388 case rtx_test::WIDE_INT_FIELD:
1389 case rtx_test::DUPLICATE:
1390 case rtx_test::SET_OP:
1391 return a.u.opno == b.u.opno;
1393 case rtx_test::SAVED_CONST_INT:
1394 return (a.u.integer.is_param == b.u.integer.is_param
1395 && a.u.integer.value == b.u.integer.value);
1397 case rtx_test::PREDICATE:
1398 return (a.u.predicate.data == b.u.predicate.data
1399 && a.u.predicate.mode_is_param == b.u.predicate.mode_is_param
1400 && a.u.predicate.mode == b.u.predicate.mode);
1402 case rtx_test::PATTERN:
1403 return (a.u.pattern->routine == b.u.pattern->routine
1404 && a.u.pattern->params == b.u.pattern->params);
1406 case rtx_test::C_TEST:
1407 return strcmp (a.u.string, b.u.string) == 0;
1409 case rtx_test::ACCEPT:
1410 return a.u.acceptance == b.u.acceptance;
1412 gcc_unreachable ();
1415 bool
1416 operator != (const rtx_test &a, const rtx_test &b)
1418 return !operator == (a, b);
1421 /* A simple set of transition labels. Most transitions have a singleton
1422 label, so try to make that case as efficient as possible. */
1423 struct int_set : public auto_vec <uint64_t, 1>
1425 typedef uint64_t *iterator;
1427 int_set ();
1428 int_set (uint64_t);
1429 int_set (const int_set &);
1431 int_set &operator = (const int_set &);
1433 iterator begin ();
1434 iterator end ();
1437 int_set::int_set () : auto_vec<uint64_t, 1> () {}
1439 int_set::int_set (uint64_t label) :
1440 auto_vec<uint64_t, 1> ()
1442 safe_push (label);
1445 int_set::int_set (const int_set &other) :
1446 auto_vec<uint64_t, 1> ()
1448 safe_splice (other);
1451 int_set &
1452 int_set::operator = (const int_set &other)
1454 truncate (0);
1455 safe_splice (other);
1456 return *this;
1459 int_set::iterator
1460 int_set::begin ()
1462 return address ();
1465 int_set::iterator
1466 int_set::end ()
1468 return address () + length ();
1471 bool
1472 operator == (const int_set &a, const int_set &b)
1474 if (a.length () != b.length ())
1475 return false;
1476 for (unsigned int i = 0; i < a.length (); ++i)
1477 if (a[i] != b[i])
1478 return false;
1479 return true;
1482 bool
1483 operator != (const int_set &a, const int_set &b)
1485 return !operator == (a, b);
1488 struct decision;
1490 /* Represents a transition between states, dependent on the result of
1491 a test T. */
1492 struct transition
1494 transition (const int_set &, state *, bool);
1496 void set_parent (list_head <transition> *);
1498 /* Links to other transitions for T. Always null for boolean tests. */
1499 transition *prev, *next;
1501 /* The transition should be taken when T has one of these values.
1502 E.g. for rtx_test::CODE this is a set of codes, while for booleans like
1503 rtx_test::PREDICATE it is always a singleton "true". The labels are
1504 sorted in ascending order. */
1505 int_set labels;
1507 /* The source decision. */
1508 decision *from;
1510 /* The target state. */
1511 state *to;
1513 /* True if TO would function correctly even if TEST wasn't performed.
1514 E.g. it isn't necessary to check whether GET_MODE (x1) is SImode
1515 before calling register_operand (x1, SImode), since register_operand
1516 performs its own mode check. However, checking GET_MODE can be a cheap
1517 way of disambiguating SImode and DImode register operands. */
1518 bool optional;
1520 /* True if LABELS contains parameter numbers rather than constants.
1521 E.g. if this is true for a rtx_test::CODE, the label is the number
1522 of an rtx_code parameter rather than an rtx_code itself.
1523 LABELS is always a singleton when this variable is true. */
1524 bool is_param;
1527 /* Represents a test and the action that should be taken on the result.
1528 If a transition exists for the test outcome, the machine switches
1529 to the transition's target state. If no suitable transition exists,
1530 the machine either falls through to the next decision or, if there are no
1531 more decisions to try, fails the match. */
1532 struct decision : list_head <transition>
1534 decision (const rtx_test &);
1536 void set_parent (list_head <decision> *s);
1537 bool if_statement_p (uint64_t * = 0) const;
1539 /* The state to which this decision belongs. */
1540 state *s;
1542 /* Links to other decisions in the same state. */
1543 decision *prev, *next;
1545 /* The test to perform. */
1546 rtx_test test;
1549 /* Represents one machine state. For each state the machine tries a list
1550 of decisions, in order, and acts on the first match. It fails without
1551 further backtracking if no decisions match. */
1552 struct state : list_head <decision>
1554 void set_parent (list_head <state> *) {}
1557 transition::transition (const int_set &labels_in, state *to_in,
1558 bool optional_in)
1559 : prev (0), next (0), labels (labels_in), from (0), to (to_in),
1560 optional (optional_in), is_param (false) {}
1562 /* Set the source decision of the transition. */
1564 void
1565 transition::set_parent (list_head <transition> *from_in)
1567 from = static_cast <decision *> (from_in);
1570 decision::decision (const rtx_test &test_in)
1571 : prev (0), next (0), test (test_in) {}
1573 /* Set the state to which this decision belongs. */
1575 void
1576 decision::set_parent (list_head <decision> *s_in)
1578 s = static_cast <state *> (s_in);
1581 /* Return true if the decision has a single transition with a single label.
1582 If so, return the label in *LABEL if nonnull. */
1584 inline bool
1585 decision::if_statement_p (uint64_t *label) const
1587 if (singleton () && first->labels.length () == 1)
1589 if (label)
1590 *label = first->labels[0];
1591 return true;
1593 return false;
1596 /* Add to FROM a decision that performs TEST and has a single transition
1597 TRANS. */
1599 static void
1600 add_decision (state *from, const rtx_test &test, transition *trans)
1602 decision *d = new decision (test);
1603 from->push_back (d);
1604 d->push_back (trans);
1607 /* Add a transition from FROM to a new, empty state that is taken
1608 when TEST == LABELS. OPTIONAL says whether the new transition
1609 should be optional. Return the new state. */
1611 static state *
1612 add_decision (state *from, const rtx_test &test, int_set labels, bool optional)
1614 state *to = new state;
1615 add_decision (from, test, new transition (labels, to, optional));
1616 return to;
1619 /* Insert a decision before decisions R to make them dependent on
1620 TEST == LABELS. OPTIONAL says whether the new transition should be
1621 optional. */
1623 static decision *
1624 insert_decision_before (state::range r, const rtx_test &test,
1625 const int_set &labels, bool optional)
1627 decision *newd = new decision (test);
1628 state *news = new state;
1629 newd->push_back (new transition (labels, news, optional));
1630 r.start->s->replace (r, newd);
1631 news->push_back (r);
1632 return newd;
1635 /* Remove any optional transitions from S that turned out not to be useful. */
1637 static void
1638 collapse_optional_decisions (state *s)
1640 decision *d = s->first;
1641 while (d)
1643 decision *next = d->next;
1644 for (transition *trans = d->first; trans; trans = trans->next)
1645 collapse_optional_decisions (trans->to);
1646 /* A decision with a single optional transition doesn't help
1647 partition the potential matches and so is unlikely to be
1648 worthwhile. In particular, if the decision that performs the
1649 test is the last in the state, the best it could do is reject
1650 an invalid pattern slightly earlier. If instead the decision
1651 is not the last in the state, the condition it tests could hold
1652 even for the later decisions in the state. The best it can do
1653 is save work in some cases where only the later decisions can
1654 succeed.
1656 In both cases the optional transition would add extra work to
1657 successful matches when the tested condition holds. */
1658 if (transition *trans = d->singleton ())
1659 if (trans->optional)
1660 s->replace (d, trans->to->release ());
1661 d = next;
1665 /* Try to squash several separate tests into simpler ones. */
1667 static void
1668 simplify_tests (state *s)
1670 for (decision *d = s->first; d; d = d->next)
1672 uint64_t label;
1673 /* Convert checks for GET_CODE (x) == CONST_INT and XWINT (x, 0) == N
1674 into checks for const_int_rtx[N'], if N is suitably small. */
1675 if (d->test.kind == rtx_test::CODE
1676 && d->if_statement_p (&label)
1677 && label == CONST_INT)
1678 if (decision *second = d->first->to->singleton ())
1679 if (d->test.pos == second->test.pos
1680 && second->test.kind == rtx_test::WIDE_INT_FIELD
1681 && second->test.u.opno == 0
1682 && second->if_statement_p (&label)
1683 && IN_RANGE (int64_t (label),
1684 -MAX_SAVED_CONST_INT, MAX_SAVED_CONST_INT))
1686 d->test.kind = rtx_test::SAVED_CONST_INT;
1687 d->test.u.integer.is_param = false;
1688 d->test.u.integer.value = label;
1689 d->replace (d->first, second->release ());
1690 d->first->labels[0] = true;
1692 /* If we have a CODE test followed by a PREDICATE test, rely on
1693 the predicate to test the code.
1695 This case exists for match_operators. We initially treat the
1696 CODE test for a match_operator as non-optional so that we can
1697 safely move down to its operands. It may turn out that all
1698 paths that reach that code test require the same predicate
1699 to be true. cse_tests will then put the predicate test in
1700 series with the code test. */
1701 if (d->test.kind == rtx_test::CODE)
1702 if (transition *trans = d->singleton ())
1704 state *s = trans->to;
1705 while (decision *d2 = s->singleton ())
1707 if (d->test.pos != d2->test.pos)
1708 break;
1709 transition *trans2 = d2->singleton ();
1710 if (!trans2)
1711 break;
1712 if (d2->test.kind == rtx_test::PREDICATE)
1714 d->test = d2->test;
1715 trans->labels = int_set (true);
1716 s->replace (d2, trans2->to->release ());
1717 break;
1719 s = trans2->to;
1722 for (transition *trans = d->first; trans; trans = trans->next)
1723 simplify_tests (trans->to);
1727 /* Return true if all successful returns passing through D require the
1728 condition tested by COMMON to be true.
1730 When returning true, add all transitions like COMMON in D to WHERE.
1731 WHERE may contain a partial result on failure. */
1733 static bool
1734 common_test_p (decision *d, transition *common, vec <transition *> *where)
1736 if (d->test.kind == rtx_test::ACCEPT)
1737 /* We found a successful return that didn't require COMMON. */
1738 return false;
1739 if (d->test == common->from->test)
1741 transition *trans = d->singleton ();
1742 if (!trans
1743 || trans->optional != common->optional
1744 || trans->labels != common->labels)
1745 return false;
1746 where->safe_push (trans);
1747 return true;
1749 for (transition *trans = d->first; trans; trans = trans->next)
1750 for (decision *subd = trans->to->first; subd; subd = subd->next)
1751 if (!common_test_p (subd, common, where))
1752 return false;
1753 return true;
1756 /* Indicates that we have tested GET_CODE (X) for a particular rtx X. */
1757 const unsigned char TESTED_CODE = 1;
1759 /* Indicates that we have tested XVECLEN (X, 0) for a particular rtx X. */
1760 const unsigned char TESTED_VECLEN = 2;
1762 /* Represents a set of conditions that are known to hold. */
1763 struct known_conditions
1765 /* A mask of TESTED_ values for each position, indexed by the position's
1766 id field. */
1767 auto_vec <unsigned char> position_tests;
1769 /* Index N says whether operands[N] has been set. */
1770 auto_vec <bool> set_operands;
1772 /* A guranteed lower bound on the value of peep2_current_count. */
1773 int peep2_count;
1776 /* Return true if TEST can safely be performed at D, where
1777 the conditions in KC hold. TEST is known to occur along the
1778 first path from D (i.e. always following the first transition
1779 of the first decision). Any intervening tests can be used as
1780 negative proof that hoisting isn't safe, but only KC can be used
1781 as positive proof. */
1783 static bool
1784 safe_to_hoist_p (decision *d, const rtx_test &test, known_conditions *kc)
1786 switch (test.kind)
1788 case rtx_test::C_TEST:
1789 /* In general, C tests require everything else to have been
1790 verified and all operands to have been set up. */
1791 return false;
1793 case rtx_test::ACCEPT:
1794 /* Don't accept something before all conditions have been tested. */
1795 return false;
1797 case rtx_test::PREDICATE:
1798 /* Don't move a predicate over a test for VECLEN_GE, since the
1799 predicate used in a match_parallel can legitimately expect the
1800 length to be checked first. */
1801 for (decision *subd = d;
1802 subd->test != test;
1803 subd = subd->first->to->first)
1804 if (subd->test.pos == test.pos
1805 && subd->test.kind == rtx_test::VECLEN_GE)
1806 return false;
1807 goto any_rtx;
1809 case rtx_test::DUPLICATE:
1810 /* Don't test for a match_dup until the associated operand has
1811 been set. */
1812 if (!kc->set_operands[test.u.opno])
1813 return false;
1814 goto any_rtx;
1816 case rtx_test::CODE:
1817 case rtx_test::MODE:
1818 case rtx_test::SAVED_CONST_INT:
1819 case rtx_test::SET_OP:
1820 any_rtx:
1821 /* Check whether it is safe to access the rtx under test. */
1822 switch (test.pos->type)
1824 case POS_PEEP2_INSN:
1825 return test.pos->arg < kc->peep2_count;
1827 case POS_XEXP:
1828 return kc->position_tests[test.pos->base->id] & TESTED_CODE;
1830 case POS_XVECEXP0:
1831 return kc->position_tests[test.pos->base->id] & TESTED_VECLEN;
1833 gcc_unreachable ();
1835 case rtx_test::REGNO_FIELD:
1836 case rtx_test::SUBREG_FIELD:
1837 case rtx_test::INT_FIELD:
1838 case rtx_test::WIDE_INT_FIELD:
1839 case rtx_test::VECLEN:
1840 case rtx_test::VECLEN_GE:
1841 /* These tests access a specific part of an rtx, so are only safe
1842 once we know what the rtx is. */
1843 return kc->position_tests[test.pos->id] & TESTED_CODE;
1845 case rtx_test::PEEP2_COUNT:
1846 case rtx_test::HAVE_NUM_CLOBBERS:
1847 /* These tests can be performed anywhere. */
1848 return true;
1850 case rtx_test::PATTERN:
1851 gcc_unreachable ();
1853 gcc_unreachable ();
1856 /* Look for a transition that is taken by all successful returns from a range
1857 of decisions starting at OUTER and that would be better performed by
1858 OUTER's state instead. On success, store all instances of that transition
1859 in WHERE and return the last decision in the range. The range could
1860 just be OUTER, or it could include later decisions as well.
1862 WITH_POSITION_P is true if only tests with position POS should be tried,
1863 false if any test should be tried. WORTHWHILE_SINGLE_P is true if the
1864 result is useful even when the range contains just a single decision
1865 with a single transition. KC are the conditions that are known to
1866 hold at OUTER. */
1868 static decision *
1869 find_common_test (decision *outer, bool with_position_p,
1870 position *pos, bool worthwhile_single_p,
1871 known_conditions *kc, vec <transition *> *where)
1873 /* After this, WORTHWHILE_SINGLE_P indicates whether a range that contains
1874 just a single decision is useful, regardless of the number of
1875 transitions it has. */
1876 if (!outer->singleton ())
1877 worthwhile_single_p = true;
1878 /* Quick exit if we don't have enough decisions to form a worthwhile
1879 range. */
1880 if (!worthwhile_single_p && !outer->next)
1881 return 0;
1882 /* Follow the first chain down, as one example of a path that needs
1883 to contain the common test. */
1884 for (decision *d = outer; d; d = d->first->to->first)
1886 transition *trans = d->singleton ();
1887 if (trans
1888 && (!with_position_p || d->test.pos == pos)
1889 && safe_to_hoist_p (outer, d->test, kc))
1891 if (common_test_p (outer, trans, where))
1893 if (!outer->next)
1894 /* We checked above whether the move is worthwhile. */
1895 return outer;
1896 /* See how many decisions in OUTER's chain could reuse
1897 the same test. */
1898 decision *outer_end = outer;
1901 unsigned int length = where->length ();
1902 if (!common_test_p (outer_end->next, trans, where))
1904 where->truncate (length);
1905 break;
1907 outer_end = outer_end->next;
1909 while (outer_end->next);
1910 /* It is worth moving TRANS if it can be shared by more than
1911 one decision. */
1912 if (outer_end != outer || worthwhile_single_p)
1913 return outer_end;
1915 where->truncate (0);
1918 return 0;
1921 /* Try to promote common subtests in S to a single, shared decision.
1922 Also try to bunch tests for the same position together. POS is the
1923 position of the rtx tested before reaching S. KC are the conditions
1924 that are known to hold on entry to S. */
1926 static void
1927 cse_tests (position *pos, state *s, known_conditions *kc)
1929 for (decision *d = s->first; d; d = d->next)
1931 auto_vec <transition *, 16> where;
1932 if (d->test.pos)
1934 /* Try to find conditions that don't depend on a particular rtx,
1935 such as pnum_clobbers != NULL or peep2_current_count >= X.
1936 It's usually better to check these conditions as soon as
1937 possible, so the change is worthwhile even if there is
1938 only one copy of the test. */
1939 decision *endd = find_common_test (d, true, 0, true, kc, &where);
1940 if (!endd && d->test.pos != pos)
1941 /* Try to find other conditions related to position POS
1942 before moving to the new position. Again, this is
1943 worthwhile even if there is only one copy of the test,
1944 since it means that fewer position variables are live
1945 at a given time. */
1946 endd = find_common_test (d, true, pos, true, kc, &where);
1947 if (!endd)
1948 /* Try to find any condition that is used more than once. */
1949 endd = find_common_test (d, false, 0, false, kc, &where);
1950 if (endd)
1952 transition *common = where[0];
1953 /* Replace [D, ENDD] with a test like COMMON. We'll recurse
1954 on the common test and see the original D again next time. */
1955 d = insert_decision_before (state::range (d, endd),
1956 common->from->test,
1957 common->labels,
1958 common->optional);
1959 /* Remove the old tests. */
1960 while (!where.is_empty ())
1962 transition *trans = where.pop ();
1963 trans->from->s->replace (trans->from, trans->to->release ());
1968 /* Make sure that safe_to_hoist_p isn't being overly conservative.
1969 It should realize that D's test is safe in the current
1970 environment. */
1971 gcc_assert (d->test.kind == rtx_test::C_TEST
1972 || d->test.kind == rtx_test::ACCEPT
1973 || safe_to_hoist_p (d, d->test, kc));
1975 /* D won't be changed any further by the current optimization.
1976 Recurse with the state temporarily updated to include D. */
1977 int prev = 0;
1978 switch (d->test.kind)
1980 case rtx_test::CODE:
1981 prev = kc->position_tests[d->test.pos->id];
1982 kc->position_tests[d->test.pos->id] |= TESTED_CODE;
1983 break;
1985 case rtx_test::VECLEN:
1986 case rtx_test::VECLEN_GE:
1987 prev = kc->position_tests[d->test.pos->id];
1988 kc->position_tests[d->test.pos->id] |= TESTED_VECLEN;
1989 break;
1991 case rtx_test::SET_OP:
1992 prev = kc->set_operands[d->test.u.opno];
1993 gcc_assert (!prev);
1994 kc->set_operands[d->test.u.opno] = true;
1995 break;
1997 case rtx_test::PEEP2_COUNT:
1998 prev = kc->peep2_count;
1999 kc->peep2_count = MAX (prev, d->test.u.min_len);
2000 break;
2002 default:
2003 break;
2005 for (transition *trans = d->first; trans; trans = trans->next)
2006 cse_tests (d->test.pos ? d->test.pos : pos, trans->to, kc);
2007 switch (d->test.kind)
2009 case rtx_test::CODE:
2010 case rtx_test::VECLEN:
2011 case rtx_test::VECLEN_GE:
2012 kc->position_tests[d->test.pos->id] = prev;
2013 break;
2015 case rtx_test::SET_OP:
2016 kc->set_operands[d->test.u.opno] = prev;
2017 break;
2019 case rtx_test::PEEP2_COUNT:
2020 kc->peep2_count = prev;
2021 break;
2023 default:
2024 break;
2029 /* Return the type of value that can be used to parameterize test KIND,
2030 or parameter::UNSET if none. */
2032 parameter::type_enum
2033 transition_parameter_type (rtx_test::kind_enum kind)
2035 switch (kind)
2037 case rtx_test::CODE:
2038 return parameter::CODE;
2040 case rtx_test::MODE:
2041 return parameter::MODE;
2043 case rtx_test::REGNO_FIELD:
2044 case rtx_test::SUBREG_FIELD:
2045 return parameter::UINT;
2047 case rtx_test::INT_FIELD:
2048 case rtx_test::VECLEN:
2049 case rtx_test::PATTERN:
2050 return parameter::INT;
2052 case rtx_test::WIDE_INT_FIELD:
2053 return parameter::WIDE_INT;
2055 case rtx_test::PEEP2_COUNT:
2056 case rtx_test::VECLEN_GE:
2057 case rtx_test::SAVED_CONST_INT:
2058 case rtx_test::PREDICATE:
2059 case rtx_test::DUPLICATE:
2060 case rtx_test::HAVE_NUM_CLOBBERS:
2061 case rtx_test::C_TEST:
2062 case rtx_test::SET_OP:
2063 case rtx_test::ACCEPT:
2064 return parameter::UNSET;
2066 gcc_unreachable ();
2069 /* Initialize the pos_operand fields of each state reachable from S.
2070 If OPERAND_POS[ID] >= 0, the position with id ID is stored in
2071 operands[OPERAND_POS[ID]] on entry to S. */
2073 static void
2074 find_operand_positions (state *s, vec <int> &operand_pos)
2076 for (decision *d = s->first; d; d = d->next)
2078 int this_operand = (d->test.pos ? operand_pos[d->test.pos->id] : -1);
2079 if (this_operand >= 0)
2080 d->test.pos_operand = this_operand;
2081 if (d->test.kind == rtx_test::SET_OP)
2082 operand_pos[d->test.pos->id] = d->test.u.opno;
2083 for (transition *trans = d->first; trans; trans = trans->next)
2084 find_operand_positions (trans->to, operand_pos);
2085 if (d->test.kind == rtx_test::SET_OP)
2086 operand_pos[d->test.pos->id] = this_operand;
2090 /* Statistics about a matching routine. */
2091 struct stats
2093 stats ();
2095 /* The total number of decisions in the routine, excluding trivial
2096 ones that never fail. */
2097 unsigned int num_decisions;
2099 /* The number of non-trivial decisions on the longest path through
2100 the routine, and the return value that contributes most to that
2101 long path. */
2102 unsigned int longest_path;
2103 int longest_path_code;
2105 /* The maximum number of times that a single call to the routine
2106 can backtrack, and the value returned at the end of that path.
2107 "Backtracking" here means failing one decision in state and
2108 going onto to the next. */
2109 unsigned int longest_backtrack;
2110 int longest_backtrack_code;
2113 stats::stats ()
2114 : num_decisions (0), longest_path (0), longest_path_code (-1),
2115 longest_backtrack (0), longest_backtrack_code (-1) {}
2117 /* Return statistics about S. */
2119 static stats
2120 get_stats (state *s)
2122 stats for_s;
2123 unsigned int longest_path = 0;
2124 for (decision *d = s->first; d; d = d->next)
2126 /* Work out the statistics for D. */
2127 stats for_d;
2128 for (transition *trans = d->first; trans; trans = trans->next)
2130 stats for_trans = get_stats (trans->to);
2131 for_d.num_decisions += for_trans.num_decisions;
2132 /* Each transition is mutually-exclusive, so just pick the
2133 longest of the individual paths. */
2134 if (for_d.longest_path <= for_trans.longest_path)
2136 for_d.longest_path = for_trans.longest_path;
2137 for_d.longest_path_code = for_trans.longest_path_code;
2139 /* Likewise for backtracking. */
2140 if (for_d.longest_backtrack <= for_trans.longest_backtrack)
2142 for_d.longest_backtrack = for_trans.longest_backtrack;
2143 for_d.longest_backtrack_code = for_trans.longest_backtrack_code;
2147 /* Account for D's test in its statistics. */
2148 if (!d->test.single_outcome_p ())
2150 for_d.num_decisions += 1;
2151 for_d.longest_path += 1;
2153 if (d->test.kind == rtx_test::ACCEPT)
2155 for_d.longest_path_code = d->test.u.acceptance.u.full.code;
2156 for_d.longest_backtrack_code = d->test.u.acceptance.u.full.code;
2159 /* Keep a running count of the number of backtracks. */
2160 if (d->prev)
2161 for_s.longest_backtrack += 1;
2163 /* Accumulate D's statistics into S's. */
2164 for_s.num_decisions += for_d.num_decisions;
2165 for_s.longest_path += for_d.longest_path;
2166 for_s.longest_backtrack += for_d.longest_backtrack;
2168 /* Use the code from the decision with the longest individual path,
2169 since that's more likely to be useful if trying to make the
2170 path shorter. In the event of a tie, pick the later decision,
2171 since that's closer to the end of the path. */
2172 if (longest_path <= for_d.longest_path)
2174 longest_path = for_d.longest_path;
2175 for_s.longest_path_code = for_d.longest_path_code;
2178 /* Later decisions in a state are necessarily in a longer backtrack
2179 than earlier decisions. */
2180 for_s.longest_backtrack_code = for_d.longest_backtrack_code;
2182 return for_s;
2185 /* Optimize ROOT. Use TYPE to describe ROOT in status messages. */
2187 static void
2188 optimize_subroutine_group (const char *type, state *root)
2190 /* Remove optional transitions that turned out not to be worthwhile. */
2191 if (collapse_optional_decisions_p)
2192 collapse_optional_decisions (root);
2194 /* Try to remove duplicated tests and to rearrange tests into a more
2195 logical order. */
2196 if (cse_tests_p)
2198 known_conditions kc;
2199 kc.position_tests.safe_grow_cleared (num_positions);
2200 kc.set_operands.safe_grow_cleared (num_operands);
2201 kc.peep2_count = 1;
2202 cse_tests (&root_pos, root, &kc);
2205 /* Try to simplify two or more tests into one. */
2206 if (simplify_tests_p)
2207 simplify_tests (root);
2209 /* Try to use operands[] instead of xN variables. */
2210 if (use_operand_variables_p)
2212 auto_vec <int> operand_pos (num_positions);
2213 for (unsigned int i = 0; i < num_positions; ++i)
2214 operand_pos.quick_push (-1);
2215 find_operand_positions (root, operand_pos);
2218 /* Print a summary of the new state. */
2219 stats st = get_stats (root);
2220 fprintf (stderr, "Statistics for %s:\n", type);
2221 fprintf (stderr, " Number of decisions: %6d\n", st.num_decisions);
2222 fprintf (stderr, " longest path: %6d (code: %6d)\n",
2223 st.longest_path, st.longest_path_code);
2224 fprintf (stderr, " longest backtrack: %6d (code: %6d)\n",
2225 st.longest_backtrack, st.longest_backtrack_code);
2228 struct merge_pattern_info;
2230 /* Represents a transition from one pattern to another. */
2231 struct merge_pattern_transition
2233 merge_pattern_transition (merge_pattern_info *);
2235 /* The target pattern. */
2236 merge_pattern_info *to;
2238 /* The parameters that the source pattern passes to the target pattern.
2239 "parameter (TYPE, true, I)" represents parameter I of the source
2240 pattern. */
2241 auto_vec <parameter, MAX_PATTERN_PARAMS> params;
2244 merge_pattern_transition::merge_pattern_transition (merge_pattern_info *to_in)
2245 : to (to_in)
2249 /* Represents a pattern that can might match several states. The pattern
2250 may replace parts of the test with a parameter value. It may also
2251 replace transition labels with parameters. */
2252 struct merge_pattern_info
2254 merge_pattern_info (unsigned int);
2256 /* If PARAM_TEST_P, the state's singleton test should be generalized
2257 to use the runtime value of PARAMS[PARAM_TEST]. */
2258 unsigned int param_test : 8;
2260 /* If PARAM_TRANSITION_P, the state's single transition label should
2261 be replaced by the runtime value of PARAMS[PARAM_TRANSITION]. */
2262 unsigned int param_transition : 8;
2264 /* True if we have decided to generalize the root decision's test,
2265 as per PARAM_TEST. */
2266 unsigned int param_test_p : 1;
2268 /* Likewise for the root decision's transition, as per PARAM_TRANSITION. */
2269 unsigned int param_transition_p : 1;
2271 /* True if the contents of the structure are completely filled in. */
2272 unsigned int complete_p : 1;
2274 /* The number of pseudo-statements in the pattern. Used to decide
2275 whether it's big enough to break out into a subroutine. */
2276 unsigned int num_statements;
2278 /* The number of states that use this pattern. */
2279 unsigned int num_users;
2281 /* The number of distinct success values that the pattern returns. */
2282 unsigned int num_results;
2284 /* This array has one element for each runtime parameter to the pattern.
2285 PARAMS[I] gives the default value of parameter I, which is always
2286 constant.
2288 These default parameters are used in cases where we match the
2289 pattern against some state S1, then add more parameters while
2290 matching against some state S2. S1 is then left passing fewer
2291 parameters than S2. The array gives us enough informatino to
2292 construct a full parameter list for S1 (see update_parameters).
2294 If we decide to create a subroutine for this pattern,
2295 PARAMS[I].type determines the C type of parameter I. */
2296 auto_vec <parameter, MAX_PATTERN_PARAMS> params;
2298 /* All states that match this pattern must have the same number of
2299 transitions. TRANSITIONS[I] describes the subpattern for transition
2300 number I; it is null if transition I represents a successful return
2301 from the pattern. */
2302 auto_vec <merge_pattern_transition *, 1> transitions;
2304 /* The routine associated with the pattern, or null if we haven't generated
2305 one yet. */
2306 pattern_routine *routine;
2309 merge_pattern_info::merge_pattern_info (unsigned int num_transitions)
2310 : param_test (0),
2311 param_transition (0),
2312 param_test_p (false),
2313 param_transition_p (false),
2314 complete_p (false),
2315 num_statements (0),
2316 num_users (0),
2317 num_results (0),
2318 routine (0)
2320 transitions.safe_grow_cleared (num_transitions);
2323 /* Describes one way of matching a particular state to a particular
2324 pattern. */
2325 struct merge_state_result
2327 merge_state_result (merge_pattern_info *, position *, merge_state_result *);
2329 /* A pattern that matches the state. */
2330 merge_pattern_info *pattern;
2332 /* If we decide to use this match and create a subroutine for PATTERN,
2333 the state should pass the rtx at position ROOT to the pattern's
2334 rtx parameter. A null root means that the pattern doesn't need
2335 an rtx parameter; all the rtxes it matches come from elsewhere. */
2336 position *root;
2338 /* The parameters that should be passed to PATTERN for this state.
2339 If the array is shorter than PATTERN->params, the missing entries
2340 should be taken from the corresponding element of PATTERN->params. */
2341 auto_vec <parameter, MAX_PATTERN_PARAMS> params;
2343 /* An earlier match for the same state, or null if none. Patterns
2344 matched by earlier entries are smaller than PATTERN. */
2345 merge_state_result *prev;
2348 merge_state_result::merge_state_result (merge_pattern_info *pattern_in,
2349 position *root_in,
2350 merge_state_result *prev_in)
2351 : pattern (pattern_in), root (root_in), prev (prev_in)
2354 /* Information about a state, used while trying to match it against
2355 a pattern. */
2356 struct merge_state_info
2358 merge_state_info (state *);
2360 /* The state itself. */
2361 state *s;
2363 /* Index I gives information about the target of transition I. */
2364 merge_state_info *to_states;
2366 /* The number of transitions in S. */
2367 unsigned int num_transitions;
2369 /* True if the state has been deleted in favor of a call to a
2370 pattern routine. */
2371 bool merged_p;
2373 /* The previous state that might be a merge candidate for S, or null
2374 if no previous states could be merged with S. */
2375 merge_state_info *prev_same_test;
2377 /* A list of pattern matches for this state. */
2378 merge_state_result *res;
2381 merge_state_info::merge_state_info (state *s_in)
2382 : s (s_in),
2383 to_states (0),
2384 num_transitions (0),
2385 merged_p (false),
2386 prev_same_test (0),
2387 res (0) {}
2389 /* True if PAT would be useful as a subroutine. */
2391 static bool
2392 useful_pattern_p (merge_pattern_info *pat)
2394 return pat->num_statements >= MIN_COMBINE_COST;
2397 /* PAT2 is a subpattern of PAT1. Return true if PAT2 should be inlined
2398 into PAT1's C routine. */
2400 static bool
2401 same_pattern_p (merge_pattern_info *pat1, merge_pattern_info *pat2)
2403 return pat1->num_users == pat2->num_users || !useful_pattern_p (pat2);
2406 /* PAT was previously matched against SINFO based on tentative matches
2407 for the target states of SINFO's state. Return true if the match
2408 still holds; that is, if the target states of SINFO's state still
2409 match the corresponding transitions of PAT. */
2411 static bool
2412 valid_result_p (merge_pattern_info *pat, merge_state_info *sinfo)
2414 for (unsigned int j = 0; j < sinfo->num_transitions; ++j)
2415 if (merge_pattern_transition *ptrans = pat->transitions[j])
2417 merge_state_result *to_res = sinfo->to_states[j].res;
2418 if (!to_res || to_res->pattern != ptrans->to)
2419 return false;
2421 return true;
2424 /* Remove any matches that are no longer valid from the head of SINFO's
2425 list of matches. */
2427 static void
2428 prune_invalid_results (merge_state_info *sinfo)
2430 while (sinfo->res && !valid_result_p (sinfo->res->pattern, sinfo))
2432 sinfo->res = sinfo->res->prev;
2433 gcc_assert (sinfo->res);
2437 /* Return true if PAT represents the biggest posssible match for SINFO;
2438 that is, if the next action of SINFO's state on return from PAT will
2439 be something that cannot be merged with any other state. */
2441 static bool
2442 complete_result_p (merge_pattern_info *pat, merge_state_info *sinfo)
2444 for (unsigned int j = 0; j < sinfo->num_transitions; ++j)
2445 if (sinfo->to_states[j].res && !pat->transitions[j])
2446 return false;
2447 return true;
2450 /* Update TO for any parameters that have been added to FROM since TO
2451 was last set. The extra parameters in FROM will be constants or
2452 instructions to duplicate earlier parameters. */
2454 static void
2455 update_parameters (vec <parameter> &to, const vec <parameter> &from)
2457 for (unsigned int i = to.length (); i < from.length (); ++i)
2458 to.quick_push (from[i]);
2461 /* Return true if A and B can be tested by a single test. If the test
2462 can be parameterised, store the parameter value for A in *PARAMA and
2463 the parameter value for B in *PARAMB, otherwise leave PARAMA and
2464 PARAMB alone. */
2466 static bool
2467 compatible_tests_p (const rtx_test &a, const rtx_test &b,
2468 parameter *parama, parameter *paramb)
2470 if (a.kind != b.kind)
2471 return false;
2472 switch (a.kind)
2474 case rtx_test::PREDICATE:
2475 if (a.u.predicate.data != b.u.predicate.data)
2476 return false;
2477 *parama = parameter (parameter::MODE, false, a.u.predicate.mode);
2478 *paramb = parameter (parameter::MODE, false, b.u.predicate.mode);
2479 return true;
2481 case rtx_test::SAVED_CONST_INT:
2482 *parama = parameter (parameter::INT, false, a.u.integer.value);
2483 *paramb = parameter (parameter::INT, false, b.u.integer.value);
2484 return true;
2486 default:
2487 return a == b;
2491 /* PARAMS is an array of the parameters that a state is going to pass
2492 to a pattern routine. It is still incomplete; index I has a kind of
2493 parameter::UNSET if we don't yet know what the state will pass
2494 as parameter I. Try to make parameter ID equal VALUE, returning
2495 true on success. */
2497 static bool
2498 set_parameter (vec <parameter> &params, unsigned int id,
2499 const parameter &value)
2501 if (params[id].type == parameter::UNSET)
2503 if (force_unique_params_p)
2504 for (unsigned int i = 0; i < params.length (); ++i)
2505 if (params[i] == value)
2506 return false;
2507 params[id] = value;
2508 return true;
2510 return params[id] == value;
2513 /* PARAMS2 is the "params" array for a pattern and PARAMS1 is the
2514 set of parameters that a particular state is going to pass to
2515 that pattern.
2517 Try to extend PARAMS1 and PARAMS2 so that there is a parameter
2518 that is equal to PARAM1 for the state and has a default value of
2519 PARAM2. Parameters beginning at START were added as part of the
2520 same match and so may be reused. */
2522 static bool
2523 add_parameter (vec <parameter> &params1, vec <parameter> &params2,
2524 const parameter &param1, const parameter &param2,
2525 unsigned int start, unsigned int *res)
2527 gcc_assert (params1.length () == params2.length ());
2528 gcc_assert (!param1.is_param && !param2.is_param);
2530 for (unsigned int i = start; i < params2.length (); ++i)
2531 if (params1[i] == param1 && params2[i] == param2)
2533 *res = i;
2534 return true;
2537 if (force_unique_params_p)
2538 for (unsigned int i = 0; i < params2.length (); ++i)
2539 if (params1[i] == param1 || params2[i] == param2)
2540 return false;
2542 if (params2.length () >= MAX_PATTERN_PARAMS)
2543 return false;
2545 *res = params2.length ();
2546 params1.quick_push (param1);
2547 params2.quick_push (param2);
2548 return true;
2551 /* If *ROOTA is nonnull, return true if the same sequence of steps are
2552 required to reach A from *ROOTA as to reach B from ROOTB. If *ROOTA
2553 is null, update it if necessary in order to make the condition hold. */
2555 static bool
2556 merge_relative_positions (position **roota, position *a,
2557 position *rootb, position *b)
2559 if (!relative_patterns_p)
2561 if (a != b)
2562 return false;
2563 if (!*roota)
2565 *roota = rootb;
2566 return true;
2568 return *roota == rootb;
2570 /* If B does not belong to the same instruction as ROOTB, we don't
2571 start with ROOTB but instead start with a call to peep2_next_insn.
2572 In that case the sequences for B and A are identical iff B and A
2573 are themselves identical. */
2574 if (rootb->insn_id != b->insn_id)
2575 return a == b;
2576 while (rootb != b)
2578 if (!a || b->type != a->type || b->arg != a->arg)
2579 return false;
2580 b = b->base;
2581 a = a->base;
2583 if (!*roota)
2584 *roota = a;
2585 return *roota == a;
2588 /* A hasher of states that treats two states as "equal" if they might be
2589 merged (but trying to be more discriminating than "return true"). */
2590 struct test_pattern_hasher : nofree_ptr_hash <merge_state_info>
2592 static inline hashval_t hash (const value_type &);
2593 static inline bool equal (const value_type &, const compare_type &);
2596 hashval_t
2597 test_pattern_hasher::hash (merge_state_info *const &sinfo)
2599 inchash::hash h;
2600 decision *d = sinfo->s->singleton ();
2601 h.add_int (d->test.pos_operand + 1);
2602 if (!relative_patterns_p)
2603 h.add_int (d->test.pos ? d->test.pos->id + 1 : 0);
2604 h.add_int (d->test.kind);
2605 h.add_int (sinfo->num_transitions);
2606 return h.end ();
2609 bool
2610 test_pattern_hasher::equal (merge_state_info *const &sinfo1,
2611 merge_state_info *const &sinfo2)
2613 decision *d1 = sinfo1->s->singleton ();
2614 decision *d2 = sinfo2->s->singleton ();
2615 gcc_assert (d1 && d2);
2617 parameter new_param1, new_param2;
2618 return (d1->test.pos_operand == d2->test.pos_operand
2619 && (relative_patterns_p || d1->test.pos == d2->test.pos)
2620 && compatible_tests_p (d1->test, d2->test, &new_param1, &new_param2)
2621 && sinfo1->num_transitions == sinfo2->num_transitions);
2624 /* Try to make the state described by SINFO1 use the same pattern as the
2625 state described by SINFO2. Return true on success.
2627 SINFO1 and SINFO2 are known to have the same hash value. */
2629 static bool
2630 merge_patterns (merge_state_info *sinfo1, merge_state_info *sinfo2)
2632 merge_state_result *res2 = sinfo2->res;
2633 merge_pattern_info *pat = res2->pattern;
2635 /* Write to temporary arrays while matching, in case we have to abort
2636 half way through. */
2637 auto_vec <parameter, MAX_PATTERN_PARAMS> params1;
2638 auto_vec <parameter, MAX_PATTERN_PARAMS> params2;
2639 params1.quick_grow_cleared (pat->params.length ());
2640 params2.splice (pat->params);
2641 unsigned int start_param = params2.length ();
2643 /* An array for recording changes to PAT->transitions[?].params.
2644 All changes involve replacing a constant parameter with some
2645 PAT->params[N], where N is the second element of the pending_param. */
2646 typedef std::pair <parameter *, unsigned int> pending_param;
2647 auto_vec <pending_param, 32> pending_params;
2649 decision *d1 = sinfo1->s->singleton ();
2650 decision *d2 = sinfo2->s->singleton ();
2651 gcc_assert (d1 && d2);
2653 /* If D2 tests a position, SINFO1's root relative to D1 is the same
2654 as SINFO2's root relative to D2. */
2655 position *root1 = 0;
2656 position *root2 = res2->root;
2657 if (d2->test.pos_operand < 0
2658 && d1->test.pos
2659 && !merge_relative_positions (&root1, d1->test.pos,
2660 root2, d2->test.pos))
2661 return false;
2663 /* Check whether the patterns have the same shape. */
2664 unsigned int num_transitions = sinfo1->num_transitions;
2665 gcc_assert (num_transitions == sinfo2->num_transitions);
2666 for (unsigned int i = 0; i < num_transitions; ++i)
2667 if (merge_pattern_transition *ptrans = pat->transitions[i])
2669 merge_state_result *to1_res = sinfo1->to_states[i].res;
2670 merge_state_result *to2_res = sinfo2->to_states[i].res;
2671 merge_pattern_info *to_pat = ptrans->to;
2672 gcc_assert (to2_res && to2_res->pattern == to_pat);
2673 if (!to1_res || to1_res->pattern != to_pat)
2674 return false;
2675 if (to2_res->root
2676 && !merge_relative_positions (&root1, to1_res->root,
2677 root2, to2_res->root))
2678 return false;
2679 /* Match the parameters that TO1_RES passes to TO_PAT with the
2680 parameters that PAT passes to TO_PAT. */
2681 update_parameters (to1_res->params, to_pat->params);
2682 for (unsigned int j = 0; j < to1_res->params.length (); ++j)
2684 const parameter &param1 = to1_res->params[j];
2685 const parameter &param2 = ptrans->params[j];
2686 gcc_assert (!param1.is_param);
2687 if (param2.is_param)
2689 if (!set_parameter (params1, param2.value, param1))
2690 return false;
2692 else if (param1 != param2)
2694 unsigned int id;
2695 if (!add_parameter (params1, params2,
2696 param1, param2, start_param, &id))
2697 return false;
2698 /* Record that PAT should now pass parameter ID to TO_PAT,
2699 instead of the current contents of *PARAM2. We only
2700 make the change if the rest of the match succeeds. */
2701 pending_params.safe_push
2702 (pending_param (&ptrans->params[j], id));
2707 unsigned int param_test = pat->param_test;
2708 unsigned int param_transition = pat->param_transition;
2709 bool param_test_p = pat->param_test_p;
2710 bool param_transition_p = pat->param_transition_p;
2712 /* If the tests don't match exactly, try to parameterize them. */
2713 parameter new_param1, new_param2;
2714 if (!compatible_tests_p (d1->test, d2->test, &new_param1, &new_param2))
2715 gcc_unreachable ();
2716 if (new_param1.type != parameter::UNSET)
2718 /* If the test has not already been parameterized, all existing
2719 matches use constant NEW_PARAM2. */
2720 if (param_test_p)
2722 if (!set_parameter (params1, param_test, new_param1))
2723 return false;
2725 else if (new_param1 != new_param2)
2727 if (!add_parameter (params1, params2, new_param1, new_param2,
2728 start_param, &param_test))
2729 return false;
2730 param_test_p = true;
2734 /* Match the transitions. */
2735 transition *trans1 = d1->first;
2736 transition *trans2 = d2->first;
2737 for (unsigned int i = 0; i < num_transitions; ++i)
2739 if (param_transition_p || trans1->labels != trans2->labels)
2741 /* We can only generalize a single transition with a single
2742 label. */
2743 if (num_transitions != 1
2744 || trans1->labels.length () != 1
2745 || trans2->labels.length () != 1)
2746 return false;
2748 /* Although we can match wide-int fields, in practice it leads
2749 to some odd results for const_vectors. We end up
2750 parameterizing the first N const_ints of the vector
2751 and then (once we reach the maximum number of parameters)
2752 we go on to match the other elements exactly. */
2753 if (d1->test.kind == rtx_test::WIDE_INT_FIELD)
2754 return false;
2756 /* See whether the label has a generalizable type. */
2757 parameter::type_enum param_type
2758 = transition_parameter_type (d1->test.kind);
2759 if (param_type == parameter::UNSET)
2760 return false;
2762 /* Match the labels using parameters. */
2763 new_param1 = parameter (param_type, false, trans1->labels[0]);
2764 if (param_transition_p)
2766 if (!set_parameter (params1, param_transition, new_param1))
2767 return false;
2769 else
2771 new_param2 = parameter (param_type, false, trans2->labels[0]);
2772 if (!add_parameter (params1, params2, new_param1, new_param2,
2773 start_param, &param_transition))
2774 return false;
2775 param_transition_p = true;
2778 trans1 = trans1->next;
2779 trans2 = trans2->next;
2782 /* Set any unset parameters to their default values. This occurs if some
2783 other state needed something to be parameterized in order to match SINFO2,
2784 but SINFO1 on its own does not. */
2785 for (unsigned int i = 0; i < params1.length (); ++i)
2786 if (params1[i].type == parameter::UNSET)
2787 params1[i] = params2[i];
2789 /* The match was successful. Commit all pending changes to PAT. */
2790 update_parameters (pat->params, params2);
2792 pending_param *pp;
2793 unsigned int i;
2794 FOR_EACH_VEC_ELT (pending_params, i, pp)
2795 *pp->first = parameter (pp->first->type, true, pp->second);
2797 pat->param_test = param_test;
2798 pat->param_transition = param_transition;
2799 pat->param_test_p = param_test_p;
2800 pat->param_transition_p = param_transition_p;
2802 /* Record the match of SINFO1. */
2803 merge_state_result *new_res1 = new merge_state_result (pat, root1,
2804 sinfo1->res);
2805 new_res1->params.splice (params1);
2806 sinfo1->res = new_res1;
2807 return true;
2810 /* The number of states that were removed by calling pattern routines. */
2811 static unsigned int pattern_use_states;
2813 /* The number of states used while defining pattern routines. */
2814 static unsigned int pattern_def_states;
2816 /* Information used while constructing a use or definition of a pattern
2817 routine. */
2818 struct create_pattern_info
2820 /* The routine itself. */
2821 pattern_routine *routine;
2823 /* The first unclaimed return value for this particular use or definition.
2824 We walk the substates of uses and definitions in the same order
2825 so each return value always refers to the same position within
2826 the pattern. */
2827 unsigned int next_result;
2830 static void populate_pattern_routine (create_pattern_info *,
2831 merge_state_info *, state *,
2832 const vec <parameter> &);
2834 /* SINFO matches a pattern for which we've decided to create a C routine.
2835 Return a decision that performs a call to the pattern routine,
2836 but leave the caller to add the transitions to it. Initialize CPI
2837 for this purpose. Also create a definition for the pattern routine,
2838 if it doesn't already have one.
2840 PARAMS are the parameters that SINFO passes to its pattern. */
2842 static decision *
2843 init_pattern_use (create_pattern_info *cpi, merge_state_info *sinfo,
2844 const vec <parameter> &params)
2846 state *s = sinfo->s;
2847 merge_state_result *res = sinfo->res;
2848 merge_pattern_info *pat = res->pattern;
2849 cpi->routine = pat->routine;
2850 if (!cpi->routine)
2852 /* We haven't defined the pattern routine yet, so create
2853 a definition now. */
2854 pattern_routine *routine = new pattern_routine;
2855 pat->routine = routine;
2856 cpi->routine = routine;
2857 routine->s = new state;
2858 routine->insn_p = false;
2859 routine->pnum_clobbers_p = false;
2861 /* Create an "idempotent" mapping of parameter I to parameter I.
2862 Also record the C type of each parameter to the routine. */
2863 auto_vec <parameter, MAX_PATTERN_PARAMS> def_params;
2864 for (unsigned int i = 0; i < pat->params.length (); ++i)
2866 def_params.quick_push (parameter (pat->params[i].type, true, i));
2867 routine->param_types.quick_push (pat->params[i].type);
2870 /* Any of the states that match the pattern could be used to
2871 create the routine definition. We might as well use SINFO
2872 since it's already to hand. This means that all positions
2873 in the definition will be relative to RES->root. */
2874 routine->pos = res->root;
2875 cpi->next_result = 0;
2876 populate_pattern_routine (cpi, sinfo, routine->s, def_params);
2877 gcc_assert (cpi->next_result == pat->num_results);
2879 /* Add the routine to the global list, after the subroutines
2880 that it calls. */
2881 routine->pattern_id = patterns.length ();
2882 patterns.safe_push (routine);
2885 /* Create a decision to call the routine, passing PARAMS to it. */
2886 pattern_use *use = new pattern_use;
2887 use->routine = pat->routine;
2888 use->params.splice (params);
2889 decision *d = new decision (rtx_test::pattern (res->root, use));
2891 /* If the original decision could use an element of operands[] instead
2892 of an rtx variable, try to transfer it to the new decision. */
2893 if (s->first->test.pos && res->root == s->first->test.pos)
2894 d->test.pos_operand = s->first->test.pos_operand;
2896 cpi->next_result = 0;
2897 return d;
2900 /* Make S return the next unclaimed pattern routine result for CPI. */
2902 static void
2903 add_pattern_acceptance (create_pattern_info *cpi, state *s)
2905 acceptance_type acceptance;
2906 acceptance.type = SUBPATTERN;
2907 acceptance.partial_p = false;
2908 acceptance.u.full.code = cpi->next_result;
2909 add_decision (s, rtx_test::accept (acceptance), true, false);
2910 cpi->next_result += 1;
2913 /* Initialize new empty state NEWS so that it implements SINFO's pattern
2914 (here referred to as "P"). P may be the top level of a pattern routine
2915 or a subpattern that should be inlined into its parent pattern's routine
2916 (as per same_pattern_p). The choice of SINFO for a top-level pattern is
2917 arbitrary; it could be any of the states that use P. The choice for
2918 subpatterns follows the choice for the parent pattern.
2920 PARAMS gives the value of each parameter to P in terms of the parameters
2921 to the top-level pattern. If P itself is the top level pattern, PARAMS[I]
2922 is always "parameter (TYPE, true, I)". */
2924 static void
2925 populate_pattern_routine (create_pattern_info *cpi, merge_state_info *sinfo,
2926 state *news, const vec <parameter> &params)
2928 pattern_def_states += 1;
2930 decision *d = sinfo->s->singleton ();
2931 merge_pattern_info *pat = sinfo->res->pattern;
2932 pattern_routine *routine = cpi->routine;
2934 /* Create a copy of D's test for the pattern routine and generalize it
2935 as appropriate. */
2936 decision *newd = new decision (d->test);
2937 gcc_assert (newd->test.pos_operand >= 0
2938 || !newd->test.pos
2939 || common_position (newd->test.pos,
2940 routine->pos) == routine->pos);
2941 if (pat->param_test_p)
2943 const parameter &param = params[pat->param_test];
2944 switch (newd->test.kind)
2946 case rtx_test::PREDICATE:
2947 newd->test.u.predicate.mode_is_param = param.is_param;
2948 newd->test.u.predicate.mode = param.value;
2949 break;
2951 case rtx_test::SAVED_CONST_INT:
2952 newd->test.u.integer.is_param = param.is_param;
2953 newd->test.u.integer.value = param.value;
2954 break;
2956 default:
2957 gcc_unreachable ();
2958 break;
2961 if (d->test.kind == rtx_test::C_TEST)
2962 routine->insn_p = true;
2963 else if (d->test.kind == rtx_test::HAVE_NUM_CLOBBERS)
2964 routine->pnum_clobbers_p = true;
2965 news->push_back (newd);
2967 /* Fill in the transitions of NEWD. */
2968 unsigned int i = 0;
2969 for (transition *trans = d->first; trans; trans = trans->next)
2971 /* Create a new state to act as the target of the new transition. */
2972 state *to_news = new state;
2973 if (merge_pattern_transition *ptrans = pat->transitions[i])
2975 /* The pattern hasn't finished matching yet. Get the target
2976 pattern and the corresponding target state of SINFO. */
2977 merge_pattern_info *to_pat = ptrans->to;
2978 merge_state_info *to = sinfo->to_states + i;
2979 gcc_assert (to->res->pattern == to_pat);
2980 gcc_assert (ptrans->params.length () == to_pat->params.length ());
2982 /* Express the parameters to TO_PAT in terms of the parameters
2983 to the top-level pattern. */
2984 auto_vec <parameter, MAX_PATTERN_PARAMS> to_params;
2985 for (unsigned int j = 0; j < ptrans->params.length (); ++j)
2987 const parameter &param = ptrans->params[j];
2988 to_params.quick_push (param.is_param
2989 ? params[param.value]
2990 : param);
2993 if (same_pattern_p (pat, to_pat))
2994 /* TO_PAT is part of the current routine, so just recurse. */
2995 populate_pattern_routine (cpi, to, to_news, to_params);
2996 else
2998 /* TO_PAT should be matched by calling a separate routine. */
2999 create_pattern_info sub_cpi;
3000 decision *subd = init_pattern_use (&sub_cpi, to, to_params);
3001 routine->insn_p |= sub_cpi.routine->insn_p;
3002 routine->pnum_clobbers_p |= sub_cpi.routine->pnum_clobbers_p;
3004 /* Add the pattern routine call to the new target state. */
3005 to_news->push_back (subd);
3007 /* Add a transition for each successful call result. */
3008 for (unsigned int j = 0; j < to_pat->num_results; ++j)
3010 state *res = new state;
3011 add_pattern_acceptance (cpi, res);
3012 subd->push_back (new transition (j, res, false));
3016 else
3017 /* This transition corresponds to a successful match. */
3018 add_pattern_acceptance (cpi, to_news);
3020 /* Create the transition itself, generalizing as necessary. */
3021 transition *new_trans = new transition (trans->labels, to_news,
3022 trans->optional);
3023 if (pat->param_transition_p)
3025 const parameter &param = params[pat->param_transition];
3026 new_trans->is_param = param.is_param;
3027 new_trans->labels[0] = param.value;
3029 newd->push_back (new_trans);
3030 i += 1;
3034 /* USE is a decision that calls a pattern routine and SINFO is part of the
3035 original state tree that the call is supposed to replace. Add the
3036 transitions for SINFO and its substates to USE. */
3038 static void
3039 populate_pattern_use (create_pattern_info *cpi, decision *use,
3040 merge_state_info *sinfo)
3042 pattern_use_states += 1;
3043 gcc_assert (!sinfo->merged_p);
3044 sinfo->merged_p = true;
3045 merge_state_result *res = sinfo->res;
3046 merge_pattern_info *pat = res->pattern;
3047 decision *d = sinfo->s->singleton ();
3048 unsigned int i = 0;
3049 for (transition *trans = d->first; trans; trans = trans->next)
3051 if (pat->transitions[i])
3052 /* The target state is also part of the pattern. */
3053 populate_pattern_use (cpi, use, sinfo->to_states + i);
3054 else
3056 /* The transition corresponds to a successful return from the
3057 pattern routine. */
3058 use->push_back (new transition (cpi->next_result, trans->to, false));
3059 cpi->next_result += 1;
3061 i += 1;
3065 /* We have decided to replace SINFO's state with a call to a pattern
3066 routine. Make the change, creating a definition of the pattern routine
3067 if it doesn't have one already. */
3069 static void
3070 use_pattern (merge_state_info *sinfo)
3072 merge_state_result *res = sinfo->res;
3073 merge_pattern_info *pat = res->pattern;
3074 state *s = sinfo->s;
3076 /* The pattern may have acquired new parameters after it was matched
3077 against SINFO. Update the parameters that SINFO passes accordingly. */
3078 update_parameters (res->params, pat->params);
3080 create_pattern_info cpi;
3081 decision *d = init_pattern_use (&cpi, sinfo, res->params);
3082 populate_pattern_use (&cpi, d, sinfo);
3083 s->release ();
3084 s->push_back (d);
3087 /* Look through the state trees in STATES for common patterns and
3088 split them into subroutines. */
3090 static void
3091 split_out_patterns (vec <merge_state_info> &states)
3093 unsigned int first_transition = states.length ();
3094 hash_table <test_pattern_hasher> hashtab (128);
3095 /* Stage 1: Create an order in which parent states come before their child
3096 states and in which sibling states are at consecutive locations.
3097 Having consecutive sibling states allows merge_state_info to have
3098 a single to_states pointer. */
3099 for (unsigned int i = 0; i < states.length (); ++i)
3100 for (decision *d = states[i].s->first; d; d = d->next)
3101 for (transition *trans = d->first; trans; trans = trans->next)
3103 states.safe_push (trans->to);
3104 states[i].num_transitions += 1;
3106 /* Stage 2: Now that the addresses are stable, set up the to_states
3107 pointers. Look for states that might be merged and enter them
3108 into the hash table. */
3109 for (unsigned int i = 0; i < states.length (); ++i)
3111 merge_state_info *sinfo = &states[i];
3112 if (sinfo->num_transitions)
3114 sinfo->to_states = &states[first_transition];
3115 first_transition += sinfo->num_transitions;
3117 /* For simplicity, we only try to merge states that have a single
3118 decision. This is in any case the best we can do for peephole2,
3119 since whether a peephole2 ACCEPT succeeds or not depends on the
3120 specific peephole2 pattern (which is unique to each ACCEPT
3121 and so couldn't be shared between states). */
3122 if (decision *d = sinfo->s->singleton ())
3123 /* ACCEPT states are unique, so don't even try to merge them. */
3124 if (d->test.kind != rtx_test::ACCEPT
3125 && (pattern_have_num_clobbers_p
3126 || d->test.kind != rtx_test::HAVE_NUM_CLOBBERS)
3127 && (pattern_c_test_p
3128 || d->test.kind != rtx_test::C_TEST))
3130 merge_state_info **slot = hashtab.find_slot (sinfo, INSERT);
3131 sinfo->prev_same_test = *slot;
3132 *slot = sinfo;
3135 /* Stage 3: Walk backwards through the list of states and try to merge
3136 them. This is a greedy, bottom-up match; parent nodes can only start
3137 a new leaf pattern if they fail to match when combined with all child
3138 nodes that have matching patterns.
3140 For each state we keep a list of potential matches, with each
3141 potential match being larger (and deeper) than the next match in
3142 the list. The final element in the list is a leaf pattern that
3143 matches just a single state.
3145 Each candidate pattern created in this loop is unique -- it won't
3146 have been seen by an earlier iteration. We try to match each pattern
3147 with every state that appears earlier in STATES.
3149 Because the patterns created in the loop are unique, any state
3150 that already has a match must have a final potential match that
3151 is different from any new leaf pattern. Therefore, when matching
3152 leaf patterns, we need only consider states whose list of matches
3153 is empty.
3155 The non-leaf patterns that we try are as deep as possible
3156 and are an extension of the state's previous best candidate match (PB).
3157 We need only consider states whose current potential match is also PB;
3158 any states that don't match as much as PB cannnot match the new pattern,
3159 while any states that already match more than PB must be different from
3160 the new pattern. */
3161 for (unsigned int i2 = states.length (); i2-- > 0; )
3163 merge_state_info *sinfo2 = &states[i2];
3165 /* Enforce the bottom-upness of the match: remove matches with later
3166 states if SINFO2's child states ended up finding a better match. */
3167 prune_invalid_results (sinfo2);
3169 /* Do nothing if the state doesn't match a later one and if there are
3170 no earlier states it could match. */
3171 if (!sinfo2->res && !sinfo2->prev_same_test)
3172 continue;
3174 merge_state_result *res2 = sinfo2->res;
3175 decision *d2 = sinfo2->s->singleton ();
3176 position *root2 = (d2->test.pos_operand < 0 ? d2->test.pos : 0);
3177 unsigned int num_transitions = sinfo2->num_transitions;
3179 /* If RES2 is null then SINFO2's test in isolation has not been seen
3180 before. First try matching that on its own. */
3181 if (!res2)
3183 merge_pattern_info *new_pat
3184 = new merge_pattern_info (num_transitions);
3185 merge_state_result *new_res2
3186 = new merge_state_result (new_pat, root2, res2);
3187 sinfo2->res = new_res2;
3189 new_pat->num_statements = !d2->test.single_outcome_p ();
3190 new_pat->num_results = num_transitions;
3191 bool matched_p = false;
3192 /* Look for states that don't currently match anything but
3193 can be made to match SINFO2 on its own. */
3194 for (merge_state_info *sinfo1 = sinfo2->prev_same_test; sinfo1;
3195 sinfo1 = sinfo1->prev_same_test)
3196 if (!sinfo1->res && merge_patterns (sinfo1, sinfo2))
3197 matched_p = true;
3198 if (!matched_p)
3200 /* No other states match. */
3201 sinfo2->res = res2;
3202 delete new_pat;
3203 delete new_res2;
3204 continue;
3206 else
3207 res2 = new_res2;
3210 /* Keep the existing pattern if it's as good as anything we'd
3211 create for SINFO2. */
3212 if (complete_result_p (res2->pattern, sinfo2))
3214 res2->pattern->num_users += 1;
3215 continue;
3218 /* Create a new pattern for SINFO2. */
3219 merge_pattern_info *new_pat = new merge_pattern_info (num_transitions);
3220 merge_state_result *new_res2
3221 = new merge_state_result (new_pat, root2, res2);
3222 sinfo2->res = new_res2;
3224 /* Fill in details about the pattern. */
3225 new_pat->num_statements = !d2->test.single_outcome_p ();
3226 new_pat->num_results = 0;
3227 for (unsigned int j = 0; j < num_transitions; ++j)
3228 if (merge_state_result *to_res = sinfo2->to_states[j].res)
3230 /* Count the target state as part of this pattern.
3231 First update the root position so that it can reach
3232 the target state's root. */
3233 if (to_res->root)
3235 if (new_res2->root)
3236 new_res2->root = common_position (new_res2->root,
3237 to_res->root);
3238 else
3239 new_res2->root = to_res->root;
3241 merge_pattern_info *to_pat = to_res->pattern;
3242 merge_pattern_transition *ptrans
3243 = new merge_pattern_transition (to_pat);
3245 /* TO_PAT may have acquired more parameters when matching
3246 states earlier in STATES than TO_RES's, but the list is
3247 now final. Make sure that TO_RES is up to date. */
3248 update_parameters (to_res->params, to_pat->params);
3250 /* Start out by assuming that every user of NEW_PAT will
3251 want to pass the same (constant) parameters as TO_RES. */
3252 update_parameters (ptrans->params, to_res->params);
3254 new_pat->transitions[j] = ptrans;
3255 new_pat->num_statements += to_pat->num_statements;
3256 new_pat->num_results += to_pat->num_results;
3258 else
3259 /* The target state doesn't match anything and so is not part
3260 of the pattern. */
3261 new_pat->num_results += 1;
3263 /* See if any earlier states that match RES2's pattern also match
3264 NEW_PAT. */
3265 bool matched_p = false;
3266 for (merge_state_info *sinfo1 = sinfo2->prev_same_test; sinfo1;
3267 sinfo1 = sinfo1->prev_same_test)
3269 prune_invalid_results (sinfo1);
3270 if (sinfo1->res
3271 && sinfo1->res->pattern == res2->pattern
3272 && merge_patterns (sinfo1, sinfo2))
3273 matched_p = true;
3275 if (!matched_p)
3277 /* Nothing else matches NEW_PAT, so go back to the previous
3278 pattern (possibly just a single-state one). */
3279 sinfo2->res = res2;
3280 delete new_pat;
3281 delete new_res2;
3283 /* Assume that SINFO2 will use RES. At this point we don't know
3284 whether earlier states that match the same pattern will use
3285 that match or a different one. */
3286 sinfo2->res->pattern->num_users += 1;
3288 /* Step 4: Finalize the choice of pattern for each state, ignoring
3289 patterns that were only used once. Update each pattern's size
3290 so that it doesn't include subpatterns that are going to be split
3291 out into subroutines. */
3292 for (unsigned int i = 0; i < states.length (); ++i)
3294 merge_state_info *sinfo = &states[i];
3295 merge_state_result *res = sinfo->res;
3296 /* Wind past patterns that are only used by SINFO. */
3297 while (res && res->pattern->num_users == 1)
3299 res = res->prev;
3300 sinfo->res = res;
3301 if (res)
3302 res->pattern->num_users += 1;
3304 if (!res)
3305 continue;
3307 /* We have a shared pattern and are now committed to the match. */
3308 merge_pattern_info *pat = res->pattern;
3309 gcc_assert (valid_result_p (pat, sinfo));
3311 if (!pat->complete_p)
3313 /* Look for subpatterns that are going to be split out and remove
3314 them from the number of statements. */
3315 for (unsigned int j = 0; j < sinfo->num_transitions; ++j)
3316 if (merge_pattern_transition *ptrans = pat->transitions[j])
3318 merge_pattern_info *to_pat = ptrans->to;
3319 if (!same_pattern_p (pat, to_pat))
3320 pat->num_statements -= to_pat->num_statements;
3322 pat->complete_p = true;
3325 /* Step 5: Split out the patterns. */
3326 for (unsigned int i = 0; i < states.length (); ++i)
3328 merge_state_info *sinfo = &states[i];
3329 merge_state_result *res = sinfo->res;
3330 if (!sinfo->merged_p && res && useful_pattern_p (res->pattern))
3331 use_pattern (sinfo);
3333 fprintf (stderr, "Shared %d out of %d states by creating %d new states,"
3334 " saving %d\n",
3335 pattern_use_states, states.length (), pattern_def_states,
3336 pattern_use_states - pattern_def_states);
3339 /* Information about a state tree that we're considering splitting into a
3340 subroutine. */
3341 struct state_size
3343 /* The number of pseudo-statements in the state tree. */
3344 unsigned int num_statements;
3346 /* The approximate number of nested "if" and "switch" statements that
3347 would be required if control could fall through to a later state. */
3348 unsigned int depth;
3351 /* Pairs a transition with information about its target state. */
3352 typedef std::pair <transition *, state_size> subroutine_candidate;
3354 /* Sort two subroutine_candidates so that the one with the largest
3355 number of statements comes last. */
3357 static int
3358 subroutine_candidate_cmp (const void *a, const void *b)
3360 return int (((const subroutine_candidate *) a)->second.num_statements
3361 - ((const subroutine_candidate *) b)->second.num_statements);
3364 /* Turn S into a subroutine of type TYPE and add it to PROCS. Return a new
3365 state that performs a subroutine call to S. */
3367 static state *
3368 create_subroutine (routine_type type, state *s, vec <state *> &procs)
3370 procs.safe_push (s);
3371 acceptance_type acceptance;
3372 acceptance.type = type;
3373 acceptance.partial_p = true;
3374 acceptance.u.subroutine_id = procs.length ();
3375 state *news = new state;
3376 add_decision (news, rtx_test::accept (acceptance), true, false);
3377 return news;
3380 /* Walk state tree S, of type TYPE, and look for subtrees that would be
3381 better split into subroutines. Accumulate all such subroutines in PROCS.
3382 Return the size of the new state tree (excluding subroutines). */
3384 static state_size
3385 find_subroutines (routine_type type, state *s, vec <state *> &procs)
3387 auto_vec <subroutine_candidate, 16> candidates;
3388 state_size size;
3389 size.num_statements = 0;
3390 size.depth = 0;
3391 for (decision *d = s->first; d; d = d->next)
3393 if (!d->test.single_outcome_p ())
3394 size.num_statements += 1;
3395 for (transition *trans = d->first; trans; trans = trans->next)
3397 /* Keep chains of simple decisions together if we know that no
3398 change of position is required. We'll output this chain as a
3399 single "if" statement, so it counts as a single nesting level. */
3400 if (d->test.pos && d->if_statement_p ())
3401 for (;;)
3403 decision *newd = trans->to->singleton ();
3404 if (!newd
3405 || (newd->test.pos
3406 && newd->test.pos_operand < 0
3407 && newd->test.pos != d->test.pos)
3408 || !newd->if_statement_p ())
3409 break;
3410 if (!newd->test.single_outcome_p ())
3411 size.num_statements += 1;
3412 trans = newd->singleton ();
3413 if (newd->test.kind == rtx_test::SET_OP
3414 || newd->test.kind == rtx_test::ACCEPT)
3415 break;
3417 /* The target of TRANS is a subroutine candidate. First recurse
3418 on it to see how big it is after subroutines have been
3419 split out. */
3420 state_size to_size = find_subroutines (type, trans->to, procs);
3421 if (d->next && to_size.depth > MAX_DEPTH)
3422 /* Keeping the target state in the same routine would lead
3423 to an excessive nesting of "if" and "switch" statements.
3424 Split it out into a subroutine so that it can use
3425 inverted tests that return early on failure. */
3426 trans->to = create_subroutine (type, trans->to, procs);
3427 else
3429 size.num_statements += to_size.num_statements;
3430 if (to_size.num_statements < MIN_NUM_STATEMENTS)
3431 /* The target state is too small to be worth splitting.
3432 Keep it in the same routine as S. */
3433 size.depth = MAX (size.depth, to_size.depth);
3434 else
3435 /* Assume for now that we'll keep the target state in the
3436 same routine as S, but record it as a subroutine candidate
3437 if S grows too big. */
3438 candidates.safe_push (subroutine_candidate (trans, to_size));
3442 if (size.num_statements > MAX_NUM_STATEMENTS)
3444 /* S is too big. Sort the subroutine candidates so that bigger ones
3445 are nearer the end. */
3446 candidates.qsort (subroutine_candidate_cmp);
3447 while (!candidates.is_empty ()
3448 && size.num_statements > MAX_NUM_STATEMENTS)
3450 /* Peel off a candidate and force it into a subroutine. */
3451 subroutine_candidate cand = candidates.pop ();
3452 size.num_statements -= cand.second.num_statements;
3453 cand.first->to = create_subroutine (type, cand.first->to, procs);
3456 /* Update the depth for subroutine candidates that we decided not to
3457 split out. */
3458 for (unsigned int i = 0; i < candidates.length (); ++i)
3459 size.depth = MAX (size.depth, candidates[i].second.depth);
3460 size.depth += 1;
3461 return size;
3464 /* Return true if, for all X, PRED (X, MODE) implies that X has mode MODE. */
3466 static bool
3467 safe_predicate_mode (const struct pred_data *pred, machine_mode mode)
3469 /* Scalar integer constants have VOIDmode. */
3470 if (GET_MODE_CLASS (mode) == MODE_INT
3471 && (pred->codes[CONST_INT]
3472 || pred->codes[CONST_DOUBLE]
3473 || pred->codes[CONST_WIDE_INT]
3474 || pred->codes[LABEL_REF]))
3475 return false;
3477 return !pred->special && mode != VOIDmode;
3480 /* Fill CODES with the set of codes that could be matched by PRED. */
3482 static void
3483 get_predicate_codes (const struct pred_data *pred, int_set *codes)
3485 for (int i = 0; i < NUM_TRUE_RTX_CODE; ++i)
3486 if (!pred || pred->codes[i])
3487 codes->safe_push (i);
3490 /* Return true if the first path through D1 tests the same thing as D2. */
3492 static bool
3493 has_same_test_p (decision *d1, decision *d2)
3497 if (d1->test == d2->test)
3498 return true;
3499 d1 = d1->first->to->first;
3501 while (d1);
3502 return false;
3505 /* Return true if D1 and D2 cannot match the same rtx. All states reachable
3506 from D2 have single decisions and all those decisions have single
3507 transitions. */
3509 static bool
3510 mutually_exclusive_p (decision *d1, decision *d2)
3512 /* If one path through D1 fails to test the same thing as D2, assume
3513 that D2's test could be true for D1 and look for a later, more useful,
3514 test. This isn't as expensive as it looks in practice. */
3515 while (!has_same_test_p (d1, d2))
3517 d2 = d2->singleton ()->to->singleton ();
3518 if (!d2)
3519 return false;
3521 if (d1->test == d2->test)
3523 /* Look for any transitions from D1 that have the same labels as
3524 the transition from D2. */
3525 transition *trans2 = d2->singleton ();
3526 for (transition *trans1 = d1->first; trans1; trans1 = trans1->next)
3528 int_set::iterator i1 = trans1->labels.begin ();
3529 int_set::iterator end1 = trans1->labels.end ();
3530 int_set::iterator i2 = trans2->labels.begin ();
3531 int_set::iterator end2 = trans2->labels.end ();
3532 while (i1 != end1 && i2 != end2)
3533 if (*i1 < *i2)
3534 ++i1;
3535 else if (*i2 < *i1)
3536 ++i2;
3537 else
3539 /* TRANS1 has some labels in common with TRANS2. Assume
3540 that D1 and D2 could match the same rtx if the target
3541 of TRANS1 could match the same rtx as D2. */
3542 for (decision *subd1 = trans1->to->first;
3543 subd1; subd1 = subd1->next)
3544 if (!mutually_exclusive_p (subd1, d2))
3545 return false;
3546 break;
3549 return true;
3551 for (transition *trans1 = d1->first; trans1; trans1 = trans1->next)
3552 for (decision *subd1 = trans1->to->first; subd1; subd1 = subd1->next)
3553 if (!mutually_exclusive_p (subd1, d2))
3554 return false;
3555 return true;
3558 /* Try to merge S2's decision into D1, given that they have the same test.
3559 Fail only if EXCLUDE is nonnull and the new transition would have the
3560 same labels as *EXCLUDE. When returning true, set *NEXT_S1, *NEXT_S2
3561 and *NEXT_EXCLUDE as for merge_into_state_1, or set *NEXT_S2 to null
3562 if the merge is complete. */
3564 static bool
3565 merge_into_decision (decision *d1, state *s2, const int_set *exclude,
3566 state **next_s1, state **next_s2,
3567 const int_set **next_exclude)
3569 decision *d2 = s2->singleton ();
3570 transition *trans2 = d2->singleton ();
3572 /* Get a list of the transitions that intersect TRANS2. */
3573 auto_vec <transition *, 32> intersecting;
3574 for (transition *trans1 = d1->first; trans1; trans1 = trans1->next)
3576 int_set::iterator i1 = trans1->labels.begin ();
3577 int_set::iterator end1 = trans1->labels.end ();
3578 int_set::iterator i2 = trans2->labels.begin ();
3579 int_set::iterator end2 = trans2->labels.end ();
3580 bool trans1_is_subset = true;
3581 bool trans2_is_subset = true;
3582 bool intersect_p = false;
3583 while (i1 != end1 && i2 != end2)
3584 if (*i1 < *i2)
3586 trans1_is_subset = false;
3587 ++i1;
3589 else if (*i2 < *i1)
3591 trans2_is_subset = false;
3592 ++i2;
3594 else
3596 intersect_p = true;
3597 ++i1;
3598 ++i2;
3600 if (i1 != end1)
3601 trans1_is_subset = false;
3602 if (i2 != end2)
3603 trans2_is_subset = false;
3604 if (trans1_is_subset && trans2_is_subset)
3606 /* There's already a transition that matches exactly.
3607 Merge the target states. */
3608 trans1->optional &= trans2->optional;
3609 *next_s1 = trans1->to;
3610 *next_s2 = trans2->to;
3611 *next_exclude = 0;
3612 return true;
3614 if (trans2_is_subset)
3616 /* TRANS1 has all the labels that TRANS2 needs. Merge S2 into
3617 the target of TRANS1, but (to avoid infinite recursion)
3618 make sure that we don't end up creating another transition
3619 like TRANS1. */
3620 *next_s1 = trans1->to;
3621 *next_s2 = s2;
3622 *next_exclude = &trans1->labels;
3623 return true;
3625 if (intersect_p)
3626 intersecting.safe_push (trans1);
3629 if (intersecting.is_empty ())
3631 /* No existing labels intersect the new ones. We can just add
3632 TRANS2 itself. */
3633 d1->push_back (d2->release ());
3634 *next_s1 = 0;
3635 *next_s2 = 0;
3636 *next_exclude = 0;
3637 return true;
3640 /* Take the union of the labels in INTERSECTING and TRANS2. Store the
3641 result in COMBINED and use NEXT as a temporary. */
3642 int_set tmp1 = trans2->labels, tmp2;
3643 int_set *combined = &tmp1, *next = &tmp2;
3644 for (unsigned int i = 0; i < intersecting.length (); ++i)
3646 transition *trans1 = intersecting[i];
3647 next->truncate (0);
3648 next->safe_grow (trans1->labels.length () + combined->length ());
3649 int_set::iterator end
3650 = std::set_union (trans1->labels.begin (), trans1->labels.end (),
3651 combined->begin (), combined->end (),
3652 next->begin ());
3653 next->truncate (end - next->begin ());
3654 std::swap (next, combined);
3657 /* Stop now if we've been told not to create a transition with these
3658 labels. */
3659 if (exclude && *combined == *exclude)
3660 return false;
3662 /* Get the transition that should carry the new labels. */
3663 transition *new_trans = intersecting[0];
3664 if (intersecting.length () == 1)
3666 /* We're merging with one existing transition whose labels are a
3667 subset of those required. If both transitions are optional,
3668 we can just expand the set of labels so that it's suitable
3669 for both transitions. It isn't worth preserving the original
3670 transitions since we know that they can't be merged; we would
3671 need to backtrack to S2 if TRANS1->to fails. In contrast,
3672 we might be able to merge the targets of the transitions
3673 without any backtracking.
3675 If instead the existing transition is not optional, ensure that
3676 all target decisions are suitably protected. Some decisions
3677 might already have a more specific requirement than NEW_TRANS,
3678 in which case there's no point testing NEW_TRANS as well. E.g. this
3679 would have happened if a test for an (eq ...) rtx had been
3680 added to a decision that tested whether the code is suitable
3681 for comparison_operator. The original comparison_operator
3682 transition would have been non-optional and the (eq ...) test
3683 would be performed by a second decision in the target of that
3684 transition.
3686 The remaining case -- keeping the original optional transition
3687 when adding a non-optional TRANS2 -- is a wash. Preserving
3688 the optional transition only helps if we later merge another
3689 state S3 that is mutually exclusive with S2 and whose labels
3690 belong to *COMBINED - TRANS1->labels. We can then test the
3691 original NEW_TRANS and S3 in the same decision. We keep the
3692 optional transition around for that case, but it occurs very
3693 rarely. */
3694 gcc_assert (new_trans->labels != *combined);
3695 if (!new_trans->optional || !trans2->optional)
3697 decision *start = 0;
3698 for (decision *end = new_trans->to->first; end; end = end->next)
3700 if (!start && end->test != d1->test)
3701 /* END belongs to a range of decisions that need to be
3702 protected by NEW_TRANS. */
3703 start = end;
3704 if (start && (!end->next || end->next->test == d1->test))
3706 /* Protect [START, END] with NEW_TRANS. The decisions
3707 move to NEW_S and NEW_D becomes part of NEW_TRANS->to. */
3708 state *new_s = new state;
3709 decision *new_d = new decision (d1->test);
3710 new_d->push_back (new transition (new_trans->labels, new_s,
3711 new_trans->optional));
3712 state::range r (start, end);
3713 new_trans->to->replace (r, new_d);
3714 new_s->push_back (r);
3716 /* Continue with an empty range. */
3717 start = 0;
3719 /* Continue from the decision after NEW_D. */
3720 end = new_d;
3724 new_trans->optional = true;
3725 new_trans->labels = *combined;
3727 else
3729 /* We're merging more than one existing transition together.
3730 Those transitions are successfully dividing the matching space
3731 and so we want to preserve them, even if they're optional.
3733 Create a new transition with the union set of labels and make
3734 it go to a state that has the original transitions. */
3735 decision *new_d = new decision (d1->test);
3736 for (unsigned int i = 0; i < intersecting.length (); ++i)
3737 new_d->push_back (d1->remove (intersecting[i]));
3739 state *new_s = new state;
3740 new_s->push_back (new_d);
3742 new_trans = new transition (*combined, new_s, true);
3743 d1->push_back (new_trans);
3746 /* We now have an optional transition with labels *COMBINED. Decide
3747 whether we can use it as TRANS2 or whether we need to merge S2
3748 into the target of NEW_TRANS. */
3749 gcc_assert (new_trans->optional);
3750 if (new_trans->labels == trans2->labels)
3752 /* NEW_TRANS matches TRANS2. Just merge the target states. */
3753 new_trans->optional = trans2->optional;
3754 *next_s1 = new_trans->to;
3755 *next_s2 = trans2->to;
3756 *next_exclude = 0;
3758 else
3760 /* Try to merge TRANS2 into the target of the overlapping transition,
3761 but (to prevent infinite recursion or excessive redundancy) without
3762 creating another transition of the same type. */
3763 *next_s1 = new_trans->to;
3764 *next_s2 = s2;
3765 *next_exclude = &new_trans->labels;
3767 return true;
3770 /* Make progress in merging S2 into S1, given that each state in S2
3771 has a single decision. If EXCLUDE is nonnull, avoid creating a new
3772 transition with the same test as S2's decision and with the labels
3773 in *EXCLUDE.
3775 Return true if there is still work to do. When returning true,
3776 set *NEXT_S1, *NEXT_S2 and *NEXT_EXCLUDE to the values that
3777 S1, S2 and EXCLUDE should have next time round.
3779 If S1 and S2 both match a particular rtx, give priority to S1. */
3781 static bool
3782 merge_into_state_1 (state *s1, state *s2, const int_set *exclude,
3783 state **next_s1, state **next_s2,
3784 const int_set **next_exclude)
3786 decision *d2 = s2->singleton ();
3787 if (decision *d1 = s1->last)
3789 if (d1->test.terminal_p ())
3790 /* D1 is an unconditional return, so S2 can never match. This can
3791 sometimes be a bug in the .md description, but might also happen
3792 if genconditions forces some conditions to true for certain
3793 configurations. */
3794 return false;
3796 /* Go backwards through the decisions in S1, stopping once we find one
3797 that could match the same thing as S2. */
3798 while (d1->prev && mutually_exclusive_p (d1, d2))
3799 d1 = d1->prev;
3801 /* Search forwards from that point, merging D2 into the first
3802 decision we can. */
3803 for (; d1; d1 = d1->next)
3805 /* If S2 performs some optional tests before testing the same thing
3806 as D1, those tests do not help to distinguish D1 and S2, so it's
3807 better to drop them. Search through such optional decisions
3808 until we find something that tests the same thing as D1. */
3809 state *sub_s2 = s2;
3810 for (;;)
3812 decision *sub_d2 = sub_s2->singleton ();
3813 if (d1->test == sub_d2->test)
3815 /* Only apply EXCLUDE if we're testing the same thing
3816 as D2. */
3817 const int_set *sub_exclude = (d2 == sub_d2 ? exclude : 0);
3819 /* Try to merge SUB_S2 into D1. This can only fail if
3820 it would involve creating a new transition with
3821 labels SUB_EXCLUDE. */
3822 if (merge_into_decision (d1, sub_s2, sub_exclude,
3823 next_s1, next_s2, next_exclude))
3824 return *next_s2 != 0;
3826 /* Can't merge with D1; try a later decision. */
3827 break;
3829 transition *sub_trans2 = sub_d2->singleton ();
3830 if (!sub_trans2->optional)
3831 /* Can't merge with D1; try a later decision. */
3832 break;
3833 sub_s2 = sub_trans2->to;
3838 /* We can't merge D2 with any existing decision. Just add it to the end. */
3839 s1->push_back (s2->release ());
3840 return false;
3843 /* Merge S2 into S1. If they both match a particular rtx, give
3844 priority to S1. Each state in S2 has a single decision. */
3846 static void
3847 merge_into_state (state *s1, state *s2)
3849 const int_set *exclude = 0;
3850 while (s2 && merge_into_state_1 (s1, s2, exclude, &s1, &s2, &exclude))
3851 continue;
3854 /* Pairs a pattern that needs to be matched with the rtx position at
3855 which the pattern should occur. */
3856 struct pattern_pos {
3857 pattern_pos () {}
3858 pattern_pos (rtx, position *);
3860 rtx pattern;
3861 position *pos;
3864 pattern_pos::pattern_pos (rtx pattern_in, position *pos_in)
3865 : pattern (pattern_in), pos (pos_in)
3868 /* Compare entries according to their depth-first order. There shouldn't
3869 be two entries at the same position. */
3871 bool
3872 operator < (const pattern_pos &e1, const pattern_pos &e2)
3874 int diff = compare_positions (e1.pos, e2.pos);
3875 gcc_assert (diff != 0 || e1.pattern == e2.pattern);
3876 return diff < 0;
3879 /* Add new decisions to S that check whether the rtx at position POS
3880 matches PATTERN. Return the state that is reached in that case.
3881 TOP_PATTERN is the overall pattern, as passed to match_pattern_1. */
3883 static state *
3884 match_pattern_2 (state *s, md_rtx_info *info, position *pos, rtx pattern)
3886 auto_vec <pattern_pos, 32> worklist;
3887 auto_vec <pattern_pos, 32> pred_and_mode_tests;
3888 auto_vec <pattern_pos, 32> dup_tests;
3890 worklist.safe_push (pattern_pos (pattern, pos));
3891 while (!worklist.is_empty ())
3893 pattern_pos next = worklist.pop ();
3894 pattern = next.pattern;
3895 pos = next.pos;
3896 unsigned int reverse_s = worklist.length ();
3898 enum rtx_code code = GET_CODE (pattern);
3899 switch (code)
3901 case MATCH_OP_DUP:
3902 case MATCH_DUP:
3903 case MATCH_PAR_DUP:
3904 /* Add a test that the rtx matches the earlier one, but only
3905 after the structure and predicates have been checked. */
3906 dup_tests.safe_push (pattern_pos (pattern, pos));
3908 /* Use the same code check as the original operand. */
3909 pattern = find_operand (info->def, XINT (pattern, 0), NULL_RTX);
3910 /* Fall through. */
3912 case MATCH_PARALLEL:
3913 case MATCH_OPERAND:
3914 case MATCH_SCRATCH:
3915 case MATCH_OPERATOR:
3917 const char *pred_name = predicate_name (pattern);
3918 const struct pred_data *pred = 0;
3919 if (pred_name[0] != 0)
3921 pred = lookup_predicate (pred_name);
3922 /* Only report errors once per rtx. */
3923 if (code == GET_CODE (pattern))
3925 if (!pred)
3926 error_at (info->loc, "unknown predicate '%s' used in %s",
3927 pred_name, GET_RTX_NAME (code));
3928 else if (code == MATCH_PARALLEL
3929 && pred->singleton != PARALLEL)
3930 error_at (info->loc, "predicate '%s' used in"
3931 " match_parallel does not allow only PARALLEL",
3932 pred->name);
3936 if (code == MATCH_PARALLEL || code == MATCH_PAR_DUP)
3938 /* Check that we have a parallel with enough elements. */
3939 s = add_decision (s, rtx_test::code (pos), PARALLEL, false);
3940 int min_len = XVECLEN (pattern, 2);
3941 s = add_decision (s, rtx_test::veclen_ge (pos, min_len),
3942 true, false);
3944 else
3946 /* Check that the rtx has one of codes accepted by the
3947 predicate. This is necessary when matching suboperands
3948 of a MATCH_OPERATOR or MATCH_OP_DUP, since we can't
3949 call XEXP (X, N) without checking that X has at least
3950 N+1 operands. */
3951 int_set codes;
3952 get_predicate_codes (pred, &codes);
3953 bool need_codes = (pred
3954 && (code == MATCH_OPERATOR
3955 || code == MATCH_OP_DUP));
3956 s = add_decision (s, rtx_test::code (pos), codes, !need_codes);
3959 /* Postpone the predicate check until we've checked the rest
3960 of the rtx structure. */
3961 if (code == GET_CODE (pattern))
3962 pred_and_mode_tests.safe_push (pattern_pos (pattern, pos));
3964 /* If we need to match suboperands, add them to the worklist. */
3965 if (code == MATCH_OPERATOR || code == MATCH_PARALLEL)
3967 position **subpos_ptr;
3968 enum position_type pos_type;
3969 int i;
3970 if (code == MATCH_OPERATOR || code == MATCH_OP_DUP)
3972 pos_type = POS_XEXP;
3973 subpos_ptr = &pos->xexps;
3974 i = (code == MATCH_OPERATOR ? 2 : 1);
3976 else
3978 pos_type = POS_XVECEXP0;
3979 subpos_ptr = &pos->xvecexp0s;
3980 i = 2;
3982 for (int j = 0; j < XVECLEN (pattern, i); ++j)
3984 position *subpos = next_position (subpos_ptr, pos,
3985 pos_type, j);
3986 worklist.safe_push (pattern_pos (XVECEXP (pattern, i, j),
3987 subpos));
3988 subpos_ptr = &subpos->next;
3991 break;
3994 default:
3996 /* Check that the rtx has the right code. */
3997 s = add_decision (s, rtx_test::code (pos), code, false);
3999 /* Queue a test for the mode if one is specified. */
4000 if (GET_MODE (pattern) != VOIDmode)
4001 pred_and_mode_tests.safe_push (pattern_pos (pattern, pos));
4003 /* Push subrtxes onto the worklist. Match nonrtx operands now. */
4004 const char *fmt = GET_RTX_FORMAT (code);
4005 position **subpos_ptr = &pos->xexps;
4006 for (size_t i = 0; fmt[i]; ++i)
4008 position *subpos = next_position (subpos_ptr, pos,
4009 POS_XEXP, i);
4010 switch (fmt[i])
4012 case 'e': case 'u':
4013 worklist.safe_push (pattern_pos (XEXP (pattern, i),
4014 subpos));
4015 break;
4017 case 'E':
4019 /* Make sure the vector has the right number of
4020 elements. */
4021 int length = XVECLEN (pattern, i);
4022 s = add_decision (s, rtx_test::veclen (pos),
4023 length, false);
4025 position **subpos2_ptr = &pos->xvecexp0s;
4026 for (int j = 0; j < length; j++)
4028 position *subpos2 = next_position (subpos2_ptr, pos,
4029 POS_XVECEXP0, j);
4030 rtx x = XVECEXP (pattern, i, j);
4031 worklist.safe_push (pattern_pos (x, subpos2));
4032 subpos2_ptr = &subpos2->next;
4034 break;
4037 case 'i':
4038 /* Make sure that XINT (X, I) has the right value. */
4039 s = add_decision (s, rtx_test::int_field (pos, i),
4040 XINT (pattern, i), false);
4041 break;
4043 case 'r':
4044 /* Make sure that REGNO (X) has the right value. */
4045 gcc_assert (i == 0);
4046 s = add_decision (s, rtx_test::regno_field (pos),
4047 REGNO (pattern), false);
4048 break;
4050 case 'w':
4051 /* Make sure that XWINT (X, I) has the right value. */
4052 s = add_decision (s, rtx_test::wide_int_field (pos, i),
4053 XWINT (pattern, 0), false);
4054 break;
4056 case 'p':
4057 /* We don't have a way of parsing polynomial offsets yet,
4058 and hopefully never will. */
4059 s = add_decision (s, rtx_test::subreg_field (pos),
4060 SUBREG_BYTE (pattern).to_constant (),
4061 false);
4062 break;
4064 case '0':
4065 break;
4067 default:
4068 gcc_unreachable ();
4070 subpos_ptr = &subpos->next;
4073 break;
4075 /* Operands are pushed onto the worklist so that later indices are
4076 nearer the top. That's what we want for SETs, since a SET_SRC
4077 is a better discriminator than a SET_DEST. In other cases it's
4078 usually better to match earlier indices first. This is especially
4079 true of PARALLELs, where the first element tends to be the most
4080 individual. It's also true for commutative operators, where the
4081 canonicalization rules say that the more complex operand should
4082 come first. */
4083 if (code != SET && worklist.length () > reverse_s)
4084 std::reverse (&worklist[0] + reverse_s,
4085 &worklist[0] + worklist.length ());
4088 /* Sort the predicate and mode tests so that they're in depth-first order.
4089 The main goal of this is to put SET_SRC match_operands after SET_DEST
4090 match_operands and after mode checks for the enclosing SET_SRC operators
4091 (such as the mode of a PLUS in an addition instruction). The latter
4092 two types of test can determine the mode exactly, whereas a SET_SRC
4093 match_operand often has to cope with the possibility of the operand
4094 being a modeless constant integer. E.g. something that matches
4095 register_operand (x, SImode) never matches register_operand (x, DImode),
4096 but a const_int that matches immediate_operand (x, SImode) also matches
4097 immediate_operand (x, DImode). The register_operand cases can therefore
4098 be distinguished by a switch on the mode, but the immediate_operand
4099 cases can't. */
4100 if (pred_and_mode_tests.length () > 1)
4101 std::sort (&pred_and_mode_tests[0],
4102 &pred_and_mode_tests[0] + pred_and_mode_tests.length ());
4104 /* Add the mode and predicate tests. */
4105 pattern_pos *e;
4106 unsigned int i;
4107 FOR_EACH_VEC_ELT (pred_and_mode_tests, i, e)
4109 switch (GET_CODE (e->pattern))
4111 case MATCH_PARALLEL:
4112 case MATCH_OPERAND:
4113 case MATCH_SCRATCH:
4114 case MATCH_OPERATOR:
4116 int opno = XINT (e->pattern, 0);
4117 num_operands = MAX (num_operands, opno + 1);
4118 const char *pred_name = predicate_name (e->pattern);
4119 if (pred_name[0])
4121 const struct pred_data *pred = lookup_predicate (pred_name);
4122 /* Check the mode first, to distinguish things like SImode
4123 and DImode register_operands, as described above. */
4124 machine_mode mode = GET_MODE (e->pattern);
4125 if (pred && safe_predicate_mode (pred, mode))
4126 s = add_decision (s, rtx_test::mode (e->pos), mode, true);
4128 /* Assign to operands[] first, so that the rtx usually doesn't
4129 need to be live across the call to the predicate.
4131 This shouldn't cause a problem with dirtying the page,
4132 since we fully expect to assign to operands[] at some point,
4133 and since the caller usually writes to other parts of
4134 recog_data anyway. */
4135 s = add_decision (s, rtx_test::set_op (e->pos, opno),
4136 true, false);
4137 s = add_decision (s, rtx_test::predicate (e->pos, pred, mode),
4138 true, false);
4140 else
4141 /* Historically we've ignored the mode when there's no
4142 predicate. Just set up operands[] unconditionally. */
4143 s = add_decision (s, rtx_test::set_op (e->pos, opno),
4144 true, false);
4145 break;
4148 default:
4149 s = add_decision (s, rtx_test::mode (e->pos),
4150 GET_MODE (e->pattern), false);
4151 break;
4155 /* Finally add rtx_equal_p checks for duplicated operands. */
4156 FOR_EACH_VEC_ELT (dup_tests, i, e)
4157 s = add_decision (s, rtx_test::duplicate (e->pos, XINT (e->pattern, 0)),
4158 true, false);
4159 return s;
4162 /* Add new decisions to S that make it return ACCEPTANCE if:
4164 (1) the rtx doesn't match anything already matched by S
4165 (2) the rtx matches TOP_PATTERN and
4166 (3) the C test required by INFO->def is true
4168 For peephole2, TOP_PATTERN is a SEQUENCE of the instruction patterns
4169 to match, otherwise it is a single instruction pattern. */
4171 static void
4172 match_pattern_1 (state *s, md_rtx_info *info, rtx pattern,
4173 acceptance_type acceptance)
4175 if (acceptance.type == PEEPHOLE2)
4177 /* Match each individual instruction. */
4178 position **subpos_ptr = &peep2_insn_pos_list;
4179 int count = 0;
4180 for (int i = 0; i < XVECLEN (pattern, 0); ++i)
4182 rtx x = XVECEXP (pattern, 0, i);
4183 position *subpos = next_position (subpos_ptr, &root_pos,
4184 POS_PEEP2_INSN, count);
4185 if (count > 0)
4186 s = add_decision (s, rtx_test::peep2_count (count + 1),
4187 true, false);
4188 s = match_pattern_2 (s, info, subpos, x);
4189 subpos_ptr = &subpos->next;
4190 count += 1;
4192 acceptance.u.full.u.match_len = count - 1;
4194 else
4196 /* Make the rtx itself. */
4197 s = match_pattern_2 (s, info, &root_pos, pattern);
4199 /* If the match is only valid when extra clobbers are added,
4200 make sure we're able to pass that information to the caller. */
4201 if (acceptance.type == RECOG && acceptance.u.full.u.num_clobbers)
4202 s = add_decision (s, rtx_test::have_num_clobbers (), true, false);
4205 /* Make sure that the C test is true. */
4206 const char *c_test = get_c_test (info->def);
4207 if (maybe_eval_c_test (c_test) != 1)
4208 s = add_decision (s, rtx_test::c_test (c_test), true, false);
4210 /* Accept the pattern. */
4211 add_decision (s, rtx_test::accept (acceptance), true, false);
4214 /* Like match_pattern_1, but (if merge_states_p) try to merge the
4215 decisions with what's already in S, to reduce the amount of
4216 backtracking. */
4218 static void
4219 match_pattern (state *s, md_rtx_info *info, rtx pattern,
4220 acceptance_type acceptance)
4222 if (merge_states_p)
4224 state root;
4225 /* Add the decisions to a fresh state and then merge the full tree
4226 into the existing one. */
4227 match_pattern_1 (&root, info, pattern, acceptance);
4228 merge_into_state (s, &root);
4230 else
4231 match_pattern_1 (s, info, pattern, acceptance);
4234 /* Begin the output file. */
4236 static void
4237 write_header (void)
4239 puts ("\
4240 /* Generated automatically by the program `genrecog' from the target\n\
4241 machine description file. */\n\
4243 #define IN_TARGET_CODE 1\n\
4245 #include \"config.h\"\n\
4246 #include \"system.h\"\n\
4247 #include \"coretypes.h\"\n\
4248 #include \"backend.h\"\n\
4249 #include \"predict.h\"\n\
4250 #include \"rtl.h\"\n\
4251 #include \"memmodel.h\"\n\
4252 #include \"tm_p.h\"\n\
4253 #include \"emit-rtl.h\"\n\
4254 #include \"insn-config.h\"\n\
4255 #include \"recog.h\"\n\
4256 #include \"output.h\"\n\
4257 #include \"flags.h\"\n\
4258 #include \"df.h\"\n\
4259 #include \"resource.h\"\n\
4260 #include \"diagnostic-core.h\"\n\
4261 #include \"reload.h\"\n\
4262 #include \"regs.h\"\n\
4263 #include \"tm-constrs.h\"\n\
4264 \n");
4266 puts ("\n\
4267 /* `recog' contains a decision tree that recognizes whether the rtx\n\
4268 X0 is a valid instruction.\n\
4270 recog returns -1 if the rtx is not valid. If the rtx is valid, recog\n\
4271 returns a nonnegative number which is the insn code number for the\n\
4272 pattern that matched. This is the same as the order in the machine\n\
4273 description of the entry that matched. This number can be used as an\n\
4274 index into `insn_data' and other tables.\n");
4275 puts ("\
4276 The third parameter to recog is an optional pointer to an int. If\n\
4277 present, recog will accept a pattern if it matches except for missing\n\
4278 CLOBBER expressions at the end. In that case, the value pointed to by\n\
4279 the optional pointer will be set to the number of CLOBBERs that need\n\
4280 to be added (it should be initialized to zero by the caller). If it");
4281 puts ("\
4282 is set nonzero, the caller should allocate a PARALLEL of the\n\
4283 appropriate size, copy the initial entries, and call add_clobbers\n\
4284 (found in insn-emit.c) to fill in the CLOBBERs.\n\
4287 puts ("\n\
4288 The function split_insns returns 0 if the rtl could not\n\
4289 be split or the split rtl as an INSN list if it can be.\n\
4291 The function peephole2_insns returns 0 if the rtl could not\n\
4292 be matched. If there was a match, the new rtl is returned in an INSN list,\n\
4293 and LAST_INSN will point to the last recognized insn in the old sequence.\n\
4294 */\n\n");
4297 /* Return the C type of a parameter with type TYPE. */
4299 static const char *
4300 parameter_type_string (parameter::type_enum type)
4302 switch (type)
4304 case parameter::UNSET:
4305 break;
4307 case parameter::CODE:
4308 return "rtx_code";
4310 case parameter::MODE:
4311 return "machine_mode";
4313 case parameter::INT:
4314 return "int";
4316 case parameter::UINT:
4317 return "unsigned int";
4319 case parameter::WIDE_INT:
4320 return "HOST_WIDE_INT";
4322 gcc_unreachable ();
4325 /* Return true if ACCEPTANCE requires only a single C statement even in
4326 a backtracking context. */
4328 static bool
4329 single_statement_p (const acceptance_type &acceptance)
4331 if (acceptance.partial_p)
4332 /* We need to handle failures of the subroutine. */
4333 return false;
4334 switch (acceptance.type)
4336 case SUBPATTERN:
4337 case SPLIT:
4338 return true;
4340 case RECOG:
4341 /* False if we need to assign to pnum_clobbers. */
4342 return acceptance.u.full.u.num_clobbers == 0;
4344 case PEEPHOLE2:
4345 /* We need to assign to pmatch_len_ and handle null returns from the
4346 peephole2 routine. */
4347 return false;
4349 gcc_unreachable ();
4352 /* Return the C failure value for a routine of type TYPE. */
4354 static const char *
4355 get_failure_return (routine_type type)
4357 switch (type)
4359 case SUBPATTERN:
4360 case RECOG:
4361 return "-1";
4363 case SPLIT:
4364 case PEEPHOLE2:
4365 return "NULL";
4367 gcc_unreachable ();
4370 /* Indicates whether a block of code always returns or whether it can fall
4371 through. */
4373 enum exit_state {
4374 ES_RETURNED,
4375 ES_FALLTHROUGH
4378 /* Information used while writing out code. */
4380 struct output_state
4382 /* The type of routine that we're generating. */
4383 routine_type type;
4385 /* Maps position ids to xN variable numbers. The entry is only valid if
4386 it is less than the length of VAR_TO_ID, but this holds for every position
4387 tested by a state when writing out that state. */
4388 auto_vec <unsigned int> id_to_var;
4390 /* Maps xN variable numbers to position ids. */
4391 auto_vec <unsigned int> var_to_id;
4393 /* Index N is true if variable xN has already been set. */
4394 auto_vec <bool> seen_vars;
4397 /* Return true if D is a call to a pattern routine and if there is some X
4398 such that the transition for pattern result N goes to a successful return
4399 with code X+N. When returning true, set *BASE_OUT to this X and *COUNT_OUT
4400 to the number of return values. (We know that every PATTERN decision has
4401 a transition for every successful return.) */
4403 static bool
4404 terminal_pattern_p (decision *d, unsigned int *base_out,
4405 unsigned int *count_out)
4407 if (d->test.kind != rtx_test::PATTERN)
4408 return false;
4409 unsigned int base = 0;
4410 unsigned int count = 0;
4411 for (transition *trans = d->first; trans; trans = trans->next)
4413 if (trans->is_param || trans->labels.length () != 1)
4414 return false;
4415 decision *subd = trans->to->singleton ();
4416 if (!subd || subd->test.kind != rtx_test::ACCEPT)
4417 return false;
4418 unsigned int this_base = (subd->test.u.acceptance.u.full.code
4419 - trans->labels[0]);
4420 if (trans == d->first)
4421 base = this_base;
4422 else if (base != this_base)
4423 return false;
4424 count += 1;
4426 *base_out = base;
4427 *count_out = count;
4428 return true;
4431 /* Return true if TEST doesn't test an rtx or if the rtx it tests is
4432 already available in state OS. */
4434 static bool
4435 test_position_available_p (output_state *os, const rtx_test &test)
4437 return (!test.pos
4438 || test.pos_operand >= 0
4439 || os->seen_vars[os->id_to_var[test.pos->id]]);
4442 /* Like printf, but print INDENT spaces at the beginning. */
4444 static void ATTRIBUTE_PRINTF_2
4445 printf_indent (unsigned int indent, const char *format, ...)
4447 va_list ap;
4448 va_start (ap, format);
4449 printf ("%*s", indent, "");
4450 vprintf (format, ap);
4451 va_end (ap);
4454 /* Emit code to initialize the variable associated with POS, if it isn't
4455 already valid in state OS. Indent each line by INDENT spaces. Update
4456 OS with the new state. */
4458 static void
4459 change_state (output_state *os, position *pos, unsigned int indent)
4461 unsigned int var = os->id_to_var[pos->id];
4462 gcc_assert (var < os->var_to_id.length () && os->var_to_id[var] == pos->id);
4463 if (os->seen_vars[var])
4464 return;
4465 switch (pos->type)
4467 case POS_PEEP2_INSN:
4468 printf_indent (indent, "x%d = PATTERN (peep2_next_insn (%d));\n",
4469 var, pos->arg);
4470 break;
4472 case POS_XEXP:
4473 change_state (os, pos->base, indent);
4474 printf_indent (indent, "x%d = XEXP (x%d, %d);\n",
4475 var, os->id_to_var[pos->base->id], pos->arg);
4476 break;
4478 case POS_XVECEXP0:
4479 change_state (os, pos->base, indent);
4480 printf_indent (indent, "x%d = XVECEXP (x%d, 0, %d);\n",
4481 var, os->id_to_var[pos->base->id], pos->arg);
4482 break;
4484 os->seen_vars[var] = true;
4487 /* Print the enumerator constant for CODE -- the upcase version of
4488 the name. */
4490 static void
4491 print_code (enum rtx_code code)
4493 const char *p;
4494 for (p = GET_RTX_NAME (code); *p; p++)
4495 putchar (TOUPPER (*p));
4498 /* Emit a uint64_t as an integer constant expression. We need to take
4499 special care to avoid "decimal constant is so large that it is unsigned"
4500 warnings in the resulting code. */
4502 static void
4503 print_host_wide_int (uint64_t val)
4505 uint64_t min = uint64_t (1) << (HOST_BITS_PER_WIDE_INT - 1);
4506 if (val == min)
4507 printf ("(" HOST_WIDE_INT_PRINT_DEC_C " - 1)", val + 1);
4508 else
4509 printf (HOST_WIDE_INT_PRINT_DEC_C, val);
4512 /* Print the C expression for actual parameter PARAM. */
4514 static void
4515 print_parameter_value (const parameter &param)
4517 if (param.is_param)
4518 printf ("i%d", (int) param.value + 1);
4519 else
4520 switch (param.type)
4522 case parameter::UNSET:
4523 gcc_unreachable ();
4524 break;
4526 case parameter::CODE:
4527 print_code ((enum rtx_code) param.value);
4528 break;
4530 case parameter::MODE:
4531 printf ("E_%smode", GET_MODE_NAME ((machine_mode) param.value));
4532 break;
4534 case parameter::INT:
4535 printf ("%d", (int) param.value);
4536 break;
4538 case parameter::UINT:
4539 printf ("%u", (unsigned int) param.value);
4540 break;
4542 case parameter::WIDE_INT:
4543 print_host_wide_int (param.value);
4544 break;
4548 /* Print the C expression for the rtx tested by TEST. */
4550 static void
4551 print_test_rtx (output_state *os, const rtx_test &test)
4553 if (test.pos_operand >= 0)
4554 printf ("operands[%d]", test.pos_operand);
4555 else
4556 printf ("x%d", os->id_to_var[test.pos->id]);
4559 /* Print the C expression for non-boolean test TEST. */
4561 static void
4562 print_nonbool_test (output_state *os, const rtx_test &test)
4564 switch (test.kind)
4566 case rtx_test::CODE:
4567 printf ("GET_CODE (");
4568 print_test_rtx (os, test);
4569 printf (")");
4570 break;
4572 case rtx_test::MODE:
4573 printf ("GET_MODE (");
4574 print_test_rtx (os, test);
4575 printf (")");
4576 break;
4578 case rtx_test::VECLEN:
4579 printf ("XVECLEN (");
4580 print_test_rtx (os, test);
4581 printf (", 0)");
4582 break;
4584 case rtx_test::INT_FIELD:
4585 printf ("XINT (");
4586 print_test_rtx (os, test);
4587 printf (", %d)", test.u.opno);
4588 break;
4590 case rtx_test::REGNO_FIELD:
4591 printf ("REGNO (");
4592 print_test_rtx (os, test);
4593 printf (")");
4594 break;
4596 case rtx_test::SUBREG_FIELD:
4597 printf ("SUBREG_BYTE (");
4598 print_test_rtx (os, test);
4599 printf (")");
4600 break;
4602 case rtx_test::WIDE_INT_FIELD:
4603 printf ("XWINT (");
4604 print_test_rtx (os, test);
4605 printf (", %d)", test.u.opno);
4606 break;
4608 case rtx_test::PATTERN:
4610 pattern_routine *routine = test.u.pattern->routine;
4611 printf ("pattern%d (", routine->pattern_id);
4612 const char *sep = "";
4613 if (test.pos)
4615 print_test_rtx (os, test);
4616 sep = ", ";
4618 if (routine->insn_p)
4620 printf ("%sinsn", sep);
4621 sep = ", ";
4623 if (routine->pnum_clobbers_p)
4625 printf ("%spnum_clobbers", sep);
4626 sep = ", ";
4628 for (unsigned int i = 0; i < test.u.pattern->params.length (); ++i)
4630 fputs (sep, stdout);
4631 print_parameter_value (test.u.pattern->params[i]);
4632 sep = ", ";
4634 printf (")");
4635 break;
4638 case rtx_test::PEEP2_COUNT:
4639 case rtx_test::VECLEN_GE:
4640 case rtx_test::SAVED_CONST_INT:
4641 case rtx_test::DUPLICATE:
4642 case rtx_test::PREDICATE:
4643 case rtx_test::SET_OP:
4644 case rtx_test::HAVE_NUM_CLOBBERS:
4645 case rtx_test::C_TEST:
4646 case rtx_test::ACCEPT:
4647 gcc_unreachable ();
4651 /* IS_PARAM and LABEL are taken from a transition whose source
4652 decision performs TEST. Print the C code for the label. */
4654 static void
4655 print_label_value (const rtx_test &test, bool is_param, uint64_t value)
4657 print_parameter_value (parameter (transition_parameter_type (test.kind),
4658 is_param, value));
4661 /* If IS_PARAM, print code to compare TEST with the C variable i<VALUE+1>.
4662 If !IS_PARAM, print code to compare TEST with the C constant VALUE.
4663 Test for inequality if INVERT_P, otherwise test for equality. */
4665 static void
4666 print_test (output_state *os, const rtx_test &test, bool is_param,
4667 uint64_t value, bool invert_p)
4669 switch (test.kind)
4671 /* Handle the non-boolean TESTs. */
4672 case rtx_test::CODE:
4673 case rtx_test::MODE:
4674 case rtx_test::VECLEN:
4675 case rtx_test::REGNO_FIELD:
4676 case rtx_test::INT_FIELD:
4677 case rtx_test::WIDE_INT_FIELD:
4678 case rtx_test::PATTERN:
4679 print_nonbool_test (os, test);
4680 printf (" %s ", invert_p ? "!=" : "==");
4681 print_label_value (test, is_param, value);
4682 break;
4684 case rtx_test::SUBREG_FIELD:
4685 printf ("%s (", invert_p ? "maybe_ne" : "known_eq");
4686 print_nonbool_test (os, test);
4687 printf (", ");
4688 print_label_value (test, is_param, value);
4689 printf (")");
4690 break;
4692 case rtx_test::SAVED_CONST_INT:
4693 gcc_assert (!is_param && value == 1);
4694 print_test_rtx (os, test);
4695 printf (" %s const_int_rtx[MAX_SAVED_CONST_INT + ",
4696 invert_p ? "!=" : "==");
4697 print_parameter_value (parameter (parameter::INT,
4698 test.u.integer.is_param,
4699 test.u.integer.value));
4700 printf ("]");
4701 break;
4703 case rtx_test::PEEP2_COUNT:
4704 gcc_assert (!is_param && value == 1);
4705 printf ("peep2_current_count %s %d", invert_p ? "<" : ">=",
4706 test.u.min_len);
4707 break;
4709 case rtx_test::VECLEN_GE:
4710 gcc_assert (!is_param && value == 1);
4711 printf ("XVECLEN (");
4712 print_test_rtx (os, test);
4713 printf (", 0) %s %d", invert_p ? "<" : ">=", test.u.min_len);
4714 break;
4716 case rtx_test::PREDICATE:
4717 gcc_assert (!is_param && value == 1);
4718 printf ("%s%s (", invert_p ? "!" : "", test.u.predicate.data->name);
4719 print_test_rtx (os, test);
4720 printf (", ");
4721 print_parameter_value (parameter (parameter::MODE,
4722 test.u.predicate.mode_is_param,
4723 test.u.predicate.mode));
4724 printf (")");
4725 break;
4727 case rtx_test::DUPLICATE:
4728 gcc_assert (!is_param && value == 1);
4729 printf ("%srtx_equal_p (", invert_p ? "!" : "");
4730 print_test_rtx (os, test);
4731 printf (", operands[%d])", test.u.opno);
4732 break;
4734 case rtx_test::HAVE_NUM_CLOBBERS:
4735 gcc_assert (!is_param && value == 1);
4736 printf ("pnum_clobbers %s NULL", invert_p ? "==" : "!=");
4737 break;
4739 case rtx_test::C_TEST:
4740 gcc_assert (!is_param && value == 1);
4741 if (invert_p)
4742 printf ("!");
4743 rtx_reader_ptr->print_c_condition (test.u.string);
4744 break;
4746 case rtx_test::ACCEPT:
4747 case rtx_test::SET_OP:
4748 gcc_unreachable ();
4752 static exit_state print_decision (output_state *, decision *,
4753 unsigned int, bool);
4755 /* Print code to perform S, indent each line by INDENT spaces.
4756 IS_FINAL is true if there are no fallback decisions to test on failure;
4757 if the state fails then the entire routine fails. */
4759 static exit_state
4760 print_state (output_state *os, state *s, unsigned int indent, bool is_final)
4762 exit_state es = ES_FALLTHROUGH;
4763 for (decision *d = s->first; d; d = d->next)
4764 es = print_decision (os, d, indent, is_final && !d->next);
4765 if (es != ES_RETURNED && is_final)
4767 printf_indent (indent, "return %s;\n", get_failure_return (os->type));
4768 es = ES_RETURNED;
4770 return es;
4773 /* Print the code for subroutine call ACCEPTANCE (for which partial_p
4774 is known to be true). Return the C condition that indicates a successful
4775 match. */
4777 static const char *
4778 print_subroutine_call (const acceptance_type &acceptance)
4780 switch (acceptance.type)
4782 case SUBPATTERN:
4783 gcc_unreachable ();
4785 case RECOG:
4786 printf ("recog_%d (x1, insn, pnum_clobbers)",
4787 acceptance.u.subroutine_id);
4788 return ">= 0";
4790 case SPLIT:
4791 printf ("split_%d (x1, insn)", acceptance.u.subroutine_id);
4792 return "!= NULL_RTX";
4794 case PEEPHOLE2:
4795 printf ("peephole2_%d (x1, insn, pmatch_len_)",
4796 acceptance.u.subroutine_id);
4797 return "!= NULL_RTX";
4799 gcc_unreachable ();
4802 /* Print code for the successful match described by ACCEPTANCE.
4803 INDENT and IS_FINAL are as for print_state. */
4805 static exit_state
4806 print_acceptance (const acceptance_type &acceptance, unsigned int indent,
4807 bool is_final)
4809 if (acceptance.partial_p)
4811 /* Defer the rest of the match to a subroutine. */
4812 if (is_final)
4814 printf_indent (indent, "return ");
4815 print_subroutine_call (acceptance);
4816 printf (";\n");
4817 return ES_RETURNED;
4819 else
4821 printf_indent (indent, "res = ");
4822 const char *res_test = print_subroutine_call (acceptance);
4823 printf (";\n");
4824 printf_indent (indent, "if (res %s)\n", res_test);
4825 printf_indent (indent + 2, "return res;\n");
4826 return ES_FALLTHROUGH;
4829 switch (acceptance.type)
4831 case SUBPATTERN:
4832 printf_indent (indent, "return %d;\n", acceptance.u.full.code);
4833 return ES_RETURNED;
4835 case RECOG:
4836 if (acceptance.u.full.u.num_clobbers != 0)
4837 printf_indent (indent, "*pnum_clobbers = %d;\n",
4838 acceptance.u.full.u.num_clobbers);
4839 printf_indent (indent, "return %d; /* %s */\n", acceptance.u.full.code,
4840 get_insn_name (acceptance.u.full.code));
4841 return ES_RETURNED;
4843 case SPLIT:
4844 printf_indent (indent, "return gen_split_%d (insn, operands);\n",
4845 acceptance.u.full.code);
4846 return ES_RETURNED;
4848 case PEEPHOLE2:
4849 printf_indent (indent, "*pmatch_len_ = %d;\n",
4850 acceptance.u.full.u.match_len);
4851 if (is_final)
4853 printf_indent (indent, "return gen_peephole2_%d (insn, operands);\n",
4854 acceptance.u.full.code);
4855 return ES_RETURNED;
4857 else
4859 printf_indent (indent, "res = gen_peephole2_%d (insn, operands);\n",
4860 acceptance.u.full.code);
4861 printf_indent (indent, "if (res != NULL_RTX)\n");
4862 printf_indent (indent + 2, "return res;\n");
4863 return ES_FALLTHROUGH;
4866 gcc_unreachable ();
4869 /* Print code to perform D. INDENT and IS_FINAL are as for print_state. */
4871 static exit_state
4872 print_decision (output_state *os, decision *d, unsigned int indent,
4873 bool is_final)
4875 uint64_t label;
4876 unsigned int base, count;
4878 /* Make sure the rtx under test is available either in operands[] or
4879 in an xN variable. */
4880 if (d->test.pos && d->test.pos_operand < 0)
4881 change_state (os, d->test.pos, indent);
4883 /* Look for cases where a pattern routine P1 calls another pattern routine
4884 P2 and where P1 returns X + BASE whenever P2 returns X. If IS_FINAL
4885 is true and BASE is zero we can simply use:
4887 return patternN (...);
4889 Otherwise we can use:
4891 res = patternN (...);
4892 if (res >= 0)
4893 return res + BASE;
4895 However, if BASE is nonzero and patternN only returns 0 or -1,
4896 the usual "return BASE;" is better than "return res + BASE;".
4897 If BASE is zero, "return res;" should be better than "return 0;",
4898 since no assignment to the return register is required. */
4899 if (os->type == SUBPATTERN
4900 && terminal_pattern_p (d, &base, &count)
4901 && (base == 0 || count > 1))
4903 if (is_final && base == 0)
4905 printf_indent (indent, "return ");
4906 print_nonbool_test (os, d->test);
4907 printf ("; /* [-1, %d] */\n", count - 1);
4908 return ES_RETURNED;
4910 else
4912 printf_indent (indent, "res = ");
4913 print_nonbool_test (os, d->test);
4914 printf (";\n");
4915 printf_indent (indent, "if (res >= 0)\n");
4916 printf_indent (indent + 2, "return res");
4917 if (base != 0)
4918 printf (" + %d", base);
4919 printf ("; /* [%d, %d] */\n", base, base + count - 1);
4920 return ES_FALLTHROUGH;
4923 else if (d->test.kind == rtx_test::ACCEPT)
4924 return print_acceptance (d->test.u.acceptance, indent, is_final);
4925 else if (d->test.kind == rtx_test::SET_OP)
4927 printf_indent (indent, "operands[%d] = ", d->test.u.opno);
4928 print_test_rtx (os, d->test);
4929 printf (";\n");
4930 return print_state (os, d->singleton ()->to, indent, is_final);
4932 /* Handle decisions with a single transition and a single transition
4933 label. */
4934 else if (d->if_statement_p (&label))
4936 transition *trans = d->singleton ();
4937 if (mark_optional_transitions_p && trans->optional)
4938 printf_indent (indent, "/* OPTIONAL IF */\n");
4940 /* Print the condition associated with TRANS. Invert it if IS_FINAL,
4941 so that we return immediately on failure and fall through on
4942 success. */
4943 printf_indent (indent, "if (");
4944 print_test (os, d->test, trans->is_param, label, is_final);
4946 /* Look for following states that would be handled by this code
4947 on recursion. If they don't need any preparatory statements,
4948 include them in the current "if" statement rather than creating
4949 a new one. */
4950 for (;;)
4952 d = trans->to->singleton ();
4953 if (!d
4954 || d->test.kind == rtx_test::ACCEPT
4955 || d->test.kind == rtx_test::SET_OP
4956 || !d->if_statement_p (&label)
4957 || !test_position_available_p (os, d->test))
4958 break;
4959 trans = d->first;
4960 printf ("\n");
4961 if (mark_optional_transitions_p && trans->optional)
4962 printf_indent (indent + 4, "/* OPTIONAL IF */\n");
4963 printf_indent (indent + 4, "%s ", is_final ? "||" : "&&");
4964 print_test (os, d->test, trans->is_param, label, is_final);
4966 printf (")\n");
4968 /* Print the conditional code with INDENT + 2 and the fallthrough
4969 code with indent INDENT. */
4970 state *to = trans->to;
4971 if (is_final)
4973 /* We inverted the condition above, so return failure in the
4974 "if" body and fall through to the target of the transition. */
4975 printf_indent (indent + 2, "return %s;\n",
4976 get_failure_return (os->type));
4977 return print_state (os, to, indent, is_final);
4979 else if (to->singleton ()
4980 && to->first->test.kind == rtx_test::ACCEPT
4981 && single_statement_p (to->first->test.u.acceptance))
4983 /* The target of the transition is a simple "return" statement.
4984 It doesn't need any braces and doesn't fall through. */
4985 if (print_acceptance (to->first->test.u.acceptance,
4986 indent + 2, true) != ES_RETURNED)
4987 gcc_unreachable ();
4988 return ES_FALLTHROUGH;
4990 else
4992 /* The general case. Output code for the target of the transition
4993 in braces. This will not invalidate any of the xN variables
4994 that are already valid, but we mustn't rely on any that are
4995 set by the "if" body. */
4996 auto_vec <bool, 32> old_seen;
4997 old_seen.safe_splice (os->seen_vars);
4999 printf_indent (indent + 2, "{\n");
5000 print_state (os, trans->to, indent + 4, is_final);
5001 printf_indent (indent + 2, "}\n");
5003 os->seen_vars.truncate (0);
5004 os->seen_vars.splice (old_seen);
5005 return ES_FALLTHROUGH;
5008 else
5010 /* Output the decision as a switch statement. */
5011 printf_indent (indent, "switch (");
5012 print_nonbool_test (os, d->test);
5013 printf (")\n");
5015 /* Each case statement starts with the same set of valid variables.
5016 These are also the only variables will be valid on fallthrough. */
5017 auto_vec <bool, 32> old_seen;
5018 old_seen.safe_splice (os->seen_vars);
5020 printf_indent (indent + 2, "{\n");
5021 for (transition *trans = d->first; trans; trans = trans->next)
5023 gcc_assert (!trans->is_param);
5024 if (mark_optional_transitions_p && trans->optional)
5025 printf_indent (indent + 2, "/* OPTIONAL CASE */\n");
5026 for (int_set::iterator j = trans->labels.begin ();
5027 j != trans->labels.end (); ++j)
5029 printf_indent (indent + 2, "case ");
5030 print_label_value (d->test, trans->is_param, *j);
5031 printf (":\n");
5033 if (print_state (os, trans->to, indent + 4, is_final))
5035 /* The state can fall through. Add an explicit break. */
5036 gcc_assert (!is_final);
5037 printf_indent (indent + 4, "break;\n");
5039 printf ("\n");
5041 /* Restore the original set of valid variables. */
5042 os->seen_vars.truncate (0);
5043 os->seen_vars.splice (old_seen);
5045 /* Add a default case. */
5046 printf_indent (indent + 2, "default:\n");
5047 if (is_final)
5048 printf_indent (indent + 4, "return %s;\n",
5049 get_failure_return (os->type));
5050 else
5051 printf_indent (indent + 4, "break;\n");
5052 printf_indent (indent + 2, "}\n");
5053 return is_final ? ES_RETURNED : ES_FALLTHROUGH;
5057 /* Make sure that OS has a position variable for POS. ROOT_P is true if
5058 POS is the root position for the routine. */
5060 static void
5061 assign_position_var (output_state *os, position *pos, bool root_p)
5063 unsigned int idx = os->id_to_var[pos->id];
5064 if (idx < os->var_to_id.length () && os->var_to_id[idx] == pos->id)
5065 return;
5066 if (!root_p && pos->type != POS_PEEP2_INSN)
5067 assign_position_var (os, pos->base, false);
5068 os->id_to_var[pos->id] = os->var_to_id.length ();
5069 os->var_to_id.safe_push (pos->id);
5072 /* Make sure that OS has the position variables required by S. */
5074 static void
5075 assign_position_vars (output_state *os, state *s)
5077 for (decision *d = s->first; d; d = d->next)
5079 /* Positions associated with operands can be read from the
5080 operands[] array. */
5081 if (d->test.pos && d->test.pos_operand < 0)
5082 assign_position_var (os, d->test.pos, false);
5083 for (transition *trans = d->first; trans; trans = trans->next)
5084 assign_position_vars (os, trans->to);
5088 /* Print the open brace and variable definitions for a routine that
5089 implements S. ROOT is the deepest rtx from which S can access all
5090 relevant parts of the first instruction it matches. Initialize OS
5091 so that every relevant position has an rtx variable xN and so that
5092 only ROOT's variable has a valid value. */
5094 static void
5095 print_subroutine_start (output_state *os, state *s, position *root)
5097 printf ("{\n rtx * const operands ATTRIBUTE_UNUSED"
5098 " = &recog_data.operand[0];\n");
5099 os->var_to_id.truncate (0);
5100 os->seen_vars.truncate (0);
5101 if (root)
5103 /* Create a fake entry for position 0 so that an id_to_var of 0
5104 is always invalid. This also makes the xN variables naturally
5105 1-based rather than 0-based. */
5106 os->var_to_id.safe_push (num_positions);
5108 /* Associate ROOT with x1. */
5109 assign_position_var (os, root, true);
5111 /* Assign xN variables to all other relevant positions. */
5112 assign_position_vars (os, s);
5114 /* Output the variable declarations (except for ROOT's, which is
5115 passed in as a parameter). */
5116 unsigned int num_vars = os->var_to_id.length ();
5117 if (num_vars > 2)
5119 for (unsigned int i = 2; i < num_vars; ++i)
5120 /* Print 8 rtx variables to a line. */
5121 printf ("%s x%d",
5122 i == 2 ? " rtx" : (i - 2) % 8 == 0 ? ";\n rtx" : ",", i);
5123 printf (";\n");
5126 /* Say that x1 is valid and the rest aren't. */
5127 os->seen_vars.safe_grow_cleared (num_vars);
5128 os->seen_vars[1] = true;
5130 if (os->type == SUBPATTERN || os->type == RECOG)
5131 printf (" int res ATTRIBUTE_UNUSED;\n");
5132 else
5133 printf (" rtx_insn *res ATTRIBUTE_UNUSED;\n");
5136 /* Output the definition of pattern routine ROUTINE. */
5138 static void
5139 print_pattern (output_state *os, pattern_routine *routine)
5141 printf ("\nstatic int\npattern%d (", routine->pattern_id);
5142 const char *sep = "";
5143 /* Add the top-level rtx parameter, if any. */
5144 if (routine->pos)
5146 printf ("%srtx x1", sep);
5147 sep = ", ";
5149 /* Add the optional parameters. */
5150 if (routine->insn_p)
5152 /* We can't easily tell whether a C condition actually reads INSN,
5153 so add an ATTRIBUTE_UNUSED just in case. */
5154 printf ("%srtx_insn *insn ATTRIBUTE_UNUSED", sep);
5155 sep = ", ";
5157 if (routine->pnum_clobbers_p)
5159 printf ("%sint *pnum_clobbers", sep);
5160 sep = ", ";
5162 /* Add the "i" parameters. */
5163 for (unsigned int i = 0; i < routine->param_types.length (); ++i)
5165 printf ("%s%s i%d", sep,
5166 parameter_type_string (routine->param_types[i]), i + 1);
5167 sep = ", ";
5169 printf (")\n");
5170 os->type = SUBPATTERN;
5171 print_subroutine_start (os, routine->s, routine->pos);
5172 print_state (os, routine->s, 2, true);
5173 printf ("}\n");
5176 /* Output a routine of type TYPE that implements S. PROC_ID is the
5177 number of the subroutine associated with S, or 0 if S is the main
5178 routine. */
5180 static void
5181 print_subroutine (output_state *os, state *s, int proc_id)
5183 printf ("\n");
5184 switch (os->type)
5186 case SUBPATTERN:
5187 gcc_unreachable ();
5189 case RECOG:
5190 if (proc_id)
5191 printf ("static int\nrecog_%d", proc_id);
5192 else
5193 printf ("int\nrecog");
5194 printf (" (rtx x1 ATTRIBUTE_UNUSED,\n"
5195 "\trtx_insn *insn ATTRIBUTE_UNUSED,\n"
5196 "\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n");
5197 break;
5199 case SPLIT:
5200 if (proc_id)
5201 printf ("static rtx_insn *\nsplit_%d", proc_id);
5202 else
5203 printf ("rtx_insn *\nsplit_insns");
5204 printf (" (rtx x1 ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED)\n");
5205 break;
5207 case PEEPHOLE2:
5208 if (proc_id)
5209 printf ("static rtx_insn *\npeephole2_%d", proc_id);
5210 else
5211 printf ("rtx_insn *\npeephole2_insns");
5212 printf (" (rtx x1 ATTRIBUTE_UNUSED,\n"
5213 "\trtx_insn *insn ATTRIBUTE_UNUSED,\n"
5214 "\tint *pmatch_len_ ATTRIBUTE_UNUSED)\n");
5215 break;
5217 print_subroutine_start (os, s, &root_pos);
5218 if (proc_id == 0)
5220 printf (" recog_data.insn = NULL;\n");
5222 print_state (os, s, 2, true);
5223 printf ("}\n");
5226 /* Print out a routine of type TYPE that performs ROOT. */
5228 static void
5229 print_subroutine_group (output_state *os, routine_type type, state *root)
5231 os->type = type;
5232 if (use_subroutines_p)
5234 /* Split ROOT up into smaller pieces, both for readability and to
5235 help the compiler. */
5236 auto_vec <state *> subroutines;
5237 find_subroutines (type, root, subroutines);
5239 /* Output the subroutines (but not ROOT itself). */
5240 unsigned int i;
5241 state *s;
5242 FOR_EACH_VEC_ELT (subroutines, i, s)
5243 print_subroutine (os, s, i + 1);
5245 /* Output the main routine. */
5246 print_subroutine (os, root, 0);
5249 /* Return the rtx pattern for the list of rtxes in a define_peephole2. */
5251 static rtx
5252 get_peephole2_pattern (md_rtx_info *info)
5254 int i, j;
5255 rtvec vec = XVEC (info->def, 0);
5256 rtx pattern = rtx_alloc (SEQUENCE);
5257 XVEC (pattern, 0) = rtvec_alloc (GET_NUM_ELEM (vec));
5258 for (i = j = 0; i < GET_NUM_ELEM (vec); i++)
5260 rtx x = RTVEC_ELT (vec, i);
5261 /* Ignore scratch register requirements. */
5262 if (GET_CODE (x) != MATCH_SCRATCH && GET_CODE (x) != MATCH_DUP)
5264 XVECEXP (pattern, 0, j) = x;
5265 j++;
5268 XVECLEN (pattern, 0) = j;
5269 if (j == 0)
5270 error_at (info->loc, "empty define_peephole2");
5271 return pattern;
5274 /* Return true if *PATTERN_PTR is a PARALLEL in which at least one trailing
5275 rtx can be added automatically by add_clobbers. If so, update
5276 *ACCEPTANCE_PTR so that its num_clobbers field contains the number
5277 of such trailing rtxes and update *PATTERN_PTR so that it contains
5278 the pattern without those rtxes. */
5280 static bool
5281 remove_clobbers (acceptance_type *acceptance_ptr, rtx *pattern_ptr)
5283 int i;
5284 rtx new_pattern;
5286 /* Find the last non-clobber in the parallel. */
5287 rtx pattern = *pattern_ptr;
5288 for (i = XVECLEN (pattern, 0); i > 0; i--)
5290 rtx x = XVECEXP (pattern, 0, i - 1);
5291 if (GET_CODE (x) != CLOBBER
5292 || (!REG_P (XEXP (x, 0))
5293 && GET_CODE (XEXP (x, 0)) != MATCH_SCRATCH))
5294 break;
5297 if (i == XVECLEN (pattern, 0))
5298 return false;
5300 /* Build a similar insn without the clobbers. */
5301 if (i == 1)
5302 new_pattern = XVECEXP (pattern, 0, 0);
5303 else
5305 new_pattern = rtx_alloc (PARALLEL);
5306 XVEC (new_pattern, 0) = rtvec_alloc (i);
5307 for (int j = 0; j < i; ++j)
5308 XVECEXP (new_pattern, 0, j) = XVECEXP (pattern, 0, j);
5311 /* Recognize it. */
5312 acceptance_ptr->u.full.u.num_clobbers = XVECLEN (pattern, 0) - i;
5313 *pattern_ptr = new_pattern;
5314 return true;
5318 main (int argc, const char **argv)
5320 state insn_root, split_root, peephole2_root;
5322 progname = "genrecog";
5324 if (!init_rtx_reader_args (argc, argv))
5325 return (FATAL_EXIT_CODE);
5327 write_header ();
5329 /* Read the machine description. */
5331 md_rtx_info info;
5332 while (read_md_rtx (&info))
5334 rtx def = info.def;
5336 acceptance_type acceptance;
5337 acceptance.partial_p = false;
5338 acceptance.u.full.code = info.index;
5340 rtx pattern;
5341 switch (GET_CODE (def))
5343 case DEFINE_INSN:
5345 /* Match the instruction in the original .md form. */
5346 acceptance.type = RECOG;
5347 acceptance.u.full.u.num_clobbers = 0;
5348 pattern = add_implicit_parallel (XVEC (def, 1));
5349 validate_pattern (pattern, &info, NULL_RTX, 0);
5350 match_pattern (&insn_root, &info, pattern, acceptance);
5352 /* If the pattern is a PARALLEL with trailing CLOBBERs,
5353 allow recog_for_combine to match without the clobbers. */
5354 if (GET_CODE (pattern) == PARALLEL
5355 && remove_clobbers (&acceptance, &pattern))
5356 match_pattern (&insn_root, &info, pattern, acceptance);
5357 break;
5360 case DEFINE_SPLIT:
5361 acceptance.type = SPLIT;
5362 pattern = add_implicit_parallel (XVEC (def, 0));
5363 validate_pattern (pattern, &info, NULL_RTX, 0);
5364 match_pattern (&split_root, &info, pattern, acceptance);
5366 /* Declare the gen_split routine that we'll call if the
5367 pattern matches. The definition comes from insn-emit.c. */
5368 printf ("extern rtx_insn *gen_split_%d (rtx_insn *, rtx *);\n",
5369 info.index);
5370 break;
5372 case DEFINE_PEEPHOLE2:
5373 acceptance.type = PEEPHOLE2;
5374 pattern = get_peephole2_pattern (&info);
5375 validate_pattern (pattern, &info, NULL_RTX, 0);
5376 match_pattern (&peephole2_root, &info, pattern, acceptance);
5378 /* Declare the gen_peephole2 routine that we'll call if the
5379 pattern matches. The definition comes from insn-emit.c. */
5380 printf ("extern rtx_insn *gen_peephole2_%d (rtx_insn *, rtx *);\n",
5381 info.index);
5382 break;
5384 default:
5385 /* do nothing */;
5389 if (have_error)
5390 return FATAL_EXIT_CODE;
5392 puts ("\n\n");
5394 /* Optimize each routine in turn. */
5395 optimize_subroutine_group ("recog", &insn_root);
5396 optimize_subroutine_group ("split_insns", &split_root);
5397 optimize_subroutine_group ("peephole2_insns", &peephole2_root);
5399 output_state os;
5400 os.id_to_var.safe_grow_cleared (num_positions);
5402 if (use_pattern_routines_p)
5404 /* Look for common patterns and split them out into subroutines. */
5405 auto_vec <merge_state_info> states;
5406 states.safe_push (&insn_root);
5407 states.safe_push (&split_root);
5408 states.safe_push (&peephole2_root);
5409 split_out_patterns (states);
5411 /* Print out the routines that we just created. */
5412 unsigned int i;
5413 pattern_routine *routine;
5414 FOR_EACH_VEC_ELT (patterns, i, routine)
5415 print_pattern (&os, routine);
5418 /* Print out the matching routines. */
5419 print_subroutine_group (&os, RECOG, &insn_root);
5420 print_subroutine_group (&os, SPLIT, &split_root);
5421 print_subroutine_group (&os, PEEPHOLE2, &peephole2_root);
5423 fflush (stdout);
5424 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);