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