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