OSDN Git Service

* configure.ac: Correct makeinfo version check.
[pf3gnuchains/gcc-fork.git] / gcc / jump.c
1 /* Optimize jump instructions, for GNU compiler.
2    Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3    1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This is the pathetic reminder of old fame of the jump-optimization pass
23    of the compiler.  Now it contains basically a set of utility functions to
24    operate with jumps.
25
26    Each CODE_LABEL has a count of the times it is used
27    stored in the LABEL_NUSES internal field, and each JUMP_INSN
28    has one label that it refers to stored in the
29    JUMP_LABEL internal field.  With this we can detect labels that
30    become unused because of the deletion of all the jumps that
31    formerly used them.  The JUMP_LABEL info is sometimes looked
32    at by later passes.
33
34    The subroutines redirect_jump and invert_jump are used
35    from other passes as well.  */
36
37 #include "config.h"
38 #include "system.h"
39 #include "coretypes.h"
40 #include "tm.h"
41 #include "rtl.h"
42 #include "tm_p.h"
43 #include "flags.h"
44 #include "hard-reg-set.h"
45 #include "regs.h"
46 #include "insn-config.h"
47 #include "insn-attr.h"
48 #include "recog.h"
49 #include "function.h"
50 #include "expr.h"
51 #include "real.h"
52 #include "except.h"
53 #include "diagnostic.h"
54 #include "toplev.h"
55 #include "reload.h"
56 #include "predict.h"
57 #include "timevar.h"
58 #include "tree-pass.h"
59 #include "target.h"
60
61 /* Optimize jump y; x: ... y: jumpif... x?
62    Don't know if it is worth bothering with.  */
63 /* Optimize two cases of conditional jump to conditional jump?
64    This can never delete any instruction or make anything dead,
65    or even change what is live at any point.
66    So perhaps let combiner do it.  */
67
68 static void init_label_info (rtx);
69 static void mark_all_labels (rtx);
70 static void mark_jump_label_1 (rtx, rtx, bool, bool);
71 static void redirect_exp_1 (rtx *, rtx, rtx, rtx);
72 static int invert_exp_1 (rtx, rtx);
73 static int returnjump_p_1 (rtx *, void *);
74 \f
75 /* This function rebuilds the JUMP_LABEL field and REG_LABEL_TARGET
76    notes in jumping insns and REG_LABEL_OPERAND notes in non-jumping
77    instructions and jumping insns that have labels as operands
78    (e.g. cbranchsi4).  */
79 void
80 rebuild_jump_labels (rtx f)
81 {
82   rtx insn;
83
84   timevar_push (TV_REBUILD_JUMP);
85   init_label_info (f);
86   mark_all_labels (f);
87
88   /* Keep track of labels used from static data; we don't track them
89      closely enough to delete them here, so make sure their reference
90      count doesn't drop to zero.  */
91
92   for (insn = forced_labels; insn; insn = XEXP (insn, 1))
93     if (LABEL_P (XEXP (insn, 0)))
94       LABEL_NUSES (XEXP (insn, 0))++;
95   timevar_pop (TV_REBUILD_JUMP);
96 }
97 \f
98 /* Some old code expects exactly one BARRIER as the NEXT_INSN of a
99    non-fallthru insn.  This is not generally true, as multiple barriers
100    may have crept in, or the BARRIER may be separated from the last
101    real insn by one or more NOTEs.
102
103    This simple pass moves barriers and removes duplicates so that the
104    old code is happy.
105  */
106 unsigned int
107 cleanup_barriers (void)
108 {
109   rtx insn, next, prev;
110   for (insn = get_insns (); insn; insn = next)
111     {
112       next = NEXT_INSN (insn);
113       if (BARRIER_P (insn))
114         {
115           prev = prev_nonnote_insn (insn);
116           if (BARRIER_P (prev))
117             delete_insn (insn);
118           else if (prev != PREV_INSN (insn))
119             reorder_insns (insn, insn, prev);
120         }
121     }
122   return 0;
123 }
124
125 struct tree_opt_pass pass_cleanup_barriers =
126 {
127   "barriers",                           /* name */
128   NULL,                                 /* gate */
129   cleanup_barriers,                     /* execute */
130   NULL,                                 /* sub */
131   NULL,                                 /* next */
132   0,                                    /* static_pass_number */
133   0,                                    /* tv_id */
134   0,                                    /* properties_required */
135   0,                                    /* properties_provided */
136   0,                                    /* properties_destroyed */
137   0,                                    /* todo_flags_start */
138   TODO_dump_func,                       /* todo_flags_finish */
139   0                                     /* letter */
140 };
141
142 \f
143 /* Initialize LABEL_NUSES and JUMP_LABEL fields, add REG_LABEL_TARGET
144    for remaining targets for JUMP_P.  Delete any REG_LABEL_OPERAND
145    notes whose labels don't occur in the insn any more.  */
146
147 static void
148 init_label_info (rtx f)
149 {
150   rtx insn;
151
152   for (insn = f; insn; insn = NEXT_INSN (insn))
153     {
154       if (LABEL_P (insn))
155         LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
156
157       /* REG_LABEL_TARGET notes (including the JUMP_LABEL field) are
158          sticky and not reset here; that way we won't lose association
159          with a label when e.g. the source for a target register
160          disappears out of reach for targets that may use jump-target
161          registers.  Jump transformations are supposed to transform
162          any REG_LABEL_TARGET notes.  The target label reference in a
163          branch may disappear from the branch (and from the
164          instruction before it) for other reasons, like register
165          allocation.  */
166
167       if (INSN_P (insn))
168         {
169           rtx note, next;
170
171           for (note = REG_NOTES (insn); note; note = next)
172             {
173               next = XEXP (note, 1);
174               if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
175                   && ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
176                 remove_note (insn, note);
177             }
178         }
179     }
180 }
181
182 /* Mark the label each jump jumps to.
183    Combine consecutive labels, and count uses of labels.  */
184
185 static void
186 mark_all_labels (rtx f)
187 {
188   rtx insn;
189   rtx prev_nonjump_insn = NULL;
190
191   for (insn = f; insn; insn = NEXT_INSN (insn))
192     if (INSN_P (insn))
193       {
194         mark_jump_label (PATTERN (insn), insn, 0);
195
196         /* If the previous non-jump insn sets something to a label,
197            something that this jump insn uses, make that label the primary
198            target of this insn if we don't yet have any.  That previous
199            insn must be a single_set and not refer to more than one label.
200            The jump insn must not refer to other labels as jump targets
201            and must be a plain (set (pc) ...), maybe in a parallel, and
202            may refer to the item being set only directly or as one of the
203            arms in an IF_THEN_ELSE.  */
204         if (! INSN_DELETED_P (insn)
205             && JUMP_P (insn)
206             && JUMP_LABEL (insn) == NULL)
207           {
208             rtx label_note = NULL;
209             rtx pc = pc_set (insn);
210             rtx pc_src = pc != NULL ? SET_SRC (pc) : NULL;
211
212             if (prev_nonjump_insn != NULL)
213               label_note
214                 = find_reg_note (prev_nonjump_insn, REG_LABEL_OPERAND, NULL);
215
216             if (label_note != NULL && pc_src != NULL)
217               {
218                 rtx label_set = single_set (prev_nonjump_insn);
219                 rtx label_dest
220                   = label_set != NULL ? SET_DEST (label_set) : NULL;
221
222                 if (label_set != NULL
223                     /* The source must be the direct LABEL_REF, not a
224                        PLUS, UNSPEC, IF_THEN_ELSE etc.  */
225                     && GET_CODE (SET_SRC (label_set)) == LABEL_REF
226                     && (rtx_equal_p (label_dest, pc_src)
227                         || (GET_CODE (pc_src) == IF_THEN_ELSE
228                             && (rtx_equal_p (label_dest, XEXP (pc_src, 1))
229                                 || rtx_equal_p (label_dest,
230                                                 XEXP (pc_src, 2))))))
231                                 
232                   {
233                     /* The CODE_LABEL referred to in the note must be the
234                        CODE_LABEL in the LABEL_REF of the "set".  We can
235                        conveniently use it for the marker function, which
236                        requires a LABEL_REF wrapping.  */
237                     gcc_assert (XEXP (label_note, 0)
238                                 == XEXP (SET_SRC (label_set), 0));
239
240                     mark_jump_label_1 (label_set, insn, false, true);
241                     gcc_assert (JUMP_LABEL (insn)
242                                 == XEXP (SET_SRC (label_set), 0));
243                   }
244               }
245           }
246         else if (! INSN_DELETED_P (insn))
247           prev_nonjump_insn = insn;
248       }
249     else if (LABEL_P (insn))
250       prev_nonjump_insn = NULL;
251
252   /* If we are in cfglayout mode, there may be non-insns between the
253      basic blocks.  If those non-insns represent tablejump data, they
254      contain label references that we must record.  */
255   if (current_ir_type () == IR_RTL_CFGLAYOUT)
256     {
257       basic_block bb;
258       rtx insn;
259       FOR_EACH_BB (bb)
260         {
261           for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
262             if (INSN_P (insn))
263               {
264                 gcc_assert (JUMP_TABLE_DATA_P (insn));
265                 mark_jump_label (PATTERN (insn), insn, 0);
266               }
267
268           for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
269             if (INSN_P (insn))
270               {
271                 gcc_assert (JUMP_TABLE_DATA_P (insn));
272                 mark_jump_label (PATTERN (insn), insn, 0);
273               }
274         }
275     }
276 }
277 \f
278 /* Given a comparison (CODE ARG0 ARG1), inside an insn, INSN, return a code
279    of reversed comparison if it is possible to do so.  Otherwise return UNKNOWN.
280    UNKNOWN may be returned in case we are having CC_MODE compare and we don't
281    know whether it's source is floating point or integer comparison.  Machine
282    description should define REVERSIBLE_CC_MODE and REVERSE_CONDITION macros
283    to help this function avoid overhead in these cases.  */
284 enum rtx_code
285 reversed_comparison_code_parts (enum rtx_code code, const_rtx arg0,
286                                 const_rtx arg1, const_rtx insn)
287 {
288   enum machine_mode mode;
289
290   /* If this is not actually a comparison, we can't reverse it.  */
291   if (GET_RTX_CLASS (code) != RTX_COMPARE
292       && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
293     return UNKNOWN;
294
295   mode = GET_MODE (arg0);
296   if (mode == VOIDmode)
297     mode = GET_MODE (arg1);
298
299   /* First see if machine description supplies us way to reverse the
300      comparison.  Give it priority over everything else to allow
301      machine description to do tricks.  */
302   if (GET_MODE_CLASS (mode) == MODE_CC
303       && REVERSIBLE_CC_MODE (mode))
304     {
305 #ifdef REVERSE_CONDITION
306       return REVERSE_CONDITION (code, mode);
307 #endif
308       return reverse_condition (code);
309     }
310
311   /* Try a few special cases based on the comparison code.  */
312   switch (code)
313     {
314     case GEU:
315     case GTU:
316     case LEU:
317     case LTU:
318     case NE:
319     case EQ:
320       /* It is always safe to reverse EQ and NE, even for the floating
321          point.  Similarly the unsigned comparisons are never used for
322          floating point so we can reverse them in the default way.  */
323       return reverse_condition (code);
324     case ORDERED:
325     case UNORDERED:
326     case LTGT:
327     case UNEQ:
328       /* In case we already see unordered comparison, we can be sure to
329          be dealing with floating point so we don't need any more tests.  */
330       return reverse_condition_maybe_unordered (code);
331     case UNLT:
332     case UNLE:
333     case UNGT:
334     case UNGE:
335       /* We don't have safe way to reverse these yet.  */
336       return UNKNOWN;
337     default:
338       break;
339     }
340
341   if (GET_MODE_CLASS (mode) == MODE_CC || CC0_P (arg0))
342     {
343       const_rtx prev;
344       /* Try to search for the comparison to determine the real mode.
345          This code is expensive, but with sane machine description it
346          will be never used, since REVERSIBLE_CC_MODE will return true
347          in all cases.  */
348       if (! insn)
349         return UNKNOWN;
350
351       /* These CONST_CAST's are okay because prev_nonnote_insn just
352          returns it's argument and we assign it to a const_rtx
353          variable.  */
354       for (prev = prev_nonnote_insn (CONST_CAST_RTX(insn));
355            prev != 0 && !LABEL_P (prev);
356            prev = prev_nonnote_insn (CONST_CAST_RTX(prev)))
357         {
358           const_rtx set = set_of (arg0, prev);
359           if (set && GET_CODE (set) == SET
360               && rtx_equal_p (SET_DEST (set), arg0))
361             {
362               rtx src = SET_SRC (set);
363
364               if (GET_CODE (src) == COMPARE)
365                 {
366                   rtx comparison = src;
367                   arg0 = XEXP (src, 0);
368                   mode = GET_MODE (arg0);
369                   if (mode == VOIDmode)
370                     mode = GET_MODE (XEXP (comparison, 1));
371                   break;
372                 }
373               /* We can get past reg-reg moves.  This may be useful for model
374                  of i387 comparisons that first move flag registers around.  */
375               if (REG_P (src))
376                 {
377                   arg0 = src;
378                   continue;
379                 }
380             }
381           /* If register is clobbered in some ununderstandable way,
382              give up.  */
383           if (set)
384             return UNKNOWN;
385         }
386     }
387
388   /* Test for an integer condition, or a floating-point comparison
389      in which NaNs can be ignored.  */
390   if (GET_CODE (arg0) == CONST_INT
391       || (GET_MODE (arg0) != VOIDmode
392           && GET_MODE_CLASS (mode) != MODE_CC
393           && !HONOR_NANS (mode)))
394     return reverse_condition (code);
395
396   return UNKNOWN;
397 }
398
399 /* A wrapper around the previous function to take COMPARISON as rtx
400    expression.  This simplifies many callers.  */
401 enum rtx_code
402 reversed_comparison_code (const_rtx comparison, const_rtx insn)
403 {
404   if (!COMPARISON_P (comparison))
405     return UNKNOWN;
406   return reversed_comparison_code_parts (GET_CODE (comparison),
407                                          XEXP (comparison, 0),
408                                          XEXP (comparison, 1), insn);
409 }
410
411 /* Return comparison with reversed code of EXP.
412    Return NULL_RTX in case we fail to do the reversal.  */
413 rtx
414 reversed_comparison (const_rtx exp, enum machine_mode mode)
415 {
416   enum rtx_code reversed_code = reversed_comparison_code (exp, NULL_RTX);
417   if (reversed_code == UNKNOWN)
418     return NULL_RTX;
419   else
420     return simplify_gen_relational (reversed_code, mode, VOIDmode,
421                                     XEXP (exp, 0), XEXP (exp, 1));
422 }
423
424 \f
425 /* Given an rtx-code for a comparison, return the code for the negated
426    comparison.  If no such code exists, return UNKNOWN.
427
428    WATCH OUT!  reverse_condition is not safe to use on a jump that might
429    be acting on the results of an IEEE floating point comparison, because
430    of the special treatment of non-signaling nans in comparisons.
431    Use reversed_comparison_code instead.  */
432
433 enum rtx_code
434 reverse_condition (enum rtx_code code)
435 {
436   switch (code)
437     {
438     case EQ:
439       return NE;
440     case NE:
441       return EQ;
442     case GT:
443       return LE;
444     case GE:
445       return LT;
446     case LT:
447       return GE;
448     case LE:
449       return GT;
450     case GTU:
451       return LEU;
452     case GEU:
453       return LTU;
454     case LTU:
455       return GEU;
456     case LEU:
457       return GTU;
458     case UNORDERED:
459       return ORDERED;
460     case ORDERED:
461       return UNORDERED;
462
463     case UNLT:
464     case UNLE:
465     case UNGT:
466     case UNGE:
467     case UNEQ:
468     case LTGT:
469       return UNKNOWN;
470
471     default:
472       gcc_unreachable ();
473     }
474 }
475
476 /* Similar, but we're allowed to generate unordered comparisons, which
477    makes it safe for IEEE floating-point.  Of course, we have to recognize
478    that the target will support them too...  */
479
480 enum rtx_code
481 reverse_condition_maybe_unordered (enum rtx_code code)
482 {
483   switch (code)
484     {
485     case EQ:
486       return NE;
487     case NE:
488       return EQ;
489     case GT:
490       return UNLE;
491     case GE:
492       return UNLT;
493     case LT:
494       return UNGE;
495     case LE:
496       return UNGT;
497     case LTGT:
498       return UNEQ;
499     case UNORDERED:
500       return ORDERED;
501     case ORDERED:
502       return UNORDERED;
503     case UNLT:
504       return GE;
505     case UNLE:
506       return GT;
507     case UNGT:
508       return LE;
509     case UNGE:
510       return LT;
511     case UNEQ:
512       return LTGT;
513
514     default:
515       gcc_unreachable ();
516     }
517 }
518
519 /* Similar, but return the code when two operands of a comparison are swapped.
520    This IS safe for IEEE floating-point.  */
521
522 enum rtx_code
523 swap_condition (enum rtx_code code)
524 {
525   switch (code)
526     {
527     case EQ:
528     case NE:
529     case UNORDERED:
530     case ORDERED:
531     case UNEQ:
532     case LTGT:
533       return code;
534
535     case GT:
536       return LT;
537     case GE:
538       return LE;
539     case LT:
540       return GT;
541     case LE:
542       return GE;
543     case GTU:
544       return LTU;
545     case GEU:
546       return LEU;
547     case LTU:
548       return GTU;
549     case LEU:
550       return GEU;
551     case UNLT:
552       return UNGT;
553     case UNLE:
554       return UNGE;
555     case UNGT:
556       return UNLT;
557     case UNGE:
558       return UNLE;
559
560     default:
561       gcc_unreachable ();
562     }
563 }
564
565 /* Given a comparison CODE, return the corresponding unsigned comparison.
566    If CODE is an equality comparison or already an unsigned comparison,
567    CODE is returned.  */
568
569 enum rtx_code
570 unsigned_condition (enum rtx_code code)
571 {
572   switch (code)
573     {
574     case EQ:
575     case NE:
576     case GTU:
577     case GEU:
578     case LTU:
579     case LEU:
580       return code;
581
582     case GT:
583       return GTU;
584     case GE:
585       return GEU;
586     case LT:
587       return LTU;
588     case LE:
589       return LEU;
590
591     default:
592       gcc_unreachable ();
593     }
594 }
595
596 /* Similarly, return the signed version of a comparison.  */
597
598 enum rtx_code
599 signed_condition (enum rtx_code code)
600 {
601   switch (code)
602     {
603     case EQ:
604     case NE:
605     case GT:
606     case GE:
607     case LT:
608     case LE:
609       return code;
610
611     case GTU:
612       return GT;
613     case GEU:
614       return GE;
615     case LTU:
616       return LT;
617     case LEU:
618       return LE;
619
620     default:
621       gcc_unreachable ();
622     }
623 }
624 \f
625 /* Return nonzero if CODE1 is more strict than CODE2, i.e., if the
626    truth of CODE1 implies the truth of CODE2.  */
627
628 int
629 comparison_dominates_p (enum rtx_code code1, enum rtx_code code2)
630 {
631   /* UNKNOWN comparison codes can happen as a result of trying to revert
632      comparison codes.
633      They can't match anything, so we have to reject them here.  */
634   if (code1 == UNKNOWN || code2 == UNKNOWN)
635     return 0;
636
637   if (code1 == code2)
638     return 1;
639
640   switch (code1)
641     {
642     case UNEQ:
643       if (code2 == UNLE || code2 == UNGE)
644         return 1;
645       break;
646
647     case EQ:
648       if (code2 == LE || code2 == LEU || code2 == GE || code2 == GEU
649           || code2 == ORDERED)
650         return 1;
651       break;
652
653     case UNLT:
654       if (code2 == UNLE || code2 == NE)
655         return 1;
656       break;
657
658     case LT:
659       if (code2 == LE || code2 == NE || code2 == ORDERED || code2 == LTGT)
660         return 1;
661       break;
662
663     case UNGT:
664       if (code2 == UNGE || code2 == NE)
665         return 1;
666       break;
667
668     case GT:
669       if (code2 == GE || code2 == NE || code2 == ORDERED || code2 == LTGT)
670         return 1;
671       break;
672
673     case GE:
674     case LE:
675       if (code2 == ORDERED)
676         return 1;
677       break;
678
679     case LTGT:
680       if (code2 == NE || code2 == ORDERED)
681         return 1;
682       break;
683
684     case LTU:
685       if (code2 == LEU || code2 == NE)
686         return 1;
687       break;
688
689     case GTU:
690       if (code2 == GEU || code2 == NE)
691         return 1;
692       break;
693
694     case UNORDERED:
695       if (code2 == NE || code2 == UNEQ || code2 == UNLE || code2 == UNLT
696           || code2 == UNGE || code2 == UNGT)
697         return 1;
698       break;
699
700     default:
701       break;
702     }
703
704   return 0;
705 }
706 \f
707 /* Return 1 if INSN is an unconditional jump and nothing else.  */
708
709 int
710 simplejump_p (const_rtx insn)
711 {
712   return (JUMP_P (insn)
713           && GET_CODE (PATTERN (insn)) == SET
714           && GET_CODE (SET_DEST (PATTERN (insn))) == PC
715           && GET_CODE (SET_SRC (PATTERN (insn))) == LABEL_REF);
716 }
717
718 /* Return nonzero if INSN is a (possibly) conditional jump
719    and nothing more.
720
721    Use of this function is deprecated, since we need to support combined
722    branch and compare insns.  Use any_condjump_p instead whenever possible.  */
723
724 int
725 condjump_p (const_rtx insn)
726 {
727   const_rtx x = PATTERN (insn);
728
729   if (GET_CODE (x) != SET
730       || GET_CODE (SET_DEST (x)) != PC)
731     return 0;
732
733   x = SET_SRC (x);
734   if (GET_CODE (x) == LABEL_REF)
735     return 1;
736   else
737     return (GET_CODE (x) == IF_THEN_ELSE
738             && ((GET_CODE (XEXP (x, 2)) == PC
739                  && (GET_CODE (XEXP (x, 1)) == LABEL_REF
740                      || GET_CODE (XEXP (x, 1)) == RETURN))
741                 || (GET_CODE (XEXP (x, 1)) == PC
742                     && (GET_CODE (XEXP (x, 2)) == LABEL_REF
743                         || GET_CODE (XEXP (x, 2)) == RETURN))));
744 }
745
746 /* Return nonzero if INSN is a (possibly) conditional jump inside a
747    PARALLEL.
748
749    Use this function is deprecated, since we need to support combined
750    branch and compare insns.  Use any_condjump_p instead whenever possible.  */
751
752 int
753 condjump_in_parallel_p (const_rtx insn)
754 {
755   const_rtx x = PATTERN (insn);
756
757   if (GET_CODE (x) != PARALLEL)
758     return 0;
759   else
760     x = XVECEXP (x, 0, 0);
761
762   if (GET_CODE (x) != SET)
763     return 0;
764   if (GET_CODE (SET_DEST (x)) != PC)
765     return 0;
766   if (GET_CODE (SET_SRC (x)) == LABEL_REF)
767     return 1;
768   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
769     return 0;
770   if (XEXP (SET_SRC (x), 2) == pc_rtx
771       && (GET_CODE (XEXP (SET_SRC (x), 1)) == LABEL_REF
772           || GET_CODE (XEXP (SET_SRC (x), 1)) == RETURN))
773     return 1;
774   if (XEXP (SET_SRC (x), 1) == pc_rtx
775       && (GET_CODE (XEXP (SET_SRC (x), 2)) == LABEL_REF
776           || GET_CODE (XEXP (SET_SRC (x), 2)) == RETURN))
777     return 1;
778   return 0;
779 }
780
781 /* Return set of PC, otherwise NULL.  */
782
783 rtx
784 pc_set (const_rtx insn)
785 {
786   rtx pat;
787   if (!JUMP_P (insn))
788     return NULL_RTX;
789   pat = PATTERN (insn);
790
791   /* The set is allowed to appear either as the insn pattern or
792      the first set in a PARALLEL.  */
793   if (GET_CODE (pat) == PARALLEL)
794     pat = XVECEXP (pat, 0, 0);
795   if (GET_CODE (pat) == SET && GET_CODE (SET_DEST (pat)) == PC)
796     return pat;
797
798   return NULL_RTX;
799 }
800
801 /* Return true when insn is an unconditional direct jump,
802    possibly bundled inside a PARALLEL.  */
803
804 int
805 any_uncondjump_p (const_rtx insn)
806 {
807   const_rtx x = pc_set (insn);
808   if (!x)
809     return 0;
810   if (GET_CODE (SET_SRC (x)) != LABEL_REF)
811     return 0;
812   if (find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
813     return 0;
814   return 1;
815 }
816
817 /* Return true when insn is a conditional jump.  This function works for
818    instructions containing PC sets in PARALLELs.  The instruction may have
819    various other effects so before removing the jump you must verify
820    onlyjump_p.
821
822    Note that unlike condjump_p it returns false for unconditional jumps.  */
823
824 int
825 any_condjump_p (const_rtx insn)
826 {
827   const_rtx x = pc_set (insn);
828   enum rtx_code a, b;
829
830   if (!x)
831     return 0;
832   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
833     return 0;
834
835   a = GET_CODE (XEXP (SET_SRC (x), 1));
836   b = GET_CODE (XEXP (SET_SRC (x), 2));
837
838   return ((b == PC && (a == LABEL_REF || a == RETURN))
839           || (a == PC && (b == LABEL_REF || b == RETURN)));
840 }
841
842 /* Return the label of a conditional jump.  */
843
844 rtx
845 condjump_label (const_rtx insn)
846 {
847   rtx x = pc_set (insn);
848
849   if (!x)
850     return NULL_RTX;
851   x = SET_SRC (x);
852   if (GET_CODE (x) == LABEL_REF)
853     return x;
854   if (GET_CODE (x) != IF_THEN_ELSE)
855     return NULL_RTX;
856   if (XEXP (x, 2) == pc_rtx && GET_CODE (XEXP (x, 1)) == LABEL_REF)
857     return XEXP (x, 1);
858   if (XEXP (x, 1) == pc_rtx && GET_CODE (XEXP (x, 2)) == LABEL_REF)
859     return XEXP (x, 2);
860   return NULL_RTX;
861 }
862
863 /* Return true if INSN is a (possibly conditional) return insn.  */
864
865 static int
866 returnjump_p_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
867 {
868   rtx x = *loc;
869
870   return x && (GET_CODE (x) == RETURN
871                || (GET_CODE (x) == SET && SET_IS_RETURN_P (x)));
872 }
873
874 int
875 returnjump_p (rtx insn)
876 {
877   if (!JUMP_P (insn))
878     return 0;
879   return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL);
880 }
881
882 /* Return true if INSN is a jump that only transfers control and
883    nothing more.  */
884
885 int
886 onlyjump_p (const_rtx insn)
887 {
888   rtx set;
889
890   if (!JUMP_P (insn))
891     return 0;
892
893   set = single_set (insn);
894   if (set == NULL)
895     return 0;
896   if (GET_CODE (SET_DEST (set)) != PC)
897     return 0;
898   if (side_effects_p (SET_SRC (set)))
899     return 0;
900
901   return 1;
902 }
903
904 #ifdef HAVE_cc0
905
906 /* Return nonzero if X is an RTX that only sets the condition codes
907    and has no side effects.  */
908
909 int
910 only_sets_cc0_p (const_rtx x)
911 {
912   if (! x)
913     return 0;
914
915   if (INSN_P (x))
916     x = PATTERN (x);
917
918   return sets_cc0_p (x) == 1 && ! side_effects_p (x);
919 }
920
921 /* Return 1 if X is an RTX that does nothing but set the condition codes
922    and CLOBBER or USE registers.
923    Return -1 if X does explicitly set the condition codes,
924    but also does other things.  */
925
926 int
927 sets_cc0_p (const_rtx x)
928 {
929   if (! x)
930     return 0;
931
932   if (INSN_P (x))
933     x = PATTERN (x);
934
935   if (GET_CODE (x) == SET && SET_DEST (x) == cc0_rtx)
936     return 1;
937   if (GET_CODE (x) == PARALLEL)
938     {
939       int i;
940       int sets_cc0 = 0;
941       int other_things = 0;
942       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
943         {
944           if (GET_CODE (XVECEXP (x, 0, i)) == SET
945               && SET_DEST (XVECEXP (x, 0, i)) == cc0_rtx)
946             sets_cc0 = 1;
947           else if (GET_CODE (XVECEXP (x, 0, i)) == SET)
948             other_things = 1;
949         }
950       return ! sets_cc0 ? 0 : other_things ? -1 : 1;
951     }
952   return 0;
953 }
954 #endif
955 \f
956 /* Find all CODE_LABELs referred to in X, and increment their use
957    counts.  If INSN is a JUMP_INSN and there is at least one
958    CODE_LABEL referenced in INSN as a jump target, then store the last
959    one in JUMP_LABEL (INSN).  For a tablejump, this must be the label
960    for the ADDR_VEC.  Store any other jump targets as REG_LABEL_TARGET
961    notes.  If INSN is an INSN or a CALL_INSN or non-target operands of
962    a JUMP_INSN, and there is at least one CODE_LABEL referenced in
963    INSN, add a REG_LABEL_OPERAND note containing that label to INSN.
964
965    Note that two labels separated by a loop-beginning note
966    must be kept distinct if we have not yet done loop-optimization,
967    because the gap between them is where loop-optimize
968    will want to move invariant code to.  CROSS_JUMP tells us
969    that loop-optimization is done with.  */
970
971 void
972 mark_jump_label (rtx x, rtx insn, int in_mem)
973 {
974   mark_jump_label_1 (x, insn, in_mem != 0,
975                      (insn != NULL && x == PATTERN (insn) && JUMP_P (insn)));
976 }
977
978 /* Worker function for mark_jump_label.  IN_MEM is TRUE when X occurrs
979    within a (MEM ...).  IS_TARGET is TRUE when X is to be treated as a
980    jump-target; when the JUMP_LABEL field of INSN should be set or a
981    REG_LABEL_TARGET note should be added, not a REG_LABEL_OPERAND
982    note.  */
983
984 static void
985 mark_jump_label_1 (rtx x, rtx insn, bool in_mem, bool is_target)
986 {
987   RTX_CODE code = GET_CODE (x);
988   int i;
989   const char *fmt;
990
991   switch (code)
992     {
993     case PC:
994     case CC0:
995     case REG:
996     case CONST_INT:
997     case CONST_DOUBLE:
998     case CLOBBER:
999     case CALL:
1000       return;
1001
1002     case MEM:
1003       in_mem = true;
1004       break;
1005
1006     case SEQUENCE:
1007       for (i = 0; i < XVECLEN (x, 0); i++)
1008         mark_jump_label (PATTERN (XVECEXP (x, 0, i)),
1009                          XVECEXP (x, 0, i), 0);
1010       return;
1011
1012     case SYMBOL_REF:
1013       if (!in_mem)
1014         return;
1015
1016       /* If this is a constant-pool reference, see if it is a label.  */
1017       if (CONSTANT_POOL_ADDRESS_P (x))
1018         mark_jump_label_1 (get_pool_constant (x), insn, in_mem, is_target);
1019       break;
1020
1021       /* Handle operands in the condition of an if-then-else as for a
1022          non-jump insn.  */
1023     case IF_THEN_ELSE:
1024       if (!is_target)
1025         break;
1026       mark_jump_label_1 (XEXP (x, 0), insn, in_mem, false);
1027       mark_jump_label_1 (XEXP (x, 1), insn, in_mem, true);
1028       mark_jump_label_1 (XEXP (x, 2), insn, in_mem, true);
1029       return;
1030
1031     case LABEL_REF:
1032       {
1033         rtx label = XEXP (x, 0);
1034
1035         /* Ignore remaining references to unreachable labels that
1036            have been deleted.  */
1037         if (NOTE_P (label)
1038             && NOTE_KIND (label) == NOTE_INSN_DELETED_LABEL)
1039           break;
1040
1041         gcc_assert (LABEL_P (label));
1042
1043         /* Ignore references to labels of containing functions.  */
1044         if (LABEL_REF_NONLOCAL_P (x))
1045           break;
1046
1047         XEXP (x, 0) = label;
1048         if (! insn || ! INSN_DELETED_P (insn))
1049           ++LABEL_NUSES (label);
1050
1051         if (insn)
1052           {
1053             if (is_target
1054                 && (JUMP_LABEL (insn) == NULL || JUMP_LABEL (insn) == label))
1055               JUMP_LABEL (insn) = label;
1056             else
1057               {
1058                 enum reg_note kind
1059                   = is_target ? REG_LABEL_TARGET : REG_LABEL_OPERAND;
1060
1061                 /* Add a REG_LABEL_OPERAND or REG_LABEL_TARGET note
1062                    for LABEL unless there already is one.  All uses of
1063                    a label, except for the primary target of a jump,
1064                    must have such a note.  */
1065                 if (! find_reg_note (insn, kind, label))
1066                   REG_NOTES (insn)
1067                     = gen_rtx_INSN_LIST (kind, label, REG_NOTES (insn));
1068               }
1069           }
1070         return;
1071       }
1072
1073   /* Do walk the labels in a vector, but not the first operand of an
1074      ADDR_DIFF_VEC.  Don't set the JUMP_LABEL of a vector.  */
1075     case ADDR_VEC:
1076     case ADDR_DIFF_VEC:
1077       if (! INSN_DELETED_P (insn))
1078         {
1079           int eltnum = code == ADDR_DIFF_VEC ? 1 : 0;
1080
1081           for (i = 0; i < XVECLEN (x, eltnum); i++)
1082             mark_jump_label_1 (XVECEXP (x, eltnum, i), NULL_RTX, in_mem,
1083                                is_target);
1084         }
1085       return;
1086
1087     default:
1088       break;
1089     }
1090
1091   fmt = GET_RTX_FORMAT (code);
1092
1093   /* The primary target of a tablejump is the label of the ADDR_VEC,
1094      which is canonically mentioned *last* in the insn.  To get it
1095      marked as JUMP_LABEL, we iterate over items in reverse order.  */
1096   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1097     {
1098       if (fmt[i] == 'e')
1099         mark_jump_label_1 (XEXP (x, i), insn, in_mem, is_target);
1100       else if (fmt[i] == 'E')
1101         {
1102           int j;
1103
1104           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1105             mark_jump_label_1 (XVECEXP (x, i, j), insn, in_mem,
1106                                is_target);
1107         }
1108     }
1109 }
1110
1111 \f
1112 /* Delete insn INSN from the chain of insns and update label ref counts
1113    and delete insns now unreachable.
1114
1115    Returns the first insn after INSN that was not deleted.
1116
1117    Usage of this instruction is deprecated.  Use delete_insn instead and
1118    subsequent cfg_cleanup pass to delete unreachable code if needed.  */
1119
1120 rtx
1121 delete_related_insns (rtx insn)
1122 {
1123   int was_code_label = (LABEL_P (insn));
1124   rtx note;
1125   rtx next = NEXT_INSN (insn), prev = PREV_INSN (insn);
1126
1127   while (next && INSN_DELETED_P (next))
1128     next = NEXT_INSN (next);
1129
1130   /* This insn is already deleted => return first following nondeleted.  */
1131   if (INSN_DELETED_P (insn))
1132     return next;
1133
1134   delete_insn (insn);
1135
1136   /* If instruction is followed by a barrier,
1137      delete the barrier too.  */
1138
1139   if (next != 0 && BARRIER_P (next))
1140     delete_insn (next);
1141
1142   /* If deleting a jump, decrement the count of the label,
1143      and delete the label if it is now unused.  */
1144
1145   if (JUMP_P (insn) && JUMP_LABEL (insn))
1146     {
1147       rtx lab = JUMP_LABEL (insn), lab_next;
1148
1149       if (LABEL_NUSES (lab) == 0)
1150         /* This can delete NEXT or PREV,
1151            either directly if NEXT is JUMP_LABEL (INSN),
1152            or indirectly through more levels of jumps.  */
1153         delete_related_insns (lab);
1154       else if (tablejump_p (insn, NULL, &lab_next))
1155         {
1156           /* If we're deleting the tablejump, delete the dispatch table.
1157              We may not be able to kill the label immediately preceding
1158              just yet, as it might be referenced in code leading up to
1159              the tablejump.  */
1160           delete_related_insns (lab_next);
1161         }
1162     }
1163
1164   /* Likewise if we're deleting a dispatch table.  */
1165
1166   if (JUMP_P (insn)
1167       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
1168           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
1169     {
1170       rtx pat = PATTERN (insn);
1171       int i, diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
1172       int len = XVECLEN (pat, diff_vec_p);
1173
1174       for (i = 0; i < len; i++)
1175         if (LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0)) == 0)
1176           delete_related_insns (XEXP (XVECEXP (pat, diff_vec_p, i), 0));
1177       while (next && INSN_DELETED_P (next))
1178         next = NEXT_INSN (next);
1179       return next;
1180     }
1181
1182   /* Likewise for any JUMP_P / INSN / CALL_INSN with a
1183      REG_LABEL_OPERAND or REG_LABEL_TARGET note.  */
1184   if (INSN_P (insn))
1185     for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1186       if ((REG_NOTE_KIND (note) == REG_LABEL_OPERAND
1187            || REG_NOTE_KIND (note) == REG_LABEL_TARGET)
1188           /* This could also be a NOTE_INSN_DELETED_LABEL note.  */
1189           && LABEL_P (XEXP (note, 0)))
1190         if (LABEL_NUSES (XEXP (note, 0)) == 0)
1191           delete_related_insns (XEXP (note, 0));
1192
1193   while (prev && (INSN_DELETED_P (prev) || NOTE_P (prev)))
1194     prev = PREV_INSN (prev);
1195
1196   /* If INSN was a label and a dispatch table follows it,
1197      delete the dispatch table.  The tablejump must have gone already.
1198      It isn't useful to fall through into a table.  */
1199
1200   if (was_code_label
1201       && NEXT_INSN (insn) != 0
1202       && JUMP_P (NEXT_INSN (insn))
1203       && (GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_VEC
1204           || GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_DIFF_VEC))
1205     next = delete_related_insns (NEXT_INSN (insn));
1206
1207   /* If INSN was a label, delete insns following it if now unreachable.  */
1208
1209   if (was_code_label && prev && BARRIER_P (prev))
1210     {
1211       enum rtx_code code;
1212       while (next)
1213         {
1214           code = GET_CODE (next);
1215           if (code == NOTE)
1216             next = NEXT_INSN (next);
1217           /* Keep going past other deleted labels to delete what follows.  */
1218           else if (code == CODE_LABEL && INSN_DELETED_P (next))
1219             next = NEXT_INSN (next);
1220           else if (code == BARRIER || INSN_P (next))
1221             /* Note: if this deletes a jump, it can cause more
1222                deletion of unreachable code, after a different label.
1223                As long as the value from this recursive call is correct,
1224                this invocation functions correctly.  */
1225             next = delete_related_insns (next);
1226           else
1227             break;
1228         }
1229     }
1230
1231   /* I feel a little doubtful about this loop,
1232      but I see no clean and sure alternative way
1233      to find the first insn after INSN that is not now deleted.
1234      I hope this works.  */
1235   while (next && INSN_DELETED_P (next))
1236     next = NEXT_INSN (next);
1237   return next;
1238 }
1239 \f
1240 /* Delete a range of insns from FROM to TO, inclusive.
1241    This is for the sake of peephole optimization, so assume
1242    that whatever these insns do will still be done by a new
1243    peephole insn that will replace them.  */
1244
1245 void
1246 delete_for_peephole (rtx from, rtx to)
1247 {
1248   rtx insn = from;
1249
1250   while (1)
1251     {
1252       rtx next = NEXT_INSN (insn);
1253       rtx prev = PREV_INSN (insn);
1254
1255       if (!NOTE_P (insn))
1256         {
1257           INSN_DELETED_P (insn) = 1;
1258
1259           /* Patch this insn out of the chain.  */
1260           /* We don't do this all at once, because we
1261              must preserve all NOTEs.  */
1262           if (prev)
1263             NEXT_INSN (prev) = next;
1264
1265           if (next)
1266             PREV_INSN (next) = prev;
1267         }
1268
1269       if (insn == to)
1270         break;
1271       insn = next;
1272     }
1273
1274   /* Note that if TO is an unconditional jump
1275      we *do not* delete the BARRIER that follows,
1276      since the peephole that replaces this sequence
1277      is also an unconditional jump in that case.  */
1278 }
1279 \f
1280 /* Throughout LOC, redirect OLABEL to NLABEL.  Treat null OLABEL or
1281    NLABEL as a return.  Accrue modifications into the change group.  */
1282
1283 static void
1284 redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
1285 {
1286   rtx x = *loc;
1287   RTX_CODE code = GET_CODE (x);
1288   int i;
1289   const char *fmt;
1290
1291   if (code == LABEL_REF)
1292     {
1293       if (XEXP (x, 0) == olabel)
1294         {
1295           rtx n;
1296           if (nlabel)
1297             n = gen_rtx_LABEL_REF (Pmode, nlabel);
1298           else
1299             n = gen_rtx_RETURN (VOIDmode);
1300
1301           validate_change (insn, loc, n, 1);
1302           return;
1303         }
1304     }
1305   else if (code == RETURN && olabel == 0)
1306     {
1307       if (nlabel)
1308         x = gen_rtx_LABEL_REF (Pmode, nlabel);
1309       else
1310         x = gen_rtx_RETURN (VOIDmode);
1311       if (loc == &PATTERN (insn))
1312         x = gen_rtx_SET (VOIDmode, pc_rtx, x);
1313       validate_change (insn, loc, x, 1);
1314       return;
1315     }
1316
1317   if (code == SET && nlabel == 0 && SET_DEST (x) == pc_rtx
1318       && GET_CODE (SET_SRC (x)) == LABEL_REF
1319       && XEXP (SET_SRC (x), 0) == olabel)
1320     {
1321       validate_change (insn, loc, gen_rtx_RETURN (VOIDmode), 1);
1322       return;
1323     }
1324
1325   fmt = GET_RTX_FORMAT (code);
1326   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1327     {
1328       if (fmt[i] == 'e')
1329         redirect_exp_1 (&XEXP (x, i), olabel, nlabel, insn);
1330       else if (fmt[i] == 'E')
1331         {
1332           int j;
1333           for (j = 0; j < XVECLEN (x, i); j++)
1334             redirect_exp_1 (&XVECEXP (x, i, j), olabel, nlabel, insn);
1335         }
1336     }
1337 }
1338
1339 /* Make JUMP go to NLABEL instead of where it jumps now.  Accrue
1340    the modifications into the change group.  Return false if we did
1341    not see how to do that.  */
1342
1343 int
1344 redirect_jump_1 (rtx jump, rtx nlabel)
1345 {
1346   int ochanges = num_validated_changes ();
1347   rtx *loc;
1348
1349   if (GET_CODE (PATTERN (jump)) == PARALLEL)
1350     loc = &XVECEXP (PATTERN (jump), 0, 0);
1351   else
1352     loc = &PATTERN (jump);
1353
1354   redirect_exp_1 (loc, JUMP_LABEL (jump), nlabel, jump);
1355   return num_validated_changes () > ochanges;
1356 }
1357
1358 /* Make JUMP go to NLABEL instead of where it jumps now.  If the old
1359    jump target label is unused as a result, it and the code following
1360    it may be deleted.
1361
1362    If NLABEL is zero, we are to turn the jump into a (possibly conditional)
1363    RETURN insn.
1364
1365    The return value will be 1 if the change was made, 0 if it wasn't
1366    (this can only occur for NLABEL == 0).  */
1367
1368 int
1369 redirect_jump (rtx jump, rtx nlabel, int delete_unused)
1370 {
1371   rtx olabel = JUMP_LABEL (jump);
1372
1373   if (nlabel == olabel)
1374     return 1;
1375
1376   if (! redirect_jump_1 (jump, nlabel) || ! apply_change_group ())
1377     return 0;
1378
1379   redirect_jump_2 (jump, olabel, nlabel, delete_unused, 0);
1380   return 1;
1381 }
1382
1383 /* Fix up JUMP_LABEL and label ref counts after OLABEL has been replaced with
1384    NLABEL in JUMP.  
1385    If DELETE_UNUSED is positive, delete related insn to OLABEL if its ref
1386    count has dropped to zero.  */
1387 void
1388 redirect_jump_2 (rtx jump, rtx olabel, rtx nlabel, int delete_unused,
1389                  int invert)
1390 {
1391   rtx note;
1392
1393   gcc_assert (JUMP_LABEL (jump) == olabel);
1394
1395   /* Negative DELETE_UNUSED used to be used to signalize behavior on
1396      moving FUNCTION_END note.  Just sanity check that no user still worry
1397      about this.  */
1398   gcc_assert (delete_unused >= 0);
1399   JUMP_LABEL (jump) = nlabel;
1400   if (nlabel)
1401     ++LABEL_NUSES (nlabel);
1402
1403   /* Update labels in any REG_EQUAL note.  */
1404   if ((note = find_reg_note (jump, REG_EQUAL, NULL_RTX)) != NULL_RTX)
1405     {
1406       if (!nlabel || (invert && !invert_exp_1 (XEXP (note, 0), jump)))
1407         remove_note (jump, note);
1408       else
1409         {
1410           redirect_exp_1 (&XEXP (note, 0), olabel, nlabel, jump);
1411           confirm_change_group ();
1412         }
1413     }
1414
1415   if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused > 0
1416       /* Undefined labels will remain outside the insn stream.  */
1417       && INSN_UID (olabel))
1418     delete_related_insns (olabel);
1419   if (invert)
1420     invert_br_probabilities (jump);
1421 }
1422
1423 /* Invert the jump condition X contained in jump insn INSN.  Accrue the
1424    modifications into the change group.  Return nonzero for success.  */
1425 static int
1426 invert_exp_1 (rtx x, rtx insn)
1427 {
1428   RTX_CODE code = GET_CODE (x);
1429
1430   if (code == IF_THEN_ELSE)
1431     {
1432       rtx comp = XEXP (x, 0);
1433       rtx tem;
1434       enum rtx_code reversed_code;
1435
1436       /* We can do this in two ways:  The preferable way, which can only
1437          be done if this is not an integer comparison, is to reverse
1438          the comparison code.  Otherwise, swap the THEN-part and ELSE-part
1439          of the IF_THEN_ELSE.  If we can't do either, fail.  */
1440
1441       reversed_code = reversed_comparison_code (comp, insn);
1442
1443       if (reversed_code != UNKNOWN)
1444         {
1445           validate_change (insn, &XEXP (x, 0),
1446                            gen_rtx_fmt_ee (reversed_code,
1447                                            GET_MODE (comp), XEXP (comp, 0),
1448                                            XEXP (comp, 1)),
1449                            1);
1450           return 1;
1451         }
1452
1453       tem = XEXP (x, 1);
1454       validate_change (insn, &XEXP (x, 1), XEXP (x, 2), 1);
1455       validate_change (insn, &XEXP (x, 2), tem, 1);
1456       return 1;
1457     }
1458   else
1459     return 0;
1460 }
1461
1462 /* Invert the condition of the jump JUMP, and make it jump to label
1463    NLABEL instead of where it jumps now.  Accrue changes into the
1464    change group.  Return false if we didn't see how to perform the
1465    inversion and redirection.  */
1466
1467 int
1468 invert_jump_1 (rtx jump, rtx nlabel)
1469 {
1470   rtx x = pc_set (jump);
1471   int ochanges;
1472   int ok;
1473
1474   ochanges = num_validated_changes ();
1475   gcc_assert (x);
1476   ok = invert_exp_1 (SET_SRC (x), jump);
1477   gcc_assert (ok);
1478   
1479   if (num_validated_changes () == ochanges)
1480     return 0;
1481
1482   /* redirect_jump_1 will fail of nlabel == olabel, and the current use is
1483      in Pmode, so checking this is not merely an optimization.  */
1484   return nlabel == JUMP_LABEL (jump) || redirect_jump_1 (jump, nlabel);
1485 }
1486
1487 /* Invert the condition of the jump JUMP, and make it jump to label
1488    NLABEL instead of where it jumps now.  Return true if successful.  */
1489
1490 int
1491 invert_jump (rtx jump, rtx nlabel, int delete_unused)
1492 {
1493   rtx olabel = JUMP_LABEL (jump);
1494
1495   if (invert_jump_1 (jump, nlabel) && apply_change_group ())
1496     {
1497       redirect_jump_2 (jump, olabel, nlabel, delete_unused, 1);
1498       return 1;
1499     }
1500   cancel_changes (0);
1501   return 0;
1502 }
1503
1504 \f
1505 /* Like rtx_equal_p except that it considers two REGs as equal
1506    if they renumber to the same value and considers two commutative
1507    operations to be the same if the order of the operands has been
1508    reversed.  */
1509
1510 int
1511 rtx_renumbered_equal_p (const_rtx x, const_rtx y)
1512 {
1513   int i;
1514   const enum rtx_code code = GET_CODE (x);
1515   const char *fmt;
1516
1517   if (x == y)
1518     return 1;
1519
1520   if ((code == REG || (code == SUBREG && REG_P (SUBREG_REG (x))))
1521       && (REG_P (y) || (GET_CODE (y) == SUBREG
1522                                   && REG_P (SUBREG_REG (y)))))
1523     {
1524       int reg_x = -1, reg_y = -1;
1525       int byte_x = 0, byte_y = 0;
1526
1527       if (GET_MODE (x) != GET_MODE (y))
1528         return 0;
1529
1530       /* If we haven't done any renumbering, don't
1531          make any assumptions.  */
1532       if (reg_renumber == 0)
1533         return rtx_equal_p (x, y);
1534
1535       if (code == SUBREG)
1536         {
1537           reg_x = REGNO (SUBREG_REG (x));
1538           byte_x = SUBREG_BYTE (x);
1539
1540           if (reg_renumber[reg_x] >= 0)
1541             {
1542               reg_x = subreg_regno_offset (reg_renumber[reg_x],
1543                                            GET_MODE (SUBREG_REG (x)),
1544                                            byte_x,
1545                                            GET_MODE (x));
1546               byte_x = 0;
1547             }
1548         }
1549       else
1550         {
1551           reg_x = REGNO (x);
1552           if (reg_renumber[reg_x] >= 0)
1553             reg_x = reg_renumber[reg_x];
1554         }
1555
1556       if (GET_CODE (y) == SUBREG)
1557         {
1558           reg_y = REGNO (SUBREG_REG (y));
1559           byte_y = SUBREG_BYTE (y);
1560
1561           if (reg_renumber[reg_y] >= 0)
1562             {
1563               reg_y = subreg_regno_offset (reg_renumber[reg_y],
1564                                            GET_MODE (SUBREG_REG (y)),
1565                                            byte_y,
1566                                            GET_MODE (y));
1567               byte_y = 0;
1568             }
1569         }
1570       else
1571         {
1572           reg_y = REGNO (y);
1573           if (reg_renumber[reg_y] >= 0)
1574             reg_y = reg_renumber[reg_y];
1575         }
1576
1577       return reg_x >= 0 && reg_x == reg_y && byte_x == byte_y;
1578     }
1579
1580   /* Now we have disposed of all the cases
1581      in which different rtx codes can match.  */
1582   if (code != GET_CODE (y))
1583     return 0;
1584
1585   switch (code)
1586     {
1587     case PC:
1588     case CC0:
1589     case ADDR_VEC:
1590     case ADDR_DIFF_VEC:
1591     case CONST_INT:
1592     case CONST_DOUBLE:
1593       return 0;
1594
1595     case LABEL_REF:
1596       /* We can't assume nonlocal labels have their following insns yet.  */
1597       if (LABEL_REF_NONLOCAL_P (x) || LABEL_REF_NONLOCAL_P (y))
1598         return XEXP (x, 0) == XEXP (y, 0);
1599
1600       /* Two label-refs are equivalent if they point at labels
1601          in the same position in the instruction stream.  */
1602       return (next_real_insn (XEXP (x, 0))
1603               == next_real_insn (XEXP (y, 0)));
1604
1605     case SYMBOL_REF:
1606       return XSTR (x, 0) == XSTR (y, 0);
1607
1608     case CODE_LABEL:
1609       /* If we didn't match EQ equality above, they aren't the same.  */
1610       return 0;
1611
1612     default:
1613       break;
1614     }
1615
1616   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
1617
1618   if (GET_MODE (x) != GET_MODE (y))
1619     return 0;
1620
1621   /* For commutative operations, the RTX match if the operand match in any
1622      order.  Also handle the simple binary and unary cases without a loop.  */
1623   if (targetm.commutative_p (x, UNKNOWN))
1624     return ((rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1625              && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)))
1626             || (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 1))
1627                 && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 0))));
1628   else if (NON_COMMUTATIVE_P (x))
1629     return (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
1630             && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)));
1631   else if (UNARY_P (x))
1632     return rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0));
1633
1634   /* Compare the elements.  If any pair of corresponding elements
1635      fail to match, return 0 for the whole things.  */
1636
1637   fmt = GET_RTX_FORMAT (code);
1638   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1639     {
1640       int j;
1641       switch (fmt[i])
1642         {
1643         case 'w':
1644           if (XWINT (x, i) != XWINT (y, i))
1645             return 0;
1646           break;
1647
1648         case 'i':
1649           if (XINT (x, i) != XINT (y, i))
1650             return 0;
1651           break;
1652
1653         case 't':
1654           if (XTREE (x, i) != XTREE (y, i))
1655             return 0;
1656           break;
1657
1658         case 's':
1659           if (strcmp (XSTR (x, i), XSTR (y, i)))
1660             return 0;
1661           break;
1662
1663         case 'e':
1664           if (! rtx_renumbered_equal_p (XEXP (x, i), XEXP (y, i)))
1665             return 0;
1666           break;
1667
1668         case 'u':
1669           if (XEXP (x, i) != XEXP (y, i))
1670             return 0;
1671           /* Fall through.  */
1672         case '0':
1673           break;
1674
1675         case 'E':
1676           if (XVECLEN (x, i) != XVECLEN (y, i))
1677             return 0;
1678           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1679             if (!rtx_renumbered_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)))
1680               return 0;
1681           break;
1682
1683         default:
1684           gcc_unreachable ();
1685         }
1686     }
1687   return 1;
1688 }
1689 \f
1690 /* If X is a hard register or equivalent to one or a subregister of one,
1691    return the hard register number.  If X is a pseudo register that was not
1692    assigned a hard register, return the pseudo register number.  Otherwise,
1693    return -1.  Any rtx is valid for X.  */
1694
1695 int
1696 true_regnum (const_rtx x)
1697 {
1698   if (REG_P (x))
1699     {
1700       if (REGNO (x) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO (x)] >= 0)
1701         return reg_renumber[REGNO (x)];
1702       return REGNO (x);
1703     }
1704   if (GET_CODE (x) == SUBREG)
1705     {
1706       int base = true_regnum (SUBREG_REG (x));
1707       if (base >= 0
1708           && base < FIRST_PSEUDO_REGISTER
1709           && subreg_offset_representable_p (REGNO (SUBREG_REG (x)),
1710                                             GET_MODE (SUBREG_REG (x)),
1711                                             SUBREG_BYTE (x), GET_MODE (x)))
1712         return base + subreg_regno_offset (REGNO (SUBREG_REG (x)),
1713                                            GET_MODE (SUBREG_REG (x)),
1714                                            SUBREG_BYTE (x), GET_MODE (x));
1715     }
1716   return -1;
1717 }
1718
1719 /* Return regno of the register REG and handle subregs too.  */
1720 unsigned int
1721 reg_or_subregno (const_rtx reg)
1722 {
1723   if (GET_CODE (reg) == SUBREG)
1724     reg = SUBREG_REG (reg);
1725   gcc_assert (REG_P (reg));
1726   return REGNO (reg);
1727 }