OSDN Git Service

(emit_library_call): Don't pass VOIDmode to type_for_mode.
[pf3gnuchains/gcc-fork.git] / gcc / jump.c
1 /* Optimize jump instructions, for GNU compiler.
2    Copyright (C) 1987, 88, 89, 91-95, 1996 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21
22 /* This is the jump-optimization pass of the compiler.
23    It is run two or three times: once before cse, sometimes once after cse,
24    and once after reload (before final).
25
26    jump_optimize deletes unreachable code and labels that are not used.
27    It also deletes jumps that jump to the following insn,
28    and simplifies jumps around unconditional jumps and jumps
29    to unconditional jumps.
30
31    Each CODE_LABEL has a count of the times it is used
32    stored in the LABEL_NUSES internal field, and each JUMP_INSN
33    has one label that it refers to stored in the
34    JUMP_LABEL internal field.  With this we can detect labels that
35    become unused because of the deletion of all the jumps that
36    formerly used them.  The JUMP_LABEL info is sometimes looked
37    at by later passes.
38
39    Optionally, cross-jumping can be done.  Currently it is done
40    only the last time (when after reload and before final).
41    In fact, the code for cross-jumping now assumes that register
42    allocation has been done, since it uses `rtx_renumbered_equal_p'.
43
44    Jump optimization is done after cse when cse's constant-propagation
45    causes jumps to become unconditional or to be deleted.
46
47    Unreachable loops are not detected here, because the labels
48    have references and the insns appear reachable from the labels.
49    find_basic_blocks in flow.c finds and deletes such loops.
50
51    The subroutines delete_insn, redirect_jump, and invert_jump are used
52    from other passes as well.  */
53
54 #include "config.h"
55 #include "rtl.h"
56 #include "flags.h"
57 #include "hard-reg-set.h"
58 #include "regs.h"
59 #include "insn-config.h"
60 #include "insn-flags.h"
61 #include "expr.h"
62 #include "real.h"
63 #include "except.h"
64
65 /* ??? Eventually must record somehow the labels used by jumps
66    from nested functions.  */
67 /* Pre-record the next or previous real insn for each label?
68    No, this pass is very fast anyway.  */
69 /* Condense consecutive labels?
70    This would make life analysis faster, maybe.  */
71 /* Optimize jump y; x: ... y: jumpif... x?
72    Don't know if it is worth bothering with.  */
73 /* Optimize two cases of conditional jump to conditional jump?
74    This can never delete any instruction or make anything dead,
75    or even change what is live at any point.
76    So perhaps let combiner do it.  */
77
78 /* Vector indexed by uid.
79    For each CODE_LABEL, index by its uid to get first unconditional jump
80    that jumps to the label.
81    For each JUMP_INSN, index by its uid to get the next unconditional jump
82    that jumps to the same label.
83    Element 0 is the start of a chain of all return insns.
84    (It is safe to use element 0 because insn uid 0 is not used.  */
85
86 static rtx *jump_chain;
87
88 /* List of labels referred to from initializers.
89    These can never be deleted.  */
90 rtx forced_labels;
91
92 /* Maximum index in jump_chain.  */
93
94 static int max_jump_chain;
95
96 /* Set nonzero by jump_optimize if control can fall through
97    to the end of the function.  */
98 int can_reach_end;
99
100 /* Indicates whether death notes are significant in cross jump analysis.
101    Normally they are not significant, because of A and B jump to C,
102    and R dies in A, it must die in B.  But this might not be true after
103    stack register conversion, and we must compare death notes in that
104    case.  */
105
106 static int cross_jump_death_matters = 0;
107
108 static int duplicate_loop_exit_test     PROTO((rtx));
109 static void find_cross_jump             PROTO((rtx, rtx, int, rtx *, rtx *));
110 static void do_cross_jump               PROTO((rtx, rtx, rtx));
111 static int jump_back_p                  PROTO((rtx, rtx));
112 static int tension_vector_labels        PROTO((rtx, int));
113 static void mark_jump_label             PROTO((rtx, rtx, int));
114 static void delete_computation          PROTO((rtx));
115 static void delete_from_jump_chain      PROTO((rtx));
116 static int delete_labelref_insn         PROTO((rtx, rtx, int));
117 static void redirect_tablejump          PROTO((rtx, rtx));
118 \f
119 /* Delete no-op jumps and optimize jumps to jumps
120    and jumps around jumps.
121    Delete unused labels and unreachable code.
122
123    If CROSS_JUMP is 1, detect matching code
124    before a jump and its destination and unify them.
125    If CROSS_JUMP is 2, do cross-jumping, but pay attention to death notes.
126
127    If NOOP_MOVES is nonzero, delete no-op move insns.
128
129    If AFTER_REGSCAN is nonzero, then this jump pass is being run immediately
130    after regscan, and it is safe to use regno_first_uid and regno_last_uid.
131
132    If `optimize' is zero, don't change any code,
133    just determine whether control drops off the end of the function.
134    This case occurs when we have -W and not -O.
135    It works because `delete_insn' checks the value of `optimize'
136    and refrains from actually deleting when that is 0.  */
137
138 void
139 jump_optimize (f, cross_jump, noop_moves, after_regscan)
140      rtx f;
141      int cross_jump;
142      int noop_moves;
143      int after_regscan;
144 {
145   register rtx insn, next, note;
146   int changed;
147   int first = 1;
148   int max_uid = 0;
149   rtx last_insn;
150
151   cross_jump_death_matters = (cross_jump == 2);
152
153   /* Initialize LABEL_NUSES and JUMP_LABEL fields.  Delete any REG_LABEL
154      notes whose labels don't occur in the insn any more.  */
155
156   for (insn = f; insn; insn = NEXT_INSN (insn))
157     {
158       if (GET_CODE (insn) == CODE_LABEL)
159         LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
160       else if (GET_CODE (insn) == JUMP_INSN)
161         JUMP_LABEL (insn) = 0;
162       else if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
163         for (note = REG_NOTES (insn); note; note = next)
164           {
165             next = XEXP (note, 1);
166             if (REG_NOTE_KIND (note) == REG_LABEL
167                 && ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
168               remove_note (insn, note);
169           }
170
171       if (INSN_UID (insn) > max_uid)
172         max_uid = INSN_UID (insn);
173     }
174
175   max_uid++;
176
177   /* Delete insns following barriers, up to next label.  */
178
179   for (insn = f; insn;)
180     {
181       if (GET_CODE (insn) == BARRIER)
182         {
183           insn = NEXT_INSN (insn);
184           while (insn != 0 && GET_CODE (insn) != CODE_LABEL)
185             {
186               if (GET_CODE (insn) == NOTE
187                   && NOTE_LINE_NUMBER (insn) != NOTE_INSN_FUNCTION_END)
188                 insn = NEXT_INSN (insn);
189               else
190                 insn = delete_insn (insn);
191             }
192           /* INSN is now the code_label.  */
193         }
194       else
195         insn = NEXT_INSN (insn);
196     }
197
198   /* Leave some extra room for labels and duplicate exit test insns
199      we make.  */
200   max_jump_chain = max_uid * 14 / 10;
201   jump_chain = (rtx *) alloca (max_jump_chain * sizeof (rtx));
202   bzero ((char *) jump_chain, max_jump_chain * sizeof (rtx));
203
204   /* Mark the label each jump jumps to.
205      Combine consecutive labels, and count uses of labels.
206
207      For each label, make a chain (using `jump_chain')
208      of all the *unconditional* jumps that jump to it;
209      also make a chain of all returns.  */
210
211   for (insn = f; insn; insn = NEXT_INSN (insn))
212     if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
213         && ! INSN_DELETED_P (insn))
214       {
215         mark_jump_label (PATTERN (insn), insn, cross_jump);
216         if (GET_CODE (insn) == JUMP_INSN)
217           {
218             if (JUMP_LABEL (insn) != 0 && simplejump_p (insn))
219               {
220                 jump_chain[INSN_UID (insn)]
221                   = jump_chain[INSN_UID (JUMP_LABEL (insn))];
222                 jump_chain[INSN_UID (JUMP_LABEL (insn))] = insn;
223               }
224             if (GET_CODE (PATTERN (insn)) == RETURN)
225               {
226                 jump_chain[INSN_UID (insn)] = jump_chain[0];
227                 jump_chain[0] = insn;
228               }
229           }
230       }
231
232   /* Keep track of labels used from static data;
233      they cannot ever be deleted.  */
234
235   for (insn = forced_labels; insn; insn = XEXP (insn, 1))
236     LABEL_NUSES (XEXP (insn, 0))++;
237
238   check_exception_handler_labels ();
239
240   /* Keep track of labels used for marking handlers for exception
241      regions; they cannot usually be deleted.  */
242
243   for (insn = exception_handler_labels; insn; insn = XEXP (insn, 1))
244     LABEL_NUSES (XEXP (insn, 0))++;
245
246   exception_optimize ();
247
248   /* Delete all labels already not referenced.
249      Also find the last insn.  */
250
251   last_insn = 0;
252   for (insn = f; insn; )
253     {
254       if (GET_CODE (insn) == CODE_LABEL && LABEL_NUSES (insn) == 0)
255         insn = delete_insn (insn);
256       else
257         {
258           last_insn = insn;
259           insn = NEXT_INSN (insn);
260         }
261     }
262
263   if (!optimize)
264     {
265       /* See if there is still a NOTE_INSN_FUNCTION_END in this function.
266          If so record that this function can drop off the end.  */
267
268       insn = last_insn;
269       {
270         int n_labels = 1;
271         while (insn
272                /* One label can follow the end-note: the return label.  */
273                && ((GET_CODE (insn) == CODE_LABEL && n_labels-- > 0)
274                    /* Ordinary insns can follow it if returning a structure.  */
275                    || GET_CODE (insn) == INSN
276                    /* If machine uses explicit RETURN insns, no epilogue,
277                       then one of them follows the note.  */
278                    || (GET_CODE (insn) == JUMP_INSN
279                        && GET_CODE (PATTERN (insn)) == RETURN)
280                    /* A barrier can follow the return insn.  */
281                    || GET_CODE (insn) == BARRIER
282                    /* Other kinds of notes can follow also.  */
283                    || (GET_CODE (insn) == NOTE
284                        && NOTE_LINE_NUMBER (insn) != NOTE_INSN_FUNCTION_END)))
285           insn = PREV_INSN (insn);
286       }
287
288       /* Report if control can fall through at the end of the function.  */
289       if (insn && GET_CODE (insn) == NOTE
290           && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_END
291           && ! INSN_DELETED_P (insn))
292         can_reach_end = 1;
293
294       /* Zero the "deleted" flag of all the "deleted" insns.  */
295       for (insn = f; insn; insn = NEXT_INSN (insn))
296         INSN_DELETED_P (insn) = 0;
297       return;
298     }
299
300 #ifdef HAVE_return
301   if (HAVE_return)
302     {
303       /* If we fall through to the epilogue, see if we can insert a RETURN insn
304          in front of it.  If the machine allows it at this point (we might be
305          after reload for a leaf routine), it will improve optimization for it
306          to be there.  */
307       insn = get_last_insn ();
308       while (insn && GET_CODE (insn) == NOTE)
309         insn = PREV_INSN (insn);
310
311       if (insn && GET_CODE (insn) != BARRIER)
312         {
313           emit_jump_insn (gen_return ());
314           emit_barrier ();
315         }
316     }
317 #endif
318
319   if (noop_moves)
320     for (insn = f; insn; )
321       {
322         next = NEXT_INSN (insn);
323
324         if (GET_CODE (insn) == INSN)
325           {
326             register rtx body = PATTERN (insn);
327
328 /* Combine stack_adjusts with following push_insns.  */
329 #ifdef PUSH_ROUNDING
330             if (GET_CODE (body) == SET
331                 && SET_DEST (body) == stack_pointer_rtx
332                 && GET_CODE (SET_SRC (body)) == PLUS
333                 && XEXP (SET_SRC (body), 0) == stack_pointer_rtx
334                 && GET_CODE (XEXP (SET_SRC (body), 1)) == CONST_INT
335                 && INTVAL (XEXP (SET_SRC (body), 1)) > 0)
336               {
337                 rtx p;
338                 rtx stack_adjust_insn = insn;
339                 int stack_adjust_amount = INTVAL (XEXP (SET_SRC (body), 1));
340                 int total_pushed = 0;
341                 int pushes = 0;
342
343                 /* Find all successive push insns.  */
344                 p = insn;
345                 /* Don't convert more than three pushes;
346                    that starts adding too many displaced addresses
347                    and the whole thing starts becoming a losing
348                    proposition.  */
349                 while (pushes < 3)
350                   {
351                     rtx pbody, dest;
352                     p = next_nonnote_insn (p);
353                     if (p == 0 || GET_CODE (p) != INSN)
354                       break;
355                     pbody = PATTERN (p);
356                     if (GET_CODE (pbody) != SET)
357                       break;
358                     dest = SET_DEST (pbody);
359                     /* Allow a no-op move between the adjust and the push.  */
360                     if (GET_CODE (dest) == REG
361                         && GET_CODE (SET_SRC (pbody)) == REG
362                         && REGNO (dest) == REGNO (SET_SRC (pbody)))
363                       continue;
364                     if (! (GET_CODE (dest) == MEM
365                            && GET_CODE (XEXP (dest, 0)) == POST_INC
366                            && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx))
367                       break;
368                     pushes++;
369                     if (total_pushed + GET_MODE_SIZE (GET_MODE (SET_DEST (pbody)))
370                         > stack_adjust_amount)
371                       break;
372                     total_pushed += GET_MODE_SIZE (GET_MODE (SET_DEST (pbody)));
373                   }
374
375                 /* Discard the amount pushed from the stack adjust;
376                    maybe eliminate it entirely.  */
377                 if (total_pushed >= stack_adjust_amount)
378                   {
379                     delete_computation (stack_adjust_insn);
380                     total_pushed = stack_adjust_amount;
381                   }
382                 else
383                   XEXP (SET_SRC (PATTERN (stack_adjust_insn)), 1)
384                     = GEN_INT (stack_adjust_amount - total_pushed);
385
386                 /* Change the appropriate push insns to ordinary stores.  */
387                 p = insn;
388                 while (total_pushed > 0)
389                   {
390                     rtx pbody, dest;
391                     p = next_nonnote_insn (p);
392                     if (GET_CODE (p) != INSN)
393                       break;
394                     pbody = PATTERN (p);
395                     if (GET_CODE (pbody) == SET)
396                       break;
397                     dest = SET_DEST (pbody);
398                     if (! (GET_CODE (dest) == MEM
399                            && GET_CODE (XEXP (dest, 0)) == POST_INC
400                            && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx))
401                       break;
402                     total_pushed -= GET_MODE_SIZE (GET_MODE (SET_DEST (pbody)));
403                     /* If this push doesn't fully fit in the space
404                        of the stack adjust that we deleted,
405                        make another stack adjust here for what we
406                        didn't use up.  There should be peepholes
407                        to recognize the resulting sequence of insns.  */
408                     if (total_pushed < 0)
409                       {
410                         emit_insn_before (gen_add2_insn (stack_pointer_rtx,
411                                                          GEN_INT (- total_pushed)),
412                                           p);
413                         break;
414                       }
415                     XEXP (dest, 0)
416                       = plus_constant (stack_pointer_rtx, total_pushed);
417                   }
418               }
419 #endif
420
421             /* Detect and delete no-op move instructions
422                resulting from not allocating a parameter in a register.  */
423
424             if (GET_CODE (body) == SET
425                 && (SET_DEST (body) == SET_SRC (body)
426                     || (GET_CODE (SET_DEST (body)) == MEM
427                         && GET_CODE (SET_SRC (body)) == MEM
428                         && rtx_equal_p (SET_SRC (body), SET_DEST (body))))
429                 && ! (GET_CODE (SET_DEST (body)) == MEM
430                       && MEM_VOLATILE_P (SET_DEST (body)))
431                 && ! (GET_CODE (SET_SRC (body)) == MEM
432                       && MEM_VOLATILE_P (SET_SRC (body))))
433               delete_computation (insn);
434
435             /* Detect and ignore no-op move instructions
436                resulting from smart or fortuitous register allocation.  */
437
438             else if (GET_CODE (body) == SET)
439               {
440                 int sreg = true_regnum (SET_SRC (body));
441                 int dreg = true_regnum (SET_DEST (body));
442
443                 if (sreg == dreg && sreg >= 0)
444                   delete_insn (insn);
445                 else if (sreg >= 0 && dreg >= 0)
446                   {
447                     rtx trial;
448                     rtx tem = find_equiv_reg (NULL_RTX, insn, 0,
449                                               sreg, NULL_PTR, dreg,
450                                               GET_MODE (SET_SRC (body)));
451
452                     if (tem != 0 &&
453                         GET_MODE (tem) == GET_MODE (SET_DEST (body)))
454                       {
455                         /* DREG may have been the target of a REG_DEAD note in
456                            the insn which makes INSN redundant.  If so, reorg
457                            would still think it is dead.  So search for such a
458                            note and delete it if we find it.  */
459                         if (! find_regno_note (insn, REG_UNUSED, dreg))
460                           for (trial = prev_nonnote_insn (insn);
461                                trial && GET_CODE (trial) != CODE_LABEL;
462                                trial = prev_nonnote_insn (trial))
463                             if (find_regno_note (trial, REG_DEAD, dreg))
464                               {
465                                 remove_death (dreg, trial);
466                                 break;
467                               }
468 #ifdef PRESERVE_DEATH_INFO_REGNO_P
469                         /* Deleting insn could lose a death-note for SREG
470                            so don't do it if final needs accurate
471                            death-notes.  */
472                         if (PRESERVE_DEATH_INFO_REGNO_P (sreg)
473                             && (trial = find_regno_note (insn, REG_DEAD, sreg)))
474                           {
475                             /* Change this into a USE so that we won't emit
476                                code for it, but still can keep the note.  */
477                             PATTERN (insn)
478                               = gen_rtx (USE, VOIDmode, XEXP (trial, 0));
479                             INSN_CODE (insn) = -1;
480                             /* Remove all reg notes but the REG_DEAD one.  */
481                             REG_NOTES (insn) = trial;
482                             XEXP (trial, 1) = NULL_RTX;
483                           }
484                         else
485 #endif
486                           delete_insn (insn);
487                       }
488                   }
489                 else if (dreg >= 0 && CONSTANT_P (SET_SRC (body))
490                          && find_equiv_reg (SET_SRC (body), insn, 0, dreg,
491                                             NULL_PTR, 0,
492                                             GET_MODE (SET_DEST (body))))
493                   {
494                     /* This handles the case where we have two consecutive
495                        assignments of the same constant to pseudos that didn't
496                        get a hard reg.  Each SET from the constant will be
497                        converted into a SET of the spill register and an
498                        output reload will be made following it.  This produces
499                        two loads of the same constant into the same spill
500                        register.  */
501
502                     rtx in_insn = insn;
503
504                     /* Look back for a death note for the first reg.
505                        If there is one, it is no longer accurate.  */
506                     while (in_insn && GET_CODE (in_insn) != CODE_LABEL)
507                       {
508                         if ((GET_CODE (in_insn) == INSN
509                              || GET_CODE (in_insn) == JUMP_INSN)
510                             && find_regno_note (in_insn, REG_DEAD, dreg))
511                           {
512                             remove_death (dreg, in_insn);
513                             break;
514                           }
515                         in_insn = PREV_INSN (in_insn);
516                       }
517
518                     /* Delete the second load of the value.  */
519                     delete_insn (insn);
520                   }
521               }
522             else if (GET_CODE (body) == PARALLEL)
523               {
524                 /* If each part is a set between two identical registers or
525                    a USE or CLOBBER, delete the insn.  */
526                 int i, sreg, dreg;
527                 rtx tem;
528
529                 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
530                   {
531                     tem = XVECEXP (body, 0, i);
532                     if (GET_CODE (tem) == USE || GET_CODE (tem) == CLOBBER)
533                       continue;
534
535                     if (GET_CODE (tem) != SET
536                         || (sreg = true_regnum (SET_SRC (tem))) < 0
537                         || (dreg = true_regnum (SET_DEST (tem))) < 0
538                         || dreg != sreg)
539                       break;
540                   }
541                   
542                 if (i < 0)
543                   delete_insn (insn);
544               }
545             /* Also delete insns to store bit fields if they are no-ops.  */
546             /* Not worth the hair to detect this in the big-endian case.  */
547             else if (! BYTES_BIG_ENDIAN
548                      && GET_CODE (body) == SET
549                      && GET_CODE (SET_DEST (body)) == ZERO_EXTRACT
550                      && XEXP (SET_DEST (body), 2) == const0_rtx
551                      && XEXP (SET_DEST (body), 0) == SET_SRC (body)
552                      && ! (GET_CODE (SET_SRC (body)) == MEM
553                            && MEM_VOLATILE_P (SET_SRC (body))))
554               delete_insn (insn);
555           }
556       insn = next;
557     }
558
559   /* If we haven't yet gotten to reload and we have just run regscan,
560      delete any insn that sets a register that isn't used elsewhere.
561      This helps some of the optimizations below by having less insns
562      being jumped around.  */
563
564   if (! reload_completed && after_regscan)
565     for (insn = f; insn; insn = next)
566       {
567         rtx set = single_set (insn);
568
569         next = NEXT_INSN (insn);
570
571         if (set && GET_CODE (SET_DEST (set)) == REG
572             && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
573             && regno_first_uid[REGNO (SET_DEST (set))] == INSN_UID (insn)
574             /* We use regno_last_note_uid so as not to delete the setting
575                of a reg that's used in notes.  A subsequent optimization
576                might arrange to use that reg for real.  */             
577             && regno_last_note_uid[REGNO (SET_DEST (set))] == INSN_UID (insn)
578             && ! side_effects_p (SET_SRC (set))
579             && ! find_reg_note (insn, REG_RETVAL, 0))
580           delete_insn (insn);
581       }
582
583   /* Now iterate optimizing jumps until nothing changes over one pass.  */
584   changed = 1;
585   while (changed)
586     {
587       changed = 0;
588
589       for (insn = f; insn; insn = next)
590         {
591           rtx reallabelprev;
592           rtx temp, temp1, temp2, temp3, temp4, temp5, temp6;
593           rtx nlabel;
594           int this_is_simplejump, this_is_condjump, reversep;
595           int this_is_condjump_in_parallel;
596 #if 0
597           /* If NOT the first iteration, if this is the last jump pass
598              (just before final), do the special peephole optimizations.
599              Avoiding the first iteration gives ordinary jump opts
600              a chance to work before peephole opts.  */
601
602           if (reload_completed && !first && !flag_no_peephole)
603             if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
604               peephole (insn);
605 #endif
606
607           /* That could have deleted some insns after INSN, so check now
608              what the following insn is.  */
609
610           next = NEXT_INSN (insn);
611
612           /* See if this is a NOTE_INSN_LOOP_BEG followed by an unconditional
613              jump.  Try to optimize by duplicating the loop exit test if so.
614              This is only safe immediately after regscan, because it uses
615              the values of regno_first_uid and regno_last_uid.  */
616           if (after_regscan && GET_CODE (insn) == NOTE
617               && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
618               && (temp1 = next_nonnote_insn (insn)) != 0
619               && simplejump_p (temp1))
620             {
621               temp = PREV_INSN (insn);
622               if (duplicate_loop_exit_test (insn))
623                 {
624                   changed = 1;
625                   next = NEXT_INSN (temp);
626                   continue;
627                 }
628             }
629
630           if (GET_CODE (insn) != JUMP_INSN)
631             continue;
632
633           this_is_simplejump = simplejump_p (insn);
634           this_is_condjump = condjump_p (insn);
635           this_is_condjump_in_parallel = condjump_in_parallel_p (insn);
636
637           /* Tension the labels in dispatch tables.  */
638
639           if (GET_CODE (PATTERN (insn)) == ADDR_VEC)
640             changed |= tension_vector_labels (PATTERN (insn), 0);
641           if (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
642             changed |= tension_vector_labels (PATTERN (insn), 1);
643
644           /* If a dispatch table always goes to the same place,
645              get rid of it and replace the insn that uses it.  */
646
647           if (GET_CODE (PATTERN (insn)) == ADDR_VEC
648               || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
649             {
650               int i;
651               rtx pat = PATTERN (insn);
652               int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
653               int len = XVECLEN (pat, diff_vec_p);
654               rtx dispatch = prev_real_insn (insn);
655
656               for (i = 0; i < len; i++)
657                 if (XEXP (XVECEXP (pat, diff_vec_p, i), 0)
658                     != XEXP (XVECEXP (pat, diff_vec_p, 0), 0))
659                   break;
660               if (i == len
661                   && dispatch != 0
662                   && GET_CODE (dispatch) == JUMP_INSN
663                   && JUMP_LABEL (dispatch) != 0
664                   /* Don't mess with a casesi insn.  */
665                   && !(GET_CODE (PATTERN (dispatch)) == SET
666                        && (GET_CODE (SET_SRC (PATTERN (dispatch)))
667                            == IF_THEN_ELSE))
668                   && next_real_insn (JUMP_LABEL (dispatch)) == insn)
669                 {
670                   redirect_tablejump (dispatch,
671                                       XEXP (XVECEXP (pat, diff_vec_p, 0), 0));
672                   changed = 1;
673                 }
674             }
675
676           reallabelprev = prev_active_insn (JUMP_LABEL (insn));
677
678           /* If a jump references the end of the function, try to turn
679              it into a RETURN insn, possibly a conditional one.  */
680           if (JUMP_LABEL (insn)
681               && (next_active_insn (JUMP_LABEL (insn)) == 0
682                   || GET_CODE (PATTERN (next_active_insn (JUMP_LABEL (insn))))
683                       == RETURN))
684             changed |= redirect_jump (insn, NULL_RTX);
685
686           /* Detect jump to following insn.  */
687           if (reallabelprev == insn && condjump_p (insn))
688             {
689               next = next_real_insn (JUMP_LABEL (insn));
690               delete_jump (insn);
691               changed = 1;
692               continue;
693             }
694
695           /* If we have an unconditional jump preceded by a USE, try to put
696              the USE before the target and jump there.  This simplifies many
697              of the optimizations below since we don't have to worry about
698              dealing with these USE insns.  We only do this if the label
699              being branch to already has the identical USE or if code
700              never falls through to that label.  */
701
702           if (this_is_simplejump
703               && (temp = prev_nonnote_insn (insn)) != 0
704               && GET_CODE (temp) == INSN && GET_CODE (PATTERN (temp)) == USE
705               && (temp1 = prev_nonnote_insn (JUMP_LABEL (insn))) != 0
706               && (GET_CODE (temp1) == BARRIER
707                   || (GET_CODE (temp1) == INSN
708                       && rtx_equal_p (PATTERN (temp), PATTERN (temp1))))
709               /* Don't do this optimization if we have a loop containing only
710                  the USE instruction, and the loop start label has a usage
711                  count of 1.  This is because we will redo this optimization
712                  everytime through the outer loop, and jump opt will never
713                  exit.  */
714               && ! ((temp2 = prev_nonnote_insn (temp)) != 0
715                     && temp2 == JUMP_LABEL (insn)
716                     && LABEL_NUSES (temp2) == 1))
717             {
718               if (GET_CODE (temp1) == BARRIER)
719                 {
720                   emit_insn_after (PATTERN (temp), temp1);
721                   temp1 = NEXT_INSN (temp1);
722                 }
723
724               delete_insn (temp);
725               redirect_jump (insn, get_label_before (temp1));
726               reallabelprev = prev_real_insn (temp1);
727               changed = 1;
728             }
729
730           /* Simplify   if (...) x = a; else x = b; by converting it
731              to         x = b; if (...) x = a;
732              if B is sufficiently simple, the test doesn't involve X,
733              and nothing in the test modifies B or X.
734
735              If we have small register classes, we also can't do this if X
736              is a hard register.
737
738              If the "x = b;" insn has any REG_NOTES, we don't do this because
739              of the possibility that we are running after CSE and there is a
740              REG_EQUAL note that is only valid if the branch has already been
741              taken.  If we move the insn with the REG_EQUAL note, we may
742              fold the comparison to always be false in a later CSE pass.
743              (We could also delete the REG_NOTES when moving the insn, but it
744              seems simpler to not move it.)  An exception is that we can move
745              the insn if the only note is a REG_EQUAL or REG_EQUIV whose
746              value is the same as "b".
747
748              INSN is the branch over the `else' part. 
749
750              We set:
751
752              TEMP to the jump insn preceding "x = a;"
753              TEMP1 to X
754              TEMP2 to the insn that sets "x = b;"
755              TEMP3 to the insn that sets "x = a;"
756              TEMP4 to the set of "x = b";  */
757
758           if (this_is_simplejump
759               && (temp3 = prev_active_insn (insn)) != 0
760               && GET_CODE (temp3) == INSN
761               && (temp4 = single_set (temp3)) != 0
762               && GET_CODE (temp1 = SET_DEST (temp4)) == REG
763 #ifdef SMALL_REGISTER_CLASSES
764               && REGNO (temp1) >= FIRST_PSEUDO_REGISTER
765 #endif
766               && (temp2 = next_active_insn (insn)) != 0
767               && GET_CODE (temp2) == INSN
768               && (temp4 = single_set (temp2)) != 0
769               && rtx_equal_p (SET_DEST (temp4), temp1)
770               && (GET_CODE (SET_SRC (temp4)) == REG
771                   || GET_CODE (SET_SRC (temp4)) == SUBREG
772                   || CONSTANT_P (SET_SRC (temp4)))
773               && (REG_NOTES (temp2) == 0
774                   || ((REG_NOTE_KIND (REG_NOTES (temp2)) == REG_EQUAL
775                        || REG_NOTE_KIND (REG_NOTES (temp2)) == REG_EQUIV)
776                       && XEXP (REG_NOTES (temp2), 1) == 0
777                       && rtx_equal_p (XEXP (REG_NOTES (temp2), 0),
778                                       SET_SRC (temp4))))
779               && (temp = prev_active_insn (temp3)) != 0
780               && condjump_p (temp) && ! simplejump_p (temp)
781               /* TEMP must skip over the "x = a;" insn */
782               && prev_real_insn (JUMP_LABEL (temp)) == insn
783               && no_labels_between_p (insn, JUMP_LABEL (temp))
784               /* There must be no other entries to the "x = b;" insn.  */
785               && no_labels_between_p (JUMP_LABEL (temp), temp2)
786               /* INSN must either branch to the insn after TEMP2 or the insn
787                  after TEMP2 must branch to the same place as INSN.  */
788               && (reallabelprev == temp2
789                   || ((temp5 = next_active_insn (temp2)) != 0
790                       && simplejump_p (temp5)
791                       && JUMP_LABEL (temp5) == JUMP_LABEL (insn))))
792             {
793               /* The test expression, X, may be a complicated test with
794                  multiple branches.  See if we can find all the uses of
795                  the label that TEMP branches to without hitting a CALL_INSN
796                  or a jump to somewhere else.  */
797               rtx target = JUMP_LABEL (temp);
798               int nuses = LABEL_NUSES (target);
799               rtx p, q;
800
801               /* Set P to the first jump insn that goes around "x = a;".  */
802               for (p = temp; nuses && p; p = prev_nonnote_insn (p))
803                 {
804                   if (GET_CODE (p) == JUMP_INSN)
805                     {
806                       if (condjump_p (p) && ! simplejump_p (p)
807                           && JUMP_LABEL (p) == target)
808                         {
809                           nuses--;
810                           if (nuses == 0)
811                             break;
812                         }
813                       else
814                         break;
815                     }
816                   else if (GET_CODE (p) == CALL_INSN)
817                     break;
818                 }
819
820 #ifdef HAVE_cc0
821               /* We cannot insert anything between a set of cc and its use
822                  so if P uses cc0, we must back up to the previous insn.  */
823               q = prev_nonnote_insn (p);
824               if (q && GET_RTX_CLASS (GET_CODE (q)) == 'i'
825                   && sets_cc0_p (PATTERN (q)))
826                 p = q;
827 #endif
828
829               if (p)
830                 p = PREV_INSN (p);
831
832               /* If we found all the uses and there was no data conflict, we
833                  can move the assignment unless we can branch into the middle
834                  from somewhere.  */
835               if (nuses == 0 && p
836                   && no_labels_between_p (p, insn)
837                   && ! reg_referenced_between_p (temp1, p, NEXT_INSN (temp3))
838                   && ! reg_set_between_p (temp1, p, temp3)
839                   && (GET_CODE (SET_SRC (temp4)) == CONST_INT
840                       || ! reg_set_between_p (SET_SRC (temp4), p, temp2)))
841                 {
842                   emit_insn_after_with_line_notes (PATTERN (temp2), p, temp2);
843                   delete_insn (temp2);
844
845                   /* Set NEXT to an insn that we know won't go away.  */
846                   next = next_active_insn (insn);
847
848                   /* Delete the jump around the set.  Note that we must do
849                      this before we redirect the test jumps so that it won't
850                      delete the code immediately following the assignment
851                      we moved (which might be a jump).  */
852
853                   delete_insn (insn);
854
855                   /* We either have two consecutive labels or a jump to
856                      a jump, so adjust all the JUMP_INSNs to branch to where
857                      INSN branches to.  */
858                   for (p = NEXT_INSN (p); p != next; p = NEXT_INSN (p))
859                     if (GET_CODE (p) == JUMP_INSN)
860                       redirect_jump (p, target);
861
862                   changed = 1;
863                   continue;
864                 }
865             }
866
867           /* Simplify   if (...) { x = a; goto l; } x = b; by converting it
868              to         x = a; if (...) goto l; x = b;
869              if A is sufficiently simple, the test doesn't involve X,
870              and nothing in the test modifies A or X.
871
872              If we have small register classes, we also can't do this if X
873              is a hard register.
874
875              If the "x = a;" insn has any REG_NOTES, we don't do this because
876              of the possibility that we are running after CSE and there is a
877              REG_EQUAL note that is only valid if the branch has already been
878              taken.  If we move the insn with the REG_EQUAL note, we may
879              fold the comparison to always be false in a later CSE pass.
880              (We could also delete the REG_NOTES when moving the insn, but it
881              seems simpler to not move it.)  An exception is that we can move
882              the insn if the only note is a REG_EQUAL or REG_EQUIV whose
883              value is the same as "a".
884
885              INSN is the goto.
886
887              We set:
888
889              TEMP to the jump insn preceding "x = a;"
890              TEMP1 to X
891              TEMP2 to the insn that sets "x = b;"
892              TEMP3 to the insn that sets "x = a;"
893              TEMP4 to the set of "x = a";  */
894
895           if (this_is_simplejump
896               && (temp2 = next_active_insn (insn)) != 0
897               && GET_CODE (temp2) == INSN
898               && (temp4 = single_set (temp2)) != 0
899               && GET_CODE (temp1 = SET_DEST (temp4)) == REG
900 #ifdef SMALL_REGISTER_CLASSES
901               && REGNO (temp1) >= FIRST_PSEUDO_REGISTER
902 #endif
903
904               && (temp3 = prev_active_insn (insn)) != 0
905               && GET_CODE (temp3) == INSN
906               && (temp4 = single_set (temp3)) != 0
907               && rtx_equal_p (SET_DEST (temp4), temp1)
908               && (GET_CODE (SET_SRC (temp4)) == REG
909                   || GET_CODE (SET_SRC (temp4)) == SUBREG
910                   || CONSTANT_P (SET_SRC (temp4)))
911               && (REG_NOTES (temp3) == 0
912                   || ((REG_NOTE_KIND (REG_NOTES (temp3)) == REG_EQUAL
913                        || REG_NOTE_KIND (REG_NOTES (temp3)) == REG_EQUIV)
914                       && XEXP (REG_NOTES (temp3), 1) == 0
915                       && rtx_equal_p (XEXP (REG_NOTES (temp3), 0),
916                                       SET_SRC (temp4))))
917               && (temp = prev_active_insn (temp3)) != 0
918               && condjump_p (temp) && ! simplejump_p (temp)
919               /* TEMP must skip over the "x = a;" insn */
920               && prev_real_insn (JUMP_LABEL (temp)) == insn
921               && no_labels_between_p (temp, insn))
922             {
923               rtx prev_label = JUMP_LABEL (temp);
924               rtx insert_after = prev_nonnote_insn (temp);
925
926 #ifdef HAVE_cc0
927               /* We cannot insert anything between a set of cc and its use.  */
928               if (insert_after && GET_RTX_CLASS (GET_CODE (insert_after)) == 'i'
929                   && sets_cc0_p (PATTERN (insert_after)))
930                 insert_after = prev_nonnote_insn (insert_after);
931 #endif
932               ++LABEL_NUSES (prev_label);
933
934               if (insert_after
935                   && no_labels_between_p (insert_after, temp)
936                   && ! reg_referenced_between_p (temp1, insert_after, temp3)
937                   && ! reg_referenced_between_p (temp1, temp3,
938                                                  NEXT_INSN (temp2))
939                   && ! reg_set_between_p (temp1, insert_after, temp)
940                   && (GET_CODE (SET_SRC (temp4)) == CONST_INT
941                       || ! reg_set_between_p (SET_SRC (temp4),
942                                               insert_after, temp))
943                   && invert_jump (temp, JUMP_LABEL (insn)))
944                 {
945                   emit_insn_after_with_line_notes (PATTERN (temp3),
946                                                    insert_after, temp3);
947                   delete_insn (temp3);
948                   delete_insn (insn);
949                   /* Set NEXT to an insn that we know won't go away.  */
950                   next = temp2;
951                   changed = 1;
952                 }
953               if (prev_label && --LABEL_NUSES (prev_label) == 0)
954                 delete_insn (prev_label);
955               if (changed)
956                 continue;
957             }
958
959 #ifndef HAVE_cc0
960           /* If we have if (...) x = exp;  and branches are expensive,
961              EXP is a single insn, does not have any side effects, cannot
962              trap, and is not too costly, convert this to
963              t = exp; if (...) x = t;
964
965              Don't do this when we have CC0 because it is unlikely to help
966              and we'd need to worry about where to place the new insn and
967              the potential for conflicts.  We also can't do this when we have
968              notes on the insn for the same reason as above.
969
970              We set:
971
972              TEMP to the "x = exp;" insn.
973              TEMP1 to the single set in the "x = exp; insn.
974              TEMP2 to "x".  */
975
976           if (! reload_completed
977               && this_is_condjump && ! this_is_simplejump
978               && BRANCH_COST >= 3
979               && (temp = next_nonnote_insn (insn)) != 0
980               && GET_CODE (temp) == INSN
981               && REG_NOTES (temp) == 0
982               && (reallabelprev == temp
983                   || ((temp2 = next_active_insn (temp)) != 0
984                       && simplejump_p (temp2)
985                       && JUMP_LABEL (temp2) == JUMP_LABEL (insn)))
986               && (temp1 = single_set (temp)) != 0
987               && (temp2 = SET_DEST (temp1), GET_CODE (temp2) == REG)
988               && GET_MODE_CLASS (GET_MODE (temp2)) == MODE_INT
989 #ifdef SMALL_REGISTER_CLASSES
990               && REGNO (temp2) >= FIRST_PSEUDO_REGISTER
991 #endif
992               && GET_CODE (SET_SRC (temp1)) != REG
993               && GET_CODE (SET_SRC (temp1)) != SUBREG
994               && GET_CODE (SET_SRC (temp1)) != CONST_INT
995               && ! side_effects_p (SET_SRC (temp1))
996               && ! may_trap_p (SET_SRC (temp1))
997               && rtx_cost (SET_SRC (temp1), SET) < 10)
998             {
999               rtx new = gen_reg_rtx (GET_MODE (temp2));
1000
1001               if (validate_change (temp, &SET_DEST (temp1), new, 0))
1002                 {
1003                   next = emit_insn_after (gen_move_insn (temp2, new), insn);
1004                   emit_insn_after_with_line_notes (PATTERN (temp), 
1005                                                    PREV_INSN (insn), temp);
1006                   delete_insn (temp);
1007                   reallabelprev = prev_active_insn (JUMP_LABEL (insn));
1008                 }
1009             }
1010
1011           /* Similarly, if it takes two insns to compute EXP but they
1012              have the same destination.  Here TEMP3 will be the second
1013              insn and TEMP4 the SET from that insn.  */
1014
1015           if (! reload_completed
1016               && this_is_condjump && ! this_is_simplejump
1017               && BRANCH_COST >= 4
1018               && (temp = next_nonnote_insn (insn)) != 0
1019               && GET_CODE (temp) == INSN
1020               && REG_NOTES (temp) == 0
1021               && (temp3 = next_nonnote_insn (temp)) != 0
1022               && GET_CODE (temp3) == INSN
1023               && REG_NOTES (temp3) == 0
1024               && (reallabelprev == temp3
1025                   || ((temp2 = next_active_insn (temp3)) != 0
1026                       && simplejump_p (temp2)
1027                       && JUMP_LABEL (temp2) == JUMP_LABEL (insn)))
1028               && (temp1 = single_set (temp)) != 0
1029               && (temp2 = SET_DEST (temp1), GET_CODE (temp2) == REG)
1030               && GET_MODE_CLASS (GET_MODE (temp2)) == MODE_INT
1031 #ifdef SMALL_REGISTER_CLASSES
1032               && REGNO (temp2) >= FIRST_PSEUDO_REGISTER
1033 #endif
1034               && ! side_effects_p (SET_SRC (temp1))
1035               && ! may_trap_p (SET_SRC (temp1))
1036               && rtx_cost (SET_SRC (temp1), SET) < 10
1037               && (temp4 = single_set (temp3)) != 0
1038               && rtx_equal_p (SET_DEST (temp4), temp2)
1039               && ! side_effects_p (SET_SRC (temp4))
1040               && ! may_trap_p (SET_SRC (temp4))
1041               && rtx_cost (SET_SRC (temp4), SET) < 10)
1042             {
1043               rtx new = gen_reg_rtx (GET_MODE (temp2));
1044
1045               if (validate_change (temp, &SET_DEST (temp1), new, 0))
1046                 {
1047                   next = emit_insn_after (gen_move_insn (temp2, new), insn);
1048                   emit_insn_after_with_line_notes (PATTERN (temp),
1049                                                    PREV_INSN (insn), temp);
1050                   emit_insn_after_with_line_notes
1051                     (replace_rtx (PATTERN (temp3), temp2, new),
1052                      PREV_INSN (insn), temp3);
1053                   delete_insn (temp);
1054                   delete_insn (temp3);
1055                   reallabelprev = prev_active_insn (JUMP_LABEL (insn));
1056                 }
1057             }
1058
1059           /* Finally, handle the case where two insns are used to 
1060              compute EXP but a temporary register is used.  Here we must
1061              ensure that the temporary register is not used anywhere else.  */
1062
1063           if (! reload_completed
1064               && after_regscan
1065               && this_is_condjump && ! this_is_simplejump
1066               && BRANCH_COST >= 4
1067               && (temp = next_nonnote_insn (insn)) != 0
1068               && GET_CODE (temp) == INSN
1069               && REG_NOTES (temp) == 0
1070               && (temp3 = next_nonnote_insn (temp)) != 0
1071               && GET_CODE (temp3) == INSN
1072               && REG_NOTES (temp3) == 0
1073               && (reallabelprev == temp3
1074                   || ((temp2 = next_active_insn (temp3)) != 0
1075                       && simplejump_p (temp2)
1076                       && JUMP_LABEL (temp2) == JUMP_LABEL (insn)))
1077               && (temp1 = single_set (temp)) != 0
1078               && (temp5 = SET_DEST (temp1),
1079                   (GET_CODE (temp5) == REG
1080                    || (GET_CODE (temp5) == SUBREG
1081                        && (temp5 = SUBREG_REG (temp5),
1082                            GET_CODE (temp5) == REG))))
1083               && REGNO (temp5) >= FIRST_PSEUDO_REGISTER
1084               && regno_first_uid[REGNO (temp5)] == INSN_UID (temp)
1085               && regno_last_uid[REGNO (temp5)] == INSN_UID (temp3)
1086               && ! side_effects_p (SET_SRC (temp1))
1087               && ! may_trap_p (SET_SRC (temp1))
1088               && rtx_cost (SET_SRC (temp1), SET) < 10
1089               && (temp4 = single_set (temp3)) != 0
1090               && (temp2 = SET_DEST (temp4), GET_CODE (temp2) == REG)
1091               && GET_MODE_CLASS (GET_MODE (temp2)) == MODE_INT
1092 #ifdef SMALL_REGISTER_CLASSES
1093               && REGNO (temp2) >= FIRST_PSEUDO_REGISTER
1094 #endif
1095               && rtx_equal_p (SET_DEST (temp4), temp2)
1096               && ! side_effects_p (SET_SRC (temp4))
1097               && ! may_trap_p (SET_SRC (temp4))
1098               && rtx_cost (SET_SRC (temp4), SET) < 10)
1099             {
1100               rtx new = gen_reg_rtx (GET_MODE (temp2));
1101
1102               if (validate_change (temp3, &SET_DEST (temp4), new, 0))
1103                 {
1104                   next = emit_insn_after (gen_move_insn (temp2, new), insn);
1105                   emit_insn_after_with_line_notes (PATTERN (temp),
1106                                                    PREV_INSN (insn), temp);
1107                   emit_insn_after_with_line_notes (PATTERN (temp3),
1108                                                    PREV_INSN (insn), temp3);
1109                   delete_insn (temp);
1110                   delete_insn (temp3);
1111                   reallabelprev = prev_active_insn (JUMP_LABEL (insn));
1112                 }
1113             }
1114 #endif /* HAVE_cc0 */
1115
1116           /* Try to use a conditional move (if the target has them), or a
1117              store-flag insn.  The general case is:
1118
1119              1) x = a; if (...) x = b; and
1120              2) if (...) x = b;
1121
1122              If the jump would be faster, the machine should not have defined
1123              the movcc or scc insns!.  These cases are often made by the
1124              previous optimization.
1125
1126              The second case is treated as  x = x; if (...) x = b;.
1127
1128              INSN here is the jump around the store.  We set:
1129
1130              TEMP to the "x = b;" insn.
1131              TEMP1 to X.
1132              TEMP2 to B.
1133              TEMP3 to A (X in the second case).
1134              TEMP4 to the condition being tested.
1135              TEMP5 to the earliest insn used to find the condition.  */
1136
1137           if (/* We can't do this after reload has completed.  */
1138               ! reload_completed
1139               && this_is_condjump && ! this_is_simplejump
1140               /* Set TEMP to the "x = b;" insn.  */
1141               && (temp = next_nonnote_insn (insn)) != 0
1142               && GET_CODE (temp) == INSN
1143               && GET_CODE (PATTERN (temp)) == SET
1144               && GET_CODE (temp1 = SET_DEST (PATTERN (temp))) == REG
1145 #ifdef SMALL_REGISTER_CLASSES
1146               && REGNO (temp1) >= FIRST_PSEUDO_REGISTER
1147 #endif
1148               && (GET_CODE (temp2 = SET_SRC (PATTERN (temp))) == REG
1149                   || GET_CODE (temp2) == SUBREG
1150                   /* ??? How about floating point constants?  */
1151                   || GET_CODE (temp2) == CONST_INT)
1152               /* Allow either form, but prefer the former if both apply. 
1153                  There is no point in using the old value of TEMP1 if
1154                  it is a register, since cse will alias them.  It can
1155                  lose if the old value were a hard register since CSE
1156                  won't replace hard registers.  */
1157               && (((temp3 = reg_set_last (temp1, insn)) != 0)
1158                   /* Make the latter case look like  x = x; if (...) x = b;  */
1159                   || (temp3 = temp1, 1))
1160               /* INSN must either branch to the insn after TEMP or the insn
1161                  after TEMP must branch to the same place as INSN.  */
1162               && (reallabelprev == temp
1163                   || ((temp4 = next_active_insn (temp)) != 0
1164                       && simplejump_p (temp4)
1165                       && JUMP_LABEL (temp4) == JUMP_LABEL (insn)))
1166               && (temp4 = get_condition (insn, &temp5)) != 0
1167               /* We must be comparing objects whose modes imply the size.
1168                  We could handle BLKmode if (1) emit_store_flag could
1169                  and (2) we could find the size reliably.  */
1170               && GET_MODE (XEXP (temp4, 0)) != BLKmode
1171               /* Even if branches are cheap, the store_flag optimization
1172                  can win when the operation to be performed can be
1173                  expressed directly.  */
1174 #ifdef HAVE_cc0
1175               /* If the previous insn sets CC0 and something else, we can't
1176                  do this since we are going to delete that insn.  */
1177
1178               && ! ((temp6 = prev_nonnote_insn (insn)) != 0
1179                     && GET_CODE (temp6) == INSN
1180                     && (sets_cc0_p (PATTERN (temp6)) == -1
1181                         || (sets_cc0_p (PATTERN (temp6)) == 1
1182                             && FIND_REG_INC_NOTE (temp6, NULL_RTX))))
1183 #endif
1184               )
1185             {
1186 #ifdef HAVE_conditional_move
1187               /* First try a conditional move.  */
1188               {
1189                 enum rtx_code code = GET_CODE (temp4);
1190                 rtx var = temp1;
1191                 rtx cond0, cond1, aval, bval;
1192                 rtx target;
1193
1194                 /* Copy the compared variables into cond0 and cond1, so that
1195                    any side effects performed in or after the old comparison,
1196                    will not affect our compare which will come later.  */
1197                 /* ??? Is it possible to just use the comparison in the jump
1198                    insn?  After all, we're going to delete it.  We'd have
1199                    to modify emit_conditional_move to take a comparison rtx
1200                    instead or write a new function.  */
1201                 cond0 = gen_reg_rtx (GET_MODE (XEXP (temp4, 0)));
1202                 /* We want the target to be able to simplify comparisons with
1203                    zero (and maybe other constants as well), so don't create
1204                    pseudos for them.  There's no need to either.  */
1205                 if (GET_CODE (XEXP (temp4, 1)) == CONST_INT
1206                     || GET_CODE (XEXP (temp4, 1)) == CONST_DOUBLE)
1207                   cond1 = XEXP (temp4, 1);
1208                 else
1209                   cond1 = gen_reg_rtx (GET_MODE (XEXP (temp4, 1)));
1210
1211                 aval = temp3;
1212                 bval = temp2;
1213
1214                 start_sequence ();
1215                 target = emit_conditional_move (var, code,
1216                                                 cond0, cond1, VOIDmode,
1217                                                 aval, bval, GET_MODE (var),
1218                                                 (code == LTU || code == GEU
1219                                                  || code == LEU || code == GTU));
1220
1221                 if (target)
1222                   {
1223                     rtx seq1,seq2;
1224
1225                     /* Save the conditional move sequence but don't emit it
1226                        yet.  On some machines, like the alpha, it is possible
1227                        that temp5 == insn, so next generate the sequence that
1228                        saves the compared values and then emit both
1229                        sequences ensuring seq1 occurs before seq2.  */
1230                     seq2 = get_insns ();
1231                     end_sequence ();
1232
1233                     /* Now that we can't fail, generate the copy insns that
1234                        preserve the compared values.  */
1235                     start_sequence ();
1236                     emit_move_insn (cond0, XEXP (temp4, 0));
1237                     if (cond1 != XEXP (temp4, 1))
1238                       emit_move_insn (cond1, XEXP (temp4, 1));
1239                     seq1 = get_insns ();
1240                     end_sequence ();
1241
1242                     emit_insns_before (seq1, temp5);
1243                     /* Insert conditional move after insn, to be sure that
1244                        the jump and a possible compare won't be separated */
1245                     emit_insns_after (seq2, insn);
1246
1247                     /* ??? We can also delete the insn that sets X to A.
1248                        Flow will do it too though.  */
1249                     delete_insn (temp);
1250                     next = NEXT_INSN (insn);
1251                     delete_jump (insn);
1252                     changed = 1;
1253                     continue;
1254                   }
1255                 else
1256                   end_sequence ();
1257               }
1258 #endif
1259
1260               /* That didn't work, try a store-flag insn.
1261
1262                  We further divide the cases into:
1263
1264                  1) x = a; if (...) x = b; and either A or B is zero,
1265                  2) if (...) x = 0; and jumps are expensive,
1266                  3) x = a; if (...) x = b; and A and B are constants where all
1267                  the set bits in A are also set in B and jumps are expensive,
1268                  4) x = a; if (...) x = b; and A and B non-zero, and jumps are
1269                  more expensive, and
1270                  5) if (...) x = b; if jumps are even more expensive.  */
1271
1272               if (GET_MODE_CLASS (GET_MODE (temp1)) == MODE_INT
1273                   && ((GET_CODE (temp3) == CONST_INT)
1274                       /* Make the latter case look like
1275                          x = x; if (...) x = 0;  */
1276                       || (temp3 = temp1,
1277                           ((BRANCH_COST >= 2
1278                             && temp2 == const0_rtx)
1279                            || BRANCH_COST >= 3)))
1280                   /* If B is zero, OK; if A is zero, can only do (1) if we
1281                      can reverse the condition.  See if (3) applies possibly
1282                      by reversing the condition.  Prefer reversing to (4) when
1283                      branches are very expensive.  */
1284                   && (((BRANCH_COST >= 2
1285                         || STORE_FLAG_VALUE == -1
1286                         || (STORE_FLAG_VALUE == 1
1287                          /* Check that the mask is a power of two,
1288                             so that it can probably be generated
1289                             with a shift.  */
1290                             && exact_log2 (INTVAL (temp3)) >= 0))
1291                        && (reversep = 0, temp2 == const0_rtx))
1292                       || ((BRANCH_COST >= 2
1293                            || STORE_FLAG_VALUE == -1
1294                            || (STORE_FLAG_VALUE == 1
1295                                && exact_log2 (INTVAL (temp2)) >= 0))
1296                           && temp3 == const0_rtx
1297                           && (reversep = can_reverse_comparison_p (temp4, insn)))
1298                       || (BRANCH_COST >= 2
1299                           && GET_CODE (temp2) == CONST_INT
1300                           && GET_CODE (temp3) == CONST_INT
1301                           && ((INTVAL (temp2) & INTVAL (temp3)) == INTVAL (temp2)
1302                               || ((INTVAL (temp2) & INTVAL (temp3)) == INTVAL (temp3)
1303                                   && (reversep = can_reverse_comparison_p (temp4,
1304                                                                            insn)))))
1305                       || BRANCH_COST >= 3)
1306                   )
1307                 {
1308                   enum rtx_code code = GET_CODE (temp4);
1309                   rtx uval, cval, var = temp1;
1310                   int normalizep;
1311                   rtx target;
1312
1313                   /* If necessary, reverse the condition.  */
1314                   if (reversep)
1315                     code = reverse_condition (code), uval = temp2, cval = temp3;
1316                   else
1317                     uval = temp3, cval = temp2;
1318
1319                   /* If CVAL is non-zero, normalize to -1.  Otherwise, if UVAL
1320                      is the constant 1, it is best to just compute the result
1321                      directly.  If UVAL is constant and STORE_FLAG_VALUE
1322                      includes all of its bits, it is best to compute the flag
1323                      value unnormalized and `and' it with UVAL.  Otherwise,
1324                      normalize to -1 and `and' with UVAL.  */
1325                   normalizep = (cval != const0_rtx ? -1
1326                                 : (uval == const1_rtx ? 1
1327                                    : (GET_CODE (uval) == CONST_INT
1328                                       && (INTVAL (uval) & ~STORE_FLAG_VALUE) == 0)
1329                                    ? 0 : -1));
1330
1331                   /* We will be putting the store-flag insn immediately in
1332                      front of the comparison that was originally being done,
1333                      so we know all the variables in TEMP4 will be valid.
1334                      However, this might be in front of the assignment of
1335                      A to VAR.  If it is, it would clobber the store-flag
1336                      we will be emitting.
1337
1338                      Therefore, emit into a temporary which will be copied to
1339                      VAR immediately after TEMP.  */
1340
1341                   start_sequence ();
1342                   target = emit_store_flag (gen_reg_rtx (GET_MODE (var)), code,
1343                                             XEXP (temp4, 0), XEXP (temp4, 1),
1344                                             VOIDmode,
1345                                             (code == LTU || code == LEU 
1346                                              || code == GEU || code == GTU),
1347                                             normalizep);
1348                   if (target)
1349                     {
1350                       rtx seq;
1351                       rtx before = insn;
1352
1353                       seq = get_insns ();
1354                       end_sequence ();
1355
1356                       /* Put the store-flag insns in front of the first insn
1357                          used to compute the condition to ensure that we
1358                          use the same values of them as the current 
1359                          comparison.  However, the remainder of the insns we
1360                          generate will be placed directly in front of the
1361                          jump insn, in case any of the pseudos we use
1362                          are modified earlier.  */
1363
1364                       emit_insns_before (seq, temp5);
1365
1366                       start_sequence ();
1367
1368                       /* Both CVAL and UVAL are non-zero.  */
1369                       if (cval != const0_rtx && uval != const0_rtx)
1370                         {
1371                           rtx tem1, tem2;
1372
1373                           tem1 = expand_and (uval, target, NULL_RTX);
1374                           if (GET_CODE (cval) == CONST_INT
1375                               && GET_CODE (uval) == CONST_INT
1376                               && (INTVAL (cval) & INTVAL (uval)) == INTVAL (cval))
1377                             tem2 = cval;
1378                           else
1379                             {
1380                               tem2 = expand_unop (GET_MODE (var), one_cmpl_optab,
1381                                                   target, NULL_RTX, 0);
1382                               tem2 = expand_and (cval, tem2,
1383                                                  (GET_CODE (tem2) == REG
1384                                                   ? tem2 : 0));
1385                             }
1386
1387                           /* If we usually make new pseudos, do so here.  This
1388                              turns out to help machines that have conditional
1389                              move insns.  */
1390                           /* ??? Conditional moves have already been handled.
1391                              This may be obsolete.  */
1392
1393                           if (flag_expensive_optimizations)
1394                             target = 0;
1395
1396                           target = expand_binop (GET_MODE (var), ior_optab,
1397                                                  tem1, tem2, target,
1398                                                  1, OPTAB_WIDEN);
1399                         }
1400                       else if (normalizep != 1)
1401                         {
1402                           /* We know that either CVAL or UVAL is zero.  If
1403                              UVAL is zero, negate TARGET and `and' with CVAL.
1404                              Otherwise, `and' with UVAL.  */
1405                           if (uval == const0_rtx)
1406                             {
1407                               target = expand_unop (GET_MODE (var), one_cmpl_optab,
1408                                                     target, NULL_RTX, 0);
1409                               uval = cval;
1410                             }
1411
1412                           target = expand_and (uval, target,
1413                                                (GET_CODE (target) == REG
1414                                                 && ! preserve_subexpressions_p ()
1415                                                 ? target : NULL_RTX));
1416                         }
1417                   
1418                       emit_move_insn (var, target);
1419                       seq = get_insns ();
1420                       end_sequence ();
1421 #ifdef HAVE_cc0
1422                       /* If INSN uses CC0, we must not separate it from the
1423                          insn that sets cc0.  */
1424                       if (reg_mentioned_p (cc0_rtx, PATTERN (before)))
1425                         before = prev_nonnote_insn (before);
1426 #endif
1427                       emit_insns_before (seq, before);
1428
1429                       delete_insn (temp);
1430                       next = NEXT_INSN (insn);
1431                       delete_jump (insn);
1432                       changed = 1;
1433                       continue;
1434                     }
1435                   else
1436                     end_sequence ();
1437                 }
1438             }
1439
1440           /* If branches are expensive, convert
1441                 if (foo) bar++;    to    bar += (foo != 0);
1442              and similarly for "bar--;" 
1443
1444              INSN is the conditional branch around the arithmetic.  We set:
1445
1446              TEMP is the arithmetic insn.
1447              TEMP1 is the SET doing the arithmetic.
1448              TEMP2 is the operand being incremented or decremented.
1449              TEMP3 to the condition being tested.
1450              TEMP4 to the earliest insn used to find the condition.  */
1451
1452           if ((BRANCH_COST >= 2
1453 #ifdef HAVE_incscc
1454                || HAVE_incscc
1455 #endif
1456 #ifdef HAVE_decscc
1457                || HAVE_decscc
1458 #endif
1459               )
1460               && ! reload_completed
1461               && this_is_condjump && ! this_is_simplejump
1462               && (temp = next_nonnote_insn (insn)) != 0
1463               && (temp1 = single_set (temp)) != 0
1464               && (temp2 = SET_DEST (temp1),
1465                   GET_MODE_CLASS (GET_MODE (temp2)) == MODE_INT)
1466               && GET_CODE (SET_SRC (temp1)) == PLUS
1467               && (XEXP (SET_SRC (temp1), 1) == const1_rtx
1468                   || XEXP (SET_SRC (temp1), 1) == constm1_rtx)
1469               && rtx_equal_p (temp2, XEXP (SET_SRC (temp1), 0))
1470               && ! side_effects_p (temp2)
1471               && ! may_trap_p (temp2)
1472               /* INSN must either branch to the insn after TEMP or the insn
1473                  after TEMP must branch to the same place as INSN.  */
1474               && (reallabelprev == temp
1475                   || ((temp3 = next_active_insn (temp)) != 0
1476                       && simplejump_p (temp3)
1477                       && JUMP_LABEL (temp3) == JUMP_LABEL (insn)))
1478               && (temp3 = get_condition (insn, &temp4)) != 0
1479               /* We must be comparing objects whose modes imply the size.
1480                  We could handle BLKmode if (1) emit_store_flag could
1481                  and (2) we could find the size reliably.  */
1482               && GET_MODE (XEXP (temp3, 0)) != BLKmode
1483               && can_reverse_comparison_p (temp3, insn))
1484             {
1485               rtx temp6, target = 0, seq, init_insn = 0, init = temp2;
1486               enum rtx_code code = reverse_condition (GET_CODE (temp3));
1487
1488               start_sequence ();
1489
1490               /* It must be the case that TEMP2 is not modified in the range
1491                  [TEMP4, INSN).  The one exception we make is if the insn
1492                  before INSN sets TEMP2 to something which is also unchanged
1493                  in that range.  In that case, we can move the initialization
1494                  into our sequence.  */
1495
1496               if ((temp5 = prev_active_insn (insn)) != 0
1497                   && no_labels_between_p (temp5, insn)
1498                   && GET_CODE (temp5) == INSN
1499                   && (temp6 = single_set (temp5)) != 0
1500                   && rtx_equal_p (temp2, SET_DEST (temp6))
1501                   && (CONSTANT_P (SET_SRC (temp6))
1502                       || GET_CODE (SET_SRC (temp6)) == REG
1503                       || GET_CODE (SET_SRC (temp6)) == SUBREG))
1504                 {
1505                   emit_insn (PATTERN (temp5));
1506                   init_insn = temp5;
1507                   init = SET_SRC (temp6);
1508                 }
1509
1510               if (CONSTANT_P (init)
1511                   || ! reg_set_between_p (init, PREV_INSN (temp4), insn))
1512                 target = emit_store_flag (gen_reg_rtx (GET_MODE (temp2)), code,
1513                                           XEXP (temp3, 0), XEXP (temp3, 1),
1514                                           VOIDmode,
1515                                           (code == LTU || code == LEU
1516                                            || code == GTU || code == GEU), 1);
1517
1518               /* If we can do the store-flag, do the addition or
1519                  subtraction.  */
1520
1521               if (target)
1522                 target = expand_binop (GET_MODE (temp2),
1523                                        (XEXP (SET_SRC (temp1), 1) == const1_rtx
1524                                         ? add_optab : sub_optab),
1525                                        temp2, target, temp2, 0, OPTAB_WIDEN);
1526
1527               if (target != 0)
1528                 {
1529                   /* Put the result back in temp2 in case it isn't already.
1530                      Then replace the jump, possible a CC0-setting insn in
1531                      front of the jump, and TEMP, with the sequence we have
1532                      made.  */
1533
1534                   if (target != temp2)
1535                     emit_move_insn (temp2, target);
1536
1537                   seq = get_insns ();
1538                   end_sequence ();
1539
1540                   emit_insns_before (seq, temp4);
1541                   delete_insn (temp);
1542
1543                   if (init_insn)
1544                     delete_insn (init_insn);
1545
1546                   next = NEXT_INSN (insn);
1547 #ifdef HAVE_cc0
1548                   delete_insn (prev_nonnote_insn (insn));
1549 #endif
1550                   delete_insn (insn);
1551                   changed = 1;
1552                   continue;
1553                 }
1554               else
1555                 end_sequence ();
1556             }
1557
1558           /* Simplify   if (...) x = 1; else {...}  if (x) ...
1559              We recognize this case scanning backwards as well.
1560
1561              TEMP is the assignment to x;
1562              TEMP1 is the label at the head of the second if.  */
1563           /* ?? This should call get_condition to find the values being
1564              compared, instead of looking for a COMPARE insn when HAVE_cc0
1565              is not defined.  This would allow it to work on the m88k.  */
1566           /* ?? This optimization is only safe before cse is run if HAVE_cc0
1567              is not defined and the condition is tested by a separate compare
1568              insn.  This is because the code below assumes that the result
1569              of the compare dies in the following branch.
1570
1571              Not only that, but there might be other insns between the
1572              compare and branch whose results are live.  Those insns need
1573              to be executed.
1574
1575              A way to fix this is to move the insns at JUMP_LABEL (insn)
1576              to before INSN.  If we are running before flow, they will
1577              be deleted if they aren't needed.   But this doesn't work
1578              well after flow.
1579
1580              This is really a special-case of jump threading, anyway.  The
1581              right thing to do is to replace this and jump threading with
1582              much simpler code in cse.
1583
1584              This code has been turned off in the non-cc0 case in the
1585              meantime.  */
1586
1587 #ifdef HAVE_cc0
1588           else if (this_is_simplejump
1589                    /* Safe to skip USE and CLOBBER insns here
1590                       since they will not be deleted.  */
1591                    && (temp = prev_active_insn (insn))
1592                    && no_labels_between_p (temp, insn)
1593                    && GET_CODE (temp) == INSN
1594                    && GET_CODE (PATTERN (temp)) == SET
1595                    && GET_CODE (SET_DEST (PATTERN (temp))) == REG
1596                    && CONSTANT_P (SET_SRC (PATTERN (temp)))
1597                    && (temp1 = next_active_insn (JUMP_LABEL (insn)))
1598                    /* If we find that the next value tested is `x'
1599                       (TEMP1 is the insn where this happens), win.  */
1600                    && GET_CODE (temp1) == INSN
1601                    && GET_CODE (PATTERN (temp1)) == SET
1602 #ifdef HAVE_cc0
1603                    /* Does temp1 `tst' the value of x?  */
1604                    && SET_SRC (PATTERN (temp1)) == SET_DEST (PATTERN (temp))
1605                    && SET_DEST (PATTERN (temp1)) == cc0_rtx
1606                    && (temp1 = next_nonnote_insn (temp1))
1607 #else
1608                    /* Does temp1 compare the value of x against zero?  */
1609                    && GET_CODE (SET_SRC (PATTERN (temp1))) == COMPARE
1610                    && XEXP (SET_SRC (PATTERN (temp1)), 1) == const0_rtx
1611                    && (XEXP (SET_SRC (PATTERN (temp1)), 0)
1612                        == SET_DEST (PATTERN (temp)))
1613                    && GET_CODE (SET_DEST (PATTERN (temp1))) == REG
1614                    && (temp1 = find_next_ref (SET_DEST (PATTERN (temp1)), temp1))
1615 #endif
1616                    && condjump_p (temp1))
1617             {
1618               /* Get the if_then_else from the condjump.  */
1619               rtx choice = SET_SRC (PATTERN (temp1));
1620               if (GET_CODE (choice) == IF_THEN_ELSE)
1621                 {
1622                   enum rtx_code code = GET_CODE (XEXP (choice, 0));
1623                   rtx val = SET_SRC (PATTERN (temp));
1624                   rtx cond
1625                     = simplify_relational_operation (code, GET_MODE (SET_DEST (PATTERN (temp))),
1626                                                      val, const0_rtx);
1627                   rtx ultimate;
1628
1629                   if (cond == const_true_rtx)
1630                     ultimate = XEXP (choice, 1);
1631                   else if (cond == const0_rtx)
1632                     ultimate = XEXP (choice, 2);
1633                   else
1634                     ultimate = 0;
1635
1636                   if (ultimate == pc_rtx)
1637                     ultimate = get_label_after (temp1);
1638                   else if (ultimate && GET_CODE (ultimate) != RETURN)
1639                     ultimate = XEXP (ultimate, 0);
1640
1641                   if (ultimate && JUMP_LABEL(insn) != ultimate)
1642                     changed |= redirect_jump (insn, ultimate);
1643                 }
1644             }
1645 #endif
1646
1647 #if 0
1648           /* @@ This needs a bit of work before it will be right.
1649
1650              Any type of comparison can be accepted for the first and
1651              second compare.  When rewriting the first jump, we must
1652              compute the what conditions can reach label3, and use the
1653              appropriate code.  We can not simply reverse/swap the code
1654              of the first jump.  In some cases, the second jump must be
1655              rewritten also.
1656
1657              For example, 
1658              <  == converts to >  ==
1659              <  != converts to ==  >
1660              etc.
1661
1662              If the code is written to only accept an '==' test for the second
1663              compare, then all that needs to be done is to swap the condition
1664              of the first branch.
1665
1666              It is questionable whether we want this optimization anyways,
1667              since if the user wrote code like this because he/she knew that
1668              the jump to label1 is taken most of the time, then rewriting
1669              this gives slower code.  */
1670           /* @@ This should call get_condition to find the values being
1671              compared, instead of looking for a COMPARE insn when HAVE_cc0
1672              is not defined.  This would allow it to work on the m88k.  */
1673           /* @@ This optimization is only safe before cse is run if HAVE_cc0
1674              is not defined and the condition is tested by a separate compare
1675              insn.  This is because the code below assumes that the result
1676              of the compare dies in the following branch.  */
1677
1678           /* Simplify  test a ~= b
1679                        condjump label1;
1680                        test a == b
1681                        condjump label2;
1682                        jump label3;
1683                        label1:
1684
1685              rewriting as
1686                        test a ~~= b
1687                        condjump label3
1688                        test a == b
1689                        condjump label2
1690                        label1:
1691
1692              where ~= is an inequality, e.g. >, and ~~= is the swapped
1693              inequality, e.g. <.
1694
1695              We recognize this case scanning backwards.
1696
1697              TEMP is the conditional jump to `label2';
1698              TEMP1 is the test for `a == b';
1699              TEMP2 is the conditional jump to `label1';
1700              TEMP3 is the test for `a ~= b'.  */
1701           else if (this_is_simplejump
1702                    && (temp = prev_active_insn (insn))
1703                    && no_labels_between_p (temp, insn)
1704                    && condjump_p (temp)
1705                    && (temp1 = prev_active_insn (temp))
1706                    && no_labels_between_p (temp1, temp)
1707                    && GET_CODE (temp1) == INSN
1708                    && GET_CODE (PATTERN (temp1)) == SET
1709 #ifdef HAVE_cc0
1710                    && sets_cc0_p (PATTERN (temp1)) == 1
1711 #else
1712                    && GET_CODE (SET_SRC (PATTERN (temp1))) == COMPARE
1713                    && GET_CODE (SET_DEST (PATTERN (temp1))) == REG
1714                    && (temp == find_next_ref (SET_DEST (PATTERN (temp1)), temp1))
1715 #endif
1716                    && (temp2 = prev_active_insn (temp1))
1717                    && no_labels_between_p (temp2, temp1)
1718                    && condjump_p (temp2)
1719                    && JUMP_LABEL (temp2) == next_nonnote_insn (NEXT_INSN (insn))
1720                    && (temp3 = prev_active_insn (temp2))
1721                    && no_labels_between_p (temp3, temp2)
1722                    && GET_CODE (PATTERN (temp3)) == SET
1723                    && rtx_equal_p (SET_DEST (PATTERN (temp3)),
1724                                    SET_DEST (PATTERN (temp1)))
1725                    && rtx_equal_p (SET_SRC (PATTERN (temp1)),
1726                                    SET_SRC (PATTERN (temp3)))
1727                    && ! inequality_comparisons_p (PATTERN (temp))
1728                    && inequality_comparisons_p (PATTERN (temp2)))
1729             {
1730               rtx fallthrough_label = JUMP_LABEL (temp2);
1731
1732               ++LABEL_NUSES (fallthrough_label);
1733               if (swap_jump (temp2, JUMP_LABEL (insn)))
1734                 {
1735                   delete_insn (insn);
1736                   changed = 1;
1737                 }
1738
1739               if (--LABEL_NUSES (fallthrough_label) == 0)
1740                 delete_insn (fallthrough_label);
1741             }
1742 #endif
1743           /* Simplify  if (...) {... x = 1;} if (x) ...
1744
1745              We recognize this case backwards.
1746
1747              TEMP is the test of `x';
1748              TEMP1 is the assignment to `x' at the end of the
1749              previous statement.  */
1750           /* @@ This should call get_condition to find the values being
1751              compared, instead of looking for a COMPARE insn when HAVE_cc0
1752              is not defined.  This would allow it to work on the m88k.  */
1753           /* @@ This optimization is only safe before cse is run if HAVE_cc0
1754              is not defined and the condition is tested by a separate compare
1755              insn.  This is because the code below assumes that the result
1756              of the compare dies in the following branch.  */
1757
1758           /* ??? This has to be turned off.  The problem is that the
1759              unconditional jump might indirectly end up branching to the
1760              label between TEMP1 and TEMP.  We can't detect this, in general,
1761              since it may become a jump to there after further optimizations.
1762              If that jump is done, it will be deleted, so we will retry
1763              this optimization in the next pass, thus an infinite loop.
1764
1765              The present code prevents this by putting the jump after the
1766              label, but this is not logically correct.  */
1767 #if 0
1768           else if (this_is_condjump
1769                    /* Safe to skip USE and CLOBBER insns here
1770                       since they will not be deleted.  */
1771                    && (temp = prev_active_insn (insn))
1772                    && no_labels_between_p (temp, insn)
1773                    && GET_CODE (temp) == INSN
1774                    && GET_CODE (PATTERN (temp)) == SET
1775 #ifdef HAVE_cc0
1776                    && sets_cc0_p (PATTERN (temp)) == 1
1777                    && GET_CODE (SET_SRC (PATTERN (temp))) == REG
1778 #else
1779                    /* Temp must be a compare insn, we can not accept a register
1780                       to register move here, since it may not be simply a
1781                       tst insn.  */
1782                    && GET_CODE (SET_SRC (PATTERN (temp))) == COMPARE
1783                    && XEXP (SET_SRC (PATTERN (temp)), 1) == const0_rtx
1784                    && GET_CODE (XEXP (SET_SRC (PATTERN (temp)), 0)) == REG
1785                    && GET_CODE (SET_DEST (PATTERN (temp))) == REG
1786                    && insn == find_next_ref (SET_DEST (PATTERN (temp)), temp)
1787 #endif
1788                    /* May skip USE or CLOBBER insns here
1789                       for checking for opportunity, since we
1790                       take care of them later.  */
1791                    && (temp1 = prev_active_insn (temp))
1792                    && GET_CODE (temp1) == INSN
1793                    && GET_CODE (PATTERN (temp1)) == SET
1794 #ifdef HAVE_cc0
1795                    && SET_SRC (PATTERN (temp)) == SET_DEST (PATTERN (temp1))
1796 #else
1797                    && (XEXP (SET_SRC (PATTERN (temp)), 0)
1798                        == SET_DEST (PATTERN (temp1)))
1799 #endif
1800                    && CONSTANT_P (SET_SRC (PATTERN (temp1)))
1801                    /* If this isn't true, cse will do the job.  */
1802                    && ! no_labels_between_p (temp1, temp))
1803             {
1804               /* Get the if_then_else from the condjump.  */
1805               rtx choice = SET_SRC (PATTERN (insn));
1806               if (GET_CODE (choice) == IF_THEN_ELSE
1807                   && (GET_CODE (XEXP (choice, 0)) == EQ
1808                       || GET_CODE (XEXP (choice, 0)) == NE))
1809                 {
1810                   int want_nonzero = (GET_CODE (XEXP (choice, 0)) == NE);
1811                   rtx last_insn;
1812                   rtx ultimate;
1813                   rtx p;
1814
1815                   /* Get the place that condjump will jump to
1816                      if it is reached from here.  */
1817                   if ((SET_SRC (PATTERN (temp1)) != const0_rtx)
1818                       == want_nonzero)
1819                     ultimate = XEXP (choice, 1);
1820                   else
1821                     ultimate = XEXP (choice, 2);
1822                   /* Get it as a CODE_LABEL.  */
1823                   if (ultimate == pc_rtx)
1824                     ultimate = get_label_after (insn);
1825                   else
1826                     /* Get the label out of the LABEL_REF.  */
1827                     ultimate = XEXP (ultimate, 0);
1828
1829                   /* Insert the jump immediately before TEMP, specifically
1830                      after the label that is between TEMP1 and TEMP.  */
1831                   last_insn = PREV_INSN (temp);
1832
1833                   /* If we would be branching to the next insn, the jump
1834                      would immediately be deleted and the re-inserted in
1835                      a subsequent pass over the code.  So don't do anything
1836                      in that case.  */
1837                   if (next_active_insn (last_insn)
1838                       != next_active_insn (ultimate))
1839                     {
1840                       emit_barrier_after (last_insn);
1841                       p = emit_jump_insn_after (gen_jump (ultimate),
1842                                                 last_insn);
1843                       JUMP_LABEL (p) = ultimate;
1844                       ++LABEL_NUSES (ultimate);
1845                       if (INSN_UID (ultimate) < max_jump_chain
1846                           && INSN_CODE (p) < max_jump_chain)
1847                         {
1848                           jump_chain[INSN_UID (p)]
1849                             = jump_chain[INSN_UID (ultimate)];
1850                           jump_chain[INSN_UID (ultimate)] = p;
1851                         }
1852                       changed = 1;
1853                       continue;
1854                     }
1855                 }
1856             }
1857 #endif
1858           /* Detect a conditional jump going to the same place
1859              as an immediately following unconditional jump.  */
1860           else if (this_is_condjump
1861                    && (temp = next_active_insn (insn)) != 0
1862                    && simplejump_p (temp)
1863                    && (next_active_insn (JUMP_LABEL (insn))
1864                        == next_active_insn (JUMP_LABEL (temp))))
1865             {
1866               delete_jump (insn);
1867               changed = 1;
1868               continue;
1869             }
1870           /* Detect a conditional jump jumping over an unconditional jump.  */
1871
1872           else if ((this_is_condjump || this_is_condjump_in_parallel)
1873                    && ! this_is_simplejump
1874                    && reallabelprev != 0
1875                    && GET_CODE (reallabelprev) == JUMP_INSN
1876                    && prev_active_insn (reallabelprev) == insn
1877                    && no_labels_between_p (insn, reallabelprev)
1878                    && simplejump_p (reallabelprev))
1879             {
1880               /* When we invert the unconditional jump, we will be
1881                  decrementing the usage count of its old label.
1882                  Make sure that we don't delete it now because that
1883                  might cause the following code to be deleted.  */
1884               rtx prev_uses = prev_nonnote_insn (reallabelprev);
1885               rtx prev_label = JUMP_LABEL (insn);
1886
1887               if (prev_label)
1888                 ++LABEL_NUSES (prev_label);
1889
1890               if (invert_jump (insn, JUMP_LABEL (reallabelprev)))
1891                 {
1892                   /* It is very likely that if there are USE insns before
1893                      this jump, they hold REG_DEAD notes.  These REG_DEAD
1894                      notes are no longer valid due to this optimization,
1895                      and will cause the life-analysis that following passes
1896                      (notably delayed-branch scheduling) to think that
1897                      these registers are dead when they are not.
1898
1899                      To prevent this trouble, we just remove the USE insns
1900                      from the insn chain.  */
1901
1902                   while (prev_uses && GET_CODE (prev_uses) == INSN
1903                          && GET_CODE (PATTERN (prev_uses)) == USE)
1904                     {
1905                       rtx useless = prev_uses;
1906                       prev_uses = prev_nonnote_insn (prev_uses);
1907                       delete_insn (useless);
1908                     }
1909
1910                   delete_insn (reallabelprev);
1911                   next = insn;
1912                   changed = 1;
1913                 }
1914
1915               /* We can now safely delete the label if it is unreferenced
1916                  since the delete_insn above has deleted the BARRIER.  */
1917               if (prev_label && --LABEL_NUSES (prev_label) == 0)
1918                 delete_insn (prev_label);
1919               continue;
1920             }
1921           else
1922             {
1923               /* Detect a jump to a jump.  */
1924
1925               nlabel = follow_jumps (JUMP_LABEL (insn));
1926               if (nlabel != JUMP_LABEL (insn)
1927                   && redirect_jump (insn, nlabel))
1928                 {
1929                   changed = 1;
1930                   next = insn;
1931                 }
1932
1933               /* Look for   if (foo) bar; else break;  */
1934               /* The insns look like this:
1935                  insn = condjump label1;
1936                  ...range1 (some insns)...
1937                  jump label2;
1938                  label1:
1939                  ...range2 (some insns)...
1940                  jump somewhere unconditionally
1941                  label2:  */
1942               {
1943                 rtx label1 = next_label (insn);
1944                 rtx range1end = label1 ? prev_active_insn (label1) : 0;
1945                 /* Don't do this optimization on the first round, so that
1946                    jump-around-a-jump gets simplified before we ask here
1947                    whether a jump is unconditional.
1948
1949                    Also don't do it when we are called after reload since
1950                    it will confuse reorg.  */
1951                 if (! first
1952                     && (reload_completed ? ! flag_delayed_branch : 1)
1953                     /* Make sure INSN is something we can invert.  */
1954                     && condjump_p (insn)
1955                     && label1 != 0
1956                     && JUMP_LABEL (insn) == label1
1957                     && LABEL_NUSES (label1) == 1
1958                     && GET_CODE (range1end) == JUMP_INSN
1959                     && simplejump_p (range1end))
1960                   {
1961                     rtx label2 = next_label (label1);
1962                     rtx range2end = label2 ? prev_active_insn (label2) : 0;
1963                     if (range1end != range2end
1964                         && JUMP_LABEL (range1end) == label2
1965                         && GET_CODE (range2end) == JUMP_INSN
1966                         && GET_CODE (NEXT_INSN (range2end)) == BARRIER
1967                         /* Invert the jump condition, so we
1968                            still execute the same insns in each case.  */
1969                         && invert_jump (insn, label1))
1970                       {
1971                         rtx range1beg = next_active_insn (insn);
1972                         rtx range2beg = next_active_insn (label1);
1973                         rtx range1after, range2after;
1974                         rtx range1before, range2before;
1975                         rtx rangenext;
1976
1977                         /* Include in each range any notes before it, to be
1978                            sure that we get the line number note if any, even
1979                            if there are other notes here.  */
1980                         while (PREV_INSN (range1beg)
1981                                && GET_CODE (PREV_INSN (range1beg)) == NOTE)
1982                           range1beg = PREV_INSN (range1beg);
1983
1984                         while (PREV_INSN (range2beg)
1985                                && GET_CODE (PREV_INSN (range2beg)) == NOTE)
1986                           range2beg = PREV_INSN (range2beg);
1987
1988                         /* Don't move NOTEs for blocks or loops; shift them
1989                            outside the ranges, where they'll stay put.  */
1990                         range1beg = squeeze_notes (range1beg, range1end);
1991                         range2beg = squeeze_notes (range2beg, range2end);
1992
1993                         /* Get current surrounds of the 2 ranges.  */
1994                         range1before = PREV_INSN (range1beg);
1995                         range2before = PREV_INSN (range2beg);
1996                         range1after = NEXT_INSN (range1end);
1997                         range2after = NEXT_INSN (range2end);
1998
1999                         /* Splice range2 where range1 was.  */
2000                         NEXT_INSN (range1before) = range2beg;
2001                         PREV_INSN (range2beg) = range1before;
2002                         NEXT_INSN (range2end) = range1after;
2003                         PREV_INSN (range1after) = range2end;
2004                         /* Splice range1 where range2 was.  */
2005                         NEXT_INSN (range2before) = range1beg;
2006                         PREV_INSN (range1beg) = range2before;
2007                         NEXT_INSN (range1end) = range2after;
2008                         PREV_INSN (range2after) = range1end;
2009
2010                         /* Check for a loop end note between the end of
2011                            range2, and the next code label.  If there is one,
2012                            then what we have really seen is
2013                            if (foo) break; end_of_loop;
2014                            and moved the break sequence outside the loop.
2015                            We must move the LOOP_END note to where the
2016                            loop really ends now, or we will confuse loop
2017                            optimization.  Stop if we find a LOOP_BEG note
2018                            first, since we don't want to move the LOOP_END
2019                            note in that case.  */
2020                         for (;range2after != label2; range2after = rangenext)
2021                           {
2022                             rangenext = NEXT_INSN (range2after);
2023                             if (GET_CODE (range2after) == NOTE)
2024                               {
2025                                 if (NOTE_LINE_NUMBER (range2after)
2026                                     == NOTE_INSN_LOOP_END)
2027                                   {
2028                                     NEXT_INSN (PREV_INSN (range2after))
2029                                       = rangenext;
2030                                     PREV_INSN (rangenext)
2031                                       = PREV_INSN (range2after);
2032                                     PREV_INSN (range2after) 
2033                                       = PREV_INSN (range1beg);
2034                                     NEXT_INSN (range2after) = range1beg;
2035                                     NEXT_INSN (PREV_INSN (range1beg))
2036                                       = range2after;
2037                                     PREV_INSN (range1beg) = range2after;
2038                                   }
2039                                 else if (NOTE_LINE_NUMBER (range2after)
2040                                          == NOTE_INSN_LOOP_BEG)
2041                                   break;
2042                               }
2043                           }
2044                         changed = 1;
2045                         continue;
2046                       }
2047                   }
2048               }
2049
2050               /* Now that the jump has been tensioned,
2051                  try cross jumping: check for identical code
2052                  before the jump and before its target label.  */
2053
2054               /* First, cross jumping of conditional jumps:  */
2055
2056               if (cross_jump && condjump_p (insn))
2057                 {
2058                   rtx newjpos, newlpos;
2059                   rtx x = prev_real_insn (JUMP_LABEL (insn));
2060
2061                   /* A conditional jump may be crossjumped
2062                      only if the place it jumps to follows
2063                      an opposing jump that comes back here.  */
2064
2065                   if (x != 0 && ! jump_back_p (x, insn))
2066                     /* We have no opposing jump;
2067                        cannot cross jump this insn.  */
2068                     x = 0;
2069
2070                   newjpos = 0;
2071                   /* TARGET is nonzero if it is ok to cross jump
2072                      to code before TARGET.  If so, see if matches.  */
2073                   if (x != 0)
2074                     find_cross_jump (insn, x, 2,
2075                                      &newjpos, &newlpos);
2076
2077                   if (newjpos != 0)
2078                     {
2079                       do_cross_jump (insn, newjpos, newlpos);
2080                       /* Make the old conditional jump
2081                          into an unconditional one.  */
2082                       SET_SRC (PATTERN (insn))
2083                         = gen_rtx (LABEL_REF, VOIDmode, JUMP_LABEL (insn));
2084                       INSN_CODE (insn) = -1;
2085                       emit_barrier_after (insn);
2086                       /* Add to jump_chain unless this is a new label
2087                          whose UID is too large.  */
2088                       if (INSN_UID (JUMP_LABEL (insn)) < max_jump_chain)
2089                         {
2090                           jump_chain[INSN_UID (insn)]
2091                             = jump_chain[INSN_UID (JUMP_LABEL (insn))];
2092                           jump_chain[INSN_UID (JUMP_LABEL (insn))] = insn;
2093                         }
2094                       changed = 1;
2095                       next = insn;
2096                     }
2097                 }
2098
2099               /* Cross jumping of unconditional jumps:
2100                  a few differences.  */
2101
2102               if (cross_jump && simplejump_p (insn))
2103                 {
2104                   rtx newjpos, newlpos;
2105                   rtx target;
2106
2107                   newjpos = 0;
2108
2109                   /* TARGET is nonzero if it is ok to cross jump
2110                      to code before TARGET.  If so, see if matches.  */
2111                   find_cross_jump (insn, JUMP_LABEL (insn), 1,
2112                                    &newjpos, &newlpos);
2113
2114                   /* If cannot cross jump to code before the label,
2115                      see if we can cross jump to another jump to
2116                      the same label.  */
2117                   /* Try each other jump to this label.  */
2118                   if (INSN_UID (JUMP_LABEL (insn)) < max_uid)
2119                     for (target = jump_chain[INSN_UID (JUMP_LABEL (insn))];
2120                          target != 0 && newjpos == 0;
2121                          target = jump_chain[INSN_UID (target)])
2122                       if (target != insn
2123                           && JUMP_LABEL (target) == JUMP_LABEL (insn)
2124                           /* Ignore TARGET if it's deleted.  */
2125                           && ! INSN_DELETED_P (target))
2126                         find_cross_jump (insn, target, 2,
2127                                          &newjpos, &newlpos);
2128
2129                   if (newjpos != 0)
2130                     {
2131                       do_cross_jump (insn, newjpos, newlpos);
2132                       changed = 1;
2133                       next = insn;
2134                     }
2135                 }
2136
2137               /* This code was dead in the previous jump.c!  */
2138               if (cross_jump && GET_CODE (PATTERN (insn)) == RETURN)
2139                 {
2140                   /* Return insns all "jump to the same place"
2141                      so we can cross-jump between any two of them.  */
2142
2143                   rtx newjpos, newlpos, target;
2144
2145                   newjpos = 0;
2146
2147                   /* If cannot cross jump to code before the label,
2148                      see if we can cross jump to another jump to
2149                      the same label.  */
2150                   /* Try each other jump to this label.  */
2151                   for (target = jump_chain[0];
2152                        target != 0 && newjpos == 0;
2153                        target = jump_chain[INSN_UID (target)])
2154                     if (target != insn
2155                         && ! INSN_DELETED_P (target)
2156                         && GET_CODE (PATTERN (target)) == RETURN)
2157                       find_cross_jump (insn, target, 2,
2158                                        &newjpos, &newlpos);
2159
2160                   if (newjpos != 0)
2161                     {
2162                       do_cross_jump (insn, newjpos, newlpos);
2163                       changed = 1;
2164                       next = insn;
2165                     }
2166                 }
2167             }
2168         }
2169
2170       first = 0;
2171     }
2172
2173   /* Delete extraneous line number notes.
2174      Note that two consecutive notes for different lines are not really
2175      extraneous.  There should be some indication where that line belonged,
2176      even if it became empty.  */
2177
2178   {
2179     rtx last_note = 0;
2180
2181     for (insn = f; insn; insn = NEXT_INSN (insn))
2182       if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) >= 0)
2183         {
2184           /* Delete this note if it is identical to previous note.  */
2185           if (last_note
2186               && NOTE_SOURCE_FILE (insn) == NOTE_SOURCE_FILE (last_note)
2187               && NOTE_LINE_NUMBER (insn) == NOTE_LINE_NUMBER (last_note))
2188             {
2189               delete_insn (insn);
2190               continue;
2191             }
2192
2193           last_note = insn;
2194         }
2195   }
2196
2197 #ifdef HAVE_return
2198   if (HAVE_return)
2199     {
2200       /* If we fall through to the epilogue, see if we can insert a RETURN insn
2201          in front of it.  If the machine allows it at this point (we might be
2202          after reload for a leaf routine), it will improve optimization for it
2203          to be there.  We do this both here and at the start of this pass since
2204          the RETURN might have been deleted by some of our optimizations.  */
2205       insn = get_last_insn ();
2206       while (insn && GET_CODE (insn) == NOTE)
2207         insn = PREV_INSN (insn);
2208
2209       if (insn && GET_CODE (insn) != BARRIER)
2210         {
2211           emit_jump_insn (gen_return ());
2212           emit_barrier ();
2213         }
2214     }
2215 #endif
2216
2217   /* See if there is still a NOTE_INSN_FUNCTION_END in this function.
2218      If so, delete it, and record that this function can drop off the end.  */
2219
2220   insn = last_insn;
2221   {
2222     int n_labels = 1;
2223     while (insn
2224            /* One label can follow the end-note: the return label.  */
2225            && ((GET_CODE (insn) == CODE_LABEL && n_labels-- > 0)
2226                /* Ordinary insns can follow it if returning a structure.  */
2227                || GET_CODE (insn) == INSN
2228                /* If machine uses explicit RETURN insns, no epilogue,
2229                   then one of them follows the note.  */
2230                || (GET_CODE (insn) == JUMP_INSN
2231                    && GET_CODE (PATTERN (insn)) == RETURN)
2232                /* A barrier can follow the return insn.  */
2233                || GET_CODE (insn) == BARRIER
2234                /* Other kinds of notes can follow also.  */
2235                || (GET_CODE (insn) == NOTE
2236                    && NOTE_LINE_NUMBER (insn) != NOTE_INSN_FUNCTION_END)))
2237       insn = PREV_INSN (insn);
2238   }
2239
2240   /* Report if control can fall through at the end of the function.  */
2241   if (insn && GET_CODE (insn) == NOTE
2242       && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_END)
2243     {
2244       can_reach_end = 1;
2245       delete_insn (insn);
2246     }
2247
2248   /* Show JUMP_CHAIN no longer valid.  */
2249   jump_chain = 0;
2250 }
2251 \f
2252 /* LOOP_START is a NOTE_INSN_LOOP_BEG note that is followed by an unconditional
2253    jump.  Assume that this unconditional jump is to the exit test code.  If
2254    the code is sufficiently simple, make a copy of it before INSN,
2255    followed by a jump to the exit of the loop.  Then delete the unconditional
2256    jump after INSN.
2257
2258    Return 1 if we made the change, else 0.
2259
2260    This is only safe immediately after a regscan pass because it uses the
2261    values of regno_first_uid and regno_last_uid.  */
2262
2263 static int
2264 duplicate_loop_exit_test (loop_start)
2265      rtx loop_start;
2266 {
2267   rtx insn, set, reg, p, link;
2268   rtx copy = 0;
2269   int num_insns = 0;
2270   rtx exitcode = NEXT_INSN (JUMP_LABEL (next_nonnote_insn (loop_start)));
2271   rtx lastexit;
2272   int max_reg = max_reg_num ();
2273   rtx *reg_map = 0;
2274
2275   /* Scan the exit code.  We do not perform this optimization if any insn:
2276
2277          is a CALL_INSN
2278          is a CODE_LABEL
2279          has a REG_RETVAL or REG_LIBCALL note (hard to adjust)
2280          is a NOTE_INSN_LOOP_BEG because this means we have a nested loop
2281          is a NOTE_INSN_BLOCK_{BEG,END} because duplicating these notes
2282               are not valid
2283
2284      Also, don't do this if the exit code is more than 20 insns.  */
2285
2286   for (insn = exitcode;
2287        insn
2288        && ! (GET_CODE (insn) == NOTE
2289              && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END);
2290        insn = NEXT_INSN (insn))
2291     {
2292       switch (GET_CODE (insn))
2293         {
2294         case CODE_LABEL:
2295         case CALL_INSN:
2296           return 0;
2297         case NOTE:
2298           /* We could be in front of the wrong NOTE_INSN_LOOP_END if there is
2299              a jump immediately after the loop start that branches outside
2300              the loop but within an outer loop, near the exit test.
2301              If we copied this exit test and created a phony
2302              NOTE_INSN_LOOP_VTOP, this could make instructions immediately
2303              before the exit test look like these could be safely moved
2304              out of the loop even if they actually may be never executed.
2305              This can be avoided by checking here for NOTE_INSN_LOOP_CONT.  */
2306
2307           if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
2308               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG
2309               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END
2310               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT)
2311             return 0;
2312           break;
2313         case JUMP_INSN:
2314         case INSN:
2315           if (++num_insns > 20
2316               || find_reg_note (insn, REG_RETVAL, NULL_RTX)
2317               || find_reg_note (insn, REG_LIBCALL, NULL_RTX))
2318             return 0;
2319           break;
2320         }
2321     }
2322
2323   /* Unless INSN is zero, we can do the optimization.  */
2324   if (insn == 0)
2325     return 0;
2326
2327   lastexit = insn;
2328
2329   /* See if any insn sets a register only used in the loop exit code and
2330      not a user variable.  If so, replace it with a new register.  */
2331   for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn))
2332     if (GET_CODE (insn) == INSN
2333         && (set = single_set (insn)) != 0
2334         && ((reg = SET_DEST (set), GET_CODE (reg) == REG)
2335             || (GET_CODE (reg) == SUBREG
2336                 && (reg = SUBREG_REG (reg), GET_CODE (reg) == REG)))
2337         && REGNO (reg) >= FIRST_PSEUDO_REGISTER
2338         && regno_first_uid[REGNO (reg)] == INSN_UID (insn))
2339       {
2340         for (p = NEXT_INSN (insn); p != lastexit; p = NEXT_INSN (p))
2341           if (regno_last_uid[REGNO (reg)] == INSN_UID (p))
2342             break;
2343
2344         if (p != lastexit)
2345           {
2346             /* We can do the replacement.  Allocate reg_map if this is the
2347                first replacement we found.  */
2348             if (reg_map == 0)
2349               {
2350                 reg_map = (rtx *) alloca (max_reg * sizeof (rtx));
2351                 bzero ((char *) reg_map, max_reg * sizeof (rtx));
2352               }
2353
2354             REG_LOOP_TEST_P (reg) = 1;
2355
2356             reg_map[REGNO (reg)] = gen_reg_rtx (GET_MODE (reg));
2357           }
2358       }
2359
2360   /* Now copy each insn.  */
2361   for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn))
2362     switch (GET_CODE (insn))
2363       {
2364       case BARRIER:
2365         copy = emit_barrier_before (loop_start);
2366         break;
2367       case NOTE:
2368         /* Only copy line-number notes.  */
2369         if (NOTE_LINE_NUMBER (insn) >= 0)
2370           {
2371             copy = emit_note_before (NOTE_LINE_NUMBER (insn), loop_start);
2372             NOTE_SOURCE_FILE (copy) = NOTE_SOURCE_FILE (insn);
2373           }
2374         break;
2375
2376       case INSN:
2377         copy = emit_insn_before (copy_rtx (PATTERN (insn)), loop_start);
2378         if (reg_map)
2379           replace_regs (PATTERN (copy), reg_map, max_reg, 1);
2380
2381         mark_jump_label (PATTERN (copy), copy, 0);
2382
2383         /* Copy all REG_NOTES except REG_LABEL since mark_jump_label will
2384            make them.  */
2385         for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
2386           if (REG_NOTE_KIND (link) != REG_LABEL)
2387             REG_NOTES (copy)
2388               = copy_rtx (gen_rtx (EXPR_LIST, REG_NOTE_KIND (link),
2389                                    XEXP (link, 0), REG_NOTES (copy)));
2390         if (reg_map && REG_NOTES (copy))
2391           replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
2392         break;
2393
2394       case JUMP_INSN:
2395         copy = emit_jump_insn_before (copy_rtx (PATTERN (insn)), loop_start);
2396         if (reg_map)
2397           replace_regs (PATTERN (copy), reg_map, max_reg, 1);
2398         mark_jump_label (PATTERN (copy), copy, 0);
2399         if (REG_NOTES (insn))
2400           {
2401             REG_NOTES (copy) = copy_rtx (REG_NOTES (insn));
2402             if (reg_map)
2403               replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
2404           }
2405         
2406         /* If this is a simple jump, add it to the jump chain.  */
2407
2408         if (INSN_UID (copy) < max_jump_chain && JUMP_LABEL (copy)
2409             && simplejump_p (copy))
2410           {
2411             jump_chain[INSN_UID (copy)]
2412               = jump_chain[INSN_UID (JUMP_LABEL (copy))];
2413             jump_chain[INSN_UID (JUMP_LABEL (copy))] = copy;
2414           }
2415         break;
2416
2417       default:
2418         abort ();
2419       }
2420
2421   /* Now clean up by emitting a jump to the end label and deleting the jump
2422      at the start of the loop.  */
2423   if (! copy || GET_CODE (copy) != BARRIER)
2424     {
2425       copy = emit_jump_insn_before (gen_jump (get_label_after (insn)),
2426                                     loop_start);
2427       mark_jump_label (PATTERN (copy), copy, 0);
2428       if (INSN_UID (copy) < max_jump_chain
2429           && INSN_UID (JUMP_LABEL (copy)) < max_jump_chain)
2430         {
2431           jump_chain[INSN_UID (copy)]
2432             = jump_chain[INSN_UID (JUMP_LABEL (copy))];
2433           jump_chain[INSN_UID (JUMP_LABEL (copy))] = copy;
2434         }
2435       emit_barrier_before (loop_start);
2436     }
2437
2438   /* Mark the exit code as the virtual top of the converted loop.  */
2439   emit_note_before (NOTE_INSN_LOOP_VTOP, exitcode);
2440
2441   delete_insn (next_nonnote_insn (loop_start));
2442
2443   return 1;
2444 }
2445 \f
2446 /* Move all block-beg, block-end, loop-beg, loop-cont, loop-vtop, and
2447    loop-end notes between START and END out before START.  Assume that
2448    END is not such a note.  START may be such a note.  Returns the value
2449    of the new starting insn, which may be different if the original start
2450    was such a note.  */
2451
2452 rtx
2453 squeeze_notes (start, end)
2454      rtx start, end;
2455 {
2456   rtx insn;
2457   rtx next;
2458
2459   for (insn = start; insn != end; insn = next)
2460     {
2461       next = NEXT_INSN (insn);
2462       if (GET_CODE (insn) == NOTE
2463           && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END
2464               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG
2465               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
2466               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END
2467               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT
2468               || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_VTOP))
2469         {
2470           if (insn == start)
2471             start = next;
2472           else
2473             {
2474               rtx prev = PREV_INSN (insn);
2475               PREV_INSN (insn) = PREV_INSN (start);
2476               NEXT_INSN (insn) = start;
2477               NEXT_INSN (PREV_INSN (insn)) = insn;
2478               PREV_INSN (NEXT_INSN (insn)) = insn;
2479               NEXT_INSN (prev) = next;
2480               PREV_INSN (next) = prev;
2481             }
2482         }
2483     }
2484
2485   return start;
2486 }
2487 \f
2488 /* Compare the instructions before insn E1 with those before E2
2489    to find an opportunity for cross jumping.
2490    (This means detecting identical sequences of insns followed by
2491    jumps to the same place, or followed by a label and a jump
2492    to that label, and replacing one with a jump to the other.)
2493
2494    Assume E1 is a jump that jumps to label E2
2495    (that is not always true but it might as well be).
2496    Find the longest possible equivalent sequences
2497    and store the first insns of those sequences into *F1 and *F2.
2498    Store zero there if no equivalent preceding instructions are found.
2499
2500    We give up if we find a label in stream 1.
2501    Actually we could transfer that label into stream 2.  */
2502
2503 static void
2504 find_cross_jump (e1, e2, minimum, f1, f2)
2505      rtx e1, e2;
2506      int minimum;
2507      rtx *f1, *f2;
2508 {
2509   register rtx i1 = e1, i2 = e2;
2510   register rtx p1, p2;
2511   int lose = 0;
2512
2513   rtx last1 = 0, last2 = 0;
2514   rtx afterlast1 = 0, afterlast2 = 0;
2515   rtx prev1;
2516
2517   *f1 = 0;
2518   *f2 = 0;
2519
2520   while (1)
2521     {
2522       i1 = prev_nonnote_insn (i1);
2523
2524       i2 = PREV_INSN (i2);
2525       while (i2 && (GET_CODE (i2) == NOTE || GET_CODE (i2) == CODE_LABEL))
2526         i2 = PREV_INSN (i2);
2527
2528       if (i1 == 0)
2529         break;
2530
2531       /* Don't allow the range of insns preceding E1 or E2
2532          to include the other (E2 or E1).  */
2533       if (i2 == e1 || i1 == e2)
2534         break;
2535
2536       /* If we will get to this code by jumping, those jumps will be
2537          tensioned to go directly to the new label (before I2),
2538          so this cross-jumping won't cost extra.  So reduce the minimum.  */
2539       if (GET_CODE (i1) == CODE_LABEL)
2540         {
2541           --minimum;
2542           break;
2543         }
2544
2545       if (i2 == 0 || GET_CODE (i1) != GET_CODE (i2))
2546         break;
2547
2548       p1 = PATTERN (i1);
2549       p2 = PATTERN (i2);
2550         
2551       /* If this is a CALL_INSN, compare register usage information.
2552          If we don't check this on stack register machines, the two
2553          CALL_INSNs might be merged leaving reg-stack.c with mismatching
2554          numbers of stack registers in the same basic block.
2555          If we don't check this on machines with delay slots, a delay slot may
2556          be filled that clobbers a parameter expected by the subroutine.
2557
2558          ??? We take the simple route for now and assume that if they're
2559          equal, they were constructed identically.  */
2560
2561       if (GET_CODE (i1) == CALL_INSN
2562           && ! rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
2563                             CALL_INSN_FUNCTION_USAGE (i2)))
2564         lose = 1;
2565
2566 #ifdef STACK_REGS
2567       /* If cross_jump_death_matters is not 0, the insn's mode
2568          indicates whether or not the insn contains any stack-like
2569          regs.  */
2570
2571       if (!lose && cross_jump_death_matters && GET_MODE (i1) == QImode)
2572         {
2573           /* If register stack conversion has already been done, then
2574              death notes must also be compared before it is certain that
2575              the two instruction streams match.  */
2576
2577           rtx note;
2578           HARD_REG_SET i1_regset, i2_regset;
2579
2580           CLEAR_HARD_REG_SET (i1_regset);
2581           CLEAR_HARD_REG_SET (i2_regset);
2582
2583           for (note = REG_NOTES (i1); note; note = XEXP (note, 1))
2584             if (REG_NOTE_KIND (note) == REG_DEAD
2585                 && STACK_REG_P (XEXP (note, 0)))
2586               SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0)));
2587
2588           for (note = REG_NOTES (i2); note; note = XEXP (note, 1))
2589             if (REG_NOTE_KIND (note) == REG_DEAD
2590                 && STACK_REG_P (XEXP (note, 0)))
2591               SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0)));
2592
2593           GO_IF_HARD_REG_EQUAL (i1_regset, i2_regset, done);
2594
2595           lose = 1;
2596
2597         done:
2598           ;
2599         }
2600 #endif
2601
2602       if (lose  || GET_CODE (p1) != GET_CODE (p2)
2603           || ! rtx_renumbered_equal_p (p1, p2))
2604         {
2605           /* The following code helps take care of G++ cleanups.  */
2606           rtx equiv1;
2607           rtx equiv2;
2608
2609           if (!lose && GET_CODE (p1) == GET_CODE (p2)
2610               && ((equiv1 = find_reg_note (i1, REG_EQUAL, NULL_RTX)) != 0
2611                   || (equiv1 = find_reg_note (i1, REG_EQUIV, NULL_RTX)) != 0)
2612               && ((equiv2 = find_reg_note (i2, REG_EQUAL, NULL_RTX)) != 0
2613                   || (equiv2 = find_reg_note (i2, REG_EQUIV, NULL_RTX)) != 0)
2614               /* If the equivalences are not to a constant, they may
2615                  reference pseudos that no longer exist, so we can't
2616                  use them.  */
2617               && CONSTANT_P (XEXP (equiv1, 0))
2618               && rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
2619             {
2620               rtx s1 = single_set (i1);
2621               rtx s2 = single_set (i2);
2622               if (s1 != 0 && s2 != 0
2623                   && rtx_renumbered_equal_p (SET_DEST (s1), SET_DEST (s2)))
2624                 {
2625                   validate_change (i1, &SET_SRC (s1), XEXP (equiv1, 0), 1);
2626                   validate_change (i2, &SET_SRC (s2), XEXP (equiv2, 0), 1);
2627                   if (! rtx_renumbered_equal_p (p1, p2))
2628                     cancel_changes (0);
2629                   else if (apply_change_group ())
2630                     goto win;
2631                 }
2632             }
2633
2634           /* Insns fail to match; cross jumping is limited to the following
2635              insns.  */
2636
2637 #ifdef HAVE_cc0
2638           /* Don't allow the insn after a compare to be shared by
2639              cross-jumping unless the compare is also shared.
2640              Here, if either of these non-matching insns is a compare,
2641              exclude the following insn from possible cross-jumping.  */
2642           if (sets_cc0_p (p1) || sets_cc0_p (p2))
2643             last1 = afterlast1, last2 = afterlast2, ++minimum;
2644 #endif
2645
2646           /* If cross-jumping here will feed a jump-around-jump
2647              optimization, this jump won't cost extra, so reduce
2648              the minimum.  */
2649           if (GET_CODE (i1) == JUMP_INSN
2650               && JUMP_LABEL (i1)
2651               && prev_real_insn (JUMP_LABEL (i1)) == e1)
2652             --minimum;
2653           break;
2654         }
2655
2656     win:
2657       if (GET_CODE (p1) != USE && GET_CODE (p1) != CLOBBER)
2658         {
2659           /* Ok, this insn is potentially includable in a cross-jump here.  */
2660           afterlast1 = last1, afterlast2 = last2;
2661           last1 = i1, last2 = i2, --minimum;
2662         }
2663     }
2664
2665   if (minimum <= 0 && last1 != 0 && last1 != e1)
2666     *f1 = last1, *f2 = last2;
2667 }
2668
2669 static void
2670 do_cross_jump (insn, newjpos, newlpos)
2671      rtx insn, newjpos, newlpos;
2672 {
2673   /* Find an existing label at this point
2674      or make a new one if there is none.  */
2675   register rtx label = get_label_before (newlpos);
2676
2677   /* Make the same jump insn jump to the new point.  */
2678   if (GET_CODE (PATTERN (insn)) == RETURN)
2679     {
2680       /* Remove from jump chain of returns.  */
2681       delete_from_jump_chain (insn);
2682       /* Change the insn.  */
2683       PATTERN (insn) = gen_jump (label);
2684       INSN_CODE (insn) = -1;
2685       JUMP_LABEL (insn) = label;
2686       LABEL_NUSES (label)++;
2687       /* Add to new the jump chain.  */
2688       if (INSN_UID (label) < max_jump_chain
2689           && INSN_UID (insn) < max_jump_chain)
2690         {
2691           jump_chain[INSN_UID (insn)] = jump_chain[INSN_UID (label)];
2692           jump_chain[INSN_UID (label)] = insn;
2693         }
2694     }
2695   else
2696     redirect_jump (insn, label);
2697
2698   /* Delete the matching insns before the jump.  Also, remove any REG_EQUAL
2699      or REG_EQUIV note in the NEWLPOS stream that isn't also present in
2700      the NEWJPOS stream.  */
2701
2702   while (newjpos != insn)
2703     {
2704       rtx lnote;
2705
2706       for (lnote = REG_NOTES (newlpos); lnote; lnote = XEXP (lnote, 1))
2707         if ((REG_NOTE_KIND (lnote) == REG_EQUAL
2708              || REG_NOTE_KIND (lnote) == REG_EQUIV)
2709             && ! find_reg_note (newjpos, REG_EQUAL, XEXP (lnote, 0))
2710             && ! find_reg_note (newjpos, REG_EQUIV, XEXP (lnote, 0)))
2711           remove_note (newlpos, lnote);
2712
2713       delete_insn (newjpos);
2714       newjpos = next_real_insn (newjpos);
2715       newlpos = next_real_insn (newlpos);
2716     }
2717 }
2718 \f
2719 /* Return the label before INSN, or put a new label there.  */
2720
2721 rtx
2722 get_label_before (insn)
2723      rtx insn;
2724 {
2725   rtx label;
2726
2727   /* Find an existing label at this point
2728      or make a new one if there is none.  */
2729   label = prev_nonnote_insn (insn);
2730
2731   if (label == 0 || GET_CODE (label) != CODE_LABEL)
2732     {
2733       rtx prev = PREV_INSN (insn);
2734
2735       label = gen_label_rtx ();
2736       emit_label_after (label, prev);
2737       LABEL_NUSES (label) = 0;
2738     }
2739   return label;
2740 }
2741
2742 /* Return the label after INSN, or put a new label there.  */
2743
2744 rtx
2745 get_label_after (insn)
2746      rtx insn;
2747 {
2748   rtx label;
2749
2750   /* Find an existing label at this point
2751      or make a new one if there is none.  */
2752   label = next_nonnote_insn (insn);
2753
2754   if (label == 0 || GET_CODE (label) != CODE_LABEL)
2755     {
2756       label = gen_label_rtx ();
2757       emit_label_after (label, insn);
2758       LABEL_NUSES (label) = 0;
2759     }
2760   return label;
2761 }
2762 \f
2763 /* Return 1 if INSN is a jump that jumps to right after TARGET
2764    only on the condition that TARGET itself would drop through.
2765    Assumes that TARGET is a conditional jump.  */
2766
2767 static int
2768 jump_back_p (insn, target)
2769      rtx insn, target;
2770 {
2771   rtx cinsn, ctarget;
2772   enum rtx_code codei, codet;
2773
2774   if (simplejump_p (insn) || ! condjump_p (insn)
2775       || simplejump_p (target)
2776       || target != prev_real_insn (JUMP_LABEL (insn)))
2777     return 0;
2778
2779   cinsn = XEXP (SET_SRC (PATTERN (insn)), 0);
2780   ctarget = XEXP (SET_SRC (PATTERN (target)), 0);
2781
2782   codei = GET_CODE (cinsn);
2783   codet = GET_CODE (ctarget);
2784
2785   if (XEXP (SET_SRC (PATTERN (insn)), 1) == pc_rtx)
2786     {
2787       if (! can_reverse_comparison_p (cinsn, insn))
2788         return 0;
2789       codei = reverse_condition (codei);
2790     }
2791
2792   if (XEXP (SET_SRC (PATTERN (target)), 2) == pc_rtx)
2793     {
2794       if (! can_reverse_comparison_p (ctarget, target))
2795         return 0;
2796       codet = reverse_condition (codet);
2797     }
2798
2799   return (codei == codet
2800           && rtx_renumbered_equal_p (XEXP (cinsn, 0), XEXP (ctarget, 0))
2801           && rtx_renumbered_equal_p (XEXP (cinsn, 1), XEXP (ctarget, 1)));
2802 }
2803 \f
2804 /* Given a comparison, COMPARISON, inside a conditional jump insn, INSN,
2805    return non-zero if it is safe to reverse this comparison.  It is if our
2806    floating-point is not IEEE, if this is an NE or EQ comparison, or if
2807    this is known to be an integer comparison.  */
2808
2809 int
2810 can_reverse_comparison_p (comparison, insn)
2811      rtx comparison;
2812      rtx insn;
2813 {
2814   rtx arg0;
2815
2816   /* If this is not actually a comparison, we can't reverse it.  */
2817   if (GET_RTX_CLASS (GET_CODE (comparison)) != '<')
2818     return 0;
2819
2820   if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
2821       /* If this is an NE comparison, it is safe to reverse it to an EQ
2822          comparison and vice versa, even for floating point.  If no operands
2823          are NaNs, the reversal is valid.  If some operand is a NaN, EQ is
2824          always false and NE is always true, so the reversal is also valid.  */
2825       || flag_fast_math
2826       || GET_CODE (comparison) == NE
2827       || GET_CODE (comparison) == EQ)
2828     return 1;
2829
2830   arg0 = XEXP (comparison, 0);
2831
2832   /* Make sure ARG0 is one of the actual objects being compared.  If we
2833      can't do this, we can't be sure the comparison can be reversed. 
2834
2835      Handle cc0 and a MODE_CC register.  */
2836   if ((GET_CODE (arg0) == REG && GET_MODE_CLASS (GET_MODE (arg0)) == MODE_CC)
2837 #ifdef HAVE_cc0
2838       || arg0 == cc0_rtx
2839 #endif
2840       )
2841     {
2842       rtx prev = prev_nonnote_insn (insn);
2843       rtx set = single_set (prev);
2844
2845       if (set == 0 || SET_DEST (set) != arg0)
2846         return 0;
2847
2848       arg0 = SET_SRC (set);
2849
2850       if (GET_CODE (arg0) == COMPARE)
2851         arg0 = XEXP (arg0, 0);
2852     }
2853
2854   /* We can reverse this if ARG0 is a CONST_INT or if its mode is
2855      not VOIDmode and neither a MODE_CC nor MODE_FLOAT type.  */
2856   return (GET_CODE (arg0) == CONST_INT
2857           || (GET_MODE (arg0) != VOIDmode
2858               && GET_MODE_CLASS (GET_MODE (arg0)) != MODE_CC
2859               && GET_MODE_CLASS (GET_MODE (arg0)) != MODE_FLOAT));
2860 }
2861
2862 /* Given an rtx-code for a comparison, return the code
2863    for the negated comparison.
2864    WATCH OUT!  reverse_condition is not safe to use on a jump
2865    that might be acting on the results of an IEEE floating point comparison,
2866    because of the special treatment of non-signaling nans in comparisons.  
2867    Use can_reverse_comparison_p to be sure.  */
2868
2869 enum rtx_code
2870 reverse_condition (code)
2871      enum rtx_code code;
2872 {
2873   switch (code)
2874     {
2875     case EQ:
2876       return NE;
2877
2878     case NE:
2879       return EQ;
2880
2881     case GT:
2882       return LE;
2883
2884     case GE:
2885       return LT;
2886
2887     case LT:
2888       return GE;
2889
2890     case LE:
2891       return GT;
2892
2893     case GTU:
2894       return LEU;
2895
2896     case GEU:
2897       return LTU;
2898
2899     case LTU:
2900       return GEU;
2901
2902     case LEU:
2903       return GTU;
2904
2905     default:
2906       abort ();
2907       return UNKNOWN;
2908     }
2909 }
2910
2911 /* Similar, but return the code when two operands of a comparison are swapped.
2912    This IS safe for IEEE floating-point.  */
2913
2914 enum rtx_code
2915 swap_condition (code)
2916      enum rtx_code code;
2917 {
2918   switch (code)
2919     {
2920     case EQ:
2921     case NE:
2922       return code;
2923
2924     case GT:
2925       return LT;
2926
2927     case GE:
2928       return LE;
2929
2930     case LT:
2931       return GT;
2932
2933     case LE:
2934       return GE;
2935
2936     case GTU:
2937       return LTU;
2938
2939     case GEU:
2940       return LEU;
2941
2942     case LTU:
2943       return GTU;
2944
2945     case LEU:
2946       return GEU;
2947
2948     default:
2949       abort ();
2950       return UNKNOWN;
2951     }
2952 }
2953
2954 /* Given a comparison CODE, return the corresponding unsigned comparison.
2955    If CODE is an equality comparison or already an unsigned comparison,
2956    CODE is returned.  */
2957
2958 enum rtx_code
2959 unsigned_condition (code)
2960      enum rtx_code code;
2961 {
2962   switch (code)
2963     {
2964     case EQ:
2965     case NE:
2966     case GTU:
2967     case GEU:
2968     case LTU:
2969     case LEU:
2970       return code;
2971
2972     case GT:
2973       return GTU;
2974
2975     case GE:
2976       return GEU;
2977
2978     case LT:
2979       return LTU;
2980
2981     case LE:
2982       return LEU;
2983
2984     default:
2985       abort ();
2986     }
2987 }
2988
2989 /* Similarly, return the signed version of a comparison.  */
2990
2991 enum rtx_code
2992 signed_condition (code)
2993      enum rtx_code code;
2994 {
2995   switch (code)
2996     {
2997     case EQ:
2998     case NE:
2999     case GT:
3000     case GE:
3001     case LT:
3002     case LE:
3003       return code;
3004
3005     case GTU:
3006       return GT;
3007
3008     case GEU:
3009       return GE;
3010
3011     case LTU:
3012       return LT;
3013
3014     case LEU:
3015       return LE;
3016
3017     default:
3018       abort ();
3019     }
3020 }
3021 \f
3022 /* Return non-zero if CODE1 is more strict than CODE2, i.e., if the
3023    truth of CODE1 implies the truth of CODE2.  */
3024
3025 int
3026 comparison_dominates_p (code1, code2)
3027      enum rtx_code code1, code2;
3028 {
3029   if (code1 == code2)
3030     return 1;
3031
3032   switch (code1)
3033     {
3034     case EQ:
3035       if (code2 == LE || code2 == LEU || code2 == GE || code2 == GEU)
3036         return 1;
3037       break;
3038
3039     case LT:
3040       if (code2 == LE || code2 == NE)
3041         return 1;
3042       break;
3043
3044     case GT:
3045       if (code2 == GE || code2 == NE)
3046         return 1;
3047       break;
3048
3049     case LTU:
3050       if (code2 == LEU || code2 == NE)
3051         return 1;
3052       break;
3053
3054     case GTU:
3055       if (code2 == GEU || code2 == NE)
3056         return 1;
3057       break;
3058     }
3059
3060   return 0;
3061 }
3062 \f
3063 /* Return 1 if INSN is an unconditional jump and nothing else.  */
3064
3065 int
3066 simplejump_p (insn)
3067      rtx insn;
3068 {
3069   return (GET_CODE (insn) == JUMP_INSN
3070           && GET_CODE (PATTERN (insn)) == SET
3071           && GET_CODE (SET_DEST (PATTERN (insn))) == PC
3072           && GET_CODE (SET_SRC (PATTERN (insn))) == LABEL_REF);
3073 }
3074
3075 /* Return nonzero if INSN is a (possibly) conditional jump
3076    and nothing more.  */
3077
3078 int
3079 condjump_p (insn)
3080      rtx insn;
3081 {
3082   register rtx x = PATTERN (insn);
3083   if (GET_CODE (x) != SET)
3084     return 0;
3085   if (GET_CODE (SET_DEST (x)) != PC)
3086     return 0;
3087   if (GET_CODE (SET_SRC (x)) == LABEL_REF)
3088     return 1;
3089   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
3090     return 0;
3091   if (XEXP (SET_SRC (x), 2) == pc_rtx
3092       && (GET_CODE (XEXP (SET_SRC (x), 1)) == LABEL_REF
3093           || GET_CODE (XEXP (SET_SRC (x), 1)) == RETURN))
3094     return 1;
3095   if (XEXP (SET_SRC (x), 1) == pc_rtx
3096       && (GET_CODE (XEXP (SET_SRC (x), 2)) == LABEL_REF
3097           || GET_CODE (XEXP (SET_SRC (x), 2)) == RETURN))
3098     return 1;
3099   return 0;
3100 }
3101
3102 /* Return nonzero if INSN is a (possibly) conditional jump
3103    and nothing more.  */
3104
3105 int
3106 condjump_in_parallel_p (insn)
3107      rtx insn;
3108 {
3109   register rtx x = PATTERN (insn);
3110
3111   if (GET_CODE (x) != PARALLEL)
3112     return 0;
3113   else
3114     x = XVECEXP (x, 0, 0);
3115
3116   if (GET_CODE (x) != SET)
3117     return 0;
3118   if (GET_CODE (SET_DEST (x)) != PC)
3119     return 0;
3120   if (GET_CODE (SET_SRC (x)) == LABEL_REF)
3121     return 1;
3122   if (GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
3123     return 0;
3124   if (XEXP (SET_SRC (x), 2) == pc_rtx
3125       && (GET_CODE (XEXP (SET_SRC (x), 1)) == LABEL_REF
3126           || GET_CODE (XEXP (SET_SRC (x), 1)) == RETURN))
3127     return 1;
3128   if (XEXP (SET_SRC (x), 1) == pc_rtx
3129       && (GET_CODE (XEXP (SET_SRC (x), 2)) == LABEL_REF
3130           || GET_CODE (XEXP (SET_SRC (x), 2)) == RETURN))
3131     return 1;
3132   return 0;
3133 }
3134
3135 /* Return 1 if X is an RTX that does nothing but set the condition codes
3136    and CLOBBER or USE registers.
3137    Return -1 if X does explicitly set the condition codes,
3138    but also does other things.  */
3139
3140 int
3141 sets_cc0_p (x)
3142      rtx x;
3143 {
3144 #ifdef HAVE_cc0
3145   if (GET_CODE (x) == SET && SET_DEST (x) == cc0_rtx)
3146     return 1;
3147   if (GET_CODE (x) == PARALLEL)
3148     {
3149       int i;
3150       int sets_cc0 = 0;
3151       int other_things = 0;
3152       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
3153         {
3154           if (GET_CODE (XVECEXP (x, 0, i)) == SET
3155               && SET_DEST (XVECEXP (x, 0, i)) == cc0_rtx)
3156             sets_cc0 = 1;
3157           else if (GET_CODE (XVECEXP (x, 0, i)) == SET)
3158             other_things = 1;
3159         }
3160       return ! sets_cc0 ? 0 : other_things ? -1 : 1;
3161     }
3162   return 0;
3163 #else
3164   abort ();
3165 #endif
3166 }
3167 \f
3168 /* Follow any unconditional jump at LABEL;
3169    return the ultimate label reached by any such chain of jumps.
3170    If LABEL is not followed by a jump, return LABEL.
3171    If the chain loops or we can't find end, return LABEL,
3172    since that tells caller to avoid changing the insn.
3173
3174    If RELOAD_COMPLETED is 0, we do not chain across a NOTE_INSN_LOOP_BEG or
3175    a USE or CLOBBER.  */
3176
3177 rtx
3178 follow_jumps (label)
3179      rtx label;
3180 {
3181   register rtx insn;
3182   register rtx next;
3183   register rtx value = label;
3184   register int depth;
3185
3186   for (depth = 0;
3187        (depth < 10
3188         && (insn = next_active_insn (value)) != 0
3189         && GET_CODE (insn) == JUMP_INSN
3190         && ((JUMP_LABEL (insn) != 0 && simplejump_p (insn))
3191             || GET_CODE (PATTERN (insn)) == RETURN)
3192         && (next = NEXT_INSN (insn))
3193         && GET_CODE (next) == BARRIER);
3194        depth++)
3195     {
3196       /* Don't chain through the insn that jumps into a loop
3197          from outside the loop,
3198          since that would create multiple loop entry jumps
3199          and prevent loop optimization.  */
3200       rtx tem;
3201       if (!reload_completed)
3202         for (tem = value; tem != insn; tem = NEXT_INSN (tem))
3203           if (GET_CODE (tem) == NOTE
3204               && NOTE_LINE_NUMBER (tem) == NOTE_INSN_LOOP_BEG)
3205             return value;
3206
3207       /* If we have found a cycle, make the insn jump to itself.  */
3208       if (JUMP_LABEL (insn) == label)
3209         return label;
3210
3211       tem = next_active_insn (JUMP_LABEL (insn));
3212       if (tem && (GET_CODE (PATTERN (tem)) == ADDR_VEC
3213                   || GET_CODE (PATTERN (tem)) == ADDR_DIFF_VEC))
3214         break;
3215
3216       value = JUMP_LABEL (insn);
3217     }
3218   if (depth == 10)
3219     return label;
3220   return value;
3221 }
3222
3223 /* Assuming that field IDX of X is a vector of label_refs,
3224    replace each of them by the ultimate label reached by it.
3225    Return nonzero if a change is made.
3226    If IGNORE_LOOPS is 0, we do not chain across a NOTE_INSN_LOOP_BEG.  */
3227
3228 static int
3229 tension_vector_labels (x, idx)
3230      register rtx x;
3231      register int idx;
3232 {
3233   int changed = 0;
3234   register int i;
3235   for (i = XVECLEN (x, idx) - 1; i >= 0; i--)
3236     {
3237       register rtx olabel = XEXP (XVECEXP (x, idx, i), 0);
3238       register rtx nlabel = follow_jumps (olabel);
3239       if (nlabel && nlabel != olabel)
3240         {
3241           XEXP (XVECEXP (x, idx, i), 0) = nlabel;
3242           ++LABEL_NUSES (nlabel);
3243           if (--LABEL_NUSES (olabel) == 0)
3244             delete_insn (olabel);
3245           changed = 1;
3246         }
3247     }
3248   return changed;
3249 }
3250 \f
3251 /* Find all CODE_LABELs referred to in X, and increment their use counts.
3252    If INSN is a JUMP_INSN and there is at least one CODE_LABEL referenced
3253    in INSN, then store one of them in JUMP_LABEL (INSN).
3254    If INSN is an INSN or a CALL_INSN and there is at least one CODE_LABEL
3255    referenced in INSN, add a REG_LABEL note containing that label to INSN.
3256    Also, when there are consecutive labels, canonicalize on the last of them.
3257
3258    Note that two labels separated by a loop-beginning note
3259    must be kept distinct if we have not yet done loop-optimization,
3260    because the gap between them is where loop-optimize
3261    will want to move invariant code to.  CROSS_JUMP tells us
3262    that loop-optimization is done with.
3263
3264    Once reload has completed (CROSS_JUMP non-zero), we need not consider
3265    two labels distinct if they are separated by only USE or CLOBBER insns.  */
3266
3267 static void
3268 mark_jump_label (x, insn, cross_jump)
3269      register rtx x;
3270      rtx insn;
3271      int cross_jump;
3272 {
3273   register RTX_CODE code = GET_CODE (x);
3274   register int i;
3275   register char *fmt;
3276
3277   switch (code)
3278     {
3279     case PC:
3280     case CC0:
3281     case REG:
3282     case SUBREG:
3283     case CONST_INT:
3284     case SYMBOL_REF:
3285     case CONST_DOUBLE:
3286     case CLOBBER:
3287     case CALL:
3288       return;
3289
3290     case MEM:
3291       /* If this is a constant-pool reference, see if it is a label.  */
3292       if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
3293           && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
3294         mark_jump_label (get_pool_constant (XEXP (x, 0)), insn, cross_jump);
3295       break;
3296
3297     case LABEL_REF:
3298       {
3299         rtx label = XEXP (x, 0);
3300         rtx olabel = label;
3301         rtx note;
3302         rtx next;
3303
3304         if (GET_CODE (label) != CODE_LABEL)
3305           abort ();
3306
3307         /* Ignore references to labels of containing functions.  */
3308         if (LABEL_REF_NONLOCAL_P (x))
3309           break;
3310
3311         /* If there are other labels following this one,
3312            replace it with the last of the consecutive labels.  */
3313         for (next = NEXT_INSN (label); next; next = NEXT_INSN (next))
3314           {
3315             if (GET_CODE (next) == CODE_LABEL)
3316               label = next;
3317             else if (cross_jump && GET_CODE (next) == INSN
3318                      && (GET_CODE (PATTERN (next)) == USE
3319                          || GET_CODE (PATTERN (next)) == CLOBBER))
3320               continue;
3321             else if (GET_CODE (next) != NOTE)
3322               break;
3323             else if (! cross_jump
3324                      && (NOTE_LINE_NUMBER (next) == NOTE_INSN_LOOP_BEG
3325                          || NOTE_LINE_NUMBER (next) == NOTE_INSN_FUNCTION_END))
3326               break;
3327           }
3328
3329         XEXP (x, 0) = label;
3330         ++LABEL_NUSES (label);
3331
3332         if (insn)
3333           {
3334             if (GET_CODE (insn) == JUMP_INSN)
3335               JUMP_LABEL (insn) = label;
3336
3337             /* If we've changed OLABEL and we had a REG_LABEL note
3338                for it, update it as well.  */
3339             else if (label != olabel
3340                      && (note = find_reg_note (insn, REG_LABEL, olabel)) != 0)
3341               XEXP (note, 0) = label;
3342
3343             /* Otherwise, add a REG_LABEL note for LABEL unless there already
3344                is one.  */
3345             else if (! find_reg_note (insn, REG_LABEL, label))
3346               {
3347                 rtx next = next_real_insn (label);
3348                 /* Don't record labels that refer to dispatch tables.
3349                    This is not necessary, since the tablejump
3350                    references the same label.
3351                    And if we did record them, flow.c would make worse code.  */
3352                 if (next == 0
3353                     || ! (GET_CODE (next) == JUMP_INSN
3354                           && (GET_CODE (PATTERN (next)) == ADDR_VEC
3355                               || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC)))
3356                   REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_LABEL, label,
3357                                               REG_NOTES (insn));
3358               }
3359           }
3360         return;
3361       }
3362
3363   /* Do walk the labels in a vector, but not the first operand of an
3364      ADDR_DIFF_VEC.  Don't set the JUMP_LABEL of a vector.  */
3365     case ADDR_VEC:
3366     case ADDR_DIFF_VEC:
3367       {
3368         int eltnum = code == ADDR_DIFF_VEC ? 1 : 0;
3369
3370         for (i = 0; i < XVECLEN (x, eltnum); i++)
3371           mark_jump_label (XVECEXP (x, eltnum, i), NULL_RTX, cross_jump);
3372         return;
3373       }
3374     }
3375
3376   fmt = GET_RTX_FORMAT (code);
3377   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3378     {
3379       if (fmt[i] == 'e')
3380         mark_jump_label (XEXP (x, i), insn, cross_jump);
3381       else if (fmt[i] == 'E')
3382         {
3383           register int j;
3384           for (j = 0; j < XVECLEN (x, i); j++)
3385             mark_jump_label (XVECEXP (x, i, j), insn, cross_jump);
3386         }
3387     }
3388 }
3389
3390 /* If all INSN does is set the pc, delete it,
3391    and delete the insn that set the condition codes for it
3392    if that's what the previous thing was.  */
3393
3394 void
3395 delete_jump (insn)
3396      rtx insn;
3397 {
3398   register rtx set = single_set (insn);
3399
3400   if (set && GET_CODE (SET_DEST (set)) == PC)
3401     delete_computation (insn);
3402 }
3403
3404 /* Delete INSN and recursively delete insns that compute values used only
3405    by INSN.  This uses the REG_DEAD notes computed during flow analysis.
3406    If we are running before flow.c, we need do nothing since flow.c will
3407    delete dead code.  We also can't know if the registers being used are
3408    dead or not at this point.
3409
3410    Otherwise, look at all our REG_DEAD notes.  If a previous insn does
3411    nothing other than set a register that dies in this insn, we can delete
3412    that insn as well.
3413
3414    On machines with CC0, if CC0 is used in this insn, we may be able to
3415    delete the insn that set it.  */
3416
3417 static void
3418 delete_computation (insn)
3419      rtx insn;
3420 {
3421   rtx note, next;
3422
3423 #ifdef HAVE_cc0
3424   if (reg_referenced_p (cc0_rtx, PATTERN (insn)))
3425     {
3426       rtx prev = prev_nonnote_insn (insn);
3427       /* We assume that at this stage
3428          CC's are always set explicitly
3429          and always immediately before the jump that
3430          will use them.  So if the previous insn
3431          exists to set the CC's, delete it
3432          (unless it performs auto-increments, etc.).  */
3433       if (prev && GET_CODE (prev) == INSN
3434           && sets_cc0_p (PATTERN (prev)))
3435         {
3436           if (sets_cc0_p (PATTERN (prev)) > 0
3437               && !FIND_REG_INC_NOTE (prev, NULL_RTX))
3438             delete_computation (prev);
3439           else
3440             /* Otherwise, show that cc0 won't be used.  */
3441             REG_NOTES (prev) = gen_rtx (EXPR_LIST, REG_UNUSED,
3442                                         cc0_rtx, REG_NOTES (prev));
3443         }
3444     }
3445 #endif
3446
3447   for (note = REG_NOTES (insn); note; note = next)
3448     {
3449       rtx our_prev;
3450
3451       next = XEXP (note, 1);
3452
3453       if (REG_NOTE_KIND (note) != REG_DEAD
3454           /* Verify that the REG_NOTE is legitimate.  */
3455           || GET_CODE (XEXP (note, 0)) != REG)
3456         continue;
3457
3458       for (our_prev = prev_nonnote_insn (insn);
3459            our_prev && GET_CODE (our_prev) == INSN;
3460            our_prev = prev_nonnote_insn (our_prev))
3461         {
3462           /* If we reach a SEQUENCE, it is too complex to try to
3463              do anything with it, so give up.  */
3464           if (GET_CODE (PATTERN (our_prev)) == SEQUENCE)
3465             break;
3466
3467           if (GET_CODE (PATTERN (our_prev)) == USE
3468               && GET_CODE (XEXP (PATTERN (our_prev), 0)) == INSN)
3469             /* reorg creates USEs that look like this.  We leave them
3470                alone because reorg needs them for its own purposes.  */
3471             break;
3472
3473           if (reg_set_p (XEXP (note, 0), PATTERN (our_prev)))
3474             {
3475               if (FIND_REG_INC_NOTE (our_prev, NULL_RTX))
3476                 break;
3477
3478               if (GET_CODE (PATTERN (our_prev)) == PARALLEL)
3479                 {
3480                   /* If we find a SET of something else, we can't
3481                      delete the insn.  */
3482
3483                   int i;
3484
3485                   for (i = 0; i < XVECLEN (PATTERN (our_prev), 0); i++)
3486                     {
3487                       rtx part = XVECEXP (PATTERN (our_prev), 0, i);
3488
3489                       if (GET_CODE (part) == SET
3490                           && SET_DEST (part) != XEXP (note, 0))
3491                         break;
3492                     }
3493
3494                   if (i == XVECLEN (PATTERN (our_prev), 0))
3495                     delete_computation (our_prev);
3496                 }
3497               else if (GET_CODE (PATTERN (our_prev)) == SET
3498                        && SET_DEST (PATTERN (our_prev)) == XEXP (note, 0))
3499                 delete_computation (our_prev);
3500
3501               break;
3502             }
3503
3504           /* If OUR_PREV references the register that dies here, it is an
3505              additional use.  Hence any prior SET isn't dead.  However, this
3506              insn becomes the new place for the REG_DEAD note.  */
3507           if (reg_overlap_mentioned_p (XEXP (note, 0),
3508                                        PATTERN (our_prev)))
3509             {
3510               XEXP (note, 1) = REG_NOTES (our_prev);
3511               REG_NOTES (our_prev) = note;
3512               break;
3513             }
3514         }
3515     }
3516
3517   delete_insn (insn);
3518 }
3519 \f
3520 /* Delete insn INSN from the chain of insns and update label ref counts.
3521    May delete some following insns as a consequence; may even delete
3522    a label elsewhere and insns that follow it.
3523
3524    Returns the first insn after INSN that was not deleted.  */
3525
3526 rtx
3527 delete_insn (insn)
3528      register rtx insn;
3529 {
3530   register rtx next = NEXT_INSN (insn);
3531   register rtx prev = PREV_INSN (insn);
3532   register int was_code_label = (GET_CODE (insn) == CODE_LABEL);
3533   register int dont_really_delete = 0;
3534
3535   while (next && INSN_DELETED_P (next))
3536     next = NEXT_INSN (next);
3537
3538   /* This insn is already deleted => return first following nondeleted.  */
3539   if (INSN_DELETED_P (insn))
3540     return next;
3541
3542   /* Don't delete user-declared labels.  Convert them to special NOTEs
3543      instead.  */
3544   if (was_code_label && LABEL_NAME (insn) != 0
3545       && optimize && ! dont_really_delete)
3546     {
3547       PUT_CODE (insn, NOTE);
3548       NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
3549       NOTE_SOURCE_FILE (insn) = 0;
3550       dont_really_delete = 1;
3551     }
3552   else
3553     /* Mark this insn as deleted.  */
3554     INSN_DELETED_P (insn) = 1;
3555
3556   /* If this is an unconditional jump, delete it from the jump chain.  */
3557   if (simplejump_p (insn))
3558     delete_from_jump_chain (insn);
3559
3560   /* If instruction is followed by a barrier,
3561      delete the barrier too.  */
3562
3563   if (next != 0 && GET_CODE (next) == BARRIER)
3564     {
3565       INSN_DELETED_P (next) = 1;
3566       next = NEXT_INSN (next);
3567     }
3568
3569   /* Patch out INSN (and the barrier if any) */
3570
3571   if (optimize && ! dont_really_delete)
3572     {
3573       if (prev)
3574         {
3575           NEXT_INSN (prev) = next;
3576           if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
3577             NEXT_INSN (XVECEXP (PATTERN (prev), 0,
3578                                 XVECLEN (PATTERN (prev), 0) - 1)) = next;
3579         }
3580
3581       if (next)
3582         {
3583           PREV_INSN (next) = prev;
3584           if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
3585             PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
3586         }
3587
3588       if (prev && NEXT_INSN (prev) == 0)
3589         set_last_insn (prev);
3590     }
3591
3592   /* If deleting a jump, decrement the count of the label,
3593      and delete the label if it is now unused.  */
3594
3595   if (GET_CODE (insn) == JUMP_INSN && JUMP_LABEL (insn))
3596     if (--LABEL_NUSES (JUMP_LABEL (insn)) == 0)
3597       {
3598         /* This can delete NEXT or PREV,
3599            either directly if NEXT is JUMP_LABEL (INSN),
3600            or indirectly through more levels of jumps.  */
3601         delete_insn (JUMP_LABEL (insn));
3602         /* I feel a little doubtful about this loop,
3603            but I see no clean and sure alternative way
3604            to find the first insn after INSN that is not now deleted.
3605            I hope this works.  */
3606         while (next && INSN_DELETED_P (next))
3607           next = NEXT_INSN (next);
3608         return next;
3609       }
3610
3611   /* Likewise if we're deleting a dispatch table.  */
3612
3613   if (GET_CODE (insn) == JUMP_INSN
3614       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
3615           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
3616     {
3617       rtx pat = PATTERN (insn);
3618       int i, diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
3619       int len = XVECLEN (pat, diff_vec_p);
3620
3621       for (i = 0; i < len; i++)
3622         if (--LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0)) == 0)
3623           delete_insn (XEXP (XVECEXP (pat, diff_vec_p, i), 0));
3624       while (next && INSN_DELETED_P (next))
3625         next = NEXT_INSN (next);
3626       return next;
3627     }
3628
3629   while (prev && (INSN_DELETED_P (prev) || GET_CODE (prev) == NOTE))
3630     prev = PREV_INSN (prev);
3631
3632   /* If INSN was a label and a dispatch table follows it,
3633      delete the dispatch table.  The tablejump must have gone already.
3634      It isn't useful to fall through into a table.  */
3635
3636   if (was_code_label
3637       && NEXT_INSN (insn) != 0
3638       && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN
3639       && (GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_VEC
3640           || GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_DIFF_VEC))
3641     next = delete_insn (NEXT_INSN (insn));
3642
3643   /* If INSN was a label, delete insns following it if now unreachable.  */
3644
3645   if (was_code_label && prev && GET_CODE (prev) == BARRIER)
3646     {
3647       register RTX_CODE code;
3648       while (next != 0
3649              && (GET_RTX_CLASS (code = GET_CODE (next)) == 'i'
3650                  || code == NOTE || code == BARRIER
3651                  || (code == CODE_LABEL && INSN_DELETED_P (next))))
3652         {
3653           if (code == NOTE
3654               && NOTE_LINE_NUMBER (next) != NOTE_INSN_FUNCTION_END)
3655             next = NEXT_INSN (next);
3656           /* Keep going past other deleted labels to delete what follows.  */
3657           else if (code == CODE_LABEL && INSN_DELETED_P (next))
3658             next = NEXT_INSN (next);
3659           else
3660             /* Note: if this deletes a jump, it can cause more
3661                deletion of unreachable code, after a different label.
3662                As long as the value from this recursive call is correct,
3663                this invocation functions correctly.  */
3664             next = delete_insn (next);
3665         }
3666     }
3667
3668   return next;
3669 }
3670
3671 /* Advance from INSN till reaching something not deleted
3672    then return that.  May return INSN itself.  */
3673
3674 rtx
3675 next_nondeleted_insn (insn)
3676      rtx insn;
3677 {
3678   while (INSN_DELETED_P (insn))
3679     insn = NEXT_INSN (insn);
3680   return insn;
3681 }
3682 \f
3683 /* Delete a range of insns from FROM to TO, inclusive.
3684    This is for the sake of peephole optimization, so assume
3685    that whatever these insns do will still be done by a new
3686    peephole insn that will replace them.  */
3687
3688 void
3689 delete_for_peephole (from, to)
3690      register rtx from, to;
3691 {
3692   register rtx insn = from;
3693
3694   while (1)
3695     {
3696       register rtx next = NEXT_INSN (insn);
3697       register rtx prev = PREV_INSN (insn);
3698
3699       if (GET_CODE (insn) != NOTE)
3700         {
3701           INSN_DELETED_P (insn) = 1;
3702
3703           /* Patch this insn out of the chain.  */
3704           /* We don't do this all at once, because we
3705              must preserve all NOTEs.  */
3706           if (prev)
3707             NEXT_INSN (prev) = next;
3708
3709           if (next)
3710             PREV_INSN (next) = prev;
3711         }
3712
3713       if (insn == to)
3714         break;
3715       insn = next;
3716     }
3717
3718   /* Note that if TO is an unconditional jump
3719      we *do not* delete the BARRIER that follows,
3720      since the peephole that replaces this sequence
3721      is also an unconditional jump in that case.  */
3722 }
3723 \f
3724 /* Invert the condition of the jump JUMP, and make it jump
3725    to label NLABEL instead of where it jumps now.  */
3726
3727 int
3728 invert_jump (jump, nlabel)
3729      rtx jump, nlabel;
3730 {
3731   /* We have to either invert the condition and change the label or
3732      do neither.  Either operation could fail.  We first try to invert
3733      the jump. If that succeeds, we try changing the label.  If that fails,
3734      we invert the jump back to what it was.  */
3735
3736   if (! invert_exp (PATTERN (jump), jump))
3737     return 0;
3738
3739   if (redirect_jump (jump, nlabel))
3740     return 1;
3741
3742   if (! invert_exp (PATTERN (jump), jump))
3743     /* This should just be putting it back the way it was.  */
3744     abort ();
3745
3746   return  0;
3747 }
3748
3749 /* Invert the jump condition of rtx X contained in jump insn, INSN. 
3750
3751    Return 1 if we can do so, 0 if we cannot find a way to do so that
3752    matches a pattern.  */
3753
3754 int
3755 invert_exp (x, insn)
3756      rtx x;
3757      rtx insn;
3758 {
3759   register RTX_CODE code;
3760   register int i;
3761   register char *fmt;
3762
3763   code = GET_CODE (x);
3764
3765   if (code == IF_THEN_ELSE)
3766     {
3767       register rtx comp = XEXP (x, 0);
3768       register rtx tem;
3769
3770       /* We can do this in two ways:  The preferable way, which can only
3771          be done if this is not an integer comparison, is to reverse
3772          the comparison code.  Otherwise, swap the THEN-part and ELSE-part
3773          of the IF_THEN_ELSE.  If we can't do either, fail.  */
3774
3775       if (can_reverse_comparison_p (comp, insn)
3776           && validate_change (insn, &XEXP (x, 0),
3777                               gen_rtx (reverse_condition (GET_CODE (comp)),
3778                                        GET_MODE (comp), XEXP (comp, 0),
3779                                        XEXP (comp, 1)), 0))
3780         return 1;
3781                                        
3782       tem = XEXP (x, 1);
3783       validate_change (insn, &XEXP (x, 1), XEXP (x, 2), 1);
3784       validate_change (insn, &XEXP (x, 2), tem, 1);
3785       return apply_change_group ();
3786     }
3787
3788   fmt = GET_RTX_FORMAT (code);
3789   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3790     {
3791       if (fmt[i] == 'e')
3792         if (! invert_exp (XEXP (x, i), insn))
3793           return 0;
3794       if (fmt[i] == 'E')
3795         {
3796           register int j;
3797           for (j = 0; j < XVECLEN (x, i); j++)
3798             if (!invert_exp (XVECEXP (x, i, j), insn))
3799               return 0;
3800         }
3801     }
3802
3803   return 1;
3804 }
3805 \f
3806 /* Make jump JUMP jump to label NLABEL instead of where it jumps now.
3807    If the old jump target label is unused as a result,
3808    it and the code following it may be deleted.
3809
3810    If NLABEL is zero, we are to turn the jump into a (possibly conditional)
3811    RETURN insn.
3812
3813    The return value will be 1 if the change was made, 0 if it wasn't (this
3814    can only occur for NLABEL == 0).  */
3815
3816 int
3817 redirect_jump (jump, nlabel)
3818      rtx jump, nlabel;
3819 {
3820   register rtx olabel = JUMP_LABEL (jump);
3821
3822   if (nlabel == olabel)
3823     return 1;
3824
3825   if (! redirect_exp (&PATTERN (jump), olabel, nlabel, jump))
3826     return 0;
3827
3828   /* If this is an unconditional branch, delete it from the jump_chain of
3829      OLABEL and add it to the jump_chain of NLABEL (assuming both labels
3830      have UID's in range and JUMP_CHAIN is valid).  */
3831   if (jump_chain && (simplejump_p (jump)
3832                      || GET_CODE (PATTERN (jump)) == RETURN))
3833     {
3834       int label_index = nlabel ? INSN_UID (nlabel) : 0;
3835
3836       delete_from_jump_chain (jump);
3837       if (label_index < max_jump_chain
3838           && INSN_UID (jump) < max_jump_chain)
3839         {
3840           jump_chain[INSN_UID (jump)] = jump_chain[label_index];
3841           jump_chain[label_index] = jump;
3842         }
3843     }
3844
3845   JUMP_LABEL (jump) = nlabel;
3846   if (nlabel)
3847     ++LABEL_NUSES (nlabel);
3848
3849   if (olabel && --LABEL_NUSES (olabel) == 0)
3850     delete_insn (olabel);
3851
3852   return 1;
3853 }
3854
3855 /* Delete the instruction JUMP from any jump chain it might be on.  */
3856
3857 static void
3858 delete_from_jump_chain (jump)
3859      rtx jump;
3860 {
3861   int index;
3862   rtx olabel = JUMP_LABEL (jump);
3863
3864   /* Handle unconditional jumps.  */
3865   if (jump_chain && olabel != 0
3866       && INSN_UID (olabel) < max_jump_chain
3867       && simplejump_p (jump))
3868     index = INSN_UID (olabel);
3869   /* Handle return insns.  */
3870   else if (jump_chain && GET_CODE (PATTERN (jump)) == RETURN)
3871     index = 0;
3872   else return;
3873
3874   if (jump_chain[index] == jump)
3875     jump_chain[index] = jump_chain[INSN_UID (jump)];
3876   else
3877     {
3878       rtx insn;
3879
3880       for (insn = jump_chain[index];
3881            insn != 0;
3882            insn = jump_chain[INSN_UID (insn)])
3883         if (jump_chain[INSN_UID (insn)] == jump)
3884           {
3885             jump_chain[INSN_UID (insn)] = jump_chain[INSN_UID (jump)];
3886             break;
3887           }
3888     }
3889 }
3890
3891 /* If NLABEL is nonzero, throughout the rtx at LOC,
3892    alter (LABEL_REF OLABEL) to (LABEL_REF NLABEL).  If OLABEL is
3893    zero, alter (RETURN) to (LABEL_REF NLABEL).
3894
3895    If NLABEL is zero, alter (LABEL_REF OLABEL) to (RETURN) and check
3896    validity with validate_change.  Convert (set (pc) (label_ref olabel))
3897    to (return).
3898
3899    Return 0 if we found a change we would like to make but it is invalid.
3900    Otherwise, return 1.  */
3901
3902 int
3903 redirect_exp (loc, olabel, nlabel, insn)
3904      rtx *loc;
3905      rtx olabel, nlabel;
3906      rtx insn;
3907 {
3908   register rtx x = *loc;
3909   register RTX_CODE code = GET_CODE (x);
3910   register int i;
3911   register char *fmt;
3912
3913   if (code == LABEL_REF)
3914     {
3915       if (XEXP (x, 0) == olabel)
3916         {
3917           if (nlabel)
3918             XEXP (x, 0) = nlabel;
3919           else
3920             return validate_change (insn, loc, gen_rtx (RETURN, VOIDmode), 0);
3921           return 1;
3922         }
3923     }
3924   else if (code == RETURN && olabel == 0)
3925     {
3926       x = gen_rtx (LABEL_REF, VOIDmode, nlabel);
3927       if (loc == &PATTERN (insn))
3928         x = gen_rtx (SET, VOIDmode, pc_rtx, x);
3929       return validate_change (insn, loc, x, 0);
3930     }
3931
3932   if (code == SET && nlabel == 0 && SET_DEST (x) == pc_rtx
3933       && GET_CODE (SET_SRC (x)) == LABEL_REF
3934       && XEXP (SET_SRC (x), 0) == olabel)
3935     return validate_change (insn, loc, gen_rtx (RETURN, VOIDmode), 0);
3936
3937   fmt = GET_RTX_FORMAT (code);
3938   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3939     {
3940       if (fmt[i] == 'e')
3941         if (! redirect_exp (&XEXP (x, i), olabel, nlabel, insn))
3942           return 0;
3943       if (fmt[i] == 'E')
3944         {
3945           register int j;
3946           for (j = 0; j < XVECLEN (x, i); j++)
3947             if (! redirect_exp (&XVECEXP (x, i, j), olabel, nlabel, insn))
3948               return 0;
3949         }
3950     }
3951
3952   return 1;
3953 }
3954 \f
3955 /* Make jump JUMP jump to label NLABEL, assuming it used to be a tablejump.
3956
3957    If the old jump target label (before the dispatch table) becomes unused,
3958    it and the dispatch table may be deleted.  In that case, find the insn
3959    before the jump references that label and delete it and logical successors
3960    too.  */
3961
3962 static void
3963 redirect_tablejump (jump, nlabel)
3964      rtx jump, nlabel;
3965 {
3966   register rtx olabel = JUMP_LABEL (jump);
3967
3968   /* Add this jump to the jump_chain of NLABEL.  */
3969   if (jump_chain && INSN_UID (nlabel) < max_jump_chain
3970       && INSN_UID (jump) < max_jump_chain)
3971     {
3972       jump_chain[INSN_UID (jump)] = jump_chain[INSN_UID (nlabel)];
3973       jump_chain[INSN_UID (nlabel)] = jump;
3974     }
3975
3976   PATTERN (jump) = gen_jump (nlabel);
3977   JUMP_LABEL (jump) = nlabel;
3978   ++LABEL_NUSES (nlabel);
3979   INSN_CODE (jump) = -1;
3980
3981   if (--LABEL_NUSES (olabel) == 0)
3982     {
3983       delete_labelref_insn (jump, olabel, 0);
3984       delete_insn (olabel);
3985     }
3986 }
3987
3988 /* Find the insn referencing LABEL that is a logical predecessor of INSN.
3989    If we found one, delete it and then delete this insn if DELETE_THIS is
3990    non-zero.  Return non-zero if INSN or a predecessor references LABEL.  */
3991
3992 static int
3993 delete_labelref_insn (insn, label, delete_this)
3994      rtx insn, label;
3995      int delete_this;
3996 {
3997   int deleted = 0;
3998   rtx link;
3999
4000   if (GET_CODE (insn) != NOTE
4001       && reg_mentioned_p (label, PATTERN (insn)))
4002     {
4003       if (delete_this)
4004         {
4005           delete_insn (insn);
4006           deleted = 1;
4007         }
4008       else
4009         return 1;
4010     }
4011
4012   for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
4013     if (delete_labelref_insn (XEXP (link, 0), label, 1))
4014       {
4015         if (delete_this)
4016           {
4017             delete_insn (insn);
4018             deleted = 1;
4019           }
4020         else
4021           return 1;
4022       }
4023
4024   return deleted;
4025 }
4026 \f
4027 /* Like rtx_equal_p except that it considers two REGs as equal
4028    if they renumber to the same value and considers two commutative
4029    operations to be the same if the order of the operands has been
4030    reversed.  */
4031
4032 int
4033 rtx_renumbered_equal_p (x, y)
4034      rtx x, y;
4035 {
4036   register int i;
4037   register RTX_CODE code = GET_CODE (x);
4038   register char *fmt;
4039       
4040   if (x == y)
4041     return 1;
4042
4043   if ((code == REG || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG))
4044       && (GET_CODE (y) == REG || (GET_CODE (y) == SUBREG
4045                                   && GET_CODE (SUBREG_REG (y)) == REG)))
4046     {
4047       int reg_x = -1, reg_y = -1;
4048       int word_x = 0, word_y = 0;
4049
4050       if (GET_MODE (x) != GET_MODE (y))
4051         return 0;
4052
4053       /* If we haven't done any renumbering, don't
4054          make any assumptions.  */
4055       if (reg_renumber == 0)
4056         return rtx_equal_p (x, y);
4057
4058       if (code == SUBREG)
4059         {
4060           reg_x = REGNO (SUBREG_REG (x));
4061           word_x = SUBREG_WORD (x);
4062
4063           if (reg_renumber[reg_x] >= 0)
4064             {
4065               reg_x = reg_renumber[reg_x] + word_x;
4066               word_x = 0;
4067             }
4068         }
4069
4070       else
4071         {
4072           reg_x = REGNO (x);
4073           if (reg_renumber[reg_x] >= 0)
4074             reg_x = reg_renumber[reg_x];
4075         }
4076
4077       if (GET_CODE (y) == SUBREG)
4078         {
4079           reg_y = REGNO (SUBREG_REG (y));
4080           word_y = SUBREG_WORD (y);
4081
4082           if (reg_renumber[reg_y] >= 0)
4083             {
4084               reg_y = reg_renumber[reg_y];
4085               word_y = 0;
4086             }
4087         }
4088
4089       else
4090         {
4091           reg_y = REGNO (y);
4092           if (reg_renumber[reg_y] >= 0)
4093             reg_y = reg_renumber[reg_y];
4094         }
4095
4096       return reg_x >= 0 && reg_x == reg_y && word_x == word_y;
4097     }
4098
4099   /* Now we have disposed of all the cases 
4100      in which different rtx codes can match.  */
4101   if (code != GET_CODE (y))
4102     return 0;
4103
4104   switch (code)
4105     {
4106     case PC:
4107     case CC0:
4108     case ADDR_VEC:
4109     case ADDR_DIFF_VEC:
4110       return 0;
4111
4112     case CONST_INT:
4113       return INTVAL (x) == INTVAL (y);
4114
4115     case LABEL_REF:
4116       /* We can't assume nonlocal labels have their following insns yet.  */
4117       if (LABEL_REF_NONLOCAL_P (x) || LABEL_REF_NONLOCAL_P (y))
4118         return XEXP (x, 0) == XEXP (y, 0);
4119
4120       /* Two label-refs are equivalent if they point at labels
4121          in the same position in the instruction stream.  */
4122       return (next_real_insn (XEXP (x, 0))
4123               == next_real_insn (XEXP (y, 0)));
4124
4125     case SYMBOL_REF:
4126       return XSTR (x, 0) == XSTR (y, 0);
4127     }
4128
4129   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
4130
4131   if (GET_MODE (x) != GET_MODE (y))
4132     return 0;
4133
4134   /* For commutative operations, the RTX match if the operand match in any
4135      order.  Also handle the simple binary and unary cases without a loop.  */
4136   if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
4137     return ((rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
4138              && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)))
4139             || (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 1))
4140                 && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 0))));
4141   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
4142     return (rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0))
4143             && rtx_renumbered_equal_p (XEXP (x, 1), XEXP (y, 1)));
4144   else if (GET_RTX_CLASS (code) == '1')
4145     return rtx_renumbered_equal_p (XEXP (x, 0), XEXP (y, 0));
4146
4147   /* Compare the elements.  If any pair of corresponding elements
4148      fail to match, return 0 for the whole things.  */
4149
4150   fmt = GET_RTX_FORMAT (code);
4151   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4152     {
4153       register int j;
4154       switch (fmt[i])
4155         {
4156         case 'w':
4157           if (XWINT (x, i) != XWINT (y, i))
4158             return 0;
4159           break;
4160
4161         case 'i':
4162           if (XINT (x, i) != XINT (y, i))
4163             return 0;
4164           break;
4165
4166         case 's':
4167           if (strcmp (XSTR (x, i), XSTR (y, i)))
4168             return 0;
4169           break;
4170
4171         case 'e':
4172           if (! rtx_renumbered_equal_p (XEXP (x, i), XEXP (y, i)))
4173             return 0;
4174           break;
4175
4176         case 'u':
4177           if (XEXP (x, i) != XEXP (y, i))
4178             return 0;
4179           /* fall through.  */
4180         case '0':
4181           break;
4182
4183         case 'E':
4184           if (XVECLEN (x, i) != XVECLEN (y, i))
4185             return 0;
4186           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
4187             if (!rtx_renumbered_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)))
4188               return 0;
4189           break;
4190
4191         default:
4192           abort ();
4193         }
4194     }
4195   return 1;
4196 }
4197 \f
4198 /* If X is a hard register or equivalent to one or a subregister of one,
4199    return the hard register number.  If X is a pseudo register that was not
4200    assigned a hard register, return the pseudo register number.  Otherwise,
4201    return -1.  Any rtx is valid for X.  */
4202
4203 int
4204 true_regnum (x)
4205      rtx x;
4206 {
4207   if (GET_CODE (x) == REG)
4208     {
4209       if (REGNO (x) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO (x)] >= 0)
4210         return reg_renumber[REGNO (x)];
4211       return REGNO (x);
4212     }
4213   if (GET_CODE (x) == SUBREG)
4214     {
4215       int base = true_regnum (SUBREG_REG (x));
4216       if (base >= 0 && base < FIRST_PSEUDO_REGISTER)
4217         return SUBREG_WORD (x) + base;
4218     }
4219   return -1;
4220 }
4221 \f
4222 /* Optimize code of the form:
4223
4224         for (x = a[i]; x; ...)
4225           ...
4226         for (x = a[i]; x; ...)
4227           ...
4228       foo:
4229
4230    Loop optimize will change the above code into
4231
4232         if (x = a[i])
4233           for (;;)
4234              { ...; if (! (x = ...)) break; }
4235         if (x = a[i])
4236           for (;;)
4237              { ...; if (! (x = ...)) break; }
4238       foo:
4239
4240    In general, if the first test fails, the program can branch
4241    directly to `foo' and skip the second try which is doomed to fail.
4242    We run this after loop optimization and before flow analysis.  */
4243    
4244 /* When comparing the insn patterns, we track the fact that different
4245    pseudo-register numbers may have been used in each computation.
4246    The following array stores an equivalence -- same_regs[I] == J means
4247    that pseudo register I was used in the first set of tests in a context
4248    where J was used in the second set.  We also count the number of such
4249    pending equivalences.  If nonzero, the expressions really aren't the
4250    same.  */
4251
4252 static int *same_regs;
4253
4254 static int num_same_regs;
4255
4256 /* Track any registers modified between the target of the first jump and
4257    the second jump.  They never compare equal.  */
4258
4259 static char *modified_regs;
4260
4261 /* Record if memory was modified.  */
4262
4263 static int modified_mem;
4264
4265 /* Called via note_stores on each insn between the target of the first 
4266    branch and the second branch.  It marks any changed registers.  */
4267
4268 static void
4269 mark_modified_reg (dest, x)
4270      rtx dest;
4271      rtx x;
4272 {
4273   int regno, i;
4274
4275   if (GET_CODE (dest) == SUBREG)
4276     dest = SUBREG_REG (dest);
4277
4278   if (GET_CODE (dest) == MEM)
4279     modified_mem = 1;
4280
4281   if (GET_CODE (dest) != REG)
4282     return;
4283
4284   regno = REGNO (dest);
4285   if (regno >= FIRST_PSEUDO_REGISTER)
4286     modified_regs[regno] = 1;
4287   else
4288     for (i = 0; i < HARD_REGNO_NREGS (regno, GET_MODE (dest)); i++)
4289       modified_regs[regno + i] = 1;
4290 }
4291
4292 /* F is the first insn in the chain of insns.  */
4293    
4294 void
4295 thread_jumps (f, max_reg, flag_before_loop)
4296      rtx f;
4297      int max_reg;
4298      int flag_before_loop;
4299 {
4300   /* Basic algorithm is to find a conditional branch,
4301      the label it may branch to, and the branch after
4302      that label.  If the two branches test the same condition,
4303      walk back from both branch paths until the insn patterns
4304      differ, or code labels are hit.  If we make it back to
4305      the target of the first branch, then we know that the first branch
4306      will either always succeed or always fail depending on the relative
4307      senses of the two branches.  So adjust the first branch accordingly
4308      in this case.  */
4309      
4310   rtx label, b1, b2, t1, t2;
4311   enum rtx_code code1, code2;
4312   rtx b1op0, b1op1, b2op0, b2op1;
4313   int changed = 1;
4314   int i;
4315   int *all_reset;
4316
4317   /* Allocate register tables and quick-reset table.  */
4318   modified_regs = (char *) alloca (max_reg * sizeof (char));
4319   same_regs = (int *) alloca (max_reg * sizeof (int));
4320   all_reset = (int *) alloca (max_reg * sizeof (int));
4321   for (i = 0; i < max_reg; i++)
4322     all_reset[i] = -1;
4323     
4324   while (changed)
4325     {
4326       changed = 0;
4327
4328       for (b1 = f; b1; b1 = NEXT_INSN (b1))
4329         {
4330           /* Get to a candidate branch insn.  */
4331           if (GET_CODE (b1) != JUMP_INSN
4332               || ! condjump_p (b1) || simplejump_p (b1)
4333               || JUMP_LABEL (b1) == 0)
4334             continue;
4335
4336           bzero (modified_regs, max_reg * sizeof (char));
4337           modified_mem = 0;
4338
4339           bcopy ((char *) all_reset, (char *) same_regs,
4340                  max_reg * sizeof (int));
4341           num_same_regs = 0;
4342
4343           label = JUMP_LABEL (b1);
4344
4345           /* Look for a branch after the target.  Record any registers and
4346              memory modified between the target and the branch.  Stop when we
4347              get to a label since we can't know what was changed there.  */
4348           for (b2 = NEXT_INSN (label); b2; b2 = NEXT_INSN (b2))
4349             {
4350               if (GET_CODE (b2) == CODE_LABEL)
4351                 break;
4352
4353               else if (GET_CODE (b2) == JUMP_INSN)
4354                 {
4355                   /* If this is an unconditional jump and is the only use of
4356                      its target label, we can follow it.  */
4357                   if (simplejump_p (b2)
4358                       && JUMP_LABEL (b2) != 0
4359                       && LABEL_NUSES (JUMP_LABEL (b2)) == 1)
4360                     {
4361                       b2 = JUMP_LABEL (b2);
4362                       continue;
4363                     }
4364                   else
4365                     break;
4366                 }
4367
4368               if (GET_CODE (b2) != CALL_INSN && GET_CODE (b2) != INSN)
4369                 continue;
4370
4371               if (GET_CODE (b2) == CALL_INSN)
4372                 {
4373                   modified_mem = 1;
4374                   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4375                     if (call_used_regs[i] && ! fixed_regs[i]
4376                         && i != STACK_POINTER_REGNUM
4377                         && i != FRAME_POINTER_REGNUM
4378                         && i != HARD_FRAME_POINTER_REGNUM
4379                         && i != ARG_POINTER_REGNUM)
4380                       modified_regs[i] = 1;
4381                 }
4382
4383               note_stores (PATTERN (b2), mark_modified_reg);
4384             }
4385
4386           /* Check the next candidate branch insn from the label
4387              of the first.  */
4388           if (b2 == 0
4389               || GET_CODE (b2) != JUMP_INSN
4390               || b2 == b1
4391               || ! condjump_p (b2)
4392               || simplejump_p (b2))
4393             continue;
4394
4395           /* Get the comparison codes and operands, reversing the
4396              codes if appropriate.  If we don't have comparison codes,
4397              we can't do anything.  */
4398           b1op0 = XEXP (XEXP (SET_SRC (PATTERN (b1)), 0), 0);
4399           b1op1 = XEXP (XEXP (SET_SRC (PATTERN (b1)), 0), 1);
4400           code1 = GET_CODE (XEXP (SET_SRC (PATTERN (b1)), 0));
4401           if (XEXP (SET_SRC (PATTERN (b1)), 1) == pc_rtx)
4402             code1 = reverse_condition (code1);
4403
4404           b2op0 = XEXP (XEXP (SET_SRC (PATTERN (b2)), 0), 0);
4405           b2op1 = XEXP (XEXP (SET_SRC (PATTERN (b2)), 0), 1);
4406           code2 = GET_CODE (XEXP (SET_SRC (PATTERN (b2)), 0));
4407           if (XEXP (SET_SRC (PATTERN (b2)), 1) == pc_rtx)
4408             code2 = reverse_condition (code2);
4409
4410           /* If they test the same things and knowing that B1 branches
4411              tells us whether or not B2 branches, check if we
4412              can thread the branch.  */
4413           if (rtx_equal_for_thread_p (b1op0, b2op0, b2)
4414               && rtx_equal_for_thread_p (b1op1, b2op1, b2)
4415               && (comparison_dominates_p (code1, code2)
4416                   || comparison_dominates_p (code1, reverse_condition (code2))))
4417             {
4418               t1 = prev_nonnote_insn (b1);
4419               t2 = prev_nonnote_insn (b2);
4420               
4421               while (t1 != 0 && t2 != 0)
4422                 {
4423                   if (t2 == label)
4424                     {
4425                       /* We have reached the target of the first branch.
4426                          If there are no pending register equivalents,
4427                          we know that this branch will either always
4428                          succeed (if the senses of the two branches are
4429                          the same) or always fail (if not).  */
4430                       rtx new_label;
4431
4432                       if (num_same_regs != 0)
4433                         break;
4434
4435                       if (comparison_dominates_p (code1, code2))
4436                         new_label = JUMP_LABEL (b2);
4437                       else
4438                         new_label = get_label_after (b2);
4439
4440                       if (JUMP_LABEL (b1) != new_label)
4441                         {
4442                           rtx prev = PREV_INSN (new_label);
4443
4444                           if (flag_before_loop
4445                               && NOTE_LINE_NUMBER (prev) == NOTE_INSN_LOOP_BEG)
4446                             {
4447                               /* Don't thread to the loop label.  If a loop
4448                                  label is reused, loop optimization will
4449                                  be disabled for that loop.  */
4450                               new_label = gen_label_rtx ();
4451                               emit_label_after (new_label, PREV_INSN (prev));
4452                             }
4453                           changed |= redirect_jump (b1, new_label);
4454                         }
4455                       break;
4456                     }
4457                     
4458                   /* If either of these is not a normal insn (it might be
4459                      a JUMP_INSN, CALL_INSN, or CODE_LABEL) we fail.  (NOTEs
4460                      have already been skipped above.)  Similarly, fail
4461                      if the insns are different.  */
4462                   if (GET_CODE (t1) != INSN || GET_CODE (t2) != INSN
4463                       || recog_memoized (t1) != recog_memoized (t2)
4464                       || ! rtx_equal_for_thread_p (PATTERN (t1),
4465                                                    PATTERN (t2), t2))
4466                     break;
4467                     
4468                   t1 = prev_nonnote_insn (t1);
4469                   t2 = prev_nonnote_insn (t2);
4470                 }
4471             }
4472         }
4473     }
4474 }
4475 \f
4476 /* This is like RTX_EQUAL_P except that it knows about our handling of
4477    possibly equivalent registers and knows to consider volatile and
4478    modified objects as not equal.
4479    
4480    YINSN is the insn containing Y.  */
4481
4482 int
4483 rtx_equal_for_thread_p (x, y, yinsn)
4484      rtx x, y;
4485      rtx yinsn;
4486 {
4487   register int i;
4488   register int j;
4489   register enum rtx_code code;
4490   register char *fmt;
4491
4492   code = GET_CODE (x);
4493   /* Rtx's of different codes cannot be equal.  */
4494   if (code != GET_CODE (y))
4495     return 0;
4496
4497   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
4498      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
4499
4500   if (GET_MODE (x) != GET_MODE (y))
4501     return 0;
4502
4503   /* For commutative operations, the RTX match if the operand match in any
4504      order.  Also handle the simple binary and unary cases without a loop.  */
4505   if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
4506     return ((rtx_equal_for_thread_p (XEXP (x, 0), XEXP (y, 0), yinsn)
4507              && rtx_equal_for_thread_p (XEXP (x, 1), XEXP (y, 1), yinsn))
4508             || (rtx_equal_for_thread_p (XEXP (x, 0), XEXP (y, 1), yinsn)
4509                 && rtx_equal_for_thread_p (XEXP (x, 1), XEXP (y, 0), yinsn)));
4510   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
4511     return (rtx_equal_for_thread_p (XEXP (x, 0), XEXP (y, 0), yinsn)
4512             && rtx_equal_for_thread_p (XEXP (x, 1), XEXP (y, 1), yinsn));
4513   else if (GET_RTX_CLASS (code) == '1')
4514     return rtx_equal_for_thread_p (XEXP (x, 0), XEXP (y, 0), yinsn);
4515
4516   /* Handle special-cases first.  */
4517   switch (code)
4518     {
4519     case REG:
4520       if (REGNO (x) == REGNO (y) && ! modified_regs[REGNO (x)])
4521         return 1;
4522
4523       /* If neither is user variable or hard register, check for possible
4524          equivalence.  */
4525       if (REG_USERVAR_P (x) || REG_USERVAR_P (y)
4526           || REGNO (x) < FIRST_PSEUDO_REGISTER
4527           || REGNO (y) < FIRST_PSEUDO_REGISTER)
4528         return 0;
4529
4530       if (same_regs[REGNO (x)] == -1)
4531         {
4532           same_regs[REGNO (x)] = REGNO (y);
4533           num_same_regs++;
4534
4535           /* If this is the first time we are seeing a register on the `Y'
4536              side, see if it is the last use.  If not, we can't thread the 
4537              jump, so mark it as not equivalent.  */
4538           if (regno_last_uid[REGNO (y)] != INSN_UID (yinsn))
4539             return 0;
4540
4541           return 1;
4542         }
4543       else
4544         return (same_regs[REGNO (x)] == REGNO (y));
4545
4546       break;
4547
4548     case MEM:
4549       /* If memory modified or either volatile, not equivalent.
4550          Else, check address.  */
4551       if (modified_mem || MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
4552         return 0;
4553
4554       return rtx_equal_for_thread_p (XEXP (x, 0), XEXP (y, 0), yinsn);
4555
4556     case ASM_INPUT:
4557       if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
4558         return 0;
4559
4560       break;
4561
4562     case SET:
4563       /* Cancel a pending `same_regs' if setting equivalenced registers.
4564          Then process source.  */
4565       if (GET_CODE (SET_DEST (x)) == REG
4566           && GET_CODE (SET_DEST (y)) == REG)
4567         {
4568           if (same_regs[REGNO (SET_DEST (x))] == REGNO (SET_DEST (y)))
4569             {
4570               same_regs[REGNO (SET_DEST (x))] = -1;
4571               num_same_regs--;
4572             }
4573           else if (REGNO (SET_DEST (x)) != REGNO (SET_DEST (y)))
4574             return 0;
4575         }
4576       else
4577         if (rtx_equal_for_thread_p (SET_DEST (x), SET_DEST (y), yinsn) == 0)
4578           return 0;
4579
4580       return rtx_equal_for_thread_p (SET_SRC (x), SET_SRC (y), yinsn);
4581
4582     case LABEL_REF:
4583       return XEXP (x, 0) == XEXP (y, 0);
4584
4585     case SYMBOL_REF:
4586       return XSTR (x, 0) == XSTR (y, 0);
4587     }
4588
4589   if (x == y)
4590     return 1;
4591
4592   fmt = GET_RTX_FORMAT (code);
4593   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4594     {
4595       switch (fmt[i])
4596         {
4597         case 'w':
4598           if (XWINT (x, i) != XWINT (y, i))
4599             return 0;
4600           break;
4601
4602         case 'n':
4603         case 'i':
4604           if (XINT (x, i) != XINT (y, i))
4605             return 0;
4606           break;
4607
4608         case 'V':
4609         case 'E':
4610           /* Two vectors must have the same length.  */
4611           if (XVECLEN (x, i) != XVECLEN (y, i))
4612             return 0;
4613
4614           /* And the corresponding elements must match.  */
4615           for (j = 0; j < XVECLEN (x, i); j++)
4616             if (rtx_equal_for_thread_p (XVECEXP (x, i, j),
4617                                         XVECEXP (y, i, j), yinsn) == 0)
4618               return 0;
4619           break;
4620
4621         case 'e':
4622           if (rtx_equal_for_thread_p (XEXP (x, i), XEXP (y, i), yinsn) == 0)
4623             return 0;
4624           break;
4625
4626         case 'S':
4627         case 's':
4628           if (strcmp (XSTR (x, i), XSTR (y, i)))
4629             return 0;
4630           break;
4631
4632         case 'u':
4633           /* These are just backpointers, so they don't matter.  */
4634           break;
4635
4636         case '0':
4637           break;
4638
4639           /* It is believed that rtx's at this level will never
4640              contain anything but integers and other rtx's,
4641              except for within LABEL_REFs and SYMBOL_REFs.  */
4642         default:
4643           abort ();
4644         }
4645     }
4646   return 1;
4647 }