decl.c (value_annotation_hasher::handle_cache_entry): Delete.
[gcc.git] / gcc / recog.c
1 /* Subroutines used by or related to instruction recognition.
2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "alias.h"
26 #include "symtab.h"
27 #include "tree.h"
28 #include "rtl-error.h"
29 #include "tm_p.h"
30 #include "insn-config.h"
31 #include "insn-attr.h"
32 #include "hard-reg-set.h"
33 #include "recog.h"
34 #include "regs.h"
35 #include "addresses.h"
36 #include "function.h"
37 #include "rtl.h"
38 #include "flags.h"
39 #include "expmed.h"
40 #include "dojump.h"
41 #include "explow.h"
42 #include "calls.h"
43 #include "emit-rtl.h"
44 #include "varasm.h"
45 #include "stmt.h"
46 #include "expr.h"
47 #include "predict.h"
48 #include "dominance.h"
49 #include "cfg.h"
50 #include "cfgrtl.h"
51 #include "cfgbuild.h"
52 #include "cfgcleanup.h"
53 #include "basic-block.h"
54 #include "reload.h"
55 #include "target.h"
56 #include "tree-pass.h"
57 #include "df.h"
58 #include "insn-codes.h"
59
60 #ifndef STACK_POP_CODE
61 #if STACK_GROWS_DOWNWARD
62 #define STACK_POP_CODE POST_INC
63 #else
64 #define STACK_POP_CODE POST_DEC
65 #endif
66 #endif
67
68 static void validate_replace_rtx_1 (rtx *, rtx, rtx, rtx_insn *, bool);
69 static void validate_replace_src_1 (rtx *, void *);
70 static rtx_insn *split_insn (rtx_insn *);
71
72 struct target_recog default_target_recog;
73 #if SWITCHABLE_TARGET
74 struct target_recog *this_target_recog = &default_target_recog;
75 #endif
76
77 /* Nonzero means allow operands to be volatile.
78 This should be 0 if you are generating rtl, such as if you are calling
79 the functions in optabs.c and expmed.c (most of the time).
80 This should be 1 if all valid insns need to be recognized,
81 such as in reginfo.c and final.c and reload.c.
82
83 init_recog and init_recog_no_volatile are responsible for setting this. */
84
85 int volatile_ok;
86
87 struct recog_data_d recog_data;
88
89 /* Contains a vector of operand_alternative structures, such that
90 operand OP of alternative A is at index A * n_operands + OP.
91 Set up by preprocess_constraints. */
92 const operand_alternative *recog_op_alt;
93
94 /* Used to provide recog_op_alt for asms. */
95 static operand_alternative asm_op_alt[MAX_RECOG_OPERANDS
96 * MAX_RECOG_ALTERNATIVES];
97
98 /* On return from `constrain_operands', indicate which alternative
99 was satisfied. */
100
101 int which_alternative;
102
103 /* Nonzero after end of reload pass.
104 Set to 1 or 0 by toplev.c.
105 Controls the significance of (SUBREG (MEM)). */
106
107 int reload_completed;
108
109 /* Nonzero after thread_prologue_and_epilogue_insns has run. */
110 int epilogue_completed;
111
112 /* Initialize data used by the function `recog'.
113 This must be called once in the compilation of a function
114 before any insn recognition may be done in the function. */
115
116 void
117 init_recog_no_volatile (void)
118 {
119 volatile_ok = 0;
120 }
121
122 void
123 init_recog (void)
124 {
125 volatile_ok = 1;
126 }
127
128 \f
129 /* Return true if labels in asm operands BODY are LABEL_REFs. */
130
131 static bool
132 asm_labels_ok (rtx body)
133 {
134 rtx asmop;
135 int i;
136
137 asmop = extract_asm_operands (body);
138 if (asmop == NULL_RTX)
139 return true;
140
141 for (i = 0; i < ASM_OPERANDS_LABEL_LENGTH (asmop); i++)
142 if (GET_CODE (ASM_OPERANDS_LABEL (asmop, i)) != LABEL_REF)
143 return false;
144
145 return true;
146 }
147
148 /* Check that X is an insn-body for an `asm' with operands
149 and that the operands mentioned in it are legitimate. */
150
151 int
152 check_asm_operands (rtx x)
153 {
154 int noperands;
155 rtx *operands;
156 const char **constraints;
157 int i;
158
159 if (!asm_labels_ok (x))
160 return 0;
161
162 /* Post-reload, be more strict with things. */
163 if (reload_completed)
164 {
165 /* ??? Doh! We've not got the wrapping insn. Cook one up. */
166 rtx_insn *insn = make_insn_raw (x);
167 extract_insn (insn);
168 constrain_operands (1, get_enabled_alternatives (insn));
169 return which_alternative >= 0;
170 }
171
172 noperands = asm_noperands (x);
173 if (noperands < 0)
174 return 0;
175 if (noperands == 0)
176 return 1;
177
178 operands = XALLOCAVEC (rtx, noperands);
179 constraints = XALLOCAVEC (const char *, noperands);
180
181 decode_asm_operands (x, operands, NULL, constraints, NULL, NULL);
182
183 for (i = 0; i < noperands; i++)
184 {
185 const char *c = constraints[i];
186 if (c[0] == '%')
187 c++;
188 if (! asm_operand_ok (operands[i], c, constraints))
189 return 0;
190 }
191
192 return 1;
193 }
194 \f
195 /* Static data for the next two routines. */
196
197 typedef struct change_t
198 {
199 rtx object;
200 int old_code;
201 rtx *loc;
202 rtx old;
203 bool unshare;
204 } change_t;
205
206 static change_t *changes;
207 static int changes_allocated;
208
209 static int num_changes = 0;
210
211 /* Validate a proposed change to OBJECT. LOC is the location in the rtl
212 at which NEW_RTX will be placed. If OBJECT is zero, no validation is done,
213 the change is simply made.
214
215 Two types of objects are supported: If OBJECT is a MEM, memory_address_p
216 will be called with the address and mode as parameters. If OBJECT is
217 an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
218 the change in place.
219
220 IN_GROUP is nonzero if this is part of a group of changes that must be
221 performed as a group. In that case, the changes will be stored. The
222 function `apply_change_group' will validate and apply the changes.
223
224 If IN_GROUP is zero, this is a single change. Try to recognize the insn
225 or validate the memory reference with the change applied. If the result
226 is not valid for the machine, suppress the change and return zero.
227 Otherwise, perform the change and return 1. */
228
229 static bool
230 validate_change_1 (rtx object, rtx *loc, rtx new_rtx, bool in_group, bool unshare)
231 {
232 rtx old = *loc;
233
234 if (old == new_rtx || rtx_equal_p (old, new_rtx))
235 return 1;
236
237 gcc_assert (in_group != 0 || num_changes == 0);
238
239 *loc = new_rtx;
240
241 /* Save the information describing this change. */
242 if (num_changes >= changes_allocated)
243 {
244 if (changes_allocated == 0)
245 /* This value allows for repeated substitutions inside complex
246 indexed addresses, or changes in up to 5 insns. */
247 changes_allocated = MAX_RECOG_OPERANDS * 5;
248 else
249 changes_allocated *= 2;
250
251 changes = XRESIZEVEC (change_t, changes, changes_allocated);
252 }
253
254 changes[num_changes].object = object;
255 changes[num_changes].loc = loc;
256 changes[num_changes].old = old;
257 changes[num_changes].unshare = unshare;
258
259 if (object && !MEM_P (object))
260 {
261 /* Set INSN_CODE to force rerecognition of insn. Save old code in
262 case invalid. */
263 changes[num_changes].old_code = INSN_CODE (object);
264 INSN_CODE (object) = -1;
265 }
266
267 num_changes++;
268
269 /* If we are making a group of changes, return 1. Otherwise, validate the
270 change group we made. */
271
272 if (in_group)
273 return 1;
274 else
275 return apply_change_group ();
276 }
277
278 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
279 UNSHARE to false. */
280
281 bool
282 validate_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
283 {
284 return validate_change_1 (object, loc, new_rtx, in_group, false);
285 }
286
287 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
288 UNSHARE to true. */
289
290 bool
291 validate_unshare_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
292 {
293 return validate_change_1 (object, loc, new_rtx, in_group, true);
294 }
295
296
297 /* Keep X canonicalized if some changes have made it non-canonical; only
298 modifies the operands of X, not (for example) its code. Simplifications
299 are not the job of this routine.
300
301 Return true if anything was changed. */
302 bool
303 canonicalize_change_group (rtx_insn *insn, rtx x)
304 {
305 if (COMMUTATIVE_P (x)
306 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
307 {
308 /* Oops, the caller has made X no longer canonical.
309 Let's redo the changes in the correct order. */
310 rtx tem = XEXP (x, 0);
311 validate_unshare_change (insn, &XEXP (x, 0), XEXP (x, 1), 1);
312 validate_unshare_change (insn, &XEXP (x, 1), tem, 1);
313 return true;
314 }
315 else
316 return false;
317 }
318
319
320 /* This subroutine of apply_change_group verifies whether the changes to INSN
321 were valid; i.e. whether INSN can still be recognized.
322
323 If IN_GROUP is true clobbers which have to be added in order to
324 match the instructions will be added to the current change group.
325 Otherwise the changes will take effect immediately. */
326
327 int
328 insn_invalid_p (rtx_insn *insn, bool in_group)
329 {
330 rtx pat = PATTERN (insn);
331 int num_clobbers = 0;
332 /* If we are before reload and the pattern is a SET, see if we can add
333 clobbers. */
334 int icode = recog (pat, insn,
335 (GET_CODE (pat) == SET
336 && ! reload_completed
337 && ! reload_in_progress)
338 ? &num_clobbers : 0);
339 int is_asm = icode < 0 && asm_noperands (PATTERN (insn)) >= 0;
340
341
342 /* If this is an asm and the operand aren't legal, then fail. Likewise if
343 this is not an asm and the insn wasn't recognized. */
344 if ((is_asm && ! check_asm_operands (PATTERN (insn)))
345 || (!is_asm && icode < 0))
346 return 1;
347
348 /* If we have to add CLOBBERs, fail if we have to add ones that reference
349 hard registers since our callers can't know if they are live or not.
350 Otherwise, add them. */
351 if (num_clobbers > 0)
352 {
353 rtx newpat;
354
355 if (added_clobbers_hard_reg_p (icode))
356 return 1;
357
358 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num_clobbers + 1));
359 XVECEXP (newpat, 0, 0) = pat;
360 add_clobbers (newpat, icode);
361 if (in_group)
362 validate_change (insn, &PATTERN (insn), newpat, 1);
363 else
364 PATTERN (insn) = pat = newpat;
365 }
366
367 /* After reload, verify that all constraints are satisfied. */
368 if (reload_completed)
369 {
370 extract_insn (insn);
371
372 if (! constrain_operands (1, get_preferred_alternatives (insn)))
373 return 1;
374 }
375
376 INSN_CODE (insn) = icode;
377 return 0;
378 }
379
380 /* Return number of changes made and not validated yet. */
381 int
382 num_changes_pending (void)
383 {
384 return num_changes;
385 }
386
387 /* Tentatively apply the changes numbered NUM and up.
388 Return 1 if all changes are valid, zero otherwise. */
389
390 int
391 verify_changes (int num)
392 {
393 int i;
394 rtx last_validated = NULL_RTX;
395
396 /* The changes have been applied and all INSN_CODEs have been reset to force
397 rerecognition.
398
399 The changes are valid if we aren't given an object, or if we are
400 given a MEM and it still is a valid address, or if this is in insn
401 and it is recognized. In the latter case, if reload has completed,
402 we also require that the operands meet the constraints for
403 the insn. */
404
405 for (i = num; i < num_changes; i++)
406 {
407 rtx object = changes[i].object;
408
409 /* If there is no object to test or if it is the same as the one we
410 already tested, ignore it. */
411 if (object == 0 || object == last_validated)
412 continue;
413
414 if (MEM_P (object))
415 {
416 if (! memory_address_addr_space_p (GET_MODE (object),
417 XEXP (object, 0),
418 MEM_ADDR_SPACE (object)))
419 break;
420 }
421 else if (/* changes[i].old might be zero, e.g. when putting a
422 REG_FRAME_RELATED_EXPR into a previously empty list. */
423 changes[i].old
424 && REG_P (changes[i].old)
425 && asm_noperands (PATTERN (object)) > 0
426 && REG_EXPR (changes[i].old) != NULL_TREE
427 && DECL_ASSEMBLER_NAME_SET_P (REG_EXPR (changes[i].old))
428 && DECL_REGISTER (REG_EXPR (changes[i].old)))
429 {
430 /* Don't allow changes of hard register operands to inline
431 assemblies if they have been defined as register asm ("x"). */
432 break;
433 }
434 else if (DEBUG_INSN_P (object))
435 continue;
436 else if (insn_invalid_p (as_a <rtx_insn *> (object), true))
437 {
438 rtx pat = PATTERN (object);
439
440 /* Perhaps we couldn't recognize the insn because there were
441 extra CLOBBERs at the end. If so, try to re-recognize
442 without the last CLOBBER (later iterations will cause each of
443 them to be eliminated, in turn). But don't do this if we
444 have an ASM_OPERAND. */
445 if (GET_CODE (pat) == PARALLEL
446 && GET_CODE (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)) == CLOBBER
447 && asm_noperands (PATTERN (object)) < 0)
448 {
449 rtx newpat;
450
451 if (XVECLEN (pat, 0) == 2)
452 newpat = XVECEXP (pat, 0, 0);
453 else
454 {
455 int j;
456
457 newpat
458 = gen_rtx_PARALLEL (VOIDmode,
459 rtvec_alloc (XVECLEN (pat, 0) - 1));
460 for (j = 0; j < XVECLEN (newpat, 0); j++)
461 XVECEXP (newpat, 0, j) = XVECEXP (pat, 0, j);
462 }
463
464 /* Add a new change to this group to replace the pattern
465 with this new pattern. Then consider this change
466 as having succeeded. The change we added will
467 cause the entire call to fail if things remain invalid.
468
469 Note that this can lose if a later change than the one
470 we are processing specified &XVECEXP (PATTERN (object), 0, X)
471 but this shouldn't occur. */
472
473 validate_change (object, &PATTERN (object), newpat, 1);
474 continue;
475 }
476 else if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER
477 || GET_CODE (pat) == VAR_LOCATION)
478 /* If this insn is a CLOBBER or USE, it is always valid, but is
479 never recognized. */
480 continue;
481 else
482 break;
483 }
484 last_validated = object;
485 }
486
487 return (i == num_changes);
488 }
489
490 /* A group of changes has previously been issued with validate_change
491 and verified with verify_changes. Call df_insn_rescan for each of
492 the insn changed and clear num_changes. */
493
494 void
495 confirm_change_group (void)
496 {
497 int i;
498 rtx last_object = NULL;
499
500 for (i = 0; i < num_changes; i++)
501 {
502 rtx object = changes[i].object;
503
504 if (changes[i].unshare)
505 *changes[i].loc = copy_rtx (*changes[i].loc);
506
507 /* Avoid unnecessary rescanning when multiple changes to same instruction
508 are made. */
509 if (object)
510 {
511 if (object != last_object && last_object && INSN_P (last_object))
512 df_insn_rescan (as_a <rtx_insn *> (last_object));
513 last_object = object;
514 }
515 }
516
517 if (last_object && INSN_P (last_object))
518 df_insn_rescan (as_a <rtx_insn *> (last_object));
519 num_changes = 0;
520 }
521
522 /* Apply a group of changes previously issued with `validate_change'.
523 If all changes are valid, call confirm_change_group and return 1,
524 otherwise, call cancel_changes and return 0. */
525
526 int
527 apply_change_group (void)
528 {
529 if (verify_changes (0))
530 {
531 confirm_change_group ();
532 return 1;
533 }
534 else
535 {
536 cancel_changes (0);
537 return 0;
538 }
539 }
540
541
542 /* Return the number of changes so far in the current group. */
543
544 int
545 num_validated_changes (void)
546 {
547 return num_changes;
548 }
549
550 /* Retract the changes numbered NUM and up. */
551
552 void
553 cancel_changes (int num)
554 {
555 int i;
556
557 /* Back out all the changes. Do this in the opposite order in which
558 they were made. */
559 for (i = num_changes - 1; i >= num; i--)
560 {
561 *changes[i].loc = changes[i].old;
562 if (changes[i].object && !MEM_P (changes[i].object))
563 INSN_CODE (changes[i].object) = changes[i].old_code;
564 }
565 num_changes = num;
566 }
567
568 /* Reduce conditional compilation elsewhere. */
569 #ifndef HAVE_extv
570 #define HAVE_extv 0
571 #define CODE_FOR_extv CODE_FOR_nothing
572 #endif
573 #ifndef HAVE_extzv
574 #define HAVE_extzv 0
575 #define CODE_FOR_extzv CODE_FOR_nothing
576 #endif
577
578 /* A subroutine of validate_replace_rtx_1 that tries to simplify the resulting
579 rtx. */
580
581 static void
582 simplify_while_replacing (rtx *loc, rtx to, rtx_insn *object,
583 machine_mode op0_mode)
584 {
585 rtx x = *loc;
586 enum rtx_code code = GET_CODE (x);
587 rtx new_rtx = NULL_RTX;
588
589 if (SWAPPABLE_OPERANDS_P (x)
590 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
591 {
592 validate_unshare_change (object, loc,
593 gen_rtx_fmt_ee (COMMUTATIVE_ARITH_P (x) ? code
594 : swap_condition (code),
595 GET_MODE (x), XEXP (x, 1),
596 XEXP (x, 0)), 1);
597 x = *loc;
598 code = GET_CODE (x);
599 }
600
601 /* Canonicalize arithmetics with all constant operands. */
602 switch (GET_RTX_CLASS (code))
603 {
604 case RTX_UNARY:
605 if (CONSTANT_P (XEXP (x, 0)))
606 new_rtx = simplify_unary_operation (code, GET_MODE (x), XEXP (x, 0),
607 op0_mode);
608 break;
609 case RTX_COMM_ARITH:
610 case RTX_BIN_ARITH:
611 if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1)))
612 new_rtx = simplify_binary_operation (code, GET_MODE (x), XEXP (x, 0),
613 XEXP (x, 1));
614 break;
615 case RTX_COMPARE:
616 case RTX_COMM_COMPARE:
617 if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1)))
618 new_rtx = simplify_relational_operation (code, GET_MODE (x), op0_mode,
619 XEXP (x, 0), XEXP (x, 1));
620 break;
621 default:
622 break;
623 }
624 if (new_rtx)
625 {
626 validate_change (object, loc, new_rtx, 1);
627 return;
628 }
629
630 switch (code)
631 {
632 case PLUS:
633 /* If we have a PLUS whose second operand is now a CONST_INT, use
634 simplify_gen_binary to try to simplify it.
635 ??? We may want later to remove this, once simplification is
636 separated from this function. */
637 if (CONST_INT_P (XEXP (x, 1)) && XEXP (x, 1) == to)
638 validate_change (object, loc,
639 simplify_gen_binary
640 (PLUS, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)), 1);
641 break;
642 case MINUS:
643 if (CONST_SCALAR_INT_P (XEXP (x, 1)))
644 validate_change (object, loc,
645 simplify_gen_binary
646 (PLUS, GET_MODE (x), XEXP (x, 0),
647 simplify_gen_unary (NEG,
648 GET_MODE (x), XEXP (x, 1),
649 GET_MODE (x))), 1);
650 break;
651 case ZERO_EXTEND:
652 case SIGN_EXTEND:
653 if (GET_MODE (XEXP (x, 0)) == VOIDmode)
654 {
655 new_rtx = simplify_gen_unary (code, GET_MODE (x), XEXP (x, 0),
656 op0_mode);
657 /* If any of the above failed, substitute in something that
658 we know won't be recognized. */
659 if (!new_rtx)
660 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
661 validate_change (object, loc, new_rtx, 1);
662 }
663 break;
664 case SUBREG:
665 /* All subregs possible to simplify should be simplified. */
666 new_rtx = simplify_subreg (GET_MODE (x), SUBREG_REG (x), op0_mode,
667 SUBREG_BYTE (x));
668
669 /* Subregs of VOIDmode operands are incorrect. */
670 if (!new_rtx && GET_MODE (SUBREG_REG (x)) == VOIDmode)
671 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
672 if (new_rtx)
673 validate_change (object, loc, new_rtx, 1);
674 break;
675 case ZERO_EXTRACT:
676 case SIGN_EXTRACT:
677 /* If we are replacing a register with memory, try to change the memory
678 to be the mode required for memory in extract operations (this isn't
679 likely to be an insertion operation; if it was, nothing bad will
680 happen, we might just fail in some cases). */
681
682 if (MEM_P (XEXP (x, 0))
683 && CONST_INT_P (XEXP (x, 1))
684 && CONST_INT_P (XEXP (x, 2))
685 && !mode_dependent_address_p (XEXP (XEXP (x, 0), 0),
686 MEM_ADDR_SPACE (XEXP (x, 0)))
687 && !MEM_VOLATILE_P (XEXP (x, 0)))
688 {
689 machine_mode wanted_mode = VOIDmode;
690 machine_mode is_mode = GET_MODE (XEXP (x, 0));
691 int pos = INTVAL (XEXP (x, 2));
692
693 if (GET_CODE (x) == ZERO_EXTRACT && HAVE_extzv)
694 {
695 wanted_mode = insn_data[CODE_FOR_extzv].operand[1].mode;
696 if (wanted_mode == VOIDmode)
697 wanted_mode = word_mode;
698 }
699 else if (GET_CODE (x) == SIGN_EXTRACT && HAVE_extv)
700 {
701 wanted_mode = insn_data[CODE_FOR_extv].operand[1].mode;
702 if (wanted_mode == VOIDmode)
703 wanted_mode = word_mode;
704 }
705
706 /* If we have a narrower mode, we can do something. */
707 if (wanted_mode != VOIDmode
708 && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
709 {
710 int offset = pos / BITS_PER_UNIT;
711 rtx newmem;
712
713 /* If the bytes and bits are counted differently, we
714 must adjust the offset. */
715 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
716 offset =
717 (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) -
718 offset);
719
720 gcc_assert (GET_MODE_PRECISION (wanted_mode)
721 == GET_MODE_BITSIZE (wanted_mode));
722 pos %= GET_MODE_BITSIZE (wanted_mode);
723
724 newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset);
725
726 validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1);
727 validate_change (object, &XEXP (x, 0), newmem, 1);
728 }
729 }
730
731 break;
732
733 default:
734 break;
735 }
736 }
737
738 /* Replace every occurrence of FROM in X with TO. Mark each change with
739 validate_change passing OBJECT. */
740
741 static void
742 validate_replace_rtx_1 (rtx *loc, rtx from, rtx to, rtx_insn *object,
743 bool simplify)
744 {
745 int i, j;
746 const char *fmt;
747 rtx x = *loc;
748 enum rtx_code code;
749 machine_mode op0_mode = VOIDmode;
750 int prev_changes = num_changes;
751
752 if (!x)
753 return;
754
755 code = GET_CODE (x);
756 fmt = GET_RTX_FORMAT (code);
757 if (fmt[0] == 'e')
758 op0_mode = GET_MODE (XEXP (x, 0));
759
760 /* X matches FROM if it is the same rtx or they are both referring to the
761 same register in the same mode. Avoid calling rtx_equal_p unless the
762 operands look similar. */
763
764 if (x == from
765 || (REG_P (x) && REG_P (from)
766 && GET_MODE (x) == GET_MODE (from)
767 && REGNO (x) == REGNO (from))
768 || (GET_CODE (x) == GET_CODE (from) && GET_MODE (x) == GET_MODE (from)
769 && rtx_equal_p (x, from)))
770 {
771 validate_unshare_change (object, loc, to, 1);
772 return;
773 }
774
775 /* Call ourself recursively to perform the replacements.
776 We must not replace inside already replaced expression, otherwise we
777 get infinite recursion for replacements like (reg X)->(subreg (reg X))
778 so we must special case shared ASM_OPERANDS. */
779
780 if (GET_CODE (x) == PARALLEL)
781 {
782 for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
783 {
784 if (j && GET_CODE (XVECEXP (x, 0, j)) == SET
785 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == ASM_OPERANDS)
786 {
787 /* Verify that operands are really shared. */
788 gcc_assert (ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (x, 0, 0)))
789 == ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP
790 (x, 0, j))));
791 validate_replace_rtx_1 (&SET_DEST (XVECEXP (x, 0, j)),
792 from, to, object, simplify);
793 }
794 else
795 validate_replace_rtx_1 (&XVECEXP (x, 0, j), from, to, object,
796 simplify);
797 }
798 }
799 else
800 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
801 {
802 if (fmt[i] == 'e')
803 validate_replace_rtx_1 (&XEXP (x, i), from, to, object, simplify);
804 else if (fmt[i] == 'E')
805 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
806 validate_replace_rtx_1 (&XVECEXP (x, i, j), from, to, object,
807 simplify);
808 }
809
810 /* If we didn't substitute, there is nothing more to do. */
811 if (num_changes == prev_changes)
812 return;
813
814 /* ??? The regmove is no more, so is this aberration still necessary? */
815 /* Allow substituted expression to have different mode. This is used by
816 regmove to change mode of pseudo register. */
817 if (fmt[0] == 'e' && GET_MODE (XEXP (x, 0)) != VOIDmode)
818 op0_mode = GET_MODE (XEXP (x, 0));
819
820 /* Do changes needed to keep rtx consistent. Don't do any other
821 simplifications, as it is not our job. */
822 if (simplify)
823 simplify_while_replacing (loc, to, object, op0_mode);
824 }
825
826 /* Try replacing every occurrence of FROM in subexpression LOC of INSN
827 with TO. After all changes have been made, validate by seeing
828 if INSN is still valid. */
829
830 int
831 validate_replace_rtx_subexp (rtx from, rtx to, rtx_insn *insn, rtx *loc)
832 {
833 validate_replace_rtx_1 (loc, from, to, insn, true);
834 return apply_change_group ();
835 }
836
837 /* Try replacing every occurrence of FROM in INSN with TO. After all
838 changes have been made, validate by seeing if INSN is still valid. */
839
840 int
841 validate_replace_rtx (rtx from, rtx to, rtx_insn *insn)
842 {
843 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
844 return apply_change_group ();
845 }
846
847 /* Try replacing every occurrence of FROM in WHERE with TO. Assume that WHERE
848 is a part of INSN. After all changes have been made, validate by seeing if
849 INSN is still valid.
850 validate_replace_rtx (from, to, insn) is equivalent to
851 validate_replace_rtx_part (from, to, &PATTERN (insn), insn). */
852
853 int
854 validate_replace_rtx_part (rtx from, rtx to, rtx *where, rtx_insn *insn)
855 {
856 validate_replace_rtx_1 (where, from, to, insn, true);
857 return apply_change_group ();
858 }
859
860 /* Same as above, but do not simplify rtx afterwards. */
861 int
862 validate_replace_rtx_part_nosimplify (rtx from, rtx to, rtx *where,
863 rtx_insn *insn)
864 {
865 validate_replace_rtx_1 (where, from, to, insn, false);
866 return apply_change_group ();
867
868 }
869
870 /* Try replacing every occurrence of FROM in INSN with TO. This also
871 will replace in REG_EQUAL and REG_EQUIV notes. */
872
873 void
874 validate_replace_rtx_group (rtx from, rtx to, rtx_insn *insn)
875 {
876 rtx note;
877 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
878 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
879 if (REG_NOTE_KIND (note) == REG_EQUAL
880 || REG_NOTE_KIND (note) == REG_EQUIV)
881 validate_replace_rtx_1 (&XEXP (note, 0), from, to, insn, true);
882 }
883
884 /* Function called by note_uses to replace used subexpressions. */
885 struct validate_replace_src_data
886 {
887 rtx from; /* Old RTX */
888 rtx to; /* New RTX */
889 rtx_insn *insn; /* Insn in which substitution is occurring. */
890 };
891
892 static void
893 validate_replace_src_1 (rtx *x, void *data)
894 {
895 struct validate_replace_src_data *d
896 = (struct validate_replace_src_data *) data;
897
898 validate_replace_rtx_1 (x, d->from, d->to, d->insn, true);
899 }
900
901 /* Try replacing every occurrence of FROM in INSN with TO, avoiding
902 SET_DESTs. */
903
904 void
905 validate_replace_src_group (rtx from, rtx to, rtx_insn *insn)
906 {
907 struct validate_replace_src_data d;
908
909 d.from = from;
910 d.to = to;
911 d.insn = insn;
912 note_uses (&PATTERN (insn), validate_replace_src_1, &d);
913 }
914
915 /* Try simplify INSN.
916 Invoke simplify_rtx () on every SET_SRC and SET_DEST inside the INSN's
917 pattern and return true if something was simplified. */
918
919 bool
920 validate_simplify_insn (rtx_insn *insn)
921 {
922 int i;
923 rtx pat = NULL;
924 rtx newpat = NULL;
925
926 pat = PATTERN (insn);
927
928 if (GET_CODE (pat) == SET)
929 {
930 newpat = simplify_rtx (SET_SRC (pat));
931 if (newpat && !rtx_equal_p (SET_SRC (pat), newpat))
932 validate_change (insn, &SET_SRC (pat), newpat, 1);
933 newpat = simplify_rtx (SET_DEST (pat));
934 if (newpat && !rtx_equal_p (SET_DEST (pat), newpat))
935 validate_change (insn, &SET_DEST (pat), newpat, 1);
936 }
937 else if (GET_CODE (pat) == PARALLEL)
938 for (i = 0; i < XVECLEN (pat, 0); i++)
939 {
940 rtx s = XVECEXP (pat, 0, i);
941
942 if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
943 {
944 newpat = simplify_rtx (SET_SRC (s));
945 if (newpat && !rtx_equal_p (SET_SRC (s), newpat))
946 validate_change (insn, &SET_SRC (s), newpat, 1);
947 newpat = simplify_rtx (SET_DEST (s));
948 if (newpat && !rtx_equal_p (SET_DEST (s), newpat))
949 validate_change (insn, &SET_DEST (s), newpat, 1);
950 }
951 }
952 return ((num_changes_pending () > 0) && (apply_change_group () > 0));
953 }
954 \f
955 /* Return 1 if the insn using CC0 set by INSN does not contain
956 any ordered tests applied to the condition codes.
957 EQ and NE tests do not count. */
958
959 int
960 next_insn_tests_no_inequality (rtx_insn *insn)
961 {
962 rtx_insn *next = next_cc0_user (insn);
963
964 /* If there is no next insn, we have to take the conservative choice. */
965 if (next == 0)
966 return 0;
967
968 return (INSN_P (next)
969 && ! inequality_comparisons_p (PATTERN (next)));
970 }
971 \f
972 /* Return 1 if OP is a valid general operand for machine mode MODE.
973 This is either a register reference, a memory reference,
974 or a constant. In the case of a memory reference, the address
975 is checked for general validity for the target machine.
976
977 Register and memory references must have mode MODE in order to be valid,
978 but some constants have no machine mode and are valid for any mode.
979
980 If MODE is VOIDmode, OP is checked for validity for whatever mode
981 it has.
982
983 The main use of this function is as a predicate in match_operand
984 expressions in the machine description. */
985
986 int
987 general_operand (rtx op, machine_mode mode)
988 {
989 enum rtx_code code = GET_CODE (op);
990
991 if (mode == VOIDmode)
992 mode = GET_MODE (op);
993
994 /* Don't accept CONST_INT or anything similar
995 if the caller wants something floating. */
996 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
997 && GET_MODE_CLASS (mode) != MODE_INT
998 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
999 return 0;
1000
1001 if (CONST_INT_P (op)
1002 && mode != VOIDmode
1003 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1004 return 0;
1005
1006 if (CONSTANT_P (op))
1007 return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
1008 || mode == VOIDmode)
1009 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1010 && targetm.legitimate_constant_p (mode == VOIDmode
1011 ? GET_MODE (op)
1012 : mode, op));
1013
1014 /* Except for certain constants with VOIDmode, already checked for,
1015 OP's mode must match MODE if MODE specifies a mode. */
1016
1017 if (GET_MODE (op) != mode)
1018 return 0;
1019
1020 if (code == SUBREG)
1021 {
1022 rtx sub = SUBREG_REG (op);
1023
1024 #ifdef INSN_SCHEDULING
1025 /* On machines that have insn scheduling, we want all memory
1026 reference to be explicit, so outlaw paradoxical SUBREGs.
1027 However, we must allow them after reload so that they can
1028 get cleaned up by cleanup_subreg_operands. */
1029 if (!reload_completed && MEM_P (sub)
1030 && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (sub)))
1031 return 0;
1032 #endif
1033 /* Avoid memories with nonzero SUBREG_BYTE, as offsetting the memory
1034 may result in incorrect reference. We should simplify all valid
1035 subregs of MEM anyway. But allow this after reload because we
1036 might be called from cleanup_subreg_operands.
1037
1038 ??? This is a kludge. */
1039 if (!reload_completed && SUBREG_BYTE (op) != 0
1040 && MEM_P (sub))
1041 return 0;
1042
1043 #ifdef CANNOT_CHANGE_MODE_CLASS
1044 if (REG_P (sub)
1045 && REGNO (sub) < FIRST_PSEUDO_REGISTER
1046 && REG_CANNOT_CHANGE_MODE_P (REGNO (sub), GET_MODE (sub), mode)
1047 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_INT
1048 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_FLOAT
1049 /* LRA can generate some invalid SUBREGS just for matched
1050 operand reload presentation. LRA needs to treat them as
1051 valid. */
1052 && ! LRA_SUBREG_P (op))
1053 return 0;
1054 #endif
1055
1056 /* FLOAT_MODE subregs can't be paradoxical. Combine will occasionally
1057 create such rtl, and we must reject it. */
1058 if (SCALAR_FLOAT_MODE_P (GET_MODE (op))
1059 /* LRA can use subreg to store a floating point value in an
1060 integer mode. Although the floating point and the
1061 integer modes need the same number of hard registers, the
1062 size of floating point mode can be less than the integer
1063 mode. */
1064 && ! lra_in_progress
1065 && GET_MODE_SIZE (GET_MODE (op)) > GET_MODE_SIZE (GET_MODE (sub)))
1066 return 0;
1067
1068 op = sub;
1069 code = GET_CODE (op);
1070 }
1071
1072 if (code == REG)
1073 return (REGNO (op) >= FIRST_PSEUDO_REGISTER
1074 || in_hard_reg_set_p (operand_reg_set, GET_MODE (op), REGNO (op)));
1075
1076 if (code == MEM)
1077 {
1078 rtx y = XEXP (op, 0);
1079
1080 if (! volatile_ok && MEM_VOLATILE_P (op))
1081 return 0;
1082
1083 /* Use the mem's mode, since it will be reloaded thus. LRA can
1084 generate move insn with invalid addresses which is made valid
1085 and efficiently calculated by LRA through further numerous
1086 transformations. */
1087 if (lra_in_progress
1088 || memory_address_addr_space_p (GET_MODE (op), y, MEM_ADDR_SPACE (op)))
1089 return 1;
1090 }
1091
1092 return 0;
1093 }
1094 \f
1095 /* Return 1 if OP is a valid memory address for a memory reference
1096 of mode MODE.
1097
1098 The main use of this function is as a predicate in match_operand
1099 expressions in the machine description. */
1100
1101 int
1102 address_operand (rtx op, machine_mode mode)
1103 {
1104 return memory_address_p (mode, op);
1105 }
1106
1107 /* Return 1 if OP is a register reference of mode MODE.
1108 If MODE is VOIDmode, accept a register in any mode.
1109
1110 The main use of this function is as a predicate in match_operand
1111 expressions in the machine description. */
1112
1113 int
1114 register_operand (rtx op, machine_mode mode)
1115 {
1116 if (GET_CODE (op) == SUBREG)
1117 {
1118 rtx sub = SUBREG_REG (op);
1119
1120 /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1121 because it is guaranteed to be reloaded into one.
1122 Just make sure the MEM is valid in itself.
1123 (Ideally, (SUBREG (MEM)...) should not exist after reload,
1124 but currently it does result from (SUBREG (REG)...) where the
1125 reg went on the stack.) */
1126 if (!REG_P (sub) && (reload_completed || !MEM_P (sub)))
1127 return 0;
1128 }
1129 else if (!REG_P (op))
1130 return 0;
1131 return general_operand (op, mode);
1132 }
1133
1134 /* Return 1 for a register in Pmode; ignore the tested mode. */
1135
1136 int
1137 pmode_register_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
1138 {
1139 return register_operand (op, Pmode);
1140 }
1141
1142 /* Return 1 if OP should match a MATCH_SCRATCH, i.e., if it is a SCRATCH
1143 or a hard register. */
1144
1145 int
1146 scratch_operand (rtx op, machine_mode mode)
1147 {
1148 if (GET_MODE (op) != mode && mode != VOIDmode)
1149 return 0;
1150
1151 return (GET_CODE (op) == SCRATCH
1152 || (REG_P (op)
1153 && (lra_in_progress
1154 || (REGNO (op) < FIRST_PSEUDO_REGISTER
1155 && REGNO_REG_CLASS (REGNO (op)) != NO_REGS))));
1156 }
1157
1158 /* Return 1 if OP is a valid immediate operand for mode MODE.
1159
1160 The main use of this function is as a predicate in match_operand
1161 expressions in the machine description. */
1162
1163 int
1164 immediate_operand (rtx op, machine_mode mode)
1165 {
1166 /* Don't accept CONST_INT or anything similar
1167 if the caller wants something floating. */
1168 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1169 && GET_MODE_CLASS (mode) != MODE_INT
1170 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1171 return 0;
1172
1173 if (CONST_INT_P (op)
1174 && mode != VOIDmode
1175 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1176 return 0;
1177
1178 return (CONSTANT_P (op)
1179 && (GET_MODE (op) == mode || mode == VOIDmode
1180 || GET_MODE (op) == VOIDmode)
1181 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1182 && targetm.legitimate_constant_p (mode == VOIDmode
1183 ? GET_MODE (op)
1184 : mode, op));
1185 }
1186
1187 /* Returns 1 if OP is an operand that is a CONST_INT of mode MODE. */
1188
1189 int
1190 const_int_operand (rtx op, machine_mode mode)
1191 {
1192 if (!CONST_INT_P (op))
1193 return 0;
1194
1195 if (mode != VOIDmode
1196 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1197 return 0;
1198
1199 return 1;
1200 }
1201
1202 #if TARGET_SUPPORTS_WIDE_INT
1203 /* Returns 1 if OP is an operand that is a CONST_INT or CONST_WIDE_INT
1204 of mode MODE. */
1205 int
1206 const_scalar_int_operand (rtx op, machine_mode mode)
1207 {
1208 if (!CONST_SCALAR_INT_P (op))
1209 return 0;
1210
1211 if (CONST_INT_P (op))
1212 return const_int_operand (op, mode);
1213
1214 if (mode != VOIDmode)
1215 {
1216 int prec = GET_MODE_PRECISION (mode);
1217 int bitsize = GET_MODE_BITSIZE (mode);
1218
1219 if (CONST_WIDE_INT_NUNITS (op) * HOST_BITS_PER_WIDE_INT > bitsize)
1220 return 0;
1221
1222 if (prec == bitsize)
1223 return 1;
1224 else
1225 {
1226 /* Multiword partial int. */
1227 HOST_WIDE_INT x
1228 = CONST_WIDE_INT_ELT (op, CONST_WIDE_INT_NUNITS (op) - 1);
1229 return (sext_hwi (x, prec & (HOST_BITS_PER_WIDE_INT - 1)) == x);
1230 }
1231 }
1232 return 1;
1233 }
1234
1235 /* Returns 1 if OP is an operand that is a constant integer or constant
1236 floating-point number of MODE. */
1237
1238 int
1239 const_double_operand (rtx op, machine_mode mode)
1240 {
1241 return (GET_CODE (op) == CONST_DOUBLE)
1242 && (GET_MODE (op) == mode || mode == VOIDmode);
1243 }
1244 #else
1245 /* Returns 1 if OP is an operand that is a constant integer or constant
1246 floating-point number of MODE. */
1247
1248 int
1249 const_double_operand (rtx op, machine_mode mode)
1250 {
1251 /* Don't accept CONST_INT or anything similar
1252 if the caller wants something floating. */
1253 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1254 && GET_MODE_CLASS (mode) != MODE_INT
1255 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1256 return 0;
1257
1258 return ((CONST_DOUBLE_P (op) || CONST_INT_P (op))
1259 && (mode == VOIDmode || GET_MODE (op) == mode
1260 || GET_MODE (op) == VOIDmode));
1261 }
1262 #endif
1263 /* Return 1 if OP is a general operand that is not an immediate
1264 operand of mode MODE. */
1265
1266 int
1267 nonimmediate_operand (rtx op, machine_mode mode)
1268 {
1269 return (general_operand (op, mode) && ! CONSTANT_P (op));
1270 }
1271
1272 /* Return 1 if OP is a register reference or immediate value of mode MODE. */
1273
1274 int
1275 nonmemory_operand (rtx op, machine_mode mode)
1276 {
1277 if (CONSTANT_P (op))
1278 return immediate_operand (op, mode);
1279 return register_operand (op, mode);
1280 }
1281
1282 /* Return 1 if OP is a valid operand that stands for pushing a
1283 value of mode MODE onto the stack.
1284
1285 The main use of this function is as a predicate in match_operand
1286 expressions in the machine description. */
1287
1288 int
1289 push_operand (rtx op, machine_mode mode)
1290 {
1291 unsigned int rounded_size = GET_MODE_SIZE (mode);
1292
1293 #ifdef PUSH_ROUNDING
1294 rounded_size = PUSH_ROUNDING (rounded_size);
1295 #endif
1296
1297 if (!MEM_P (op))
1298 return 0;
1299
1300 if (mode != VOIDmode && GET_MODE (op) != mode)
1301 return 0;
1302
1303 op = XEXP (op, 0);
1304
1305 if (rounded_size == GET_MODE_SIZE (mode))
1306 {
1307 if (GET_CODE (op) != STACK_PUSH_CODE)
1308 return 0;
1309 }
1310 else
1311 {
1312 if (GET_CODE (op) != PRE_MODIFY
1313 || GET_CODE (XEXP (op, 1)) != PLUS
1314 || XEXP (XEXP (op, 1), 0) != XEXP (op, 0)
1315 || !CONST_INT_P (XEXP (XEXP (op, 1), 1))
1316 || INTVAL (XEXP (XEXP (op, 1), 1))
1317 != ((STACK_GROWS_DOWNWARD ? -1 : 1) * (int) rounded_size))
1318 return 0;
1319 }
1320
1321 return XEXP (op, 0) == stack_pointer_rtx;
1322 }
1323
1324 /* Return 1 if OP is a valid operand that stands for popping a
1325 value of mode MODE off the stack.
1326
1327 The main use of this function is as a predicate in match_operand
1328 expressions in the machine description. */
1329
1330 int
1331 pop_operand (rtx op, machine_mode mode)
1332 {
1333 if (!MEM_P (op))
1334 return 0;
1335
1336 if (mode != VOIDmode && GET_MODE (op) != mode)
1337 return 0;
1338
1339 op = XEXP (op, 0);
1340
1341 if (GET_CODE (op) != STACK_POP_CODE)
1342 return 0;
1343
1344 return XEXP (op, 0) == stack_pointer_rtx;
1345 }
1346
1347 /* Return 1 if ADDR is a valid memory address
1348 for mode MODE in address space AS. */
1349
1350 int
1351 memory_address_addr_space_p (machine_mode mode ATTRIBUTE_UNUSED,
1352 rtx addr, addr_space_t as)
1353 {
1354 #ifdef GO_IF_LEGITIMATE_ADDRESS
1355 gcc_assert (ADDR_SPACE_GENERIC_P (as));
1356 GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
1357 return 0;
1358
1359 win:
1360 return 1;
1361 #else
1362 return targetm.addr_space.legitimate_address_p (mode, addr, 0, as);
1363 #endif
1364 }
1365
1366 /* Return 1 if OP is a valid memory reference with mode MODE,
1367 including a valid address.
1368
1369 The main use of this function is as a predicate in match_operand
1370 expressions in the machine description. */
1371
1372 int
1373 memory_operand (rtx op, machine_mode mode)
1374 {
1375 rtx inner;
1376
1377 if (! reload_completed)
1378 /* Note that no SUBREG is a memory operand before end of reload pass,
1379 because (SUBREG (MEM...)) forces reloading into a register. */
1380 return MEM_P (op) && general_operand (op, mode);
1381
1382 if (mode != VOIDmode && GET_MODE (op) != mode)
1383 return 0;
1384
1385 inner = op;
1386 if (GET_CODE (inner) == SUBREG)
1387 inner = SUBREG_REG (inner);
1388
1389 return (MEM_P (inner) && general_operand (op, mode));
1390 }
1391
1392 /* Return 1 if OP is a valid indirect memory reference with mode MODE;
1393 that is, a memory reference whose address is a general_operand. */
1394
1395 int
1396 indirect_operand (rtx op, machine_mode mode)
1397 {
1398 /* Before reload, a SUBREG isn't in memory (see memory_operand, above). */
1399 if (! reload_completed
1400 && GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))
1401 {
1402 int offset = SUBREG_BYTE (op);
1403 rtx inner = SUBREG_REG (op);
1404
1405 if (mode != VOIDmode && GET_MODE (op) != mode)
1406 return 0;
1407
1408 /* The only way that we can have a general_operand as the resulting
1409 address is if OFFSET is zero and the address already is an operand
1410 or if the address is (plus Y (const_int -OFFSET)) and Y is an
1411 operand. */
1412
1413 return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
1414 || (GET_CODE (XEXP (inner, 0)) == PLUS
1415 && CONST_INT_P (XEXP (XEXP (inner, 0), 1))
1416 && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
1417 && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
1418 }
1419
1420 return (MEM_P (op)
1421 && memory_operand (op, mode)
1422 && general_operand (XEXP (op, 0), Pmode));
1423 }
1424
1425 /* Return 1 if this is an ordered comparison operator (not including
1426 ORDERED and UNORDERED). */
1427
1428 int
1429 ordered_comparison_operator (rtx op, machine_mode mode)
1430 {
1431 if (mode != VOIDmode && GET_MODE (op) != mode)
1432 return false;
1433 switch (GET_CODE (op))
1434 {
1435 case EQ:
1436 case NE:
1437 case LT:
1438 case LTU:
1439 case LE:
1440 case LEU:
1441 case GT:
1442 case GTU:
1443 case GE:
1444 case GEU:
1445 return true;
1446 default:
1447 return false;
1448 }
1449 }
1450
1451 /* Return 1 if this is a comparison operator. This allows the use of
1452 MATCH_OPERATOR to recognize all the branch insns. */
1453
1454 int
1455 comparison_operator (rtx op, machine_mode mode)
1456 {
1457 return ((mode == VOIDmode || GET_MODE (op) == mode)
1458 && COMPARISON_P (op));
1459 }
1460 \f
1461 /* If BODY is an insn body that uses ASM_OPERANDS, return it. */
1462
1463 rtx
1464 extract_asm_operands (rtx body)
1465 {
1466 rtx tmp;
1467 switch (GET_CODE (body))
1468 {
1469 case ASM_OPERANDS:
1470 return body;
1471
1472 case SET:
1473 /* Single output operand: BODY is (set OUTPUT (asm_operands ...)). */
1474 tmp = SET_SRC (body);
1475 if (GET_CODE (tmp) == ASM_OPERANDS)
1476 return tmp;
1477 break;
1478
1479 case PARALLEL:
1480 tmp = XVECEXP (body, 0, 0);
1481 if (GET_CODE (tmp) == ASM_OPERANDS)
1482 return tmp;
1483 if (GET_CODE (tmp) == SET)
1484 {
1485 tmp = SET_SRC (tmp);
1486 if (GET_CODE (tmp) == ASM_OPERANDS)
1487 return tmp;
1488 }
1489 break;
1490
1491 default:
1492 break;
1493 }
1494 return NULL;
1495 }
1496
1497 /* If BODY is an insn body that uses ASM_OPERANDS,
1498 return the number of operands (both input and output) in the insn.
1499 Otherwise return -1. */
1500
1501 int
1502 asm_noperands (const_rtx body)
1503 {
1504 rtx asm_op = extract_asm_operands (CONST_CAST_RTX (body));
1505 int n_sets = 0;
1506
1507 if (asm_op == NULL)
1508 return -1;
1509
1510 if (GET_CODE (body) == SET)
1511 n_sets = 1;
1512 else if (GET_CODE (body) == PARALLEL)
1513 {
1514 int i;
1515 if (GET_CODE (XVECEXP (body, 0, 0)) == SET)
1516 {
1517 /* Multiple output operands, or 1 output plus some clobbers:
1518 body is
1519 [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...]. */
1520 /* Count backwards through CLOBBERs to determine number of SETs. */
1521 for (i = XVECLEN (body, 0); i > 0; i--)
1522 {
1523 if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
1524 break;
1525 if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
1526 return -1;
1527 }
1528
1529 /* N_SETS is now number of output operands. */
1530 n_sets = i;
1531
1532 /* Verify that all the SETs we have
1533 came from a single original asm_operands insn
1534 (so that invalid combinations are blocked). */
1535 for (i = 0; i < n_sets; i++)
1536 {
1537 rtx elt = XVECEXP (body, 0, i);
1538 if (GET_CODE (elt) != SET)
1539 return -1;
1540 if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
1541 return -1;
1542 /* If these ASM_OPERANDS rtx's came from different original insns
1543 then they aren't allowed together. */
1544 if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
1545 != ASM_OPERANDS_INPUT_VEC (asm_op))
1546 return -1;
1547 }
1548 }
1549 else
1550 {
1551 /* 0 outputs, but some clobbers:
1552 body is [(asm_operands ...) (clobber (reg ...))...]. */
1553 /* Make sure all the other parallel things really are clobbers. */
1554 for (i = XVECLEN (body, 0) - 1; i > 0; i--)
1555 if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
1556 return -1;
1557 }
1558 }
1559
1560 return (ASM_OPERANDS_INPUT_LENGTH (asm_op)
1561 + ASM_OPERANDS_LABEL_LENGTH (asm_op) + n_sets);
1562 }
1563
1564 /* Assuming BODY is an insn body that uses ASM_OPERANDS,
1565 copy its operands (both input and output) into the vector OPERANDS,
1566 the locations of the operands within the insn into the vector OPERAND_LOCS,
1567 and the constraints for the operands into CONSTRAINTS.
1568 Write the modes of the operands into MODES.
1569 Return the assembler-template.
1570
1571 If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
1572 we don't store that info. */
1573
1574 const char *
1575 decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs,
1576 const char **constraints, machine_mode *modes,
1577 location_t *loc)
1578 {
1579 int nbase = 0, n, i;
1580 rtx asmop;
1581
1582 switch (GET_CODE (body))
1583 {
1584 case ASM_OPERANDS:
1585 /* Zero output asm: BODY is (asm_operands ...). */
1586 asmop = body;
1587 break;
1588
1589 case SET:
1590 /* Single output asm: BODY is (set OUTPUT (asm_operands ...)). */
1591 asmop = SET_SRC (body);
1592
1593 /* The output is in the SET.
1594 Its constraint is in the ASM_OPERANDS itself. */
1595 if (operands)
1596 operands[0] = SET_DEST (body);
1597 if (operand_locs)
1598 operand_locs[0] = &SET_DEST (body);
1599 if (constraints)
1600 constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
1601 if (modes)
1602 modes[0] = GET_MODE (SET_DEST (body));
1603 nbase = 1;
1604 break;
1605
1606 case PARALLEL:
1607 {
1608 int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs. */
1609
1610 asmop = XVECEXP (body, 0, 0);
1611 if (GET_CODE (asmop) == SET)
1612 {
1613 asmop = SET_SRC (asmop);
1614
1615 /* At least one output, plus some CLOBBERs. The outputs are in
1616 the SETs. Their constraints are in the ASM_OPERANDS itself. */
1617 for (i = 0; i < nparallel; i++)
1618 {
1619 if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1620 break; /* Past last SET */
1621 if (operands)
1622 operands[i] = SET_DEST (XVECEXP (body, 0, i));
1623 if (operand_locs)
1624 operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1625 if (constraints)
1626 constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1627 if (modes)
1628 modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1629 }
1630 nbase = i;
1631 }
1632 break;
1633 }
1634
1635 default:
1636 gcc_unreachable ();
1637 }
1638
1639 n = ASM_OPERANDS_INPUT_LENGTH (asmop);
1640 for (i = 0; i < n; i++)
1641 {
1642 if (operand_locs)
1643 operand_locs[nbase + i] = &ASM_OPERANDS_INPUT (asmop, i);
1644 if (operands)
1645 operands[nbase + i] = ASM_OPERANDS_INPUT (asmop, i);
1646 if (constraints)
1647 constraints[nbase + i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1648 if (modes)
1649 modes[nbase + i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1650 }
1651 nbase += n;
1652
1653 n = ASM_OPERANDS_LABEL_LENGTH (asmop);
1654 for (i = 0; i < n; i++)
1655 {
1656 if (operand_locs)
1657 operand_locs[nbase + i] = &ASM_OPERANDS_LABEL (asmop, i);
1658 if (operands)
1659 operands[nbase + i] = ASM_OPERANDS_LABEL (asmop, i);
1660 if (constraints)
1661 constraints[nbase + i] = "";
1662 if (modes)
1663 modes[nbase + i] = Pmode;
1664 }
1665
1666 if (loc)
1667 *loc = ASM_OPERANDS_SOURCE_LOCATION (asmop);
1668
1669 return ASM_OPERANDS_TEMPLATE (asmop);
1670 }
1671
1672 /* Parse inline assembly string STRING and determine which operands are
1673 referenced by % markers. For the first NOPERANDS operands, set USED[I]
1674 to true if operand I is referenced.
1675
1676 This is intended to distinguish barrier-like asms such as:
1677
1678 asm ("" : "=m" (...));
1679
1680 from real references such as:
1681
1682 asm ("sw\t$0, %0" : "=m" (...)); */
1683
1684 void
1685 get_referenced_operands (const char *string, bool *used,
1686 unsigned int noperands)
1687 {
1688 memset (used, 0, sizeof (bool) * noperands);
1689 const char *p = string;
1690 while (*p)
1691 switch (*p)
1692 {
1693 case '%':
1694 p += 1;
1695 /* A letter followed by a digit indicates an operand number. */
1696 if (ISALPHA (p[0]) && ISDIGIT (p[1]))
1697 p += 1;
1698 if (ISDIGIT (*p))
1699 {
1700 char *endptr;
1701 unsigned long opnum = strtoul (p, &endptr, 10);
1702 if (endptr != p && opnum < noperands)
1703 used[opnum] = true;
1704 p = endptr;
1705 }
1706 else
1707 p += 1;
1708 break;
1709
1710 default:
1711 p++;
1712 break;
1713 }
1714 }
1715
1716 /* Check if an asm_operand matches its constraints.
1717 Return > 0 if ok, = 0 if bad, < 0 if inconclusive. */
1718
1719 int
1720 asm_operand_ok (rtx op, const char *constraint, const char **constraints)
1721 {
1722 int result = 0;
1723 #ifdef AUTO_INC_DEC
1724 bool incdec_ok = false;
1725 #endif
1726
1727 /* Use constrain_operands after reload. */
1728 gcc_assert (!reload_completed);
1729
1730 /* Empty constraint string is the same as "X,...,X", i.e. X for as
1731 many alternatives as required to match the other operands. */
1732 if (*constraint == '\0')
1733 result = 1;
1734
1735 while (*constraint)
1736 {
1737 enum constraint_num cn;
1738 char c = *constraint;
1739 int len;
1740 switch (c)
1741 {
1742 case ',':
1743 constraint++;
1744 continue;
1745
1746 case '0': case '1': case '2': case '3': case '4':
1747 case '5': case '6': case '7': case '8': case '9':
1748 /* If caller provided constraints pointer, look up
1749 the matching constraint. Otherwise, our caller should have
1750 given us the proper matching constraint, but we can't
1751 actually fail the check if they didn't. Indicate that
1752 results are inconclusive. */
1753 if (constraints)
1754 {
1755 char *end;
1756 unsigned long match;
1757
1758 match = strtoul (constraint, &end, 10);
1759 if (!result)
1760 result = asm_operand_ok (op, constraints[match], NULL);
1761 constraint = (const char *) end;
1762 }
1763 else
1764 {
1765 do
1766 constraint++;
1767 while (ISDIGIT (*constraint));
1768 if (! result)
1769 result = -1;
1770 }
1771 continue;
1772
1773 /* The rest of the compiler assumes that reloading the address
1774 of a MEM into a register will make it fit an 'o' constraint.
1775 That is, if it sees a MEM operand for an 'o' constraint,
1776 it assumes that (mem (base-reg)) will fit.
1777
1778 That assumption fails on targets that don't have offsettable
1779 addresses at all. We therefore need to treat 'o' asm
1780 constraints as a special case and only accept operands that
1781 are already offsettable, thus proving that at least one
1782 offsettable address exists. */
1783 case 'o': /* offsettable */
1784 if (offsettable_nonstrict_memref_p (op))
1785 result = 1;
1786 break;
1787
1788 case 'g':
1789 if (general_operand (op, VOIDmode))
1790 result = 1;
1791 break;
1792
1793 #ifdef AUTO_INC_DEC
1794 case '<':
1795 case '>':
1796 /* ??? Before auto-inc-dec, auto inc/dec insns are not supposed
1797 to exist, excepting those that expand_call created. Further,
1798 on some machines which do not have generalized auto inc/dec,
1799 an inc/dec is not a memory_operand.
1800
1801 Match any memory and hope things are resolved after reload. */
1802 incdec_ok = true;
1803 #endif
1804 default:
1805 cn = lookup_constraint (constraint);
1806 switch (get_constraint_type (cn))
1807 {
1808 case CT_REGISTER:
1809 if (!result
1810 && reg_class_for_constraint (cn) != NO_REGS
1811 && GET_MODE (op) != BLKmode
1812 && register_operand (op, VOIDmode))
1813 result = 1;
1814 break;
1815
1816 case CT_CONST_INT:
1817 if (!result
1818 && CONST_INT_P (op)
1819 && insn_const_int_ok_for_constraint (INTVAL (op), cn))
1820 result = 1;
1821 break;
1822
1823 case CT_MEMORY:
1824 /* Every memory operand can be reloaded to fit. */
1825 result = result || memory_operand (op, VOIDmode);
1826 break;
1827
1828 case CT_ADDRESS:
1829 /* Every address operand can be reloaded to fit. */
1830 result = result || address_operand (op, VOIDmode);
1831 break;
1832
1833 case CT_FIXED_FORM:
1834 result = result || constraint_satisfied_p (op, cn);
1835 break;
1836 }
1837 break;
1838 }
1839 len = CONSTRAINT_LEN (c, constraint);
1840 do
1841 constraint++;
1842 while (--len && *constraint);
1843 if (len)
1844 return 0;
1845 }
1846
1847 #ifdef AUTO_INC_DEC
1848 /* For operands without < or > constraints reject side-effects. */
1849 if (!incdec_ok && result && MEM_P (op))
1850 switch (GET_CODE (XEXP (op, 0)))
1851 {
1852 case PRE_INC:
1853 case POST_INC:
1854 case PRE_DEC:
1855 case POST_DEC:
1856 case PRE_MODIFY:
1857 case POST_MODIFY:
1858 return 0;
1859 default:
1860 break;
1861 }
1862 #endif
1863
1864 return result;
1865 }
1866 \f
1867 /* Given an rtx *P, if it is a sum containing an integer constant term,
1868 return the location (type rtx *) of the pointer to that constant term.
1869 Otherwise, return a null pointer. */
1870
1871 rtx *
1872 find_constant_term_loc (rtx *p)
1873 {
1874 rtx *tem;
1875 enum rtx_code code = GET_CODE (*p);
1876
1877 /* If *P IS such a constant term, P is its location. */
1878
1879 if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1880 || code == CONST)
1881 return p;
1882
1883 /* Otherwise, if not a sum, it has no constant term. */
1884
1885 if (GET_CODE (*p) != PLUS)
1886 return 0;
1887
1888 /* If one of the summands is constant, return its location. */
1889
1890 if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1891 && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1892 return p;
1893
1894 /* Otherwise, check each summand for containing a constant term. */
1895
1896 if (XEXP (*p, 0) != 0)
1897 {
1898 tem = find_constant_term_loc (&XEXP (*p, 0));
1899 if (tem != 0)
1900 return tem;
1901 }
1902
1903 if (XEXP (*p, 1) != 0)
1904 {
1905 tem = find_constant_term_loc (&XEXP (*p, 1));
1906 if (tem != 0)
1907 return tem;
1908 }
1909
1910 return 0;
1911 }
1912 \f
1913 /* Return 1 if OP is a memory reference
1914 whose address contains no side effects
1915 and remains valid after the addition
1916 of a positive integer less than the
1917 size of the object being referenced.
1918
1919 We assume that the original address is valid and do not check it.
1920
1921 This uses strict_memory_address_p as a subroutine, so
1922 don't use it before reload. */
1923
1924 int
1925 offsettable_memref_p (rtx op)
1926 {
1927 return ((MEM_P (op))
1928 && offsettable_address_addr_space_p (1, GET_MODE (op), XEXP (op, 0),
1929 MEM_ADDR_SPACE (op)));
1930 }
1931
1932 /* Similar, but don't require a strictly valid mem ref:
1933 consider pseudo-regs valid as index or base regs. */
1934
1935 int
1936 offsettable_nonstrict_memref_p (rtx op)
1937 {
1938 return ((MEM_P (op))
1939 && offsettable_address_addr_space_p (0, GET_MODE (op), XEXP (op, 0),
1940 MEM_ADDR_SPACE (op)));
1941 }
1942
1943 /* Return 1 if Y is a memory address which contains no side effects
1944 and would remain valid for address space AS after the addition of
1945 a positive integer less than the size of that mode.
1946
1947 We assume that the original address is valid and do not check it.
1948 We do check that it is valid for narrower modes.
1949
1950 If STRICTP is nonzero, we require a strictly valid address,
1951 for the sake of use in reload.c. */
1952
1953 int
1954 offsettable_address_addr_space_p (int strictp, machine_mode mode, rtx y,
1955 addr_space_t as)
1956 {
1957 enum rtx_code ycode = GET_CODE (y);
1958 rtx z;
1959 rtx y1 = y;
1960 rtx *y2;
1961 int (*addressp) (machine_mode, rtx, addr_space_t) =
1962 (strictp ? strict_memory_address_addr_space_p
1963 : memory_address_addr_space_p);
1964 unsigned int mode_sz = GET_MODE_SIZE (mode);
1965
1966 if (CONSTANT_ADDRESS_P (y))
1967 return 1;
1968
1969 /* Adjusting an offsettable address involves changing to a narrower mode.
1970 Make sure that's OK. */
1971
1972 if (mode_dependent_address_p (y, as))
1973 return 0;
1974
1975 machine_mode address_mode = GET_MODE (y);
1976 if (address_mode == VOIDmode)
1977 address_mode = targetm.addr_space.address_mode (as);
1978 #ifdef POINTERS_EXTEND_UNSIGNED
1979 machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
1980 #endif
1981
1982 /* ??? How much offset does an offsettable BLKmode reference need?
1983 Clearly that depends on the situation in which it's being used.
1984 However, the current situation in which we test 0xffffffff is
1985 less than ideal. Caveat user. */
1986 if (mode_sz == 0)
1987 mode_sz = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
1988
1989 /* If the expression contains a constant term,
1990 see if it remains valid when max possible offset is added. */
1991
1992 if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1993 {
1994 int good;
1995
1996 y1 = *y2;
1997 *y2 = plus_constant (address_mode, *y2, mode_sz - 1);
1998 /* Use QImode because an odd displacement may be automatically invalid
1999 for any wider mode. But it should be valid for a single byte. */
2000 good = (*addressp) (QImode, y, as);
2001
2002 /* In any case, restore old contents of memory. */
2003 *y2 = y1;
2004 return good;
2005 }
2006
2007 if (GET_RTX_CLASS (ycode) == RTX_AUTOINC)
2008 return 0;
2009
2010 /* The offset added here is chosen as the maximum offset that
2011 any instruction could need to add when operating on something
2012 of the specified mode. We assume that if Y and Y+c are
2013 valid addresses then so is Y+d for all 0<d<c. adjust_address will
2014 go inside a LO_SUM here, so we do so as well. */
2015 if (GET_CODE (y) == LO_SUM
2016 && mode != BLKmode
2017 && mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
2018 z = gen_rtx_LO_SUM (address_mode, XEXP (y, 0),
2019 plus_constant (address_mode, XEXP (y, 1),
2020 mode_sz - 1));
2021 #ifdef POINTERS_EXTEND_UNSIGNED
2022 /* Likewise for a ZERO_EXTEND from pointer_mode. */
2023 else if (POINTERS_EXTEND_UNSIGNED > 0
2024 && GET_CODE (y) == ZERO_EXTEND
2025 && GET_MODE (XEXP (y, 0)) == pointer_mode)
2026 z = gen_rtx_ZERO_EXTEND (address_mode,
2027 plus_constant (pointer_mode, XEXP (y, 0),
2028 mode_sz - 1));
2029 #endif
2030 else
2031 z = plus_constant (address_mode, y, mode_sz - 1);
2032
2033 /* Use QImode because an odd displacement may be automatically invalid
2034 for any wider mode. But it should be valid for a single byte. */
2035 return (*addressp) (QImode, z, as);
2036 }
2037
2038 /* Return 1 if ADDR is an address-expression whose effect depends
2039 on the mode of the memory reference it is used in.
2040
2041 ADDRSPACE is the address space associated with the address.
2042
2043 Autoincrement addressing is a typical example of mode-dependence
2044 because the amount of the increment depends on the mode. */
2045
2046 bool
2047 mode_dependent_address_p (rtx addr, addr_space_t addrspace)
2048 {
2049 /* Auto-increment addressing with anything other than post_modify
2050 or pre_modify always introduces a mode dependency. Catch such
2051 cases now instead of deferring to the target. */
2052 if (GET_CODE (addr) == PRE_INC
2053 || GET_CODE (addr) == POST_INC
2054 || GET_CODE (addr) == PRE_DEC
2055 || GET_CODE (addr) == POST_DEC)
2056 return true;
2057
2058 return targetm.mode_dependent_address_p (addr, addrspace);
2059 }
2060 \f
2061 /* Return true if boolean attribute ATTR is supported. */
2062
2063 static bool
2064 have_bool_attr (bool_attr attr)
2065 {
2066 switch (attr)
2067 {
2068 case BA_ENABLED:
2069 return HAVE_ATTR_enabled;
2070 case BA_PREFERRED_FOR_SIZE:
2071 return HAVE_ATTR_enabled || HAVE_ATTR_preferred_for_size;
2072 case BA_PREFERRED_FOR_SPEED:
2073 return HAVE_ATTR_enabled || HAVE_ATTR_preferred_for_speed;
2074 }
2075 gcc_unreachable ();
2076 }
2077
2078 /* Return the value of ATTR for instruction INSN. */
2079
2080 static bool
2081 get_bool_attr (rtx_insn *insn, bool_attr attr)
2082 {
2083 switch (attr)
2084 {
2085 case BA_ENABLED:
2086 return get_attr_enabled (insn);
2087 case BA_PREFERRED_FOR_SIZE:
2088 return get_attr_enabled (insn) && get_attr_preferred_for_size (insn);
2089 case BA_PREFERRED_FOR_SPEED:
2090 return get_attr_enabled (insn) && get_attr_preferred_for_speed (insn);
2091 }
2092 gcc_unreachable ();
2093 }
2094
2095 /* Like get_bool_attr_mask, but don't use the cache. */
2096
2097 static alternative_mask
2098 get_bool_attr_mask_uncached (rtx_insn *insn, bool_attr attr)
2099 {
2100 /* Temporarily install enough information for get_attr_<foo> to assume
2101 that the insn operands are already cached. As above, the attribute
2102 mustn't depend on the values of operands, so we don't provide their
2103 real values here. */
2104 rtx_insn *old_insn = recog_data.insn;
2105 int old_alternative = which_alternative;
2106
2107 recog_data.insn = insn;
2108 alternative_mask mask = ALL_ALTERNATIVES;
2109 int n_alternatives = insn_data[INSN_CODE (insn)].n_alternatives;
2110 for (int i = 0; i < n_alternatives; i++)
2111 {
2112 which_alternative = i;
2113 if (!get_bool_attr (insn, attr))
2114 mask &= ~ALTERNATIVE_BIT (i);
2115 }
2116
2117 recog_data.insn = old_insn;
2118 which_alternative = old_alternative;
2119 return mask;
2120 }
2121
2122 /* Return the mask of operand alternatives that are allowed for INSN
2123 by boolean attribute ATTR. This mask depends only on INSN and on
2124 the current target; it does not depend on things like the values of
2125 operands. */
2126
2127 static alternative_mask
2128 get_bool_attr_mask (rtx_insn *insn, bool_attr attr)
2129 {
2130 /* Quick exit for asms and for targets that don't use these attributes. */
2131 int code = INSN_CODE (insn);
2132 if (code < 0 || !have_bool_attr (attr))
2133 return ALL_ALTERNATIVES;
2134
2135 /* Calling get_attr_<foo> can be expensive, so cache the mask
2136 for speed. */
2137 if (!this_target_recog->x_bool_attr_masks[code][attr])
2138 this_target_recog->x_bool_attr_masks[code][attr]
2139 = get_bool_attr_mask_uncached (insn, attr);
2140 return this_target_recog->x_bool_attr_masks[code][attr];
2141 }
2142
2143 /* Return the set of alternatives of INSN that are allowed by the current
2144 target. */
2145
2146 alternative_mask
2147 get_enabled_alternatives (rtx_insn *insn)
2148 {
2149 return get_bool_attr_mask (insn, BA_ENABLED);
2150 }
2151
2152 /* Return the set of alternatives of INSN that are allowed by the current
2153 target and are preferred for the current size/speed optimization
2154 choice. */
2155
2156 alternative_mask
2157 get_preferred_alternatives (rtx_insn *insn)
2158 {
2159 if (optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn)))
2160 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SPEED);
2161 else
2162 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SIZE);
2163 }
2164
2165 /* Return the set of alternatives of INSN that are allowed by the current
2166 target and are preferred for the size/speed optimization choice
2167 associated with BB. Passing a separate BB is useful if INSN has not
2168 been emitted yet or if we are considering moving it to a different
2169 block. */
2170
2171 alternative_mask
2172 get_preferred_alternatives (rtx_insn *insn, basic_block bb)
2173 {
2174 if (optimize_bb_for_speed_p (bb))
2175 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SPEED);
2176 else
2177 return get_bool_attr_mask (insn, BA_PREFERRED_FOR_SIZE);
2178 }
2179
2180 /* Assert that the cached boolean attributes for INSN are still accurate.
2181 The backend is required to define these attributes in a way that only
2182 depends on the current target (rather than operands, compiler phase,
2183 etc.). */
2184
2185 bool
2186 check_bool_attrs (rtx_insn *insn)
2187 {
2188 int code = INSN_CODE (insn);
2189 if (code >= 0)
2190 for (int i = 0; i <= BA_LAST; ++i)
2191 {
2192 enum bool_attr attr = (enum bool_attr) i;
2193 if (this_target_recog->x_bool_attr_masks[code][attr])
2194 gcc_assert (this_target_recog->x_bool_attr_masks[code][attr]
2195 == get_bool_attr_mask_uncached (insn, attr));
2196 }
2197 return true;
2198 }
2199
2200 /* Like extract_insn, but save insn extracted and don't extract again, when
2201 called again for the same insn expecting that recog_data still contain the
2202 valid information. This is used primary by gen_attr infrastructure that
2203 often does extract insn again and again. */
2204 void
2205 extract_insn_cached (rtx_insn *insn)
2206 {
2207 if (recog_data.insn == insn && INSN_CODE (insn) >= 0)
2208 return;
2209 extract_insn (insn);
2210 recog_data.insn = insn;
2211 }
2212
2213 /* Do uncached extract_insn, constrain_operands and complain about failures.
2214 This should be used when extracting a pre-existing constrained instruction
2215 if the caller wants to know which alternative was chosen. */
2216 void
2217 extract_constrain_insn (rtx_insn *insn)
2218 {
2219 extract_insn (insn);
2220 if (!constrain_operands (reload_completed, get_enabled_alternatives (insn)))
2221 fatal_insn_not_found (insn);
2222 }
2223
2224 /* Do cached extract_insn, constrain_operands and complain about failures.
2225 Used by insn_attrtab. */
2226 void
2227 extract_constrain_insn_cached (rtx_insn *insn)
2228 {
2229 extract_insn_cached (insn);
2230 if (which_alternative == -1
2231 && !constrain_operands (reload_completed,
2232 get_enabled_alternatives (insn)))
2233 fatal_insn_not_found (insn);
2234 }
2235
2236 /* Do cached constrain_operands on INSN and complain about failures. */
2237 int
2238 constrain_operands_cached (rtx_insn *insn, int strict)
2239 {
2240 if (which_alternative == -1)
2241 return constrain_operands (strict, get_enabled_alternatives (insn));
2242 else
2243 return 1;
2244 }
2245 \f
2246 /* Analyze INSN and fill in recog_data. */
2247
2248 void
2249 extract_insn (rtx_insn *insn)
2250 {
2251 int i;
2252 int icode;
2253 int noperands;
2254 rtx body = PATTERN (insn);
2255
2256 recog_data.n_operands = 0;
2257 recog_data.n_alternatives = 0;
2258 recog_data.n_dups = 0;
2259 recog_data.is_asm = false;
2260
2261 switch (GET_CODE (body))
2262 {
2263 case USE:
2264 case CLOBBER:
2265 case ASM_INPUT:
2266 case ADDR_VEC:
2267 case ADDR_DIFF_VEC:
2268 case VAR_LOCATION:
2269 return;
2270
2271 case SET:
2272 if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
2273 goto asm_insn;
2274 else
2275 goto normal_insn;
2276 case PARALLEL:
2277 if ((GET_CODE (XVECEXP (body, 0, 0)) == SET
2278 && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
2279 || GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
2280 goto asm_insn;
2281 else
2282 goto normal_insn;
2283 case ASM_OPERANDS:
2284 asm_insn:
2285 recog_data.n_operands = noperands = asm_noperands (body);
2286 if (noperands >= 0)
2287 {
2288 /* This insn is an `asm' with operands. */
2289
2290 /* expand_asm_operands makes sure there aren't too many operands. */
2291 gcc_assert (noperands <= MAX_RECOG_OPERANDS);
2292
2293 /* Now get the operand values and constraints out of the insn. */
2294 decode_asm_operands (body, recog_data.operand,
2295 recog_data.operand_loc,
2296 recog_data.constraints,
2297 recog_data.operand_mode, NULL);
2298 memset (recog_data.is_operator, 0, sizeof recog_data.is_operator);
2299 if (noperands > 0)
2300 {
2301 const char *p = recog_data.constraints[0];
2302 recog_data.n_alternatives = 1;
2303 while (*p)
2304 recog_data.n_alternatives += (*p++ == ',');
2305 }
2306 recog_data.is_asm = true;
2307 break;
2308 }
2309 fatal_insn_not_found (insn);
2310
2311 default:
2312 normal_insn:
2313 /* Ordinary insn: recognize it, get the operands via insn_extract
2314 and get the constraints. */
2315
2316 icode = recog_memoized (insn);
2317 if (icode < 0)
2318 fatal_insn_not_found (insn);
2319
2320 recog_data.n_operands = noperands = insn_data[icode].n_operands;
2321 recog_data.n_alternatives = insn_data[icode].n_alternatives;
2322 recog_data.n_dups = insn_data[icode].n_dups;
2323
2324 insn_extract (insn);
2325
2326 for (i = 0; i < noperands; i++)
2327 {
2328 recog_data.constraints[i] = insn_data[icode].operand[i].constraint;
2329 recog_data.is_operator[i] = insn_data[icode].operand[i].is_operator;
2330 recog_data.operand_mode[i] = insn_data[icode].operand[i].mode;
2331 /* VOIDmode match_operands gets mode from their real operand. */
2332 if (recog_data.operand_mode[i] == VOIDmode)
2333 recog_data.operand_mode[i] = GET_MODE (recog_data.operand[i]);
2334 }
2335 }
2336 for (i = 0; i < noperands; i++)
2337 recog_data.operand_type[i]
2338 = (recog_data.constraints[i][0] == '=' ? OP_OUT
2339 : recog_data.constraints[i][0] == '+' ? OP_INOUT
2340 : OP_IN);
2341
2342 gcc_assert (recog_data.n_alternatives <= MAX_RECOG_ALTERNATIVES);
2343
2344 recog_data.insn = NULL;
2345 which_alternative = -1;
2346 }
2347
2348 /* Fill in OP_ALT_BASE for an instruction that has N_OPERANDS operands,
2349 N_ALTERNATIVES alternatives and constraint strings CONSTRAINTS.
2350 OP_ALT_BASE has N_ALTERNATIVES * N_OPERANDS entries and CONSTRAINTS
2351 has N_OPERANDS entries. */
2352
2353 void
2354 preprocess_constraints (int n_operands, int n_alternatives,
2355 const char **constraints,
2356 operand_alternative *op_alt_base)
2357 {
2358 for (int i = 0; i < n_operands; i++)
2359 {
2360 int j;
2361 struct operand_alternative *op_alt;
2362 const char *p = constraints[i];
2363
2364 op_alt = op_alt_base;
2365
2366 for (j = 0; j < n_alternatives; j++, op_alt += n_operands)
2367 {
2368 op_alt[i].cl = NO_REGS;
2369 op_alt[i].constraint = p;
2370 op_alt[i].matches = -1;
2371 op_alt[i].matched = -1;
2372
2373 if (*p == '\0' || *p == ',')
2374 {
2375 op_alt[i].anything_ok = 1;
2376 continue;
2377 }
2378
2379 for (;;)
2380 {
2381 char c = *p;
2382 if (c == '#')
2383 do
2384 c = *++p;
2385 while (c != ',' && c != '\0');
2386 if (c == ',' || c == '\0')
2387 {
2388 p++;
2389 break;
2390 }
2391
2392 switch (c)
2393 {
2394 case '?':
2395 op_alt[i].reject += 6;
2396 break;
2397 case '!':
2398 op_alt[i].reject += 600;
2399 break;
2400 case '&':
2401 op_alt[i].earlyclobber = 1;
2402 break;
2403
2404 case '0': case '1': case '2': case '3': case '4':
2405 case '5': case '6': case '7': case '8': case '9':
2406 {
2407 char *end;
2408 op_alt[i].matches = strtoul (p, &end, 10);
2409 op_alt[op_alt[i].matches].matched = i;
2410 p = end;
2411 }
2412 continue;
2413
2414 case 'X':
2415 op_alt[i].anything_ok = 1;
2416 break;
2417
2418 case 'g':
2419 op_alt[i].cl =
2420 reg_class_subunion[(int) op_alt[i].cl][(int) GENERAL_REGS];
2421 break;
2422
2423 default:
2424 enum constraint_num cn = lookup_constraint (p);
2425 enum reg_class cl;
2426 switch (get_constraint_type (cn))
2427 {
2428 case CT_REGISTER:
2429 cl = reg_class_for_constraint (cn);
2430 if (cl != NO_REGS)
2431 op_alt[i].cl = reg_class_subunion[op_alt[i].cl][cl];
2432 break;
2433
2434 case CT_CONST_INT:
2435 break;
2436
2437 case CT_MEMORY:
2438 op_alt[i].memory_ok = 1;
2439 break;
2440
2441 case CT_ADDRESS:
2442 op_alt[i].is_address = 1;
2443 op_alt[i].cl
2444 = (reg_class_subunion
2445 [(int) op_alt[i].cl]
2446 [(int) base_reg_class (VOIDmode, ADDR_SPACE_GENERIC,
2447 ADDRESS, SCRATCH)]);
2448 break;
2449
2450 case CT_FIXED_FORM:
2451 break;
2452 }
2453 break;
2454 }
2455 p += CONSTRAINT_LEN (c, p);
2456 }
2457 }
2458 }
2459 }
2460
2461 /* Return an array of operand_alternative instructions for
2462 instruction ICODE. */
2463
2464 const operand_alternative *
2465 preprocess_insn_constraints (int icode)
2466 {
2467 gcc_checking_assert (IN_RANGE (icode, 0, LAST_INSN_CODE));
2468 if (this_target_recog->x_op_alt[icode])
2469 return this_target_recog->x_op_alt[icode];
2470
2471 int n_operands = insn_data[icode].n_operands;
2472 if (n_operands == 0)
2473 return 0;
2474 /* Always provide at least one alternative so that which_op_alt ()
2475 works correctly. If the instruction has 0 alternatives (i.e. all
2476 constraint strings are empty) then each operand in this alternative
2477 will have anything_ok set. */
2478 int n_alternatives = MAX (insn_data[icode].n_alternatives, 1);
2479 int n_entries = n_operands * n_alternatives;
2480
2481 operand_alternative *op_alt = XCNEWVEC (operand_alternative, n_entries);
2482 const char **constraints = XALLOCAVEC (const char *, n_operands);
2483
2484 for (int i = 0; i < n_operands; ++i)
2485 constraints[i] = insn_data[icode].operand[i].constraint;
2486 preprocess_constraints (n_operands, n_alternatives, constraints, op_alt);
2487
2488 this_target_recog->x_op_alt[icode] = op_alt;
2489 return op_alt;
2490 }
2491
2492 /* After calling extract_insn, you can use this function to extract some
2493 information from the constraint strings into a more usable form.
2494 The collected data is stored in recog_op_alt. */
2495
2496 void
2497 preprocess_constraints (rtx_insn *insn)
2498 {
2499 int icode = INSN_CODE (insn);
2500 if (icode >= 0)
2501 recog_op_alt = preprocess_insn_constraints (icode);
2502 else
2503 {
2504 int n_operands = recog_data.n_operands;
2505 int n_alternatives = recog_data.n_alternatives;
2506 int n_entries = n_operands * n_alternatives;
2507 memset (asm_op_alt, 0, n_entries * sizeof (operand_alternative));
2508 preprocess_constraints (n_operands, n_alternatives,
2509 recog_data.constraints, asm_op_alt);
2510 recog_op_alt = asm_op_alt;
2511 }
2512 }
2513
2514 /* Check the operands of an insn against the insn's operand constraints
2515 and return 1 if they match any of the alternatives in ALTERNATIVES.
2516
2517 The information about the insn's operands, constraints, operand modes
2518 etc. is obtained from the global variables set up by extract_insn.
2519
2520 WHICH_ALTERNATIVE is set to a number which indicates which
2521 alternative of constraints was matched: 0 for the first alternative,
2522 1 for the next, etc.
2523
2524 In addition, when two operands are required to match
2525 and it happens that the output operand is (reg) while the
2526 input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
2527 make the output operand look like the input.
2528 This is because the output operand is the one the template will print.
2529
2530 This is used in final, just before printing the assembler code and by
2531 the routines that determine an insn's attribute.
2532
2533 If STRICT is a positive nonzero value, it means that we have been
2534 called after reload has been completed. In that case, we must
2535 do all checks strictly. If it is zero, it means that we have been called
2536 before reload has completed. In that case, we first try to see if we can
2537 find an alternative that matches strictly. If not, we try again, this
2538 time assuming that reload will fix up the insn. This provides a "best
2539 guess" for the alternative and is used to compute attributes of insns prior
2540 to reload. A negative value of STRICT is used for this internal call. */
2541
2542 struct funny_match
2543 {
2544 int this_op, other;
2545 };
2546
2547 int
2548 constrain_operands (int strict, alternative_mask alternatives)
2549 {
2550 const char *constraints[MAX_RECOG_OPERANDS];
2551 int matching_operands[MAX_RECOG_OPERANDS];
2552 int earlyclobber[MAX_RECOG_OPERANDS];
2553 int c;
2554
2555 struct funny_match funny_match[MAX_RECOG_OPERANDS];
2556 int funny_match_index;
2557
2558 which_alternative = 0;
2559 if (recog_data.n_operands == 0 || recog_data.n_alternatives == 0)
2560 return 1;
2561
2562 for (c = 0; c < recog_data.n_operands; c++)
2563 {
2564 constraints[c] = recog_data.constraints[c];
2565 matching_operands[c] = -1;
2566 }
2567
2568 do
2569 {
2570 int seen_earlyclobber_at = -1;
2571 int opno;
2572 int lose = 0;
2573 funny_match_index = 0;
2574
2575 if (!TEST_BIT (alternatives, which_alternative))
2576 {
2577 int i;
2578
2579 for (i = 0; i < recog_data.n_operands; i++)
2580 constraints[i] = skip_alternative (constraints[i]);
2581
2582 which_alternative++;
2583 continue;
2584 }
2585
2586 for (opno = 0; opno < recog_data.n_operands; opno++)
2587 {
2588 rtx op = recog_data.operand[opno];
2589 machine_mode mode = GET_MODE (op);
2590 const char *p = constraints[opno];
2591 int offset = 0;
2592 int win = 0;
2593 int val;
2594 int len;
2595
2596 earlyclobber[opno] = 0;
2597
2598 /* A unary operator may be accepted by the predicate, but it
2599 is irrelevant for matching constraints. */
2600 if (UNARY_P (op))
2601 op = XEXP (op, 0);
2602
2603 if (GET_CODE (op) == SUBREG)
2604 {
2605 if (REG_P (SUBREG_REG (op))
2606 && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
2607 offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
2608 GET_MODE (SUBREG_REG (op)),
2609 SUBREG_BYTE (op),
2610 GET_MODE (op));
2611 op = SUBREG_REG (op);
2612 }
2613
2614 /* An empty constraint or empty alternative
2615 allows anything which matched the pattern. */
2616 if (*p == 0 || *p == ',')
2617 win = 1;
2618
2619 do
2620 switch (c = *p, len = CONSTRAINT_LEN (c, p), c)
2621 {
2622 case '\0':
2623 len = 0;
2624 break;
2625 case ',':
2626 c = '\0';
2627 break;
2628
2629 case '#':
2630 /* Ignore rest of this alternative as far as
2631 constraint checking is concerned. */
2632 do
2633 p++;
2634 while (*p && *p != ',');
2635 len = 0;
2636 break;
2637
2638 case '&':
2639 earlyclobber[opno] = 1;
2640 if (seen_earlyclobber_at < 0)
2641 seen_earlyclobber_at = opno;
2642 break;
2643
2644 case '0': case '1': case '2': case '3': case '4':
2645 case '5': case '6': case '7': case '8': case '9':
2646 {
2647 /* This operand must be the same as a previous one.
2648 This kind of constraint is used for instructions such
2649 as add when they take only two operands.
2650
2651 Note that the lower-numbered operand is passed first.
2652
2653 If we are not testing strictly, assume that this
2654 constraint will be satisfied. */
2655
2656 char *end;
2657 int match;
2658
2659 match = strtoul (p, &end, 10);
2660 p = end;
2661
2662 if (strict < 0)
2663 val = 1;
2664 else
2665 {
2666 rtx op1 = recog_data.operand[match];
2667 rtx op2 = recog_data.operand[opno];
2668
2669 /* A unary operator may be accepted by the predicate,
2670 but it is irrelevant for matching constraints. */
2671 if (UNARY_P (op1))
2672 op1 = XEXP (op1, 0);
2673 if (UNARY_P (op2))
2674 op2 = XEXP (op2, 0);
2675
2676 val = operands_match_p (op1, op2);
2677 }
2678
2679 matching_operands[opno] = match;
2680 matching_operands[match] = opno;
2681
2682 if (val != 0)
2683 win = 1;
2684
2685 /* If output is *x and input is *--x, arrange later
2686 to change the output to *--x as well, since the
2687 output op is the one that will be printed. */
2688 if (val == 2 && strict > 0)
2689 {
2690 funny_match[funny_match_index].this_op = opno;
2691 funny_match[funny_match_index++].other = match;
2692 }
2693 }
2694 len = 0;
2695 break;
2696
2697 case 'p':
2698 /* p is used for address_operands. When we are called by
2699 gen_reload, no one will have checked that the address is
2700 strictly valid, i.e., that all pseudos requiring hard regs
2701 have gotten them. */
2702 if (strict <= 0
2703 || (strict_memory_address_p (recog_data.operand_mode[opno],
2704 op)))
2705 win = 1;
2706 break;
2707
2708 /* No need to check general_operand again;
2709 it was done in insn-recog.c. Well, except that reload
2710 doesn't check the validity of its replacements, but
2711 that should only matter when there's a bug. */
2712 case 'g':
2713 /* Anything goes unless it is a REG and really has a hard reg
2714 but the hard reg is not in the class GENERAL_REGS. */
2715 if (REG_P (op))
2716 {
2717 if (strict < 0
2718 || GENERAL_REGS == ALL_REGS
2719 || (reload_in_progress
2720 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2721 || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
2722 win = 1;
2723 }
2724 else if (strict < 0 || general_operand (op, mode))
2725 win = 1;
2726 break;
2727
2728 default:
2729 {
2730 enum constraint_num cn = lookup_constraint (p);
2731 enum reg_class cl = reg_class_for_constraint (cn);
2732 if (cl != NO_REGS)
2733 {
2734 if (strict < 0
2735 || (strict == 0
2736 && REG_P (op)
2737 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2738 || (strict == 0 && GET_CODE (op) == SCRATCH)
2739 || (REG_P (op)
2740 && reg_fits_class_p (op, cl, offset, mode)))
2741 win = 1;
2742 }
2743
2744 else if (constraint_satisfied_p (op, cn))
2745 win = 1;
2746
2747 else if (insn_extra_memory_constraint (cn)
2748 /* Every memory operand can be reloaded to fit. */
2749 && ((strict < 0 && MEM_P (op))
2750 /* Before reload, accept what reload can turn
2751 into a mem. */
2752 || (strict < 0 && CONSTANT_P (op))
2753 /* Before reload, accept a pseudo,
2754 since LRA can turn it into a mem. */
2755 || (strict < 0 && targetm.lra_p () && REG_P (op)
2756 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2757 /* During reload, accept a pseudo */
2758 || (reload_in_progress && REG_P (op)
2759 && REGNO (op) >= FIRST_PSEUDO_REGISTER)))
2760 win = 1;
2761 else if (insn_extra_address_constraint (cn)
2762 /* Every address operand can be reloaded to fit. */
2763 && strict < 0)
2764 win = 1;
2765 /* Cater to architectures like IA-64 that define extra memory
2766 constraints without using define_memory_constraint. */
2767 else if (reload_in_progress
2768 && REG_P (op)
2769 && REGNO (op) >= FIRST_PSEUDO_REGISTER
2770 && reg_renumber[REGNO (op)] < 0
2771 && reg_equiv_mem (REGNO (op)) != 0
2772 && constraint_satisfied_p
2773 (reg_equiv_mem (REGNO (op)), cn))
2774 win = 1;
2775 break;
2776 }
2777 }
2778 while (p += len, c);
2779
2780 constraints[opno] = p;
2781 /* If this operand did not win somehow,
2782 this alternative loses. */
2783 if (! win)
2784 lose = 1;
2785 }
2786 /* This alternative won; the operands are ok.
2787 Change whichever operands this alternative says to change. */
2788 if (! lose)
2789 {
2790 int opno, eopno;
2791
2792 /* See if any earlyclobber operand conflicts with some other
2793 operand. */
2794
2795 if (strict > 0 && seen_earlyclobber_at >= 0)
2796 for (eopno = seen_earlyclobber_at;
2797 eopno < recog_data.n_operands;
2798 eopno++)
2799 /* Ignore earlyclobber operands now in memory,
2800 because we would often report failure when we have
2801 two memory operands, one of which was formerly a REG. */
2802 if (earlyclobber[eopno]
2803 && REG_P (recog_data.operand[eopno]))
2804 for (opno = 0; opno < recog_data.n_operands; opno++)
2805 if ((MEM_P (recog_data.operand[opno])
2806 || recog_data.operand_type[opno] != OP_OUT)
2807 && opno != eopno
2808 /* Ignore things like match_operator operands. */
2809 && *recog_data.constraints[opno] != 0
2810 && ! (matching_operands[opno] == eopno
2811 && operands_match_p (recog_data.operand[opno],
2812 recog_data.operand[eopno]))
2813 && ! safe_from_earlyclobber (recog_data.operand[opno],
2814 recog_data.operand[eopno]))
2815 lose = 1;
2816
2817 if (! lose)
2818 {
2819 while (--funny_match_index >= 0)
2820 {
2821 recog_data.operand[funny_match[funny_match_index].other]
2822 = recog_data.operand[funny_match[funny_match_index].this_op];
2823 }
2824
2825 #ifdef AUTO_INC_DEC
2826 /* For operands without < or > constraints reject side-effects. */
2827 if (recog_data.is_asm)
2828 {
2829 for (opno = 0; opno < recog_data.n_operands; opno++)
2830 if (MEM_P (recog_data.operand[opno]))
2831 switch (GET_CODE (XEXP (recog_data.operand[opno], 0)))
2832 {
2833 case PRE_INC:
2834 case POST_INC:
2835 case PRE_DEC:
2836 case POST_DEC:
2837 case PRE_MODIFY:
2838 case POST_MODIFY:
2839 if (strchr (recog_data.constraints[opno], '<') == NULL
2840 && strchr (recog_data.constraints[opno], '>')
2841 == NULL)
2842 return 0;
2843 break;
2844 default:
2845 break;
2846 }
2847 }
2848 #endif
2849 return 1;
2850 }
2851 }
2852
2853 which_alternative++;
2854 }
2855 while (which_alternative < recog_data.n_alternatives);
2856
2857 which_alternative = -1;
2858 /* If we are about to reject this, but we are not to test strictly,
2859 try a very loose test. Only return failure if it fails also. */
2860 if (strict == 0)
2861 return constrain_operands (-1, alternatives);
2862 else
2863 return 0;
2864 }
2865
2866 /* Return true iff OPERAND (assumed to be a REG rtx)
2867 is a hard reg in class CLASS when its regno is offset by OFFSET
2868 and changed to mode MODE.
2869 If REG occupies multiple hard regs, all of them must be in CLASS. */
2870
2871 bool
2872 reg_fits_class_p (const_rtx operand, reg_class_t cl, int offset,
2873 machine_mode mode)
2874 {
2875 unsigned int regno = REGNO (operand);
2876
2877 if (cl == NO_REGS)
2878 return false;
2879
2880 /* Regno must not be a pseudo register. Offset may be negative. */
2881 return (HARD_REGISTER_NUM_P (regno)
2882 && HARD_REGISTER_NUM_P (regno + offset)
2883 && in_hard_reg_set_p (reg_class_contents[(int) cl], mode,
2884 regno + offset));
2885 }
2886 \f
2887 /* Split single instruction. Helper function for split_all_insns and
2888 split_all_insns_noflow. Return last insn in the sequence if successful,
2889 or NULL if unsuccessful. */
2890
2891 static rtx_insn *
2892 split_insn (rtx_insn *insn)
2893 {
2894 /* Split insns here to get max fine-grain parallelism. */
2895 rtx_insn *first = PREV_INSN (insn);
2896 rtx_insn *last = try_split (PATTERN (insn), insn, 1);
2897 rtx insn_set, last_set, note;
2898
2899 if (last == insn)
2900 return NULL;
2901
2902 /* If the original instruction was a single set that was known to be
2903 equivalent to a constant, see if we can say the same about the last
2904 instruction in the split sequence. The two instructions must set
2905 the same destination. */
2906 insn_set = single_set (insn);
2907 if (insn_set)
2908 {
2909 last_set = single_set (last);
2910 if (last_set && rtx_equal_p (SET_DEST (last_set), SET_DEST (insn_set)))
2911 {
2912 note = find_reg_equal_equiv_note (insn);
2913 if (note && CONSTANT_P (XEXP (note, 0)))
2914 set_unique_reg_note (last, REG_EQUAL, XEXP (note, 0));
2915 else if (CONSTANT_P (SET_SRC (insn_set)))
2916 set_unique_reg_note (last, REG_EQUAL,
2917 copy_rtx (SET_SRC (insn_set)));
2918 }
2919 }
2920
2921 /* try_split returns the NOTE that INSN became. */
2922 SET_INSN_DELETED (insn);
2923
2924 /* ??? Coddle to md files that generate subregs in post-reload
2925 splitters instead of computing the proper hard register. */
2926 if (reload_completed && first != last)
2927 {
2928 first = NEXT_INSN (first);
2929 for (;;)
2930 {
2931 if (INSN_P (first))
2932 cleanup_subreg_operands (first);
2933 if (first == last)
2934 break;
2935 first = NEXT_INSN (first);
2936 }
2937 }
2938
2939 return last;
2940 }
2941
2942 /* Split all insns in the function. If UPD_LIFE, update life info after. */
2943
2944 void
2945 split_all_insns (void)
2946 {
2947 sbitmap blocks;
2948 bool changed;
2949 basic_block bb;
2950
2951 blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
2952 bitmap_clear (blocks);
2953 changed = false;
2954
2955 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2956 {
2957 rtx_insn *insn, *next;
2958 bool finish = false;
2959
2960 rtl_profile_for_bb (bb);
2961 for (insn = BB_HEAD (bb); !finish ; insn = next)
2962 {
2963 /* Can't use `next_real_insn' because that might go across
2964 CODE_LABELS and short-out basic blocks. */
2965 next = NEXT_INSN (insn);
2966 finish = (insn == BB_END (bb));
2967 if (INSN_P (insn))
2968 {
2969 rtx set = single_set (insn);
2970
2971 /* Don't split no-op move insns. These should silently
2972 disappear later in final. Splitting such insns would
2973 break the code that handles LIBCALL blocks. */
2974 if (set && set_noop_p (set))
2975 {
2976 /* Nops get in the way while scheduling, so delete them
2977 now if register allocation has already been done. It
2978 is too risky to try to do this before register
2979 allocation, and there are unlikely to be very many
2980 nops then anyways. */
2981 if (reload_completed)
2982 delete_insn_and_edges (insn);
2983 }
2984 else
2985 {
2986 if (split_insn (insn))
2987 {
2988 bitmap_set_bit (blocks, bb->index);
2989 changed = true;
2990 }
2991 }
2992 }
2993 }
2994 }
2995
2996 default_rtl_profile ();
2997 if (changed)
2998 find_many_sub_basic_blocks (blocks);
2999
3000 #ifdef ENABLE_CHECKING
3001 verify_flow_info ();
3002 #endif
3003
3004 sbitmap_free (blocks);
3005 }
3006
3007 /* Same as split_all_insns, but do not expect CFG to be available.
3008 Used by machine dependent reorg passes. */
3009
3010 unsigned int
3011 split_all_insns_noflow (void)
3012 {
3013 rtx_insn *next, *insn;
3014
3015 for (insn = get_insns (); insn; insn = next)
3016 {
3017 next = NEXT_INSN (insn);
3018 if (INSN_P (insn))
3019 {
3020 /* Don't split no-op move insns. These should silently
3021 disappear later in final. Splitting such insns would
3022 break the code that handles LIBCALL blocks. */
3023 rtx set = single_set (insn);
3024 if (set && set_noop_p (set))
3025 {
3026 /* Nops get in the way while scheduling, so delete them
3027 now if register allocation has already been done. It
3028 is too risky to try to do this before register
3029 allocation, and there are unlikely to be very many
3030 nops then anyways.
3031
3032 ??? Should we use delete_insn when the CFG isn't valid? */
3033 if (reload_completed)
3034 delete_insn_and_edges (insn);
3035 }
3036 else
3037 split_insn (insn);
3038 }
3039 }
3040 return 0;
3041 }
3042 \f
3043 #ifdef HAVE_peephole2
3044 struct peep2_insn_data
3045 {
3046 rtx_insn *insn;
3047 regset live_before;
3048 };
3049
3050 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
3051 static int peep2_current;
3052
3053 static bool peep2_do_rebuild_jump_labels;
3054 static bool peep2_do_cleanup_cfg;
3055
3056 /* The number of instructions available to match a peep2. */
3057 int peep2_current_count;
3058
3059 /* A marker indicating the last insn of the block. The live_before regset
3060 for this element is correct, indicating DF_LIVE_OUT for the block. */
3061 #define PEEP2_EOB invalid_insn_rtx
3062
3063 /* Wrap N to fit into the peep2_insn_data buffer. */
3064
3065 static int
3066 peep2_buf_position (int n)
3067 {
3068 if (n >= MAX_INSNS_PER_PEEP2 + 1)
3069 n -= MAX_INSNS_PER_PEEP2 + 1;
3070 return n;
3071 }
3072
3073 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
3074 does not exist. Used by the recognizer to find the next insn to match
3075 in a multi-insn pattern. */
3076
3077 rtx_insn *
3078 peep2_next_insn (int n)
3079 {
3080 gcc_assert (n <= peep2_current_count);
3081
3082 n = peep2_buf_position (peep2_current + n);
3083
3084 return peep2_insn_data[n].insn;
3085 }
3086
3087 /* Return true if REGNO is dead before the Nth non-note insn
3088 after `current'. */
3089
3090 int
3091 peep2_regno_dead_p (int ofs, int regno)
3092 {
3093 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3094
3095 ofs = peep2_buf_position (peep2_current + ofs);
3096
3097 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3098
3099 return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
3100 }
3101
3102 /* Similarly for a REG. */
3103
3104 int
3105 peep2_reg_dead_p (int ofs, rtx reg)
3106 {
3107 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
3108
3109 ofs = peep2_buf_position (peep2_current + ofs);
3110
3111 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3112
3113 unsigned int end_regno = END_REGNO (reg);
3114 for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
3115 if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno))
3116 return 0;
3117 return 1;
3118 }
3119
3120 /* Regno offset to be used in the register search. */
3121 static int search_ofs;
3122
3123 /* Try to find a hard register of mode MODE, matching the register class in
3124 CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
3125 remains available until the end of LAST_INSN. LAST_INSN may be NULL_RTX,
3126 in which case the only condition is that the register must be available
3127 before CURRENT_INSN.
3128 Registers that already have bits set in REG_SET will not be considered.
3129
3130 If an appropriate register is available, it will be returned and the
3131 corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
3132 returned. */
3133
3134 rtx
3135 peep2_find_free_register (int from, int to, const char *class_str,
3136 machine_mode mode, HARD_REG_SET *reg_set)
3137 {
3138 enum reg_class cl;
3139 HARD_REG_SET live;
3140 df_ref def;
3141 int i;
3142
3143 gcc_assert (from < MAX_INSNS_PER_PEEP2 + 1);
3144 gcc_assert (to < MAX_INSNS_PER_PEEP2 + 1);
3145
3146 from = peep2_buf_position (peep2_current + from);
3147 to = peep2_buf_position (peep2_current + to);
3148
3149 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3150 REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
3151
3152 while (from != to)
3153 {
3154 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3155
3156 /* Don't use registers set or clobbered by the insn. */
3157 FOR_EACH_INSN_DEF (def, peep2_insn_data[from].insn)
3158 SET_HARD_REG_BIT (live, DF_REF_REGNO (def));
3159
3160 from = peep2_buf_position (from + 1);
3161 }
3162
3163 cl = reg_class_for_constraint (lookup_constraint (class_str));
3164
3165 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3166 {
3167 int raw_regno, regno, success, j;
3168
3169 /* Distribute the free registers as much as possible. */
3170 raw_regno = search_ofs + i;
3171 if (raw_regno >= FIRST_PSEUDO_REGISTER)
3172 raw_regno -= FIRST_PSEUDO_REGISTER;
3173 #ifdef REG_ALLOC_ORDER
3174 regno = reg_alloc_order[raw_regno];
3175 #else
3176 regno = raw_regno;
3177 #endif
3178
3179 /* Can it support the mode we need? */
3180 if (! HARD_REGNO_MODE_OK (regno, mode))
3181 continue;
3182
3183 success = 1;
3184 for (j = 0; success && j < hard_regno_nregs[regno][mode]; j++)
3185 {
3186 /* Don't allocate fixed registers. */
3187 if (fixed_regs[regno + j])
3188 {
3189 success = 0;
3190 break;
3191 }
3192 /* Don't allocate global registers. */
3193 if (global_regs[regno + j])
3194 {
3195 success = 0;
3196 break;
3197 }
3198 /* Make sure the register is of the right class. */
3199 if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno + j))
3200 {
3201 success = 0;
3202 break;
3203 }
3204 /* And that we don't create an extra save/restore. */
3205 if (! call_used_regs[regno + j] && ! df_regs_ever_live_p (regno + j))
3206 {
3207 success = 0;
3208 break;
3209 }
3210
3211 if (! targetm.hard_regno_scratch_ok (regno + j))
3212 {
3213 success = 0;
3214 break;
3215 }
3216
3217 /* And we don't clobber traceback for noreturn functions. */
3218 if ((regno + j == FRAME_POINTER_REGNUM
3219 || regno + j == HARD_FRAME_POINTER_REGNUM)
3220 && (! reload_completed || frame_pointer_needed))
3221 {
3222 success = 0;
3223 break;
3224 }
3225
3226 if (TEST_HARD_REG_BIT (*reg_set, regno + j)
3227 || TEST_HARD_REG_BIT (live, regno + j))
3228 {
3229 success = 0;
3230 break;
3231 }
3232 }
3233
3234 if (success)
3235 {
3236 add_to_hard_reg_set (reg_set, mode, regno);
3237
3238 /* Start the next search with the next register. */
3239 if (++raw_regno >= FIRST_PSEUDO_REGISTER)
3240 raw_regno = 0;
3241 search_ofs = raw_regno;
3242
3243 return gen_rtx_REG (mode, regno);
3244 }
3245 }
3246
3247 search_ofs = 0;
3248 return NULL_RTX;
3249 }
3250
3251 /* Forget all currently tracked instructions, only remember current
3252 LIVE regset. */
3253
3254 static void
3255 peep2_reinit_state (regset live)
3256 {
3257 int i;
3258
3259 /* Indicate that all slots except the last holds invalid data. */
3260 for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3261 peep2_insn_data[i].insn = NULL;
3262 peep2_current_count = 0;
3263
3264 /* Indicate that the last slot contains live_after data. */
3265 peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3266 peep2_current = MAX_INSNS_PER_PEEP2;
3267
3268 COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3269 }
3270
3271 /* While scanning basic block BB, we found a match of length MATCH_LEN,
3272 starting at INSN. Perform the replacement, removing the old insns and
3273 replacing them with ATTEMPT. Returns the last insn emitted, or NULL
3274 if the replacement is rejected. */
3275
3276 static rtx_insn *
3277 peep2_attempt (basic_block bb, rtx_insn *insn, int match_len, rtx_insn *attempt)
3278 {
3279 int i;
3280 rtx_insn *last, *before_try, *x;
3281 rtx eh_note, as_note;
3282 rtx_insn *old_insn;
3283 rtx_insn *new_insn;
3284 bool was_call = false;
3285
3286 /* If we are splitting an RTX_FRAME_RELATED_P insn, do not allow it to
3287 match more than one insn, or to be split into more than one insn. */
3288 old_insn = peep2_insn_data[peep2_current].insn;
3289 if (RTX_FRAME_RELATED_P (old_insn))
3290 {
3291 bool any_note = false;
3292 rtx note;
3293
3294 if (match_len != 0)
3295 return NULL;
3296
3297 /* Look for one "active" insn. I.e. ignore any "clobber" insns that
3298 may be in the stream for the purpose of register allocation. */
3299 if (active_insn_p (attempt))
3300 new_insn = attempt;
3301 else
3302 new_insn = next_active_insn (attempt);
3303 if (next_active_insn (new_insn))
3304 return NULL;
3305
3306 /* We have a 1-1 replacement. Copy over any frame-related info. */
3307 RTX_FRAME_RELATED_P (new_insn) = 1;
3308
3309 /* Allow the backend to fill in a note during the split. */
3310 for (note = REG_NOTES (new_insn); note ; note = XEXP (note, 1))
3311 switch (REG_NOTE_KIND (note))
3312 {
3313 case REG_FRAME_RELATED_EXPR:
3314 case REG_CFA_DEF_CFA:
3315 case REG_CFA_ADJUST_CFA:
3316 case REG_CFA_OFFSET:
3317 case REG_CFA_REGISTER:
3318 case REG_CFA_EXPRESSION:
3319 case REG_CFA_RESTORE:
3320 case REG_CFA_SET_VDRAP:
3321 any_note = true;
3322 break;
3323 default:
3324 break;
3325 }
3326
3327 /* If the backend didn't supply a note, copy one over. */
3328 if (!any_note)
3329 for (note = REG_NOTES (old_insn); note ; note = XEXP (note, 1))
3330 switch (REG_NOTE_KIND (note))
3331 {
3332 case REG_FRAME_RELATED_EXPR:
3333 case REG_CFA_DEF_CFA:
3334 case REG_CFA_ADJUST_CFA:
3335 case REG_CFA_OFFSET:
3336 case REG_CFA_REGISTER:
3337 case REG_CFA_EXPRESSION:
3338 case REG_CFA_RESTORE:
3339 case REG_CFA_SET_VDRAP:
3340 add_reg_note (new_insn, REG_NOTE_KIND (note), XEXP (note, 0));
3341 any_note = true;
3342 break;
3343 default:
3344 break;
3345 }
3346
3347 /* If there still isn't a note, make sure the unwind info sees the
3348 same expression as before the split. */
3349 if (!any_note)
3350 {
3351 rtx old_set, new_set;
3352
3353 /* The old insn had better have been simple, or annotated. */
3354 old_set = single_set (old_insn);
3355 gcc_assert (old_set != NULL);
3356
3357 new_set = single_set (new_insn);
3358 if (!new_set || !rtx_equal_p (new_set, old_set))
3359 add_reg_note (new_insn, REG_FRAME_RELATED_EXPR, old_set);
3360 }
3361
3362 /* Copy prologue/epilogue status. This is required in order to keep
3363 proper placement of EPILOGUE_BEG and the DW_CFA_remember_state. */
3364 maybe_copy_prologue_epilogue_insn (old_insn, new_insn);
3365 }
3366
3367 /* If we are splitting a CALL_INSN, look for the CALL_INSN
3368 in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3369 cfg-related call notes. */
3370 for (i = 0; i <= match_len; ++i)
3371 {
3372 int j;
3373 rtx note;
3374
3375 j = peep2_buf_position (peep2_current + i);
3376 old_insn = peep2_insn_data[j].insn;
3377 if (!CALL_P (old_insn))
3378 continue;
3379 was_call = true;
3380
3381 new_insn = attempt;
3382 while (new_insn != NULL_RTX)
3383 {
3384 if (CALL_P (new_insn))
3385 break;
3386 new_insn = NEXT_INSN (new_insn);
3387 }
3388
3389 gcc_assert (new_insn != NULL_RTX);
3390
3391 CALL_INSN_FUNCTION_USAGE (new_insn)
3392 = CALL_INSN_FUNCTION_USAGE (old_insn);
3393 SIBLING_CALL_P (new_insn) = SIBLING_CALL_P (old_insn);
3394
3395 for (note = REG_NOTES (old_insn);
3396 note;
3397 note = XEXP (note, 1))
3398 switch (REG_NOTE_KIND (note))
3399 {
3400 case REG_NORETURN:
3401 case REG_SETJMP:
3402 case REG_TM:
3403 add_reg_note (new_insn, REG_NOTE_KIND (note),
3404 XEXP (note, 0));
3405 break;
3406 default:
3407 /* Discard all other reg notes. */
3408 break;
3409 }
3410
3411 /* Croak if there is another call in the sequence. */
3412 while (++i <= match_len)
3413 {
3414 j = peep2_buf_position (peep2_current + i);
3415 old_insn = peep2_insn_data[j].insn;
3416 gcc_assert (!CALL_P (old_insn));
3417 }
3418 break;
3419 }
3420
3421 /* If we matched any instruction that had a REG_ARGS_SIZE, then
3422 move those notes over to the new sequence. */
3423 as_note = NULL;
3424 for (i = match_len; i >= 0; --i)
3425 {
3426 int j = peep2_buf_position (peep2_current + i);
3427 old_insn = peep2_insn_data[j].insn;
3428
3429 as_note = find_reg_note (old_insn, REG_ARGS_SIZE, NULL);
3430 if (as_note)
3431 break;
3432 }
3433
3434 i = peep2_buf_position (peep2_current + match_len);
3435 eh_note = find_reg_note (peep2_insn_data[i].insn, REG_EH_REGION, NULL_RTX);
3436
3437 /* Replace the old sequence with the new. */
3438 rtx_insn *peepinsn = peep2_insn_data[i].insn;
3439 last = emit_insn_after_setloc (attempt,
3440 peep2_insn_data[i].insn,
3441 INSN_LOCATION (peepinsn));
3442 before_try = PREV_INSN (insn);
3443 delete_insn_chain (insn, peep2_insn_data[i].insn, false);
3444
3445 /* Re-insert the EH_REGION notes. */
3446 if (eh_note || (was_call && nonlocal_goto_handler_labels))
3447 {
3448 edge eh_edge;
3449 edge_iterator ei;
3450
3451 FOR_EACH_EDGE (eh_edge, ei, bb->succs)
3452 if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
3453 break;
3454
3455 if (eh_note)
3456 copy_reg_eh_region_note_backward (eh_note, last, before_try);
3457
3458 if (eh_edge)
3459 for (x = last; x != before_try; x = PREV_INSN (x))
3460 if (x != BB_END (bb)
3461 && (can_throw_internal (x)
3462 || can_nonlocal_goto (x)))
3463 {
3464 edge nfte, nehe;
3465 int flags;
3466
3467 nfte = split_block (bb, x);
3468 flags = (eh_edge->flags
3469 & (EDGE_EH | EDGE_ABNORMAL));
3470 if (CALL_P (x))
3471 flags |= EDGE_ABNORMAL_CALL;
3472 nehe = make_edge (nfte->src, eh_edge->dest,
3473 flags);
3474
3475 nehe->probability = eh_edge->probability;
3476 nfte->probability
3477 = REG_BR_PROB_BASE - nehe->probability;
3478
3479 peep2_do_cleanup_cfg |= purge_dead_edges (nfte->dest);
3480 bb = nfte->src;
3481 eh_edge = nehe;
3482 }
3483
3484 /* Converting possibly trapping insn to non-trapping is
3485 possible. Zap dummy outgoing edges. */
3486 peep2_do_cleanup_cfg |= purge_dead_edges (bb);
3487 }
3488
3489 /* Re-insert the ARGS_SIZE notes. */
3490 if (as_note)
3491 fixup_args_size_notes (before_try, last, INTVAL (XEXP (as_note, 0)));
3492
3493 /* If we generated a jump instruction, it won't have
3494 JUMP_LABEL set. Recompute after we're done. */
3495 for (x = last; x != before_try; x = PREV_INSN (x))
3496 if (JUMP_P (x))
3497 {
3498 peep2_do_rebuild_jump_labels = true;
3499 break;
3500 }
3501
3502 return last;
3503 }
3504
3505 /* After performing a replacement in basic block BB, fix up the life
3506 information in our buffer. LAST is the last of the insns that we
3507 emitted as a replacement. PREV is the insn before the start of
3508 the replacement. MATCH_LEN is the number of instructions that were
3509 matched, and which now need to be replaced in the buffer. */
3510
3511 static void
3512 peep2_update_life (basic_block bb, int match_len, rtx_insn *last,
3513 rtx_insn *prev)
3514 {
3515 int i = peep2_buf_position (peep2_current + match_len + 1);
3516 rtx_insn *x;
3517 regset_head live;
3518
3519 INIT_REG_SET (&live);
3520 COPY_REG_SET (&live, peep2_insn_data[i].live_before);
3521
3522 gcc_assert (peep2_current_count >= match_len + 1);
3523 peep2_current_count -= match_len + 1;
3524
3525 x = last;
3526 do
3527 {
3528 if (INSN_P (x))
3529 {
3530 df_insn_rescan (x);
3531 if (peep2_current_count < MAX_INSNS_PER_PEEP2)
3532 {
3533 peep2_current_count++;
3534 if (--i < 0)
3535 i = MAX_INSNS_PER_PEEP2;
3536 peep2_insn_data[i].insn = x;
3537 df_simulate_one_insn_backwards (bb, x, &live);
3538 COPY_REG_SET (peep2_insn_data[i].live_before, &live);
3539 }
3540 }
3541 x = PREV_INSN (x);
3542 }
3543 while (x != prev);
3544 CLEAR_REG_SET (&live);
3545
3546 peep2_current = i;
3547 }
3548
3549 /* Add INSN, which is in BB, at the end of the peep2 insn buffer if possible.
3550 Return true if we added it, false otherwise. The caller will try to match
3551 peepholes against the buffer if we return false; otherwise it will try to
3552 add more instructions to the buffer. */
3553
3554 static bool
3555 peep2_fill_buffer (basic_block bb, rtx_insn *insn, regset live)
3556 {
3557 int pos;
3558
3559 /* Once we have filled the maximum number of insns the buffer can hold,
3560 allow the caller to match the insns against peepholes. We wait until
3561 the buffer is full in case the target has similar peepholes of different
3562 length; we always want to match the longest if possible. */
3563 if (peep2_current_count == MAX_INSNS_PER_PEEP2)
3564 return false;
3565
3566 /* If an insn has RTX_FRAME_RELATED_P set, do not allow it to be matched with
3567 any other pattern, lest it change the semantics of the frame info. */
3568 if (RTX_FRAME_RELATED_P (insn))
3569 {
3570 /* Let the buffer drain first. */
3571 if (peep2_current_count > 0)
3572 return false;
3573 /* Now the insn will be the only thing in the buffer. */
3574 }
3575
3576 pos = peep2_buf_position (peep2_current + peep2_current_count);
3577 peep2_insn_data[pos].insn = insn;
3578 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3579 peep2_current_count++;
3580
3581 df_simulate_one_insn_forwards (bb, insn, live);
3582 return true;
3583 }
3584
3585 /* Perform the peephole2 optimization pass. */
3586
3587 static void
3588 peephole2_optimize (void)
3589 {
3590 rtx_insn *insn;
3591 bitmap live;
3592 int i;
3593 basic_block bb;
3594
3595 peep2_do_cleanup_cfg = false;
3596 peep2_do_rebuild_jump_labels = false;
3597
3598 df_set_flags (DF_LR_RUN_DCE);
3599 df_note_add_problem ();
3600 df_analyze ();
3601
3602 /* Initialize the regsets we're going to use. */
3603 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3604 peep2_insn_data[i].live_before = BITMAP_ALLOC (&reg_obstack);
3605 search_ofs = 0;
3606 live = BITMAP_ALLOC (&reg_obstack);
3607
3608 FOR_EACH_BB_REVERSE_FN (bb, cfun)
3609 {
3610 bool past_end = false;
3611 int pos;
3612
3613 rtl_profile_for_bb (bb);
3614
3615 /* Start up propagation. */
3616 bitmap_copy (live, DF_LR_IN (bb));
3617 df_simulate_initialize_forwards (bb, live);
3618 peep2_reinit_state (live);
3619
3620 insn = BB_HEAD (bb);
3621 for (;;)
3622 {
3623 rtx_insn *attempt, *head;
3624 int match_len;
3625
3626 if (!past_end && !NONDEBUG_INSN_P (insn))
3627 {
3628 next_insn:
3629 insn = NEXT_INSN (insn);
3630 if (insn == NEXT_INSN (BB_END (bb)))
3631 past_end = true;
3632 continue;
3633 }
3634 if (!past_end && peep2_fill_buffer (bb, insn, live))
3635 goto next_insn;
3636
3637 /* If we did not fill an empty buffer, it signals the end of the
3638 block. */
3639 if (peep2_current_count == 0)
3640 break;
3641
3642 /* The buffer filled to the current maximum, so try to match. */
3643
3644 pos = peep2_buf_position (peep2_current + peep2_current_count);
3645 peep2_insn_data[pos].insn = PEEP2_EOB;
3646 COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3647
3648 /* Match the peephole. */
3649 head = peep2_insn_data[peep2_current].insn;
3650 attempt = peephole2_insns (PATTERN (head), head, &match_len);
3651 if (attempt != NULL)
3652 {
3653 rtx_insn *last = peep2_attempt (bb, head, match_len, attempt);
3654 if (last)
3655 {
3656 peep2_update_life (bb, match_len, last, PREV_INSN (attempt));
3657 continue;
3658 }
3659 }
3660
3661 /* No match: advance the buffer by one insn. */
3662 peep2_current = peep2_buf_position (peep2_current + 1);
3663 peep2_current_count--;
3664 }
3665 }
3666
3667 default_rtl_profile ();
3668 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3669 BITMAP_FREE (peep2_insn_data[i].live_before);
3670 BITMAP_FREE (live);
3671 if (peep2_do_rebuild_jump_labels)
3672 rebuild_jump_labels (get_insns ());
3673 if (peep2_do_cleanup_cfg)
3674 cleanup_cfg (CLEANUP_CFG_CHANGED);
3675 }
3676 #endif /* HAVE_peephole2 */
3677
3678 /* Common predicates for use with define_bypass. */
3679
3680 /* True if the dependency between OUT_INSN and IN_INSN is on the store
3681 data not the address operand(s) of the store. IN_INSN and OUT_INSN
3682 must be either a single_set or a PARALLEL with SETs inside. */
3683
3684 int
3685 store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3686 {
3687 rtx out_set, in_set;
3688 rtx out_pat, in_pat;
3689 rtx out_exp, in_exp;
3690 int i, j;
3691
3692 in_set = single_set (in_insn);
3693 if (in_set)
3694 {
3695 if (!MEM_P (SET_DEST (in_set)))
3696 return false;
3697
3698 out_set = single_set (out_insn);
3699 if (out_set)
3700 {
3701 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
3702 return false;
3703 }
3704 else
3705 {
3706 out_pat = PATTERN (out_insn);
3707
3708 if (GET_CODE (out_pat) != PARALLEL)
3709 return false;
3710
3711 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3712 {
3713 out_exp = XVECEXP (out_pat, 0, i);
3714
3715 if (GET_CODE (out_exp) == CLOBBER)
3716 continue;
3717
3718 gcc_assert (GET_CODE (out_exp) == SET);
3719
3720 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_set)))
3721 return false;
3722 }
3723 }
3724 }
3725 else
3726 {
3727 in_pat = PATTERN (in_insn);
3728 gcc_assert (GET_CODE (in_pat) == PARALLEL);
3729
3730 for (i = 0; i < XVECLEN (in_pat, 0); i++)
3731 {
3732 in_exp = XVECEXP (in_pat, 0, i);
3733
3734 if (GET_CODE (in_exp) == CLOBBER)
3735 continue;
3736
3737 gcc_assert (GET_CODE (in_exp) == SET);
3738
3739 if (!MEM_P (SET_DEST (in_exp)))
3740 return false;
3741
3742 out_set = single_set (out_insn);
3743 if (out_set)
3744 {
3745 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_exp)))
3746 return false;
3747 }
3748 else
3749 {
3750 out_pat = PATTERN (out_insn);
3751 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3752
3753 for (j = 0; j < XVECLEN (out_pat, 0); j++)
3754 {
3755 out_exp = XVECEXP (out_pat, 0, j);
3756
3757 if (GET_CODE (out_exp) == CLOBBER)
3758 continue;
3759
3760 gcc_assert (GET_CODE (out_exp) == SET);
3761
3762 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_exp)))
3763 return false;
3764 }
3765 }
3766 }
3767 }
3768
3769 return true;
3770 }
3771
3772 /* True if the dependency between OUT_INSN and IN_INSN is in the IF_THEN_ELSE
3773 condition, and not the THEN or ELSE branch. OUT_INSN may be either a single
3774 or multiple set; IN_INSN should be single_set for truth, but for convenience
3775 of insn categorization may be any JUMP or CALL insn. */
3776
3777 int
3778 if_test_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
3779 {
3780 rtx out_set, in_set;
3781
3782 in_set = single_set (in_insn);
3783 if (! in_set)
3784 {
3785 gcc_assert (JUMP_P (in_insn) || CALL_P (in_insn));
3786 return false;
3787 }
3788
3789 if (GET_CODE (SET_SRC (in_set)) != IF_THEN_ELSE)
3790 return false;
3791 in_set = SET_SRC (in_set);
3792
3793 out_set = single_set (out_insn);
3794 if (out_set)
3795 {
3796 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3797 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3798 return false;
3799 }
3800 else
3801 {
3802 rtx out_pat;
3803 int i;
3804
3805 out_pat = PATTERN (out_insn);
3806 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3807
3808 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3809 {
3810 rtx exp = XVECEXP (out_pat, 0, i);
3811
3812 if (GET_CODE (exp) == CLOBBER)
3813 continue;
3814
3815 gcc_assert (GET_CODE (exp) == SET);
3816
3817 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3818 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3819 return false;
3820 }
3821 }
3822
3823 return true;
3824 }
3825 \f
3826 static unsigned int
3827 rest_of_handle_peephole2 (void)
3828 {
3829 #ifdef HAVE_peephole2
3830 peephole2_optimize ();
3831 #endif
3832 return 0;
3833 }
3834
3835 namespace {
3836
3837 const pass_data pass_data_peephole2 =
3838 {
3839 RTL_PASS, /* type */
3840 "peephole2", /* name */
3841 OPTGROUP_NONE, /* optinfo_flags */
3842 TV_PEEPHOLE2, /* tv_id */
3843 0, /* properties_required */
3844 0, /* properties_provided */
3845 0, /* properties_destroyed */
3846 0, /* todo_flags_start */
3847 TODO_df_finish, /* todo_flags_finish */
3848 };
3849
3850 class pass_peephole2 : public rtl_opt_pass
3851 {
3852 public:
3853 pass_peephole2 (gcc::context *ctxt)
3854 : rtl_opt_pass (pass_data_peephole2, ctxt)
3855 {}
3856
3857 /* opt_pass methods: */
3858 /* The epiphany backend creates a second instance of this pass, so we need
3859 a clone method. */
3860 opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
3861 virtual bool gate (function *) { return (optimize > 0 && flag_peephole2); }
3862 virtual unsigned int execute (function *)
3863 {
3864 return rest_of_handle_peephole2 ();
3865 }
3866
3867 }; // class pass_peephole2
3868
3869 } // anon namespace
3870
3871 rtl_opt_pass *
3872 make_pass_peephole2 (gcc::context *ctxt)
3873 {
3874 return new pass_peephole2 (ctxt);
3875 }
3876
3877 namespace {
3878
3879 const pass_data pass_data_split_all_insns =
3880 {
3881 RTL_PASS, /* type */
3882 "split1", /* name */
3883 OPTGROUP_NONE, /* optinfo_flags */
3884 TV_NONE, /* tv_id */
3885 0, /* properties_required */
3886 0, /* properties_provided */
3887 0, /* properties_destroyed */
3888 0, /* todo_flags_start */
3889 0, /* todo_flags_finish */
3890 };
3891
3892 class pass_split_all_insns : public rtl_opt_pass
3893 {
3894 public:
3895 pass_split_all_insns (gcc::context *ctxt)
3896 : rtl_opt_pass (pass_data_split_all_insns, ctxt)
3897 {}
3898
3899 /* opt_pass methods: */
3900 /* The epiphany backend creates a second instance of this pass, so
3901 we need a clone method. */
3902 opt_pass * clone () { return new pass_split_all_insns (m_ctxt); }
3903 virtual unsigned int execute (function *)
3904 {
3905 split_all_insns ();
3906 return 0;
3907 }
3908
3909 }; // class pass_split_all_insns
3910
3911 } // anon namespace
3912
3913 rtl_opt_pass *
3914 make_pass_split_all_insns (gcc::context *ctxt)
3915 {
3916 return new pass_split_all_insns (ctxt);
3917 }
3918
3919 static unsigned int
3920 rest_of_handle_split_after_reload (void)
3921 {
3922 /* If optimizing, then go ahead and split insns now. */
3923 #ifndef STACK_REGS
3924 if (optimize > 0)
3925 #endif
3926 split_all_insns ();
3927 return 0;
3928 }
3929
3930 namespace {
3931
3932 const pass_data pass_data_split_after_reload =
3933 {
3934 RTL_PASS, /* type */
3935 "split2", /* name */
3936 OPTGROUP_NONE, /* optinfo_flags */
3937 TV_NONE, /* tv_id */
3938 0, /* properties_required */
3939 0, /* properties_provided */
3940 0, /* properties_destroyed */
3941 0, /* todo_flags_start */
3942 0, /* todo_flags_finish */
3943 };
3944
3945 class pass_split_after_reload : public rtl_opt_pass
3946 {
3947 public:
3948 pass_split_after_reload (gcc::context *ctxt)
3949 : rtl_opt_pass (pass_data_split_after_reload, ctxt)
3950 {}
3951
3952 /* opt_pass methods: */
3953 virtual unsigned int execute (function *)
3954 {
3955 return rest_of_handle_split_after_reload ();
3956 }
3957
3958 }; // class pass_split_after_reload
3959
3960 } // anon namespace
3961
3962 rtl_opt_pass *
3963 make_pass_split_after_reload (gcc::context *ctxt)
3964 {
3965 return new pass_split_after_reload (ctxt);
3966 }
3967
3968 namespace {
3969
3970 const pass_data pass_data_split_before_regstack =
3971 {
3972 RTL_PASS, /* type */
3973 "split3", /* name */
3974 OPTGROUP_NONE, /* optinfo_flags */
3975 TV_NONE, /* tv_id */
3976 0, /* properties_required */
3977 0, /* properties_provided */
3978 0, /* properties_destroyed */
3979 0, /* todo_flags_start */
3980 0, /* todo_flags_finish */
3981 };
3982
3983 class pass_split_before_regstack : public rtl_opt_pass
3984 {
3985 public:
3986 pass_split_before_regstack (gcc::context *ctxt)
3987 : rtl_opt_pass (pass_data_split_before_regstack, ctxt)
3988 {}
3989
3990 /* opt_pass methods: */
3991 virtual bool gate (function *);
3992 virtual unsigned int execute (function *)
3993 {
3994 split_all_insns ();
3995 return 0;
3996 }
3997
3998 }; // class pass_split_before_regstack
3999
4000 bool
4001 pass_split_before_regstack::gate (function *)
4002 {
4003 #if HAVE_ATTR_length && defined (STACK_REGS)
4004 /* If flow2 creates new instructions which need splitting
4005 and scheduling after reload is not done, they might not be
4006 split until final which doesn't allow splitting
4007 if HAVE_ATTR_length. */
4008 # ifdef INSN_SCHEDULING
4009 return (optimize && !flag_schedule_insns_after_reload);
4010 # else
4011 return (optimize);
4012 # endif
4013 #else
4014 return 0;
4015 #endif
4016 }
4017
4018 } // anon namespace
4019
4020 rtl_opt_pass *
4021 make_pass_split_before_regstack (gcc::context *ctxt)
4022 {
4023 return new pass_split_before_regstack (ctxt);
4024 }
4025
4026 static unsigned int
4027 rest_of_handle_split_before_sched2 (void)
4028 {
4029 #ifdef INSN_SCHEDULING
4030 split_all_insns ();
4031 #endif
4032 return 0;
4033 }
4034
4035 namespace {
4036
4037 const pass_data pass_data_split_before_sched2 =
4038 {
4039 RTL_PASS, /* type */
4040 "split4", /* name */
4041 OPTGROUP_NONE, /* optinfo_flags */
4042 TV_NONE, /* tv_id */
4043 0, /* properties_required */
4044 0, /* properties_provided */
4045 0, /* properties_destroyed */
4046 0, /* todo_flags_start */
4047 0, /* todo_flags_finish */
4048 };
4049
4050 class pass_split_before_sched2 : public rtl_opt_pass
4051 {
4052 public:
4053 pass_split_before_sched2 (gcc::context *ctxt)
4054 : rtl_opt_pass (pass_data_split_before_sched2, ctxt)
4055 {}
4056
4057 /* opt_pass methods: */
4058 virtual bool gate (function *)
4059 {
4060 #ifdef INSN_SCHEDULING
4061 return optimize > 0 && flag_schedule_insns_after_reload;
4062 #else
4063 return false;
4064 #endif
4065 }
4066
4067 virtual unsigned int execute (function *)
4068 {
4069 return rest_of_handle_split_before_sched2 ();
4070 }
4071
4072 }; // class pass_split_before_sched2
4073
4074 } // anon namespace
4075
4076 rtl_opt_pass *
4077 make_pass_split_before_sched2 (gcc::context *ctxt)
4078 {
4079 return new pass_split_before_sched2 (ctxt);
4080 }
4081
4082 namespace {
4083
4084 const pass_data pass_data_split_for_shorten_branches =
4085 {
4086 RTL_PASS, /* type */
4087 "split5", /* name */
4088 OPTGROUP_NONE, /* optinfo_flags */
4089 TV_NONE, /* tv_id */
4090 0, /* properties_required */
4091 0, /* properties_provided */
4092 0, /* properties_destroyed */
4093 0, /* todo_flags_start */
4094 0, /* todo_flags_finish */
4095 };
4096
4097 class pass_split_for_shorten_branches : public rtl_opt_pass
4098 {
4099 public:
4100 pass_split_for_shorten_branches (gcc::context *ctxt)
4101 : rtl_opt_pass (pass_data_split_for_shorten_branches, ctxt)
4102 {}
4103
4104 /* opt_pass methods: */
4105 virtual bool gate (function *)
4106 {
4107 /* The placement of the splitting that we do for shorten_branches
4108 depends on whether regstack is used by the target or not. */
4109 #if HAVE_ATTR_length && !defined (STACK_REGS)
4110 return true;
4111 #else
4112 return false;
4113 #endif
4114 }
4115
4116 virtual unsigned int execute (function *)
4117 {
4118 return split_all_insns_noflow ();
4119 }
4120
4121 }; // class pass_split_for_shorten_branches
4122
4123 } // anon namespace
4124
4125 rtl_opt_pass *
4126 make_pass_split_for_shorten_branches (gcc::context *ctxt)
4127 {
4128 return new pass_split_for_shorten_branches (ctxt);
4129 }
4130
4131 /* (Re)initialize the target information after a change in target. */
4132
4133 void
4134 recog_init ()
4135 {
4136 /* The information is zero-initialized, so we don't need to do anything
4137 first time round. */
4138 if (!this_target_recog->x_initialized)
4139 {
4140 this_target_recog->x_initialized = true;
4141 return;
4142 }
4143 memset (this_target_recog->x_bool_attr_masks, 0,
4144 sizeof (this_target_recog->x_bool_attr_masks));
4145 for (int i = 0; i < LAST_INSN_CODE; ++i)
4146 if (this_target_recog->x_op_alt[i])
4147 {
4148 free (this_target_recog->x_op_alt[i]);
4149 this_target_recog->x_op_alt[i] = 0;
4150 }
4151 }