Fix for ICE with -g on testcase with incomplete types.
[official-gcc.git] / gcc / recog.c
blob2cd06f58e77af6443bdf8363a8afaaec15834920
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 checking_verify_flow_info ();
2980 sbitmap_free (blocks);
2983 /* Same as split_all_insns, but do not expect CFG to be available.
2984 Used by machine dependent reorg passes. */
2986 unsigned int
2987 split_all_insns_noflow (void)
2989 rtx_insn *next, *insn;
2991 for (insn = get_insns (); insn; insn = next)
2993 next = NEXT_INSN (insn);
2994 if (INSN_P (insn))
2996 /* Don't split no-op move insns. These should silently
2997 disappear later in final. Splitting such insns would
2998 break the code that handles LIBCALL blocks. */
2999 rtx set = single_set (insn);
3000 if (set && set_noop_p (set))
3002 /* Nops get in the way while scheduling, so delete them
3003 now if register allocation has already been done. It
3004 is too risky to try to do this before register
3005 allocation, and there are unlikely to be very many
3006 nops then anyways.
3008 ??? Should we use delete_insn when the CFG isn't valid? */
3009 if (reload_completed)
3010 delete_insn_and_edges (insn);
3012 else
3013 split_insn (insn);
3016 return 0;
3019 struct peep2_insn_data
3021 rtx_insn *insn;
3022 regset live_before;
3025 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
3026 static int peep2_current;
3028 static bool peep2_do_rebuild_jump_labels;
3029 static bool peep2_do_cleanup_cfg;
3031 /* The number of instructions available to match a peep2. */
3032 int peep2_current_count;
3034 /* A marker indicating the last insn of the block. The live_before regset
3035 for this element is correct, indicating DF_LIVE_OUT for the block. */
3036 #define PEEP2_EOB invalid_insn_rtx
3038 /* Wrap N to fit into the peep2_insn_data buffer. */
3040 static int
3041 peep2_buf_position (int n)
3043 if (n >= MAX_INSNS_PER_PEEP2 + 1)
3044 n -= MAX_INSNS_PER_PEEP2 + 1;
3045 return n;
3048 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
3049 does not exist. Used by the recognizer to find the next insn to match
3050 in a multi-insn pattern. */
3052 rtx_insn *
3053 peep2_next_insn (int n)
3055 gcc_assert (n <= peep2_current_count);
3057 n = peep2_buf_position (peep2_current + n);
3059 return peep2_insn_data[n].insn;
3062 /* Return true if REGNO is dead before the Nth non-note insn
3063 after `current'. */
3066 peep2_regno_dead_p (int ofs, int regno)
3068 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3070 ofs = peep2_buf_position (peep2_current + ofs);
3072 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3074 return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
3077 /* Similarly for a REG. */
3080 peep2_reg_dead_p (int ofs, rtx reg)
3082 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3084 ofs = peep2_buf_position (peep2_current + ofs);
3086 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3088 unsigned int end_regno = END_REGNO (reg);
3089 for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
3090 if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno))
3091 return 0;
3092 return 1;
3095 /* Regno offset to be used in the register search. */
3096 static int search_ofs;
3098 /* Try to find a hard register of mode MODE, matching the register class in
3099 CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
3100 remains available until the end of LAST_INSN. LAST_INSN may be NULL_RTX,
3101 in which case the only condition is that the register must be available
3102 before CURRENT_INSN.
3103 Registers that already have bits set in REG_SET will not be considered.
3105 If an appropriate register is available, it will be returned and the
3106 corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
3107 returned. */
3110 peep2_find_free_register (int from, int to, const char *class_str,
3111 machine_mode mode, HARD_REG_SET *reg_set)
3113 enum reg_class cl;
3114 HARD_REG_SET live;
3115 df_ref def;
3116 int i;
3118 gcc_assert (from < MAX_INSNS_PER_PEEP2 + 1);
3119 gcc_assert (to < MAX_INSNS_PER_PEEP2 + 1);
3121 from = peep2_buf_position (peep2_current + from);
3122 to = peep2_buf_position (peep2_current + to);
3124 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3125 REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
3127 while (from != to)
3129 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3131 /* Don't use registers set or clobbered by the insn. */
3132 FOR_EACH_INSN_DEF (def, peep2_insn_data[from].insn)
3133 SET_HARD_REG_BIT (live, DF_REF_REGNO (def));
3135 from = peep2_buf_position (from + 1);
3138 cl = reg_class_for_constraint (lookup_constraint (class_str));
3140 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3142 int raw_regno, regno, success, j;
3144 /* Distribute the free registers as much as possible. */
3145 raw_regno = search_ofs + i;
3146 if (raw_regno >= FIRST_PSEUDO_REGISTER)
3147 raw_regno -= FIRST_PSEUDO_REGISTER;
3148 #ifdef REG_ALLOC_ORDER
3149 regno = reg_alloc_order[raw_regno];
3150 #else
3151 regno = raw_regno;
3152 #endif
3154 /* Can it support the mode we need? */
3155 if (! HARD_REGNO_MODE_OK (regno, mode))
3156 continue;
3158 success = 1;
3159 for (j = 0; success && j < hard_regno_nregs[regno][mode]; j++)
3161 /* Don't allocate fixed registers. */
3162 if (fixed_regs[regno + j])
3164 success = 0;
3165 break;
3167 /* Don't allocate global registers. */
3168 if (global_regs[regno + j])
3170 success = 0;
3171 break;
3173 /* Make sure the register is of the right class. */
3174 if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno + j))
3176 success = 0;
3177 break;
3179 /* And that we don't create an extra save/restore. */
3180 if (! call_used_regs[regno + j] && ! df_regs_ever_live_p (regno + j))
3182 success = 0;
3183 break;
3186 if (! targetm.hard_regno_scratch_ok (regno + j))
3188 success = 0;
3189 break;
3192 /* And we don't clobber traceback for noreturn functions. */
3193 if ((regno + j == FRAME_POINTER_REGNUM
3194 || regno + j == HARD_FRAME_POINTER_REGNUM)
3195 && (! reload_completed || frame_pointer_needed))
3197 success = 0;
3198 break;
3201 if (TEST_HARD_REG_BIT (*reg_set, regno + j)
3202 || TEST_HARD_REG_BIT (live, regno + j))
3204 success = 0;
3205 break;
3209 if (success)
3211 add_to_hard_reg_set (reg_set, mode, regno);
3213 /* Start the next search with the next register. */
3214 if (++raw_regno >= FIRST_PSEUDO_REGISTER)
3215 raw_regno = 0;
3216 search_ofs = raw_regno;
3218 return gen_rtx_REG (mode, regno);
3222 search_ofs = 0;
3223 return NULL_RTX;
3226 /* Forget all currently tracked instructions, only remember current
3227 LIVE regset. */
3229 static void
3230 peep2_reinit_state (regset live)
3232 int i;
3234 /* Indicate that all slots except the last holds invalid data. */
3235 for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3236 peep2_insn_data[i].insn = NULL;
3237 peep2_current_count = 0;
3239 /* Indicate that the last slot contains live_after data. */
3240 peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3241 peep2_current = MAX_INSNS_PER_PEEP2;
3243 COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3246 /* While scanning basic block BB, we found a match of length MATCH_LEN,
3247 starting at INSN. Perform the replacement, removing the old insns and
3248 replacing them with ATTEMPT. Returns the last insn emitted, or NULL
3249 if the replacement is rejected. */
3251 static rtx_insn *
3252 peep2_attempt (basic_block bb, rtx_insn *insn, int match_len, rtx_insn *attempt)
3254 int i;
3255 rtx_insn *last, *before_try, *x;
3256 rtx eh_note, as_note;
3257 rtx_insn *old_insn;
3258 rtx_insn *new_insn;
3259 bool was_call = false;
3261 /* If we are splitting an RTX_FRAME_RELATED_P insn, do not allow it to
3262 match more than one insn, or to be split into more than one insn. */
3263 old_insn = peep2_insn_data[peep2_current].insn;
3264 if (RTX_FRAME_RELATED_P (old_insn))
3266 bool any_note = false;
3267 rtx note;
3269 if (match_len != 0)
3270 return NULL;
3272 /* Look for one "active" insn. I.e. ignore any "clobber" insns that
3273 may be in the stream for the purpose of register allocation. */
3274 if (active_insn_p (attempt))
3275 new_insn = attempt;
3276 else
3277 new_insn = next_active_insn (attempt);
3278 if (next_active_insn (new_insn))
3279 return NULL;
3281 /* We have a 1-1 replacement. Copy over any frame-related info. */
3282 RTX_FRAME_RELATED_P (new_insn) = 1;
3284 /* Allow the backend to fill in a note during the split. */
3285 for (note = REG_NOTES (new_insn); note ; note = XEXP (note, 1))
3286 switch (REG_NOTE_KIND (note))
3288 case REG_FRAME_RELATED_EXPR:
3289 case REG_CFA_DEF_CFA:
3290 case REG_CFA_ADJUST_CFA:
3291 case REG_CFA_OFFSET:
3292 case REG_CFA_REGISTER:
3293 case REG_CFA_EXPRESSION:
3294 case REG_CFA_RESTORE:
3295 case REG_CFA_SET_VDRAP:
3296 any_note = true;
3297 break;
3298 default:
3299 break;
3302 /* If the backend didn't supply a note, copy one over. */
3303 if (!any_note)
3304 for (note = REG_NOTES (old_insn); note ; note = XEXP (note, 1))
3305 switch (REG_NOTE_KIND (note))
3307 case REG_FRAME_RELATED_EXPR:
3308 case REG_CFA_DEF_CFA:
3309 case REG_CFA_ADJUST_CFA:
3310 case REG_CFA_OFFSET:
3311 case REG_CFA_REGISTER:
3312 case REG_CFA_EXPRESSION:
3313 case REG_CFA_RESTORE:
3314 case REG_CFA_SET_VDRAP:
3315 add_reg_note (new_insn, REG_NOTE_KIND (note), XEXP (note, 0));
3316 any_note = true;
3317 break;
3318 default:
3319 break;
3322 /* If there still isn't a note, make sure the unwind info sees the
3323 same expression as before the split. */
3324 if (!any_note)
3326 rtx old_set, new_set;
3328 /* The old insn had better have been simple, or annotated. */
3329 old_set = single_set (old_insn);
3330 gcc_assert (old_set != NULL);
3332 new_set = single_set (new_insn);
3333 if (!new_set || !rtx_equal_p (new_set, old_set))
3334 add_reg_note (new_insn, REG_FRAME_RELATED_EXPR, old_set);
3337 /* Copy prologue/epilogue status. This is required in order to keep
3338 proper placement of EPILOGUE_BEG and the DW_CFA_remember_state. */
3339 maybe_copy_prologue_epilogue_insn (old_insn, new_insn);
3342 /* If we are splitting a CALL_INSN, look for the CALL_INSN
3343 in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3344 cfg-related call notes. */
3345 for (i = 0; i <= match_len; ++i)
3347 int j;
3348 rtx note;
3350 j = peep2_buf_position (peep2_current + i);
3351 old_insn = peep2_insn_data[j].insn;
3352 if (!CALL_P (old_insn))
3353 continue;
3354 was_call = true;
3356 new_insn = attempt;
3357 while (new_insn != NULL_RTX)
3359 if (CALL_P (new_insn))
3360 break;
3361 new_insn = NEXT_INSN (new_insn);
3364 gcc_assert (new_insn != NULL_RTX);
3366 CALL_INSN_FUNCTION_USAGE (new_insn)
3367 = CALL_INSN_FUNCTION_USAGE (old_insn);
3368 SIBLING_CALL_P (new_insn) = SIBLING_CALL_P (old_insn);
3370 for (note = REG_NOTES (old_insn);
3371 note;
3372 note = XEXP (note, 1))
3373 switch (REG_NOTE_KIND (note))
3375 case REG_NORETURN:
3376 case REG_SETJMP:
3377 case REG_TM:
3378 add_reg_note (new_insn, REG_NOTE_KIND (note),
3379 XEXP (note, 0));
3380 break;
3381 default:
3382 /* Discard all other reg notes. */
3383 break;
3386 /* Croak if there is another call in the sequence. */
3387 while (++i <= match_len)
3389 j = peep2_buf_position (peep2_current + i);
3390 old_insn = peep2_insn_data[j].insn;
3391 gcc_assert (!CALL_P (old_insn));
3393 break;
3396 /* If we matched any instruction that had a REG_ARGS_SIZE, then
3397 move those notes over to the new sequence. */
3398 as_note = NULL;
3399 for (i = match_len; i >= 0; --i)
3401 int j = peep2_buf_position (peep2_current + i);
3402 old_insn = peep2_insn_data[j].insn;
3404 as_note = find_reg_note (old_insn, REG_ARGS_SIZE, NULL);
3405 if (as_note)
3406 break;
3409 i = peep2_buf_position (peep2_current + match_len);
3410 eh_note = find_reg_note (peep2_insn_data[i].insn, REG_EH_REGION, NULL_RTX);
3412 /* Replace the old sequence with the new. */
3413 rtx_insn *peepinsn = peep2_insn_data[i].insn;
3414 last = emit_insn_after_setloc (attempt,
3415 peep2_insn_data[i].insn,
3416 INSN_LOCATION (peepinsn));
3417 before_try = PREV_INSN (insn);
3418 delete_insn_chain (insn, peep2_insn_data[i].insn, false);
3420 /* Re-insert the EH_REGION notes. */
3421 if (eh_note || (was_call && nonlocal_goto_handler_labels))
3423 edge eh_edge;
3424 edge_iterator ei;
3426 FOR_EACH_EDGE (eh_edge, ei, bb->succs)
3427 if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
3428 break;
3430 if (eh_note)
3431 copy_reg_eh_region_note_backward (eh_note, last, before_try);
3433 if (eh_edge)
3434 for (x = last; x != before_try; x = PREV_INSN (x))
3435 if (x != BB_END (bb)
3436 && (can_throw_internal (x)
3437 || can_nonlocal_goto (x)))
3439 edge nfte, nehe;
3440 int flags;
3442 nfte = split_block (bb, x);
3443 flags = (eh_edge->flags
3444 & (EDGE_EH | EDGE_ABNORMAL));
3445 if (CALL_P (x))
3446 flags |= EDGE_ABNORMAL_CALL;
3447 nehe = make_edge (nfte->src, eh_edge->dest,
3448 flags);
3450 nehe->probability = eh_edge->probability;
3451 nfte->probability
3452 = REG_BR_PROB_BASE - nehe->probability;
3454 peep2_do_cleanup_cfg |= purge_dead_edges (nfte->dest);
3455 bb = nfte->src;
3456 eh_edge = nehe;
3459 /* Converting possibly trapping insn to non-trapping is
3460 possible. Zap dummy outgoing edges. */
3461 peep2_do_cleanup_cfg |= purge_dead_edges (bb);
3464 /* Re-insert the ARGS_SIZE notes. */
3465 if (as_note)
3466 fixup_args_size_notes (before_try, last, INTVAL (XEXP (as_note, 0)));
3468 /* If we generated a jump instruction, it won't have
3469 JUMP_LABEL set. Recompute after we're done. */
3470 for (x = last; x != before_try; x = PREV_INSN (x))
3471 if (JUMP_P (x))
3473 peep2_do_rebuild_jump_labels = true;
3474 break;
3477 return last;
3480 /* After performing a replacement in basic block BB, fix up the life
3481 information in our buffer. LAST is the last of the insns that we
3482 emitted as a replacement. PREV is the insn before the start of
3483 the replacement. MATCH_LEN is the number of instructions that were
3484 matched, and which now need to be replaced in the buffer. */
3486 static void
3487 peep2_update_life (basic_block bb, int match_len, rtx_insn *last,
3488 rtx_insn *prev)
3490 int i = peep2_buf_position (peep2_current + match_len + 1);
3491 rtx_insn *x;
3492 regset_head live;
3494 INIT_REG_SET (&live);
3495 COPY_REG_SET (&live, peep2_insn_data[i].live_before);
3497 gcc_assert (peep2_current_count >= match_len + 1);
3498 peep2_current_count -= match_len + 1;
3500 x = last;
3503 if (INSN_P (x))
3505 df_insn_rescan (x);
3506 if (peep2_current_count < MAX_INSNS_PER_PEEP2)
3508 peep2_current_count++;
3509 if (--i < 0)
3510 i = MAX_INSNS_PER_PEEP2;
3511 peep2_insn_data[i].insn = x;
3512 df_simulate_one_insn_backwards (bb, x, &live);
3513 COPY_REG_SET (peep2_insn_data[i].live_before, &live);
3516 x = PREV_INSN (x);
3518 while (x != prev);
3519 CLEAR_REG_SET (&live);
3521 peep2_current = i;
3524 /* Add INSN, which is in BB, at the end of the peep2 insn buffer if possible.
3525 Return true if we added it, false otherwise. The caller will try to match
3526 peepholes against the buffer if we return false; otherwise it will try to
3527 add more instructions to the buffer. */
3529 static bool
3530 peep2_fill_buffer (basic_block bb, rtx_insn *insn, regset live)
3532 int pos;
3534 /* Once we have filled the maximum number of insns the buffer can hold,
3535 allow the caller to match the insns against peepholes. We wait until
3536 the buffer is full in case the target has similar peepholes of different
3537 length; we always want to match the longest if possible. */
3538 if (peep2_current_count == MAX_INSNS_PER_PEEP2)
3539 return false;
3541 /* If an insn has RTX_FRAME_RELATED_P set, do not allow it to be matched with
3542 any other pattern, lest it change the semantics of the frame info. */
3543 if (RTX_FRAME_RELATED_P (insn))
3545 /* Let the buffer drain first. */
3546 if (peep2_current_count > 0)
3547 return false;
3548 /* Now the insn will be the only thing in the buffer. */
3551 pos = peep2_buf_position (peep2_current + peep2_current_count);
3552 peep2_insn_data[pos].insn = insn;
3553 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3554 peep2_current_count++;
3556 df_simulate_one_insn_forwards (bb, insn, live);
3557 return true;
3560 /* Perform the peephole2 optimization pass. */
3562 static void
3563 peephole2_optimize (void)
3565 rtx_insn *insn;
3566 bitmap live;
3567 int i;
3568 basic_block bb;
3570 peep2_do_cleanup_cfg = false;
3571 peep2_do_rebuild_jump_labels = false;
3573 df_set_flags (DF_LR_RUN_DCE);
3574 df_note_add_problem ();
3575 df_analyze ();
3577 /* Initialize the regsets we're going to use. */
3578 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3579 peep2_insn_data[i].live_before = BITMAP_ALLOC (&reg_obstack);
3580 search_ofs = 0;
3581 live = BITMAP_ALLOC (&reg_obstack);
3583 FOR_EACH_BB_REVERSE_FN (bb, cfun)
3585 bool past_end = false;
3586 int pos;
3588 rtl_profile_for_bb (bb);
3590 /* Start up propagation. */
3591 bitmap_copy (live, DF_LR_IN (bb));
3592 df_simulate_initialize_forwards (bb, live);
3593 peep2_reinit_state (live);
3595 insn = BB_HEAD (bb);
3596 for (;;)
3598 rtx_insn *attempt, *head;
3599 int match_len;
3601 if (!past_end && !NONDEBUG_INSN_P (insn))
3603 next_insn:
3604 insn = NEXT_INSN (insn);
3605 if (insn == NEXT_INSN (BB_END (bb)))
3606 past_end = true;
3607 continue;
3609 if (!past_end && peep2_fill_buffer (bb, insn, live))
3610 goto next_insn;
3612 /* If we did not fill an empty buffer, it signals the end of the
3613 block. */
3614 if (peep2_current_count == 0)
3615 break;
3617 /* The buffer filled to the current maximum, so try to match. */
3619 pos = peep2_buf_position (peep2_current + peep2_current_count);
3620 peep2_insn_data[pos].insn = PEEP2_EOB;
3621 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3623 /* Match the peephole. */
3624 head = peep2_insn_data[peep2_current].insn;
3625 attempt = peephole2_insns (PATTERN (head), head, &match_len);
3626 if (attempt != NULL)
3628 rtx_insn *last = peep2_attempt (bb, head, match_len, attempt);
3629 if (last)
3631 peep2_update_life (bb, match_len, last, PREV_INSN (attempt));
3632 continue;
3636 /* No match: advance the buffer by one insn. */
3637 peep2_current = peep2_buf_position (peep2_current + 1);
3638 peep2_current_count--;
3642 default_rtl_profile ();
3643 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3644 BITMAP_FREE (peep2_insn_data[i].live_before);
3645 BITMAP_FREE (live);
3646 if (peep2_do_rebuild_jump_labels)
3647 rebuild_jump_labels (get_insns ());
3648 if (peep2_do_cleanup_cfg)
3649 cleanup_cfg (CLEANUP_CFG_CHANGED);
3652 /* Common predicates for use with define_bypass. */
3654 /* True if the dependency between OUT_INSN and IN_INSN is on the store
3655 data not the address operand(s) of the store. IN_INSN and OUT_INSN
3656 must be either a single_set or a PARALLEL with SETs inside. */
3659 store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3661 rtx out_set, in_set;
3662 rtx out_pat, in_pat;
3663 rtx out_exp, in_exp;
3664 int i, j;
3666 in_set = single_set (in_insn);
3667 if (in_set)
3669 if (!MEM_P (SET_DEST (in_set)))
3670 return false;
3672 out_set = single_set (out_insn);
3673 if (out_set)
3675 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
3676 return false;
3678 else
3680 out_pat = PATTERN (out_insn);
3682 if (GET_CODE (out_pat) != PARALLEL)
3683 return false;
3685 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3687 out_exp = XVECEXP (out_pat, 0, i);
3689 if (GET_CODE (out_exp) == CLOBBER)
3690 continue;
3692 gcc_assert (GET_CODE (out_exp) == SET);
3694 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_set)))
3695 return false;
3699 else
3701 in_pat = PATTERN (in_insn);
3702 gcc_assert (GET_CODE (in_pat) == PARALLEL);
3704 for (i = 0; i < XVECLEN (in_pat, 0); i++)
3706 in_exp = XVECEXP (in_pat, 0, i);
3708 if (GET_CODE (in_exp) == CLOBBER)
3709 continue;
3711 gcc_assert (GET_CODE (in_exp) == SET);
3713 if (!MEM_P (SET_DEST (in_exp)))
3714 return false;
3716 out_set = single_set (out_insn);
3717 if (out_set)
3719 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_exp)))
3720 return false;
3722 else
3724 out_pat = PATTERN (out_insn);
3725 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3727 for (j = 0; j < XVECLEN (out_pat, 0); j++)
3729 out_exp = XVECEXP (out_pat, 0, j);
3731 if (GET_CODE (out_exp) == CLOBBER)
3732 continue;
3734 gcc_assert (GET_CODE (out_exp) == SET);
3736 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_exp)))
3737 return false;
3743 return true;
3746 /* True if the dependency between OUT_INSN and IN_INSN is in the IF_THEN_ELSE
3747 condition, and not the THEN or ELSE branch. OUT_INSN may be either a single
3748 or multiple set; IN_INSN should be single_set for truth, but for convenience
3749 of insn categorization may be any JUMP or CALL insn. */
3752 if_test_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3754 rtx out_set, in_set;
3756 in_set = single_set (in_insn);
3757 if (! in_set)
3759 gcc_assert (JUMP_P (in_insn) || CALL_P (in_insn));
3760 return false;
3763 if (GET_CODE (SET_SRC (in_set)) != IF_THEN_ELSE)
3764 return false;
3765 in_set = SET_SRC (in_set);
3767 out_set = single_set (out_insn);
3768 if (out_set)
3770 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3771 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3772 return false;
3774 else
3776 rtx out_pat;
3777 int i;
3779 out_pat = PATTERN (out_insn);
3780 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3782 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3784 rtx exp = XVECEXP (out_pat, 0, i);
3786 if (GET_CODE (exp) == CLOBBER)
3787 continue;
3789 gcc_assert (GET_CODE (exp) == SET);
3791 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3792 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3793 return false;
3797 return true;
3800 static unsigned int
3801 rest_of_handle_peephole2 (void)
3803 if (HAVE_peephole2)
3804 peephole2_optimize ();
3806 return 0;
3809 namespace {
3811 const pass_data pass_data_peephole2 =
3813 RTL_PASS, /* type */
3814 "peephole2", /* name */
3815 OPTGROUP_NONE, /* optinfo_flags */
3816 TV_PEEPHOLE2, /* tv_id */
3817 0, /* properties_required */
3818 0, /* properties_provided */
3819 0, /* properties_destroyed */
3820 0, /* todo_flags_start */
3821 TODO_df_finish, /* todo_flags_finish */
3824 class pass_peephole2 : public rtl_opt_pass
3826 public:
3827 pass_peephole2 (gcc::context *ctxt)
3828 : rtl_opt_pass (pass_data_peephole2, ctxt)
3831 /* opt_pass methods: */
3832 /* The epiphany backend creates a second instance of this pass, so we need
3833 a clone method. */
3834 opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
3835 virtual bool gate (function *) { return (optimize > 0 && flag_peephole2); }
3836 virtual unsigned int execute (function *)
3838 return rest_of_handle_peephole2 ();
3841 }; // class pass_peephole2
3843 } // anon namespace
3845 rtl_opt_pass *
3846 make_pass_peephole2 (gcc::context *ctxt)
3848 return new pass_peephole2 (ctxt);
3851 namespace {
3853 const pass_data pass_data_split_all_insns =
3855 RTL_PASS, /* type */
3856 "split1", /* name */
3857 OPTGROUP_NONE, /* optinfo_flags */
3858 TV_NONE, /* tv_id */
3859 0, /* properties_required */
3860 0, /* properties_provided */
3861 0, /* properties_destroyed */
3862 0, /* todo_flags_start */
3863 0, /* todo_flags_finish */
3866 class pass_split_all_insns : public rtl_opt_pass
3868 public:
3869 pass_split_all_insns (gcc::context *ctxt)
3870 : rtl_opt_pass (pass_data_split_all_insns, ctxt)
3873 /* opt_pass methods: */
3874 /* The epiphany backend creates a second instance of this pass, so
3875 we need a clone method. */
3876 opt_pass * clone () { return new pass_split_all_insns (m_ctxt); }
3877 virtual unsigned int execute (function *)
3879 split_all_insns ();
3880 return 0;
3883 }; // class pass_split_all_insns
3885 } // anon namespace
3887 rtl_opt_pass *
3888 make_pass_split_all_insns (gcc::context *ctxt)
3890 return new pass_split_all_insns (ctxt);
3893 static unsigned int
3894 rest_of_handle_split_after_reload (void)
3896 /* If optimizing, then go ahead and split insns now. */
3897 #ifndef STACK_REGS
3898 if (optimize > 0)
3899 #endif
3900 split_all_insns ();
3901 return 0;
3904 namespace {
3906 const pass_data pass_data_split_after_reload =
3908 RTL_PASS, /* type */
3909 "split2", /* name */
3910 OPTGROUP_NONE, /* optinfo_flags */
3911 TV_NONE, /* tv_id */
3912 0, /* properties_required */
3913 0, /* properties_provided */
3914 0, /* properties_destroyed */
3915 0, /* todo_flags_start */
3916 0, /* todo_flags_finish */
3919 class pass_split_after_reload : public rtl_opt_pass
3921 public:
3922 pass_split_after_reload (gcc::context *ctxt)
3923 : rtl_opt_pass (pass_data_split_after_reload, ctxt)
3926 /* opt_pass methods: */
3927 virtual unsigned int execute (function *)
3929 return rest_of_handle_split_after_reload ();
3932 }; // class pass_split_after_reload
3934 } // anon namespace
3936 rtl_opt_pass *
3937 make_pass_split_after_reload (gcc::context *ctxt)
3939 return new pass_split_after_reload (ctxt);
3942 namespace {
3944 const pass_data pass_data_split_before_regstack =
3946 RTL_PASS, /* type */
3947 "split3", /* name */
3948 OPTGROUP_NONE, /* optinfo_flags */
3949 TV_NONE, /* tv_id */
3950 0, /* properties_required */
3951 0, /* properties_provided */
3952 0, /* properties_destroyed */
3953 0, /* todo_flags_start */
3954 0, /* todo_flags_finish */
3957 class pass_split_before_regstack : public rtl_opt_pass
3959 public:
3960 pass_split_before_regstack (gcc::context *ctxt)
3961 : rtl_opt_pass (pass_data_split_before_regstack, ctxt)
3964 /* opt_pass methods: */
3965 virtual bool gate (function *);
3966 virtual unsigned int execute (function *)
3968 split_all_insns ();
3969 return 0;
3972 }; // class pass_split_before_regstack
3974 bool
3975 pass_split_before_regstack::gate (function *)
3977 #if HAVE_ATTR_length && defined (STACK_REGS)
3978 /* If flow2 creates new instructions which need splitting
3979 and scheduling after reload is not done, they might not be
3980 split until final which doesn't allow splitting
3981 if HAVE_ATTR_length. */
3982 # ifdef INSN_SCHEDULING
3983 return (optimize && !flag_schedule_insns_after_reload);
3984 # else
3985 return (optimize);
3986 # endif
3987 #else
3988 return 0;
3989 #endif
3992 } // anon namespace
3994 rtl_opt_pass *
3995 make_pass_split_before_regstack (gcc::context *ctxt)
3997 return new pass_split_before_regstack (ctxt);
4000 static unsigned int
4001 rest_of_handle_split_before_sched2 (void)
4003 #ifdef INSN_SCHEDULING
4004 split_all_insns ();
4005 #endif
4006 return 0;
4009 namespace {
4011 const pass_data pass_data_split_before_sched2 =
4013 RTL_PASS, /* type */
4014 "split4", /* name */
4015 OPTGROUP_NONE, /* optinfo_flags */
4016 TV_NONE, /* tv_id */
4017 0, /* properties_required */
4018 0, /* properties_provided */
4019 0, /* properties_destroyed */
4020 0, /* todo_flags_start */
4021 0, /* todo_flags_finish */
4024 class pass_split_before_sched2 : public rtl_opt_pass
4026 public:
4027 pass_split_before_sched2 (gcc::context *ctxt)
4028 : rtl_opt_pass (pass_data_split_before_sched2, ctxt)
4031 /* opt_pass methods: */
4032 virtual bool gate (function *)
4034 #ifdef INSN_SCHEDULING
4035 return optimize > 0 && flag_schedule_insns_after_reload;
4036 #else
4037 return false;
4038 #endif
4041 virtual unsigned int execute (function *)
4043 return rest_of_handle_split_before_sched2 ();
4046 }; // class pass_split_before_sched2
4048 } // anon namespace
4050 rtl_opt_pass *
4051 make_pass_split_before_sched2 (gcc::context *ctxt)
4053 return new pass_split_before_sched2 (ctxt);
4056 namespace {
4058 const pass_data pass_data_split_for_shorten_branches =
4060 RTL_PASS, /* type */
4061 "split5", /* name */
4062 OPTGROUP_NONE, /* optinfo_flags */
4063 TV_NONE, /* tv_id */
4064 0, /* properties_required */
4065 0, /* properties_provided */
4066 0, /* properties_destroyed */
4067 0, /* todo_flags_start */
4068 0, /* todo_flags_finish */
4071 class pass_split_for_shorten_branches : public rtl_opt_pass
4073 public:
4074 pass_split_for_shorten_branches (gcc::context *ctxt)
4075 : rtl_opt_pass (pass_data_split_for_shorten_branches, ctxt)
4078 /* opt_pass methods: */
4079 virtual bool gate (function *)
4081 /* The placement of the splitting that we do for shorten_branches
4082 depends on whether regstack is used by the target or not. */
4083 #if HAVE_ATTR_length && !defined (STACK_REGS)
4084 return true;
4085 #else
4086 return false;
4087 #endif
4090 virtual unsigned int execute (function *)
4092 return split_all_insns_noflow ();
4095 }; // class pass_split_for_shorten_branches
4097 } // anon namespace
4099 rtl_opt_pass *
4100 make_pass_split_for_shorten_branches (gcc::context *ctxt)
4102 return new pass_split_for_shorten_branches (ctxt);
4105 /* (Re)initialize the target information after a change in target. */
4107 void
4108 recog_init ()
4110 /* The information is zero-initialized, so we don't need to do anything
4111 first time round. */
4112 if (!this_target_recog->x_initialized)
4114 this_target_recog->x_initialized = true;
4115 return;
4117 memset (this_target_recog->x_bool_attr_masks, 0,
4118 sizeof (this_target_recog->x_bool_attr_masks));
4119 for (unsigned int i = 0; i < NUM_INSN_CODES; ++i)
4120 if (this_target_recog->x_op_alt[i])
4122 free (this_target_recog->x_op_alt[i]);
4123 this_target_recog->x_op_alt[i] = 0;