Fix type in the changelog entry,
[official-gcc.git] / gcc / recog.c
blobc032424e06bab586de1f18258c62eb724ca2c255
1 /* Subroutines used by or related to instruction recognition.
2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
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 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "cfghooks.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "df.h"
29 #include "alias.h"
30 #include "rtl-error.h"
31 #include "tm_p.h"
32 #include "insn-config.h"
33 #include "insn-attr.h"
34 #include "recog.h"
35 #include "regs.h"
36 #include "addresses.h"
37 #include "flags.h"
38 #include "expmed.h"
39 #include "dojump.h"
40 #include "explow.h"
41 #include "calls.h"
42 #include "emit-rtl.h"
43 #include "varasm.h"
44 #include "stmt.h"
45 #include "expr.h"
46 #include "cfgrtl.h"
47 #include "cfgbuild.h"
48 #include "cfgcleanup.h"
49 #include "reload.h"
50 #include "target.h"
51 #include "tree-pass.h"
52 #include "insn-codes.h"
54 #ifndef STACK_POP_CODE
55 #if STACK_GROWS_DOWNWARD
56 #define STACK_POP_CODE POST_INC
57 #else
58 #define STACK_POP_CODE POST_DEC
59 #endif
60 #endif
62 static void validate_replace_rtx_1 (rtx *, rtx, rtx, rtx_insn *, bool);
63 static void validate_replace_src_1 (rtx *, void *);
64 static rtx_insn *split_insn (rtx_insn *);
66 struct target_recog default_target_recog;
67 #if SWITCHABLE_TARGET
68 struct target_recog *this_target_recog = &default_target_recog;
69 #endif
71 /* Nonzero means allow operands to be volatile.
72 This should be 0 if you are generating rtl, such as if you are calling
73 the functions in optabs.c and expmed.c (most of the time).
74 This should be 1 if all valid insns need to be recognized,
75 such as in reginfo.c and final.c and reload.c.
77 init_recog and init_recog_no_volatile are responsible for setting this. */
79 int volatile_ok;
81 struct recog_data_d recog_data;
83 /* Contains a vector of operand_alternative structures, such that
84 operand OP of alternative A is at index A * n_operands + OP.
85 Set up by preprocess_constraints. */
86 const operand_alternative *recog_op_alt;
88 /* Used to provide recog_op_alt for asms. */
89 static operand_alternative asm_op_alt[MAX_RECOG_OPERANDS
90 * MAX_RECOG_ALTERNATIVES];
92 /* On return from `constrain_operands', indicate which alternative
93 was satisfied. */
95 int which_alternative;
97 /* Nonzero after end of reload pass.
98 Set to 1 or 0 by toplev.c.
99 Controls the significance of (SUBREG (MEM)). */
101 int reload_completed;
103 /* Nonzero after thread_prologue_and_epilogue_insns has run. */
104 int epilogue_completed;
106 /* Initialize data used by the function `recog'.
107 This must be called once in the compilation of a function
108 before any insn recognition may be done in the function. */
110 void
111 init_recog_no_volatile (void)
113 volatile_ok = 0;
116 void
117 init_recog (void)
119 volatile_ok = 1;
123 /* Return true if labels in asm operands BODY are LABEL_REFs. */
125 static bool
126 asm_labels_ok (rtx body)
128 rtx asmop;
129 int i;
131 asmop = extract_asm_operands (body);
132 if (asmop == NULL_RTX)
133 return true;
135 for (i = 0; i < ASM_OPERANDS_LABEL_LENGTH (asmop); i++)
136 if (GET_CODE (ASM_OPERANDS_LABEL (asmop, i)) != LABEL_REF)
137 return false;
139 return true;
142 /* Check that X is an insn-body for an `asm' with operands
143 and that the operands mentioned in it are legitimate. */
146 check_asm_operands (rtx x)
148 int noperands;
149 rtx *operands;
150 const char **constraints;
151 int i;
153 if (!asm_labels_ok (x))
154 return 0;
156 /* Post-reload, be more strict with things. */
157 if (reload_completed)
159 /* ??? Doh! We've not got the wrapping insn. Cook one up. */
160 rtx_insn *insn = make_insn_raw (x);
161 extract_insn (insn);
162 constrain_operands (1, get_enabled_alternatives (insn));
163 return which_alternative >= 0;
166 noperands = asm_noperands (x);
167 if (noperands < 0)
168 return 0;
169 if (noperands == 0)
170 return 1;
172 operands = XALLOCAVEC (rtx, noperands);
173 constraints = XALLOCAVEC (const char *, noperands);
175 decode_asm_operands (x, operands, NULL, constraints, NULL, NULL);
177 for (i = 0; i < noperands; i++)
179 const char *c = constraints[i];
180 if (c[0] == '%')
181 c++;
182 if (! asm_operand_ok (operands[i], c, constraints))
183 return 0;
186 return 1;
189 /* Static data for the next two routines. */
191 struct change_t
193 rtx object;
194 int old_code;
195 rtx *loc;
196 rtx old;
197 bool unshare;
200 static change_t *changes;
201 static int changes_allocated;
203 static int num_changes = 0;
205 /* Validate a proposed change to OBJECT. LOC is the location in the rtl
206 at which NEW_RTX will be placed. If OBJECT is zero, no validation is done,
207 the change is simply made.
209 Two types of objects are supported: If OBJECT is a MEM, memory_address_p
210 will be called with the address and mode as parameters. If OBJECT is
211 an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
212 the change in place.
214 IN_GROUP is nonzero if this is part of a group of changes that must be
215 performed as a group. In that case, the changes will be stored. The
216 function `apply_change_group' will validate and apply the changes.
218 If IN_GROUP is zero, this is a single change. Try to recognize the insn
219 or validate the memory reference with the change applied. If the result
220 is not valid for the machine, suppress the change and return zero.
221 Otherwise, perform the change and return 1. */
223 static bool
224 validate_change_1 (rtx object, rtx *loc, rtx new_rtx, bool in_group, bool unshare)
226 rtx old = *loc;
228 if (old == new_rtx || rtx_equal_p (old, new_rtx))
229 return 1;
231 gcc_assert (in_group != 0 || num_changes == 0);
233 *loc = new_rtx;
235 /* Save the information describing this change. */
236 if (num_changes >= changes_allocated)
238 if (changes_allocated == 0)
239 /* This value allows for repeated substitutions inside complex
240 indexed addresses, or changes in up to 5 insns. */
241 changes_allocated = MAX_RECOG_OPERANDS * 5;
242 else
243 changes_allocated *= 2;
245 changes = XRESIZEVEC (change_t, changes, changes_allocated);
248 changes[num_changes].object = object;
249 changes[num_changes].loc = loc;
250 changes[num_changes].old = old;
251 changes[num_changes].unshare = unshare;
253 if (object && !MEM_P (object))
255 /* Set INSN_CODE to force rerecognition of insn. Save old code in
256 case invalid. */
257 changes[num_changes].old_code = INSN_CODE (object);
258 INSN_CODE (object) = -1;
261 num_changes++;
263 /* If we are making a group of changes, return 1. Otherwise, validate the
264 change group we made. */
266 if (in_group)
267 return 1;
268 else
269 return apply_change_group ();
272 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
273 UNSHARE to false. */
275 bool
276 validate_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
278 return validate_change_1 (object, loc, new_rtx, in_group, false);
281 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
282 UNSHARE to true. */
284 bool
285 validate_unshare_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
287 return validate_change_1 (object, loc, new_rtx, in_group, true);
291 /* Keep X canonicalized if some changes have made it non-canonical; only
292 modifies the operands of X, not (for example) its code. Simplifications
293 are not the job of this routine.
295 Return true if anything was changed. */
296 bool
297 canonicalize_change_group (rtx_insn *insn, rtx x)
299 if (COMMUTATIVE_P (x)
300 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
302 /* Oops, the caller has made X no longer canonical.
303 Let's redo the changes in the correct order. */
304 rtx tem = XEXP (x, 0);
305 validate_unshare_change (insn, &XEXP (x, 0), XEXP (x, 1), 1);
306 validate_unshare_change (insn, &XEXP (x, 1), tem, 1);
307 return true;
309 else
310 return false;
314 /* This subroutine of apply_change_group verifies whether the changes to INSN
315 were valid; i.e. whether INSN can still be recognized.
317 If IN_GROUP is true clobbers which have to be added in order to
318 match the instructions will be added to the current change group.
319 Otherwise the changes will take effect immediately. */
322 insn_invalid_p (rtx_insn *insn, bool in_group)
324 rtx pat = PATTERN (insn);
325 int num_clobbers = 0;
326 /* If we are before reload and the pattern is a SET, see if we can add
327 clobbers. */
328 int icode = recog (pat, insn,
329 (GET_CODE (pat) == SET
330 && ! reload_completed
331 && ! reload_in_progress)
332 ? &num_clobbers : 0);
333 int is_asm = icode < 0 && asm_noperands (PATTERN (insn)) >= 0;
336 /* If this is an asm and the operand aren't legal, then fail. Likewise if
337 this is not an asm and the insn wasn't recognized. */
338 if ((is_asm && ! check_asm_operands (PATTERN (insn)))
339 || (!is_asm && icode < 0))
340 return 1;
342 /* If we have to add CLOBBERs, fail if we have to add ones that reference
343 hard registers since our callers can't know if they are live or not.
344 Otherwise, add them. */
345 if (num_clobbers > 0)
347 rtx newpat;
349 if (added_clobbers_hard_reg_p (icode))
350 return 1;
352 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num_clobbers + 1));
353 XVECEXP (newpat, 0, 0) = pat;
354 add_clobbers (newpat, icode);
355 if (in_group)
356 validate_change (insn, &PATTERN (insn), newpat, 1);
357 else
358 PATTERN (insn) = pat = newpat;
361 /* After reload, verify that all constraints are satisfied. */
362 if (reload_completed)
364 extract_insn (insn);
366 if (! constrain_operands (1, get_preferred_alternatives (insn)))
367 return 1;
370 INSN_CODE (insn) = icode;
371 return 0;
374 /* Return number of changes made and not validated yet. */
376 num_changes_pending (void)
378 return num_changes;
381 /* Tentatively apply the changes numbered NUM and up.
382 Return 1 if all changes are valid, zero otherwise. */
385 verify_changes (int num)
387 int i;
388 rtx last_validated = NULL_RTX;
390 /* The changes have been applied and all INSN_CODEs have been reset to force
391 rerecognition.
393 The changes are valid if we aren't given an object, or if we are
394 given a MEM and it still is a valid address, or if this is in insn
395 and it is recognized. In the latter case, if reload has completed,
396 we also require that the operands meet the constraints for
397 the insn. */
399 for (i = num; i < num_changes; i++)
401 rtx object = changes[i].object;
403 /* If there is no object to test or if it is the same as the one we
404 already tested, ignore it. */
405 if (object == 0 || object == last_validated)
406 continue;
408 if (MEM_P (object))
410 if (! memory_address_addr_space_p (GET_MODE (object),
411 XEXP (object, 0),
412 MEM_ADDR_SPACE (object)))
413 break;
415 else if (/* changes[i].old might be zero, e.g. when putting a
416 REG_FRAME_RELATED_EXPR into a previously empty list. */
417 changes[i].old
418 && REG_P (changes[i].old)
419 && asm_noperands (PATTERN (object)) > 0
420 && REG_EXPR (changes[i].old) != NULL_TREE
421 && DECL_ASSEMBLER_NAME_SET_P (REG_EXPR (changes[i].old))
422 && DECL_REGISTER (REG_EXPR (changes[i].old)))
424 /* Don't allow changes of hard register operands to inline
425 assemblies if they have been defined as register asm ("x"). */
426 break;
428 else if (DEBUG_INSN_P (object))
429 continue;
430 else if (insn_invalid_p (as_a <rtx_insn *> (object), true))
432 rtx pat = PATTERN (object);
434 /* Perhaps we couldn't recognize the insn because there were
435 extra CLOBBERs at the end. If so, try to re-recognize
436 without the last CLOBBER (later iterations will cause each of
437 them to be eliminated, in turn). But don't do this if we
438 have an ASM_OPERAND. */
439 if (GET_CODE (pat) == PARALLEL
440 && GET_CODE (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)) == CLOBBER
441 && asm_noperands (PATTERN (object)) < 0)
443 rtx newpat;
445 if (XVECLEN (pat, 0) == 2)
446 newpat = XVECEXP (pat, 0, 0);
447 else
449 int j;
451 newpat
452 = gen_rtx_PARALLEL (VOIDmode,
453 rtvec_alloc (XVECLEN (pat, 0) - 1));
454 for (j = 0; j < XVECLEN (newpat, 0); j++)
455 XVECEXP (newpat, 0, j) = XVECEXP (pat, 0, j);
458 /* Add a new change to this group to replace the pattern
459 with this new pattern. Then consider this change
460 as having succeeded. The change we added will
461 cause the entire call to fail if things remain invalid.
463 Note that this can lose if a later change than the one
464 we are processing specified &XVECEXP (PATTERN (object), 0, X)
465 but this shouldn't occur. */
467 validate_change (object, &PATTERN (object), newpat, 1);
468 continue;
470 else if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER
471 || GET_CODE (pat) == VAR_LOCATION)
472 /* If this insn is a CLOBBER or USE, it is always valid, but is
473 never recognized. */
474 continue;
475 else
476 break;
478 last_validated = object;
481 return (i == num_changes);
484 /* A group of changes has previously been issued with validate_change
485 and verified with verify_changes. Call df_insn_rescan for each of
486 the insn changed and clear num_changes. */
488 void
489 confirm_change_group (void)
491 int i;
492 rtx last_object = NULL;
494 for (i = 0; i < num_changes; i++)
496 rtx object = changes[i].object;
498 if (changes[i].unshare)
499 *changes[i].loc = copy_rtx (*changes[i].loc);
501 /* Avoid unnecessary rescanning when multiple changes to same instruction
502 are made. */
503 if (object)
505 if (object != last_object && last_object && INSN_P (last_object))
506 df_insn_rescan (as_a <rtx_insn *> (last_object));
507 last_object = object;
511 if (last_object && INSN_P (last_object))
512 df_insn_rescan (as_a <rtx_insn *> (last_object));
513 num_changes = 0;
516 /* Apply a group of changes previously issued with `validate_change'.
517 If all changes are valid, call confirm_change_group and return 1,
518 otherwise, call cancel_changes and return 0. */
521 apply_change_group (void)
523 if (verify_changes (0))
525 confirm_change_group ();
526 return 1;
528 else
530 cancel_changes (0);
531 return 0;
536 /* Return the number of changes so far in the current group. */
539 num_validated_changes (void)
541 return num_changes;
544 /* Retract the changes numbered NUM and up. */
546 void
547 cancel_changes (int num)
549 int i;
551 /* Back out all the changes. Do this in the opposite order in which
552 they were made. */
553 for (i = num_changes - 1; i >= num; i--)
555 *changes[i].loc = changes[i].old;
556 if (changes[i].object && !MEM_P (changes[i].object))
557 INSN_CODE (changes[i].object) = changes[i].old_code;
559 num_changes = num;
562 /* Reduce conditional compilation elsewhere. */
563 /* A subroutine of validate_replace_rtx_1 that tries to simplify the resulting
564 rtx. */
566 static void
567 simplify_while_replacing (rtx *loc, rtx to, rtx_insn *object,
568 machine_mode op0_mode)
570 rtx x = *loc;
571 enum rtx_code code = GET_CODE (x);
572 rtx new_rtx = NULL_RTX;
574 if (SWAPPABLE_OPERANDS_P (x)
575 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
577 validate_unshare_change (object, loc,
578 gen_rtx_fmt_ee (COMMUTATIVE_ARITH_P (x) ? code
579 : swap_condition (code),
580 GET_MODE (x), XEXP (x, 1),
581 XEXP (x, 0)), 1);
582 x = *loc;
583 code = GET_CODE (x);
586 /* Canonicalize arithmetics with all constant operands. */
587 switch (GET_RTX_CLASS (code))
589 case RTX_UNARY:
590 if (CONSTANT_P (XEXP (x, 0)))
591 new_rtx = simplify_unary_operation (code, GET_MODE (x), XEXP (x, 0),
592 op0_mode);
593 break;
594 case RTX_COMM_ARITH:
595 case RTX_BIN_ARITH:
596 if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1)))
597 new_rtx = simplify_binary_operation (code, GET_MODE (x), XEXP (x, 0),
598 XEXP (x, 1));
599 break;
600 case RTX_COMPARE:
601 case RTX_COMM_COMPARE:
602 if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1)))
603 new_rtx = simplify_relational_operation (code, GET_MODE (x), op0_mode,
604 XEXP (x, 0), XEXP (x, 1));
605 break;
606 default:
607 break;
609 if (new_rtx)
611 validate_change (object, loc, new_rtx, 1);
612 return;
615 switch (code)
617 case PLUS:
618 /* If we have a PLUS whose second operand is now a CONST_INT, use
619 simplify_gen_binary to try to simplify it.
620 ??? We may want later to remove this, once simplification is
621 separated from this function. */
622 if (CONST_INT_P (XEXP (x, 1)) && XEXP (x, 1) == to)
623 validate_change (object, loc,
624 simplify_gen_binary
625 (PLUS, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)), 1);
626 break;
627 case MINUS:
628 if (CONST_SCALAR_INT_P (XEXP (x, 1)))
629 validate_change (object, loc,
630 simplify_gen_binary
631 (PLUS, GET_MODE (x), XEXP (x, 0),
632 simplify_gen_unary (NEG,
633 GET_MODE (x), XEXP (x, 1),
634 GET_MODE (x))), 1);
635 break;
636 case ZERO_EXTEND:
637 case SIGN_EXTEND:
638 if (GET_MODE (XEXP (x, 0)) == VOIDmode)
640 new_rtx = simplify_gen_unary (code, GET_MODE (x), XEXP (x, 0),
641 op0_mode);
642 /* If any of the above failed, substitute in something that
643 we know won't be recognized. */
644 if (!new_rtx)
645 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
646 validate_change (object, loc, new_rtx, 1);
648 break;
649 case SUBREG:
650 /* All subregs possible to simplify should be simplified. */
651 new_rtx = simplify_subreg (GET_MODE (x), SUBREG_REG (x), op0_mode,
652 SUBREG_BYTE (x));
654 /* Subregs of VOIDmode operands are incorrect. */
655 if (!new_rtx && GET_MODE (SUBREG_REG (x)) == VOIDmode)
656 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
657 if (new_rtx)
658 validate_change (object, loc, new_rtx, 1);
659 break;
660 case ZERO_EXTRACT:
661 case SIGN_EXTRACT:
662 /* If we are replacing a register with memory, try to change the memory
663 to be the mode required for memory in extract operations (this isn't
664 likely to be an insertion operation; if it was, nothing bad will
665 happen, we might just fail in some cases). */
667 if (MEM_P (XEXP (x, 0))
668 && CONST_INT_P (XEXP (x, 1))
669 && CONST_INT_P (XEXP (x, 2))
670 && !mode_dependent_address_p (XEXP (XEXP (x, 0), 0),
671 MEM_ADDR_SPACE (XEXP (x, 0)))
672 && !MEM_VOLATILE_P (XEXP (x, 0)))
674 machine_mode wanted_mode = VOIDmode;
675 machine_mode is_mode = GET_MODE (XEXP (x, 0));
676 int pos = INTVAL (XEXP (x, 2));
678 if (GET_CODE (x) == ZERO_EXTRACT && targetm.have_extzv ())
680 wanted_mode = insn_data[targetm.code_for_extzv].operand[1].mode;
681 if (wanted_mode == VOIDmode)
682 wanted_mode = word_mode;
684 else if (GET_CODE (x) == SIGN_EXTRACT && targetm.have_extv ())
686 wanted_mode = insn_data[targetm.code_for_extv].operand[1].mode;
687 if (wanted_mode == VOIDmode)
688 wanted_mode = word_mode;
691 /* If we have a narrower mode, we can do something. */
692 if (wanted_mode != VOIDmode
693 && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
695 int offset = pos / BITS_PER_UNIT;
696 rtx newmem;
698 /* If the bytes and bits are counted differently, we
699 must adjust the offset. */
700 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
701 offset =
702 (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) -
703 offset);
705 gcc_assert (GET_MODE_PRECISION (wanted_mode)
706 == GET_MODE_BITSIZE (wanted_mode));
707 pos %= GET_MODE_BITSIZE (wanted_mode);
709 newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset);
711 validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1);
712 validate_change (object, &XEXP (x, 0), newmem, 1);
716 break;
718 default:
719 break;
723 /* Replace every occurrence of FROM in X with TO. Mark each change with
724 validate_change passing OBJECT. */
726 static void
727 validate_replace_rtx_1 (rtx *loc, rtx from, rtx to, rtx_insn *object,
728 bool simplify)
730 int i, j;
731 const char *fmt;
732 rtx x = *loc;
733 enum rtx_code code;
734 machine_mode op0_mode = VOIDmode;
735 int prev_changes = num_changes;
737 if (!x)
738 return;
740 code = GET_CODE (x);
741 fmt = GET_RTX_FORMAT (code);
742 if (fmt[0] == 'e')
743 op0_mode = GET_MODE (XEXP (x, 0));
745 /* X matches FROM if it is the same rtx or they are both referring to the
746 same register in the same mode. Avoid calling rtx_equal_p unless the
747 operands look similar. */
749 if (x == from
750 || (REG_P (x) && REG_P (from)
751 && GET_MODE (x) == GET_MODE (from)
752 && REGNO (x) == REGNO (from))
753 || (GET_CODE (x) == GET_CODE (from) && GET_MODE (x) == GET_MODE (from)
754 && rtx_equal_p (x, from)))
756 validate_unshare_change (object, loc, to, 1);
757 return;
760 /* Call ourself recursively to perform the replacements.
761 We must not replace inside already replaced expression, otherwise we
762 get infinite recursion for replacements like (reg X)->(subreg (reg X))
763 so we must special case shared ASM_OPERANDS. */
765 if (GET_CODE (x) == PARALLEL)
767 for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
769 if (j && GET_CODE (XVECEXP (x, 0, j)) == SET
770 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == ASM_OPERANDS)
772 /* Verify that operands are really shared. */
773 gcc_assert (ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (x, 0, 0)))
774 == ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP
775 (x, 0, j))));
776 validate_replace_rtx_1 (&SET_DEST (XVECEXP (x, 0, j)),
777 from, to, object, simplify);
779 else
780 validate_replace_rtx_1 (&XVECEXP (x, 0, j), from, to, object,
781 simplify);
784 else
785 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
787 if (fmt[i] == 'e')
788 validate_replace_rtx_1 (&XEXP (x, i), from, to, object, simplify);
789 else if (fmt[i] == 'E')
790 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
791 validate_replace_rtx_1 (&XVECEXP (x, i, j), from, to, object,
792 simplify);
795 /* If we didn't substitute, there is nothing more to do. */
796 if (num_changes == prev_changes)
797 return;
799 /* ??? The regmove is no more, so is this aberration still necessary? */
800 /* Allow substituted expression to have different mode. This is used by
801 regmove to change mode of pseudo register. */
802 if (fmt[0] == 'e' && GET_MODE (XEXP (x, 0)) != VOIDmode)
803 op0_mode = GET_MODE (XEXP (x, 0));
805 /* Do changes needed to keep rtx consistent. Don't do any other
806 simplifications, as it is not our job. */
807 if (simplify)
808 simplify_while_replacing (loc, to, object, op0_mode);
811 /* Try replacing every occurrence of FROM in subexpression LOC of INSN
812 with TO. After all changes have been made, validate by seeing
813 if INSN is still valid. */
816 validate_replace_rtx_subexp (rtx from, rtx to, rtx_insn *insn, rtx *loc)
818 validate_replace_rtx_1 (loc, from, to, insn, true);
819 return apply_change_group ();
822 /* Try replacing every occurrence of FROM in INSN with TO. After all
823 changes have been made, validate by seeing if INSN is still valid. */
826 validate_replace_rtx (rtx from, rtx to, rtx_insn *insn)
828 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
829 return apply_change_group ();
832 /* Try replacing every occurrence of FROM in WHERE with TO. Assume that WHERE
833 is a part of INSN. After all changes have been made, validate by seeing if
834 INSN is still valid.
835 validate_replace_rtx (from, to, insn) is equivalent to
836 validate_replace_rtx_part (from, to, &PATTERN (insn), insn). */
839 validate_replace_rtx_part (rtx from, rtx to, rtx *where, rtx_insn *insn)
841 validate_replace_rtx_1 (where, from, to, insn, true);
842 return apply_change_group ();
845 /* Same as above, but do not simplify rtx afterwards. */
847 validate_replace_rtx_part_nosimplify (rtx from, rtx to, rtx *where,
848 rtx_insn *insn)
850 validate_replace_rtx_1 (where, from, to, insn, false);
851 return apply_change_group ();
855 /* Try replacing every occurrence of FROM in INSN with TO. This also
856 will replace in REG_EQUAL and REG_EQUIV notes. */
858 void
859 validate_replace_rtx_group (rtx from, rtx to, rtx_insn *insn)
861 rtx note;
862 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
863 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
864 if (REG_NOTE_KIND (note) == REG_EQUAL
865 || REG_NOTE_KIND (note) == REG_EQUIV)
866 validate_replace_rtx_1 (&XEXP (note, 0), from, to, insn, true);
869 /* Function called by note_uses to replace used subexpressions. */
870 struct validate_replace_src_data
872 rtx from; /* Old RTX */
873 rtx to; /* New RTX */
874 rtx_insn *insn; /* Insn in which substitution is occurring. */
877 static void
878 validate_replace_src_1 (rtx *x, void *data)
880 struct validate_replace_src_data *d
881 = (struct validate_replace_src_data *) data;
883 validate_replace_rtx_1 (x, d->from, d->to, d->insn, true);
886 /* Try replacing every occurrence of FROM in INSN with TO, avoiding
887 SET_DESTs. */
889 void
890 validate_replace_src_group (rtx from, rtx to, rtx_insn *insn)
892 struct validate_replace_src_data d;
894 d.from = from;
895 d.to = to;
896 d.insn = insn;
897 note_uses (&PATTERN (insn), validate_replace_src_1, &d);
900 /* Try simplify INSN.
901 Invoke simplify_rtx () on every SET_SRC and SET_DEST inside the INSN's
902 pattern and return true if something was simplified. */
904 bool
905 validate_simplify_insn (rtx_insn *insn)
907 int i;
908 rtx pat = NULL;
909 rtx newpat = NULL;
911 pat = PATTERN (insn);
913 if (GET_CODE (pat) == SET)
915 newpat = simplify_rtx (SET_SRC (pat));
916 if (newpat && !rtx_equal_p (SET_SRC (pat), newpat))
917 validate_change (insn, &SET_SRC (pat), newpat, 1);
918 newpat = simplify_rtx (SET_DEST (pat));
919 if (newpat && !rtx_equal_p (SET_DEST (pat), newpat))
920 validate_change (insn, &SET_DEST (pat), newpat, 1);
922 else if (GET_CODE (pat) == PARALLEL)
923 for (i = 0; i < XVECLEN (pat, 0); i++)
925 rtx s = XVECEXP (pat, 0, i);
927 if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
929 newpat = simplify_rtx (SET_SRC (s));
930 if (newpat && !rtx_equal_p (SET_SRC (s), newpat))
931 validate_change (insn, &SET_SRC (s), newpat, 1);
932 newpat = simplify_rtx (SET_DEST (s));
933 if (newpat && !rtx_equal_p (SET_DEST (s), newpat))
934 validate_change (insn, &SET_DEST (s), newpat, 1);
937 return ((num_changes_pending () > 0) && (apply_change_group () > 0));
940 /* Return 1 if the insn using CC0 set by INSN does not contain
941 any ordered tests applied to the condition codes.
942 EQ and NE tests do not count. */
945 next_insn_tests_no_inequality (rtx_insn *insn)
947 rtx_insn *next = next_cc0_user (insn);
949 /* If there is no next insn, we have to take the conservative choice. */
950 if (next == 0)
951 return 0;
953 return (INSN_P (next)
954 && ! inequality_comparisons_p (PATTERN (next)));
957 /* Return 1 if OP is a valid general operand for machine mode MODE.
958 This is either a register reference, a memory reference,
959 or a constant. In the case of a memory reference, the address
960 is checked for general validity for the target machine.
962 Register and memory references must have mode MODE in order to be valid,
963 but some constants have no machine mode and are valid for any mode.
965 If MODE is VOIDmode, OP is checked for validity for whatever mode
966 it has.
968 The main use of this function is as a predicate in match_operand
969 expressions in the machine description. */
972 general_operand (rtx op, machine_mode mode)
974 enum rtx_code code = GET_CODE (op);
976 if (mode == VOIDmode)
977 mode = GET_MODE (op);
979 /* Don't accept CONST_INT or anything similar
980 if the caller wants something floating. */
981 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
982 && GET_MODE_CLASS (mode) != MODE_INT
983 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
984 return 0;
986 if (CONST_INT_P (op)
987 && mode != VOIDmode
988 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
989 return 0;
991 if (CONSTANT_P (op))
992 return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
993 || mode == VOIDmode)
994 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
995 && targetm.legitimate_constant_p (mode == VOIDmode
996 ? GET_MODE (op)
997 : mode, op));
999 /* Except for certain constants with VOIDmode, already checked for,
1000 OP's mode must match MODE if MODE specifies a mode. */
1002 if (GET_MODE (op) != mode)
1003 return 0;
1005 if (code == SUBREG)
1007 rtx sub = SUBREG_REG (op);
1009 #ifdef INSN_SCHEDULING
1010 /* On machines that have insn scheduling, we want all memory
1011 reference to be explicit, so outlaw paradoxical SUBREGs.
1012 However, we must allow them after reload so that they can
1013 get cleaned up by cleanup_subreg_operands. */
1014 if (!reload_completed && MEM_P (sub)
1015 && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (sub)))
1016 return 0;
1017 #endif
1018 /* Avoid memories with nonzero SUBREG_BYTE, as offsetting the memory
1019 may result in incorrect reference. We should simplify all valid
1020 subregs of MEM anyway. But allow this after reload because we
1021 might be called from cleanup_subreg_operands.
1023 ??? This is a kludge. */
1024 if (!reload_completed && SUBREG_BYTE (op) != 0
1025 && MEM_P (sub))
1026 return 0;
1028 #ifdef CANNOT_CHANGE_MODE_CLASS
1029 if (REG_P (sub)
1030 && REGNO (sub) < FIRST_PSEUDO_REGISTER
1031 && REG_CANNOT_CHANGE_MODE_P (REGNO (sub), GET_MODE (sub), mode)
1032 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_INT
1033 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_FLOAT
1034 /* LRA can generate some invalid SUBREGS just for matched
1035 operand reload presentation. LRA needs to treat them as
1036 valid. */
1037 && ! LRA_SUBREG_P (op))
1038 return 0;
1039 #endif
1041 /* FLOAT_MODE subregs can't be paradoxical. Combine will occasionally
1042 create such rtl, and we must reject it. */
1043 if (SCALAR_FLOAT_MODE_P (GET_MODE (op))
1044 /* LRA can use subreg to store a floating point value in an
1045 integer mode. Although the floating point and the
1046 integer modes need the same number of hard registers, the
1047 size of floating point mode can be less than the integer
1048 mode. */
1049 && ! lra_in_progress
1050 && GET_MODE_SIZE (GET_MODE (op)) > GET_MODE_SIZE (GET_MODE (sub)))
1051 return 0;
1053 op = sub;
1054 code = GET_CODE (op);
1057 if (code == REG)
1058 return (REGNO (op) >= FIRST_PSEUDO_REGISTER
1059 || in_hard_reg_set_p (operand_reg_set, GET_MODE (op), REGNO (op)));
1061 if (code == MEM)
1063 rtx y = XEXP (op, 0);
1065 if (! volatile_ok && MEM_VOLATILE_P (op))
1066 return 0;
1068 /* Use the mem's mode, since it will be reloaded thus. LRA can
1069 generate move insn with invalid addresses which is made valid
1070 and efficiently calculated by LRA through further numerous
1071 transformations. */
1072 if (lra_in_progress
1073 || memory_address_addr_space_p (GET_MODE (op), y, MEM_ADDR_SPACE (op)))
1074 return 1;
1077 return 0;
1080 /* Return 1 if OP is a valid memory address for a memory reference
1081 of mode MODE.
1083 The main use of this function is as a predicate in match_operand
1084 expressions in the machine description. */
1087 address_operand (rtx op, machine_mode mode)
1089 return memory_address_p (mode, op);
1092 /* Return 1 if OP is a register reference of mode MODE.
1093 If MODE is VOIDmode, accept a register in any mode.
1095 The main use of this function is as a predicate in match_operand
1096 expressions in the machine description. */
1099 register_operand (rtx op, machine_mode mode)
1101 if (GET_CODE (op) == SUBREG)
1103 rtx sub = SUBREG_REG (op);
1105 /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1106 because it is guaranteed to be reloaded into one.
1107 Just make sure the MEM is valid in itself.
1108 (Ideally, (SUBREG (MEM)...) should not exist after reload,
1109 but currently it does result from (SUBREG (REG)...) where the
1110 reg went on the stack.) */
1111 if (!REG_P (sub) && (reload_completed || !MEM_P (sub)))
1112 return 0;
1114 else if (!REG_P (op))
1115 return 0;
1116 return general_operand (op, mode);
1119 /* Return 1 for a register in Pmode; ignore the tested mode. */
1122 pmode_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1124 return register_operand (op, Pmode);
1127 /* Return 1 if OP should match a MATCH_SCRATCH, i.e., if it is a SCRATCH
1128 or a hard register. */
1131 scratch_operand (rtx op, machine_mode mode)
1133 if (GET_MODE (op) != mode && mode != VOIDmode)
1134 return 0;
1136 return (GET_CODE (op) == SCRATCH
1137 || (REG_P (op)
1138 && (lra_in_progress
1139 || (REGNO (op) < FIRST_PSEUDO_REGISTER
1140 && REGNO_REG_CLASS (REGNO (op)) != NO_REGS))));
1143 /* Return 1 if OP is a valid immediate operand for mode MODE.
1145 The main use of this function is as a predicate in match_operand
1146 expressions in the machine description. */
1149 immediate_operand (rtx op, machine_mode mode)
1151 /* Don't accept CONST_INT or anything similar
1152 if the caller wants something floating. */
1153 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1154 && GET_MODE_CLASS (mode) != MODE_INT
1155 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1156 return 0;
1158 if (CONST_INT_P (op)
1159 && mode != VOIDmode
1160 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1161 return 0;
1163 return (CONSTANT_P (op)
1164 && (GET_MODE (op) == mode || mode == VOIDmode
1165 || GET_MODE (op) == VOIDmode)
1166 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1167 && targetm.legitimate_constant_p (mode == VOIDmode
1168 ? GET_MODE (op)
1169 : mode, op));
1172 /* Returns 1 if OP is an operand that is a CONST_INT of mode MODE. */
1175 const_int_operand (rtx op, machine_mode mode)
1177 if (!CONST_INT_P (op))
1178 return 0;
1180 if (mode != VOIDmode
1181 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1182 return 0;
1184 return 1;
1187 #if TARGET_SUPPORTS_WIDE_INT
1188 /* Returns 1 if OP is an operand that is a CONST_INT or CONST_WIDE_INT
1189 of mode MODE. */
1191 const_scalar_int_operand (rtx op, machine_mode mode)
1193 if (!CONST_SCALAR_INT_P (op))
1194 return 0;
1196 if (CONST_INT_P (op))
1197 return const_int_operand (op, mode);
1199 if (mode != VOIDmode)
1201 int prec = GET_MODE_PRECISION (mode);
1202 int bitsize = GET_MODE_BITSIZE (mode);
1204 if (CONST_WIDE_INT_NUNITS (op) * HOST_BITS_PER_WIDE_INT > bitsize)
1205 return 0;
1207 if (prec == bitsize)
1208 return 1;
1209 else
1211 /* Multiword partial int. */
1212 HOST_WIDE_INT x
1213 = CONST_WIDE_INT_ELT (op, CONST_WIDE_INT_NUNITS (op) - 1);
1214 return (sext_hwi (x, prec & (HOST_BITS_PER_WIDE_INT - 1)) == x);
1217 return 1;
1220 /* Returns 1 if OP is an operand that is a constant integer or constant
1221 floating-point number of MODE. */
1224 const_double_operand (rtx op, machine_mode mode)
1226 return (GET_CODE (op) == CONST_DOUBLE)
1227 && (GET_MODE (op) == mode || mode == VOIDmode);
1229 #else
1230 /* Returns 1 if OP is an operand that is a constant integer or constant
1231 floating-point number of MODE. */
1234 const_double_operand (rtx op, machine_mode mode)
1236 /* Don't accept CONST_INT or anything similar
1237 if the caller wants something floating. */
1238 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1239 && GET_MODE_CLASS (mode) != MODE_INT
1240 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1241 return 0;
1243 return ((CONST_DOUBLE_P (op) || CONST_INT_P (op))
1244 && (mode == VOIDmode || GET_MODE (op) == mode
1245 || GET_MODE (op) == VOIDmode));
1247 #endif
1248 /* Return 1 if OP is a general operand that is not an immediate
1249 operand of mode MODE. */
1252 nonimmediate_operand (rtx op, machine_mode mode)
1254 return (general_operand (op, mode) && ! CONSTANT_P (op));
1257 /* Return 1 if OP is a register reference or immediate value of mode MODE. */
1260 nonmemory_operand (rtx op, machine_mode mode)
1262 if (CONSTANT_P (op))
1263 return immediate_operand (op, mode);
1264 return register_operand (op, mode);
1267 /* Return 1 if OP is a valid operand that stands for pushing a
1268 value of mode MODE onto the stack.
1270 The main use of this function is as a predicate in match_operand
1271 expressions in the machine description. */
1274 push_operand (rtx op, machine_mode mode)
1276 unsigned int rounded_size = GET_MODE_SIZE (mode);
1278 #ifdef PUSH_ROUNDING
1279 rounded_size = PUSH_ROUNDING (rounded_size);
1280 #endif
1282 if (!MEM_P (op))
1283 return 0;
1285 if (mode != VOIDmode && GET_MODE (op) != mode)
1286 return 0;
1288 op = XEXP (op, 0);
1290 if (rounded_size == GET_MODE_SIZE (mode))
1292 if (GET_CODE (op) != STACK_PUSH_CODE)
1293 return 0;
1295 else
1297 if (GET_CODE (op) != PRE_MODIFY
1298 || GET_CODE (XEXP (op, 1)) != PLUS
1299 || XEXP (XEXP (op, 1), 0) != XEXP (op, 0)
1300 || !CONST_INT_P (XEXP (XEXP (op, 1), 1))
1301 || INTVAL (XEXP (XEXP (op, 1), 1))
1302 != ((STACK_GROWS_DOWNWARD ? -1 : 1) * (int) rounded_size))
1303 return 0;
1306 return XEXP (op, 0) == stack_pointer_rtx;
1309 /* Return 1 if OP is a valid operand that stands for popping a
1310 value of mode MODE off the stack.
1312 The main use of this function is as a predicate in match_operand
1313 expressions in the machine description. */
1316 pop_operand (rtx op, machine_mode mode)
1318 if (!MEM_P (op))
1319 return 0;
1321 if (mode != VOIDmode && GET_MODE (op) != mode)
1322 return 0;
1324 op = XEXP (op, 0);
1326 if (GET_CODE (op) != STACK_POP_CODE)
1327 return 0;
1329 return XEXP (op, 0) == stack_pointer_rtx;
1332 /* Return 1 if ADDR is a valid memory address
1333 for mode MODE in address space AS. */
1336 memory_address_addr_space_p (machine_mode mode ATTRIBUTE_UNUSED,
1337 rtx addr, addr_space_t as)
1339 #ifdef GO_IF_LEGITIMATE_ADDRESS
1340 gcc_assert (ADDR_SPACE_GENERIC_P (as));
1341 GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
1342 return 0;
1344 win:
1345 return 1;
1346 #else
1347 return targetm.addr_space.legitimate_address_p (mode, addr, 0, as);
1348 #endif
1351 /* Return 1 if OP is a valid memory reference with mode MODE,
1352 including a valid address.
1354 The main use of this function is as a predicate in match_operand
1355 expressions in the machine description. */
1358 memory_operand (rtx op, machine_mode mode)
1360 rtx inner;
1362 if (! reload_completed)
1363 /* Note that no SUBREG is a memory operand before end of reload pass,
1364 because (SUBREG (MEM...)) forces reloading into a register. */
1365 return MEM_P (op) && general_operand (op, mode);
1367 if (mode != VOIDmode && GET_MODE (op) != mode)
1368 return 0;
1370 inner = op;
1371 if (GET_CODE (inner) == SUBREG)
1372 inner = SUBREG_REG (inner);
1374 return (MEM_P (inner) && general_operand (op, mode));
1377 /* Return 1 if OP is a valid indirect memory reference with mode MODE;
1378 that is, a memory reference whose address is a general_operand. */
1381 indirect_operand (rtx op, machine_mode mode)
1383 /* Before reload, a SUBREG isn't in memory (see memory_operand, above). */
1384 if (! reload_completed
1385 && GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))
1387 int offset = SUBREG_BYTE (op);
1388 rtx inner = SUBREG_REG (op);
1390 if (mode != VOIDmode && GET_MODE (op) != mode)
1391 return 0;
1393 /* The only way that we can have a general_operand as the resulting
1394 address is if OFFSET is zero and the address already is an operand
1395 or if the address is (plus Y (const_int -OFFSET)) and Y is an
1396 operand. */
1398 return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
1399 || (GET_CODE (XEXP (inner, 0)) == PLUS
1400 && CONST_INT_P (XEXP (XEXP (inner, 0), 1))
1401 && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
1402 && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
1405 return (MEM_P (op)
1406 && memory_operand (op, mode)
1407 && general_operand (XEXP (op, 0), Pmode));
1410 /* Return 1 if this is an ordered comparison operator (not including
1411 ORDERED and UNORDERED). */
1414 ordered_comparison_operator (rtx op, machine_mode mode)
1416 if (mode != VOIDmode && GET_MODE (op) != mode)
1417 return false;
1418 switch (GET_CODE (op))
1420 case EQ:
1421 case NE:
1422 case LT:
1423 case LTU:
1424 case LE:
1425 case LEU:
1426 case GT:
1427 case GTU:
1428 case GE:
1429 case GEU:
1430 return true;
1431 default:
1432 return false;
1436 /* Return 1 if this is a comparison operator. This allows the use of
1437 MATCH_OPERATOR to recognize all the branch insns. */
1440 comparison_operator (rtx op, machine_mode mode)
1442 return ((mode == VOIDmode || GET_MODE (op) == mode)
1443 && COMPARISON_P (op));
1446 /* If BODY is an insn body that uses ASM_OPERANDS, return it. */
1449 extract_asm_operands (rtx body)
1451 rtx tmp;
1452 switch (GET_CODE (body))
1454 case ASM_OPERANDS:
1455 return body;
1457 case SET:
1458 /* Single output operand: BODY is (set OUTPUT (asm_operands ...)). */
1459 tmp = SET_SRC (body);
1460 if (GET_CODE (tmp) == ASM_OPERANDS)
1461 return tmp;
1462 break;
1464 case PARALLEL:
1465 tmp = XVECEXP (body, 0, 0);
1466 if (GET_CODE (tmp) == ASM_OPERANDS)
1467 return tmp;
1468 if (GET_CODE (tmp) == SET)
1470 tmp = SET_SRC (tmp);
1471 if (GET_CODE (tmp) == ASM_OPERANDS)
1472 return tmp;
1474 break;
1476 default:
1477 break;
1479 return NULL;
1482 /* If BODY is an insn body that uses ASM_OPERANDS,
1483 return the number of operands (both input and output) in the insn.
1484 Otherwise return -1. */
1487 asm_noperands (const_rtx body)
1489 rtx asm_op = extract_asm_operands (CONST_CAST_RTX (body));
1490 int n_sets = 0;
1492 if (asm_op == NULL)
1493 return -1;
1495 if (GET_CODE (body) == SET)
1496 n_sets = 1;
1497 else if (GET_CODE (body) == PARALLEL)
1499 int i;
1500 if (GET_CODE (XVECEXP (body, 0, 0)) == SET)
1502 /* Multiple output operands, or 1 output plus some clobbers:
1503 body is
1504 [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...]. */
1505 /* Count backwards through CLOBBERs to determine number of SETs. */
1506 for (i = XVECLEN (body, 0); i > 0; i--)
1508 if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
1509 break;
1510 if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
1511 return -1;
1514 /* N_SETS is now number of output operands. */
1515 n_sets = i;
1517 /* Verify that all the SETs we have
1518 came from a single original asm_operands insn
1519 (so that invalid combinations are blocked). */
1520 for (i = 0; i < n_sets; i++)
1522 rtx elt = XVECEXP (body, 0, i);
1523 if (GET_CODE (elt) != SET)
1524 return -1;
1525 if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
1526 return -1;
1527 /* If these ASM_OPERANDS rtx's came from different original insns
1528 then they aren't allowed together. */
1529 if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
1530 != ASM_OPERANDS_INPUT_VEC (asm_op))
1531 return -1;
1534 else
1536 /* 0 outputs, but some clobbers:
1537 body is [(asm_operands ...) (clobber (reg ...))...]. */
1538 /* Make sure all the other parallel things really are clobbers. */
1539 for (i = XVECLEN (body, 0) - 1; i > 0; i--)
1540 if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
1541 return -1;
1545 return (ASM_OPERANDS_INPUT_LENGTH (asm_op)
1546 + ASM_OPERANDS_LABEL_LENGTH (asm_op) + n_sets);
1549 /* Assuming BODY is an insn body that uses ASM_OPERANDS,
1550 copy its operands (both input and output) into the vector OPERANDS,
1551 the locations of the operands within the insn into the vector OPERAND_LOCS,
1552 and the constraints for the operands into CONSTRAINTS.
1553 Write the modes of the operands into MODES.
1554 Return the assembler-template.
1556 If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
1557 we don't store that info. */
1559 const char *
1560 decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs,
1561 const char **constraints, machine_mode *modes,
1562 location_t *loc)
1564 int nbase = 0, n, i;
1565 rtx asmop;
1567 switch (GET_CODE (body))
1569 case ASM_OPERANDS:
1570 /* Zero output asm: BODY is (asm_operands ...). */
1571 asmop = body;
1572 break;
1574 case SET:
1575 /* Single output asm: BODY is (set OUTPUT (asm_operands ...)). */
1576 asmop = SET_SRC (body);
1578 /* The output is in the SET.
1579 Its constraint is in the ASM_OPERANDS itself. */
1580 if (operands)
1581 operands[0] = SET_DEST (body);
1582 if (operand_locs)
1583 operand_locs[0] = &SET_DEST (body);
1584 if (constraints)
1585 constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
1586 if (modes)
1587 modes[0] = GET_MODE (SET_DEST (body));
1588 nbase = 1;
1589 break;
1591 case PARALLEL:
1593 int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs. */
1595 asmop = XVECEXP (body, 0, 0);
1596 if (GET_CODE (asmop) == SET)
1598 asmop = SET_SRC (asmop);
1600 /* At least one output, plus some CLOBBERs. The outputs are in
1601 the SETs. Their constraints are in the ASM_OPERANDS itself. */
1602 for (i = 0; i < nparallel; i++)
1604 if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1605 break; /* Past last SET */
1606 if (operands)
1607 operands[i] = SET_DEST (XVECEXP (body, 0, i));
1608 if (operand_locs)
1609 operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1610 if (constraints)
1611 constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1612 if (modes)
1613 modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1615 nbase = i;
1617 break;
1620 default:
1621 gcc_unreachable ();
1624 n = ASM_OPERANDS_INPUT_LENGTH (asmop);
1625 for (i = 0; i < n; i++)
1627 if (operand_locs)
1628 operand_locs[nbase + i] = &ASM_OPERANDS_INPUT (asmop, i);
1629 if (operands)
1630 operands[nbase + i] = ASM_OPERANDS_INPUT (asmop, i);
1631 if (constraints)
1632 constraints[nbase + i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1633 if (modes)
1634 modes[nbase + i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1636 nbase += n;
1638 n = ASM_OPERANDS_LABEL_LENGTH (asmop);
1639 for (i = 0; i < n; i++)
1641 if (operand_locs)
1642 operand_locs[nbase + i] = &ASM_OPERANDS_LABEL (asmop, i);
1643 if (operands)
1644 operands[nbase + i] = ASM_OPERANDS_LABEL (asmop, i);
1645 if (constraints)
1646 constraints[nbase + i] = "";
1647 if (modes)
1648 modes[nbase + i] = Pmode;
1651 if (loc)
1652 *loc = ASM_OPERANDS_SOURCE_LOCATION (asmop);
1654 return ASM_OPERANDS_TEMPLATE (asmop);
1657 /* Parse inline assembly string STRING and determine which operands are
1658 referenced by % markers. For the first NOPERANDS operands, set USED[I]
1659 to true if operand I is referenced.
1661 This is intended to distinguish barrier-like asms such as:
1663 asm ("" : "=m" (...));
1665 from real references such as:
1667 asm ("sw\t$0, %0" : "=m" (...)); */
1669 void
1670 get_referenced_operands (const char *string, bool *used,
1671 unsigned int noperands)
1673 memset (used, 0, sizeof (bool) * noperands);
1674 const char *p = string;
1675 while (*p)
1676 switch (*p)
1678 case '%':
1679 p += 1;
1680 /* A letter followed by a digit indicates an operand number. */
1681 if (ISALPHA (p[0]) && ISDIGIT (p[1]))
1682 p += 1;
1683 if (ISDIGIT (*p))
1685 char *endptr;
1686 unsigned long opnum = strtoul (p, &endptr, 10);
1687 if (endptr != p && opnum < noperands)
1688 used[opnum] = true;
1689 p = endptr;
1691 else
1692 p += 1;
1693 break;
1695 default:
1696 p++;
1697 break;
1701 /* Check if an asm_operand matches its constraints.
1702 Return > 0 if ok, = 0 if bad, < 0 if inconclusive. */
1705 asm_operand_ok (rtx op, const char *constraint, const char **constraints)
1707 int result = 0;
1708 bool incdec_ok = false;
1710 /* Use constrain_operands after reload. */
1711 gcc_assert (!reload_completed);
1713 /* Empty constraint string is the same as "X,...,X", i.e. X for as
1714 many alternatives as required to match the other operands. */
1715 if (*constraint == '\0')
1716 result = 1;
1718 while (*constraint)
1720 enum constraint_num cn;
1721 char c = *constraint;
1722 int len;
1723 switch (c)
1725 case ',':
1726 constraint++;
1727 continue;
1729 case '0': case '1': case '2': case '3': case '4':
1730 case '5': case '6': case '7': case '8': case '9':
1731 /* If caller provided constraints pointer, look up
1732 the matching constraint. Otherwise, our caller should have
1733 given us the proper matching constraint, but we can't
1734 actually fail the check if they didn't. Indicate that
1735 results are inconclusive. */
1736 if (constraints)
1738 char *end;
1739 unsigned long match;
1741 match = strtoul (constraint, &end, 10);
1742 if (!result)
1743 result = asm_operand_ok (op, constraints[match], NULL);
1744 constraint = (const char *) end;
1746 else
1749 constraint++;
1750 while (ISDIGIT (*constraint));
1751 if (! result)
1752 result = -1;
1754 continue;
1756 /* The rest of the compiler assumes that reloading the address
1757 of a MEM into a register will make it fit an 'o' constraint.
1758 That is, if it sees a MEM operand for an 'o' constraint,
1759 it assumes that (mem (base-reg)) will fit.
1761 That assumption fails on targets that don't have offsettable
1762 addresses at all. We therefore need to treat 'o' asm
1763 constraints as a special case and only accept operands that
1764 are already offsettable, thus proving that at least one
1765 offsettable address exists. */
1766 case 'o': /* offsettable */
1767 if (offsettable_nonstrict_memref_p (op))
1768 result = 1;
1769 break;
1771 case 'g':
1772 if (general_operand (op, VOIDmode))
1773 result = 1;
1774 break;
1776 case '<':
1777 case '>':
1778 /* ??? Before auto-inc-dec, auto inc/dec insns are not supposed
1779 to exist, excepting those that expand_call created. Further,
1780 on some machines which do not have generalized auto inc/dec,
1781 an inc/dec is not a memory_operand.
1783 Match any memory and hope things are resolved after reload. */
1784 incdec_ok = true;
1785 default:
1786 cn = lookup_constraint (constraint);
1787 switch (get_constraint_type (cn))
1789 case CT_REGISTER:
1790 if (!result
1791 && reg_class_for_constraint (cn) != NO_REGS
1792 && GET_MODE (op) != BLKmode
1793 && register_operand (op, VOIDmode))
1794 result = 1;
1795 break;
1797 case CT_CONST_INT:
1798 if (!result
1799 && CONST_INT_P (op)
1800 && insn_const_int_ok_for_constraint (INTVAL (op), cn))
1801 result = 1;
1802 break;
1804 case CT_MEMORY:
1805 /* Every memory operand can be reloaded to fit. */
1806 result = result || memory_operand (op, VOIDmode);
1807 break;
1809 case CT_ADDRESS:
1810 /* Every address operand can be reloaded to fit. */
1811 result = result || address_operand (op, VOIDmode);
1812 break;
1814 case CT_FIXED_FORM:
1815 result = result || constraint_satisfied_p (op, cn);
1816 break;
1818 break;
1820 len = CONSTRAINT_LEN (c, constraint);
1822 constraint++;
1823 while (--len && *constraint);
1824 if (len)
1825 return 0;
1828 /* For operands without < or > constraints reject side-effects. */
1829 if (AUTO_INC_DEC && !incdec_ok && result && MEM_P (op))
1830 switch (GET_CODE (XEXP (op, 0)))
1832 case PRE_INC:
1833 case POST_INC:
1834 case PRE_DEC:
1835 case POST_DEC:
1836 case PRE_MODIFY:
1837 case POST_MODIFY:
1838 return 0;
1839 default:
1840 break;
1843 return result;
1846 /* Given an rtx *P, if it is a sum containing an integer constant term,
1847 return the location (type rtx *) of the pointer to that constant term.
1848 Otherwise, return a null pointer. */
1850 rtx *
1851 find_constant_term_loc (rtx *p)
1853 rtx *tem;
1854 enum rtx_code code = GET_CODE (*p);
1856 /* If *P IS such a constant term, P is its location. */
1858 if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1859 || code == CONST)
1860 return p;
1862 /* Otherwise, if not a sum, it has no constant term. */
1864 if (GET_CODE (*p) != PLUS)
1865 return 0;
1867 /* If one of the summands is constant, return its location. */
1869 if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1870 && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1871 return p;
1873 /* Otherwise, check each summand for containing a constant term. */
1875 if (XEXP (*p, 0) != 0)
1877 tem = find_constant_term_loc (&XEXP (*p, 0));
1878 if (tem != 0)
1879 return tem;
1882 if (XEXP (*p, 1) != 0)
1884 tem = find_constant_term_loc (&XEXP (*p, 1));
1885 if (tem != 0)
1886 return tem;
1889 return 0;
1892 /* Return 1 if OP is a memory reference
1893 whose address contains no side effects
1894 and remains valid after the addition
1895 of a positive integer less than the
1896 size of the object being referenced.
1898 We assume that the original address is valid and do not check it.
1900 This uses strict_memory_address_p as a subroutine, so
1901 don't use it before reload. */
1904 offsettable_memref_p (rtx op)
1906 return ((MEM_P (op))
1907 && offsettable_address_addr_space_p (1, GET_MODE (op), XEXP (op, 0),
1908 MEM_ADDR_SPACE (op)));
1911 /* Similar, but don't require a strictly valid mem ref:
1912 consider pseudo-regs valid as index or base regs. */
1915 offsettable_nonstrict_memref_p (rtx op)
1917 return ((MEM_P (op))
1918 && offsettable_address_addr_space_p (0, GET_MODE (op), XEXP (op, 0),
1919 MEM_ADDR_SPACE (op)));
1922 /* Return 1 if Y is a memory address which contains no side effects
1923 and would remain valid for address space AS after the addition of
1924 a positive integer less than the size of that mode.
1926 We assume that the original address is valid and do not check it.
1927 We do check that it is valid for narrower modes.
1929 If STRICTP is nonzero, we require a strictly valid address,
1930 for the sake of use in reload.c. */
1933 offsettable_address_addr_space_p (int strictp, machine_mode mode, rtx y,
1934 addr_space_t as)
1936 enum rtx_code ycode = GET_CODE (y);
1937 rtx z;
1938 rtx y1 = y;
1939 rtx *y2;
1940 int (*addressp) (machine_mode, rtx, addr_space_t) =
1941 (strictp ? strict_memory_address_addr_space_p
1942 : memory_address_addr_space_p);
1943 unsigned int mode_sz = GET_MODE_SIZE (mode);
1945 if (CONSTANT_ADDRESS_P (y))
1946 return 1;
1948 /* Adjusting an offsettable address involves changing to a narrower mode.
1949 Make sure that's OK. */
1951 if (mode_dependent_address_p (y, as))
1952 return 0;
1954 machine_mode address_mode = GET_MODE (y);
1955 if (address_mode == VOIDmode)
1956 address_mode = targetm.addr_space.address_mode (as);
1957 #ifdef POINTERS_EXTEND_UNSIGNED
1958 machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
1959 #endif
1961 /* ??? How much offset does an offsettable BLKmode reference need?
1962 Clearly that depends on the situation in which it's being used.
1963 However, the current situation in which we test 0xffffffff is
1964 less than ideal. Caveat user. */
1965 if (mode_sz == 0)
1966 mode_sz = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
1968 /* If the expression contains a constant term,
1969 see if it remains valid when max possible offset is added. */
1971 if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1973 int good;
1975 y1 = *y2;
1976 *y2 = plus_constant (address_mode, *y2, mode_sz - 1);
1977 /* Use QImode because an odd displacement may be automatically invalid
1978 for any wider mode. But it should be valid for a single byte. */
1979 good = (*addressp) (QImode, y, as);
1981 /* In any case, restore old contents of memory. */
1982 *y2 = y1;
1983 return good;
1986 if (GET_RTX_CLASS (ycode) == RTX_AUTOINC)
1987 return 0;
1989 /* The offset added here is chosen as the maximum offset that
1990 any instruction could need to add when operating on something
1991 of the specified mode. We assume that if Y and Y+c are
1992 valid addresses then so is Y+d for all 0<d<c. adjust_address will
1993 go inside a LO_SUM here, so we do so as well. */
1994 if (GET_CODE (y) == LO_SUM
1995 && mode != BLKmode
1996 && mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
1997 z = gen_rtx_LO_SUM (address_mode, XEXP (y, 0),
1998 plus_constant (address_mode, XEXP (y, 1),
1999 mode_sz - 1));
2000 #ifdef POINTERS_EXTEND_UNSIGNED
2001 /* Likewise for a ZERO_EXTEND from pointer_mode. */
2002 else if (POINTERS_EXTEND_UNSIGNED > 0
2003 && GET_CODE (y) == ZERO_EXTEND
2004 && GET_MODE (XEXP (y, 0)) == pointer_mode)
2005 z = gen_rtx_ZERO_EXTEND (address_mode,
2006 plus_constant (pointer_mode, XEXP (y, 0),
2007 mode_sz - 1));
2008 #endif
2009 else
2010 z = plus_constant (address_mode, y, mode_sz - 1);
2012 /* Use QImode because an odd displacement may be automatically invalid
2013 for any wider mode. But it should be valid for a single byte. */
2014 return (*addressp) (QImode, z, as);
2017 /* Return 1 if ADDR is an address-expression whose effect depends
2018 on the mode of the memory reference it is used in.
2020 ADDRSPACE is the address space associated with the address.
2022 Autoincrement addressing is a typical example of mode-dependence
2023 because the amount of the increment depends on the mode. */
2025 bool
2026 mode_dependent_address_p (rtx addr, addr_space_t addrspace)
2028 /* Auto-increment addressing with anything other than post_modify
2029 or pre_modify always introduces a mode dependency. Catch such
2030 cases now instead of deferring to the target. */
2031 if (GET_CODE (addr) == PRE_INC
2032 || GET_CODE (addr) == POST_INC
2033 || GET_CODE (addr) == PRE_DEC
2034 || GET_CODE (addr) == POST_DEC)
2035 return true;
2037 return targetm.mode_dependent_address_p (addr, addrspace);
2040 /* Return true if boolean attribute ATTR is supported. */
2042 static bool
2043 have_bool_attr (bool_attr attr)
2045 switch (attr)
2047 case BA_ENABLED:
2048 return HAVE_ATTR_enabled;
2049 case BA_PREFERRED_FOR_SIZE:
2050 return HAVE_ATTR_enabled || HAVE_ATTR_preferred_for_size;
2051 case BA_PREFERRED_FOR_SPEED:
2052 return HAVE_ATTR_enabled || HAVE_ATTR_preferred_for_speed;
2054 gcc_unreachable ();
2057 /* Return the value of ATTR for instruction INSN. */
2059 static bool
2060 get_bool_attr (rtx_insn *insn, bool_attr attr)
2062 switch (attr)
2064 case BA_ENABLED:
2065 return get_attr_enabled (insn);
2066 case BA_PREFERRED_FOR_SIZE:
2067 return get_attr_enabled (insn) && get_attr_preferred_for_size (insn);
2068 case BA_PREFERRED_FOR_SPEED:
2069 return get_attr_enabled (insn) && get_attr_preferred_for_speed (insn);
2071 gcc_unreachable ();
2074 /* Like get_bool_attr_mask, but don't use the cache. */
2076 static alternative_mask
2077 get_bool_attr_mask_uncached (rtx_insn *insn, bool_attr attr)
2079 /* Temporarily install enough information for get_attr_<foo> to assume
2080 that the insn operands are already cached. As above, the attribute
2081 mustn't depend on the values of operands, so we don't provide their
2082 real values here. */
2083 rtx_insn *old_insn = recog_data.insn;
2084 int old_alternative = which_alternative;
2086 recog_data.insn = insn;
2087 alternative_mask mask = ALL_ALTERNATIVES;
2088 int n_alternatives = insn_data[INSN_CODE (insn)].n_alternatives;
2089 for (int i = 0; i < n_alternatives; i++)
2091 which_alternative = i;
2092 if (!get_bool_attr (insn, attr))
2093 mask &= ~ALTERNATIVE_BIT (i);
2096 recog_data.insn = old_insn;
2097 which_alternative = old_alternative;
2098 return mask;
2101 /* Return the mask of operand alternatives that are allowed for INSN
2102 by boolean attribute ATTR. This mask depends only on INSN and on
2103 the current target; it does not depend on things like the values of
2104 operands. */
2106 static alternative_mask
2107 get_bool_attr_mask (rtx_insn *insn, bool_attr attr)
2109 /* Quick exit for asms and for targets that don't use these attributes. */
2110 int code = INSN_CODE (insn);
2111 if (code < 0 || !have_bool_attr (attr))
2112 return ALL_ALTERNATIVES;
2114 /* Calling get_attr_<foo> can be expensive, so cache the mask
2115 for speed. */
2116 if (!this_target_recog->x_bool_attr_masks[code][attr])
2117 this_target_recog->x_bool_attr_masks[code][attr]
2118 = get_bool_attr_mask_uncached (insn, attr);
2119 return this_target_recog->x_bool_attr_masks[code][attr];
2122 /* Return the set of alternatives of INSN that are allowed by the current
2123 target. */
2125 alternative_mask
2126 get_enabled_alternatives (rtx_insn *insn)
2128 return get_bool_attr_mask (insn, BA_ENABLED);
2131 /* Return the set of alternatives of INSN that are allowed by the current
2132 target and are preferred for the current size/speed optimization
2133 choice. */
2135 alternative_mask
2136 get_preferred_alternatives (rtx_insn *insn)
2138 if (optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn)))
2139 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SPEED);
2140 else
2141 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SIZE);
2144 /* Return the set of alternatives of INSN that are allowed by the current
2145 target and are preferred for the size/speed optimization choice
2146 associated with BB. Passing a separate BB is useful if INSN has not
2147 been emitted yet or if we are considering moving it to a different
2148 block. */
2150 alternative_mask
2151 get_preferred_alternatives (rtx_insn *insn, basic_block bb)
2153 if (optimize_bb_for_speed_p (bb))
2154 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SPEED);
2155 else
2156 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SIZE);
2159 /* Assert that the cached boolean attributes for INSN are still accurate.
2160 The backend is required to define these attributes in a way that only
2161 depends on the current target (rather than operands, compiler phase,
2162 etc.). */
2164 bool
2165 check_bool_attrs (rtx_insn *insn)
2167 int code = INSN_CODE (insn);
2168 if (code >= 0)
2169 for (int i = 0; i <= BA_LAST; ++i)
2171 enum bool_attr attr = (enum bool_attr) i;
2172 if (this_target_recog->x_bool_attr_masks[code][attr])
2173 gcc_assert (this_target_recog->x_bool_attr_masks[code][attr]
2174 == get_bool_attr_mask_uncached (insn, attr));
2176 return true;
2179 /* Like extract_insn, but save insn extracted and don't extract again, when
2180 called again for the same insn expecting that recog_data still contain the
2181 valid information. This is used primary by gen_attr infrastructure that
2182 often does extract insn again and again. */
2183 void
2184 extract_insn_cached (rtx_insn *insn)
2186 if (recog_data.insn == insn && INSN_CODE (insn) >= 0)
2187 return;
2188 extract_insn (insn);
2189 recog_data.insn = insn;
2192 /* Do uncached extract_insn, constrain_operands and complain about failures.
2193 This should be used when extracting a pre-existing constrained instruction
2194 if the caller wants to know which alternative was chosen. */
2195 void
2196 extract_constrain_insn (rtx_insn *insn)
2198 extract_insn (insn);
2199 if (!constrain_operands (reload_completed, get_enabled_alternatives (insn)))
2200 fatal_insn_not_found (insn);
2203 /* Do cached extract_insn, constrain_operands and complain about failures.
2204 Used by insn_attrtab. */
2205 void
2206 extract_constrain_insn_cached (rtx_insn *insn)
2208 extract_insn_cached (insn);
2209 if (which_alternative == -1
2210 && !constrain_operands (reload_completed,
2211 get_enabled_alternatives (insn)))
2212 fatal_insn_not_found (insn);
2215 /* Do cached constrain_operands on INSN and complain about failures. */
2217 constrain_operands_cached (rtx_insn *insn, int strict)
2219 if (which_alternative == -1)
2220 return constrain_operands (strict, get_enabled_alternatives (insn));
2221 else
2222 return 1;
2225 /* Analyze INSN and fill in recog_data. */
2227 void
2228 extract_insn (rtx_insn *insn)
2230 int i;
2231 int icode;
2232 int noperands;
2233 rtx body = PATTERN (insn);
2235 recog_data.n_operands = 0;
2236 recog_data.n_alternatives = 0;
2237 recog_data.n_dups = 0;
2238 recog_data.is_asm = false;
2240 switch (GET_CODE (body))
2242 case USE:
2243 case CLOBBER:
2244 case ASM_INPUT:
2245 case ADDR_VEC:
2246 case ADDR_DIFF_VEC:
2247 case VAR_LOCATION:
2248 return;
2250 case SET:
2251 if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
2252 goto asm_insn;
2253 else
2254 goto normal_insn;
2255 case PARALLEL:
2256 if ((GET_CODE (XVECEXP (body, 0, 0)) == SET
2257 && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
2258 || GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
2259 goto asm_insn;
2260 else
2261 goto normal_insn;
2262 case ASM_OPERANDS:
2263 asm_insn:
2264 recog_data.n_operands = noperands = asm_noperands (body);
2265 if (noperands >= 0)
2267 /* This insn is an `asm' with operands. */
2269 /* expand_asm_operands makes sure there aren't too many operands. */
2270 gcc_assert (noperands <= MAX_RECOG_OPERANDS);
2272 /* Now get the operand values and constraints out of the insn. */
2273 decode_asm_operands (body, recog_data.operand,
2274 recog_data.operand_loc,
2275 recog_data.constraints,
2276 recog_data.operand_mode, NULL);
2277 memset (recog_data.is_operator, 0, sizeof recog_data.is_operator);
2278 if (noperands > 0)
2280 const char *p = recog_data.constraints[0];
2281 recog_data.n_alternatives = 1;
2282 while (*p)
2283 recog_data.n_alternatives += (*p++ == ',');
2285 recog_data.is_asm = true;
2286 break;
2288 fatal_insn_not_found (insn);
2290 default:
2291 normal_insn:
2292 /* Ordinary insn: recognize it, get the operands via insn_extract
2293 and get the constraints. */
2295 icode = recog_memoized (insn);
2296 if (icode < 0)
2297 fatal_insn_not_found (insn);
2299 recog_data.n_operands = noperands = insn_data[icode].n_operands;
2300 recog_data.n_alternatives = insn_data[icode].n_alternatives;
2301 recog_data.n_dups = insn_data[icode].n_dups;
2303 insn_extract (insn);
2305 for (i = 0; i < noperands; i++)
2307 recog_data.constraints[i] = insn_data[icode].operand[i].constraint;
2308 recog_data.is_operator[i] = insn_data[icode].operand[i].is_operator;
2309 recog_data.operand_mode[i] = insn_data[icode].operand[i].mode;
2310 /* VOIDmode match_operands gets mode from their real operand. */
2311 if (recog_data.operand_mode[i] == VOIDmode)
2312 recog_data.operand_mode[i] = GET_MODE (recog_data.operand[i]);
2315 for (i = 0; i < noperands; i++)
2316 recog_data.operand_type[i]
2317 = (recog_data.constraints[i][0] == '=' ? OP_OUT
2318 : recog_data.constraints[i][0] == '+' ? OP_INOUT
2319 : OP_IN);
2321 gcc_assert (recog_data.n_alternatives <= MAX_RECOG_ALTERNATIVES);
2323 recog_data.insn = NULL;
2324 which_alternative = -1;
2327 /* Fill in OP_ALT_BASE for an instruction that has N_OPERANDS operands,
2328 N_ALTERNATIVES alternatives and constraint strings CONSTRAINTS.
2329 OP_ALT_BASE has N_ALTERNATIVES * N_OPERANDS entries and CONSTRAINTS
2330 has N_OPERANDS entries. */
2332 void
2333 preprocess_constraints (int n_operands, int n_alternatives,
2334 const char **constraints,
2335 operand_alternative *op_alt_base)
2337 for (int i = 0; i < n_operands; i++)
2339 int j;
2340 struct operand_alternative *op_alt;
2341 const char *p = constraints[i];
2343 op_alt = op_alt_base;
2345 for (j = 0; j < n_alternatives; j++, op_alt += n_operands)
2347 op_alt[i].cl = NO_REGS;
2348 op_alt[i].constraint = p;
2349 op_alt[i].matches = -1;
2350 op_alt[i].matched = -1;
2352 if (*p == '\0' || *p == ',')
2354 op_alt[i].anything_ok = 1;
2355 continue;
2358 for (;;)
2360 char c = *p;
2361 if (c == '#')
2363 c = *++p;
2364 while (c != ',' && c != '\0');
2365 if (c == ',' || c == '\0')
2367 p++;
2368 break;
2371 switch (c)
2373 case '?':
2374 op_alt[i].reject += 6;
2375 break;
2376 case '!':
2377 op_alt[i].reject += 600;
2378 break;
2379 case '&':
2380 op_alt[i].earlyclobber = 1;
2381 break;
2383 case '0': case '1': case '2': case '3': case '4':
2384 case '5': case '6': case '7': case '8': case '9':
2386 char *end;
2387 op_alt[i].matches = strtoul (p, &end, 10);
2388 op_alt[op_alt[i].matches].matched = i;
2389 p = end;
2391 continue;
2393 case 'X':
2394 op_alt[i].anything_ok = 1;
2395 break;
2397 case 'g':
2398 op_alt[i].cl =
2399 reg_class_subunion[(int) op_alt[i].cl][(int) GENERAL_REGS];
2400 break;
2402 default:
2403 enum constraint_num cn = lookup_constraint (p);
2404 enum reg_class cl;
2405 switch (get_constraint_type (cn))
2407 case CT_REGISTER:
2408 cl = reg_class_for_constraint (cn);
2409 if (cl != NO_REGS)
2410 op_alt[i].cl = reg_class_subunion[op_alt[i].cl][cl];
2411 break;
2413 case CT_CONST_INT:
2414 break;
2416 case CT_MEMORY:
2417 op_alt[i].memory_ok = 1;
2418 break;
2420 case CT_ADDRESS:
2421 op_alt[i].is_address = 1;
2422 op_alt[i].cl
2423 = (reg_class_subunion
2424 [(int) op_alt[i].cl]
2425 [(int) base_reg_class (VOIDmode, ADDR_SPACE_GENERIC,
2426 ADDRESS, SCRATCH)]);
2427 break;
2429 case CT_FIXED_FORM:
2430 break;
2432 break;
2434 p += CONSTRAINT_LEN (c, p);
2440 /* Return an array of operand_alternative instructions for
2441 instruction ICODE. */
2443 const operand_alternative *
2444 preprocess_insn_constraints (unsigned int icode)
2446 gcc_checking_assert (IN_RANGE (icode, 0, NUM_INSN_CODES - 1));
2447 if (this_target_recog->x_op_alt[icode])
2448 return this_target_recog->x_op_alt[icode];
2450 int n_operands = insn_data[icode].n_operands;
2451 if (n_operands == 0)
2452 return 0;
2453 /* Always provide at least one alternative so that which_op_alt ()
2454 works correctly. If the instruction has 0 alternatives (i.e. all
2455 constraint strings are empty) then each operand in this alternative
2456 will have anything_ok set. */
2457 int n_alternatives = MAX (insn_data[icode].n_alternatives, 1);
2458 int n_entries = n_operands * n_alternatives;
2460 operand_alternative *op_alt = XCNEWVEC (operand_alternative, n_entries);
2461 const char **constraints = XALLOCAVEC (const char *, n_operands);
2463 for (int i = 0; i < n_operands; ++i)
2464 constraints[i] = insn_data[icode].operand[i].constraint;
2465 preprocess_constraints (n_operands, n_alternatives, constraints, op_alt);
2467 this_target_recog->x_op_alt[icode] = op_alt;
2468 return op_alt;
2471 /* After calling extract_insn, you can use this function to extract some
2472 information from the constraint strings into a more usable form.
2473 The collected data is stored in recog_op_alt. */
2475 void
2476 preprocess_constraints (rtx_insn *insn)
2478 int icode = INSN_CODE (insn);
2479 if (icode >= 0)
2480 recog_op_alt = preprocess_insn_constraints (icode);
2481 else
2483 int n_operands = recog_data.n_operands;
2484 int n_alternatives = recog_data.n_alternatives;
2485 int n_entries = n_operands * n_alternatives;
2486 memset (asm_op_alt, 0, n_entries * sizeof (operand_alternative));
2487 preprocess_constraints (n_operands, n_alternatives,
2488 recog_data.constraints, asm_op_alt);
2489 recog_op_alt = asm_op_alt;
2493 /* Check the operands of an insn against the insn's operand constraints
2494 and return 1 if they match any of the alternatives in ALTERNATIVES.
2496 The information about the insn's operands, constraints, operand modes
2497 etc. is obtained from the global variables set up by extract_insn.
2499 WHICH_ALTERNATIVE is set to a number which indicates which
2500 alternative of constraints was matched: 0 for the first alternative,
2501 1 for the next, etc.
2503 In addition, when two operands are required to match
2504 and it happens that the output operand is (reg) while the
2505 input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
2506 make the output operand look like the input.
2507 This is because the output operand is the one the template will print.
2509 This is used in final, just before printing the assembler code and by
2510 the routines that determine an insn's attribute.
2512 If STRICT is a positive nonzero value, it means that we have been
2513 called after reload has been completed. In that case, we must
2514 do all checks strictly. If it is zero, it means that we have been called
2515 before reload has completed. In that case, we first try to see if we can
2516 find an alternative that matches strictly. If not, we try again, this
2517 time assuming that reload will fix up the insn. This provides a "best
2518 guess" for the alternative and is used to compute attributes of insns prior
2519 to reload. A negative value of STRICT is used for this internal call. */
2521 struct funny_match
2523 int this_op, other;
2527 constrain_operands (int strict, alternative_mask alternatives)
2529 const char *constraints[MAX_RECOG_OPERANDS];
2530 int matching_operands[MAX_RECOG_OPERANDS];
2531 int earlyclobber[MAX_RECOG_OPERANDS];
2532 int c;
2534 struct funny_match funny_match[MAX_RECOG_OPERANDS];
2535 int funny_match_index;
2537 which_alternative = 0;
2538 if (recog_data.n_operands == 0 || recog_data.n_alternatives == 0)
2539 return 1;
2541 for (c = 0; c < recog_data.n_operands; c++)
2543 constraints[c] = recog_data.constraints[c];
2544 matching_operands[c] = -1;
2549 int seen_earlyclobber_at = -1;
2550 int opno;
2551 int lose = 0;
2552 funny_match_index = 0;
2554 if (!TEST_BIT (alternatives, which_alternative))
2556 int i;
2558 for (i = 0; i < recog_data.n_operands; i++)
2559 constraints[i] = skip_alternative (constraints[i]);
2561 which_alternative++;
2562 continue;
2565 for (opno = 0; opno < recog_data.n_operands; opno++)
2567 rtx op = recog_data.operand[opno];
2568 machine_mode mode = GET_MODE (op);
2569 const char *p = constraints[opno];
2570 int offset = 0;
2571 int win = 0;
2572 int val;
2573 int len;
2575 earlyclobber[opno] = 0;
2577 /* A unary operator may be accepted by the predicate, but it
2578 is irrelevant for matching constraints. */
2579 if (UNARY_P (op))
2580 op = XEXP (op, 0);
2582 if (GET_CODE (op) == SUBREG)
2584 if (REG_P (SUBREG_REG (op))
2585 && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
2586 offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
2587 GET_MODE (SUBREG_REG (op)),
2588 SUBREG_BYTE (op),
2589 GET_MODE (op));
2590 op = SUBREG_REG (op);
2593 /* An empty constraint or empty alternative
2594 allows anything which matched the pattern. */
2595 if (*p == 0 || *p == ',')
2596 win = 1;
2599 switch (c = *p, len = CONSTRAINT_LEN (c, p), c)
2601 case '\0':
2602 len = 0;
2603 break;
2604 case ',':
2605 c = '\0';
2606 break;
2608 case '#':
2609 /* Ignore rest of this alternative as far as
2610 constraint checking is concerned. */
2612 p++;
2613 while (*p && *p != ',');
2614 len = 0;
2615 break;
2617 case '&':
2618 earlyclobber[opno] = 1;
2619 if (seen_earlyclobber_at < 0)
2620 seen_earlyclobber_at = opno;
2621 break;
2623 case '0': case '1': case '2': case '3': case '4':
2624 case '5': case '6': case '7': case '8': case '9':
2626 /* This operand must be the same as a previous one.
2627 This kind of constraint is used for instructions such
2628 as add when they take only two operands.
2630 Note that the lower-numbered operand is passed first.
2632 If we are not testing strictly, assume that this
2633 constraint will be satisfied. */
2635 char *end;
2636 int match;
2638 match = strtoul (p, &end, 10);
2639 p = end;
2641 if (strict < 0)
2642 val = 1;
2643 else
2645 rtx op1 = recog_data.operand[match];
2646 rtx op2 = recog_data.operand[opno];
2648 /* A unary operator may be accepted by the predicate,
2649 but it is irrelevant for matching constraints. */
2650 if (UNARY_P (op1))
2651 op1 = XEXP (op1, 0);
2652 if (UNARY_P (op2))
2653 op2 = XEXP (op2, 0);
2655 val = operands_match_p (op1, op2);
2658 matching_operands[opno] = match;
2659 matching_operands[match] = opno;
2661 if (val != 0)
2662 win = 1;
2664 /* If output is *x and input is *--x, arrange later
2665 to change the output to *--x as well, since the
2666 output op is the one that will be printed. */
2667 if (val == 2 && strict > 0)
2669 funny_match[funny_match_index].this_op = opno;
2670 funny_match[funny_match_index++].other = match;
2673 len = 0;
2674 break;
2676 case 'p':
2677 /* p is used for address_operands. When we are called by
2678 gen_reload, no one will have checked that the address is
2679 strictly valid, i.e., that all pseudos requiring hard regs
2680 have gotten them. */
2681 if (strict <= 0
2682 || (strict_memory_address_p (recog_data.operand_mode[opno],
2683 op)))
2684 win = 1;
2685 break;
2687 /* No need to check general_operand again;
2688 it was done in insn-recog.c. Well, except that reload
2689 doesn't check the validity of its replacements, but
2690 that should only matter when there's a bug. */
2691 case 'g':
2692 /* Anything goes unless it is a REG and really has a hard reg
2693 but the hard reg is not in the class GENERAL_REGS. */
2694 if (REG_P (op))
2696 if (strict < 0
2697 || GENERAL_REGS == ALL_REGS
2698 || (reload_in_progress
2699 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2700 || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
2701 win = 1;
2703 else if (strict < 0 || general_operand (op, mode))
2704 win = 1;
2705 break;
2707 default:
2709 enum constraint_num cn = lookup_constraint (p);
2710 enum reg_class cl = reg_class_for_constraint (cn);
2711 if (cl != NO_REGS)
2713 if (strict < 0
2714 || (strict == 0
2715 && REG_P (op)
2716 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2717 || (strict == 0 && GET_CODE (op) == SCRATCH)
2718 || (REG_P (op)
2719 && reg_fits_class_p (op, cl, offset, mode)))
2720 win = 1;
2723 else if (constraint_satisfied_p (op, cn))
2724 win = 1;
2726 else if (insn_extra_memory_constraint (cn)
2727 /* Every memory operand can be reloaded to fit. */
2728 && ((strict < 0 && MEM_P (op))
2729 /* Before reload, accept what reload can turn
2730 into a mem. */
2731 || (strict < 0 && CONSTANT_P (op))
2732 /* Before reload, accept a pseudo,
2733 since LRA can turn it into a mem. */
2734 || (strict < 0 && targetm.lra_p () && REG_P (op)
2735 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2736 /* During reload, accept a pseudo */
2737 || (reload_in_progress && REG_P (op)
2738 && REGNO (op) >= FIRST_PSEUDO_REGISTER)))
2739 win = 1;
2740 else if (insn_extra_address_constraint (cn)
2741 /* Every address operand can be reloaded to fit. */
2742 && strict < 0)
2743 win = 1;
2744 /* Cater to architectures like IA-64 that define extra memory
2745 constraints without using define_memory_constraint. */
2746 else if (reload_in_progress
2747 && REG_P (op)
2748 && REGNO (op) >= FIRST_PSEUDO_REGISTER
2749 && reg_renumber[REGNO (op)] < 0
2750 && reg_equiv_mem (REGNO (op)) != 0
2751 && constraint_satisfied_p
2752 (reg_equiv_mem (REGNO (op)), cn))
2753 win = 1;
2754 break;
2757 while (p += len, c);
2759 constraints[opno] = p;
2760 /* If this operand did not win somehow,
2761 this alternative loses. */
2762 if (! win)
2763 lose = 1;
2765 /* This alternative won; the operands are ok.
2766 Change whichever operands this alternative says to change. */
2767 if (! lose)
2769 int opno, eopno;
2771 /* See if any earlyclobber operand conflicts with some other
2772 operand. */
2774 if (strict > 0 && seen_earlyclobber_at >= 0)
2775 for (eopno = seen_earlyclobber_at;
2776 eopno < recog_data.n_operands;
2777 eopno++)
2778 /* Ignore earlyclobber operands now in memory,
2779 because we would often report failure when we have
2780 two memory operands, one of which was formerly a REG. */
2781 if (earlyclobber[eopno]
2782 && REG_P (recog_data.operand[eopno]))
2783 for (opno = 0; opno < recog_data.n_operands; opno++)
2784 if ((MEM_P (recog_data.operand[opno])
2785 || recog_data.operand_type[opno] != OP_OUT)
2786 && opno != eopno
2787 /* Ignore things like match_operator operands. */
2788 && *recog_data.constraints[opno] != 0
2789 && ! (matching_operands[opno] == eopno
2790 && operands_match_p (recog_data.operand[opno],
2791 recog_data.operand[eopno]))
2792 && ! safe_from_earlyclobber (recog_data.operand[opno],
2793 recog_data.operand[eopno]))
2794 lose = 1;
2796 if (! lose)
2798 while (--funny_match_index >= 0)
2800 recog_data.operand[funny_match[funny_match_index].other]
2801 = recog_data.operand[funny_match[funny_match_index].this_op];
2804 /* For operands without < or > constraints reject side-effects. */
2805 if (AUTO_INC_DEC && recog_data.is_asm)
2807 for (opno = 0; opno < recog_data.n_operands; opno++)
2808 if (MEM_P (recog_data.operand[opno]))
2809 switch (GET_CODE (XEXP (recog_data.operand[opno], 0)))
2811 case PRE_INC:
2812 case POST_INC:
2813 case PRE_DEC:
2814 case POST_DEC:
2815 case PRE_MODIFY:
2816 case POST_MODIFY:
2817 if (strchr (recog_data.constraints[opno], '<') == NULL
2818 && strchr (recog_data.constraints[opno], '>')
2819 == NULL)
2820 return 0;
2821 break;
2822 default:
2823 break;
2827 return 1;
2831 which_alternative++;
2833 while (which_alternative < recog_data.n_alternatives);
2835 which_alternative = -1;
2836 /* If we are about to reject this, but we are not to test strictly,
2837 try a very loose test. Only return failure if it fails also. */
2838 if (strict == 0)
2839 return constrain_operands (-1, alternatives);
2840 else
2841 return 0;
2844 /* Return true iff OPERAND (assumed to be a REG rtx)
2845 is a hard reg in class CLASS when its regno is offset by OFFSET
2846 and changed to mode MODE.
2847 If REG occupies multiple hard regs, all of them must be in CLASS. */
2849 bool
2850 reg_fits_class_p (const_rtx operand, reg_class_t cl, int offset,
2851 machine_mode mode)
2853 unsigned int regno = REGNO (operand);
2855 if (cl == NO_REGS)
2856 return false;
2858 /* Regno must not be a pseudo register. Offset may be negative. */
2859 return (HARD_REGISTER_NUM_P (regno)
2860 && HARD_REGISTER_NUM_P (regno + offset)
2861 && in_hard_reg_set_p (reg_class_contents[(int) cl], mode,
2862 regno + offset));
2865 /* Split single instruction. Helper function for split_all_insns and
2866 split_all_insns_noflow. Return last insn in the sequence if successful,
2867 or NULL if unsuccessful. */
2869 static rtx_insn *
2870 split_insn (rtx_insn *insn)
2872 /* Split insns here to get max fine-grain parallelism. */
2873 rtx_insn *first = PREV_INSN (insn);
2874 rtx_insn *last = try_split (PATTERN (insn), insn, 1);
2875 rtx insn_set, last_set, note;
2877 if (last == insn)
2878 return NULL;
2880 /* If the original instruction was a single set that was known to be
2881 equivalent to a constant, see if we can say the same about the last
2882 instruction in the split sequence. The two instructions must set
2883 the same destination. */
2884 insn_set = single_set (insn);
2885 if (insn_set)
2887 last_set = single_set (last);
2888 if (last_set && rtx_equal_p (SET_DEST (last_set), SET_DEST (insn_set)))
2890 note = find_reg_equal_equiv_note (insn);
2891 if (note && CONSTANT_P (XEXP (note, 0)))
2892 set_unique_reg_note (last, REG_EQUAL, XEXP (note, 0));
2893 else if (CONSTANT_P (SET_SRC (insn_set)))
2894 set_unique_reg_note (last, REG_EQUAL,
2895 copy_rtx (SET_SRC (insn_set)));
2899 /* try_split returns the NOTE that INSN became. */
2900 SET_INSN_DELETED (insn);
2902 /* ??? Coddle to md files that generate subregs in post-reload
2903 splitters instead of computing the proper hard register. */
2904 if (reload_completed && first != last)
2906 first = NEXT_INSN (first);
2907 for (;;)
2909 if (INSN_P (first))
2910 cleanup_subreg_operands (first);
2911 if (first == last)
2912 break;
2913 first = NEXT_INSN (first);
2917 return last;
2920 /* Split all insns in the function. If UPD_LIFE, update life info after. */
2922 void
2923 split_all_insns (void)
2925 sbitmap blocks;
2926 bool changed;
2927 basic_block bb;
2929 blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
2930 bitmap_clear (blocks);
2931 changed = false;
2933 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2935 rtx_insn *insn, *next;
2936 bool finish = false;
2938 rtl_profile_for_bb (bb);
2939 for (insn = BB_HEAD (bb); !finish ; insn = next)
2941 /* Can't use `next_real_insn' because that might go across
2942 CODE_LABELS and short-out basic blocks. */
2943 next = NEXT_INSN (insn);
2944 finish = (insn == BB_END (bb));
2945 if (INSN_P (insn))
2947 rtx set = single_set (insn);
2949 /* Don't split no-op move insns. These should silently
2950 disappear later in final. Splitting such insns would
2951 break the code that handles LIBCALL blocks. */
2952 if (set && set_noop_p (set))
2954 /* Nops get in the way while scheduling, so delete them
2955 now if register allocation has already been done. It
2956 is too risky to try to do this before register
2957 allocation, and there are unlikely to be very many
2958 nops then anyways. */
2959 if (reload_completed)
2960 delete_insn_and_edges (insn);
2962 else
2964 if (split_insn (insn))
2966 bitmap_set_bit (blocks, bb->index);
2967 changed = true;
2974 default_rtl_profile ();
2975 if (changed)
2976 find_many_sub_basic_blocks (blocks);
2978 #ifdef ENABLE_CHECKING
2979 verify_flow_info ();
2980 #endif
2982 sbitmap_free (blocks);
2985 /* Same as split_all_insns, but do not expect CFG to be available.
2986 Used by machine dependent reorg passes. */
2988 unsigned int
2989 split_all_insns_noflow (void)
2991 rtx_insn *next, *insn;
2993 for (insn = get_insns (); insn; insn = next)
2995 next = NEXT_INSN (insn);
2996 if (INSN_P (insn))
2998 /* Don't split no-op move insns. These should silently
2999 disappear later in final. Splitting such insns would
3000 break the code that handles LIBCALL blocks. */
3001 rtx set = single_set (insn);
3002 if (set && set_noop_p (set))
3004 /* Nops get in the way while scheduling, so delete them
3005 now if register allocation has already been done. It
3006 is too risky to try to do this before register
3007 allocation, and there are unlikely to be very many
3008 nops then anyways.
3010 ??? Should we use delete_insn when the CFG isn't valid? */
3011 if (reload_completed)
3012 delete_insn_and_edges (insn);
3014 else
3015 split_insn (insn);
3018 return 0;
3021 struct peep2_insn_data
3023 rtx_insn *insn;
3024 regset live_before;
3027 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
3028 static int peep2_current;
3030 static bool peep2_do_rebuild_jump_labels;
3031 static bool peep2_do_cleanup_cfg;
3033 /* The number of instructions available to match a peep2. */
3034 int peep2_current_count;
3036 /* A marker indicating the last insn of the block. The live_before regset
3037 for this element is correct, indicating DF_LIVE_OUT for the block. */
3038 #define PEEP2_EOB invalid_insn_rtx
3040 /* Wrap N to fit into the peep2_insn_data buffer. */
3042 static int
3043 peep2_buf_position (int n)
3045 if (n >= MAX_INSNS_PER_PEEP2 + 1)
3046 n -= MAX_INSNS_PER_PEEP2 + 1;
3047 return n;
3050 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
3051 does not exist. Used by the recognizer to find the next insn to match
3052 in a multi-insn pattern. */
3054 rtx_insn *
3055 peep2_next_insn (int n)
3057 gcc_assert (n <= peep2_current_count);
3059 n = peep2_buf_position (peep2_current + n);
3061 return peep2_insn_data[n].insn;
3064 /* Return true if REGNO is dead before the Nth non-note insn
3065 after `current'. */
3068 peep2_regno_dead_p (int ofs, int regno)
3070 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3072 ofs = peep2_buf_position (peep2_current + ofs);
3074 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3076 return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
3079 /* Similarly for a REG. */
3082 peep2_reg_dead_p (int ofs, rtx reg)
3084 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3086 ofs = peep2_buf_position (peep2_current + ofs);
3088 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3090 unsigned int end_regno = END_REGNO (reg);
3091 for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
3092 if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno))
3093 return 0;
3094 return 1;
3097 /* Regno offset to be used in the register search. */
3098 static int search_ofs;
3100 /* Try to find a hard register of mode MODE, matching the register class in
3101 CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
3102 remains available until the end of LAST_INSN. LAST_INSN may be NULL_RTX,
3103 in which case the only condition is that the register must be available
3104 before CURRENT_INSN.
3105 Registers that already have bits set in REG_SET will not be considered.
3107 If an appropriate register is available, it will be returned and the
3108 corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
3109 returned. */
3112 peep2_find_free_register (int from, int to, const char *class_str,
3113 machine_mode mode, HARD_REG_SET *reg_set)
3115 enum reg_class cl;
3116 HARD_REG_SET live;
3117 df_ref def;
3118 int i;
3120 gcc_assert (from < MAX_INSNS_PER_PEEP2 + 1);
3121 gcc_assert (to < MAX_INSNS_PER_PEEP2 + 1);
3123 from = peep2_buf_position (peep2_current + from);
3124 to = peep2_buf_position (peep2_current + to);
3126 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3127 REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
3129 while (from != to)
3131 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3133 /* Don't use registers set or clobbered by the insn. */
3134 FOR_EACH_INSN_DEF (def, peep2_insn_data[from].insn)
3135 SET_HARD_REG_BIT (live, DF_REF_REGNO (def));
3137 from = peep2_buf_position (from + 1);
3140 cl = reg_class_for_constraint (lookup_constraint (class_str));
3142 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3144 int raw_regno, regno, success, j;
3146 /* Distribute the free registers as much as possible. */
3147 raw_regno = search_ofs + i;
3148 if (raw_regno >= FIRST_PSEUDO_REGISTER)
3149 raw_regno -= FIRST_PSEUDO_REGISTER;
3150 #ifdef REG_ALLOC_ORDER
3151 regno = reg_alloc_order[raw_regno];
3152 #else
3153 regno = raw_regno;
3154 #endif
3156 /* Can it support the mode we need? */
3157 if (! HARD_REGNO_MODE_OK (regno, mode))
3158 continue;
3160 success = 1;
3161 for (j = 0; success && j < hard_regno_nregs[regno][mode]; j++)
3163 /* Don't allocate fixed registers. */
3164 if (fixed_regs[regno + j])
3166 success = 0;
3167 break;
3169 /* Don't allocate global registers. */
3170 if (global_regs[regno + j])
3172 success = 0;
3173 break;
3175 /* Make sure the register is of the right class. */
3176 if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno + j))
3178 success = 0;
3179 break;
3181 /* And that we don't create an extra save/restore. */
3182 if (! call_used_regs[regno + j] && ! df_regs_ever_live_p (regno + j))
3184 success = 0;
3185 break;
3188 if (! targetm.hard_regno_scratch_ok (regno + j))
3190 success = 0;
3191 break;
3194 /* And we don't clobber traceback for noreturn functions. */
3195 if ((regno + j == FRAME_POINTER_REGNUM
3196 || regno + j == HARD_FRAME_POINTER_REGNUM)
3197 && (! reload_completed || frame_pointer_needed))
3199 success = 0;
3200 break;
3203 if (TEST_HARD_REG_BIT (*reg_set, regno + j)
3204 || TEST_HARD_REG_BIT (live, regno + j))
3206 success = 0;
3207 break;
3211 if (success)
3213 add_to_hard_reg_set (reg_set, mode, regno);
3215 /* Start the next search with the next register. */
3216 if (++raw_regno >= FIRST_PSEUDO_REGISTER)
3217 raw_regno = 0;
3218 search_ofs = raw_regno;
3220 return gen_rtx_REG (mode, regno);
3224 search_ofs = 0;
3225 return NULL_RTX;
3228 /* Forget all currently tracked instructions, only remember current
3229 LIVE regset. */
3231 static void
3232 peep2_reinit_state (regset live)
3234 int i;
3236 /* Indicate that all slots except the last holds invalid data. */
3237 for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3238 peep2_insn_data[i].insn = NULL;
3239 peep2_current_count = 0;
3241 /* Indicate that the last slot contains live_after data. */
3242 peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3243 peep2_current = MAX_INSNS_PER_PEEP2;
3245 COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3248 /* While scanning basic block BB, we found a match of length MATCH_LEN,
3249 starting at INSN. Perform the replacement, removing the old insns and
3250 replacing them with ATTEMPT. Returns the last insn emitted, or NULL
3251 if the replacement is rejected. */
3253 static rtx_insn *
3254 peep2_attempt (basic_block bb, rtx_insn *insn, int match_len, rtx_insn *attempt)
3256 int i;
3257 rtx_insn *last, *before_try, *x;
3258 rtx eh_note, as_note;
3259 rtx_insn *old_insn;
3260 rtx_insn *new_insn;
3261 bool was_call = false;
3263 /* If we are splitting an RTX_FRAME_RELATED_P insn, do not allow it to
3264 match more than one insn, or to be split into more than one insn. */
3265 old_insn = peep2_insn_data[peep2_current].insn;
3266 if (RTX_FRAME_RELATED_P (old_insn))
3268 bool any_note = false;
3269 rtx note;
3271 if (match_len != 0)
3272 return NULL;
3274 /* Look for one "active" insn. I.e. ignore any "clobber" insns that
3275 may be in the stream for the purpose of register allocation. */
3276 if (active_insn_p (attempt))
3277 new_insn = attempt;
3278 else
3279 new_insn = next_active_insn (attempt);
3280 if (next_active_insn (new_insn))
3281 return NULL;
3283 /* We have a 1-1 replacement. Copy over any frame-related info. */
3284 RTX_FRAME_RELATED_P (new_insn) = 1;
3286 /* Allow the backend to fill in a note during the split. */
3287 for (note = REG_NOTES (new_insn); note ; note = XEXP (note, 1))
3288 switch (REG_NOTE_KIND (note))
3290 case REG_FRAME_RELATED_EXPR:
3291 case REG_CFA_DEF_CFA:
3292 case REG_CFA_ADJUST_CFA:
3293 case REG_CFA_OFFSET:
3294 case REG_CFA_REGISTER:
3295 case REG_CFA_EXPRESSION:
3296 case REG_CFA_RESTORE:
3297 case REG_CFA_SET_VDRAP:
3298 any_note = true;
3299 break;
3300 default:
3301 break;
3304 /* If the backend didn't supply a note, copy one over. */
3305 if (!any_note)
3306 for (note = REG_NOTES (old_insn); note ; note = XEXP (note, 1))
3307 switch (REG_NOTE_KIND (note))
3309 case REG_FRAME_RELATED_EXPR:
3310 case REG_CFA_DEF_CFA:
3311 case REG_CFA_ADJUST_CFA:
3312 case REG_CFA_OFFSET:
3313 case REG_CFA_REGISTER:
3314 case REG_CFA_EXPRESSION:
3315 case REG_CFA_RESTORE:
3316 case REG_CFA_SET_VDRAP:
3317 add_reg_note (new_insn, REG_NOTE_KIND (note), XEXP (note, 0));
3318 any_note = true;
3319 break;
3320 default:
3321 break;
3324 /* If there still isn't a note, make sure the unwind info sees the
3325 same expression as before the split. */
3326 if (!any_note)
3328 rtx old_set, new_set;
3330 /* The old insn had better have been simple, or annotated. */
3331 old_set = single_set (old_insn);
3332 gcc_assert (old_set != NULL);
3334 new_set = single_set (new_insn);
3335 if (!new_set || !rtx_equal_p (new_set, old_set))
3336 add_reg_note (new_insn, REG_FRAME_RELATED_EXPR, old_set);
3339 /* Copy prologue/epilogue status. This is required in order to keep
3340 proper placement of EPILOGUE_BEG and the DW_CFA_remember_state. */
3341 maybe_copy_prologue_epilogue_insn (old_insn, new_insn);
3344 /* If we are splitting a CALL_INSN, look for the CALL_INSN
3345 in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3346 cfg-related call notes. */
3347 for (i = 0; i <= match_len; ++i)
3349 int j;
3350 rtx note;
3352 j = peep2_buf_position (peep2_current + i);
3353 old_insn = peep2_insn_data[j].insn;
3354 if (!CALL_P (old_insn))
3355 continue;
3356 was_call = true;
3358 new_insn = attempt;
3359 while (new_insn != NULL_RTX)
3361 if (CALL_P (new_insn))
3362 break;
3363 new_insn = NEXT_INSN (new_insn);
3366 gcc_assert (new_insn != NULL_RTX);
3368 CALL_INSN_FUNCTION_USAGE (new_insn)
3369 = CALL_INSN_FUNCTION_USAGE (old_insn);
3370 SIBLING_CALL_P (new_insn) = SIBLING_CALL_P (old_insn);
3372 for (note = REG_NOTES (old_insn);
3373 note;
3374 note = XEXP (note, 1))
3375 switch (REG_NOTE_KIND (note))
3377 case REG_NORETURN:
3378 case REG_SETJMP:
3379 case REG_TM:
3380 add_reg_note (new_insn, REG_NOTE_KIND (note),
3381 XEXP (note, 0));
3382 break;
3383 default:
3384 /* Discard all other reg notes. */
3385 break;
3388 /* Croak if there is another call in the sequence. */
3389 while (++i <= match_len)
3391 j = peep2_buf_position (peep2_current + i);
3392 old_insn = peep2_insn_data[j].insn;
3393 gcc_assert (!CALL_P (old_insn));
3395 break;
3398 /* If we matched any instruction that had a REG_ARGS_SIZE, then
3399 move those notes over to the new sequence. */
3400 as_note = NULL;
3401 for (i = match_len; i >= 0; --i)
3403 int j = peep2_buf_position (peep2_current + i);
3404 old_insn = peep2_insn_data[j].insn;
3406 as_note = find_reg_note (old_insn, REG_ARGS_SIZE, NULL);
3407 if (as_note)
3408 break;
3411 i = peep2_buf_position (peep2_current + match_len);
3412 eh_note = find_reg_note (peep2_insn_data[i].insn, REG_EH_REGION, NULL_RTX);
3414 /* Replace the old sequence with the new. */
3415 rtx_insn *peepinsn = peep2_insn_data[i].insn;
3416 last = emit_insn_after_setloc (attempt,
3417 peep2_insn_data[i].insn,
3418 INSN_LOCATION (peepinsn));
3419 before_try = PREV_INSN (insn);
3420 delete_insn_chain (insn, peep2_insn_data[i].insn, false);
3422 /* Re-insert the EH_REGION notes. */
3423 if (eh_note || (was_call && nonlocal_goto_handler_labels))
3425 edge eh_edge;
3426 edge_iterator ei;
3428 FOR_EACH_EDGE (eh_edge, ei, bb->succs)
3429 if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
3430 break;
3432 if (eh_note)
3433 copy_reg_eh_region_note_backward (eh_note, last, before_try);
3435 if (eh_edge)
3436 for (x = last; x != before_try; x = PREV_INSN (x))
3437 if (x != BB_END (bb)
3438 && (can_throw_internal (x)
3439 || can_nonlocal_goto (x)))
3441 edge nfte, nehe;
3442 int flags;
3444 nfte = split_block (bb, x);
3445 flags = (eh_edge->flags
3446 & (EDGE_EH | EDGE_ABNORMAL));
3447 if (CALL_P (x))
3448 flags |= EDGE_ABNORMAL_CALL;
3449 nehe = make_edge (nfte->src, eh_edge->dest,
3450 flags);
3452 nehe->probability = eh_edge->probability;
3453 nfte->probability
3454 = REG_BR_PROB_BASE - nehe->probability;
3456 peep2_do_cleanup_cfg |= purge_dead_edges (nfte->dest);
3457 bb = nfte->src;
3458 eh_edge = nehe;
3461 /* Converting possibly trapping insn to non-trapping is
3462 possible. Zap dummy outgoing edges. */
3463 peep2_do_cleanup_cfg |= purge_dead_edges (bb);
3466 /* Re-insert the ARGS_SIZE notes. */
3467 if (as_note)
3468 fixup_args_size_notes (before_try, last, INTVAL (XEXP (as_note, 0)));
3470 /* If we generated a jump instruction, it won't have
3471 JUMP_LABEL set. Recompute after we're done. */
3472 for (x = last; x != before_try; x = PREV_INSN (x))
3473 if (JUMP_P (x))
3475 peep2_do_rebuild_jump_labels = true;
3476 break;
3479 return last;
3482 /* After performing a replacement in basic block BB, fix up the life
3483 information in our buffer. LAST is the last of the insns that we
3484 emitted as a replacement. PREV is the insn before the start of
3485 the replacement. MATCH_LEN is the number of instructions that were
3486 matched, and which now need to be replaced in the buffer. */
3488 static void
3489 peep2_update_life (basic_block bb, int match_len, rtx_insn *last,
3490 rtx_insn *prev)
3492 int i = peep2_buf_position (peep2_current + match_len + 1);
3493 rtx_insn *x;
3494 regset_head live;
3496 INIT_REG_SET (&live);
3497 COPY_REG_SET (&live, peep2_insn_data[i].live_before);
3499 gcc_assert (peep2_current_count >= match_len + 1);
3500 peep2_current_count -= match_len + 1;
3502 x = last;
3505 if (INSN_P (x))
3507 df_insn_rescan (x);
3508 if (peep2_current_count < MAX_INSNS_PER_PEEP2)
3510 peep2_current_count++;
3511 if (--i < 0)
3512 i = MAX_INSNS_PER_PEEP2;
3513 peep2_insn_data[i].insn = x;
3514 df_simulate_one_insn_backwards (bb, x, &live);
3515 COPY_REG_SET (peep2_insn_data[i].live_before, &live);
3518 x = PREV_INSN (x);
3520 while (x != prev);
3521 CLEAR_REG_SET (&live);
3523 peep2_current = i;
3526 /* Add INSN, which is in BB, at the end of the peep2 insn buffer if possible.
3527 Return true if we added it, false otherwise. The caller will try to match
3528 peepholes against the buffer if we return false; otherwise it will try to
3529 add more instructions to the buffer. */
3531 static bool
3532 peep2_fill_buffer (basic_block bb, rtx_insn *insn, regset live)
3534 int pos;
3536 /* Once we have filled the maximum number of insns the buffer can hold,
3537 allow the caller to match the insns against peepholes. We wait until
3538 the buffer is full in case the target has similar peepholes of different
3539 length; we always want to match the longest if possible. */
3540 if (peep2_current_count == MAX_INSNS_PER_PEEP2)
3541 return false;
3543 /* If an insn has RTX_FRAME_RELATED_P set, do not allow it to be matched with
3544 any other pattern, lest it change the semantics of the frame info. */
3545 if (RTX_FRAME_RELATED_P (insn))
3547 /* Let the buffer drain first. */
3548 if (peep2_current_count > 0)
3549 return false;
3550 /* Now the insn will be the only thing in the buffer. */
3553 pos = peep2_buf_position (peep2_current + peep2_current_count);
3554 peep2_insn_data[pos].insn = insn;
3555 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3556 peep2_current_count++;
3558 df_simulate_one_insn_forwards (bb, insn, live);
3559 return true;
3562 /* Perform the peephole2 optimization pass. */
3564 static void
3565 peephole2_optimize (void)
3567 rtx_insn *insn;
3568 bitmap live;
3569 int i;
3570 basic_block bb;
3572 peep2_do_cleanup_cfg = false;
3573 peep2_do_rebuild_jump_labels = false;
3575 df_set_flags (DF_LR_RUN_DCE);
3576 df_note_add_problem ();
3577 df_analyze ();
3579 /* Initialize the regsets we're going to use. */
3580 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3581 peep2_insn_data[i].live_before = BITMAP_ALLOC (&reg_obstack);
3582 search_ofs = 0;
3583 live = BITMAP_ALLOC (&reg_obstack);
3585 FOR_EACH_BB_REVERSE_FN (bb, cfun)
3587 bool past_end = false;
3588 int pos;
3590 rtl_profile_for_bb (bb);
3592 /* Start up propagation. */
3593 bitmap_copy (live, DF_LR_IN (bb));
3594 df_simulate_initialize_forwards (bb, live);
3595 peep2_reinit_state (live);
3597 insn = BB_HEAD (bb);
3598 for (;;)
3600 rtx_insn *attempt, *head;
3601 int match_len;
3603 if (!past_end && !NONDEBUG_INSN_P (insn))
3605 next_insn:
3606 insn = NEXT_INSN (insn);
3607 if (insn == NEXT_INSN (BB_END (bb)))
3608 past_end = true;
3609 continue;
3611 if (!past_end && peep2_fill_buffer (bb, insn, live))
3612 goto next_insn;
3614 /* If we did not fill an empty buffer, it signals the end of the
3615 block. */
3616 if (peep2_current_count == 0)
3617 break;
3619 /* The buffer filled to the current maximum, so try to match. */
3621 pos = peep2_buf_position (peep2_current + peep2_current_count);
3622 peep2_insn_data[pos].insn = PEEP2_EOB;
3623 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3625 /* Match the peephole. */
3626 head = peep2_insn_data[peep2_current].insn;
3627 attempt = peephole2_insns (PATTERN (head), head, &match_len);
3628 if (attempt != NULL)
3630 rtx_insn *last = peep2_attempt (bb, head, match_len, attempt);
3631 if (last)
3633 peep2_update_life (bb, match_len, last, PREV_INSN (attempt));
3634 continue;
3638 /* No match: advance the buffer by one insn. */
3639 peep2_current = peep2_buf_position (peep2_current + 1);
3640 peep2_current_count--;
3644 default_rtl_profile ();
3645 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3646 BITMAP_FREE (peep2_insn_data[i].live_before);
3647 BITMAP_FREE (live);
3648 if (peep2_do_rebuild_jump_labels)
3649 rebuild_jump_labels (get_insns ());
3650 if (peep2_do_cleanup_cfg)
3651 cleanup_cfg (CLEANUP_CFG_CHANGED);
3654 /* Common predicates for use with define_bypass. */
3656 /* True if the dependency between OUT_INSN and IN_INSN is on the store
3657 data not the address operand(s) of the store. IN_INSN and OUT_INSN
3658 must be either a single_set or a PARALLEL with SETs inside. */
3661 store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3663 rtx out_set, in_set;
3664 rtx out_pat, in_pat;
3665 rtx out_exp, in_exp;
3666 int i, j;
3668 in_set = single_set (in_insn);
3669 if (in_set)
3671 if (!MEM_P (SET_DEST (in_set)))
3672 return false;
3674 out_set = single_set (out_insn);
3675 if (out_set)
3677 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
3678 return false;
3680 else
3682 out_pat = PATTERN (out_insn);
3684 if (GET_CODE (out_pat) != PARALLEL)
3685 return false;
3687 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3689 out_exp = XVECEXP (out_pat, 0, i);
3691 if (GET_CODE (out_exp) == CLOBBER)
3692 continue;
3694 gcc_assert (GET_CODE (out_exp) == SET);
3696 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_set)))
3697 return false;
3701 else
3703 in_pat = PATTERN (in_insn);
3704 gcc_assert (GET_CODE (in_pat) == PARALLEL);
3706 for (i = 0; i < XVECLEN (in_pat, 0); i++)
3708 in_exp = XVECEXP (in_pat, 0, i);
3710 if (GET_CODE (in_exp) == CLOBBER)
3711 continue;
3713 gcc_assert (GET_CODE (in_exp) == SET);
3715 if (!MEM_P (SET_DEST (in_exp)))
3716 return false;
3718 out_set = single_set (out_insn);
3719 if (out_set)
3721 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_exp)))
3722 return false;
3724 else
3726 out_pat = PATTERN (out_insn);
3727 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3729 for (j = 0; j < XVECLEN (out_pat, 0); j++)
3731 out_exp = XVECEXP (out_pat, 0, j);
3733 if (GET_CODE (out_exp) == CLOBBER)
3734 continue;
3736 gcc_assert (GET_CODE (out_exp) == SET);
3738 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_exp)))
3739 return false;
3745 return true;
3748 /* True if the dependency between OUT_INSN and IN_INSN is in the IF_THEN_ELSE
3749 condition, and not the THEN or ELSE branch. OUT_INSN may be either a single
3750 or multiple set; IN_INSN should be single_set for truth, but for convenience
3751 of insn categorization may be any JUMP or CALL insn. */
3754 if_test_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3756 rtx out_set, in_set;
3758 in_set = single_set (in_insn);
3759 if (! in_set)
3761 gcc_assert (JUMP_P (in_insn) || CALL_P (in_insn));
3762 return false;
3765 if (GET_CODE (SET_SRC (in_set)) != IF_THEN_ELSE)
3766 return false;
3767 in_set = SET_SRC (in_set);
3769 out_set = single_set (out_insn);
3770 if (out_set)
3772 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3773 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3774 return false;
3776 else
3778 rtx out_pat;
3779 int i;
3781 out_pat = PATTERN (out_insn);
3782 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3784 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3786 rtx exp = XVECEXP (out_pat, 0, i);
3788 if (GET_CODE (exp) == CLOBBER)
3789 continue;
3791 gcc_assert (GET_CODE (exp) == SET);
3793 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3794 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3795 return false;
3799 return true;
3802 static unsigned int
3803 rest_of_handle_peephole2 (void)
3805 if (HAVE_peephole2)
3806 peephole2_optimize ();
3808 return 0;
3811 namespace {
3813 const pass_data pass_data_peephole2 =
3815 RTL_PASS, /* type */
3816 "peephole2", /* name */
3817 OPTGROUP_NONE, /* optinfo_flags */
3818 TV_PEEPHOLE2, /* tv_id */
3819 0, /* properties_required */
3820 0, /* properties_provided */
3821 0, /* properties_destroyed */
3822 0, /* todo_flags_start */
3823 TODO_df_finish, /* todo_flags_finish */
3826 class pass_peephole2 : public rtl_opt_pass
3828 public:
3829 pass_peephole2 (gcc::context *ctxt)
3830 : rtl_opt_pass (pass_data_peephole2, ctxt)
3833 /* opt_pass methods: */
3834 /* The epiphany backend creates a second instance of this pass, so we need
3835 a clone method. */
3836 opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
3837 virtual bool gate (function *) { return (optimize > 0 && flag_peephole2); }
3838 virtual unsigned int execute (function *)
3840 return rest_of_handle_peephole2 ();
3843 }; // class pass_peephole2
3845 } // anon namespace
3847 rtl_opt_pass *
3848 make_pass_peephole2 (gcc::context *ctxt)
3850 return new pass_peephole2 (ctxt);
3853 namespace {
3855 const pass_data pass_data_split_all_insns =
3857 RTL_PASS, /* type */
3858 "split1", /* name */
3859 OPTGROUP_NONE, /* optinfo_flags */
3860 TV_NONE, /* tv_id */
3861 0, /* properties_required */
3862 0, /* properties_provided */
3863 0, /* properties_destroyed */
3864 0, /* todo_flags_start */
3865 0, /* todo_flags_finish */
3868 class pass_split_all_insns : public rtl_opt_pass
3870 public:
3871 pass_split_all_insns (gcc::context *ctxt)
3872 : rtl_opt_pass (pass_data_split_all_insns, ctxt)
3875 /* opt_pass methods: */
3876 /* The epiphany backend creates a second instance of this pass, so
3877 we need a clone method. */
3878 opt_pass * clone () { return new pass_split_all_insns (m_ctxt); }
3879 virtual unsigned int execute (function *)
3881 split_all_insns ();
3882 return 0;
3885 }; // class pass_split_all_insns
3887 } // anon namespace
3889 rtl_opt_pass *
3890 make_pass_split_all_insns (gcc::context *ctxt)
3892 return new pass_split_all_insns (ctxt);
3895 static unsigned int
3896 rest_of_handle_split_after_reload (void)
3898 /* If optimizing, then go ahead and split insns now. */
3899 #ifndef STACK_REGS
3900 if (optimize > 0)
3901 #endif
3902 split_all_insns ();
3903 return 0;
3906 namespace {
3908 const pass_data pass_data_split_after_reload =
3910 RTL_PASS, /* type */
3911 "split2", /* name */
3912 OPTGROUP_NONE, /* optinfo_flags */
3913 TV_NONE, /* tv_id */
3914 0, /* properties_required */
3915 0, /* properties_provided */
3916 0, /* properties_destroyed */
3917 0, /* todo_flags_start */
3918 0, /* todo_flags_finish */
3921 class pass_split_after_reload : public rtl_opt_pass
3923 public:
3924 pass_split_after_reload (gcc::context *ctxt)
3925 : rtl_opt_pass (pass_data_split_after_reload, ctxt)
3928 /* opt_pass methods: */
3929 virtual unsigned int execute (function *)
3931 return rest_of_handle_split_after_reload ();
3934 }; // class pass_split_after_reload
3936 } // anon namespace
3938 rtl_opt_pass *
3939 make_pass_split_after_reload (gcc::context *ctxt)
3941 return new pass_split_after_reload (ctxt);
3944 namespace {
3946 const pass_data pass_data_split_before_regstack =
3948 RTL_PASS, /* type */
3949 "split3", /* name */
3950 OPTGROUP_NONE, /* optinfo_flags */
3951 TV_NONE, /* tv_id */
3952 0, /* properties_required */
3953 0, /* properties_provided */
3954 0, /* properties_destroyed */
3955 0, /* todo_flags_start */
3956 0, /* todo_flags_finish */
3959 class pass_split_before_regstack : public rtl_opt_pass
3961 public:
3962 pass_split_before_regstack (gcc::context *ctxt)
3963 : rtl_opt_pass (pass_data_split_before_regstack, ctxt)
3966 /* opt_pass methods: */
3967 virtual bool gate (function *);
3968 virtual unsigned int execute (function *)
3970 split_all_insns ();
3971 return 0;
3974 }; // class pass_split_before_regstack
3976 bool
3977 pass_split_before_regstack::gate (function *)
3979 #if HAVE_ATTR_length && defined (STACK_REGS)
3980 /* If flow2 creates new instructions which need splitting
3981 and scheduling after reload is not done, they might not be
3982 split until final which doesn't allow splitting
3983 if HAVE_ATTR_length. */
3984 # ifdef INSN_SCHEDULING
3985 return (optimize && !flag_schedule_insns_after_reload);
3986 # else
3987 return (optimize);
3988 # endif
3989 #else
3990 return 0;
3991 #endif
3994 } // anon namespace
3996 rtl_opt_pass *
3997 make_pass_split_before_regstack (gcc::context *ctxt)
3999 return new pass_split_before_regstack (ctxt);
4002 static unsigned int
4003 rest_of_handle_split_before_sched2 (void)
4005 #ifdef INSN_SCHEDULING
4006 split_all_insns ();
4007 #endif
4008 return 0;
4011 namespace {
4013 const pass_data pass_data_split_before_sched2 =
4015 RTL_PASS, /* type */
4016 "split4", /* name */
4017 OPTGROUP_NONE, /* optinfo_flags */
4018 TV_NONE, /* tv_id */
4019 0, /* properties_required */
4020 0, /* properties_provided */
4021 0, /* properties_destroyed */
4022 0, /* todo_flags_start */
4023 0, /* todo_flags_finish */
4026 class pass_split_before_sched2 : public rtl_opt_pass
4028 public:
4029 pass_split_before_sched2 (gcc::context *ctxt)
4030 : rtl_opt_pass (pass_data_split_before_sched2, ctxt)
4033 /* opt_pass methods: */
4034 virtual bool gate (function *)
4036 #ifdef INSN_SCHEDULING
4037 return optimize > 0 && flag_schedule_insns_after_reload;
4038 #else
4039 return false;
4040 #endif
4043 virtual unsigned int execute (function *)
4045 return rest_of_handle_split_before_sched2 ();
4048 }; // class pass_split_before_sched2
4050 } // anon namespace
4052 rtl_opt_pass *
4053 make_pass_split_before_sched2 (gcc::context *ctxt)
4055 return new pass_split_before_sched2 (ctxt);
4058 namespace {
4060 const pass_data pass_data_split_for_shorten_branches =
4062 RTL_PASS, /* type */
4063 "split5", /* name */
4064 OPTGROUP_NONE, /* optinfo_flags */
4065 TV_NONE, /* tv_id */
4066 0, /* properties_required */
4067 0, /* properties_provided */
4068 0, /* properties_destroyed */
4069 0, /* todo_flags_start */
4070 0, /* todo_flags_finish */
4073 class pass_split_for_shorten_branches : public rtl_opt_pass
4075 public:
4076 pass_split_for_shorten_branches (gcc::context *ctxt)
4077 : rtl_opt_pass (pass_data_split_for_shorten_branches, ctxt)
4080 /* opt_pass methods: */
4081 virtual bool gate (function *)
4083 /* The placement of the splitting that we do for shorten_branches
4084 depends on whether regstack is used by the target or not. */
4085 #if HAVE_ATTR_length && !defined (STACK_REGS)
4086 return true;
4087 #else
4088 return false;
4089 #endif
4092 virtual unsigned int execute (function *)
4094 return split_all_insns_noflow ();
4097 }; // class pass_split_for_shorten_branches
4099 } // anon namespace
4101 rtl_opt_pass *
4102 make_pass_split_for_shorten_branches (gcc::context *ctxt)
4104 return new pass_split_for_shorten_branches (ctxt);
4107 /* (Re)initialize the target information after a change in target. */
4109 void
4110 recog_init ()
4112 /* The information is zero-initialized, so we don't need to do anything
4113 first time round. */
4114 if (!this_target_recog->x_initialized)
4116 this_target_recog->x_initialized = true;
4117 return;
4119 memset (this_target_recog->x_bool_attr_masks, 0,
4120 sizeof (this_target_recog->x_bool_attr_masks));
4121 for (unsigned int i = 0; i < NUM_INSN_CODES; ++i)
4122 if (this_target_recog->x_op_alt[i])
4124 free (this_target_recog->x_op_alt[i]);
4125 this_target_recog->x_op_alt[i] = 0;