OSDN Git Service

* loop.c (emit_prefetch_instructions): Properly place the address computation.
[pf3gnuchains/gcc-fork.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This module is essentially the "combiner" phase of the U. of Arizona
23    Portable Optimizer, but redone to work on our list-structured
24    representation for RTL instead of their string representation.
25
26    The LOG_LINKS of each insn identify the most recent assignment
27    to each REG used in the insn.  It is a list of previous insns,
28    each of which contains a SET for a REG that is used in this insn
29    and not used or set in between.  LOG_LINKs never cross basic blocks.
30    They were set up by the preceding pass (lifetime analysis).
31
32    We try to combine each pair of insns joined by a logical link.
33    We also try to combine triples of insns A, B and C when
34    C has a link back to B and B has a link back to A.
35
36    LOG_LINKS does not have links for use of the CC0.  They don't
37    need to, because the insn that sets the CC0 is always immediately
38    before the insn that tests it.  So we always regard a branch
39    insn as having a logical link to the preceding insn.  The same is true
40    for an insn explicitly using CC0.
41
42    We check (with use_crosses_set_p) to avoid combining in such a way
43    as to move a computation to a place where its value would be different.
44
45    Combination is done by mathematically substituting the previous
46    insn(s) values for the regs they set into the expressions in
47    the later insns that refer to these regs.  If the result is a valid insn
48    for our target machine, according to the machine description,
49    we install it, delete the earlier insns, and update the data flow
50    information (LOG_LINKS and REG_NOTES) for what we did.
51
52    There are a few exceptions where the dataflow information created by
53    flow.c aren't completely updated:
54
55    - reg_live_length is not updated
56    - reg_n_refs is not adjusted in the rare case when a register is
57      no longer required in a computation
58    - there are extremely rare cases (see distribute_regnotes) when a
59      REG_DEAD note is lost
60    - a LOG_LINKS entry that refers to an insn with multiple SETs may be
61      removed because there is no way to know which register it was
62      linking
63
64    To simplify substitution, we combine only when the earlier insn(s)
65    consist of only a single assignment.  To simplify updating afterward,
66    we never combine when a subroutine call appears in the middle.
67
68    Since we do not represent assignments to CC0 explicitly except when that
69    is all an insn does, there is no LOG_LINKS entry in an insn that uses
70    the condition code for the insn that set the condition code.
71    Fortunately, these two insns must be consecutive.
72    Therefore, every JUMP_INSN is taken to have an implicit logical link
73    to the preceding insn.  This is not quite right, since non-jumps can
74    also use the condition code; but in practice such insns would not
75    combine anyway.  */
76
77 #include "config.h"
78 #include "system.h"
79 #include "rtl.h"
80 #include "tm_p.h"
81 #include "flags.h"
82 #include "regs.h"
83 #include "hard-reg-set.h"
84 #include "basic-block.h"
85 #include "insn-config.h"
86 #include "function.h"
87 /* Include expr.h after insn-config.h so we get HAVE_conditional_move.  */
88 #include "expr.h"
89 #include "insn-attr.h"
90 #include "recog.h"
91 #include "real.h"
92 #include "toplev.h"
93
94 /* It is not safe to use ordinary gen_lowpart in combine.
95    Use gen_lowpart_for_combine instead.  See comments there.  */
96 #define gen_lowpart dont_use_gen_lowpart_you_dummy
97
98 /* Number of attempts to combine instructions in this function.  */
99
100 static int combine_attempts;
101
102 /* Number of attempts that got as far as substitution in this function.  */
103
104 static int combine_merges;
105
106 /* Number of instructions combined with added SETs in this function.  */
107
108 static int combine_extras;
109
110 /* Number of instructions combined in this function.  */
111
112 static int combine_successes;
113
114 /* Totals over entire compilation.  */
115
116 static int total_attempts, total_merges, total_extras, total_successes;
117
118 \f
119 /* Vector mapping INSN_UIDs to cuids.
120    The cuids are like uids but increase monotonically always.
121    Combine always uses cuids so that it can compare them.
122    But actually renumbering the uids, which we used to do,
123    proves to be a bad idea because it makes it hard to compare
124    the dumps produced by earlier passes with those from later passes.  */
125
126 static int *uid_cuid;
127 static int max_uid_cuid;
128
129 /* Get the cuid of an insn.  */
130
131 #define INSN_CUID(INSN) \
132 (INSN_UID (INSN) > max_uid_cuid ? insn_cuid (INSN) : uid_cuid[INSN_UID (INSN)])
133
134 /* In case BITS_PER_WORD == HOST_BITS_PER_WIDE_INT, shifting by
135    BITS_PER_WORD would invoke undefined behavior.  Work around it.  */
136
137 #define UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD(val) \
138   (((unsigned HOST_WIDE_INT) (val) << (BITS_PER_WORD - 1)) << 1)
139
140 /* Maximum register number, which is the size of the tables below.  */
141
142 static unsigned int combine_max_regno;
143
144 /* Record last point of death of (hard or pseudo) register n.  */
145
146 static rtx *reg_last_death;
147
148 /* Record last point of modification of (hard or pseudo) register n.  */
149
150 static rtx *reg_last_set;
151
152 /* Record the cuid of the last insn that invalidated memory
153    (anything that writes memory, and subroutine calls, but not pushes).  */
154
155 static int mem_last_set;
156
157 /* Record the cuid of the last CALL_INSN
158    so we can tell whether a potential combination crosses any calls.  */
159
160 static int last_call_cuid;
161
162 /* When `subst' is called, this is the insn that is being modified
163    (by combining in a previous insn).  The PATTERN of this insn
164    is still the old pattern partially modified and it should not be
165    looked at, but this may be used to examine the successors of the insn
166    to judge whether a simplification is valid.  */
167
168 static rtx subst_insn;
169
170 /* This is an insn that belongs before subst_insn, but is not currently
171    on the insn chain.  */
172
173 static rtx subst_prev_insn;
174
175 /* This is the lowest CUID that `subst' is currently dealing with.
176    get_last_value will not return a value if the register was set at or
177    after this CUID.  If not for this mechanism, we could get confused if
178    I2 or I1 in try_combine were an insn that used the old value of a register
179    to obtain a new value.  In that case, we might erroneously get the
180    new value of the register when we wanted the old one.  */
181
182 static int subst_low_cuid;
183
184 /* This contains any hard registers that are used in newpat; reg_dead_at_p
185    must consider all these registers to be always live.  */
186
187 static HARD_REG_SET newpat_used_regs;
188
189 /* This is an insn to which a LOG_LINKS entry has been added.  If this
190    insn is the earlier than I2 or I3, combine should rescan starting at
191    that location.  */
192
193 static rtx added_links_insn;
194
195 /* Basic block in which we are performing combines.  */
196 static basic_block this_basic_block;
197
198 /* A bitmap indicating which blocks had registers go dead at entry.
199    After combine, we'll need to re-do global life analysis with
200    those blocks as starting points.  */
201 static sbitmap refresh_blocks;
202 static int need_refresh;
203 \f
204 /* The next group of arrays allows the recording of the last value assigned
205    to (hard or pseudo) register n.  We use this information to see if a
206    operation being processed is redundant given a prior operation performed
207    on the register.  For example, an `and' with a constant is redundant if
208    all the zero bits are already known to be turned off.
209
210    We use an approach similar to that used by cse, but change it in the
211    following ways:
212
213    (1) We do not want to reinitialize at each label.
214    (2) It is useful, but not critical, to know the actual value assigned
215        to a register.  Often just its form is helpful.
216
217    Therefore, we maintain the following arrays:
218
219    reg_last_set_value           the last value assigned
220    reg_last_set_label           records the value of label_tick when the
221                                 register was assigned
222    reg_last_set_table_tick      records the value of label_tick when a
223                                 value using the register is assigned
224    reg_last_set_invalid         set to non-zero when it is not valid
225                                 to use the value of this register in some
226                                 register's value
227
228    To understand the usage of these tables, it is important to understand
229    the distinction between the value in reg_last_set_value being valid
230    and the register being validly contained in some other expression in the
231    table.
232
233    Entry I in reg_last_set_value is valid if it is non-zero, and either
234    reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick.
235
236    Register I may validly appear in any expression returned for the value
237    of another register if reg_n_sets[i] is 1.  It may also appear in the
238    value for register J if reg_last_set_label[i] < reg_last_set_label[j] or
239    reg_last_set_invalid[j] is zero.
240
241    If an expression is found in the table containing a register which may
242    not validly appear in an expression, the register is replaced by
243    something that won't match, (clobber (const_int 0)).
244
245    reg_last_set_invalid[i] is set non-zero when register I is being assigned
246    to and reg_last_set_table_tick[i] == label_tick.  */
247
248 /* Record last value assigned to (hard or pseudo) register n.  */
249
250 static rtx *reg_last_set_value;
251
252 /* Record the value of label_tick when the value for register n is placed in
253    reg_last_set_value[n].  */
254
255 static int *reg_last_set_label;
256
257 /* Record the value of label_tick when an expression involving register n
258    is placed in reg_last_set_value.  */
259
260 static int *reg_last_set_table_tick;
261
262 /* Set non-zero if references to register n in expressions should not be
263    used.  */
264
265 static char *reg_last_set_invalid;
266
267 /* Incremented for each label.  */
268
269 static int label_tick;
270
271 /* Some registers that are set more than once and used in more than one
272    basic block are nevertheless always set in similar ways.  For example,
273    a QImode register may be loaded from memory in two places on a machine
274    where byte loads zero extend.
275
276    We record in the following array what we know about the nonzero
277    bits of a register, specifically which bits are known to be zero.
278
279    If an entry is zero, it means that we don't know anything special.  */
280
281 static unsigned HOST_WIDE_INT *reg_nonzero_bits;
282
283 /* Mode used to compute significance in reg_nonzero_bits.  It is the largest
284    integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
285
286 static enum machine_mode nonzero_bits_mode;
287
288 /* Nonzero if we know that a register has some leading bits that are always
289    equal to the sign bit.  */
290
291 static unsigned char *reg_sign_bit_copies;
292
293 /* Nonzero when reg_nonzero_bits and reg_sign_bit_copies can be safely used.
294    It is zero while computing them and after combine has completed.  This
295    former test prevents propagating values based on previously set values,
296    which can be incorrect if a variable is modified in a loop.  */
297
298 static int nonzero_sign_valid;
299
300 /* These arrays are maintained in parallel with reg_last_set_value
301    and are used to store the mode in which the register was last set,
302    the bits that were known to be zero when it was last set, and the
303    number of sign bits copies it was known to have when it was last set.  */
304
305 static enum machine_mode *reg_last_set_mode;
306 static unsigned HOST_WIDE_INT *reg_last_set_nonzero_bits;
307 static char *reg_last_set_sign_bit_copies;
308 \f
309 /* Record one modification to rtl structure
310    to be undone by storing old_contents into *where.
311    is_int is 1 if the contents are an int.  */
312
313 struct undo
314 {
315   struct undo *next;
316   int is_int;
317   union {rtx r; unsigned int i;} old_contents;
318   union {rtx *r; unsigned int *i;} where;
319 };
320
321 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
322    num_undo says how many are currently recorded.
323
324    other_insn is nonzero if we have modified some other insn in the process
325    of working on subst_insn.  It must be verified too.  */
326
327 struct undobuf
328 {
329   struct undo *undos;
330   struct undo *frees;
331   rtx other_insn;
332 };
333
334 static struct undobuf undobuf;
335
336 /* Number of times the pseudo being substituted for
337    was found and replaced.  */
338
339 static int n_occurrences;
340
341 static void do_SUBST                    PARAMS ((rtx *, rtx));
342 static void do_SUBST_INT                PARAMS ((unsigned int *,
343                                                  unsigned int));
344 static void init_reg_last_arrays        PARAMS ((void));
345 static void setup_incoming_promotions   PARAMS ((void));
346 static void set_nonzero_bits_and_sign_copies  PARAMS ((rtx, rtx, void *));
347 static int cant_combine_insn_p  PARAMS ((rtx));
348 static int can_combine_p        PARAMS ((rtx, rtx, rtx, rtx, rtx *, rtx *));
349 static int sets_function_arg_p  PARAMS ((rtx));
350 static int combinable_i3pat     PARAMS ((rtx, rtx *, rtx, rtx, int, rtx *));
351 static int contains_muldiv      PARAMS ((rtx));
352 static rtx try_combine          PARAMS ((rtx, rtx, rtx, int *));
353 static void undo_all            PARAMS ((void));
354 static void undo_commit         PARAMS ((void));
355 static rtx *find_split_point    PARAMS ((rtx *, rtx));
356 static rtx subst                PARAMS ((rtx, rtx, rtx, int, int));
357 static rtx combine_simplify_rtx PARAMS ((rtx, enum machine_mode, int, int));
358 static rtx simplify_if_then_else  PARAMS ((rtx));
359 static rtx simplify_set         PARAMS ((rtx));
360 static rtx simplify_logical     PARAMS ((rtx, int));
361 static rtx expand_compound_operation  PARAMS ((rtx));
362 static rtx expand_field_assignment  PARAMS ((rtx));
363 static rtx make_extraction      PARAMS ((enum machine_mode, rtx, HOST_WIDE_INT,
364                                          rtx, unsigned HOST_WIDE_INT, int,
365                                          int, int));
366 static rtx extract_left_shift   PARAMS ((rtx, int));
367 static rtx make_compound_operation  PARAMS ((rtx, enum rtx_code));
368 static int get_pos_from_mask    PARAMS ((unsigned HOST_WIDE_INT,
369                                          unsigned HOST_WIDE_INT *));
370 static rtx force_to_mode        PARAMS ((rtx, enum machine_mode,
371                                          unsigned HOST_WIDE_INT, rtx, int));
372 static rtx if_then_else_cond    PARAMS ((rtx, rtx *, rtx *));
373 static rtx known_cond           PARAMS ((rtx, enum rtx_code, rtx, rtx));
374 static int rtx_equal_for_field_assignment_p PARAMS ((rtx, rtx));
375 static rtx make_field_assignment  PARAMS ((rtx));
376 static rtx apply_distributive_law  PARAMS ((rtx));
377 static rtx simplify_and_const_int  PARAMS ((rtx, enum machine_mode, rtx,
378                                             unsigned HOST_WIDE_INT));
379 static unsigned HOST_WIDE_INT nonzero_bits  PARAMS ((rtx, enum machine_mode));
380 static unsigned int num_sign_bit_copies  PARAMS ((rtx, enum machine_mode));
381 static int merge_outer_ops      PARAMS ((enum rtx_code *, HOST_WIDE_INT *,
382                                          enum rtx_code, HOST_WIDE_INT,
383                                          enum machine_mode, int *));
384 static rtx simplify_shift_const PARAMS ((rtx, enum rtx_code, enum machine_mode,
385                                          rtx, int));
386 static int recog_for_combine    PARAMS ((rtx *, rtx, rtx *));
387 static rtx gen_lowpart_for_combine  PARAMS ((enum machine_mode, rtx));
388 static rtx gen_binary           PARAMS ((enum rtx_code, enum machine_mode,
389                                          rtx, rtx));
390 static enum rtx_code simplify_comparison  PARAMS ((enum rtx_code, rtx *, rtx *));
391 static void update_table_tick   PARAMS ((rtx));
392 static void record_value_for_reg  PARAMS ((rtx, rtx, rtx));
393 static void check_promoted_subreg PARAMS ((rtx, rtx));
394 static void record_dead_and_set_regs_1  PARAMS ((rtx, rtx, void *));
395 static void record_dead_and_set_regs  PARAMS ((rtx));
396 static int get_last_value_validate  PARAMS ((rtx *, rtx, int, int));
397 static rtx get_last_value       PARAMS ((rtx));
398 static int use_crosses_set_p    PARAMS ((rtx, int));
399 static void reg_dead_at_p_1     PARAMS ((rtx, rtx, void *));
400 static int reg_dead_at_p        PARAMS ((rtx, rtx));
401 static void move_deaths         PARAMS ((rtx, rtx, int, rtx, rtx *));
402 static int reg_bitfield_target_p  PARAMS ((rtx, rtx));
403 static void distribute_notes    PARAMS ((rtx, rtx, rtx, rtx, rtx, rtx));
404 static void distribute_links    PARAMS ((rtx));
405 static void mark_used_regs_combine PARAMS ((rtx));
406 static int insn_cuid            PARAMS ((rtx));
407 static void record_promoted_value PARAMS ((rtx, rtx));
408 static rtx reversed_comparison  PARAMS ((rtx, enum machine_mode, rtx, rtx));
409 static enum rtx_code combine_reversed_comparison_code PARAMS ((rtx));
410 \f
411 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
412    insn.  The substitution can be undone by undo_all.  If INTO is already
413    set to NEWVAL, do not record this change.  Because computing NEWVAL might
414    also call SUBST, we have to compute it before we put anything into
415    the undo table.  */
416
417 static void
418 do_SUBST (into, newval)
419      rtx *into, newval;
420 {
421   struct undo *buf;
422   rtx oldval = *into;
423
424   if (oldval == newval)
425     return;
426
427   /* We'd like to catch as many invalid transformations here as
428      possible.  Unfortunately, there are way too many mode changes
429      that are perfectly valid, so we'd waste too much effort for
430      little gain doing the checks here.  Focus on catching invalid
431      transformations involving integer constants.  */
432   if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
433       && GET_CODE (newval) == CONST_INT)
434     {
435       /* Sanity check that we're replacing oldval with a CONST_INT
436          that is a valid sign-extension for the original mode.  */
437       if (INTVAL (newval) != trunc_int_for_mode (INTVAL (newval),
438                                                  GET_MODE (oldval)))
439         abort ();
440
441       /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
442          CONST_INT is not valid, because after the replacement, the
443          original mode would be gone.  Unfortunately, we can't tell
444          when do_SUBST is called to replace the operand thereof, so we
445          perform this test on oldval instead, checking whether an
446          invalid replacement took place before we got here.  */
447       if ((GET_CODE (oldval) == SUBREG
448            && GET_CODE (SUBREG_REG (oldval)) == CONST_INT)
449           || (GET_CODE (oldval) == ZERO_EXTEND
450               && GET_CODE (XEXP (oldval, 0)) == CONST_INT))
451         abort ();
452      }
453
454   if (undobuf.frees)
455     buf = undobuf.frees, undobuf.frees = buf->next;
456   else
457     buf = (struct undo *) xmalloc (sizeof (struct undo));
458
459   buf->is_int = 0;
460   buf->where.r = into;
461   buf->old_contents.r = oldval;
462   *into = newval;
463
464   buf->next = undobuf.undos, undobuf.undos = buf;
465 }
466
467 #define SUBST(INTO, NEWVAL)     do_SUBST(&(INTO), (NEWVAL))
468
469 /* Similar to SUBST, but NEWVAL is an int expression.  Note that substitution
470    for the value of a HOST_WIDE_INT value (including CONST_INT) is
471    not safe.  */
472
473 static void
474 do_SUBST_INT (into, newval)
475      unsigned int *into, newval;
476 {
477   struct undo *buf;
478   unsigned int oldval = *into;
479
480   if (oldval == newval)
481     return;
482
483   if (undobuf.frees)
484     buf = undobuf.frees, undobuf.frees = buf->next;
485   else
486     buf = (struct undo *) xmalloc (sizeof (struct undo));
487
488   buf->is_int = 1;
489   buf->where.i = into;
490   buf->old_contents.i = oldval;
491   *into = newval;
492
493   buf->next = undobuf.undos, undobuf.undos = buf;
494 }
495
496 #define SUBST_INT(INTO, NEWVAL)  do_SUBST_INT(&(INTO), (NEWVAL))
497 \f
498 /* Main entry point for combiner.  F is the first insn of the function.
499    NREGS is the first unused pseudo-reg number.
500
501    Return non-zero if the combiner has turned an indirect jump
502    instruction into a direct jump.  */
503 int
504 combine_instructions (f, nregs)
505      rtx f;
506      unsigned int nregs;
507 {
508   rtx insn, next;
509 #ifdef HAVE_cc0
510   rtx prev;
511 #endif
512   int i;
513   rtx links, nextlinks;
514
515   int new_direct_jump_p = 0;
516
517   combine_attempts = 0;
518   combine_merges = 0;
519   combine_extras = 0;
520   combine_successes = 0;
521
522   combine_max_regno = nregs;
523
524   reg_nonzero_bits = ((unsigned HOST_WIDE_INT *)
525                       xcalloc (nregs, sizeof (unsigned HOST_WIDE_INT)));
526   reg_sign_bit_copies
527     = (unsigned char *) xcalloc (nregs, sizeof (unsigned char));
528
529   reg_last_death = (rtx *) xmalloc (nregs * sizeof (rtx));
530   reg_last_set = (rtx *) xmalloc (nregs * sizeof (rtx));
531   reg_last_set_value = (rtx *) xmalloc (nregs * sizeof (rtx));
532   reg_last_set_table_tick = (int *) xmalloc (nregs * sizeof (int));
533   reg_last_set_label = (int *) xmalloc (nregs * sizeof (int));
534   reg_last_set_invalid = (char *) xmalloc (nregs * sizeof (char));
535   reg_last_set_mode
536     = (enum machine_mode *) xmalloc (nregs * sizeof (enum machine_mode));
537   reg_last_set_nonzero_bits
538     = (unsigned HOST_WIDE_INT *) xmalloc (nregs * sizeof (HOST_WIDE_INT));
539   reg_last_set_sign_bit_copies
540     = (char *) xmalloc (nregs * sizeof (char));
541
542   init_reg_last_arrays ();
543
544   init_recog_no_volatile ();
545
546   /* Compute maximum uid value so uid_cuid can be allocated.  */
547
548   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
549     if (INSN_UID (insn) > i)
550       i = INSN_UID (insn);
551
552   uid_cuid = (int *) xmalloc ((i + 1) * sizeof (int));
553   max_uid_cuid = i;
554
555   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
556
557   /* Don't use reg_nonzero_bits when computing it.  This can cause problems
558      when, for example, we have j <<= 1 in a loop.  */
559
560   nonzero_sign_valid = 0;
561
562   /* Compute the mapping from uids to cuids.
563      Cuids are numbers assigned to insns, like uids,
564      except that cuids increase monotonically through the code.
565
566      Scan all SETs and see if we can deduce anything about what
567      bits are known to be zero for some registers and how many copies
568      of the sign bit are known to exist for those registers.
569
570      Also set any known values so that we can use it while searching
571      for what bits are known to be set.  */
572
573   label_tick = 1;
574
575   /* We need to initialize it here, because record_dead_and_set_regs may call
576      get_last_value.  */
577   subst_prev_insn = NULL_RTX;
578
579   setup_incoming_promotions ();
580
581   refresh_blocks = sbitmap_alloc (last_basic_block);
582   sbitmap_zero (refresh_blocks);
583   need_refresh = 0;
584
585   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
586     {
587       uid_cuid[INSN_UID (insn)] = ++i;
588       subst_low_cuid = i;
589       subst_insn = insn;
590
591       if (INSN_P (insn))
592         {
593           note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
594                        NULL);
595           record_dead_and_set_regs (insn);
596
597 #ifdef AUTO_INC_DEC
598           for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
599             if (REG_NOTE_KIND (links) == REG_INC)
600               set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
601                                                 NULL);
602 #endif
603         }
604
605       if (GET_CODE (insn) == CODE_LABEL)
606         label_tick++;
607     }
608
609   nonzero_sign_valid = 1;
610
611   /* Now scan all the insns in forward order.  */
612
613   label_tick = 1;
614   last_call_cuid = 0;
615   mem_last_set = 0;
616   init_reg_last_arrays ();
617   setup_incoming_promotions ();
618
619   FOR_EACH_BB (this_basic_block)
620     {
621       for (insn = this_basic_block->head;
622            insn != NEXT_INSN (this_basic_block->end);
623            insn = next ? next : NEXT_INSN (insn))
624         {
625           next = 0;
626
627           if (GET_CODE (insn) == CODE_LABEL)
628             label_tick++;
629
630           else if (INSN_P (insn))
631             {
632               /* See if we know about function return values before this
633                  insn based upon SUBREG flags.  */
634               check_promoted_subreg (insn, PATTERN (insn));
635
636               /* Try this insn with each insn it links back to.  */
637
638               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
639                 if ((next = try_combine (insn, XEXP (links, 0),
640                                          NULL_RTX, &new_direct_jump_p)) != 0)
641                   goto retry;
642
643               /* Try each sequence of three linked insns ending with this one.  */
644
645               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
646                 {
647                   rtx link = XEXP (links, 0);
648
649                   /* If the linked insn has been replaced by a note, then there
650                      is no point in pursuing this chain any further.  */
651                   if (GET_CODE (link) == NOTE)
652                     continue;
653
654                   for (nextlinks = LOG_LINKS (link);
655                        nextlinks;
656                        nextlinks = XEXP (nextlinks, 1))
657                     if ((next = try_combine (insn, link,
658                                              XEXP (nextlinks, 0),
659                                              &new_direct_jump_p)) != 0)
660                       goto retry;
661                 }
662
663 #ifdef HAVE_cc0
664               /* Try to combine a jump insn that uses CC0
665                  with a preceding insn that sets CC0, and maybe with its
666                  logical predecessor as well.
667                  This is how we make decrement-and-branch insns.
668                  We need this special code because data flow connections
669                  via CC0 do not get entered in LOG_LINKS.  */
670
671               if (GET_CODE (insn) == JUMP_INSN
672                   && (prev = prev_nonnote_insn (insn)) != 0
673                   && GET_CODE (prev) == INSN
674                   && sets_cc0_p (PATTERN (prev)))
675                 {
676                   if ((next = try_combine (insn, prev,
677                                            NULL_RTX, &new_direct_jump_p)) != 0)
678                     goto retry;
679
680                   for (nextlinks = LOG_LINKS (prev); nextlinks;
681                        nextlinks = XEXP (nextlinks, 1))
682                     if ((next = try_combine (insn, prev,
683                                              XEXP (nextlinks, 0),
684                                              &new_direct_jump_p)) != 0)
685                       goto retry;
686                 }
687
688               /* Do the same for an insn that explicitly references CC0.  */
689               if (GET_CODE (insn) == INSN
690                   && (prev = prev_nonnote_insn (insn)) != 0
691                   && GET_CODE (prev) == INSN
692                   && sets_cc0_p (PATTERN (prev))
693                   && GET_CODE (PATTERN (insn)) == SET
694                   && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
695                 {
696                   if ((next = try_combine (insn, prev,
697                                            NULL_RTX, &new_direct_jump_p)) != 0)
698                     goto retry;
699
700                   for (nextlinks = LOG_LINKS (prev); nextlinks;
701                        nextlinks = XEXP (nextlinks, 1))
702                     if ((next = try_combine (insn, prev,
703                                              XEXP (nextlinks, 0),
704                                              &new_direct_jump_p)) != 0)
705                       goto retry;
706                 }
707
708               /* Finally, see if any of the insns that this insn links to
709                  explicitly references CC0.  If so, try this insn, that insn,
710                  and its predecessor if it sets CC0.  */
711               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
712                 if (GET_CODE (XEXP (links, 0)) == INSN
713                     && GET_CODE (PATTERN (XEXP (links, 0))) == SET
714                     && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
715                     && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
716                     && GET_CODE (prev) == INSN
717                     && sets_cc0_p (PATTERN (prev))
718                     && (next = try_combine (insn, XEXP (links, 0),
719                                             prev, &new_direct_jump_p)) != 0)
720                   goto retry;
721 #endif
722
723               /* Try combining an insn with two different insns whose results it
724                  uses.  */
725               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
726                 for (nextlinks = XEXP (links, 1); nextlinks;
727                      nextlinks = XEXP (nextlinks, 1))
728                   if ((next = try_combine (insn, XEXP (links, 0),
729                                            XEXP (nextlinks, 0),
730                                            &new_direct_jump_p)) != 0)
731                     goto retry;
732
733               if (GET_CODE (insn) != NOTE)
734                 record_dead_and_set_regs (insn);
735
736             retry:
737               ;
738             }
739         }
740     }
741   clear_bb_flags ();
742
743   EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, i,
744                              BASIC_BLOCK (i)->flags |= BB_DIRTY);
745   new_direct_jump_p |= purge_all_dead_edges (0);
746   delete_noop_moves (f);
747
748   update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
749                                     PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
750                                     | PROP_KILL_DEAD_CODE);
751
752   /* Clean up.  */
753   sbitmap_free (refresh_blocks);
754   free (reg_nonzero_bits);
755   free (reg_sign_bit_copies);
756   free (reg_last_death);
757   free (reg_last_set);
758   free (reg_last_set_value);
759   free (reg_last_set_table_tick);
760   free (reg_last_set_label);
761   free (reg_last_set_invalid);
762   free (reg_last_set_mode);
763   free (reg_last_set_nonzero_bits);
764   free (reg_last_set_sign_bit_copies);
765   free (uid_cuid);
766
767   {
768     struct undo *undo, *next;
769     for (undo = undobuf.frees; undo; undo = next)
770       {
771         next = undo->next;
772         free (undo);
773       }
774     undobuf.frees = 0;
775   }
776
777   total_attempts += combine_attempts;
778   total_merges += combine_merges;
779   total_extras += combine_extras;
780   total_successes += combine_successes;
781
782   nonzero_sign_valid = 0;
783
784   /* Make recognizer allow volatile MEMs again.  */
785   init_recog ();
786
787   return new_direct_jump_p;
788 }
789
790 /* Wipe the reg_last_xxx arrays in preparation for another pass.  */
791
792 static void
793 init_reg_last_arrays ()
794 {
795   unsigned int nregs = combine_max_regno;
796
797   memset ((char *) reg_last_death, 0, nregs * sizeof (rtx));
798   memset ((char *) reg_last_set, 0, nregs * sizeof (rtx));
799   memset ((char *) reg_last_set_value, 0, nregs * sizeof (rtx));
800   memset ((char *) reg_last_set_table_tick, 0, nregs * sizeof (int));
801   memset ((char *) reg_last_set_label, 0, nregs * sizeof (int));
802   memset (reg_last_set_invalid, 0, nregs * sizeof (char));
803   memset ((char *) reg_last_set_mode, 0, nregs * sizeof (enum machine_mode));
804   memset ((char *) reg_last_set_nonzero_bits, 0, nregs * sizeof (HOST_WIDE_INT));
805   memset (reg_last_set_sign_bit_copies, 0, nregs * sizeof (char));
806 }
807 \f
808 /* Set up any promoted values for incoming argument registers.  */
809
810 static void
811 setup_incoming_promotions ()
812 {
813 #ifdef PROMOTE_FUNCTION_ARGS
814   unsigned int regno;
815   rtx reg;
816   enum machine_mode mode;
817   int unsignedp;
818   rtx first = get_insns ();
819
820 #ifndef OUTGOING_REGNO
821 #define OUTGOING_REGNO(N) N
822 #endif
823   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
824     /* Check whether this register can hold an incoming pointer
825        argument.  FUNCTION_ARG_REGNO_P tests outgoing register
826        numbers, so translate if necessary due to register windows.  */
827     if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (regno))
828         && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0)
829       {
830         record_value_for_reg
831           (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND
832                                        : SIGN_EXTEND),
833                                       GET_MODE (reg),
834                                       gen_rtx_CLOBBER (mode, const0_rtx)));
835       }
836 #endif
837 }
838 \f
839 /* Called via note_stores.  If X is a pseudo that is narrower than
840    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
841
842    If we are setting only a portion of X and we can't figure out what
843    portion, assume all bits will be used since we don't know what will
844    be happening.
845
846    Similarly, set how many bits of X are known to be copies of the sign bit
847    at all locations in the function.  This is the smallest number implied
848    by any set of X.  */
849
850 static void
851 set_nonzero_bits_and_sign_copies (x, set, data)
852      rtx x;
853      rtx set;
854      void *data ATTRIBUTE_UNUSED;
855 {
856   unsigned int num;
857
858   if (GET_CODE (x) == REG
859       && REGNO (x) >= FIRST_PSEUDO_REGISTER
860       /* If this register is undefined at the start of the file, we can't
861          say what its contents were.  */
862       && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, REGNO (x))
863       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
864     {
865       if (set == 0 || GET_CODE (set) == CLOBBER)
866         {
867           reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
868           reg_sign_bit_copies[REGNO (x)] = 1;
869           return;
870         }
871
872       /* If this is a complex assignment, see if we can convert it into a
873          simple assignment.  */
874       set = expand_field_assignment (set);
875
876       /* If this is a simple assignment, or we have a paradoxical SUBREG,
877          set what we know about X.  */
878
879       if (SET_DEST (set) == x
880           || (GET_CODE (SET_DEST (set)) == SUBREG
881               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
882                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
883               && SUBREG_REG (SET_DEST (set)) == x))
884         {
885           rtx src = SET_SRC (set);
886
887 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
888           /* If X is narrower than a word and SRC is a non-negative
889              constant that would appear negative in the mode of X,
890              sign-extend it for use in reg_nonzero_bits because some
891              machines (maybe most) will actually do the sign-extension
892              and this is the conservative approach.
893
894              ??? For 2.5, try to tighten up the MD files in this regard
895              instead of this kludge.  */
896
897           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
898               && GET_CODE (src) == CONST_INT
899               && INTVAL (src) > 0
900               && 0 != (INTVAL (src)
901                        & ((HOST_WIDE_INT) 1
902                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
903             src = GEN_INT (INTVAL (src)
904                            | ((HOST_WIDE_INT) (-1)
905                               << GET_MODE_BITSIZE (GET_MODE (x))));
906 #endif
907
908           /* Don't call nonzero_bits if it cannot change anything.  */
909           if (reg_nonzero_bits[REGNO (x)] != ~(unsigned HOST_WIDE_INT) 0)
910             reg_nonzero_bits[REGNO (x)]
911               |= nonzero_bits (src, nonzero_bits_mode);
912           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
913           if (reg_sign_bit_copies[REGNO (x)] == 0
914               || reg_sign_bit_copies[REGNO (x)] > num)
915             reg_sign_bit_copies[REGNO (x)] = num;
916         }
917       else
918         {
919           reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
920           reg_sign_bit_copies[REGNO (x)] = 1;
921         }
922     }
923 }
924 \f
925 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
926    insns that were previously combined into I3 or that will be combined
927    into the merger of INSN and I3.
928
929    Return 0 if the combination is not allowed for any reason.
930
931    If the combination is allowed, *PDEST will be set to the single
932    destination of INSN and *PSRC to the single source, and this function
933    will return 1.  */
934
935 static int
936 can_combine_p (insn, i3, pred, succ, pdest, psrc)
937      rtx insn;
938      rtx i3;
939      rtx pred ATTRIBUTE_UNUSED;
940      rtx succ;
941      rtx *pdest, *psrc;
942 {
943   int i;
944   rtx set = 0, src, dest;
945   rtx p;
946 #ifdef AUTO_INC_DEC
947   rtx link;
948 #endif
949   int all_adjacent = (succ ? (next_active_insn (insn) == succ
950                               && next_active_insn (succ) == i3)
951                       : next_active_insn (insn) == i3);
952
953   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
954      or a PARALLEL consisting of such a SET and CLOBBERs.
955
956      If INSN has CLOBBER parallel parts, ignore them for our processing.
957      By definition, these happen during the execution of the insn.  When it
958      is merged with another insn, all bets are off.  If they are, in fact,
959      needed and aren't also supplied in I3, they may be added by
960      recog_for_combine.  Otherwise, it won't match.
961
962      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
963      note.
964
965      Get the source and destination of INSN.  If more than one, can't
966      combine.  */
967
968   if (GET_CODE (PATTERN (insn)) == SET)
969     set = PATTERN (insn);
970   else if (GET_CODE (PATTERN (insn)) == PARALLEL
971            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
972     {
973       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
974         {
975           rtx elt = XVECEXP (PATTERN (insn), 0, i);
976
977           switch (GET_CODE (elt))
978             {
979             /* This is important to combine floating point insns
980                for the SH4 port.  */
981             case USE:
982               /* Combining an isolated USE doesn't make sense.
983                  We depend here on combinable_i3pat to reject them.  */
984               /* The code below this loop only verifies that the inputs of
985                  the SET in INSN do not change.  We call reg_set_between_p
986                  to verify that the REG in the USE does not change between
987                  I3 and INSN.
988                  If the USE in INSN was for a pseudo register, the matching
989                  insn pattern will likely match any register; combining this
990                  with any other USE would only be safe if we knew that the
991                  used registers have identical values, or if there was
992                  something to tell them apart, e.g. different modes.  For
993                  now, we forgo such complicated tests and simply disallow
994                  combining of USES of pseudo registers with any other USE.  */
995               if (GET_CODE (XEXP (elt, 0)) == REG
996                   && GET_CODE (PATTERN (i3)) == PARALLEL)
997                 {
998                   rtx i3pat = PATTERN (i3);
999                   int i = XVECLEN (i3pat, 0) - 1;
1000                   unsigned int regno = REGNO (XEXP (elt, 0));
1001
1002                   do
1003                     {
1004                       rtx i3elt = XVECEXP (i3pat, 0, i);
1005
1006                       if (GET_CODE (i3elt) == USE
1007                           && GET_CODE (XEXP (i3elt, 0)) == REG
1008                           && (REGNO (XEXP (i3elt, 0)) == regno
1009                               ? reg_set_between_p (XEXP (elt, 0),
1010                                                    PREV_INSN (insn), i3)
1011                               : regno >= FIRST_PSEUDO_REGISTER))
1012                         return 0;
1013                     }
1014                   while (--i >= 0);
1015                 }
1016               break;
1017
1018               /* We can ignore CLOBBERs.  */
1019             case CLOBBER:
1020               break;
1021
1022             case SET:
1023               /* Ignore SETs whose result isn't used but not those that
1024                  have side-effects.  */
1025               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1026                   && ! side_effects_p (elt))
1027                 break;
1028
1029               /* If we have already found a SET, this is a second one and
1030                  so we cannot combine with this insn.  */
1031               if (set)
1032                 return 0;
1033
1034               set = elt;
1035               break;
1036
1037             default:
1038               /* Anything else means we can't combine.  */
1039               return 0;
1040             }
1041         }
1042
1043       if (set == 0
1044           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1045              so don't do anything with it.  */
1046           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1047         return 0;
1048     }
1049   else
1050     return 0;
1051
1052   if (set == 0)
1053     return 0;
1054
1055   set = expand_field_assignment (set);
1056   src = SET_SRC (set), dest = SET_DEST (set);
1057
1058   /* Don't eliminate a store in the stack pointer.  */
1059   if (dest == stack_pointer_rtx
1060       /* If we couldn't eliminate a field assignment, we can't combine.  */
1061       || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART
1062       /* Don't combine with an insn that sets a register to itself if it has
1063          a REG_EQUAL note.  This may be part of a REG_NO_CONFLICT sequence.  */
1064       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1065       /* Can't merge an ASM_OPERANDS.  */
1066       || GET_CODE (src) == ASM_OPERANDS
1067       /* Can't merge a function call.  */
1068       || GET_CODE (src) == CALL
1069       /* Don't eliminate a function call argument.  */
1070       || (GET_CODE (i3) == CALL_INSN
1071           && (find_reg_fusage (i3, USE, dest)
1072               || (GET_CODE (dest) == REG
1073                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
1074                   && global_regs[REGNO (dest)])))
1075       /* Don't substitute into an incremented register.  */
1076       || FIND_REG_INC_NOTE (i3, dest)
1077       || (succ && FIND_REG_INC_NOTE (succ, dest))
1078 #if 0
1079       /* Don't combine the end of a libcall into anything.  */
1080       /* ??? This gives worse code, and appears to be unnecessary, since no
1081          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  Local-alloc does
1082          use REG_RETVAL notes for noconflict blocks, but other code here
1083          makes sure that those insns don't disappear.  */
1084       || find_reg_note (insn, REG_RETVAL, NULL_RTX)
1085 #endif
1086       /* Make sure that DEST is not used after SUCC but before I3.  */
1087       || (succ && ! all_adjacent
1088           && reg_used_between_p (dest, succ, i3))
1089       /* Make sure that the value that is to be substituted for the register
1090          does not use any registers whose values alter in between.  However,
1091          If the insns are adjacent, a use can't cross a set even though we
1092          think it might (this can happen for a sequence of insns each setting
1093          the same destination; reg_last_set of that register might point to
1094          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1095          equivalent to the memory so the substitution is valid even if there
1096          are intervening stores.  Also, don't move a volatile asm or
1097          UNSPEC_VOLATILE across any other insns.  */
1098       || (! all_adjacent
1099           && (((GET_CODE (src) != MEM
1100                 || ! find_reg_note (insn, REG_EQUIV, src))
1101                && use_crosses_set_p (src, INSN_CUID (insn)))
1102               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1103               || GET_CODE (src) == UNSPEC_VOLATILE))
1104       /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
1105          better register allocation by not doing the combine.  */
1106       || find_reg_note (i3, REG_NO_CONFLICT, dest)
1107       || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
1108       /* Don't combine across a CALL_INSN, because that would possibly
1109          change whether the life span of some REGs crosses calls or not,
1110          and it is a pain to update that information.
1111          Exception: if source is a constant, moving it later can't hurt.
1112          Accept that special case, because it helps -fforce-addr a lot.  */
1113       || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
1114     return 0;
1115
1116   /* DEST must either be a REG or CC0.  */
1117   if (GET_CODE (dest) == REG)
1118     {
1119       /* If register alignment is being enforced for multi-word items in all
1120          cases except for parameters, it is possible to have a register copy
1121          insn referencing a hard register that is not allowed to contain the
1122          mode being copied and which would not be valid as an operand of most
1123          insns.  Eliminate this problem by not combining with such an insn.
1124
1125          Also, on some machines we don't want to extend the life of a hard
1126          register.  */
1127
1128       if (GET_CODE (src) == REG
1129           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1130                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1131               /* Don't extend the life of a hard register unless it is
1132                  user variable (if we have few registers) or it can't
1133                  fit into the desired register (meaning something special
1134                  is going on).
1135                  Also avoid substituting a return register into I3, because
1136                  reload can't handle a conflict with constraints of other
1137                  inputs.  */
1138               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1139                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1140         return 0;
1141     }
1142   else if (GET_CODE (dest) != CC0)
1143     return 0;
1144
1145   /* Don't substitute for a register intended as a clobberable operand.
1146      Similarly, don't substitute an expression containing a register that
1147      will be clobbered in I3.  */
1148   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1149     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1150       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER
1151           && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0),
1152                                        src)
1153               || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest)))
1154         return 0;
1155
1156   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1157      or not), reject, unless nothing volatile comes between it and I3 */
1158
1159   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1160     {
1161       /* Make sure succ doesn't contain a volatile reference.  */
1162       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1163         return 0;
1164
1165       for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1166         if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
1167           return 0;
1168     }
1169
1170   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1171      to be an explicit register variable, and was chosen for a reason.  */
1172
1173   if (GET_CODE (src) == ASM_OPERANDS
1174       && GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1175     return 0;
1176
1177   /* If there are any volatile insns between INSN and I3, reject, because
1178      they might affect machine state.  */
1179
1180   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1181     if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
1182       return 0;
1183
1184   /* If INSN or I2 contains an autoincrement or autodecrement,
1185      make sure that register is not used between there and I3,
1186      and not already used in I3 either.
1187      Also insist that I3 not be a jump; if it were one
1188      and the incremented register were spilled, we would lose.  */
1189
1190 #ifdef AUTO_INC_DEC
1191   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1192     if (REG_NOTE_KIND (link) == REG_INC
1193         && (GET_CODE (i3) == JUMP_INSN
1194             || reg_used_between_p (XEXP (link, 0), insn, i3)
1195             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1196       return 0;
1197 #endif
1198
1199 #ifdef HAVE_cc0
1200   /* Don't combine an insn that follows a CC0-setting insn.
1201      An insn that uses CC0 must not be separated from the one that sets it.
1202      We do, however, allow I2 to follow a CC0-setting insn if that insn
1203      is passed as I1; in that case it will be deleted also.
1204      We also allow combining in this case if all the insns are adjacent
1205      because that would leave the two CC0 insns adjacent as well.
1206      It would be more logical to test whether CC0 occurs inside I1 or I2,
1207      but that would be much slower, and this ought to be equivalent.  */
1208
1209   p = prev_nonnote_insn (insn);
1210   if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p))
1211       && ! all_adjacent)
1212     return 0;
1213 #endif
1214
1215   /* If we get here, we have passed all the tests and the combination is
1216      to be allowed.  */
1217
1218   *pdest = dest;
1219   *psrc = src;
1220
1221   return 1;
1222 }
1223 \f
1224 /* Check if PAT is an insn - or a part of it - used to set up an
1225    argument for a function in a hard register.  */
1226
1227 static int
1228 sets_function_arg_p (pat)
1229      rtx pat;
1230 {
1231   int i;
1232   rtx inner_dest;
1233
1234   switch (GET_CODE (pat))
1235     {
1236     case INSN:
1237       return sets_function_arg_p (PATTERN (pat));
1238
1239     case PARALLEL:
1240       for (i = XVECLEN (pat, 0); --i >= 0;)
1241         if (sets_function_arg_p (XVECEXP (pat, 0, i)))
1242           return 1;
1243
1244       break;
1245
1246     case SET:
1247       inner_dest = SET_DEST (pat);
1248       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1249              || GET_CODE (inner_dest) == SUBREG
1250              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1251         inner_dest = XEXP (inner_dest, 0);
1252
1253       return (GET_CODE (inner_dest) == REG
1254               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1255               && FUNCTION_ARG_REGNO_P (REGNO (inner_dest)));
1256
1257     default:
1258       break;
1259     }
1260
1261   return 0;
1262 }
1263
1264 /* LOC is the location within I3 that contains its pattern or the component
1265    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1266
1267    One problem is if I3 modifies its output, as opposed to replacing it
1268    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1269    so would produce an insn that is not equivalent to the original insns.
1270
1271    Consider:
1272
1273          (set (reg:DI 101) (reg:DI 100))
1274          (set (subreg:SI (reg:DI 101) 0) <foo>)
1275
1276    This is NOT equivalent to:
1277
1278          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1279                     (set (reg:DI 101) (reg:DI 100))])
1280
1281    Not only does this modify 100 (in which case it might still be valid
1282    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1283
1284    We can also run into a problem if I2 sets a register that I1
1285    uses and I1 gets directly substituted into I3 (not via I2).  In that
1286    case, we would be getting the wrong value of I2DEST into I3, so we
1287    must reject the combination.  This case occurs when I2 and I1 both
1288    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1289    If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source
1290    of a SET must prevent combination from occurring.
1291
1292    Before doing the above check, we first try to expand a field assignment
1293    into a set of logical operations.
1294
1295    If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which
1296    we place a register that is both set and used within I3.  If more than one
1297    such register is detected, we fail.
1298
1299    Return 1 if the combination is valid, zero otherwise.  */
1300
1301 static int
1302 combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed)
1303      rtx i3;
1304      rtx *loc;
1305      rtx i2dest;
1306      rtx i1dest;
1307      int i1_not_in_src;
1308      rtx *pi3dest_killed;
1309 {
1310   rtx x = *loc;
1311
1312   if (GET_CODE (x) == SET)
1313     {
1314       rtx set = expand_field_assignment (x);
1315       rtx dest = SET_DEST (set);
1316       rtx src = SET_SRC (set);
1317       rtx inner_dest = dest;
1318
1319 #if 0
1320       rtx inner_src = src;
1321 #endif
1322
1323       SUBST (*loc, set);
1324
1325       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1326              || GET_CODE (inner_dest) == SUBREG
1327              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1328         inner_dest = XEXP (inner_dest, 0);
1329
1330   /* We probably don't need this any more now that LIMIT_RELOAD_CLASS
1331      was added.  */
1332 #if 0
1333       while (GET_CODE (inner_src) == STRICT_LOW_PART
1334              || GET_CODE (inner_src) == SUBREG
1335              || GET_CODE (inner_src) == ZERO_EXTRACT)
1336         inner_src = XEXP (inner_src, 0);
1337
1338       /* If it is better that two different modes keep two different pseudos,
1339          avoid combining them.  This avoids producing the following pattern
1340          on a 386:
1341           (set (subreg:SI (reg/v:QI 21) 0)
1342                (lshiftrt:SI (reg/v:SI 20)
1343                    (const_int 24)))
1344          If that were made, reload could not handle the pair of
1345          reg 20/21, since it would try to get any GENERAL_REGS
1346          but some of them don't handle QImode.  */
1347
1348       if (rtx_equal_p (inner_src, i2dest)
1349           && GET_CODE (inner_dest) == REG
1350           && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest)))
1351         return 0;
1352 #endif
1353
1354       /* Check for the case where I3 modifies its output, as
1355          discussed above.  */
1356       if ((inner_dest != dest
1357            && (reg_overlap_mentioned_p (i2dest, inner_dest)
1358                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1359
1360           /* This is the same test done in can_combine_p except we can't test
1361              all_adjacent; we don't have to, since this instruction will stay
1362              in place, thus we are not considering increasing the lifetime of
1363              INNER_DEST.
1364
1365              Also, if this insn sets a function argument, combining it with
1366              something that might need a spill could clobber a previous
1367              function argument; the all_adjacent test in can_combine_p also
1368              checks this; here, we do a more specific test for this case.  */
1369
1370           || (GET_CODE (inner_dest) == REG
1371               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1372               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1373                                         GET_MODE (inner_dest))))
1374           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1375         return 0;
1376
1377       /* If DEST is used in I3, it is being killed in this insn,
1378          so record that for later.
1379          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1380          STACK_POINTER_REGNUM, since these are always considered to be
1381          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1382       if (pi3dest_killed && GET_CODE (dest) == REG
1383           && reg_referenced_p (dest, PATTERN (i3))
1384           && REGNO (dest) != FRAME_POINTER_REGNUM
1385 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1386           && REGNO (dest) != HARD_FRAME_POINTER_REGNUM
1387 #endif
1388 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1389           && (REGNO (dest) != ARG_POINTER_REGNUM
1390               || ! fixed_regs [REGNO (dest)])
1391 #endif
1392           && REGNO (dest) != STACK_POINTER_REGNUM)
1393         {
1394           if (*pi3dest_killed)
1395             return 0;
1396
1397           *pi3dest_killed = dest;
1398         }
1399     }
1400
1401   else if (GET_CODE (x) == PARALLEL)
1402     {
1403       int i;
1404
1405       for (i = 0; i < XVECLEN (x, 0); i++)
1406         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1407                                 i1_not_in_src, pi3dest_killed))
1408           return 0;
1409     }
1410
1411   return 1;
1412 }
1413 \f
1414 /* Return 1 if X is an arithmetic expression that contains a multiplication
1415    and division.  We don't count multiplications by powers of two here.  */
1416
1417 static int
1418 contains_muldiv (x)
1419      rtx x;
1420 {
1421   switch (GET_CODE (x))
1422     {
1423     case MOD:  case DIV:  case UMOD:  case UDIV:
1424       return 1;
1425
1426     case MULT:
1427       return ! (GET_CODE (XEXP (x, 1)) == CONST_INT
1428                 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1429     default:
1430       switch (GET_RTX_CLASS (GET_CODE (x)))
1431         {
1432         case 'c':  case '<':  case '2':
1433           return contains_muldiv (XEXP (x, 0))
1434             || contains_muldiv (XEXP (x, 1));
1435
1436         case '1':
1437           return contains_muldiv (XEXP (x, 0));
1438
1439         default:
1440           return 0;
1441         }
1442     }
1443 }
1444 \f
1445 /* Determine whether INSN can be used in a combination.  Return nonzero if
1446    not.  This is used in try_combine to detect early some cases where we
1447    can't perform combinations.  */
1448
1449 static int
1450 cant_combine_insn_p (insn)
1451      rtx insn;
1452 {
1453   rtx set;
1454   rtx src, dest;
1455
1456   /* If this isn't really an insn, we can't do anything.
1457      This can occur when flow deletes an insn that it has merged into an
1458      auto-increment address.  */
1459   if (! INSN_P (insn))
1460     return 1;
1461
1462   /* Never combine loads and stores involving hard regs.  The register
1463      allocator can usually handle such reg-reg moves by tying.  If we allow
1464      the combiner to make substitutions of hard regs, we risk aborting in
1465      reload on machines that have SMALL_REGISTER_CLASSES.
1466      As an exception, we allow combinations involving fixed regs; these are
1467      not available to the register allocator so there's no risk involved.  */
1468
1469   set = single_set (insn);
1470   if (! set)
1471     return 0;
1472   src = SET_SRC (set);
1473   dest = SET_DEST (set);
1474   if (GET_CODE (src) == SUBREG)
1475     src = SUBREG_REG (src);
1476   if (GET_CODE (dest) == SUBREG)
1477     dest = SUBREG_REG (dest);
1478   if (REG_P (src) && REG_P (dest)
1479       && ((REGNO (src) < FIRST_PSEUDO_REGISTER
1480            && ! fixed_regs[REGNO (src)])
1481           || (REGNO (dest) < FIRST_PSEUDO_REGISTER
1482               && ! fixed_regs[REGNO (dest)])))
1483     return 1;
1484
1485   return 0;
1486 }
1487
1488 /* Try to combine the insns I1 and I2 into I3.
1489    Here I1 and I2 appear earlier than I3.
1490    I1 can be zero; then we combine just I2 into I3.
1491
1492    If we are combining three insns and the resulting insn is not recognized,
1493    try splitting it into two insns.  If that happens, I2 and I3 are retained
1494    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
1495    are pseudo-deleted.
1496
1497    Return 0 if the combination does not work.  Then nothing is changed.
1498    If we did the combination, return the insn at which combine should
1499    resume scanning.
1500
1501    Set NEW_DIRECT_JUMP_P to a non-zero value if try_combine creates a
1502    new direct jump instruction.  */
1503
1504 static rtx
1505 try_combine (i3, i2, i1, new_direct_jump_p)
1506      rtx i3, i2, i1;
1507      int *new_direct_jump_p;
1508 {
1509   /* New patterns for I3 and I2, respectively.  */
1510   rtx newpat, newi2pat = 0;
1511   int substed_i2 = 0, substed_i1 = 0;
1512   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
1513   int added_sets_1, added_sets_2;
1514   /* Total number of SETs to put into I3.  */
1515   int total_sets;
1516   /* Nonzero is I2's body now appears in I3.  */
1517   int i2_is_used;
1518   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
1519   int insn_code_number, i2_code_number = 0, other_code_number = 0;
1520   /* Contains I3 if the destination of I3 is used in its source, which means
1521      that the old life of I3 is being killed.  If that usage is placed into
1522      I2 and not in I3, a REG_DEAD note must be made.  */
1523   rtx i3dest_killed = 0;
1524   /* SET_DEST and SET_SRC of I2 and I1.  */
1525   rtx i2dest, i2src, i1dest = 0, i1src = 0;
1526   /* PATTERN (I2), or a copy of it in certain cases.  */
1527   rtx i2pat;
1528   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
1529   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
1530   int i1_feeds_i3 = 0;
1531   /* Notes that must be added to REG_NOTES in I3 and I2.  */
1532   rtx new_i3_notes, new_i2_notes;
1533   /* Notes that we substituted I3 into I2 instead of the normal case.  */
1534   int i3_subst_into_i2 = 0;
1535   /* Notes that I1, I2 or I3 is a MULT operation.  */
1536   int have_mult = 0;
1537
1538   int maxreg;
1539   rtx temp;
1540   rtx link;
1541   int i;
1542
1543   /* Exit early if one of the insns involved can't be used for
1544      combinations.  */
1545   if (cant_combine_insn_p (i3)
1546       || cant_combine_insn_p (i2)
1547       || (i1 && cant_combine_insn_p (i1))
1548       /* We also can't do anything if I3 has a
1549          REG_LIBCALL note since we don't want to disrupt the contiguity of a
1550          libcall.  */
1551 #if 0
1552       /* ??? This gives worse code, and appears to be unnecessary, since no
1553          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  */
1554       || find_reg_note (i3, REG_LIBCALL, NULL_RTX)
1555 #endif
1556       )
1557     return 0;
1558
1559   combine_attempts++;
1560   undobuf.other_insn = 0;
1561
1562   /* Reset the hard register usage information.  */
1563   CLEAR_HARD_REG_SET (newpat_used_regs);
1564
1565   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
1566      code below, set I1 to be the earlier of the two insns.  */
1567   if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
1568     temp = i1, i1 = i2, i2 = temp;
1569
1570   added_links_insn = 0;
1571
1572   /* First check for one important special-case that the code below will
1573      not handle.  Namely, the case where I1 is zero, I2 is a PARALLEL
1574      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
1575      we may be able to replace that destination with the destination of I3.
1576      This occurs in the common code where we compute both a quotient and
1577      remainder into a structure, in which case we want to do the computation
1578      directly into the structure to avoid register-register copies.
1579
1580      Note that this case handles both multiple sets in I2 and also
1581      cases where I2 has a number of CLOBBER or PARALLELs.
1582
1583      We make very conservative checks below and only try to handle the
1584      most common cases of this.  For example, we only handle the case
1585      where I2 and I3 are adjacent to avoid making difficult register
1586      usage tests.  */
1587
1588   if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
1589       && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1590       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
1591       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
1592       && GET_CODE (PATTERN (i2)) == PARALLEL
1593       && ! side_effects_p (SET_DEST (PATTERN (i3)))
1594       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
1595          below would need to check what is inside (and reg_overlap_mentioned_p
1596          doesn't support those codes anyway).  Don't allow those destinations;
1597          the resulting insn isn't likely to be recognized anyway.  */
1598       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
1599       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
1600       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
1601                                     SET_DEST (PATTERN (i3)))
1602       && next_real_insn (i2) == i3)
1603     {
1604       rtx p2 = PATTERN (i2);
1605
1606       /* Make sure that the destination of I3,
1607          which we are going to substitute into one output of I2,
1608          is not used within another output of I2.  We must avoid making this:
1609          (parallel [(set (mem (reg 69)) ...)
1610                     (set (reg 69) ...)])
1611          which is not well-defined as to order of actions.
1612          (Besides, reload can't handle output reloads for this.)
1613
1614          The problem can also happen if the dest of I3 is a memory ref,
1615          if another dest in I2 is an indirect memory ref.  */
1616       for (i = 0; i < XVECLEN (p2, 0); i++)
1617         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1618              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1619             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
1620                                         SET_DEST (XVECEXP (p2, 0, i))))
1621           break;
1622
1623       if (i == XVECLEN (p2, 0))
1624         for (i = 0; i < XVECLEN (p2, 0); i++)
1625           if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1626                || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1627               && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
1628             {
1629               combine_merges++;
1630
1631               subst_insn = i3;
1632               subst_low_cuid = INSN_CUID (i2);
1633
1634               added_sets_2 = added_sets_1 = 0;
1635               i2dest = SET_SRC (PATTERN (i3));
1636
1637               /* Replace the dest in I2 with our dest and make the resulting
1638                  insn the new pattern for I3.  Then skip to where we
1639                  validate the pattern.  Everything was set up above.  */
1640               SUBST (SET_DEST (XVECEXP (p2, 0, i)),
1641                      SET_DEST (PATTERN (i3)));
1642
1643               newpat = p2;
1644               i3_subst_into_i2 = 1;
1645               goto validate_replacement;
1646             }
1647     }
1648
1649   /* If I2 is setting a double-word pseudo to a constant and I3 is setting
1650      one of those words to another constant, merge them by making a new
1651      constant.  */
1652   if (i1 == 0
1653       && (temp = single_set (i2)) != 0
1654       && (GET_CODE (SET_SRC (temp)) == CONST_INT
1655           || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
1656       && GET_CODE (SET_DEST (temp)) == REG
1657       && GET_MODE_CLASS (GET_MODE (SET_DEST (temp))) == MODE_INT
1658       && GET_MODE_SIZE (GET_MODE (SET_DEST (temp))) == 2 * UNITS_PER_WORD
1659       && GET_CODE (PATTERN (i3)) == SET
1660       && GET_CODE (SET_DEST (PATTERN (i3))) == SUBREG
1661       && SUBREG_REG (SET_DEST (PATTERN (i3))) == SET_DEST (temp)
1662       && GET_MODE_CLASS (GET_MODE (SET_DEST (PATTERN (i3)))) == MODE_INT
1663       && GET_MODE_SIZE (GET_MODE (SET_DEST (PATTERN (i3)))) == UNITS_PER_WORD
1664       && GET_CODE (SET_SRC (PATTERN (i3))) == CONST_INT)
1665     {
1666       HOST_WIDE_INT lo, hi;
1667
1668       if (GET_CODE (SET_SRC (temp)) == CONST_INT)
1669         lo = INTVAL (SET_SRC (temp)), hi = lo < 0 ? -1 : 0;
1670       else
1671         {
1672           lo = CONST_DOUBLE_LOW (SET_SRC (temp));
1673           hi = CONST_DOUBLE_HIGH (SET_SRC (temp));
1674         }
1675
1676       if (subreg_lowpart_p (SET_DEST (PATTERN (i3))))
1677         {
1678           /* We don't handle the case of the target word being wider
1679              than a host wide int.  */
1680           if (HOST_BITS_PER_WIDE_INT < BITS_PER_WORD)
1681             abort ();
1682
1683           lo &= ~(UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1);
1684           lo |= (INTVAL (SET_SRC (PATTERN (i3))) 
1685                  & (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1686         }
1687       else if (HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1688         hi = INTVAL (SET_SRC (PATTERN (i3)));
1689       else if (HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD)
1690         {
1691           int sign = -(int) ((unsigned HOST_WIDE_INT) lo
1692                              >> (HOST_BITS_PER_WIDE_INT - 1));
1693
1694           lo &= ~ (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1695                    (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1696           lo |= (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1697                  (INTVAL (SET_SRC (PATTERN (i3)))));
1698           if (hi == sign)
1699             hi = lo < 0 ? -1 : 0;
1700         }
1701       else
1702         /* We don't handle the case of the higher word not fitting
1703            entirely in either hi or lo.  */
1704         abort ();
1705
1706       combine_merges++;
1707       subst_insn = i3;
1708       subst_low_cuid = INSN_CUID (i2);
1709       added_sets_2 = added_sets_1 = 0;
1710       i2dest = SET_DEST (temp);
1711
1712       SUBST (SET_SRC (temp),
1713              immed_double_const (lo, hi, GET_MODE (SET_DEST (temp))));
1714
1715       newpat = PATTERN (i2);
1716       goto validate_replacement;
1717     }
1718
1719 #ifndef HAVE_cc0
1720   /* If we have no I1 and I2 looks like:
1721         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
1722                    (set Y OP)])
1723      make up a dummy I1 that is
1724         (set Y OP)
1725      and change I2 to be
1726         (set (reg:CC X) (compare:CC Y (const_int 0)))
1727
1728      (We can ignore any trailing CLOBBERs.)
1729
1730      This undoes a previous combination and allows us to match a branch-and-
1731      decrement insn.  */
1732
1733   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
1734       && XVECLEN (PATTERN (i2), 0) >= 2
1735       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
1736       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
1737           == MODE_CC)
1738       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
1739       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
1740       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
1741       && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG
1742       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
1743                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
1744     {
1745       for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
1746         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
1747           break;
1748
1749       if (i == 1)
1750         {
1751           /* We make I1 with the same INSN_UID as I2.  This gives it
1752              the same INSN_CUID for value tracking.  Our fake I1 will
1753              never appear in the insn stream so giving it the same INSN_UID
1754              as I2 will not cause a problem.  */
1755
1756           subst_prev_insn = i1
1757             = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
1758                             BLOCK_FOR_INSN (i2), INSN_SCOPE (i2),
1759                             XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
1760                             NULL_RTX);
1761
1762           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
1763           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
1764                  SET_DEST (PATTERN (i1)));
1765         }
1766     }
1767 #endif
1768
1769   /* Verify that I2 and I1 are valid for combining.  */
1770   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
1771       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
1772     {
1773       undo_all ();
1774       return 0;
1775     }
1776
1777   /* Record whether I2DEST is used in I2SRC and similarly for the other
1778      cases.  Knowing this will help in register status updating below.  */
1779   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
1780   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
1781   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
1782
1783   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
1784      in I2SRC.  */
1785   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
1786
1787   /* Ensure that I3's pattern can be the destination of combines.  */
1788   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
1789                           i1 && i2dest_in_i1src && i1_feeds_i3,
1790                           &i3dest_killed))
1791     {
1792       undo_all ();
1793       return 0;
1794     }
1795
1796   /* See if any of the insns is a MULT operation.  Unless one is, we will
1797      reject a combination that is, since it must be slower.  Be conservative
1798      here.  */
1799   if (GET_CODE (i2src) == MULT
1800       || (i1 != 0 && GET_CODE (i1src) == MULT)
1801       || (GET_CODE (PATTERN (i3)) == SET
1802           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
1803     have_mult = 1;
1804
1805   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
1806      We used to do this EXCEPT in one case: I3 has a post-inc in an
1807      output operand.  However, that exception can give rise to insns like
1808         mov r3,(r3)+
1809      which is a famous insn on the PDP-11 where the value of r3 used as the
1810      source was model-dependent.  Avoid this sort of thing.  */
1811
1812 #if 0
1813   if (!(GET_CODE (PATTERN (i3)) == SET
1814         && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1815         && GET_CODE (SET_DEST (PATTERN (i3))) == MEM
1816         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
1817             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
1818     /* It's not the exception.  */
1819 #endif
1820 #ifdef AUTO_INC_DEC
1821     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
1822       if (REG_NOTE_KIND (link) == REG_INC
1823           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
1824               || (i1 != 0
1825                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
1826         {
1827           undo_all ();
1828           return 0;
1829         }
1830 #endif
1831
1832   /* See if the SETs in I1 or I2 need to be kept around in the merged
1833      instruction: whenever the value set there is still needed past I3.
1834      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
1835
1836      For the SET in I1, we have two cases:  If I1 and I2 independently
1837      feed into I3, the set in I1 needs to be kept around if I1DEST dies
1838      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
1839      in I1 needs to be kept around unless I1DEST dies or is set in either
1840      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
1841      I1DEST.  If so, we know I1 feeds into I2.  */
1842
1843   added_sets_2 = ! dead_or_set_p (i3, i2dest);
1844
1845   added_sets_1
1846     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
1847                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
1848
1849   /* If the set in I2 needs to be kept around, we must make a copy of
1850      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
1851      PATTERN (I2), we are only substituting for the original I1DEST, not into
1852      an already-substituted copy.  This also prevents making self-referential
1853      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
1854      I2DEST.  */
1855
1856   i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
1857            ? gen_rtx_SET (VOIDmode, i2dest, i2src)
1858            : PATTERN (i2));
1859
1860   if (added_sets_2)
1861     i2pat = copy_rtx (i2pat);
1862
1863   combine_merges++;
1864
1865   /* Substitute in the latest insn for the regs set by the earlier ones.  */
1866
1867   maxreg = max_reg_num ();
1868
1869   subst_insn = i3;
1870
1871   /* It is possible that the source of I2 or I1 may be performing an
1872      unneeded operation, such as a ZERO_EXTEND of something that is known
1873      to have the high part zero.  Handle that case by letting subst look at
1874      the innermost one of them.
1875
1876      Another way to do this would be to have a function that tries to
1877      simplify a single insn instead of merging two or more insns.  We don't
1878      do this because of the potential of infinite loops and because
1879      of the potential extra memory required.  However, doing it the way
1880      we are is a bit of a kludge and doesn't catch all cases.
1881
1882      But only do this if -fexpensive-optimizations since it slows things down
1883      and doesn't usually win.  */
1884
1885   if (flag_expensive_optimizations)
1886     {
1887       /* Pass pc_rtx so no substitutions are done, just simplifications.
1888          The cases that we are interested in here do not involve the few
1889          cases were is_replaced is checked.  */
1890       if (i1)
1891         {
1892           subst_low_cuid = INSN_CUID (i1);
1893           i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
1894         }
1895       else
1896         {
1897           subst_low_cuid = INSN_CUID (i2);
1898           i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
1899         }
1900     }
1901
1902 #ifndef HAVE_cc0
1903   /* Many machines that don't use CC0 have insns that can both perform an
1904      arithmetic operation and set the condition code.  These operations will
1905      be represented as a PARALLEL with the first element of the vector
1906      being a COMPARE of an arithmetic operation with the constant zero.
1907      The second element of the vector will set some pseudo to the result
1908      of the same arithmetic operation.  If we simplify the COMPARE, we won't
1909      match such a pattern and so will generate an extra insn.   Here we test
1910      for this case, where both the comparison and the operation result are
1911      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
1912      I2SRC.  Later we will make the PARALLEL that contains I2.  */
1913
1914   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
1915       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
1916       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
1917       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
1918     {
1919 #ifdef EXTRA_CC_MODES
1920       rtx *cc_use;
1921       enum machine_mode compare_mode;
1922 #endif
1923
1924       newpat = PATTERN (i3);
1925       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
1926
1927       i2_is_used = 1;
1928
1929 #ifdef EXTRA_CC_MODES
1930       /* See if a COMPARE with the operand we substituted in should be done
1931          with the mode that is currently being used.  If not, do the same
1932          processing we do in `subst' for a SET; namely, if the destination
1933          is used only once, try to replace it with a register of the proper
1934          mode and also replace the COMPARE.  */
1935       if (undobuf.other_insn == 0
1936           && (cc_use = find_single_use (SET_DEST (newpat), i3,
1937                                         &undobuf.other_insn))
1938           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
1939                                               i2src, const0_rtx))
1940               != GET_MODE (SET_DEST (newpat))))
1941         {
1942           unsigned int regno = REGNO (SET_DEST (newpat));
1943           rtx new_dest = gen_rtx_REG (compare_mode, regno);
1944
1945           if (regno < FIRST_PSEUDO_REGISTER
1946               || (REG_N_SETS (regno) == 1 && ! added_sets_2
1947                   && ! REG_USERVAR_P (SET_DEST (newpat))))
1948             {
1949               if (regno >= FIRST_PSEUDO_REGISTER)
1950                 SUBST (regno_reg_rtx[regno], new_dest);
1951
1952               SUBST (SET_DEST (newpat), new_dest);
1953               SUBST (XEXP (*cc_use, 0), new_dest);
1954               SUBST (SET_SRC (newpat),
1955                      gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
1956             }
1957           else
1958             undobuf.other_insn = 0;
1959         }
1960 #endif
1961     }
1962   else
1963 #endif
1964     {
1965       n_occurrences = 0;                /* `subst' counts here */
1966
1967       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
1968          need to make a unique copy of I2SRC each time we substitute it
1969          to avoid self-referential rtl.  */
1970
1971       subst_low_cuid = INSN_CUID (i2);
1972       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
1973                       ! i1_feeds_i3 && i1dest_in_i1src);
1974       substed_i2 = 1;
1975
1976       /* Record whether i2's body now appears within i3's body.  */
1977       i2_is_used = n_occurrences;
1978     }
1979
1980   /* If we already got a failure, don't try to do more.  Otherwise,
1981      try to substitute in I1 if we have it.  */
1982
1983   if (i1 && GET_CODE (newpat) != CLOBBER)
1984     {
1985       /* Before we can do this substitution, we must redo the test done
1986          above (see detailed comments there) that ensures  that I1DEST
1987          isn't mentioned in any SETs in NEWPAT that are field assignments.  */
1988
1989       if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
1990                               0, (rtx*) 0))
1991         {
1992           undo_all ();
1993           return 0;
1994         }
1995
1996       n_occurrences = 0;
1997       subst_low_cuid = INSN_CUID (i1);
1998       newpat = subst (newpat, i1dest, i1src, 0, 0);
1999       substed_i1 = 1;
2000     }
2001
2002   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
2003      to count all the ways that I2SRC and I1SRC can be used.  */
2004   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
2005        && i2_is_used + added_sets_2 > 1)
2006       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2007           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
2008               > 1))
2009       /* Fail if we tried to make a new register (we used to abort, but there's
2010          really no reason to).  */
2011       || max_reg_num () != maxreg
2012       /* Fail if we couldn't do something and have a CLOBBER.  */
2013       || GET_CODE (newpat) == CLOBBER
2014       /* Fail if this new pattern is a MULT and we didn't have one before
2015          at the outer level.  */
2016       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
2017           && ! have_mult))
2018     {
2019       undo_all ();
2020       return 0;
2021     }
2022
2023   /* If the actions of the earlier insns must be kept
2024      in addition to substituting them into the latest one,
2025      we must make a new PARALLEL for the latest insn
2026      to hold additional the SETs.  */
2027
2028   if (added_sets_1 || added_sets_2)
2029     {
2030       combine_extras++;
2031
2032       if (GET_CODE (newpat) == PARALLEL)
2033         {
2034           rtvec old = XVEC (newpat, 0);
2035           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
2036           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2037           memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
2038                   sizeof (old->elem[0]) * old->num_elem);
2039         }
2040       else
2041         {
2042           rtx old = newpat;
2043           total_sets = 1 + added_sets_1 + added_sets_2;
2044           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2045           XVECEXP (newpat, 0, 0) = old;
2046         }
2047
2048       if (added_sets_1)
2049         XVECEXP (newpat, 0, --total_sets)
2050           = (GET_CODE (PATTERN (i1)) == PARALLEL
2051              ? gen_rtx_SET (VOIDmode, i1dest, i1src) : PATTERN (i1));
2052
2053       if (added_sets_2)
2054         {
2055           /* If there is no I1, use I2's body as is.  We used to also not do
2056              the subst call below if I2 was substituted into I3,
2057              but that could lose a simplification.  */
2058           if (i1 == 0)
2059             XVECEXP (newpat, 0, --total_sets) = i2pat;
2060           else
2061             /* See comment where i2pat is assigned.  */
2062             XVECEXP (newpat, 0, --total_sets)
2063               = subst (i2pat, i1dest, i1src, 0, 0);
2064         }
2065     }
2066
2067   /* We come here when we are replacing a destination in I2 with the
2068      destination of I3.  */
2069  validate_replacement:
2070
2071   /* Note which hard regs this insn has as inputs.  */
2072   mark_used_regs_combine (newpat);
2073
2074   /* Is the result of combination a valid instruction?  */
2075   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2076
2077   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
2078      the second SET's destination is a register that is unused.  In that case,
2079      we just need the first SET.   This can occur when simplifying a divmod
2080      insn.  We *must* test for this case here because the code below that
2081      splits two independent SETs doesn't handle this case correctly when it
2082      updates the register status.  Also check the case where the first
2083      SET's destination is unused.  That would not cause incorrect code, but
2084      does cause an unneeded insn to remain.  */
2085
2086   if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
2087       && XVECLEN (newpat, 0) == 2
2088       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2089       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2090       && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == REG
2091       && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 1)))
2092       && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 1)))
2093       && asm_noperands (newpat) < 0)
2094     {
2095       newpat = XVECEXP (newpat, 0, 0);
2096       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2097     }
2098
2099   else if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
2100            && XVECLEN (newpat, 0) == 2
2101            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2102            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2103            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) == REG
2104            && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 0)))
2105            && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 0)))
2106            && asm_noperands (newpat) < 0)
2107     {
2108       newpat = XVECEXP (newpat, 0, 1);
2109       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2110     }
2111
2112   /* If we were combining three insns and the result is a simple SET
2113      with no ASM_OPERANDS that wasn't recognized, try to split it into two
2114      insns.  There are two ways to do this.  It can be split using a
2115      machine-specific method (like when you have an addition of a large
2116      constant) or by combine in the function find_split_point.  */
2117
2118   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
2119       && asm_noperands (newpat) < 0)
2120     {
2121       rtx m_split, *split;
2122       rtx ni2dest = i2dest;
2123
2124       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
2125          use I2DEST as a scratch register will help.  In the latter case,
2126          convert I2DEST to the mode of the source of NEWPAT if we can.  */
2127
2128       m_split = split_insns (newpat, i3);
2129
2130       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
2131          inputs of NEWPAT.  */
2132
2133       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
2134          possible to try that as a scratch reg.  This would require adding
2135          more code to make it work though.  */
2136
2137       if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat))
2138         {
2139           /* If I2DEST is a hard register or the only use of a pseudo,
2140              we can change its mode.  */
2141           if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest)
2142               && GET_MODE (SET_DEST (newpat)) != VOIDmode
2143               && GET_CODE (i2dest) == REG
2144               && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
2145                   || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
2146                       && ! REG_USERVAR_P (i2dest))))
2147             ni2dest = gen_rtx_REG (GET_MODE (SET_DEST (newpat)),
2148                                    REGNO (i2dest));
2149
2150           m_split = split_insns (gen_rtx_PARALLEL
2151                                  (VOIDmode,
2152                                   gen_rtvec (2, newpat,
2153                                              gen_rtx_CLOBBER (VOIDmode,
2154                                                               ni2dest))),
2155                                  i3);
2156           /* If the split with the mode-changed register didn't work, try
2157              the original register.  */
2158           if (! m_split && ni2dest != i2dest)
2159             {
2160               ni2dest = i2dest;
2161               m_split = split_insns (gen_rtx_PARALLEL
2162                                      (VOIDmode,
2163                                       gen_rtvec (2, newpat,
2164                                                  gen_rtx_CLOBBER (VOIDmode,
2165                                                                   i2dest))),
2166                                      i3);
2167             }
2168         }
2169
2170       /* If we've split a jump pattern, we'll wind up with a sequence even
2171          with one instruction.  We can handle that below, so extract it.  */
2172       if (m_split && GET_CODE (m_split) == SEQUENCE
2173           && XVECLEN (m_split, 0) == 1)
2174         m_split = PATTERN (XVECEXP (m_split, 0, 0));
2175
2176       if (m_split && GET_CODE (m_split) != SEQUENCE)
2177         {
2178           insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
2179           if (insn_code_number >= 0)
2180             newpat = m_split;
2181         }
2182       else if (m_split && GET_CODE (m_split) == SEQUENCE
2183                && XVECLEN (m_split, 0) == 2
2184                && (next_real_insn (i2) == i3
2185                    || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)),
2186                                            INSN_CUID (i2))))
2187         {
2188           rtx i2set, i3set;
2189           rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1));
2190           newi2pat = PATTERN (XVECEXP (m_split, 0, 0));
2191
2192           i3set = single_set (XVECEXP (m_split, 0, 1));
2193           i2set = single_set (XVECEXP (m_split, 0, 0));
2194
2195           /* In case we changed the mode of I2DEST, replace it in the
2196              pseudo-register table here.  We can't do it above in case this
2197              code doesn't get executed and we do a split the other way.  */
2198
2199           if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2200             SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
2201
2202           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2203
2204           /* If I2 or I3 has multiple SETs, we won't know how to track
2205              register status, so don't use these insns.  If I2's destination
2206              is used between I2 and I3, we also can't use these insns.  */
2207
2208           if (i2_code_number >= 0 && i2set && i3set
2209               && (next_real_insn (i2) == i3
2210                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
2211             insn_code_number = recog_for_combine (&newi3pat, i3,
2212                                                   &new_i3_notes);
2213           if (insn_code_number >= 0)
2214             newpat = newi3pat;
2215
2216           /* It is possible that both insns now set the destination of I3.
2217              If so, we must show an extra use of it.  */
2218
2219           if (insn_code_number >= 0)
2220             {
2221               rtx new_i3_dest = SET_DEST (i3set);
2222               rtx new_i2_dest = SET_DEST (i2set);
2223
2224               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
2225                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
2226                      || GET_CODE (new_i3_dest) == SUBREG)
2227                 new_i3_dest = XEXP (new_i3_dest, 0);
2228
2229               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
2230                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
2231                      || GET_CODE (new_i2_dest) == SUBREG)
2232                 new_i2_dest = XEXP (new_i2_dest, 0);
2233
2234               if (GET_CODE (new_i3_dest) == REG
2235                   && GET_CODE (new_i2_dest) == REG
2236                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
2237                 REG_N_SETS (REGNO (new_i2_dest))++;
2238             }
2239         }
2240
2241       /* If we can split it and use I2DEST, go ahead and see if that
2242          helps things be recognized.  Verify that none of the registers
2243          are set between I2 and I3.  */
2244       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
2245 #ifdef HAVE_cc0
2246           && GET_CODE (i2dest) == REG
2247 #endif
2248           /* We need I2DEST in the proper mode.  If it is a hard register
2249              or the only use of a pseudo, we can change its mode.  */
2250           && (GET_MODE (*split) == GET_MODE (i2dest)
2251               || GET_MODE (*split) == VOIDmode
2252               || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
2253               || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
2254                   && ! REG_USERVAR_P (i2dest)))
2255           && (next_real_insn (i2) == i3
2256               || ! use_crosses_set_p (*split, INSN_CUID (i2)))
2257           /* We can't overwrite I2DEST if its value is still used by
2258              NEWPAT.  */
2259           && ! reg_referenced_p (i2dest, newpat))
2260         {
2261           rtx newdest = i2dest;
2262           enum rtx_code split_code = GET_CODE (*split);
2263           enum machine_mode split_mode = GET_MODE (*split);
2264
2265           /* Get NEWDEST as a register in the proper mode.  We have already
2266              validated that we can do this.  */
2267           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
2268             {
2269               newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
2270
2271               if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2272                 SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
2273             }
2274
2275           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
2276              an ASHIFT.  This can occur if it was inside a PLUS and hence
2277              appeared to be a memory address.  This is a kludge.  */
2278           if (split_code == MULT
2279               && GET_CODE (XEXP (*split, 1)) == CONST_INT
2280               && INTVAL (XEXP (*split, 1)) > 0
2281               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
2282             {
2283               SUBST (*split, gen_rtx_ASHIFT (split_mode,
2284                                              XEXP (*split, 0), GEN_INT (i)));
2285               /* Update split_code because we may not have a multiply
2286                  anymore.  */
2287               split_code = GET_CODE (*split);
2288             }
2289
2290 #ifdef INSN_SCHEDULING
2291           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
2292              be written as a ZERO_EXTEND.  */
2293           if (split_code == SUBREG && GET_CODE (SUBREG_REG (*split)) == MEM)
2294             SUBST (*split, gen_rtx_ZERO_EXTEND  (split_mode,
2295                                                  SUBREG_REG (*split)));
2296 #endif
2297
2298           newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
2299           SUBST (*split, newdest);
2300           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2301
2302           /* If the split point was a MULT and we didn't have one before,
2303              don't use one now.  */
2304           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
2305             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2306         }
2307     }
2308
2309   /* Check for a case where we loaded from memory in a narrow mode and
2310      then sign extended it, but we need both registers.  In that case,
2311      we have a PARALLEL with both loads from the same memory location.
2312      We can split this into a load from memory followed by a register-register
2313      copy.  This saves at least one insn, more if register allocation can
2314      eliminate the copy.
2315
2316      We cannot do this if the destination of the second assignment is
2317      a register that we have already assumed is zero-extended.  Similarly
2318      for a SUBREG of such a register.  */
2319
2320   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2321            && GET_CODE (newpat) == PARALLEL
2322            && XVECLEN (newpat, 0) == 2
2323            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2324            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
2325            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2326            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2327                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
2328            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2329                                    INSN_CUID (i2))
2330            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2331            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2332            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
2333                  (GET_CODE (temp) == REG
2334                   && reg_nonzero_bits[REGNO (temp)] != 0
2335                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2336                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2337                   && (reg_nonzero_bits[REGNO (temp)]
2338                       != GET_MODE_MASK (word_mode))))
2339            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
2340                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
2341                      (GET_CODE (temp) == REG
2342                       && reg_nonzero_bits[REGNO (temp)] != 0
2343                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2344                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2345                       && (reg_nonzero_bits[REGNO (temp)]
2346                           != GET_MODE_MASK (word_mode)))))
2347            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2348                                          SET_SRC (XVECEXP (newpat, 0, 1)))
2349            && ! find_reg_note (i3, REG_UNUSED,
2350                                SET_DEST (XVECEXP (newpat, 0, 0))))
2351     {
2352       rtx ni2dest;
2353
2354       newi2pat = XVECEXP (newpat, 0, 0);
2355       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
2356       newpat = XVECEXP (newpat, 0, 1);
2357       SUBST (SET_SRC (newpat),
2358              gen_lowpart_for_combine (GET_MODE (SET_SRC (newpat)), ni2dest));
2359       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2360
2361       if (i2_code_number >= 0)
2362         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2363
2364       if (insn_code_number >= 0)
2365         {
2366           rtx insn;
2367           rtx link;
2368
2369           /* If we will be able to accept this, we have made a change to the
2370              destination of I3.  This can invalidate a LOG_LINKS pointing
2371              to I3.  No other part of combine.c makes such a transformation.
2372
2373              The new I3 will have a destination that was previously the
2374              destination of I1 or I2 and which was used in i2 or I3.  Call
2375              distribute_links to make a LOG_LINK from the next use of
2376              that destination.  */
2377
2378           PATTERN (i3) = newpat;
2379           distribute_links (gen_rtx_INSN_LIST (VOIDmode, i3, NULL_RTX));
2380
2381           /* I3 now uses what used to be its destination and which is
2382              now I2's destination.  That means we need a LOG_LINK from
2383              I3 to I2.  But we used to have one, so we still will.
2384
2385              However, some later insn might be using I2's dest and have
2386              a LOG_LINK pointing at I3.  We must remove this link.
2387              The simplest way to remove the link is to point it at I1,
2388              which we know will be a NOTE.  */
2389
2390           for (insn = NEXT_INSN (i3);
2391                insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2392                         || insn != this_basic_block->next_bb->head);
2393                insn = NEXT_INSN (insn))
2394             {
2395               if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
2396                 {
2397                   for (link = LOG_LINKS (insn); link;
2398                        link = XEXP (link, 1))
2399                     if (XEXP (link, 0) == i3)
2400                       XEXP (link, 0) = i1;
2401
2402                   break;
2403                 }
2404             }
2405         }
2406     }
2407
2408   /* Similarly, check for a case where we have a PARALLEL of two independent
2409      SETs but we started with three insns.  In this case, we can do the sets
2410      as two separate insns.  This case occurs when some SET allows two
2411      other insns to combine, but the destination of that SET is still live.  */
2412
2413   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2414            && GET_CODE (newpat) == PARALLEL
2415            && XVECLEN (newpat, 0) == 2
2416            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2417            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
2418            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
2419            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2420            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2421            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2422            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2423                                    INSN_CUID (i2))
2424            /* Don't pass sets with (USE (MEM ...)) dests to the following.  */
2425            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
2426            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
2427            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2428                                   XVECEXP (newpat, 0, 0))
2429            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
2430                                   XVECEXP (newpat, 0, 1))
2431            && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
2432                  && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
2433     {
2434       /* Normally, it doesn't matter which of the two is done first,
2435          but it does if one references cc0.  In that case, it has to
2436          be first.  */
2437 #ifdef HAVE_cc0
2438       if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
2439         {
2440           newi2pat = XVECEXP (newpat, 0, 0);
2441           newpat = XVECEXP (newpat, 0, 1);
2442         }
2443       else
2444 #endif
2445         {
2446           newi2pat = XVECEXP (newpat, 0, 1);
2447           newpat = XVECEXP (newpat, 0, 0);
2448         }
2449
2450       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2451
2452       if (i2_code_number >= 0)
2453         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2454     }
2455
2456   /* If it still isn't recognized, fail and change things back the way they
2457      were.  */
2458   if ((insn_code_number < 0
2459        /* Is the result a reasonable ASM_OPERANDS?  */
2460        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
2461     {
2462       undo_all ();
2463       return 0;
2464     }
2465
2466   /* If we had to change another insn, make sure it is valid also.  */
2467   if (undobuf.other_insn)
2468     {
2469       rtx other_pat = PATTERN (undobuf.other_insn);
2470       rtx new_other_notes;
2471       rtx note, next;
2472
2473       CLEAR_HARD_REG_SET (newpat_used_regs);
2474
2475       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
2476                                              &new_other_notes);
2477
2478       if (other_code_number < 0 && ! check_asm_operands (other_pat))
2479         {
2480           undo_all ();
2481           return 0;
2482         }
2483
2484       PATTERN (undobuf.other_insn) = other_pat;
2485
2486       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
2487          are still valid.  Then add any non-duplicate notes added by
2488          recog_for_combine.  */
2489       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
2490         {
2491           next = XEXP (note, 1);
2492
2493           if (REG_NOTE_KIND (note) == REG_UNUSED
2494               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
2495             {
2496               if (GET_CODE (XEXP (note, 0)) == REG)
2497                 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
2498
2499               remove_note (undobuf.other_insn, note);
2500             }
2501         }
2502
2503       for (note = new_other_notes; note; note = XEXP (note, 1))
2504         if (GET_CODE (XEXP (note, 0)) == REG)
2505           REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
2506
2507       distribute_notes (new_other_notes, undobuf.other_insn,
2508                         undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
2509     }
2510 #ifdef HAVE_cc0
2511   /* If I2 is the setter CC0 and I3 is the user CC0 then check whether
2512      they are adjacent to each other or not.  */
2513   {
2514     rtx p = prev_nonnote_insn (i3);
2515     if (p && p != i2 && GET_CODE (p) == INSN && newi2pat
2516         && sets_cc0_p (newi2pat))
2517       {
2518         undo_all ();
2519         return 0;
2520       }
2521   }
2522 #endif
2523
2524   /* We now know that we can do this combination.  Merge the insns and
2525      update the status of registers and LOG_LINKS.  */
2526
2527   {
2528     rtx i3notes, i2notes, i1notes = 0;
2529     rtx i3links, i2links, i1links = 0;
2530     rtx midnotes = 0;
2531     unsigned int regno;
2532     /* Compute which registers we expect to eliminate.  newi2pat may be setting
2533        either i3dest or i2dest, so we must check it.  Also, i1dest may be the
2534        same as i3dest, in which case newi2pat may be setting i1dest.  */
2535     rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
2536                    || i2dest_in_i2src || i2dest_in_i1src
2537                    ? 0 : i2dest);
2538     rtx elim_i1 = (i1 == 0 || i1dest_in_i1src
2539                    || (newi2pat && reg_set_p (i1dest, newi2pat))
2540                    ? 0 : i1dest);
2541
2542     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
2543        clear them.  */
2544     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
2545     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
2546     if (i1)
2547       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
2548
2549     /* Ensure that we do not have something that should not be shared but
2550        occurs multiple times in the new insns.  Check this by first
2551        resetting all the `used' flags and then copying anything is shared.  */
2552
2553     reset_used_flags (i3notes);
2554     reset_used_flags (i2notes);
2555     reset_used_flags (i1notes);
2556     reset_used_flags (newpat);
2557     reset_used_flags (newi2pat);
2558     if (undobuf.other_insn)
2559       reset_used_flags (PATTERN (undobuf.other_insn));
2560
2561     i3notes = copy_rtx_if_shared (i3notes);
2562     i2notes = copy_rtx_if_shared (i2notes);
2563     i1notes = copy_rtx_if_shared (i1notes);
2564     newpat = copy_rtx_if_shared (newpat);
2565     newi2pat = copy_rtx_if_shared (newi2pat);
2566     if (undobuf.other_insn)
2567       reset_used_flags (PATTERN (undobuf.other_insn));
2568
2569     INSN_CODE (i3) = insn_code_number;
2570     PATTERN (i3) = newpat;
2571
2572     if (GET_CODE (i3) == CALL_INSN && CALL_INSN_FUNCTION_USAGE (i3))
2573       {
2574         rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
2575
2576         reset_used_flags (call_usage);
2577         call_usage = copy_rtx (call_usage);
2578
2579         if (substed_i2)
2580           replace_rtx (call_usage, i2dest, i2src);
2581
2582         if (substed_i1)
2583           replace_rtx (call_usage, i1dest, i1src);
2584
2585         CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
2586       }
2587
2588     if (undobuf.other_insn)
2589       INSN_CODE (undobuf.other_insn) = other_code_number;
2590
2591     /* We had one special case above where I2 had more than one set and
2592        we replaced a destination of one of those sets with the destination
2593        of I3.  In that case, we have to update LOG_LINKS of insns later
2594        in this basic block.  Note that this (expensive) case is rare.
2595
2596        Also, in this case, we must pretend that all REG_NOTEs for I2
2597        actually came from I3, so that REG_UNUSED notes from I2 will be
2598        properly handled.  */
2599
2600     if (i3_subst_into_i2)
2601       {
2602         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
2603           if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != USE
2604               && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG
2605               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
2606               && ! find_reg_note (i2, REG_UNUSED,
2607                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
2608             for (temp = NEXT_INSN (i2);
2609                  temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2610                           || this_basic_block->head != temp);
2611                  temp = NEXT_INSN (temp))
2612               if (temp != i3 && INSN_P (temp))
2613                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
2614                   if (XEXP (link, 0) == i2)
2615                     XEXP (link, 0) = i3;
2616
2617         if (i3notes)
2618           {
2619             rtx link = i3notes;
2620             while (XEXP (link, 1))
2621               link = XEXP (link, 1);
2622             XEXP (link, 1) = i2notes;
2623           }
2624         else
2625           i3notes = i2notes;
2626         i2notes = 0;
2627       }
2628
2629     LOG_LINKS (i3) = 0;
2630     REG_NOTES (i3) = 0;
2631     LOG_LINKS (i2) = 0;
2632     REG_NOTES (i2) = 0;
2633
2634     if (newi2pat)
2635       {
2636         INSN_CODE (i2) = i2_code_number;
2637         PATTERN (i2) = newi2pat;
2638       }
2639     else
2640       {
2641         PUT_CODE (i2, NOTE);
2642         NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED;
2643         NOTE_SOURCE_FILE (i2) = 0;
2644       }
2645
2646     if (i1)
2647       {
2648         LOG_LINKS (i1) = 0;
2649         REG_NOTES (i1) = 0;
2650         PUT_CODE (i1, NOTE);
2651         NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED;
2652         NOTE_SOURCE_FILE (i1) = 0;
2653       }
2654
2655     /* Get death notes for everything that is now used in either I3 or
2656        I2 and used to die in a previous insn.  If we built two new
2657        patterns, move from I1 to I2 then I2 to I3 so that we get the
2658        proper movement on registers that I2 modifies.  */
2659
2660     if (newi2pat)
2661       {
2662         move_deaths (newi2pat, NULL_RTX, INSN_CUID (i1), i2, &midnotes);
2663         move_deaths (newpat, newi2pat, INSN_CUID (i1), i3, &midnotes);
2664       }
2665     else
2666       move_deaths (newpat, NULL_RTX, i1 ? INSN_CUID (i1) : INSN_CUID (i2),
2667                    i3, &midnotes);
2668
2669     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
2670     if (i3notes)
2671       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
2672                         elim_i2, elim_i1);
2673     if (i2notes)
2674       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
2675                         elim_i2, elim_i1);
2676     if (i1notes)
2677       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
2678                         elim_i2, elim_i1);
2679     if (midnotes)
2680       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2681                         elim_i2, elim_i1);
2682
2683     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
2684        know these are REG_UNUSED and want them to go to the desired insn,
2685        so we always pass it as i3.  We have not counted the notes in
2686        reg_n_deaths yet, so we need to do so now.  */
2687
2688     if (newi2pat && new_i2_notes)
2689       {
2690         for (temp = new_i2_notes; temp; temp = XEXP (temp, 1))
2691           if (GET_CODE (XEXP (temp, 0)) == REG)
2692             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2693
2694         distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2695       }
2696
2697     if (new_i3_notes)
2698       {
2699         for (temp = new_i3_notes; temp; temp = XEXP (temp, 1))
2700           if (GET_CODE (XEXP (temp, 0)) == REG)
2701             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2702
2703         distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
2704       }
2705
2706     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
2707        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
2708        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
2709        in that case, it might delete I2.  Similarly for I2 and I1.
2710        Show an additional death due to the REG_DEAD note we make here.  If
2711        we discard it in distribute_notes, we will decrement it again.  */
2712
2713     if (i3dest_killed)
2714       {
2715         if (GET_CODE (i3dest_killed) == REG)
2716           REG_N_DEATHS (REGNO (i3dest_killed))++;
2717
2718         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
2719           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2720                                                NULL_RTX),
2721                             NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1);
2722         else
2723           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2724                                                NULL_RTX),
2725                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2726                             elim_i2, elim_i1);
2727       }
2728
2729     if (i2dest_in_i2src)
2730       {
2731         if (GET_CODE (i2dest) == REG)
2732           REG_N_DEATHS (REGNO (i2dest))++;
2733
2734         if (newi2pat && reg_set_p (i2dest, newi2pat))
2735           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2736                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2737         else
2738           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2739                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2740                             NULL_RTX, NULL_RTX);
2741       }
2742
2743     if (i1dest_in_i1src)
2744       {
2745         if (GET_CODE (i1dest) == REG)
2746           REG_N_DEATHS (REGNO (i1dest))++;
2747
2748         if (newi2pat && reg_set_p (i1dest, newi2pat))
2749           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2750                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2751         else
2752           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2753                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2754                             NULL_RTX, NULL_RTX);
2755       }
2756
2757     distribute_links (i3links);
2758     distribute_links (i2links);
2759     distribute_links (i1links);
2760
2761     if (GET_CODE (i2dest) == REG)
2762       {
2763         rtx link;
2764         rtx i2_insn = 0, i2_val = 0, set;
2765
2766         /* The insn that used to set this register doesn't exist, and
2767            this life of the register may not exist either.  See if one of
2768            I3's links points to an insn that sets I2DEST.  If it does,
2769            that is now the last known value for I2DEST. If we don't update
2770            this and I2 set the register to a value that depended on its old
2771            contents, we will get confused.  If this insn is used, thing
2772            will be set correctly in combine_instructions.  */
2773
2774         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2775           if ((set = single_set (XEXP (link, 0))) != 0
2776               && rtx_equal_p (i2dest, SET_DEST (set)))
2777             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
2778
2779         record_value_for_reg (i2dest, i2_insn, i2_val);
2780
2781         /* If the reg formerly set in I2 died only once and that was in I3,
2782            zero its use count so it won't make `reload' do any work.  */
2783         if (! added_sets_2
2784             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
2785             && ! i2dest_in_i2src)
2786           {
2787             regno = REGNO (i2dest);
2788             REG_N_SETS (regno)--;
2789           }
2790       }
2791
2792     if (i1 && GET_CODE (i1dest) == REG)
2793       {
2794         rtx link;
2795         rtx i1_insn = 0, i1_val = 0, set;
2796
2797         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2798           if ((set = single_set (XEXP (link, 0))) != 0
2799               && rtx_equal_p (i1dest, SET_DEST (set)))
2800             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
2801
2802         record_value_for_reg (i1dest, i1_insn, i1_val);
2803
2804         regno = REGNO (i1dest);
2805         if (! added_sets_1 && ! i1dest_in_i1src)
2806           REG_N_SETS (regno)--;
2807       }
2808
2809     /* Update reg_nonzero_bits et al for any changes that may have been made
2810        to this insn.  The order of set_nonzero_bits_and_sign_copies() is
2811        important.  Because newi2pat can affect nonzero_bits of newpat */
2812     if (newi2pat)
2813       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
2814     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
2815
2816     /* Set new_direct_jump_p if a new return or simple jump instruction
2817        has been created.
2818
2819        If I3 is now an unconditional jump, ensure that it has a
2820        BARRIER following it since it may have initially been a
2821        conditional jump.  It may also be the last nonnote insn.  */
2822
2823     if (GET_CODE (newpat) == RETURN || any_uncondjump_p (i3))
2824       {
2825         *new_direct_jump_p = 1;
2826
2827         if ((temp = next_nonnote_insn (i3)) == NULL_RTX
2828             || GET_CODE (temp) != BARRIER)
2829           emit_barrier_after (i3);
2830       }
2831     /* An NOOP jump does not need barrier, but it does need cleaning up
2832        of CFG.  */
2833     if (GET_CODE (newpat) == SET
2834         && SET_SRC (newpat) == pc_rtx
2835         && SET_DEST (newpat) == pc_rtx)
2836       *new_direct_jump_p = 1;
2837   }
2838
2839   combine_successes++;
2840   undo_commit ();
2841
2842   /* Clear this here, so that subsequent get_last_value calls are not
2843      affected.  */
2844   subst_prev_insn = NULL_RTX;
2845
2846   if (added_links_insn
2847       && (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2))
2848       && INSN_CUID (added_links_insn) < INSN_CUID (i3))
2849     return added_links_insn;
2850   else
2851     return newi2pat ? i2 : i3;
2852 }
2853 \f
2854 /* Undo all the modifications recorded in undobuf.  */
2855
2856 static void
2857 undo_all ()
2858 {
2859   struct undo *undo, *next;
2860
2861   for (undo = undobuf.undos; undo; undo = next)
2862     {
2863       next = undo->next;
2864       if (undo->is_int)
2865         *undo->where.i = undo->old_contents.i;
2866       else
2867         *undo->where.r = undo->old_contents.r;
2868
2869       undo->next = undobuf.frees;
2870       undobuf.frees = undo;
2871     }
2872
2873   undobuf.undos = 0;
2874
2875   /* Clear this here, so that subsequent get_last_value calls are not
2876      affected.  */
2877   subst_prev_insn = NULL_RTX;
2878 }
2879
2880 /* We've committed to accepting the changes we made.  Move all
2881    of the undos to the free list.  */
2882
2883 static void
2884 undo_commit ()
2885 {
2886   struct undo *undo, *next;
2887
2888   for (undo = undobuf.undos; undo; undo = next)
2889     {
2890       next = undo->next;
2891       undo->next = undobuf.frees;
2892       undobuf.frees = undo;
2893     }
2894   undobuf.undos = 0;
2895 }
2896
2897 \f
2898 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
2899    where we have an arithmetic expression and return that point.  LOC will
2900    be inside INSN.
2901
2902    try_combine will call this function to see if an insn can be split into
2903    two insns.  */
2904
2905 static rtx *
2906 find_split_point (loc, insn)
2907      rtx *loc;
2908      rtx insn;
2909 {
2910   rtx x = *loc;
2911   enum rtx_code code = GET_CODE (x);
2912   rtx *split;
2913   unsigned HOST_WIDE_INT len = 0;
2914   HOST_WIDE_INT pos = 0;
2915   int unsignedp = 0;
2916   rtx inner = NULL_RTX;
2917
2918   /* First special-case some codes.  */
2919   switch (code)
2920     {
2921     case SUBREG:
2922 #ifdef INSN_SCHEDULING
2923       /* If we are making a paradoxical SUBREG invalid, it becomes a split
2924          point.  */
2925       if (GET_CODE (SUBREG_REG (x)) == MEM)
2926         return loc;
2927 #endif
2928       return find_split_point (&SUBREG_REG (x), insn);
2929
2930     case MEM:
2931 #ifdef HAVE_lo_sum
2932       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
2933          using LO_SUM and HIGH.  */
2934       if (GET_CODE (XEXP (x, 0)) == CONST
2935           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
2936         {
2937           SUBST (XEXP (x, 0),
2938                  gen_rtx_LO_SUM (Pmode,
2939                                  gen_rtx_HIGH (Pmode, XEXP (x, 0)),
2940                                  XEXP (x, 0)));
2941           return &XEXP (XEXP (x, 0), 0);
2942         }
2943 #endif
2944
2945       /* If we have a PLUS whose second operand is a constant and the
2946          address is not valid, perhaps will can split it up using
2947          the machine-specific way to split large constants.  We use
2948          the first pseudo-reg (one of the virtual regs) as a placeholder;
2949          it will not remain in the result.  */
2950       if (GET_CODE (XEXP (x, 0)) == PLUS
2951           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2952           && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
2953         {
2954           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
2955           rtx seq = split_insns (gen_rtx_SET (VOIDmode, reg, XEXP (x, 0)),
2956                                  subst_insn);
2957
2958           /* This should have produced two insns, each of which sets our
2959              placeholder.  If the source of the second is a valid address,
2960              we can make put both sources together and make a split point
2961              in the middle.  */
2962
2963           if (seq && XVECLEN (seq, 0) == 2
2964               && GET_CODE (XVECEXP (seq, 0, 0)) == INSN
2965               && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET
2966               && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg
2967               && ! reg_mentioned_p (reg,
2968                                     SET_SRC (PATTERN (XVECEXP (seq, 0, 0))))
2969               && GET_CODE (XVECEXP (seq, 0, 1)) == INSN
2970               && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET
2971               && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg
2972               && memory_address_p (GET_MODE (x),
2973                                    SET_SRC (PATTERN (XVECEXP (seq, 0, 1)))))
2974             {
2975               rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0)));
2976               rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1)));
2977
2978               /* Replace the placeholder in SRC2 with SRC1.  If we can
2979                  find where in SRC2 it was placed, that can become our
2980                  split point and we can replace this address with SRC2.
2981                  Just try two obvious places.  */
2982
2983               src2 = replace_rtx (src2, reg, src1);
2984               split = 0;
2985               if (XEXP (src2, 0) == src1)
2986                 split = &XEXP (src2, 0);
2987               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
2988                        && XEXP (XEXP (src2, 0), 0) == src1)
2989                 split = &XEXP (XEXP (src2, 0), 0);
2990
2991               if (split)
2992                 {
2993                   SUBST (XEXP (x, 0), src2);
2994                   return split;
2995                 }
2996             }
2997
2998           /* If that didn't work, perhaps the first operand is complex and
2999              needs to be computed separately, so make a split point there.
3000              This will occur on machines that just support REG + CONST
3001              and have a constant moved through some previous computation.  */
3002
3003           else if (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) != 'o'
3004                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
3005                          && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (XEXP (x, 0), 0))))
3006                              == 'o')))
3007             return &XEXP (XEXP (x, 0), 0);
3008         }
3009       break;
3010
3011     case SET:
3012 #ifdef HAVE_cc0
3013       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
3014          ZERO_EXTRACT, the most likely reason why this doesn't match is that
3015          we need to put the operand into a register.  So split at that
3016          point.  */
3017
3018       if (SET_DEST (x) == cc0_rtx
3019           && GET_CODE (SET_SRC (x)) != COMPARE
3020           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
3021           && GET_RTX_CLASS (GET_CODE (SET_SRC (x))) != 'o'
3022           && ! (GET_CODE (SET_SRC (x)) == SUBREG
3023                 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) == 'o'))
3024         return &SET_SRC (x);
3025 #endif
3026
3027       /* See if we can split SET_SRC as it stands.  */
3028       split = find_split_point (&SET_SRC (x), insn);
3029       if (split && split != &SET_SRC (x))
3030         return split;
3031
3032       /* See if we can split SET_DEST as it stands.  */
3033       split = find_split_point (&SET_DEST (x), insn);
3034       if (split && split != &SET_DEST (x))
3035         return split;
3036
3037       /* See if this is a bitfield assignment with everything constant.  If
3038          so, this is an IOR of an AND, so split it into that.  */
3039       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
3040           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
3041               <= HOST_BITS_PER_WIDE_INT)
3042           && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
3043           && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
3044           && GET_CODE (SET_SRC (x)) == CONST_INT
3045           && ((INTVAL (XEXP (SET_DEST (x), 1))
3046                + INTVAL (XEXP (SET_DEST (x), 2)))
3047               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
3048           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
3049         {
3050           HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
3051           unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
3052           unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
3053           rtx dest = XEXP (SET_DEST (x), 0);
3054           enum machine_mode mode = GET_MODE (dest);
3055           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
3056
3057           if (BITS_BIG_ENDIAN)
3058             pos = GET_MODE_BITSIZE (mode) - len - pos;
3059
3060           if (src == mask)
3061             SUBST (SET_SRC (x),
3062                    gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
3063           else
3064             SUBST (SET_SRC (x),
3065                    gen_binary (IOR, mode,
3066                                gen_binary (AND, mode, dest,
3067                                            gen_int_mode (~(mask << pos),
3068                                                          mode)),
3069                                GEN_INT (src << pos)));
3070
3071           SUBST (SET_DEST (x), dest);
3072
3073           split = find_split_point (&SET_SRC (x), insn);
3074           if (split && split != &SET_SRC (x))
3075             return split;
3076         }
3077
3078       /* Otherwise, see if this is an operation that we can split into two.
3079          If so, try to split that.  */
3080       code = GET_CODE (SET_SRC (x));
3081
3082       switch (code)
3083         {
3084         case AND:
3085           /* If we are AND'ing with a large constant that is only a single
3086              bit and the result is only being used in a context where we
3087              need to know if it is zero or non-zero, replace it with a bit
3088              extraction.  This will avoid the large constant, which might
3089              have taken more than one insn to make.  If the constant were
3090              not a valid argument to the AND but took only one insn to make,
3091              this is no worse, but if it took more than one insn, it will
3092              be better.  */
3093
3094           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3095               && GET_CODE (XEXP (SET_SRC (x), 0)) == REG
3096               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
3097               && GET_CODE (SET_DEST (x)) == REG
3098               && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
3099               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
3100               && XEXP (*split, 0) == SET_DEST (x)
3101               && XEXP (*split, 1) == const0_rtx)
3102             {
3103               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
3104                                                 XEXP (SET_SRC (x), 0),
3105                                                 pos, NULL_RTX, 1, 1, 0, 0);
3106               if (extraction != 0)
3107                 {
3108                   SUBST (SET_SRC (x), extraction);
3109                   return find_split_point (loc, insn);
3110                 }
3111             }
3112           break;
3113
3114         case NE:
3115           /* if STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
3116              is known to be on, this can be converted into a NEG of a shift.  */
3117           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
3118               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
3119               && 1 <= (pos = exact_log2
3120                        (nonzero_bits (XEXP (SET_SRC (x), 0),
3121                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
3122             {
3123               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
3124
3125               SUBST (SET_SRC (x),
3126                      gen_rtx_NEG (mode,
3127                                   gen_rtx_LSHIFTRT (mode,
3128                                                     XEXP (SET_SRC (x), 0),
3129                                                     GEN_INT (pos))));
3130
3131               split = find_split_point (&SET_SRC (x), insn);
3132               if (split && split != &SET_SRC (x))
3133                 return split;
3134             }
3135           break;
3136
3137         case SIGN_EXTEND:
3138           inner = XEXP (SET_SRC (x), 0);
3139
3140           /* We can't optimize if either mode is a partial integer
3141              mode as we don't know how many bits are significant
3142              in those modes.  */
3143           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
3144               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
3145             break;
3146
3147           pos = 0;
3148           len = GET_MODE_BITSIZE (GET_MODE (inner));
3149           unsignedp = 0;
3150           break;
3151
3152         case SIGN_EXTRACT:
3153         case ZERO_EXTRACT:
3154           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3155               && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
3156             {
3157               inner = XEXP (SET_SRC (x), 0);
3158               len = INTVAL (XEXP (SET_SRC (x), 1));
3159               pos = INTVAL (XEXP (SET_SRC (x), 2));
3160
3161               if (BITS_BIG_ENDIAN)
3162                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
3163               unsignedp = (code == ZERO_EXTRACT);
3164             }
3165           break;
3166
3167         default:
3168           break;
3169         }
3170
3171       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
3172         {
3173           enum machine_mode mode = GET_MODE (SET_SRC (x));
3174
3175           /* For unsigned, we have a choice of a shift followed by an
3176              AND or two shifts.  Use two shifts for field sizes where the
3177              constant might be too large.  We assume here that we can
3178              always at least get 8-bit constants in an AND insn, which is
3179              true for every current RISC.  */
3180
3181           if (unsignedp && len <= 8)
3182             {
3183               SUBST (SET_SRC (x),
3184                      gen_rtx_AND (mode,
3185                                   gen_rtx_LSHIFTRT
3186                                   (mode, gen_lowpart_for_combine (mode, inner),
3187                                    GEN_INT (pos)),
3188                                   GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
3189
3190               split = find_split_point (&SET_SRC (x), insn);
3191               if (split && split != &SET_SRC (x))
3192                 return split;
3193             }
3194           else
3195             {
3196               SUBST (SET_SRC (x),
3197                      gen_rtx_fmt_ee
3198                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
3199                       gen_rtx_ASHIFT (mode,
3200                                       gen_lowpart_for_combine (mode, inner),
3201                                       GEN_INT (GET_MODE_BITSIZE (mode)
3202                                                - len - pos)),
3203                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
3204
3205               split = find_split_point (&SET_SRC (x), insn);
3206               if (split && split != &SET_SRC (x))
3207                 return split;
3208             }
3209         }
3210
3211       /* See if this is a simple operation with a constant as the second
3212          operand.  It might be that this constant is out of range and hence
3213          could be used as a split point.  */
3214       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
3215            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
3216            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<')
3217           && CONSTANT_P (XEXP (SET_SRC (x), 1))
3218           && (GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (x), 0))) == 'o'
3219               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
3220                   && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (SET_SRC (x), 0))))
3221                       == 'o'))))
3222         return &XEXP (SET_SRC (x), 1);
3223
3224       /* Finally, see if this is a simple operation with its first operand
3225          not in a register.  The operation might require this operand in a
3226          register, so return it as a split point.  We can always do this
3227          because if the first operand were another operation, we would have
3228          already found it as a split point.  */
3229       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
3230            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
3231            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<'
3232            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '1')
3233           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
3234         return &XEXP (SET_SRC (x), 0);
3235
3236       return 0;
3237
3238     case AND:
3239     case IOR:
3240       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
3241          it is better to write this as (not (ior A B)) so we can split it.
3242          Similarly for IOR.  */
3243       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
3244         {
3245           SUBST (*loc,
3246                  gen_rtx_NOT (GET_MODE (x),
3247                               gen_rtx_fmt_ee (code == IOR ? AND : IOR,
3248                                               GET_MODE (x),
3249                                               XEXP (XEXP (x, 0), 0),
3250                                               XEXP (XEXP (x, 1), 0))));
3251           return find_split_point (loc, insn);
3252         }
3253
3254       /* Many RISC machines have a large set of logical insns.  If the
3255          second operand is a NOT, put it first so we will try to split the
3256          other operand first.  */
3257       if (GET_CODE (XEXP (x, 1)) == NOT)
3258         {
3259           rtx tem = XEXP (x, 0);
3260           SUBST (XEXP (x, 0), XEXP (x, 1));
3261           SUBST (XEXP (x, 1), tem);
3262         }
3263       break;
3264
3265     default:
3266       break;
3267     }
3268
3269   /* Otherwise, select our actions depending on our rtx class.  */
3270   switch (GET_RTX_CLASS (code))
3271     {
3272     case 'b':                   /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
3273     case '3':
3274       split = find_split_point (&XEXP (x, 2), insn);
3275       if (split)
3276         return split;
3277       /* ... fall through ...  */
3278     case '2':
3279     case 'c':
3280     case '<':
3281       split = find_split_point (&XEXP (x, 1), insn);
3282       if (split)
3283         return split;
3284       /* ... fall through ...  */
3285     case '1':
3286       /* Some machines have (and (shift ...) ...) insns.  If X is not
3287          an AND, but XEXP (X, 0) is, use it as our split point.  */
3288       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
3289         return &XEXP (x, 0);
3290
3291       split = find_split_point (&XEXP (x, 0), insn);
3292       if (split)
3293         return split;
3294       return loc;
3295     }
3296
3297   /* Otherwise, we don't have a split point.  */
3298   return 0;
3299 }
3300 \f
3301 /* Throughout X, replace FROM with TO, and return the result.
3302    The result is TO if X is FROM;
3303    otherwise the result is X, but its contents may have been modified.
3304    If they were modified, a record was made in undobuf so that
3305    undo_all will (among other things) return X to its original state.
3306
3307    If the number of changes necessary is too much to record to undo,
3308    the excess changes are not made, so the result is invalid.
3309    The changes already made can still be undone.
3310    undobuf.num_undo is incremented for such changes, so by testing that
3311    the caller can tell whether the result is valid.
3312
3313    `n_occurrences' is incremented each time FROM is replaced.
3314
3315    IN_DEST is non-zero if we are processing the SET_DEST of a SET.
3316
3317    UNIQUE_COPY is non-zero if each substitution must be unique.  We do this
3318    by copying if `n_occurrences' is non-zero.  */
3319
3320 static rtx
3321 subst (x, from, to, in_dest, unique_copy)
3322      rtx x, from, to;
3323      int in_dest;
3324      int unique_copy;
3325 {
3326   enum rtx_code code = GET_CODE (x);
3327   enum machine_mode op0_mode = VOIDmode;
3328   const char *fmt;
3329   int len, i;
3330   rtx new;
3331
3332 /* Two expressions are equal if they are identical copies of a shared
3333    RTX or if they are both registers with the same register number
3334    and mode.  */
3335
3336 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
3337   ((X) == (Y)                                           \
3338    || (GET_CODE (X) == REG && GET_CODE (Y) == REG       \
3339        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
3340
3341   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
3342     {
3343       n_occurrences++;
3344       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
3345     }
3346
3347   /* If X and FROM are the same register but different modes, they will
3348      not have been seen as equal above.  However, flow.c will make a
3349      LOG_LINKS entry for that case.  If we do nothing, we will try to
3350      rerecognize our original insn and, when it succeeds, we will
3351      delete the feeding insn, which is incorrect.
3352
3353      So force this insn not to match in this (rare) case.  */
3354   if (! in_dest && code == REG && GET_CODE (from) == REG
3355       && REGNO (x) == REGNO (from))
3356     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
3357
3358   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
3359      of which may contain things that can be combined.  */
3360   if (code != MEM && code != LO_SUM && GET_RTX_CLASS (code) == 'o')
3361     return x;
3362
3363   /* It is possible to have a subexpression appear twice in the insn.
3364      Suppose that FROM is a register that appears within TO.
3365      Then, after that subexpression has been scanned once by `subst',
3366      the second time it is scanned, TO may be found.  If we were
3367      to scan TO here, we would find FROM within it and create a
3368      self-referent rtl structure which is completely wrong.  */
3369   if (COMBINE_RTX_EQUAL_P (x, to))
3370     return to;
3371
3372   /* Parallel asm_operands need special attention because all of the
3373      inputs are shared across the arms.  Furthermore, unsharing the
3374      rtl results in recognition failures.  Failure to handle this case
3375      specially can result in circular rtl.
3376
3377      Solve this by doing a normal pass across the first entry of the
3378      parallel, and only processing the SET_DESTs of the subsequent
3379      entries.  Ug.  */
3380
3381   if (code == PARALLEL
3382       && GET_CODE (XVECEXP (x, 0, 0)) == SET
3383       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
3384     {
3385       new = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
3386
3387       /* If this substitution failed, this whole thing fails.  */
3388       if (GET_CODE (new) == CLOBBER
3389           && XEXP (new, 0) == const0_rtx)
3390         return new;
3391
3392       SUBST (XVECEXP (x, 0, 0), new);
3393
3394       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
3395         {
3396           rtx dest = SET_DEST (XVECEXP (x, 0, i));
3397
3398           if (GET_CODE (dest) != REG
3399               && GET_CODE (dest) != CC0
3400               && GET_CODE (dest) != PC)
3401             {
3402               new = subst (dest, from, to, 0, unique_copy);
3403
3404               /* If this substitution failed, this whole thing fails.  */
3405               if (GET_CODE (new) == CLOBBER
3406                   && XEXP (new, 0) == const0_rtx)
3407                 return new;
3408
3409               SUBST (SET_DEST (XVECEXP (x, 0, i)), new);
3410             }
3411         }
3412     }
3413   else
3414     {
3415       len = GET_RTX_LENGTH (code);
3416       fmt = GET_RTX_FORMAT (code);
3417
3418       /* We don't need to process a SET_DEST that is a register, CC0,
3419          or PC, so set up to skip this common case.  All other cases
3420          where we want to suppress replacing something inside a
3421          SET_SRC are handled via the IN_DEST operand.  */
3422       if (code == SET
3423           && (GET_CODE (SET_DEST (x)) == REG
3424               || GET_CODE (SET_DEST (x)) == CC0
3425               || GET_CODE (SET_DEST (x)) == PC))
3426         fmt = "ie";
3427
3428       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
3429          constant.  */
3430       if (fmt[0] == 'e')
3431         op0_mode = GET_MODE (XEXP (x, 0));
3432
3433       for (i = 0; i < len; i++)
3434         {
3435           if (fmt[i] == 'E')
3436             {
3437               int j;
3438               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3439                 {
3440                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
3441                     {
3442                       new = (unique_copy && n_occurrences
3443                              ? copy_rtx (to) : to);
3444                       n_occurrences++;
3445                     }
3446                   else
3447                     {
3448                       new = subst (XVECEXP (x, i, j), from, to, 0,
3449                                    unique_copy);
3450
3451                       /* If this substitution failed, this whole thing
3452                          fails.  */
3453                       if (GET_CODE (new) == CLOBBER
3454                           && XEXP (new, 0) == const0_rtx)
3455                         return new;
3456                     }
3457
3458                   SUBST (XVECEXP (x, i, j), new);
3459                 }
3460             }
3461           else if (fmt[i] == 'e')
3462             {
3463               /* If this is a register being set, ignore it.  */
3464               new = XEXP (x, i);
3465               if (in_dest
3466                   && (code == SUBREG || code == STRICT_LOW_PART
3467                       || code == ZERO_EXTRACT)
3468                   && i == 0
3469                   && GET_CODE (new) == REG)
3470                 ;
3471
3472               else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
3473                 {
3474                   /* In general, don't install a subreg involving two
3475                      modes not tieable.  It can worsen register
3476                      allocation, and can even make invalid reload
3477                      insns, since the reg inside may need to be copied
3478                      from in the outside mode, and that may be invalid
3479                      if it is an fp reg copied in integer mode.
3480
3481                      We allow two exceptions to this: It is valid if
3482                      it is inside another SUBREG and the mode of that
3483                      SUBREG and the mode of the inside of TO is
3484                      tieable and it is valid if X is a SET that copies
3485                      FROM to CC0.  */
3486
3487                   if (GET_CODE (to) == SUBREG
3488                       && ! MODES_TIEABLE_P (GET_MODE (to),
3489                                             GET_MODE (SUBREG_REG (to)))
3490                       && ! (code == SUBREG
3491                             && MODES_TIEABLE_P (GET_MODE (x),
3492                                                 GET_MODE (SUBREG_REG (to))))
3493 #ifdef HAVE_cc0
3494                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
3495 #endif
3496                       )
3497                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3498
3499 #ifdef CLASS_CANNOT_CHANGE_MODE
3500                   if (code == SUBREG
3501                       && GET_CODE (to) == REG
3502                       && REGNO (to) < FIRST_PSEUDO_REGISTER
3503                       && (TEST_HARD_REG_BIT
3504                           (reg_class_contents[(int) CLASS_CANNOT_CHANGE_MODE],
3505                            REGNO (to)))
3506                       && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (to),
3507                                                      GET_MODE (x)))
3508                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3509 #endif
3510
3511                   new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
3512                   n_occurrences++;
3513                 }
3514               else
3515                 /* If we are in a SET_DEST, suppress most cases unless we
3516                    have gone inside a MEM, in which case we want to
3517                    simplify the address.  We assume here that things that
3518                    are actually part of the destination have their inner
3519                    parts in the first expression.  This is true for SUBREG,
3520                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
3521                    things aside from REG and MEM that should appear in a
3522                    SET_DEST.  */
3523                 new = subst (XEXP (x, i), from, to,
3524                              (((in_dest
3525                                 && (code == SUBREG || code == STRICT_LOW_PART
3526                                     || code == ZERO_EXTRACT))
3527                                || code == SET)
3528                               && i == 0), unique_copy);
3529
3530               /* If we found that we will have to reject this combination,
3531                  indicate that by returning the CLOBBER ourselves, rather than
3532                  an expression containing it.  This will speed things up as
3533                  well as prevent accidents where two CLOBBERs are considered
3534                  to be equal, thus producing an incorrect simplification.  */
3535
3536               if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
3537                 return new;
3538
3539               if (GET_CODE (new) == CONST_INT && GET_CODE (x) == SUBREG)
3540                 {
3541                   if (VECTOR_MODE_P (GET_MODE (x)))
3542                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3543
3544                   x = simplify_subreg (GET_MODE (x), new,
3545                                        GET_MODE (SUBREG_REG (x)),
3546                                        SUBREG_BYTE (x));
3547                   if (! x)
3548                     abort ();
3549                 }
3550               else if (GET_CODE (new) == CONST_INT
3551                        && GET_CODE (x) == ZERO_EXTEND)
3552                 {
3553                   x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
3554                                                 new, GET_MODE (XEXP (x, 0)));
3555                   if (! x)
3556                     abort ();
3557                 }
3558               else
3559                 SUBST (XEXP (x, i), new);
3560             }
3561         }
3562     }
3563
3564   /* Try to simplify X.  If the simplification changed the code, it is likely
3565      that further simplification will help, so loop, but limit the number
3566      of repetitions that will be performed.  */
3567
3568   for (i = 0; i < 4; i++)
3569     {
3570       /* If X is sufficiently simple, don't bother trying to do anything
3571          with it.  */
3572       if (code != CONST_INT && code != REG && code != CLOBBER)
3573         x = combine_simplify_rtx (x, op0_mode, i == 3, in_dest);
3574
3575       if (GET_CODE (x) == code)
3576         break;
3577
3578       code = GET_CODE (x);
3579
3580       /* We no longer know the original mode of operand 0 since we
3581          have changed the form of X)  */
3582       op0_mode = VOIDmode;
3583     }
3584
3585   return x;
3586 }
3587 \f
3588 /* Simplify X, a piece of RTL.  We just operate on the expression at the
3589    outer level; call `subst' to simplify recursively.  Return the new
3590    expression.
3591
3592    OP0_MODE is the original mode of XEXP (x, 0); LAST is nonzero if this
3593    will be the iteration even if an expression with a code different from
3594    X is returned; IN_DEST is nonzero if we are inside a SET_DEST.  */
3595
3596 static rtx
3597 combine_simplify_rtx (x, op0_mode, last, in_dest)
3598      rtx x;
3599      enum machine_mode op0_mode;
3600      int last;
3601      int in_dest;
3602 {
3603   enum rtx_code code = GET_CODE (x);
3604   enum machine_mode mode = GET_MODE (x);
3605   rtx temp;
3606   rtx reversed;
3607   int i;
3608
3609   /* If this is a commutative operation, put a constant last and a complex
3610      expression first.  We don't need to do this for comparisons here.  */
3611   if (GET_RTX_CLASS (code) == 'c'
3612       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
3613     {
3614       temp = XEXP (x, 0);
3615       SUBST (XEXP (x, 0), XEXP (x, 1));
3616       SUBST (XEXP (x, 1), temp);
3617     }
3618
3619   /* If this is a PLUS, MINUS, or MULT, and the first operand is the
3620      sign extension of a PLUS with a constant, reverse the order of the sign
3621      extension and the addition. Note that this not the same as the original
3622      code, but overflow is undefined for signed values.  Also note that the
3623      PLUS will have been partially moved "inside" the sign-extension, so that
3624      the first operand of X will really look like:
3625          (ashiftrt (plus (ashift A C4) C5) C4).
3626      We convert this to
3627          (plus (ashiftrt (ashift A C4) C2) C4)
3628      and replace the first operand of X with that expression.  Later parts
3629      of this function may simplify the expression further.
3630
3631      For example, if we start with (mult (sign_extend (plus A C1)) C2),
3632      we swap the SIGN_EXTEND and PLUS.  Later code will apply the
3633      distributive law to produce (plus (mult (sign_extend X) C1) C3).
3634
3635      We do this to simplify address expressions.  */
3636
3637   if ((code == PLUS || code == MINUS || code == MULT)
3638       && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3639       && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
3640       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT
3641       && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT
3642       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3643       && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1)
3644       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
3645       && (temp = simplify_binary_operation (ASHIFTRT, mode,
3646                                             XEXP (XEXP (XEXP (x, 0), 0), 1),
3647                                             XEXP (XEXP (x, 0), 1))) != 0)
3648     {
3649       rtx new
3650         = simplify_shift_const (NULL_RTX, ASHIFT, mode,
3651                                 XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0),
3652                                 INTVAL (XEXP (XEXP (x, 0), 1)));
3653
3654       new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
3655                                   INTVAL (XEXP (XEXP (x, 0), 1)));
3656
3657       SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
3658     }
3659
3660   /* If this is a simple operation applied to an IF_THEN_ELSE, try
3661      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
3662      things.  Check for cases where both arms are testing the same
3663      condition.
3664
3665      Don't do anything if all operands are very simple.  */
3666
3667   if (((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c'
3668         || GET_RTX_CLASS (code) == '<')
3669        && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
3670             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3671                   && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0))))
3672                       == 'o')))
3673            || (GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o'
3674                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
3675                      && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 1))))
3676                          == 'o')))))
3677       || (GET_RTX_CLASS (code) == '1'
3678           && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
3679                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3680                      && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0))))
3681                          == 'o'))))))
3682     {
3683       rtx cond, true_rtx, false_rtx;
3684
3685       cond = if_then_else_cond (x, &true_rtx, &false_rtx);
3686       if (cond != 0
3687           /* If everything is a comparison, what we have is highly unlikely
3688              to be simpler, so don't use it.  */
3689           && ! (GET_RTX_CLASS (code) == '<'
3690                 && (GET_RTX_CLASS (GET_CODE (true_rtx)) == '<'
3691                     || GET_RTX_CLASS (GET_CODE (false_rtx)) == '<')))
3692         {
3693           rtx cop1 = const0_rtx;
3694           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
3695
3696           if (cond_code == NE && GET_RTX_CLASS (GET_CODE (cond)) == '<')
3697             return x;
3698
3699           /* Simplify the alternative arms; this may collapse the true and
3700              false arms to store-flag values.  */
3701           true_rtx = subst (true_rtx, pc_rtx, pc_rtx, 0, 0);
3702           false_rtx = subst (false_rtx, pc_rtx, pc_rtx, 0, 0);
3703
3704           /* If true_rtx and false_rtx are not general_operands, an if_then_else
3705              is unlikely to be simpler.  */
3706           if (general_operand (true_rtx, VOIDmode)
3707               && general_operand (false_rtx, VOIDmode))
3708             {
3709               /* Restarting if we generate a store-flag expression will cause
3710                  us to loop.  Just drop through in this case.  */
3711
3712               /* If the result values are STORE_FLAG_VALUE and zero, we can
3713                  just make the comparison operation.  */
3714               if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
3715                 x = gen_binary (cond_code, mode, cond, cop1);
3716               else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
3717                        && reverse_condition (cond_code) != UNKNOWN)
3718                 x = gen_binary (reverse_condition (cond_code),
3719                                 mode, cond, cop1);
3720
3721               /* Likewise, we can make the negate of a comparison operation
3722                  if the result values are - STORE_FLAG_VALUE and zero.  */
3723               else if (GET_CODE (true_rtx) == CONST_INT
3724                        && INTVAL (true_rtx) == - STORE_FLAG_VALUE
3725                        && false_rtx == const0_rtx)
3726                 x = simplify_gen_unary (NEG, mode,
3727                                         gen_binary (cond_code, mode, cond,
3728                                                     cop1),
3729                                         mode);
3730               else if (GET_CODE (false_rtx) == CONST_INT
3731                        && INTVAL (false_rtx) == - STORE_FLAG_VALUE
3732                        && true_rtx == const0_rtx)
3733                 x = simplify_gen_unary (NEG, mode,
3734                                         gen_binary (reverse_condition
3735                                                     (cond_code),
3736                                                     mode, cond, cop1),
3737                                         mode);
3738               else
3739                 return gen_rtx_IF_THEN_ELSE (mode,
3740                                              gen_binary (cond_code, VOIDmode,
3741                                                          cond, cop1),
3742                                              true_rtx, false_rtx);
3743
3744               code = GET_CODE (x);
3745               op0_mode = VOIDmode;
3746             }
3747         }
3748     }
3749
3750   /* Try to fold this expression in case we have constants that weren't
3751      present before.  */
3752   temp = 0;
3753   switch (GET_RTX_CLASS (code))
3754     {
3755     case '1':
3756       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
3757       break;
3758     case '<':
3759       {
3760         enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
3761         if (cmp_mode == VOIDmode)
3762           {
3763             cmp_mode = GET_MODE (XEXP (x, 1));
3764             if (cmp_mode == VOIDmode)
3765               cmp_mode = op0_mode;
3766           }
3767         temp = simplify_relational_operation (code, cmp_mode,
3768                                               XEXP (x, 0), XEXP (x, 1));
3769       }
3770 #ifdef FLOAT_STORE_FLAG_VALUE
3771       if (temp != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
3772         {
3773           if (temp == const0_rtx)
3774             temp = CONST0_RTX (mode);
3775           else
3776             temp = CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE (mode),
3777                                                  mode);
3778         }
3779 #endif
3780       break;
3781     case 'c':
3782     case '2':
3783       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
3784       break;
3785     case 'b':
3786     case '3':
3787       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
3788                                          XEXP (x, 1), XEXP (x, 2));
3789       break;
3790     }
3791
3792   if (temp)
3793     {
3794       x = temp;
3795       code = GET_CODE (temp);
3796       op0_mode = VOIDmode;
3797       mode = GET_MODE (temp);
3798     }
3799
3800   /* First see if we can apply the inverse distributive law.  */
3801   if (code == PLUS || code == MINUS
3802       || code == AND || code == IOR || code == XOR)
3803     {
3804       x = apply_distributive_law (x);
3805       code = GET_CODE (x);
3806       op0_mode = VOIDmode;
3807     }
3808
3809   /* If CODE is an associative operation not otherwise handled, see if we
3810      can associate some operands.  This can win if they are constants or
3811      if they are logically related (i.e. (a & b) & a).  */
3812   if ((code == PLUS || code == MINUS || code == MULT || code == DIV
3813        || code == AND || code == IOR || code == XOR
3814        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
3815       && ((INTEGRAL_MODE_P (mode) && code != DIV)
3816           || (flag_unsafe_math_optimizations && FLOAT_MODE_P (mode))))
3817     {
3818       if (GET_CODE (XEXP (x, 0)) == code)
3819         {
3820           rtx other = XEXP (XEXP (x, 0), 0);
3821           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
3822           rtx inner_op1 = XEXP (x, 1);
3823           rtx inner;
3824
3825           /* Make sure we pass the constant operand if any as the second
3826              one if this is a commutative operation.  */
3827           if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c')
3828             {
3829               rtx tem = inner_op0;
3830               inner_op0 = inner_op1;
3831               inner_op1 = tem;
3832             }
3833           inner = simplify_binary_operation (code == MINUS ? PLUS
3834                                              : code == DIV ? MULT
3835                                              : code,
3836                                              mode, inner_op0, inner_op1);
3837
3838           /* For commutative operations, try the other pair if that one
3839              didn't simplify.  */
3840           if (inner == 0 && GET_RTX_CLASS (code) == 'c')
3841             {
3842               other = XEXP (XEXP (x, 0), 1);
3843               inner = simplify_binary_operation (code, mode,
3844                                                  XEXP (XEXP (x, 0), 0),
3845                                                  XEXP (x, 1));
3846             }
3847
3848           if (inner)
3849             return gen_binary (code, mode, other, inner);
3850         }
3851     }
3852
3853   /* A little bit of algebraic simplification here.  */
3854   switch (code)
3855     {
3856     case MEM:
3857       /* Ensure that our address has any ASHIFTs converted to MULT in case
3858          address-recognizing predicates are called later.  */
3859       temp = make_compound_operation (XEXP (x, 0), MEM);
3860       SUBST (XEXP (x, 0), temp);
3861       break;
3862
3863     case SUBREG:
3864       if (op0_mode == VOIDmode)
3865         op0_mode = GET_MODE (SUBREG_REG (x));
3866
3867       /* simplify_subreg can't use gen_lowpart_for_combine.  */
3868       if (CONSTANT_P (SUBREG_REG (x))
3869           && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x))
3870         return gen_lowpart_for_combine (mode, SUBREG_REG (x));
3871
3872       if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
3873         break;
3874       {
3875         rtx temp;
3876         temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
3877                                 SUBREG_BYTE (x));
3878         if (temp)
3879           return temp;
3880       }
3881
3882       /* Don't change the mode of the MEM if that would change the meaning
3883          of the address.  */
3884       if (GET_CODE (SUBREG_REG (x)) == MEM
3885           && (MEM_VOLATILE_P (SUBREG_REG (x))
3886               || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
3887         return gen_rtx_CLOBBER (mode, const0_rtx);
3888
3889       /* Note that we cannot do any narrowing for non-constants since
3890          we might have been counting on using the fact that some bits were
3891          zero.  We now do this in the SET.  */
3892
3893       break;
3894
3895     case NOT:
3896       /* (not (plus X -1)) can become (neg X).  */
3897       if (GET_CODE (XEXP (x, 0)) == PLUS
3898           && XEXP (XEXP (x, 0), 1) == constm1_rtx)
3899         return gen_rtx_NEG (mode, XEXP (XEXP (x, 0), 0));
3900
3901       /* Similarly, (not (neg X)) is (plus X -1).  */
3902       if (GET_CODE (XEXP (x, 0)) == NEG)
3903         return gen_rtx_PLUS (mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
3904
3905       /* (not (xor X C)) for C constant is (xor X D) with D = ~C.  */
3906       if (GET_CODE (XEXP (x, 0)) == XOR
3907           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3908           && (temp = simplify_unary_operation (NOT, mode,
3909                                                XEXP (XEXP (x, 0), 1),
3910                                                mode)) != 0)
3911         return gen_binary (XOR, mode, XEXP (XEXP (x, 0), 0), temp);
3912
3913       /* (not (ashift 1 X)) is (rotate ~1 X).  We used to do this for operands
3914          other than 1, but that is not valid.  We could do a similar
3915          simplification for (not (lshiftrt C X)) where C is just the sign bit,
3916          but this doesn't seem common enough to bother with.  */
3917       if (GET_CODE (XEXP (x, 0)) == ASHIFT
3918           && XEXP (XEXP (x, 0), 0) == const1_rtx)
3919         return gen_rtx_ROTATE (mode, simplify_gen_unary (NOT, mode,
3920                                                          const1_rtx, mode),
3921                                XEXP (XEXP (x, 0), 1));
3922
3923       if (GET_CODE (XEXP (x, 0)) == SUBREG
3924           && subreg_lowpart_p (XEXP (x, 0))
3925           && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
3926               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
3927           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
3928           && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
3929         {
3930           enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
3931
3932           x = gen_rtx_ROTATE (inner_mode,
3933                               simplify_gen_unary (NOT, inner_mode, const1_rtx,
3934                                                   inner_mode),
3935                               XEXP (SUBREG_REG (XEXP (x, 0)), 1));
3936           return gen_lowpart_for_combine (mode, x);
3937         }
3938
3939       /* If STORE_FLAG_VALUE is -1, (not (comparison foo bar)) can be done by
3940          reversing the comparison code if valid.  */
3941       if (STORE_FLAG_VALUE == -1
3942           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
3943           && (reversed = reversed_comparison (x, mode, XEXP (XEXP (x, 0), 0),
3944                                               XEXP (XEXP (x, 0), 1))))
3945         return reversed;
3946
3947       /* (not (ashiftrt foo C)) where C is the number of bits in FOO minus 1
3948          is (ge foo (const_int 0)) if STORE_FLAG_VALUE is -1, so we can
3949          perform the above simplification.  */
3950
3951       if (STORE_FLAG_VALUE == -1
3952           && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3953           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3954           && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1)
3955         return gen_rtx_GE (mode, XEXP (XEXP (x, 0), 0), const0_rtx);
3956
3957       /* Apply De Morgan's laws to reduce number of patterns for machines
3958          with negating logical insns (and-not, nand, etc.).  If result has
3959          only one NOT, put it first, since that is how the patterns are
3960          coded.  */
3961
3962       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
3963         {
3964           rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
3965           enum machine_mode op_mode;
3966
3967           op_mode = GET_MODE (in1);
3968           in1 = simplify_gen_unary (NOT, op_mode, in1, op_mode);
3969
3970           op_mode = GET_MODE (in2);
3971           if (op_mode == VOIDmode)
3972             op_mode = mode;
3973           in2 = simplify_gen_unary (NOT, op_mode, in2, op_mode);
3974
3975           if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
3976             {
3977               rtx tem = in2;
3978               in2 = in1; in1 = tem;
3979             }
3980
3981           return gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
3982                                  mode, in1, in2);
3983         }
3984       break;
3985
3986     case NEG:
3987       /* (neg (plus X 1)) can become (not X).  */
3988       if (GET_CODE (XEXP (x, 0)) == PLUS
3989           && XEXP (XEXP (x, 0), 1) == const1_rtx)
3990         return gen_rtx_NOT (mode, XEXP (XEXP (x, 0), 0));
3991
3992       /* Similarly, (neg (not X)) is (plus X 1).  */
3993       if (GET_CODE (XEXP (x, 0)) == NOT)
3994         return plus_constant (XEXP (XEXP (x, 0), 0), 1);
3995
3996       /* (neg (minus X Y)) can become (minus Y X).  This transformation
3997          isn't safe for modes with signed zeros, since if X and Y are
3998          both +0, (minus Y X) is the same as (minus X Y).  If the rounding
3999          mode is towards +infinity (or -infinity) then the two expressions
4000          will be rounded differently.  */
4001       if (GET_CODE (XEXP (x, 0)) == MINUS
4002           && !HONOR_SIGNED_ZEROS (mode)
4003           && !HONOR_SIGN_DEPENDENT_ROUNDING (mode))
4004         return gen_binary (MINUS, mode, XEXP (XEXP (x, 0), 1),
4005                            XEXP (XEXP (x, 0), 0));
4006
4007       /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1.  */
4008       if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx
4009           && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
4010         return gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
4011
4012       /* NEG commutes with ASHIFT since it is multiplication.  Only do this
4013          if we can then eliminate the NEG (e.g.,
4014          if the operand is a constant).  */
4015
4016       if (GET_CODE (XEXP (x, 0)) == ASHIFT)
4017         {
4018           temp = simplify_unary_operation (NEG, mode,
4019                                            XEXP (XEXP (x, 0), 0), mode);
4020           if (temp)
4021             return gen_binary (ASHIFT, mode, temp, XEXP (XEXP (x, 0), 1));
4022         }
4023
4024       temp = expand_compound_operation (XEXP (x, 0));
4025
4026       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
4027          replaced by (lshiftrt X C).  This will convert
4028          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
4029
4030       if (GET_CODE (temp) == ASHIFTRT
4031           && GET_CODE (XEXP (temp, 1)) == CONST_INT
4032           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
4033         return simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
4034                                      INTVAL (XEXP (temp, 1)));
4035
4036       /* If X has only a single bit that might be nonzero, say, bit I, convert
4037          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
4038          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
4039          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
4040          or a SUBREG of one since we'd be making the expression more
4041          complex if it was just a register.  */
4042
4043       if (GET_CODE (temp) != REG
4044           && ! (GET_CODE (temp) == SUBREG
4045                 && GET_CODE (SUBREG_REG (temp)) == REG)
4046           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
4047         {
4048           rtx temp1 = simplify_shift_const
4049             (NULL_RTX, ASHIFTRT, mode,
4050              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
4051                                    GET_MODE_BITSIZE (mode) - 1 - i),
4052              GET_MODE_BITSIZE (mode) - 1 - i);
4053
4054           /* If all we did was surround TEMP with the two shifts, we
4055              haven't improved anything, so don't use it.  Otherwise,
4056              we are better off with TEMP1.  */
4057           if (GET_CODE (temp1) != ASHIFTRT
4058               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
4059               || XEXP (XEXP (temp1, 0), 0) != temp)
4060             return temp1;
4061         }
4062       break;
4063
4064     case TRUNCATE:
4065       /* We can't handle truncation to a partial integer mode here
4066          because we don't know the real bitsize of the partial
4067          integer mode.  */
4068       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
4069         break;
4070
4071       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4072           && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4073                                     GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
4074         SUBST (XEXP (x, 0),
4075                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
4076                               GET_MODE_MASK (mode), NULL_RTX, 0));
4077
4078       /* (truncate:SI ({sign,zero}_extend:DI foo:SI)) == foo:SI.  */
4079       if ((GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4080            || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4081           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
4082         return XEXP (XEXP (x, 0), 0);
4083
4084       /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
4085          (OP:SI foo:SI) if OP is NEG or ABS.  */
4086       if ((GET_CODE (XEXP (x, 0)) == ABS
4087            || GET_CODE (XEXP (x, 0)) == NEG)
4088           && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SIGN_EXTEND
4089               || GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND)
4090           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
4091         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4092                                    XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
4093
4094       /* (truncate:SI (subreg:DI (truncate:SI X) 0)) is
4095          (truncate:SI x).  */
4096       if (GET_CODE (XEXP (x, 0)) == SUBREG
4097           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == TRUNCATE
4098           && subreg_lowpart_p (XEXP (x, 0)))
4099         return SUBREG_REG (XEXP (x, 0));
4100
4101       /* If we know that the value is already truncated, we can
4102          replace the TRUNCATE with a SUBREG if TRULY_NOOP_TRUNCATION
4103          is nonzero for the corresponding modes.  But don't do this
4104          for an (LSHIFTRT (MULT ...)) since this will cause problems
4105          with the umulXi3_highpart patterns.  */
4106       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4107                                  GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
4108           && num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4109              >= GET_MODE_BITSIZE (mode) + 1
4110           && ! (GET_CODE (XEXP (x, 0)) == LSHIFTRT
4111                 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT))
4112         return gen_lowpart_for_combine (mode, XEXP (x, 0));
4113
4114       /* A truncate of a comparison can be replaced with a subreg if
4115          STORE_FLAG_VALUE permits.  This is like the previous test,
4116          but it works even if the comparison is done in a mode larger
4117          than HOST_BITS_PER_WIDE_INT.  */
4118       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4119           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
4120           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0)
4121         return gen_lowpart_for_combine (mode, XEXP (x, 0));
4122
4123       /* Similarly, a truncate of a register whose value is a
4124          comparison can be replaced with a subreg if STORE_FLAG_VALUE
4125          permits.  */
4126       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4127           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
4128           && (temp = get_last_value (XEXP (x, 0)))
4129           && GET_RTX_CLASS (GET_CODE (temp)) == '<')
4130         return gen_lowpart_for_combine (mode, XEXP (x, 0));
4131
4132       break;
4133
4134     case FLOAT_TRUNCATE:
4135       /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF.  */
4136       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4137           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
4138         return XEXP (XEXP (x, 0), 0);
4139
4140       /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
4141          (OP:SF foo:SF) if OP is NEG or ABS.  */
4142       if ((GET_CODE (XEXP (x, 0)) == ABS
4143            || GET_CODE (XEXP (x, 0)) == NEG)
4144           && GET_CODE (XEXP (XEXP (x, 0), 0)) == FLOAT_EXTEND
4145           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
4146         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4147                                    XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
4148
4149       /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
4150          is (float_truncate:SF x).  */
4151       if (GET_CODE (XEXP (x, 0)) == SUBREG
4152           && subreg_lowpart_p (XEXP (x, 0))
4153           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE)
4154         return SUBREG_REG (XEXP (x, 0));
4155       break;
4156
4157 #ifdef HAVE_cc0
4158     case COMPARE:
4159       /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
4160          using cc0, in which case we want to leave it as a COMPARE
4161          so we can distinguish it from a register-register-copy.  */
4162       if (XEXP (x, 1) == const0_rtx)
4163         return XEXP (x, 0);
4164
4165       /* x - 0 is the same as x unless x's mode has signed zeros and
4166          allows rounding towards -infinity.  Under those conditions,
4167          0 - 0 is -0.  */
4168       if (!(HONOR_SIGNED_ZEROS (GET_MODE (XEXP (x, 0)))
4169             && HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (XEXP (x, 0))))
4170           && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
4171         return XEXP (x, 0);
4172       break;
4173 #endif
4174
4175     case CONST:
4176       /* (const (const X)) can become (const X).  Do it this way rather than
4177          returning the inner CONST since CONST can be shared with a
4178          REG_EQUAL note.  */
4179       if (GET_CODE (XEXP (x, 0)) == CONST)
4180         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4181       break;
4182
4183 #ifdef HAVE_lo_sum
4184     case LO_SUM:
4185       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
4186          can add in an offset.  find_split_point will split this address up
4187          again if it doesn't match.  */
4188       if (GET_CODE (XEXP (x, 0)) == HIGH
4189           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
4190         return XEXP (x, 1);
4191       break;
4192 #endif
4193
4194     case PLUS:
4195       /* If we have (plus (plus (A const) B)), associate it so that CONST is
4196          outermost.  That's because that's the way indexed addresses are
4197          supposed to appear.  This code used to check many more cases, but
4198          they are now checked elsewhere.  */
4199       if (GET_CODE (XEXP (x, 0)) == PLUS
4200           && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
4201         return gen_binary (PLUS, mode,
4202                            gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
4203                                        XEXP (x, 1)),
4204                            XEXP (XEXP (x, 0), 1));
4205
4206       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
4207          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
4208          bit-field and can be replaced by either a sign_extend or a
4209          sign_extract.  The `and' may be a zero_extend and the two
4210          <c>, -<c> constants may be reversed.  */
4211       if (GET_CODE (XEXP (x, 0)) == XOR
4212           && GET_CODE (XEXP (x, 1)) == CONST_INT
4213           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4214           && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
4215           && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
4216               || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
4217           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4218           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
4219                && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4220                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
4221                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
4222               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
4223                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
4224                       == (unsigned int) i + 1))))
4225         return simplify_shift_const
4226           (NULL_RTX, ASHIFTRT, mode,
4227            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4228                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
4229                                  GET_MODE_BITSIZE (mode) - (i + 1)),
4230            GET_MODE_BITSIZE (mode) - (i + 1));
4231
4232       /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
4233          C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
4234          is 1.  This produces better code than the alternative immediately
4235          below.  */
4236       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
4237           && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx)
4238               || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx))
4239           && (reversed = reversed_comparison (XEXP (x, 0), mode,
4240                                               XEXP (XEXP (x, 0), 0),
4241                                               XEXP (XEXP (x, 0), 1))))
4242         return
4243           simplify_gen_unary (NEG, mode, reversed, mode);
4244
4245       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
4246          can become (ashiftrt (ashift (xor x 1) C) C) where C is
4247          the bitsize of the mode - 1.  This allows simplification of
4248          "a = (b & 8) == 0;"  */
4249       if (XEXP (x, 1) == constm1_rtx
4250           && GET_CODE (XEXP (x, 0)) != REG
4251           && ! (GET_CODE (XEXP (x,0)) == SUBREG
4252                 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)
4253           && nonzero_bits (XEXP (x, 0), mode) == 1)
4254         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
4255            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4256                                  gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
4257                                  GET_MODE_BITSIZE (mode) - 1),
4258            GET_MODE_BITSIZE (mode) - 1);
4259
4260       /* If we are adding two things that have no bits in common, convert
4261          the addition into an IOR.  This will often be further simplified,
4262          for example in cases like ((a & 1) + (a & 2)), which can
4263          become a & 3.  */
4264
4265       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4266           && (nonzero_bits (XEXP (x, 0), mode)
4267               & nonzero_bits (XEXP (x, 1), mode)) == 0)
4268         {
4269           /* Try to simplify the expression further.  */
4270           rtx tor = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
4271           temp = combine_simplify_rtx (tor, mode, last, in_dest);
4272
4273           /* If we could, great.  If not, do not go ahead with the IOR
4274              replacement, since PLUS appears in many special purpose
4275              address arithmetic instructions.  */
4276           if (GET_CODE (temp) != CLOBBER && temp != tor)
4277             return temp;
4278         }
4279       break;
4280
4281     case MINUS:
4282       /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
4283          by reversing the comparison code if valid.  */
4284       if (STORE_FLAG_VALUE == 1
4285           && XEXP (x, 0) == const1_rtx
4286           && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) == '<'
4287           && (reversed = reversed_comparison (XEXP (x, 1), mode,
4288                                               XEXP (XEXP (x, 1), 0),
4289                                               XEXP (XEXP (x, 1), 1))))
4290         return reversed;
4291
4292       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
4293          (and <foo> (const_int pow2-1))  */
4294       if (GET_CODE (XEXP (x, 1)) == AND
4295           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
4296           && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
4297           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
4298         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
4299                                        -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
4300
4301       /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
4302          integers.  */
4303       if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
4304         return gen_binary (MINUS, mode,
4305                            gen_binary (MINUS, mode, XEXP (x, 0),
4306                                        XEXP (XEXP (x, 1), 0)),
4307                            XEXP (XEXP (x, 1), 1));
4308       break;
4309
4310     case MULT:
4311       /* If we have (mult (plus A B) C), apply the distributive law and then
4312          the inverse distributive law to see if things simplify.  This
4313          occurs mostly in addresses, often when unrolling loops.  */
4314
4315       if (GET_CODE (XEXP (x, 0)) == PLUS)
4316         {
4317           x = apply_distributive_law
4318             (gen_binary (PLUS, mode,
4319                          gen_binary (MULT, mode,
4320                                      XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
4321                          gen_binary (MULT, mode,
4322                                      XEXP (XEXP (x, 0), 1),
4323                                      copy_rtx (XEXP (x, 1)))));
4324
4325           if (GET_CODE (x) != MULT)
4326             return x;
4327         }
4328       /* Try simplify a*(b/c) as (a*b)/c.  */
4329       if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
4330           && GET_CODE (XEXP (x, 0)) == DIV)
4331         {
4332           rtx tem = simplify_binary_operation (MULT, mode,
4333                                                XEXP (XEXP (x, 0), 0),
4334                                                XEXP (x, 1));
4335           if (tem)
4336             return gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
4337         }
4338       break;
4339
4340     case UDIV:
4341       /* If this is a divide by a power of two, treat it as a shift if
4342          its first operand is a shift.  */
4343       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4344           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
4345           && (GET_CODE (XEXP (x, 0)) == ASHIFT
4346               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
4347               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
4348               || GET_CODE (XEXP (x, 0)) == ROTATE
4349               || GET_CODE (XEXP (x, 0)) == ROTATERT))
4350         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
4351       break;
4352
4353     case EQ:  case NE:
4354     case GT:  case GTU:  case GE:  case GEU:
4355     case LT:  case LTU:  case LE:  case LEU:
4356     case UNEQ:  case LTGT:
4357     case UNGT:  case UNGE:
4358     case UNLT:  case UNLE:
4359     case UNORDERED: case ORDERED:
4360       /* If the first operand is a condition code, we can't do anything
4361          with it.  */
4362       if (GET_CODE (XEXP (x, 0)) == COMPARE
4363           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
4364 #ifdef HAVE_cc0
4365               && XEXP (x, 0) != cc0_rtx
4366 #endif
4367               ))
4368         {
4369           rtx op0 = XEXP (x, 0);
4370           rtx op1 = XEXP (x, 1);
4371           enum rtx_code new_code;
4372
4373           if (GET_CODE (op0) == COMPARE)
4374             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4375
4376           /* Simplify our comparison, if possible.  */
4377           new_code = simplify_comparison (code, &op0, &op1);
4378
4379           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
4380              if only the low-order bit is possibly nonzero in X (such as when
4381              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
4382              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
4383              known to be either 0 or -1, NE becomes a NEG and EQ becomes
4384              (plus X 1).
4385
4386              Remove any ZERO_EXTRACT we made when thinking this was a
4387              comparison.  It may now be simpler to use, e.g., an AND.  If a
4388              ZERO_EXTRACT is indeed appropriate, it will be placed back by
4389              the call to make_compound_operation in the SET case.  */
4390
4391           if (STORE_FLAG_VALUE == 1
4392               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4393               && op1 == const0_rtx
4394               && mode == GET_MODE (op0)
4395               && nonzero_bits (op0, mode) == 1)
4396             return gen_lowpart_for_combine (mode,
4397                                             expand_compound_operation (op0));
4398
4399           else if (STORE_FLAG_VALUE == 1
4400                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4401                    && op1 == const0_rtx
4402                    && mode == GET_MODE (op0)
4403                    && (num_sign_bit_copies (op0, mode)
4404                        == GET_MODE_BITSIZE (mode)))
4405             {
4406               op0 = expand_compound_operation (op0);
4407               return simplify_gen_unary (NEG, mode,
4408                                          gen_lowpart_for_combine (mode, op0),
4409                                          mode);
4410             }
4411
4412           else if (STORE_FLAG_VALUE == 1
4413                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4414                    && op1 == const0_rtx
4415                    && mode == GET_MODE (op0)
4416                    && nonzero_bits (op0, mode) == 1)
4417             {
4418               op0 = expand_compound_operation (op0);
4419               return gen_binary (XOR, mode,
4420                                  gen_lowpart_for_combine (mode, op0),
4421                                  const1_rtx);
4422             }
4423
4424           else if (STORE_FLAG_VALUE == 1
4425                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4426                    && op1 == const0_rtx
4427                    && mode == GET_MODE (op0)
4428                    && (num_sign_bit_copies (op0, mode)
4429                        == GET_MODE_BITSIZE (mode)))
4430             {
4431               op0 = expand_compound_operation (op0);
4432               return plus_constant (gen_lowpart_for_combine (mode, op0), 1);
4433             }
4434
4435           /* If STORE_FLAG_VALUE is -1, we have cases similar to
4436              those above.  */
4437           if (STORE_FLAG_VALUE == -1
4438               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4439               && op1 == const0_rtx
4440               && (num_sign_bit_copies (op0, mode)
4441                   == GET_MODE_BITSIZE (mode)))
4442             return gen_lowpart_for_combine (mode,
4443                                             expand_compound_operation (op0));
4444
4445           else if (STORE_FLAG_VALUE == -1
4446                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4447                    && op1 == const0_rtx
4448                    && mode == GET_MODE (op0)
4449                    && nonzero_bits (op0, mode) == 1)
4450             {
4451               op0 = expand_compound_operation (op0);
4452               return simplify_gen_unary (NEG, mode,
4453                                          gen_lowpart_for_combine (mode, op0),
4454                                          mode);
4455             }
4456
4457           else if (STORE_FLAG_VALUE == -1
4458                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4459                    && op1 == const0_rtx
4460                    && mode == GET_MODE (op0)
4461                    && (num_sign_bit_copies (op0, mode)
4462                        == GET_MODE_BITSIZE (mode)))
4463             {
4464               op0 = expand_compound_operation (op0);
4465               return simplify_gen_unary (NOT, mode,
4466                                          gen_lowpart_for_combine (mode, op0),
4467                                          mode);
4468             }
4469
4470           /* If X is 0/1, (eq X 0) is X-1.  */
4471           else if (STORE_FLAG_VALUE == -1
4472                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4473                    && op1 == const0_rtx
4474                    && mode == GET_MODE (op0)
4475                    && nonzero_bits (op0, mode) == 1)
4476             {
4477               op0 = expand_compound_operation (op0);
4478               return plus_constant (gen_lowpart_for_combine (mode, op0), -1);
4479             }
4480
4481           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
4482              one bit that might be nonzero, we can convert (ne x 0) to
4483              (ashift x c) where C puts the bit in the sign bit.  Remove any
4484              AND with STORE_FLAG_VALUE when we are done, since we are only
4485              going to test the sign bit.  */
4486           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4487               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4488               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
4489                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE(mode)-1))
4490               && op1 == const0_rtx
4491               && mode == GET_MODE (op0)
4492               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
4493             {
4494               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
4495                                         expand_compound_operation (op0),
4496                                         GET_MODE_BITSIZE (mode) - 1 - i);
4497               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
4498                 return XEXP (x, 0);
4499               else
4500                 return x;
4501             }
4502
4503           /* If the code changed, return a whole new comparison.  */
4504           if (new_code != code)
4505             return gen_rtx_fmt_ee (new_code, mode, op0, op1);
4506
4507           /* Otherwise, keep this operation, but maybe change its operands.
4508              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
4509           SUBST (XEXP (x, 0), op0);
4510           SUBST (XEXP (x, 1), op1);
4511         }
4512       break;
4513
4514     case IF_THEN_ELSE:
4515       return simplify_if_then_else (x);
4516
4517     case ZERO_EXTRACT:
4518     case SIGN_EXTRACT:
4519     case ZERO_EXTEND:
4520     case SIGN_EXTEND:
4521       /* If we are processing SET_DEST, we are done.  */
4522       if (in_dest)
4523         return x;
4524
4525       return expand_compound_operation (x);
4526
4527     case SET:
4528       return simplify_set (x);
4529
4530     case AND:
4531     case IOR:
4532     case XOR:
4533       return simplify_logical (x, last);
4534
4535     case ABS:
4536       /* (abs (neg <foo>)) -> (abs <foo>) */
4537       if (GET_CODE (XEXP (x, 0)) == NEG)
4538         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4539
4540       /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
4541          do nothing.  */
4542       if (GET_MODE (XEXP (x, 0)) == VOIDmode)
4543         break;
4544
4545       /* If operand is something known to be positive, ignore the ABS.  */
4546       if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
4547           || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4548                <= HOST_BITS_PER_WIDE_INT)
4549               && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4550                    & ((HOST_WIDE_INT) 1
4551                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
4552                   == 0)))
4553         return XEXP (x, 0);
4554
4555       /* If operand is known to be only -1 or 0, convert ABS to NEG.  */
4556       if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
4557         return gen_rtx_NEG (mode, XEXP (x, 0));
4558
4559       break;
4560
4561     case FFS:
4562       /* (ffs (*_extend <X>)) = (ffs <X>) */
4563       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4564           || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4565         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4566       break;
4567
4568     case FLOAT:
4569       /* (float (sign_extend <X>)) = (float <X>).  */
4570       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
4571         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4572       break;
4573
4574     case ASHIFT:
4575     case LSHIFTRT:
4576     case ASHIFTRT:
4577     case ROTATE:
4578     case ROTATERT:
4579       /* If this is a shift by a constant amount, simplify it.  */
4580       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4581         return simplify_shift_const (x, code, mode, XEXP (x, 0),
4582                                      INTVAL (XEXP (x, 1)));
4583
4584 #ifdef SHIFT_COUNT_TRUNCATED
4585       else if (SHIFT_COUNT_TRUNCATED && GET_CODE (XEXP (x, 1)) != REG)
4586         SUBST (XEXP (x, 1),
4587                force_to_mode (XEXP (x, 1), GET_MODE (x),
4588                               ((HOST_WIDE_INT) 1
4589                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
4590                               - 1,
4591                               NULL_RTX, 0));
4592 #endif
4593
4594       break;
4595
4596     case VEC_SELECT:
4597       {
4598         rtx op0 = XEXP (x, 0);
4599         rtx op1 = XEXP (x, 1);
4600         int len;
4601
4602         if (GET_CODE (op1) != PARALLEL)
4603           abort ();
4604         len = XVECLEN (op1, 0);
4605         if (len == 1
4606             && GET_CODE (XVECEXP (op1, 0, 0)) == CONST_INT
4607             && GET_CODE (op0) == VEC_CONCAT)
4608           {
4609             int offset = INTVAL (XVECEXP (op1, 0, 0)) * GET_MODE_SIZE (GET_MODE (x));
4610
4611             /* Try to find the element in the VEC_CONCAT.  */
4612             for (;;)
4613               {
4614                 if (GET_MODE (op0) == GET_MODE (x))
4615                   return op0;
4616                 if (GET_CODE (op0) == VEC_CONCAT)
4617                   {
4618                     HOST_WIDE_INT op0_size = GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)));
4619                     if (op0_size < offset)
4620                       op0 = XEXP (op0, 0);
4621                     else
4622                       {
4623                         offset -= op0_size;
4624                         op0 = XEXP (op0, 1);
4625                       }
4626                   }
4627                 else
4628                   break;
4629               }
4630           }
4631       }
4632
4633       break;
4634
4635     default:
4636       break;
4637     }
4638
4639   return x;
4640 }
4641 \f
4642 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
4643
4644 static rtx
4645 simplify_if_then_else (x)
4646      rtx x;
4647 {
4648   enum machine_mode mode = GET_MODE (x);
4649   rtx cond = XEXP (x, 0);
4650   rtx true_rtx = XEXP (x, 1);
4651   rtx false_rtx = XEXP (x, 2);
4652   enum rtx_code true_code = GET_CODE (cond);
4653   int comparison_p = GET_RTX_CLASS (true_code) == '<';
4654   rtx temp;
4655   int i;
4656   enum rtx_code false_code;
4657   rtx reversed;
4658
4659   /* Simplify storing of the truth value.  */
4660   if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
4661     return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1));
4662
4663   /* Also when the truth value has to be reversed.  */
4664   if (comparison_p
4665       && true_rtx == const0_rtx && false_rtx == const_true_rtx
4666       && (reversed = reversed_comparison (cond, mode, XEXP (cond, 0),
4667                                           XEXP (cond, 1))))
4668     return reversed;
4669
4670   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
4671      in it is being compared against certain values.  Get the true and false
4672      comparisons and see if that says anything about the value of each arm.  */
4673
4674   if (comparison_p
4675       && ((false_code = combine_reversed_comparison_code (cond))
4676           != UNKNOWN)
4677       && GET_CODE (XEXP (cond, 0)) == REG)
4678     {
4679       HOST_WIDE_INT nzb;
4680       rtx from = XEXP (cond, 0);
4681       rtx true_val = XEXP (cond, 1);
4682       rtx false_val = true_val;
4683       int swapped = 0;
4684
4685       /* If FALSE_CODE is EQ, swap the codes and arms.  */
4686
4687       if (false_code == EQ)
4688         {
4689           swapped = 1, true_code = EQ, false_code = NE;
4690           temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4691         }
4692
4693       /* If we are comparing against zero and the expression being tested has
4694          only a single bit that might be nonzero, that is its value when it is
4695          not equal to zero.  Similarly if it is known to be -1 or 0.  */
4696
4697       if (true_code == EQ && true_val == const0_rtx
4698           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
4699         false_code = EQ, false_val = GEN_INT (nzb);
4700       else if (true_code == EQ && true_val == const0_rtx
4701                && (num_sign_bit_copies (from, GET_MODE (from))
4702                    == GET_MODE_BITSIZE (GET_MODE (from))))
4703         false_code = EQ, false_val = constm1_rtx;
4704
4705       /* Now simplify an arm if we know the value of the register in the
4706          branch and it is used in the arm.  Be careful due to the potential
4707          of locally-shared RTL.  */
4708
4709       if (reg_mentioned_p (from, true_rtx))
4710         true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
4711                                       from, true_val),
4712                       pc_rtx, pc_rtx, 0, 0);
4713       if (reg_mentioned_p (from, false_rtx))
4714         false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
4715                                    from, false_val),
4716                        pc_rtx, pc_rtx, 0, 0);
4717
4718       SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
4719       SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
4720
4721       true_rtx = XEXP (x, 1);
4722       false_rtx = XEXP (x, 2);
4723       true_code = GET_CODE (cond);
4724     }
4725
4726   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
4727      reversed, do so to avoid needing two sets of patterns for
4728      subtract-and-branch insns.  Similarly if we have a constant in the true
4729      arm, the false arm is the same as the first operand of the comparison, or
4730      the false arm is more complicated than the true arm.  */
4731
4732   if (comparison_p
4733       && combine_reversed_comparison_code (cond) != UNKNOWN
4734       && (true_rtx == pc_rtx
4735           || (CONSTANT_P (true_rtx)
4736               && GET_CODE (false_rtx) != CONST_INT && false_rtx != pc_rtx)
4737           || true_rtx == const0_rtx
4738           || (GET_RTX_CLASS (GET_CODE (true_rtx)) == 'o'
4739               && GET_RTX_CLASS (GET_CODE (false_rtx)) != 'o')
4740           || (GET_CODE (true_rtx) == SUBREG
4741               && GET_RTX_CLASS (GET_CODE (SUBREG_REG (true_rtx))) == 'o'
4742               && GET_RTX_CLASS (GET_CODE (false_rtx)) != 'o')
4743           || reg_mentioned_p (true_rtx, false_rtx)
4744           || rtx_equal_p (false_rtx, XEXP (cond, 0))))
4745     {
4746       true_code = reversed_comparison_code (cond, NULL);
4747       SUBST (XEXP (x, 0),
4748              reversed_comparison (cond, GET_MODE (cond), XEXP (cond, 0),
4749                                   XEXP (cond, 1)));
4750
4751       SUBST (XEXP (x, 1), false_rtx);
4752       SUBST (XEXP (x, 2), true_rtx);
4753
4754       temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4755       cond = XEXP (x, 0);
4756
4757       /* It is possible that the conditional has been simplified out.  */
4758       true_code = GET_CODE (cond);
4759       comparison_p = GET_RTX_CLASS (true_code) == '<';
4760     }
4761
4762   /* If the two arms are identical, we don't need the comparison.  */
4763
4764   if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
4765     return true_rtx;
4766
4767   /* Convert a == b ? b : a to "a".  */
4768   if (true_code == EQ && ! side_effects_p (cond)
4769       && (! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
4770       && rtx_equal_p (XEXP (cond, 0), false_rtx)
4771       && rtx_equal_p (XEXP (cond, 1), true_rtx))
4772     return false_rtx;
4773   else if (true_code == NE && ! side_effects_p (cond)
4774            && (! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
4775            && rtx_equal_p (XEXP (cond, 0), true_rtx)
4776            && rtx_equal_p (XEXP (cond, 1), false_rtx))
4777     return true_rtx;
4778
4779   /* Look for cases where we have (abs x) or (neg (abs X)).  */
4780
4781   if (GET_MODE_CLASS (mode) == MODE_INT
4782       && GET_CODE (false_rtx) == NEG
4783       && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
4784       && comparison_p
4785       && rtx_equal_p (true_rtx, XEXP (cond, 0))
4786       && ! side_effects_p (true_rtx))
4787     switch (true_code)
4788       {
4789       case GT:
4790       case GE:
4791         return simplify_gen_unary (ABS, mode, true_rtx, mode);
4792       case LT:
4793       case LE:
4794         return
4795           simplify_gen_unary (NEG, mode,
4796                               simplify_gen_unary (ABS, mode, true_rtx, mode),
4797                               mode);
4798       default:
4799         break;
4800       }
4801
4802   /* Look for MIN or MAX.  */
4803
4804   if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
4805       && comparison_p
4806       && rtx_equal_p (XEXP (cond, 0), true_rtx)
4807       && rtx_equal_p (XEXP (cond, 1), false_rtx)
4808       && ! side_effects_p (cond))
4809     switch (true_code)
4810       {
4811       case GE:
4812       case GT:
4813         return gen_binary (SMAX, mode, true_rtx, false_rtx);
4814       case LE:
4815       case LT:
4816         return gen_binary (SMIN, mode, true_rtx, false_rtx);
4817       case GEU:
4818       case GTU:
4819         return gen_binary (UMAX, mode, true_rtx, false_rtx);
4820       case LEU:
4821       case LTU:
4822         return gen_binary (UMIN, mode, true_rtx, false_rtx);
4823       default:
4824         break;
4825       }
4826
4827   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
4828      second operand is zero, this can be done as (OP Z (mult COND C2)) where
4829      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
4830      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
4831      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
4832      neither 1 or -1, but it isn't worth checking for.  */
4833
4834   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
4835       && comparison_p && mode != VOIDmode && ! side_effects_p (x))
4836     {
4837       rtx t = make_compound_operation (true_rtx, SET);
4838       rtx f = make_compound_operation (false_rtx, SET);
4839       rtx cond_op0 = XEXP (cond, 0);
4840       rtx cond_op1 = XEXP (cond, 1);
4841       enum rtx_code op = NIL, extend_op = NIL;
4842       enum machine_mode m = mode;
4843       rtx z = 0, c1 = NULL_RTX;
4844
4845       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
4846            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
4847            || GET_CODE (t) == ASHIFT
4848            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
4849           && rtx_equal_p (XEXP (t, 0), f))
4850         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
4851
4852       /* If an identity-zero op is commutative, check whether there
4853          would be a match if we swapped the operands.  */
4854       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
4855                 || GET_CODE (t) == XOR)
4856                && rtx_equal_p (XEXP (t, 1), f))
4857         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
4858       else if (GET_CODE (t) == SIGN_EXTEND
4859                && (GET_CODE (XEXP (t, 0)) == PLUS
4860                    || GET_CODE (XEXP (t, 0)) == MINUS
4861                    || GET_CODE (XEXP (t, 0)) == IOR
4862                    || GET_CODE (XEXP (t, 0)) == XOR
4863                    || GET_CODE (XEXP (t, 0)) == ASHIFT
4864                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4865                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4866                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4867                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4868                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4869                && (num_sign_bit_copies (f, GET_MODE (f))
4870                    > (GET_MODE_BITSIZE (mode)
4871                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
4872         {
4873           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4874           extend_op = SIGN_EXTEND;
4875           m = GET_MODE (XEXP (t, 0));
4876         }
4877       else if (GET_CODE (t) == SIGN_EXTEND
4878                && (GET_CODE (XEXP (t, 0)) == PLUS
4879                    || GET_CODE (XEXP (t, 0)) == IOR
4880                    || GET_CODE (XEXP (t, 0)) == XOR)
4881                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4882                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4883                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4884                && (num_sign_bit_copies (f, GET_MODE (f))
4885                    > (GET_MODE_BITSIZE (mode)
4886                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
4887         {
4888           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4889           extend_op = SIGN_EXTEND;
4890           m = GET_MODE (XEXP (t, 0));
4891         }
4892       else if (GET_CODE (t) == ZERO_EXTEND
4893                && (GET_CODE (XEXP (t, 0)) == PLUS
4894                    || GET_CODE (XEXP (t, 0)) == MINUS
4895                    || GET_CODE (XEXP (t, 0)) == IOR
4896                    || GET_CODE (XEXP (t, 0)) == XOR
4897                    || GET_CODE (XEXP (t, 0)) == ASHIFT
4898                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4899                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4900                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4901                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4902                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4903                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4904                && ((nonzero_bits (f, GET_MODE (f))
4905                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
4906                    == 0))
4907         {
4908           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4909           extend_op = ZERO_EXTEND;
4910           m = GET_MODE (XEXP (t, 0));
4911         }
4912       else if (GET_CODE (t) == ZERO_EXTEND
4913                && (GET_CODE (XEXP (t, 0)) == PLUS
4914                    || GET_CODE (XEXP (t, 0)) == IOR
4915                    || GET_CODE (XEXP (t, 0)) == XOR)
4916                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4917                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4918                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4919                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4920                && ((nonzero_bits (f, GET_MODE (f))
4921                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
4922                    == 0))
4923         {
4924           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4925           extend_op = ZERO_EXTEND;
4926           m = GET_MODE (XEXP (t, 0));
4927         }
4928
4929       if (z)
4930         {
4931           temp = subst (gen_binary (true_code, m, cond_op0, cond_op1),
4932                         pc_rtx, pc_rtx, 0, 0);
4933           temp = gen_binary (MULT, m, temp,
4934                              gen_binary (MULT, m, c1, const_true_rtx));
4935           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
4936           temp = gen_binary (op, m, gen_lowpart_for_combine (m, z), temp);
4937
4938           if (extend_op != NIL)
4939             temp = simplify_gen_unary (extend_op, mode, temp, m);
4940
4941           return temp;
4942         }
4943     }
4944
4945   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
4946      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
4947      negation of a single bit, we can convert this operation to a shift.  We
4948      can actually do this more generally, but it doesn't seem worth it.  */
4949
4950   if (true_code == NE && XEXP (cond, 1) == const0_rtx
4951       && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
4952       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
4953            && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
4954           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
4955                == GET_MODE_BITSIZE (mode))
4956               && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
4957     return
4958       simplify_shift_const (NULL_RTX, ASHIFT, mode,
4959                             gen_lowpart_for_combine (mode, XEXP (cond, 0)), i);
4960
4961   return x;
4962 }
4963 \f
4964 /* Simplify X, a SET expression.  Return the new expression.  */
4965
4966 static rtx
4967 simplify_set (x)
4968      rtx x;
4969 {
4970   rtx src = SET_SRC (x);
4971   rtx dest = SET_DEST (x);
4972   enum machine_mode mode
4973     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
4974   rtx other_insn;
4975   rtx *cc_use;
4976
4977   /* (set (pc) (return)) gets written as (return).  */
4978   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
4979     return src;
4980
4981   /* Now that we know for sure which bits of SRC we are using, see if we can
4982      simplify the expression for the object knowing that we only need the
4983      low-order bits.  */
4984
4985   if (GET_MODE_CLASS (mode) == MODE_INT)
4986     {
4987       src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
4988       SUBST (SET_SRC (x), src);
4989     }
4990
4991   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
4992      the comparison result and try to simplify it unless we already have used
4993      undobuf.other_insn.  */
4994   if ((GET_CODE (src) == COMPARE
4995 #ifdef HAVE_cc0
4996        || dest == cc0_rtx
4997 #endif
4998        )
4999       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
5000       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
5001       && GET_RTX_CLASS (GET_CODE (*cc_use)) == '<'
5002       && rtx_equal_p (XEXP (*cc_use, 0), dest))
5003     {
5004       enum rtx_code old_code = GET_CODE (*cc_use);
5005       enum rtx_code new_code;
5006       rtx op0, op1;
5007       int other_changed = 0;
5008       enum machine_mode compare_mode = GET_MODE (dest);
5009
5010       if (GET_CODE (src) == COMPARE)
5011         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
5012       else
5013         op0 = src, op1 = const0_rtx;
5014
5015       /* Simplify our comparison, if possible.  */
5016       new_code = simplify_comparison (old_code, &op0, &op1);
5017
5018 #ifdef EXTRA_CC_MODES
5019       /* If this machine has CC modes other than CCmode, check to see if we
5020          need to use a different CC mode here.  */
5021       compare_mode = SELECT_CC_MODE (new_code, op0, op1);
5022 #endif /* EXTRA_CC_MODES */
5023
5024 #if !defined (HAVE_cc0) && defined (EXTRA_CC_MODES)
5025       /* If the mode changed, we have to change SET_DEST, the mode in the
5026          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
5027          a hard register, just build new versions with the proper mode.  If it
5028          is a pseudo, we lose unless it is only time we set the pseudo, in
5029          which case we can safely change its mode.  */
5030       if (compare_mode != GET_MODE (dest))
5031         {
5032           unsigned int regno = REGNO (dest);
5033           rtx new_dest = gen_rtx_REG (compare_mode, regno);
5034
5035           if (regno < FIRST_PSEUDO_REGISTER
5036               || (REG_N_SETS (regno) == 1 && ! REG_USERVAR_P (dest)))
5037             {
5038               if (regno >= FIRST_PSEUDO_REGISTER)
5039                 SUBST (regno_reg_rtx[regno], new_dest);
5040
5041               SUBST (SET_DEST (x), new_dest);
5042               SUBST (XEXP (*cc_use, 0), new_dest);
5043               other_changed = 1;
5044
5045               dest = new_dest;
5046             }
5047         }
5048 #endif
5049
5050       /* If the code changed, we have to build a new comparison in
5051          undobuf.other_insn.  */
5052       if (new_code != old_code)
5053         {
5054           unsigned HOST_WIDE_INT mask;
5055
5056           SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
5057                                           dest, const0_rtx));
5058
5059           /* If the only change we made was to change an EQ into an NE or
5060              vice versa, OP0 has only one bit that might be nonzero, and OP1
5061              is zero, check if changing the user of the condition code will
5062              produce a valid insn.  If it won't, we can keep the original code
5063              in that insn by surrounding our operation with an XOR.  */
5064
5065           if (((old_code == NE && new_code == EQ)
5066                || (old_code == EQ && new_code == NE))
5067               && ! other_changed && op1 == const0_rtx
5068               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
5069               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
5070             {
5071               rtx pat = PATTERN (other_insn), note = 0;
5072
5073               if ((recog_for_combine (&pat, other_insn, &note) < 0
5074                    && ! check_asm_operands (pat)))
5075                 {
5076                   PUT_CODE (*cc_use, old_code);
5077                   other_insn = 0;
5078
5079                   op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask));
5080                 }
5081             }
5082
5083           other_changed = 1;
5084         }
5085
5086       if (other_changed)
5087         undobuf.other_insn = other_insn;
5088
5089 #ifdef HAVE_cc0
5090       /* If we are now comparing against zero, change our source if
5091          needed.  If we do not use cc0, we always have a COMPARE.  */
5092       if (op1 == const0_rtx && dest == cc0_rtx)
5093         {
5094           SUBST (SET_SRC (x), op0);
5095           src = op0;
5096         }
5097       else
5098 #endif
5099
5100       /* Otherwise, if we didn't previously have a COMPARE in the
5101          correct mode, we need one.  */
5102       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
5103         {
5104           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
5105           src = SET_SRC (x);
5106         }
5107       else
5108         {
5109           /* Otherwise, update the COMPARE if needed.  */
5110           SUBST (XEXP (src, 0), op0);
5111           SUBST (XEXP (src, 1), op1);
5112         }
5113     }
5114   else
5115     {
5116       /* Get SET_SRC in a form where we have placed back any
5117          compound expressions.  Then do the checks below.  */
5118       src = make_compound_operation (src, SET);
5119       SUBST (SET_SRC (x), src);
5120     }
5121
5122   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
5123      and X being a REG or (subreg (reg)), we may be able to convert this to
5124      (set (subreg:m2 x) (op)).
5125
5126      We can always do this if M1 is narrower than M2 because that means that
5127      we only care about the low bits of the result.
5128
5129      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
5130      perform a narrower operation than requested since the high-order bits will
5131      be undefined.  On machine where it is defined, this transformation is safe
5132      as long as M1 and M2 have the same number of words.  */
5133
5134   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5135       && GET_RTX_CLASS (GET_CODE (SUBREG_REG (src))) != 'o'
5136       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
5137            / UNITS_PER_WORD)
5138           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5139                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
5140 #ifndef WORD_REGISTER_OPERATIONS
5141       && (GET_MODE_SIZE (GET_MODE (src))
5142           < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5143 #endif
5144 #ifdef CLASS_CANNOT_CHANGE_MODE
5145       && ! (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER
5146             && (TEST_HARD_REG_BIT
5147                 (reg_class_contents[(int) CLASS_CANNOT_CHANGE_MODE],
5148                  REGNO (dest)))
5149             && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (src),
5150                                            GET_MODE (SUBREG_REG (src))))
5151 #endif
5152       && (GET_CODE (dest) == REG
5153           || (GET_CODE (dest) == SUBREG
5154               && GET_CODE (SUBREG_REG (dest)) == REG)))
5155     {
5156       SUBST (SET_DEST (x),
5157              gen_lowpart_for_combine (GET_MODE (SUBREG_REG (src)),
5158                                       dest));
5159       SUBST (SET_SRC (x), SUBREG_REG (src));
5160
5161       src = SET_SRC (x), dest = SET_DEST (x);
5162     }
5163
5164 #ifdef HAVE_cc0
5165   /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
5166      in SRC.  */
5167   if (dest == cc0_rtx
5168       && GET_CODE (src) == SUBREG
5169       && subreg_lowpart_p (src)
5170       && (GET_MODE_BITSIZE (GET_MODE (src))
5171           < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
5172     {
5173       rtx inner = SUBREG_REG (src);
5174       enum machine_mode inner_mode = GET_MODE (inner);
5175
5176       /* Here we make sure that we don't have a sign bit on.  */
5177       if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
5178           && (nonzero_bits (inner, inner_mode)
5179               < ((unsigned HOST_WIDE_INT) 1
5180                  << (GET_MODE_BITSIZE (inner_mode) - 1))))
5181         {
5182           SUBST (SET_SRC (x), inner);
5183           src = SET_SRC (x);
5184         }
5185     }
5186 #endif
5187
5188 #ifdef LOAD_EXTEND_OP
5189   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
5190      would require a paradoxical subreg.  Replace the subreg with a
5191      zero_extend to avoid the reload that would otherwise be required.  */
5192
5193   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5194       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != NIL
5195       && SUBREG_BYTE (src) == 0
5196       && (GET_MODE_SIZE (GET_MODE (src))
5197           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5198       && GET_CODE (SUBREG_REG (src)) == MEM)
5199     {
5200       SUBST (SET_SRC (x),
5201              gen_rtx (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
5202                       GET_MODE (src), SUBREG_REG (src)));
5203
5204       src = SET_SRC (x);
5205     }
5206 #endif
5207
5208   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
5209      are comparing an item known to be 0 or -1 against 0, use a logical
5210      operation instead. Check for one of the arms being an IOR of the other
5211      arm with some value.  We compute three terms to be IOR'ed together.  In
5212      practice, at most two will be nonzero.  Then we do the IOR's.  */
5213
5214   if (GET_CODE (dest) != PC
5215       && GET_CODE (src) == IF_THEN_ELSE
5216       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
5217       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
5218       && XEXP (XEXP (src, 0), 1) == const0_rtx
5219       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
5220 #ifdef HAVE_conditional_move
5221       && ! can_conditionally_move_p (GET_MODE (src))
5222 #endif
5223       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
5224                                GET_MODE (XEXP (XEXP (src, 0), 0)))
5225           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
5226       && ! side_effects_p (src))
5227     {
5228       rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
5229                       ? XEXP (src, 1) : XEXP (src, 2));
5230       rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
5231                    ? XEXP (src, 2) : XEXP (src, 1));
5232       rtx term1 = const0_rtx, term2, term3;
5233
5234       if (GET_CODE (true_rtx) == IOR
5235           && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
5236         term1 = false_rtx, true_rtx = XEXP(true_rtx, 1), false_rtx = const0_rtx;
5237       else if (GET_CODE (true_rtx) == IOR
5238                && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
5239         term1 = false_rtx, true_rtx = XEXP(true_rtx, 0), false_rtx = const0_rtx;
5240       else if (GET_CODE (false_rtx) == IOR
5241                && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
5242         term1 = true_rtx, false_rtx = XEXP(false_rtx, 1), true_rtx = const0_rtx;
5243       else if (GET_CODE (false_rtx) == IOR
5244                && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
5245         term1 = true_rtx, false_rtx = XEXP(false_rtx, 0), true_rtx = const0_rtx;
5246
5247       term2 = gen_binary (AND, GET_MODE (src),
5248                           XEXP (XEXP (src, 0), 0), true_rtx);
5249       term3 = gen_binary (AND, GET_MODE (src),
5250                           simplify_gen_unary (NOT, GET_MODE (src),
5251                                               XEXP (XEXP (src, 0), 0),
5252                                               GET_MODE (src)),
5253                           false_rtx);
5254
5255       SUBST (SET_SRC (x),
5256              gen_binary (IOR, GET_MODE (src),
5257                          gen_binary (IOR, GET_MODE (src), term1, term2),
5258                          term3));
5259
5260       src = SET_SRC (x);
5261     }
5262
5263   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
5264      whole thing fail.  */
5265   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
5266     return src;
5267   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
5268     return dest;
5269   else
5270     /* Convert this into a field assignment operation, if possible.  */
5271     return make_field_assignment (x);
5272 }
5273 \f
5274 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
5275    result.  LAST is nonzero if this is the last retry.  */
5276
5277 static rtx
5278 simplify_logical (x, last)
5279      rtx x;
5280      int last;
5281 {
5282   enum machine_mode mode = GET_MODE (x);
5283   rtx op0 = XEXP (x, 0);
5284   rtx op1 = XEXP (x, 1);
5285   rtx reversed;
5286
5287   switch (GET_CODE (x))
5288     {
5289     case AND:
5290       /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
5291          insn (and may simplify more).  */
5292       if (GET_CODE (op0) == XOR
5293           && rtx_equal_p (XEXP (op0, 0), op1)
5294           && ! side_effects_p (op1))
5295         x = gen_binary (AND, mode,
5296                         simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
5297                         op1);
5298
5299       if (GET_CODE (op0) == XOR
5300           && rtx_equal_p (XEXP (op0, 1), op1)
5301           && ! side_effects_p (op1))
5302         x = gen_binary (AND, mode,
5303                         simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
5304                         op1);
5305
5306       /* Similarly for (~(A ^ B)) & A.  */
5307       if (GET_CODE (op0) == NOT
5308           && GET_CODE (XEXP (op0, 0)) == XOR
5309           && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
5310           && ! side_effects_p (op1))
5311         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
5312
5313       if (GET_CODE (op0) == NOT
5314           && GET_CODE (XEXP (op0, 0)) == XOR
5315           && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
5316           && ! side_effects_p (op1))
5317         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
5318
5319       /* We can call simplify_and_const_int only if we don't lose
5320          any (sign) bits when converting INTVAL (op1) to
5321          "unsigned HOST_WIDE_INT".  */
5322       if (GET_CODE (op1) == CONST_INT
5323           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5324               || INTVAL (op1) > 0))
5325         {
5326           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
5327
5328           /* If we have (ior (and (X C1) C2)) and the next restart would be
5329              the last, simplify this by making C1 as small as possible
5330              and then exit.  */
5331           if (last
5332               && GET_CODE (x) == IOR && GET_CODE (op0) == AND
5333               && GET_CODE (XEXP (op0, 1)) == CONST_INT
5334               && GET_CODE (op1) == CONST_INT)
5335             return gen_binary (IOR, mode,
5336                                gen_binary (AND, mode, XEXP (op0, 0),
5337                                            GEN_INT (INTVAL (XEXP (op0, 1))
5338                                                     & ~INTVAL (op1))), op1);
5339
5340           if (GET_CODE (x) != AND)
5341             return x;
5342
5343           if (GET_RTX_CLASS (GET_CODE (x)) == 'c'
5344               || GET_RTX_CLASS (GET_CODE (x)) == '2')
5345             op0 = XEXP (x, 0), op1 = XEXP (x, 1);
5346         }
5347
5348       /* Convert (A | B) & A to A.  */
5349       if (GET_CODE (op0) == IOR
5350           && (rtx_equal_p (XEXP (op0, 0), op1)
5351               || rtx_equal_p (XEXP (op0, 1), op1))
5352           && ! side_effects_p (XEXP (op0, 0))
5353           && ! side_effects_p (XEXP (op0, 1)))
5354         return op1;
5355
5356       /* In the following group of tests (and those in case IOR below),
5357          we start with some combination of logical operations and apply
5358          the distributive law followed by the inverse distributive law.
5359          Most of the time, this results in no change.  However, if some of
5360          the operands are the same or inverses of each other, simplifications
5361          will result.
5362
5363          For example, (and (ior A B) (not B)) can occur as the result of
5364          expanding a bit field assignment.  When we apply the distributive
5365          law to this, we get (ior (and (A (not B))) (and (B (not B)))),
5366          which then simplifies to (and (A (not B))).
5367
5368          If we have (and (ior A B) C), apply the distributive law and then
5369          the inverse distributive law to see if things simplify.  */
5370
5371       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
5372         {
5373           x = apply_distributive_law
5374             (gen_binary (GET_CODE (op0), mode,
5375                          gen_binary (AND, mode, XEXP (op0, 0), op1),
5376                          gen_binary (AND, mode, XEXP (op0, 1),
5377                                      copy_rtx (op1))));
5378           if (GET_CODE (x) != AND)
5379             return x;
5380         }
5381
5382       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
5383         return apply_distributive_law
5384           (gen_binary (GET_CODE (op1), mode,
5385                        gen_binary (AND, mode, XEXP (op1, 0), op0),
5386                        gen_binary (AND, mode, XEXP (op1, 1),
5387                                    copy_rtx (op0))));
5388
5389       /* Similarly, taking advantage of the fact that
5390          (and (not A) (xor B C)) == (xor (ior A B) (ior A C))  */
5391
5392       if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR)
5393         return apply_distributive_law
5394           (gen_binary (XOR, mode,
5395                        gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)),
5396                        gen_binary (IOR, mode, copy_rtx (XEXP (op0, 0)),
5397                                    XEXP (op1, 1))));
5398
5399       else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR)
5400         return apply_distributive_law
5401           (gen_binary (XOR, mode,
5402                        gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)),
5403                        gen_binary (IOR, mode, copy_rtx (XEXP (op1, 0)), XEXP (op0, 1))));
5404       break;
5405
5406     case IOR:
5407       /* (ior A C) is C if all bits of A that might be nonzero are on in C.  */
5408       if (GET_CODE (op1) == CONST_INT
5409           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5410           && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
5411         return op1;
5412
5413       /* Convert (A & B) | A to A.  */
5414       if (GET_CODE (op0) == AND
5415           && (rtx_equal_p (XEXP (op0, 0), op1)
5416               || rtx_equal_p (XEXP (op0, 1), op1))
5417           && ! side_effects_p (XEXP (op0, 0))
5418           && ! side_effects_p (XEXP (op0, 1)))
5419         return op1;
5420
5421       /* If we have (ior (and A B) C), apply the distributive law and then
5422          the inverse distributive law to see if things simplify.  */
5423
5424       if (GET_CODE (op0) == AND)
5425         {
5426           x = apply_distributive_law
5427             (gen_binary (AND, mode,
5428                          gen_binary (IOR, mode, XEXP (op0, 0), op1),
5429                          gen_binary (IOR, mode, XEXP (op0, 1),
5430                                      copy_rtx (op1))));
5431
5432           if (GET_CODE (x) != IOR)
5433             return x;
5434         }
5435
5436       if (GET_CODE (op1) == AND)
5437         {
5438           x = apply_distributive_law
5439             (gen_binary (AND, mode,
5440                          gen_binary (IOR, mode, XEXP (op1, 0), op0),
5441                          gen_binary (IOR, mode, XEXP (op1, 1),
5442                                      copy_rtx (op0))));
5443
5444           if (GET_CODE (x) != IOR)
5445             return x;
5446         }
5447
5448       /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
5449          mode size to (rotate A CX).  */
5450
5451       if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT)
5452            || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT))
5453           && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
5454           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5455           && GET_CODE (XEXP (op1, 1)) == CONST_INT
5456           && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
5457               == GET_MODE_BITSIZE (mode)))
5458         return gen_rtx_ROTATE (mode, XEXP (op0, 0),
5459                                (GET_CODE (op0) == ASHIFT
5460                                 ? XEXP (op0, 1) : XEXP (op1, 1)));
5461
5462       /* If OP0 is (ashiftrt (plus ...) C), it might actually be
5463          a (sign_extend (plus ...)).  If so, OP1 is a CONST_INT, and the PLUS
5464          does not affect any of the bits in OP1, it can really be done
5465          as a PLUS and we can associate.  We do this by seeing if OP1
5466          can be safely shifted left C bits.  */
5467       if (GET_CODE (op1) == CONST_INT && GET_CODE (op0) == ASHIFTRT
5468           && GET_CODE (XEXP (op0, 0)) == PLUS
5469           && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
5470           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5471           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT)
5472         {
5473           int count = INTVAL (XEXP (op0, 1));
5474           HOST_WIDE_INT mask = INTVAL (op1) << count;
5475
5476           if (mask >> count == INTVAL (op1)
5477               && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0)
5478             {
5479               SUBST (XEXP (XEXP (op0, 0), 1),
5480                      GEN_INT (INTVAL (XEXP (XEXP (op0, 0), 1)) | mask));
5481               return op0;
5482             }
5483         }
5484       break;
5485
5486     case XOR:
5487       /* If we are XORing two things that have no bits in common,
5488          convert them into an IOR.  This helps to detect rotation encoded
5489          using those methods and possibly other simplifications.  */
5490
5491       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5492           && (nonzero_bits (op0, mode)
5493               & nonzero_bits (op1, mode)) == 0)
5494         return (gen_binary (IOR, mode, op0, op1));
5495
5496       /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
5497          Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
5498          (NOT y).  */
5499       {
5500         int num_negated = 0;
5501
5502         if (GET_CODE (op0) == NOT)
5503           num_negated++, op0 = XEXP (op0, 0);
5504         if (GET_CODE (op1) == NOT)
5505           num_negated++, op1 = XEXP (op1, 0);
5506
5507         if (num_negated == 2)
5508           {
5509             SUBST (XEXP (x, 0), op0);
5510             SUBST (XEXP (x, 1), op1);
5511           }
5512         else if (num_negated == 1)
5513           return
5514             simplify_gen_unary (NOT, mode, gen_binary (XOR, mode, op0, op1),
5515                                 mode);
5516       }
5517
5518       /* Convert (xor (and A B) B) to (and (not A) B).  The latter may
5519          correspond to a machine insn or result in further simplifications
5520          if B is a constant.  */
5521
5522       if (GET_CODE (op0) == AND
5523           && rtx_equal_p (XEXP (op0, 1), op1)
5524           && ! side_effects_p (op1))
5525         return gen_binary (AND, mode,
5526                            simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
5527                            op1);
5528
5529       else if (GET_CODE (op0) == AND
5530                && rtx_equal_p (XEXP (op0, 0), op1)
5531                && ! side_effects_p (op1))
5532         return gen_binary (AND, mode,
5533                            simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
5534                            op1);
5535
5536       /* (xor (comparison foo bar) (const_int 1)) can become the reversed
5537          comparison if STORE_FLAG_VALUE is 1.  */
5538       if (STORE_FLAG_VALUE == 1
5539           && op1 == const1_rtx
5540           && GET_RTX_CLASS (GET_CODE (op0)) == '<'
5541           && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5542                                               XEXP (op0, 1))))
5543         return reversed;
5544
5545       /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
5546          is (lt foo (const_int 0)), so we can perform the above
5547          simplification if STORE_FLAG_VALUE is 1.  */
5548
5549       if (STORE_FLAG_VALUE == 1
5550           && op1 == const1_rtx
5551           && GET_CODE (op0) == LSHIFTRT
5552           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5553           && INTVAL (XEXP (op0, 1)) == GET_MODE_BITSIZE (mode) - 1)
5554         return gen_rtx_GE (mode, XEXP (op0, 0), const0_rtx);
5555
5556       /* (xor (comparison foo bar) (const_int sign-bit))
5557          when STORE_FLAG_VALUE is the sign bit.  */
5558       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5559           && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5560               == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5561           && op1 == const_true_rtx
5562           && GET_RTX_CLASS (GET_CODE (op0)) == '<'
5563           && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5564                                               XEXP (op0, 1))))
5565         return reversed;
5566
5567       break;
5568
5569     default:
5570       abort ();
5571     }
5572
5573   return x;
5574 }
5575 \f
5576 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
5577    operations" because they can be replaced with two more basic operations.
5578    ZERO_EXTEND is also considered "compound" because it can be replaced with
5579    an AND operation, which is simpler, though only one operation.
5580
5581    The function expand_compound_operation is called with an rtx expression
5582    and will convert it to the appropriate shifts and AND operations,
5583    simplifying at each stage.
5584
5585    The function make_compound_operation is called to convert an expression
5586    consisting of shifts and ANDs into the equivalent compound expression.
5587    It is the inverse of this function, loosely speaking.  */
5588
5589 static rtx
5590 expand_compound_operation (x)
5591      rtx x;
5592 {
5593   unsigned HOST_WIDE_INT pos = 0, len;
5594   int unsignedp = 0;
5595   unsigned int modewidth;
5596   rtx tem;
5597
5598   switch (GET_CODE (x))
5599     {
5600     case ZERO_EXTEND:
5601       unsignedp = 1;
5602     case SIGN_EXTEND:
5603       /* We can't necessarily use a const_int for a multiword mode;
5604          it depends on implicitly extending the value.
5605          Since we don't know the right way to extend it,
5606          we can't tell whether the implicit way is right.
5607
5608          Even for a mode that is no wider than a const_int,
5609          we can't win, because we need to sign extend one of its bits through
5610          the rest of it, and we don't know which bit.  */
5611       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
5612         return x;
5613
5614       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
5615          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
5616          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
5617          reloaded. If not for that, MEM's would very rarely be safe.
5618
5619          Reject MODEs bigger than a word, because we might not be able
5620          to reference a two-register group starting with an arbitrary register
5621          (and currently gen_lowpart might crash for a SUBREG).  */
5622
5623       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
5624         return x;
5625
5626       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
5627       /* If the inner object has VOIDmode (the only way this can happen
5628          is if it is an ASM_OPERANDS), we can't do anything since we don't
5629          know how much masking to do.  */
5630       if (len == 0)
5631         return x;
5632
5633       break;
5634
5635     case ZERO_EXTRACT:
5636       unsignedp = 1;
5637     case SIGN_EXTRACT:
5638       /* If the operand is a CLOBBER, just return it.  */
5639       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
5640         return XEXP (x, 0);
5641
5642       if (GET_CODE (XEXP (x, 1)) != CONST_INT
5643           || GET_CODE (XEXP (x, 2)) != CONST_INT
5644           || GET_MODE (XEXP (x, 0)) == VOIDmode)
5645         return x;
5646
5647       len = INTVAL (XEXP (x, 1));
5648       pos = INTVAL (XEXP (x, 2));
5649
5650       /* If this goes outside the object being extracted, replace the object
5651          with a (use (mem ...)) construct that only combine understands
5652          and is used only for this purpose.  */
5653       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
5654         SUBST (XEXP (x, 0), gen_rtx_USE (GET_MODE (x), XEXP (x, 0)));
5655
5656       if (BITS_BIG_ENDIAN)
5657         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
5658
5659       break;
5660
5661     default:
5662       return x;
5663     }
5664   /* Convert sign extension to zero extension, if we know that the high
5665      bit is not set, as this is easier to optimize.  It will be converted
5666      back to cheaper alternative in make_extraction.  */
5667   if (GET_CODE (x) == SIGN_EXTEND
5668       && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5669           && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
5670                 & ~(((unsigned HOST_WIDE_INT)
5671                       GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
5672                      >> 1))
5673                == 0)))
5674     {
5675       rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
5676       return expand_compound_operation (temp);
5677     }
5678
5679   /* We can optimize some special cases of ZERO_EXTEND.  */
5680   if (GET_CODE (x) == ZERO_EXTEND)
5681     {
5682       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
5683          know that the last value didn't have any inappropriate bits
5684          set.  */
5685       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5686           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5687           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5688           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
5689               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5690         return XEXP (XEXP (x, 0), 0);
5691
5692       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5693       if (GET_CODE (XEXP (x, 0)) == SUBREG
5694           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5695           && subreg_lowpart_p (XEXP (x, 0))
5696           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5697           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
5698               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5699         return SUBREG_REG (XEXP (x, 0));
5700
5701       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
5702          is a comparison and STORE_FLAG_VALUE permits.  This is like
5703          the first case, but it works even when GET_MODE (x) is larger
5704          than HOST_WIDE_INT.  */
5705       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5706           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5707           && GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) == '<'
5708           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5709               <= HOST_BITS_PER_WIDE_INT)
5710           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5711               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5712         return XEXP (XEXP (x, 0), 0);
5713
5714       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5715       if (GET_CODE (XEXP (x, 0)) == SUBREG
5716           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5717           && subreg_lowpart_p (XEXP (x, 0))
5718           && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == '<'
5719           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5720               <= HOST_BITS_PER_WIDE_INT)
5721           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5722               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5723         return SUBREG_REG (XEXP (x, 0));
5724
5725     }
5726
5727   /* If we reach here, we want to return a pair of shifts.  The inner
5728      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
5729      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
5730      logical depending on the value of UNSIGNEDP.
5731
5732      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
5733      converted into an AND of a shift.
5734
5735      We must check for the case where the left shift would have a negative
5736      count.  This can happen in a case like (x >> 31) & 255 on machines
5737      that can't shift by a constant.  On those machines, we would first
5738      combine the shift with the AND to produce a variable-position
5739      extraction.  Then the constant of 31 would be substituted in to produce
5740      a such a position.  */
5741
5742   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
5743   if (modewidth + len >= pos)
5744     tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
5745                                 GET_MODE (x),
5746                                 simplify_shift_const (NULL_RTX, ASHIFT,
5747                                                       GET_MODE (x),
5748                                                       XEXP (x, 0),
5749                                                       modewidth - pos - len),
5750                                 modewidth - len);
5751
5752   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
5753     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
5754                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
5755                                                         GET_MODE (x),
5756                                                         XEXP (x, 0), pos),
5757                                   ((HOST_WIDE_INT) 1 << len) - 1);
5758   else
5759     /* Any other cases we can't handle.  */
5760     return x;
5761
5762   /* If we couldn't do this for some reason, return the original
5763      expression.  */
5764   if (GET_CODE (tem) == CLOBBER)
5765     return x;
5766
5767   return tem;
5768 }
5769 \f
5770 /* X is a SET which contains an assignment of one object into
5771    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
5772    or certain SUBREGS). If possible, convert it into a series of
5773    logical operations.
5774
5775    We half-heartedly support variable positions, but do not at all
5776    support variable lengths.  */
5777
5778 static rtx
5779 expand_field_assignment (x)
5780      rtx x;
5781 {
5782   rtx inner;
5783   rtx pos;                      /* Always counts from low bit.  */
5784   int len;
5785   rtx mask;
5786   enum machine_mode compute_mode;
5787
5788   /* Loop until we find something we can't simplify.  */
5789   while (1)
5790     {
5791       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
5792           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
5793         {
5794           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
5795           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
5796           pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
5797         }
5798       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
5799                && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
5800         {
5801           inner = XEXP (SET_DEST (x), 0);
5802           len = INTVAL (XEXP (SET_DEST (x), 1));
5803           pos = XEXP (SET_DEST (x), 2);
5804
5805           /* If the position is constant and spans the width of INNER,
5806              surround INNER  with a USE to indicate this.  */
5807           if (GET_CODE (pos) == CONST_INT
5808               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
5809             inner = gen_rtx_USE (GET_MODE (SET_DEST (x)), inner);
5810
5811           if (BITS_BIG_ENDIAN)
5812             {
5813               if (GET_CODE (pos) == CONST_INT)
5814                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
5815                                - INTVAL (pos));
5816               else if (GET_CODE (pos) == MINUS
5817                        && GET_CODE (XEXP (pos, 1)) == CONST_INT
5818                        && (INTVAL (XEXP (pos, 1))
5819                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
5820                 /* If position is ADJUST - X, new position is X.  */
5821                 pos = XEXP (pos, 0);
5822               else
5823                 pos = gen_binary (MINUS, GET_MODE (pos),
5824                                   GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
5825                                            - len),
5826                                   pos);
5827             }
5828         }
5829
5830       /* A SUBREG between two modes that occupy the same numbers of words
5831          can be done by moving the SUBREG to the source.  */
5832       else if (GET_CODE (SET_DEST (x)) == SUBREG
5833                /* We need SUBREGs to compute nonzero_bits properly.  */
5834                && nonzero_sign_valid
5835                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
5836                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
5837                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
5838                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
5839         {
5840           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
5841                            gen_lowpart_for_combine
5842                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
5843                             SET_SRC (x)));
5844           continue;
5845         }
5846       else
5847         break;
5848
5849       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
5850         inner = SUBREG_REG (inner);
5851
5852       compute_mode = GET_MODE (inner);
5853
5854       /* Don't attempt bitwise arithmetic on non-integral modes.  */
5855       if (! INTEGRAL_MODE_P (compute_mode))
5856         {
5857           enum machine_mode imode;
5858
5859           /* Something is probably seriously wrong if this matches.  */
5860           if (! FLOAT_MODE_P (compute_mode))
5861             break;
5862
5863           /* Try to find an integral mode to pun with.  */
5864           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
5865           if (imode == BLKmode)
5866             break;
5867
5868           compute_mode = imode;
5869           inner = gen_lowpart_for_combine (imode, inner);
5870         }
5871
5872       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
5873       if (len < HOST_BITS_PER_WIDE_INT)
5874         mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
5875       else
5876         break;
5877
5878       /* Now compute the equivalent expression.  Make a copy of INNER
5879          for the SET_DEST in case it is a MEM into which we will substitute;
5880          we don't want shared RTL in that case.  */
5881       x = gen_rtx_SET
5882         (VOIDmode, copy_rtx (inner),
5883          gen_binary (IOR, compute_mode,
5884                      gen_binary (AND, compute_mode,
5885                                  simplify_gen_unary (NOT, compute_mode,
5886                                                      gen_binary (ASHIFT,
5887                                                                  compute_mode,
5888                                                                  mask, pos),
5889                                                      compute_mode),
5890                                  inner),
5891                      gen_binary (ASHIFT, compute_mode,
5892                                  gen_binary (AND, compute_mode,
5893                                              gen_lowpart_for_combine
5894                                              (compute_mode, SET_SRC (x)),
5895                                              mask),
5896                                  pos)));
5897     }
5898
5899   return x;
5900 }
5901 \f
5902 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
5903    it is an RTX that represents a variable starting position; otherwise,
5904    POS is the (constant) starting bit position (counted from the LSB).
5905
5906    INNER may be a USE.  This will occur when we started with a bitfield
5907    that went outside the boundary of the object in memory, which is
5908    allowed on most machines.  To isolate this case, we produce a USE
5909    whose mode is wide enough and surround the MEM with it.  The only
5910    code that understands the USE is this routine.  If it is not removed,
5911    it will cause the resulting insn not to match.
5912
5913    UNSIGNEDP is non-zero for an unsigned reference and zero for a
5914    signed reference.
5915
5916    IN_DEST is non-zero if this is a reference in the destination of a
5917    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If non-zero,
5918    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
5919    be used.
5920
5921    IN_COMPARE is non-zero if we are in a COMPARE.  This means that a
5922    ZERO_EXTRACT should be built even for bits starting at bit 0.
5923
5924    MODE is the desired mode of the result (if IN_DEST == 0).
5925
5926    The result is an RTX for the extraction or NULL_RTX if the target
5927    can't handle it.  */
5928
5929 static rtx
5930 make_extraction (mode, inner, pos, pos_rtx, len,
5931                  unsignedp, in_dest, in_compare)
5932      enum machine_mode mode;
5933      rtx inner;
5934      HOST_WIDE_INT pos;
5935      rtx pos_rtx;
5936      unsigned HOST_WIDE_INT len;
5937      int unsignedp;
5938      int in_dest, in_compare;
5939 {
5940   /* This mode describes the size of the storage area
5941      to fetch the overall value from.  Within that, we
5942      ignore the POS lowest bits, etc.  */
5943   enum machine_mode is_mode = GET_MODE (inner);
5944   enum machine_mode inner_mode;
5945   enum machine_mode wanted_inner_mode = byte_mode;
5946   enum machine_mode wanted_inner_reg_mode = word_mode;
5947   enum machine_mode pos_mode = word_mode;
5948   enum machine_mode extraction_mode = word_mode;
5949   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
5950   int spans_byte = 0;
5951   rtx new = 0;
5952   rtx orig_pos_rtx = pos_rtx;
5953   HOST_WIDE_INT orig_pos;
5954
5955   /* Get some information about INNER and get the innermost object.  */
5956   if (GET_CODE (inner) == USE)
5957     /* (use:SI (mem:QI foo)) stands for (mem:SI foo).  */
5958     /* We don't need to adjust the position because we set up the USE
5959        to pretend that it was a full-word object.  */
5960     spans_byte = 1, inner = XEXP (inner, 0);
5961   else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
5962     {
5963       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
5964          consider just the QI as the memory to extract from.
5965          The subreg adds or removes high bits; its mode is
5966          irrelevant to the meaning of this extraction,
5967          since POS and LEN count from the lsb.  */
5968       if (GET_CODE (SUBREG_REG (inner)) == MEM)
5969         is_mode = GET_MODE (SUBREG_REG (inner));
5970       inner = SUBREG_REG (inner);
5971     }
5972
5973   inner_mode = GET_MODE (inner);
5974
5975   if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
5976     pos = INTVAL (pos_rtx), pos_rtx = 0;
5977
5978   /* See if this can be done without an extraction.  We never can if the
5979      width of the field is not the same as that of some integer mode. For
5980      registers, we can only avoid the extraction if the position is at the
5981      low-order bit and this is either not in the destination or we have the
5982      appropriate STRICT_LOW_PART operation available.
5983
5984      For MEM, we can avoid an extract if the field starts on an appropriate
5985      boundary and we can change the mode of the memory reference.  However,
5986      we cannot directly access the MEM if we have a USE and the underlying
5987      MEM is not TMODE.  This combination means that MEM was being used in a
5988      context where bits outside its mode were being referenced; that is only
5989      valid in bit-field insns.  */
5990
5991   if (tmode != BLKmode
5992       && ! (spans_byte && inner_mode != tmode)
5993       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
5994            && GET_CODE (inner) != MEM
5995            && (! in_dest
5996                || (GET_CODE (inner) == REG
5997                    && have_insn_for (STRICT_LOW_PART, tmode))))
5998           || (GET_CODE (inner) == MEM && pos_rtx == 0
5999               && (pos
6000                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
6001                      : BITS_PER_UNIT)) == 0
6002               /* We can't do this if we are widening INNER_MODE (it
6003                  may not be aligned, for one thing).  */
6004               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
6005               && (inner_mode == tmode
6006                   || (! mode_dependent_address_p (XEXP (inner, 0))
6007                       && ! MEM_VOLATILE_P (inner))))))
6008     {
6009       /* If INNER is a MEM, make a new MEM that encompasses just the desired
6010          field.  If the original and current mode are the same, we need not
6011          adjust the offset.  Otherwise, we do if bytes big endian.
6012
6013          If INNER is not a MEM, get a piece consisting of just the field
6014          of interest (in this case POS % BITS_PER_WORD must be 0).  */
6015
6016       if (GET_CODE (inner) == MEM)
6017         {
6018           HOST_WIDE_INT offset;
6019
6020           /* POS counts from lsb, but make OFFSET count in memory order.  */
6021           if (BYTES_BIG_ENDIAN)
6022             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
6023           else
6024             offset = pos / BITS_PER_UNIT;
6025
6026           new = adjust_address_nv (inner, tmode, offset);
6027         }
6028       else if (GET_CODE (inner) == REG)
6029         {
6030           /* We can't call gen_lowpart_for_combine here since we always want
6031              a SUBREG and it would sometimes return a new hard register.  */
6032           if (tmode != inner_mode)
6033             {
6034               HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
6035
6036               if (WORDS_BIG_ENDIAN
6037                   && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
6038                 final_word = ((GET_MODE_SIZE (inner_mode)
6039                                - GET_MODE_SIZE (tmode))
6040                               / UNITS_PER_WORD) - final_word;
6041
6042               final_word *= UNITS_PER_WORD;
6043               if (BYTES_BIG_ENDIAN &&
6044                   GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
6045                 final_word += (GET_MODE_SIZE (inner_mode)
6046                                - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
6047
6048               new = gen_rtx_SUBREG (tmode, inner, final_word);
6049             }
6050           else
6051             new = inner;
6052         }
6053       else
6054         new = force_to_mode (inner, tmode,
6055                              len >= HOST_BITS_PER_WIDE_INT
6056                              ? ~(unsigned HOST_WIDE_INT) 0
6057                              : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
6058                              NULL_RTX, 0);
6059
6060       /* If this extraction is going into the destination of a SET,
6061          make a STRICT_LOW_PART unless we made a MEM.  */
6062
6063       if (in_dest)
6064         return (GET_CODE (new) == MEM ? new
6065                 : (GET_CODE (new) != SUBREG
6066                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
6067                    : gen_rtx_STRICT_LOW_PART (VOIDmode, new)));
6068
6069       if (mode == tmode)
6070         return new;
6071
6072       if (GET_CODE (new) == CONST_INT)
6073         return gen_int_mode (INTVAL (new), mode);
6074
6075       /* If we know that no extraneous bits are set, and that the high
6076          bit is not set, convert the extraction to the cheaper of
6077          sign and zero extension, that are equivalent in these cases.  */
6078       if (flag_expensive_optimizations
6079           && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
6080               && ((nonzero_bits (new, tmode)
6081                    & ~(((unsigned HOST_WIDE_INT)
6082                         GET_MODE_MASK (tmode))
6083                        >> 1))
6084                   == 0)))
6085         {
6086           rtx temp = gen_rtx_ZERO_EXTEND (mode, new);
6087           rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new);
6088
6089           /* Prefer ZERO_EXTENSION, since it gives more information to
6090              backends.  */
6091           if (rtx_cost (temp, SET) <= rtx_cost (temp1, SET))
6092             return temp;
6093           return temp1;
6094         }
6095
6096       /* Otherwise, sign- or zero-extend unless we already are in the
6097          proper mode.  */
6098
6099       return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6100                              mode, new));
6101     }
6102
6103   /* Unless this is a COMPARE or we have a funny memory reference,
6104      don't do anything with zero-extending field extracts starting at
6105      the low-order bit since they are simple AND operations.  */
6106   if (pos_rtx == 0 && pos == 0 && ! in_dest
6107       && ! in_compare && ! spans_byte && unsignedp)
6108     return 0;
6109
6110   /* Unless we are allowed to span bytes or INNER is not MEM, reject this if
6111      we would be spanning bytes or if the position is not a constant and the
6112      length is not 1.  In all other cases, we would only be going outside
6113      our object in cases when an original shift would have been
6114      undefined.  */
6115   if (! spans_byte && GET_CODE (inner) == MEM
6116       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6117           || (pos_rtx != 0 && len != 1)))
6118     return 0;
6119
6120   /* Get the mode to use should INNER not be a MEM, the mode for the position,
6121      and the mode for the result.  */
6122   if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
6123     {
6124       wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6125       pos_mode = mode_for_extraction (EP_insv, 2);
6126       extraction_mode = mode_for_extraction (EP_insv, 3);
6127     }
6128
6129   if (! in_dest && unsignedp
6130       && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
6131     {
6132       wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6133       pos_mode = mode_for_extraction (EP_extzv, 3);
6134       extraction_mode = mode_for_extraction (EP_extzv, 0);
6135     }
6136
6137   if (! in_dest && ! unsignedp
6138       && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
6139     {
6140       wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6141       pos_mode = mode_for_extraction (EP_extv, 3);
6142       extraction_mode = mode_for_extraction (EP_extv, 0);
6143     }
6144
6145   /* Never narrow an object, since that might not be safe.  */
6146
6147   if (mode != VOIDmode
6148       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6149     extraction_mode = mode;
6150
6151   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6152       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6153     pos_mode = GET_MODE (pos_rtx);
6154
6155   /* If this is not from memory, the desired mode is wanted_inner_reg_mode;
6156      if we have to change the mode of memory and cannot, the desired mode is
6157      EXTRACTION_MODE.  */
6158   if (GET_CODE (inner) != MEM)
6159     wanted_inner_mode = wanted_inner_reg_mode;
6160   else if (inner_mode != wanted_inner_mode
6161            && (mode_dependent_address_p (XEXP (inner, 0))
6162                || MEM_VOLATILE_P (inner)))
6163     wanted_inner_mode = extraction_mode;
6164
6165   orig_pos = pos;
6166
6167   if (BITS_BIG_ENDIAN)
6168     {
6169       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6170          BITS_BIG_ENDIAN style.  If position is constant, compute new
6171          position.  Otherwise, build subtraction.
6172          Note that POS is relative to the mode of the original argument.
6173          If it's a MEM we need to recompute POS relative to that.
6174          However, if we're extracting from (or inserting into) a register,
6175          we want to recompute POS relative to wanted_inner_mode.  */
6176       int width = (GET_CODE (inner) == MEM
6177                    ? GET_MODE_BITSIZE (is_mode)
6178                    : GET_MODE_BITSIZE (wanted_inner_mode));
6179
6180       if (pos_rtx == 0)
6181         pos = width - len - pos;
6182       else
6183         pos_rtx
6184           = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
6185       /* POS may be less than 0 now, but we check for that below.
6186          Note that it can only be less than 0 if GET_CODE (inner) != MEM.  */
6187     }
6188
6189   /* If INNER has a wider mode, make it smaller.  If this is a constant
6190      extract, try to adjust the byte to point to the byte containing
6191      the value.  */
6192   if (wanted_inner_mode != VOIDmode
6193       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
6194       && ((GET_CODE (inner) == MEM
6195            && (inner_mode == wanted_inner_mode
6196                || (! mode_dependent_address_p (XEXP (inner, 0))
6197                    && ! MEM_VOLATILE_P (inner))))))
6198     {
6199       int offset = 0;
6200
6201       /* The computations below will be correct if the machine is big
6202          endian in both bits and bytes or little endian in bits and bytes.
6203          If it is mixed, we must adjust.  */
6204
6205       /* If bytes are big endian and we had a paradoxical SUBREG, we must
6206          adjust OFFSET to compensate.  */
6207       if (BYTES_BIG_ENDIAN
6208           && ! spans_byte
6209           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6210         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
6211
6212       /* If this is a constant position, we can move to the desired byte.  */
6213       if (pos_rtx == 0)
6214         {
6215           offset += pos / BITS_PER_UNIT;
6216           pos %= GET_MODE_BITSIZE (wanted_inner_mode);
6217         }
6218
6219       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6220           && ! spans_byte
6221           && is_mode != wanted_inner_mode)
6222         offset = (GET_MODE_SIZE (is_mode)
6223                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
6224
6225       if (offset != 0 || inner_mode != wanted_inner_mode)
6226         inner = adjust_address_nv (inner, wanted_inner_mode, offset);
6227     }
6228
6229   /* If INNER is not memory, we can always get it into the proper mode.  If we
6230      are changing its mode, POS must be a constant and smaller than the size
6231      of the new mode.  */
6232   else if (GET_CODE (inner) != MEM)
6233     {
6234       if (GET_MODE (inner) != wanted_inner_mode
6235           && (pos_rtx != 0
6236               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6237         return 0;
6238
6239       inner = force_to_mode (inner, wanted_inner_mode,
6240                              pos_rtx
6241                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
6242                              ? ~(unsigned HOST_WIDE_INT) 0
6243                              : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6244                                 << orig_pos),
6245                              NULL_RTX, 0);
6246     }
6247
6248   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
6249      have to zero extend.  Otherwise, we can just use a SUBREG.  */
6250   if (pos_rtx != 0
6251       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
6252     {
6253       rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
6254
6255       /* If we know that no extraneous bits are set, and that the high
6256          bit is not set, convert extraction to cheaper one - either
6257          SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6258          cases.  */
6259       if (flag_expensive_optimizations
6260           && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6261               && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
6262                    & ~(((unsigned HOST_WIDE_INT)
6263                         GET_MODE_MASK (GET_MODE (pos_rtx)))
6264                        >> 1))
6265                   == 0)))
6266         {
6267           rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
6268
6269           /* Prefer ZERO_EXTENSION, since it gives more information to
6270              backends.  */
6271           if (rtx_cost (temp1, SET) < rtx_cost (temp, SET))
6272             temp = temp1;
6273         }
6274       pos_rtx = temp;
6275     }
6276   else if (pos_rtx != 0
6277            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6278     pos_rtx = gen_lowpart_for_combine (pos_mode, pos_rtx);
6279
6280   /* Make POS_RTX unless we already have it and it is correct.  If we don't
6281      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
6282      be a CONST_INT.  */
6283   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
6284     pos_rtx = orig_pos_rtx;
6285
6286   else if (pos_rtx == 0)
6287     pos_rtx = GEN_INT (pos);
6288
6289   /* Make the required operation.  See if we can use existing rtx.  */
6290   new = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
6291                          extraction_mode, inner, GEN_INT (len), pos_rtx);
6292   if (! in_dest)
6293     new = gen_lowpart_for_combine (mode, new);
6294
6295   return new;
6296 }
6297 \f
6298 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
6299    with any other operations in X.  Return X without that shift if so.  */
6300
6301 static rtx
6302 extract_left_shift (x, count)
6303      rtx x;
6304      int count;
6305 {
6306   enum rtx_code code = GET_CODE (x);
6307   enum machine_mode mode = GET_MODE (x);
6308   rtx tem;
6309
6310   switch (code)
6311     {
6312     case ASHIFT:
6313       /* This is the shift itself.  If it is wide enough, we will return
6314          either the value being shifted if the shift count is equal to
6315          COUNT or a shift for the difference.  */
6316       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6317           && INTVAL (XEXP (x, 1)) >= count)
6318         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
6319                                      INTVAL (XEXP (x, 1)) - count);
6320       break;
6321
6322     case NEG:  case NOT:
6323       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6324         return simplify_gen_unary (code, mode, tem, mode);
6325
6326       break;
6327
6328     case PLUS:  case IOR:  case XOR:  case AND:
6329       /* If we can safely shift this constant and we find the inner shift,
6330          make a new operation.  */
6331       if (GET_CODE (XEXP (x,1)) == CONST_INT
6332           && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
6333           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6334         return gen_binary (code, mode, tem,
6335                            GEN_INT (INTVAL (XEXP (x, 1)) >> count));
6336
6337       break;
6338
6339     default:
6340       break;
6341     }
6342
6343   return 0;
6344 }
6345 \f
6346 /* Look at the expression rooted at X.  Look for expressions
6347    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
6348    Form these expressions.
6349
6350    Return the new rtx, usually just X.
6351
6352    Also, for machines like the VAX that don't have logical shift insns,
6353    try to convert logical to arithmetic shift operations in cases where
6354    they are equivalent.  This undoes the canonicalizations to logical
6355    shifts done elsewhere.
6356
6357    We try, as much as possible, to re-use rtl expressions to save memory.
6358
6359    IN_CODE says what kind of expression we are processing.  Normally, it is
6360    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
6361    being kludges), it is MEM.  When processing the arguments of a comparison
6362    or a COMPARE against zero, it is COMPARE.  */
6363
6364 static rtx
6365 make_compound_operation (x, in_code)
6366      rtx x;
6367      enum rtx_code in_code;
6368 {
6369   enum rtx_code code = GET_CODE (x);
6370   enum machine_mode mode = GET_MODE (x);
6371   int mode_width = GET_MODE_BITSIZE (mode);
6372   rtx rhs, lhs;
6373   enum rtx_code next_code;
6374   int i;
6375   rtx new = 0;
6376   rtx tem;
6377   const char *fmt;
6378
6379   /* Select the code to be used in recursive calls.  Once we are inside an
6380      address, we stay there.  If we have a comparison, set to COMPARE,
6381      but once inside, go back to our default of SET.  */
6382
6383   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
6384                : ((code == COMPARE || GET_RTX_CLASS (code) == '<')
6385                   && XEXP (x, 1) == const0_rtx) ? COMPARE
6386                : in_code == COMPARE ? SET : in_code);
6387
6388   /* Process depending on the code of this operation.  If NEW is set
6389      non-zero, it will be returned.  */
6390
6391   switch (code)
6392     {
6393     case ASHIFT:
6394       /* Convert shifts by constants into multiplications if inside
6395          an address.  */
6396       if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
6397           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6398           && INTVAL (XEXP (x, 1)) >= 0)
6399         {
6400           new = make_compound_operation (XEXP (x, 0), next_code);
6401           new = gen_rtx_MULT (mode, new,
6402                               GEN_INT ((HOST_WIDE_INT) 1
6403                                        << INTVAL (XEXP (x, 1))));
6404         }
6405       break;
6406
6407     case AND:
6408       /* If the second operand is not a constant, we can't do anything
6409          with it.  */
6410       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6411         break;
6412
6413       /* If the constant is a power of two minus one and the first operand
6414          is a logical right shift, make an extraction.  */
6415       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6416           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6417         {
6418           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6419           new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1,
6420                                  0, in_code == COMPARE);
6421         }
6422
6423       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
6424       else if (GET_CODE (XEXP (x, 0)) == SUBREG
6425                && subreg_lowpart_p (XEXP (x, 0))
6426                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
6427                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6428         {
6429           new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
6430                                          next_code);
6431           new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0,
6432                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
6433                                  0, in_code == COMPARE);
6434         }
6435       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
6436       else if ((GET_CODE (XEXP (x, 0)) == XOR
6437                 || GET_CODE (XEXP (x, 0)) == IOR)
6438                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
6439                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
6440                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6441         {
6442           /* Apply the distributive law, and then try to make extractions.  */
6443           new = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
6444                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
6445                                              XEXP (x, 1)),
6446                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
6447                                              XEXP (x, 1)));
6448           new = make_compound_operation (new, in_code);
6449         }
6450
6451       /* If we are have (and (rotate X C) M) and C is larger than the number
6452          of bits in M, this is an extraction.  */
6453
6454       else if (GET_CODE (XEXP (x, 0)) == ROTATE
6455                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6456                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
6457                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
6458         {
6459           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6460           new = make_extraction (mode, new,
6461                                  (GET_MODE_BITSIZE (mode)
6462                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
6463                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
6464         }
6465
6466       /* On machines without logical shifts, if the operand of the AND is
6467          a logical shift and our mask turns off all the propagated sign
6468          bits, we can replace the logical shift with an arithmetic shift.  */
6469       else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6470                && !have_insn_for (LSHIFTRT, mode)
6471                && have_insn_for (ASHIFTRT, mode)
6472                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6473                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6474                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6475                && mode_width <= HOST_BITS_PER_WIDE_INT)
6476         {
6477           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
6478
6479           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
6480           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
6481             SUBST (XEXP (x, 0),
6482                    gen_rtx_ASHIFTRT (mode,
6483                                      make_compound_operation
6484                                      (XEXP (XEXP (x, 0), 0), next_code),
6485                                      XEXP (XEXP (x, 0), 1)));
6486         }
6487
6488       /* If the constant is one less than a power of two, this might be
6489          representable by an extraction even if no shift is present.
6490          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
6491          we are in a COMPARE.  */
6492       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6493         new = make_extraction (mode,
6494                                make_compound_operation (XEXP (x, 0),
6495                                                         next_code),
6496                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
6497
6498       /* If we are in a comparison and this is an AND with a power of two,
6499          convert this into the appropriate bit extract.  */
6500       else if (in_code == COMPARE
6501                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
6502         new = make_extraction (mode,
6503                                make_compound_operation (XEXP (x, 0),
6504                                                         next_code),
6505                                i, NULL_RTX, 1, 1, 0, 1);
6506
6507       break;
6508
6509     case LSHIFTRT:
6510       /* If the sign bit is known to be zero, replace this with an
6511          arithmetic shift.  */
6512       if (have_insn_for (ASHIFTRT, mode)
6513           && ! have_insn_for (LSHIFTRT, mode)
6514           && mode_width <= HOST_BITS_PER_WIDE_INT
6515           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
6516         {
6517           new = gen_rtx_ASHIFTRT (mode,
6518                                   make_compound_operation (XEXP (x, 0),
6519                                                            next_code),
6520                                   XEXP (x, 1));
6521           break;
6522         }
6523
6524       /* ... fall through ...  */
6525
6526     case ASHIFTRT:
6527       lhs = XEXP (x, 0);
6528       rhs = XEXP (x, 1);
6529
6530       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
6531          this is a SIGN_EXTRACT.  */
6532       if (GET_CODE (rhs) == CONST_INT
6533           && GET_CODE (lhs) == ASHIFT
6534           && GET_CODE (XEXP (lhs, 1)) == CONST_INT
6535           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)))
6536         {
6537           new = make_compound_operation (XEXP (lhs, 0), next_code);
6538           new = make_extraction (mode, new,
6539                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
6540                                  NULL_RTX, mode_width - INTVAL (rhs),
6541                                  code == LSHIFTRT, 0, in_code == COMPARE);
6542           break;
6543         }
6544
6545       /* See if we have operations between an ASHIFTRT and an ASHIFT.
6546          If so, try to merge the shifts into a SIGN_EXTEND.  We could
6547          also do this for some cases of SIGN_EXTRACT, but it doesn't
6548          seem worth the effort; the case checked for occurs on Alpha.  */
6549
6550       if (GET_RTX_CLASS (GET_CODE (lhs)) != 'o'
6551           && ! (GET_CODE (lhs) == SUBREG
6552                 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (lhs))) == 'o'))
6553           && GET_CODE (rhs) == CONST_INT
6554           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
6555           && (new = extract_left_shift (lhs, INTVAL (rhs))) != 0)
6556         new = make_extraction (mode, make_compound_operation (new, next_code),
6557                                0, NULL_RTX, mode_width - INTVAL (rhs),
6558                                code == LSHIFTRT, 0, in_code == COMPARE);
6559
6560       break;
6561
6562     case SUBREG:
6563       /* Call ourselves recursively on the inner expression.  If we are
6564          narrowing the object and it has a different RTL code from
6565          what it originally did, do this SUBREG as a force_to_mode.  */
6566
6567       tem = make_compound_operation (SUBREG_REG (x), in_code);
6568       if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
6569           && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
6570           && subreg_lowpart_p (x))
6571         {
6572           rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
6573                                      NULL_RTX, 0);
6574
6575           /* If we have something other than a SUBREG, we might have
6576              done an expansion, so rerun ourselves.  */
6577           if (GET_CODE (newer) != SUBREG)
6578             newer = make_compound_operation (newer, in_code);
6579
6580           return newer;
6581         }
6582
6583       /* If this is a paradoxical subreg, and the new code is a sign or
6584          zero extension, omit the subreg and widen the extension.  If it
6585          is a regular subreg, we can still get rid of the subreg by not
6586          widening so much, or in fact removing the extension entirely.  */
6587       if ((GET_CODE (tem) == SIGN_EXTEND
6588            || GET_CODE (tem) == ZERO_EXTEND)
6589           && subreg_lowpart_p (x))
6590         {
6591           if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
6592               || (GET_MODE_SIZE (mode) >
6593                   GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
6594             tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0));
6595           else
6596             tem = gen_lowpart_for_combine (mode, XEXP (tem, 0));
6597           return tem;
6598         }
6599       break;
6600
6601     default:
6602       break;
6603     }
6604
6605   if (new)
6606     {
6607       x = gen_lowpart_for_combine (mode, new);
6608       code = GET_CODE (x);
6609     }
6610
6611   /* Now recursively process each operand of this operation.  */
6612   fmt = GET_RTX_FORMAT (code);
6613   for (i = 0; i < GET_RTX_LENGTH (code); i++)
6614     if (fmt[i] == 'e')
6615       {
6616         new = make_compound_operation (XEXP (x, i), next_code);
6617         SUBST (XEXP (x, i), new);
6618       }
6619
6620   return x;
6621 }
6622 \f
6623 /* Given M see if it is a value that would select a field of bits
6624    within an item, but not the entire word.  Return -1 if not.
6625    Otherwise, return the starting position of the field, where 0 is the
6626    low-order bit.
6627
6628    *PLEN is set to the length of the field.  */
6629
6630 static int
6631 get_pos_from_mask (m, plen)
6632      unsigned HOST_WIDE_INT m;
6633      unsigned HOST_WIDE_INT *plen;
6634 {
6635   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
6636   int pos = exact_log2 (m & -m);
6637   int len;
6638
6639   if (pos < 0)
6640     return -1;
6641
6642   /* Now shift off the low-order zero bits and see if we have a power of
6643      two minus 1.  */
6644   len = exact_log2 ((m >> pos) + 1);
6645
6646   if (len <= 0)
6647     return -1;
6648
6649   *plen = len;
6650   return pos;
6651 }
6652 \f
6653 /* See if X can be simplified knowing that we will only refer to it in
6654    MODE and will only refer to those bits that are nonzero in MASK.
6655    If other bits are being computed or if masking operations are done
6656    that select a superset of the bits in MASK, they can sometimes be
6657    ignored.
6658
6659    Return a possibly simplified expression, but always convert X to
6660    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
6661
6662    Also, if REG is non-zero and X is a register equal in value to REG,
6663    replace X with REG.
6664
6665    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
6666    are all off in X.  This is used when X will be complemented, by either
6667    NOT, NEG, or XOR.  */
6668
6669 static rtx
6670 force_to_mode (x, mode, mask, reg, just_select)
6671      rtx x;
6672      enum machine_mode mode;
6673      unsigned HOST_WIDE_INT mask;
6674      rtx reg;
6675      int just_select;
6676 {
6677   enum rtx_code code = GET_CODE (x);
6678   int next_select = just_select || code == XOR || code == NOT || code == NEG;
6679   enum machine_mode op_mode;
6680   unsigned HOST_WIDE_INT fuller_mask, nonzero;
6681   rtx op0, op1, temp;
6682
6683   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
6684      code below will do the wrong thing since the mode of such an
6685      expression is VOIDmode.
6686
6687      Also do nothing if X is a CLOBBER; this can happen if X was
6688      the return value from a call to gen_lowpart_for_combine.  */
6689   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
6690     return x;
6691
6692   /* We want to perform the operation is its present mode unless we know
6693      that the operation is valid in MODE, in which case we do the operation
6694      in MODE.  */
6695   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
6696               && have_insn_for (code, mode))
6697              ? mode : GET_MODE (x));
6698
6699   /* It is not valid to do a right-shift in a narrower mode
6700      than the one it came in with.  */
6701   if ((code == LSHIFTRT || code == ASHIFTRT)
6702       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
6703     op_mode = GET_MODE (x);
6704
6705   /* Truncate MASK to fit OP_MODE.  */
6706   if (op_mode)
6707     mask &= GET_MODE_MASK (op_mode);
6708
6709   /* When we have an arithmetic operation, or a shift whose count we
6710      do not know, we need to assume that all bit the up to the highest-order
6711      bit in MASK will be needed.  This is how we form such a mask.  */
6712   if (op_mode)
6713     fuller_mask = (GET_MODE_BITSIZE (op_mode) >= HOST_BITS_PER_WIDE_INT
6714                    ? GET_MODE_MASK (op_mode)
6715                    : (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
6716                       - 1));
6717   else
6718     fuller_mask = ~(HOST_WIDE_INT) 0;
6719
6720   /* Determine what bits of X are guaranteed to be (non)zero.  */
6721   nonzero = nonzero_bits (x, mode);
6722
6723   /* If none of the bits in X are needed, return a zero.  */
6724   if (! just_select && (nonzero & mask) == 0)
6725     return const0_rtx;
6726
6727   /* If X is a CONST_INT, return a new one.  Do this here since the
6728      test below will fail.  */
6729   if (GET_CODE (x) == CONST_INT)
6730     return gen_int_mode (INTVAL (x) & mask, mode);
6731
6732   /* If X is narrower than MODE and we want all the bits in X's mode, just
6733      get X in the proper mode.  */
6734   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
6735       && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
6736     return gen_lowpart_for_combine (mode, x);
6737
6738   /* If we aren't changing the mode, X is not a SUBREG, and all zero bits in
6739      MASK are already known to be zero in X, we need not do anything.  */
6740   if (GET_MODE (x) == mode && code != SUBREG && (~mask & nonzero) == 0)
6741     return x;
6742
6743   switch (code)
6744     {
6745     case CLOBBER:
6746       /* If X is a (clobber (const_int)), return it since we know we are
6747          generating something that won't match.  */
6748       return x;
6749
6750     case USE:
6751       /* X is a (use (mem ..)) that was made from a bit-field extraction that
6752          spanned the boundary of the MEM.  If we are now masking so it is
6753          within that boundary, we don't need the USE any more.  */
6754       if (! BITS_BIG_ENDIAN
6755           && (mask & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6756         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6757       break;
6758
6759     case SIGN_EXTEND:
6760     case ZERO_EXTEND:
6761     case ZERO_EXTRACT:
6762     case SIGN_EXTRACT:
6763       x = expand_compound_operation (x);
6764       if (GET_CODE (x) != code)
6765         return force_to_mode (x, mode, mask, reg, next_select);
6766       break;
6767
6768     case REG:
6769       if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
6770                        || rtx_equal_p (reg, get_last_value (x))))
6771         x = reg;
6772       break;
6773
6774     case SUBREG:
6775       if (subreg_lowpart_p (x)
6776           /* We can ignore the effect of this SUBREG if it narrows the mode or
6777              if the constant masks to zero all the bits the mode doesn't
6778              have.  */
6779           && ((GET_MODE_SIZE (GET_MODE (x))
6780                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
6781               || (0 == (mask
6782                         & GET_MODE_MASK (GET_MODE (x))
6783                         & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
6784         return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select);
6785       break;
6786
6787     case AND:
6788       /* If this is an AND with a constant, convert it into an AND
6789          whose constant is the AND of that constant with MASK.  If it
6790          remains an AND of MASK, delete it since it is redundant.  */
6791
6792       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6793         {
6794           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
6795                                       mask & INTVAL (XEXP (x, 1)));
6796
6797           /* If X is still an AND, see if it is an AND with a mask that
6798              is just some low-order bits.  If so, and it is MASK, we don't
6799              need it.  */
6800
6801           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6802               && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
6803                   == (HOST_WIDE_INT) mask))
6804             x = XEXP (x, 0);
6805
6806           /* If it remains an AND, try making another AND with the bits
6807              in the mode mask that aren't in MASK turned on.  If the
6808              constant in the AND is wide enough, this might make a
6809              cheaper constant.  */
6810
6811           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6812               && GET_MODE_MASK (GET_MODE (x)) != mask
6813               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
6814             {
6815               HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
6816                                     | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
6817               int width = GET_MODE_BITSIZE (GET_MODE (x));
6818               rtx y;
6819
6820               /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative
6821                  number, sign extend it.  */
6822               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
6823                   && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6824                 cval |= (HOST_WIDE_INT) -1 << width;
6825
6826               y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval));
6827               if (rtx_cost (y, SET) < rtx_cost (x, SET))
6828                 x = y;
6829             }
6830
6831           break;
6832         }
6833
6834       goto binop;
6835
6836     case PLUS:
6837       /* In (and (plus FOO C1) M), if M is a mask that just turns off
6838          low-order bits (as in an alignment operation) and FOO is already
6839          aligned to that boundary, mask C1 to that boundary as well.
6840          This may eliminate that PLUS and, later, the AND.  */
6841
6842       {
6843         unsigned int width = GET_MODE_BITSIZE (mode);
6844         unsigned HOST_WIDE_INT smask = mask;
6845
6846         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
6847            number, sign extend it.  */
6848
6849         if (width < HOST_BITS_PER_WIDE_INT
6850             && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6851           smask |= (HOST_WIDE_INT) -1 << width;
6852
6853         if (GET_CODE (XEXP (x, 1)) == CONST_INT
6854             && exact_log2 (- smask) >= 0
6855             && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
6856             && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
6857           return force_to_mode (plus_constant (XEXP (x, 0),
6858                                                (INTVAL (XEXP (x, 1)) & smask)),
6859                                 mode, smask, reg, next_select);
6860       }
6861
6862       /* ... fall through ...  */
6863
6864     case MULT:
6865       /* For PLUS, MINUS and MULT, we need any bits less significant than the
6866          most significant bit in MASK since carries from those bits will
6867          affect the bits we are interested in.  */
6868       mask = fuller_mask;
6869       goto binop;
6870
6871     case MINUS:
6872       /* If X is (minus C Y) where C's least set bit is larger than any bit
6873          in the mask, then we may replace with (neg Y).  */
6874       if (GET_CODE (XEXP (x, 0)) == CONST_INT
6875           && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
6876                                         & -INTVAL (XEXP (x, 0))))
6877               > mask))
6878         {
6879           x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
6880                                   GET_MODE (x));
6881           return force_to_mode (x, mode, mask, reg, next_select);
6882         }
6883
6884       /* Similarly, if C contains every bit in the mask, then we may
6885          replace with (not Y).  */
6886       if (GET_CODE (XEXP (x, 0)) == CONST_INT
6887           && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) mask)
6888               == INTVAL (XEXP (x, 0))))
6889         {
6890           x = simplify_gen_unary (NOT, GET_MODE (x),
6891                                   XEXP (x, 1), GET_MODE (x));
6892           return force_to_mode (x, mode, mask, reg, next_select);
6893         }
6894
6895       mask = fuller_mask;
6896       goto binop;
6897
6898     case IOR:
6899     case XOR:
6900       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
6901          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
6902          operation which may be a bitfield extraction.  Ensure that the
6903          constant we form is not wider than the mode of X.  */
6904
6905       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6906           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6907           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6908           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6909           && GET_CODE (XEXP (x, 1)) == CONST_INT
6910           && ((INTVAL (XEXP (XEXP (x, 0), 1))
6911                + floor_log2 (INTVAL (XEXP (x, 1))))
6912               < GET_MODE_BITSIZE (GET_MODE (x)))
6913           && (INTVAL (XEXP (x, 1))
6914               & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
6915         {
6916           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
6917                           << INTVAL (XEXP (XEXP (x, 0), 1)));
6918           temp = gen_binary (GET_CODE (x), GET_MODE (x),
6919                              XEXP (XEXP (x, 0), 0), temp);
6920           x = gen_binary (LSHIFTRT, GET_MODE (x), temp,
6921                           XEXP (XEXP (x, 0), 1));
6922           return force_to_mode (x, mode, mask, reg, next_select);
6923         }
6924
6925     binop:
6926       /* For most binary operations, just propagate into the operation and
6927          change the mode if we have an operation of that mode.  */
6928
6929       op0 = gen_lowpart_for_combine (op_mode,
6930                                      force_to_mode (XEXP (x, 0), mode, mask,
6931                                                     reg, next_select));
6932       op1 = gen_lowpart_for_combine (op_mode,
6933                                      force_to_mode (XEXP (x, 1), mode, mask,
6934                                                     reg, next_select));
6935
6936       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
6937         x = gen_binary (code, op_mode, op0, op1);
6938       break;
6939
6940     case ASHIFT:
6941       /* For left shifts, do the same, but just for the first operand.
6942          However, we cannot do anything with shifts where we cannot
6943          guarantee that the counts are smaller than the size of the mode
6944          because such a count will have a different meaning in a
6945          wider mode.  */
6946
6947       if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
6948              && INTVAL (XEXP (x, 1)) >= 0
6949              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
6950           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
6951                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
6952                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
6953         break;
6954
6955       /* If the shift count is a constant and we can do arithmetic in
6956          the mode of the shift, refine which bits we need.  Otherwise, use the
6957          conservative form of the mask.  */
6958       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6959           && INTVAL (XEXP (x, 1)) >= 0
6960           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
6961           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
6962         mask >>= INTVAL (XEXP (x, 1));
6963       else
6964         mask = fuller_mask;
6965
6966       op0 = gen_lowpart_for_combine (op_mode,
6967                                      force_to_mode (XEXP (x, 0), op_mode,
6968                                                     mask, reg, next_select));
6969
6970       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
6971         x = gen_binary (code, op_mode, op0, XEXP (x, 1));
6972       break;
6973
6974     case LSHIFTRT:
6975       /* Here we can only do something if the shift count is a constant,
6976          this shift constant is valid for the host, and we can do arithmetic
6977          in OP_MODE.  */
6978
6979       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6980           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6981           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
6982         {
6983           rtx inner = XEXP (x, 0);
6984           unsigned HOST_WIDE_INT inner_mask;
6985
6986           /* Select the mask of the bits we need for the shift operand.  */
6987           inner_mask = mask << INTVAL (XEXP (x, 1));
6988
6989           /* We can only change the mode of the shift if we can do arithmetic
6990              in the mode of the shift and INNER_MASK is no wider than the
6991              width of OP_MODE.  */
6992           if (GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT
6993               || (inner_mask & ~GET_MODE_MASK (op_mode)) != 0)
6994             op_mode = GET_MODE (x);
6995
6996           inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
6997
6998           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
6999             x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
7000         }
7001
7002       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
7003          shift and AND produces only copies of the sign bit (C2 is one less
7004          than a power of two), we can do this with just a shift.  */
7005
7006       if (GET_CODE (x) == LSHIFTRT
7007           && GET_CODE (XEXP (x, 1)) == CONST_INT
7008           /* The shift puts one of the sign bit copies in the least significant
7009              bit.  */
7010           && ((INTVAL (XEXP (x, 1))
7011                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
7012               >= GET_MODE_BITSIZE (GET_MODE (x)))
7013           && exact_log2 (mask + 1) >= 0
7014           /* Number of bits left after the shift must be more than the mask
7015              needs.  */
7016           && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
7017               <= GET_MODE_BITSIZE (GET_MODE (x)))
7018           /* Must be more sign bit copies than the mask needs.  */
7019           && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
7020               >= exact_log2 (mask + 1)))
7021         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7022                         GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
7023                                  - exact_log2 (mask + 1)));
7024
7025       goto shiftrt;
7026
7027     case ASHIFTRT:
7028       /* If we are just looking for the sign bit, we don't need this shift at
7029          all, even if it has a variable count.  */
7030       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7031           && (mask == ((unsigned HOST_WIDE_INT) 1
7032                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7033         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7034
7035       /* If this is a shift by a constant, get a mask that contains those bits
7036          that are not copies of the sign bit.  We then have two cases:  If
7037          MASK only includes those bits, this can be a logical shift, which may
7038          allow simplifications.  If MASK is a single-bit field not within
7039          those bits, we are requesting a copy of the sign bit and hence can
7040          shift the sign bit to the appropriate location.  */
7041
7042       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0
7043           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7044         {
7045           int i = -1;
7046
7047           /* If the considered data is wider than HOST_WIDE_INT, we can't
7048              represent a mask for all its bits in a single scalar.
7049              But we only care about the lower bits, so calculate these.  */
7050
7051           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
7052             {
7053               nonzero = ~(HOST_WIDE_INT) 0;
7054
7055               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7056                  is the number of bits a full-width mask would have set.
7057                  We need only shift if these are fewer than nonzero can
7058                  hold.  If not, we must keep all bits set in nonzero.  */
7059
7060               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7061                   < HOST_BITS_PER_WIDE_INT)
7062                 nonzero >>= INTVAL (XEXP (x, 1))
7063                             + HOST_BITS_PER_WIDE_INT
7064                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
7065             }
7066           else
7067             {
7068               nonzero = GET_MODE_MASK (GET_MODE (x));
7069               nonzero >>= INTVAL (XEXP (x, 1));
7070             }
7071
7072           if ((mask & ~nonzero) == 0
7073               || (i = exact_log2 (mask)) >= 0)
7074             {
7075               x = simplify_shift_const
7076                 (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7077                  i < 0 ? INTVAL (XEXP (x, 1))
7078                  : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
7079
7080               if (GET_CODE (x) != ASHIFTRT)
7081                 return force_to_mode (x, mode, mask, reg, next_select);
7082             }
7083         }
7084
7085       /* If MASK is 1, convert this to an LSHIFTRT.  This can be done
7086          even if the shift count isn't a constant.  */
7087       if (mask == 1)
7088         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1));
7089
7090     shiftrt:
7091
7092       /* If this is a zero- or sign-extension operation that just affects bits
7093          we don't care about, remove it.  Be sure the call above returned
7094          something that is still a shift.  */
7095
7096       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
7097           && GET_CODE (XEXP (x, 1)) == CONST_INT
7098           && INTVAL (XEXP (x, 1)) >= 0
7099           && (INTVAL (XEXP (x, 1))
7100               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
7101           && GET_CODE (XEXP (x, 0)) == ASHIFT
7102           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7103           && INTVAL (XEXP (XEXP (x, 0), 1)) == INTVAL (XEXP (x, 1)))
7104         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
7105                               reg, next_select);
7106
7107       break;
7108
7109     case ROTATE:
7110     case ROTATERT:
7111       /* If the shift count is constant and we can do computations
7112          in the mode of X, compute where the bits we care about are.
7113          Otherwise, we can't do anything.  Don't change the mode of
7114          the shift or propagate MODE into the shift, though.  */
7115       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7116           && INTVAL (XEXP (x, 1)) >= 0)
7117         {
7118           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
7119                                             GET_MODE (x), GEN_INT (mask),
7120                                             XEXP (x, 1));
7121           if (temp && GET_CODE(temp) == CONST_INT)
7122             SUBST (XEXP (x, 0),
7123                    force_to_mode (XEXP (x, 0), GET_MODE (x),
7124                                   INTVAL (temp), reg, next_select));
7125         }
7126       break;
7127
7128     case NEG:
7129       /* If we just want the low-order bit, the NEG isn't needed since it
7130          won't change the low-order bit.  */
7131       if (mask == 1)
7132         return force_to_mode (XEXP (x, 0), mode, mask, reg, just_select);
7133
7134       /* We need any bits less significant than the most significant bit in
7135          MASK since carries from those bits will affect the bits we are
7136          interested in.  */
7137       mask = fuller_mask;
7138       goto unop;
7139
7140     case NOT:
7141       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
7142          same as the XOR case above.  Ensure that the constant we form is not
7143          wider than the mode of X.  */
7144
7145       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7146           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7147           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7148           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
7149               < GET_MODE_BITSIZE (GET_MODE (x)))
7150           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
7151         {
7152           temp = GEN_INT (mask << INTVAL (XEXP (XEXP (x, 0), 1)));
7153           temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp);
7154           x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1));
7155
7156           return force_to_mode (x, mode, mask, reg, next_select);
7157         }
7158
7159       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
7160          use the full mask inside the NOT.  */
7161       mask = fuller_mask;
7162
7163     unop:
7164       op0 = gen_lowpart_for_combine (op_mode,
7165                                      force_to_mode (XEXP (x, 0), mode, mask,
7166                                                     reg, next_select));
7167       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7168         x = simplify_gen_unary (code, op_mode, op0, op_mode);
7169       break;
7170
7171     case NE:
7172       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
7173          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
7174          which is equal to STORE_FLAG_VALUE.  */
7175       if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
7176           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
7177           && nonzero_bits (XEXP (x, 0), mode) == STORE_FLAG_VALUE)
7178         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7179
7180       break;
7181
7182     case IF_THEN_ELSE:
7183       /* We have no way of knowing if the IF_THEN_ELSE can itself be
7184          written in a narrower mode.  We play it safe and do not do so.  */
7185
7186       SUBST (XEXP (x, 1),
7187              gen_lowpart_for_combine (GET_MODE (x),
7188                                       force_to_mode (XEXP (x, 1), mode,
7189                                                      mask, reg, next_select)));
7190       SUBST (XEXP (x, 2),
7191              gen_lowpart_for_combine (GET_MODE (x),
7192                                       force_to_mode (XEXP (x, 2), mode,
7193                                                      mask, reg,next_select)));
7194       break;
7195
7196     default:
7197       break;
7198     }
7199
7200   /* Ensure we return a value of the proper mode.  */
7201   return gen_lowpart_for_combine (mode, x);
7202 }
7203 \f
7204 /* Return nonzero if X is an expression that has one of two values depending on
7205    whether some other value is zero or nonzero.  In that case, we return the
7206    value that is being tested, *PTRUE is set to the value if the rtx being
7207    returned has a nonzero value, and *PFALSE is set to the other alternative.
7208
7209    If we return zero, we set *PTRUE and *PFALSE to X.  */
7210
7211 static rtx
7212 if_then_else_cond (x, ptrue, pfalse)
7213      rtx x;
7214      rtx *ptrue, *pfalse;
7215 {
7216   enum machine_mode mode = GET_MODE (x);
7217   enum rtx_code code = GET_CODE (x);
7218   rtx cond0, cond1, true0, true1, false0, false1;
7219   unsigned HOST_WIDE_INT nz;
7220
7221   /* If we are comparing a value against zero, we are done.  */
7222   if ((code == NE || code == EQ)
7223       && GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
7224     {
7225       *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
7226       *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
7227       return XEXP (x, 0);
7228     }
7229
7230   /* If this is a unary operation whose operand has one of two values, apply
7231      our opcode to compute those values.  */
7232   else if (GET_RTX_CLASS (code) == '1'
7233            && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
7234     {
7235       *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
7236       *pfalse = simplify_gen_unary (code, mode, false0,
7237                                     GET_MODE (XEXP (x, 0)));
7238       return cond0;
7239     }
7240
7241   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
7242      make can't possibly match and would suppress other optimizations.  */
7243   else if (code == COMPARE)
7244     ;
7245
7246   /* If this is a binary operation, see if either side has only one of two
7247      values.  If either one does or if both do and they are conditional on
7248      the same value, compute the new true and false values.  */
7249   else if (GET_RTX_CLASS (code) == 'c' || GET_RTX_CLASS (code) == '2'
7250            || GET_RTX_CLASS (code) == '<')
7251     {
7252       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
7253       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
7254
7255       if ((cond0 != 0 || cond1 != 0)
7256           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
7257         {
7258           /* If if_then_else_cond returned zero, then true/false are the
7259              same rtl.  We must copy one of them to prevent invalid rtl
7260              sharing.  */
7261           if (cond0 == 0)
7262             true0 = copy_rtx (true0);
7263           else if (cond1 == 0)
7264             true1 = copy_rtx (true1);
7265
7266           *ptrue = gen_binary (code, mode, true0, true1);
7267           *pfalse = gen_binary (code, mode, false0, false1);
7268           return cond0 ? cond0 : cond1;
7269         }
7270
7271       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
7272          operands is zero when the other is non-zero, and vice-versa,
7273          and STORE_FLAG_VALUE is 1 or -1.  */
7274
7275       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7276           && (code == PLUS || code == IOR || code == XOR || code == MINUS
7277               || code == UMAX)
7278           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7279         {
7280           rtx op0 = XEXP (XEXP (x, 0), 1);
7281           rtx op1 = XEXP (XEXP (x, 1), 1);
7282
7283           cond0 = XEXP (XEXP (x, 0), 0);
7284           cond1 = XEXP (XEXP (x, 1), 0);
7285
7286           if (GET_RTX_CLASS (GET_CODE (cond0)) == '<'
7287               && GET_RTX_CLASS (GET_CODE (cond1)) == '<'
7288               && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
7289                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7290                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7291                   || ((swap_condition (GET_CODE (cond0))
7292                        == combine_reversed_comparison_code (cond1))
7293                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7294                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7295               && ! side_effects_p (x))
7296             {
7297               *ptrue = gen_binary (MULT, mode, op0, const_true_rtx);
7298               *pfalse = gen_binary (MULT, mode,
7299                                     (code == MINUS
7300                                      ? simplify_gen_unary (NEG, mode, op1,
7301                                                            mode)
7302                                      : op1),
7303                                     const_true_rtx);
7304               return cond0;
7305             }
7306         }
7307
7308       /* Similarly for MULT, AND and UMIN, except that for these the result
7309          is always zero.  */
7310       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7311           && (code == MULT || code == AND || code == UMIN)
7312           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7313         {
7314           cond0 = XEXP (XEXP (x, 0), 0);
7315           cond1 = XEXP (XEXP (x, 1), 0);
7316
7317           if (GET_RTX_CLASS (GET_CODE (cond0)) == '<'
7318               && GET_RTX_CLASS (GET_CODE (cond1)) == '<'
7319               && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
7320                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7321                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7322                   || ((swap_condition (GET_CODE (cond0))
7323                        == combine_reversed_comparison_code (cond1))
7324                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7325                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7326               && ! side_effects_p (x))
7327             {
7328               *ptrue = *pfalse = const0_rtx;
7329               return cond0;
7330             }
7331         }
7332     }
7333
7334   else if (code == IF_THEN_ELSE)
7335     {
7336       /* If we have IF_THEN_ELSE already, extract the condition and
7337          canonicalize it if it is NE or EQ.  */
7338       cond0 = XEXP (x, 0);
7339       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
7340       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
7341         return XEXP (cond0, 0);
7342       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
7343         {
7344           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
7345           return XEXP (cond0, 0);
7346         }
7347       else
7348         return cond0;
7349     }
7350
7351   /* If X is a SUBREG, we can narrow both the true and false values
7352      if the inner expression, if there is a condition.  */
7353   else if (code == SUBREG
7354            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
7355                                                &true0, &false0)))
7356     {
7357       *ptrue = simplify_gen_subreg (mode, true0,
7358                                     GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7359       *pfalse = simplify_gen_subreg (mode, false0,
7360                                      GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7361
7362       return cond0;
7363     }
7364
7365   /* If X is a constant, this isn't special and will cause confusions
7366      if we treat it as such.  Likewise if it is equivalent to a constant.  */
7367   else if (CONSTANT_P (x)
7368            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
7369     ;
7370
7371   /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
7372      will be least confusing to the rest of the compiler.  */
7373   else if (mode == BImode)
7374     {
7375       *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
7376       return x;
7377     }
7378
7379   /* If X is known to be either 0 or -1, those are the true and
7380      false values when testing X.  */
7381   else if (x == constm1_rtx || x == const0_rtx
7382            || (mode != VOIDmode
7383                && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
7384     {
7385       *ptrue = constm1_rtx, *pfalse = const0_rtx;
7386       return x;
7387     }
7388
7389   /* Likewise for 0 or a single bit.  */
7390   else if (mode != VOIDmode
7391            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7392            && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
7393     {
7394       *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
7395       return x;
7396     }
7397
7398   /* Otherwise fail; show no condition with true and false values the same.  */
7399   *ptrue = *pfalse = x;
7400   return 0;
7401 }
7402 \f
7403 /* Return the value of expression X given the fact that condition COND
7404    is known to be true when applied to REG as its first operand and VAL
7405    as its second.  X is known to not be shared and so can be modified in
7406    place.
7407
7408    We only handle the simplest cases, and specifically those cases that
7409    arise with IF_THEN_ELSE expressions.  */
7410
7411 static rtx
7412 known_cond (x, cond, reg, val)
7413      rtx x;
7414      enum rtx_code cond;
7415      rtx reg, val;
7416 {
7417   enum rtx_code code = GET_CODE (x);
7418   rtx temp;
7419   const char *fmt;
7420   int i, j;
7421
7422   if (side_effects_p (x))
7423     return x;
7424
7425   /* If either operand of the condition is a floating point value,
7426      then we have to avoid collapsing an EQ comparison.  */
7427   if (cond == EQ
7428       && rtx_equal_p (x, reg)
7429       && ! FLOAT_MODE_P (GET_MODE (x))
7430       && ! FLOAT_MODE_P (GET_MODE (val)))
7431     return val;
7432
7433   if (cond == UNEQ && rtx_equal_p (x, reg))
7434     return val;
7435
7436   /* If X is (abs REG) and we know something about REG's relationship
7437      with zero, we may be able to simplify this.  */
7438
7439   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
7440     switch (cond)
7441       {
7442       case GE:  case GT:  case EQ:
7443         return XEXP (x, 0);
7444       case LT:  case LE:
7445         return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
7446                                    XEXP (x, 0),
7447                                    GET_MODE (XEXP (x, 0)));
7448       default:
7449         break;
7450       }
7451
7452   /* The only other cases we handle are MIN, MAX, and comparisons if the
7453      operands are the same as REG and VAL.  */
7454
7455   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c')
7456     {
7457       if (rtx_equal_p (XEXP (x, 0), val))
7458         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
7459
7460       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
7461         {
7462           if (GET_RTX_CLASS (code) == '<')
7463             {
7464               if (comparison_dominates_p (cond, code))
7465                 return const_true_rtx;
7466
7467               code = combine_reversed_comparison_code (x);
7468               if (code != UNKNOWN
7469                   && comparison_dominates_p (cond, code))
7470                 return const0_rtx;
7471               else
7472                 return x;
7473             }
7474           else if (code == SMAX || code == SMIN
7475                    || code == UMIN || code == UMAX)
7476             {
7477               int unsignedp = (code == UMIN || code == UMAX);
7478
7479               /* Do not reverse the condition when it is NE or EQ.
7480                  This is because we cannot conclude anything about
7481                  the value of 'SMAX (x, y)' when x is not equal to y,
7482                  but we can when x equals y.  */
7483               if ((code == SMAX || code == UMAX)
7484                   && ! (cond == EQ || cond == NE))
7485                 cond = reverse_condition (cond);
7486
7487               switch (cond)
7488                 {
7489                 case GE:   case GT:
7490                   return unsignedp ? x : XEXP (x, 1);
7491                 case LE:   case LT:
7492                   return unsignedp ? x : XEXP (x, 0);
7493                 case GEU:  case GTU:
7494                   return unsignedp ? XEXP (x, 1) : x;
7495                 case LEU:  case LTU:
7496                   return unsignedp ? XEXP (x, 0) : x;
7497                 default:
7498                   break;
7499                 }
7500             }
7501         }
7502     }
7503   else if (code == SUBREG)
7504     {
7505       enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
7506       rtx new, r = known_cond (SUBREG_REG (x), cond, reg, val);
7507
7508       if (SUBREG_REG (x) != r)
7509         {
7510           /* We must simplify subreg here, before we lose track of the
7511              original inner_mode.  */
7512           new = simplify_subreg (GET_MODE (x), r,
7513                                  inner_mode, SUBREG_BYTE (x));
7514           if (new)
7515             return new;
7516           else
7517             SUBST (SUBREG_REG (x), r);
7518         }
7519
7520       return x;
7521     }
7522   /* We don't have to handle SIGN_EXTEND here, because even in the
7523      case of replacing something with a modeless CONST_INT, a
7524      CONST_INT is already (supposed to be) a valid sign extension for
7525      its narrower mode, which implies it's already properly
7526      sign-extended for the wider mode.  Now, for ZERO_EXTEND, the
7527      story is different.  */
7528   else if (code == ZERO_EXTEND)
7529     {
7530       enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
7531       rtx new, r = known_cond (XEXP (x, 0), cond, reg, val);
7532
7533       if (XEXP (x, 0) != r)
7534         {
7535           /* We must simplify the zero_extend here, before we lose
7536              track of the original inner_mode.  */
7537           new = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
7538                                           r, inner_mode);
7539           if (new)
7540             return new;
7541           else
7542             SUBST (XEXP (x, 0), r);
7543         }
7544
7545       return x;
7546     }
7547
7548   fmt = GET_RTX_FORMAT (code);
7549   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7550     {
7551       if (fmt[i] == 'e')
7552         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
7553       else if (fmt[i] == 'E')
7554         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7555           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
7556                                                 cond, reg, val));
7557     }
7558
7559   return x;
7560 }
7561 \f
7562 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
7563    assignment as a field assignment.  */
7564
7565 static int
7566 rtx_equal_for_field_assignment_p (x, y)
7567      rtx x;
7568      rtx y;
7569 {
7570   if (x == y || rtx_equal_p (x, y))
7571     return 1;
7572
7573   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
7574     return 0;
7575
7576   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
7577      Note that all SUBREGs of MEM are paradoxical; otherwise they
7578      would have been rewritten.  */
7579   if (GET_CODE (x) == MEM && GET_CODE (y) == SUBREG
7580       && GET_CODE (SUBREG_REG (y)) == MEM
7581       && rtx_equal_p (SUBREG_REG (y),
7582                       gen_lowpart_for_combine (GET_MODE (SUBREG_REG (y)), x)))
7583     return 1;
7584
7585   if (GET_CODE (y) == MEM && GET_CODE (x) == SUBREG
7586       && GET_CODE (SUBREG_REG (x)) == MEM
7587       && rtx_equal_p (SUBREG_REG (x),
7588                       gen_lowpart_for_combine (GET_MODE (SUBREG_REG (x)), y)))
7589     return 1;
7590
7591   /* We used to see if get_last_value of X and Y were the same but that's
7592      not correct.  In one direction, we'll cause the assignment to have
7593      the wrong destination and in the case, we'll import a register into this
7594      insn that might have already have been dead.   So fail if none of the
7595      above cases are true.  */
7596   return 0;
7597 }
7598 \f
7599 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
7600    Return that assignment if so.
7601
7602    We only handle the most common cases.  */
7603
7604 static rtx
7605 make_field_assignment (x)
7606      rtx x;
7607 {
7608   rtx dest = SET_DEST (x);
7609   rtx src = SET_SRC (x);
7610   rtx assign;
7611   rtx rhs, lhs;
7612   HOST_WIDE_INT c1;
7613   HOST_WIDE_INT pos;
7614   unsigned HOST_WIDE_INT len;
7615   rtx other;
7616   enum machine_mode mode;
7617
7618   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
7619      a clear of a one-bit field.  We will have changed it to
7620      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
7621      for a SUBREG.  */
7622
7623   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
7624       && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
7625       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
7626       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7627     {
7628       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7629                                 1, 1, 1, 0);
7630       if (assign != 0)
7631         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7632       return x;
7633     }
7634
7635   else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
7636            && subreg_lowpart_p (XEXP (src, 0))
7637            && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
7638                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
7639            && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
7640            && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
7641            && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7642     {
7643       assign = make_extraction (VOIDmode, dest, 0,
7644                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
7645                                 1, 1, 1, 0);
7646       if (assign != 0)
7647         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7648       return x;
7649     }
7650
7651   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
7652      one-bit field.  */
7653   else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
7654            && XEXP (XEXP (src, 0), 0) == const1_rtx
7655            && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7656     {
7657       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7658                                 1, 1, 1, 0);
7659       if (assign != 0)
7660         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
7661       return x;
7662     }
7663
7664   /* The other case we handle is assignments into a constant-position
7665      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
7666      a mask that has all one bits except for a group of zero bits and
7667      OTHER is known to have zeros where C1 has ones, this is such an
7668      assignment.  Compute the position and length from C1.  Shift OTHER
7669      to the appropriate position, force it to the required mode, and
7670      make the extraction.  Check for the AND in both operands.  */
7671
7672   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
7673     return x;
7674
7675   rhs = expand_compound_operation (XEXP (src, 0));
7676   lhs = expand_compound_operation (XEXP (src, 1));
7677
7678   if (GET_CODE (rhs) == AND
7679       && GET_CODE (XEXP (rhs, 1)) == CONST_INT
7680       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
7681     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
7682   else if (GET_CODE (lhs) == AND
7683            && GET_CODE (XEXP (lhs, 1)) == CONST_INT
7684            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
7685     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
7686   else
7687     return x;
7688
7689   pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
7690   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
7691       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
7692       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
7693     return x;
7694
7695   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
7696   if (assign == 0)
7697     return x;
7698
7699   /* The mode to use for the source is the mode of the assignment, or of
7700      what is inside a possible STRICT_LOW_PART.  */
7701   mode = (GET_CODE (assign) == STRICT_LOW_PART
7702           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
7703
7704   /* Shift OTHER right POS places and make it the source, restricting it
7705      to the proper length and mode.  */
7706
7707   src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
7708                                              GET_MODE (src), other, pos),
7709                        mode,
7710                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
7711                        ? ~(unsigned HOST_WIDE_INT) 0
7712                        : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
7713                        dest, 0);
7714
7715   return gen_rtx_SET (VOIDmode, assign, src);
7716 }
7717 \f
7718 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
7719    if so.  */
7720
7721 static rtx
7722 apply_distributive_law (x)
7723      rtx x;
7724 {
7725   enum rtx_code code = GET_CODE (x);
7726   rtx lhs, rhs, other;
7727   rtx tem;
7728   enum rtx_code inner_code;
7729
7730   /* Distributivity is not true for floating point.
7731      It can change the value.  So don't do it.
7732      -- rms and moshier@world.std.com.  */
7733   if (FLOAT_MODE_P (GET_MODE (x)))
7734     return x;
7735
7736   /* The outer operation can only be one of the following:  */
7737   if (code != IOR && code != AND && code != XOR
7738       && code != PLUS && code != MINUS)
7739     return x;
7740
7741   lhs = XEXP (x, 0), rhs = XEXP (x, 1);
7742
7743   /* If either operand is a primitive we can't do anything, so get out
7744      fast.  */
7745   if (GET_RTX_CLASS (GET_CODE (lhs)) == 'o'
7746       || GET_RTX_CLASS (GET_CODE (rhs)) == 'o')
7747     return x;
7748
7749   lhs = expand_compound_operation (lhs);
7750   rhs = expand_compound_operation (rhs);
7751   inner_code = GET_CODE (lhs);
7752   if (inner_code != GET_CODE (rhs))
7753     return x;
7754
7755   /* See if the inner and outer operations distribute.  */
7756   switch (inner_code)
7757     {
7758     case LSHIFTRT:
7759     case ASHIFTRT:
7760     case AND:
7761     case IOR:
7762       /* These all distribute except over PLUS.  */
7763       if (code == PLUS || code == MINUS)
7764         return x;
7765       break;
7766
7767     case MULT:
7768       if (code != PLUS && code != MINUS)
7769         return x;
7770       break;
7771
7772     case ASHIFT:
7773       /* This is also a multiply, so it distributes over everything.  */
7774       break;
7775
7776     case SUBREG:
7777       /* Non-paradoxical SUBREGs distributes over all operations, provided
7778          the inner modes and byte offsets are the same, this is an extraction
7779          of a low-order part, we don't convert an fp operation to int or
7780          vice versa, and we would not be converting a single-word
7781          operation into a multi-word operation.  The latter test is not
7782          required, but it prevents generating unneeded multi-word operations.
7783          Some of the previous tests are redundant given the latter test, but
7784          are retained because they are required for correctness.
7785
7786          We produce the result slightly differently in this case.  */
7787
7788       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
7789           || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
7790           || ! subreg_lowpart_p (lhs)
7791           || (GET_MODE_CLASS (GET_MODE (lhs))
7792               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
7793           || (GET_MODE_SIZE (GET_MODE (lhs))
7794               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
7795           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
7796         return x;
7797
7798       tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
7799                         SUBREG_REG (lhs), SUBREG_REG (rhs));
7800       return gen_lowpart_for_combine (GET_MODE (x), tem);
7801
7802     default:
7803       return x;
7804     }
7805
7806   /* Set LHS and RHS to the inner operands (A and B in the example
7807      above) and set OTHER to the common operand (C in the example).
7808      These is only one way to do this unless the inner operation is
7809      commutative.  */
7810   if (GET_RTX_CLASS (inner_code) == 'c'
7811       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
7812     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
7813   else if (GET_RTX_CLASS (inner_code) == 'c'
7814            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
7815     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
7816   else if (GET_RTX_CLASS (inner_code) == 'c'
7817            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
7818     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
7819   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
7820     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
7821   else
7822     return x;
7823
7824   /* Form the new inner operation, seeing if it simplifies first.  */
7825   tem = gen_binary (code, GET_MODE (x), lhs, rhs);
7826
7827   /* There is one exception to the general way of distributing:
7828      (a ^ b) | (a ^ c) -> (~a) & (b ^ c)  */
7829   if (code == XOR && inner_code == IOR)
7830     {
7831       inner_code = AND;
7832       other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
7833     }
7834
7835   /* We may be able to continuing distributing the result, so call
7836      ourselves recursively on the inner operation before forming the
7837      outer operation, which we return.  */
7838   return gen_binary (inner_code, GET_MODE (x),
7839                      apply_distributive_law (tem), other);
7840 }
7841 \f
7842 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
7843    in MODE.
7844
7845    Return an equivalent form, if different from X.  Otherwise, return X.  If
7846    X is zero, we are to always construct the equivalent form.  */
7847
7848 static rtx
7849 simplify_and_const_int (x, mode, varop, constop)
7850      rtx x;
7851      enum machine_mode mode;
7852      rtx varop;
7853      unsigned HOST_WIDE_INT constop;
7854 {
7855   unsigned HOST_WIDE_INT nonzero;
7856   int i;
7857
7858   /* Simplify VAROP knowing that we will be only looking at some of the
7859      bits in it.
7860
7861      Note by passing in CONSTOP, we guarantee that the bits not set in
7862      CONSTOP are not significant and will never be examined.  We must
7863      ensure that is the case by explicitly masking out those bits
7864      before returning.  */
7865   varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
7866
7867   /* If VAROP is a CLOBBER, we will fail so return it.  */
7868   if (GET_CODE (varop) == CLOBBER)
7869     return varop;
7870
7871   /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
7872      to VAROP and return the new constant.  */
7873   if (GET_CODE (varop) == CONST_INT)
7874     return GEN_INT (trunc_int_for_mode (INTVAL (varop) & constop, mode));
7875
7876   /* See what bits may be nonzero in VAROP.  Unlike the general case of
7877      a call to nonzero_bits, here we don't care about bits outside
7878      MODE.  */
7879
7880   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
7881
7882   /* Turn off all bits in the constant that are known to already be zero.
7883      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
7884      which is tested below.  */
7885
7886   constop &= nonzero;
7887
7888   /* If we don't have any bits left, return zero.  */
7889   if (constop == 0)
7890     return const0_rtx;
7891
7892   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
7893      a power of two, we can replace this with an ASHIFT.  */
7894   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
7895       && (i = exact_log2 (constop)) >= 0)
7896     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
7897
7898   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
7899      or XOR, then try to apply the distributive law.  This may eliminate
7900      operations if either branch can be simplified because of the AND.
7901      It may also make some cases more complex, but those cases probably
7902      won't match a pattern either with or without this.  */
7903
7904   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
7905     return
7906       gen_lowpart_for_combine
7907         (mode,
7908          apply_distributive_law
7909          (gen_binary (GET_CODE (varop), GET_MODE (varop),
7910                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7911                                               XEXP (varop, 0), constop),
7912                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7913                                               XEXP (varop, 1), constop))));
7914
7915   /* If VAROP is PLUS, and the constant is a mask of low bite, distribute
7916      the AND and see if one of the operands simplifies to zero.  If so, we
7917      may eliminate it.  */
7918
7919   if (GET_CODE (varop) == PLUS
7920       && exact_log2 (constop + 1) >= 0)
7921     {
7922       rtx o0, o1;
7923
7924       o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
7925       o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
7926       if (o0 == const0_rtx)
7927         return o1;
7928       if (o1 == const0_rtx)
7929         return o0;
7930     }
7931
7932   /* Get VAROP in MODE.  Try to get a SUBREG if not.  Don't make a new SUBREG
7933      if we already had one (just check for the simplest cases).  */
7934   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
7935       && GET_MODE (XEXP (x, 0)) == mode
7936       && SUBREG_REG (XEXP (x, 0)) == varop)
7937     varop = XEXP (x, 0);
7938   else
7939     varop = gen_lowpart_for_combine (mode, varop);
7940
7941   /* If we can't make the SUBREG, try to return what we were given.  */
7942   if (GET_CODE (varop) == CLOBBER)
7943     return x ? x : varop;
7944
7945   /* If we are only masking insignificant bits, return VAROP.  */
7946   if (constop == nonzero)
7947     x = varop;
7948   else
7949     {
7950       /* Otherwise, return an AND.  */
7951       constop = trunc_int_for_mode (constop, mode);
7952       /* See how much, if any, of X we can use.  */
7953       if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
7954         x = gen_binary (AND, mode, varop, GEN_INT (constop));
7955
7956       else
7957         {
7958           if (GET_CODE (XEXP (x, 1)) != CONST_INT
7959               || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop)
7960             SUBST (XEXP (x, 1), GEN_INT (constop));
7961
7962           SUBST (XEXP (x, 0), varop);
7963         }
7964     }
7965
7966   return x;
7967 }
7968 \f
7969 /* We let num_sign_bit_copies recur into nonzero_bits as that is useful.
7970    We don't let nonzero_bits recur into num_sign_bit_copies, because that
7971    is less useful.  We can't allow both, because that results in exponential
7972    run time recursion.  There is a nullstone testcase that triggered
7973    this.  This macro avoids accidental uses of num_sign_bit_copies.  */
7974 #define num_sign_bit_copies()
7975
7976 /* Given an expression, X, compute which bits in X can be non-zero.
7977    We don't care about bits outside of those defined in MODE.
7978
7979    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
7980    a shift, AND, or zero_extract, we can do better.  */
7981
7982 static unsigned HOST_WIDE_INT
7983 nonzero_bits (x, mode)
7984      rtx x;
7985      enum machine_mode mode;
7986 {
7987   unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode);
7988   unsigned HOST_WIDE_INT inner_nz;
7989   enum rtx_code code;
7990   unsigned int mode_width = GET_MODE_BITSIZE (mode);
7991   rtx tem;
7992
7993   /* For floating-point values, assume all bits are needed.  */
7994   if (FLOAT_MODE_P (GET_MODE (x)) || FLOAT_MODE_P (mode))
7995     return nonzero;
7996
7997   /* If X is wider than MODE, use its mode instead.  */
7998   if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
7999     {
8000       mode = GET_MODE (x);
8001       nonzero = GET_MODE_MASK (mode);
8002       mode_width = GET_MODE_BITSIZE (mode);
8003     }
8004
8005   if (mode_width > HOST_BITS_PER_WIDE_INT)
8006     /* Our only callers in this case look for single bit values.  So
8007        just return the mode mask.  Those tests will then be false.  */
8008     return nonzero;
8009
8010 #ifndef WORD_REGISTER_OPERATIONS
8011   /* If MODE is wider than X, but both are a single word for both the host
8012      and target machines, we can compute this from which bits of the
8013      object might be nonzero in its own mode, taking into account the fact
8014      that on many CISC machines, accessing an object in a wider mode
8015      causes the high-order bits to become undefined.  So they are
8016      not known to be zero.  */
8017
8018   if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode
8019       && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD
8020       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
8021       && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x)))
8022     {
8023       nonzero &= nonzero_bits (x, GET_MODE (x));
8024       nonzero |= GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x));
8025       return nonzero;
8026     }
8027 #endif
8028
8029   code = GET_CODE (x);
8030   switch (code)
8031     {
8032     case REG:
8033 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
8034       /* If pointers extend unsigned and this is a pointer in Pmode, say that
8035          all the bits above ptr_mode are known to be zero.  */
8036       if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
8037           && REG_POINTER (x))
8038         nonzero &= GET_MODE_MASK (ptr_mode);
8039 #endif
8040
8041       /* Include declared information about alignment of pointers.  */
8042       /* ??? We don't properly preserve REG_POINTER changes across
8043          pointer-to-integer casts, so we can't trust it except for
8044          things that we know must be pointers.  See execute/960116-1.c.  */
8045       if ((x == stack_pointer_rtx
8046            || x == frame_pointer_rtx
8047            || x == arg_pointer_rtx)
8048           && REGNO_POINTER_ALIGN (REGNO (x)))
8049         {
8050           unsigned HOST_WIDE_INT alignment
8051             = REGNO_POINTER_ALIGN (REGNO (x)) / BITS_PER_UNIT;
8052
8053 #ifdef PUSH_ROUNDING
8054           /* If PUSH_ROUNDING is defined, it is possible for the
8055              stack to be momentarily aligned only to that amount,
8056              so we pick the least alignment.  */
8057           if (x == stack_pointer_rtx && PUSH_ARGS)
8058             alignment = MIN (PUSH_ROUNDING (1), alignment);
8059 #endif
8060
8061           nonzero &= ~(alignment - 1);
8062         }
8063
8064       /* If X is a register whose nonzero bits value is current, use it.
8065          Otherwise, if X is a register whose value we can find, use that
8066          value.  Otherwise, use the previously-computed global nonzero bits
8067          for this register.  */
8068
8069       if (reg_last_set_value[REGNO (x)] != 0
8070           && (reg_last_set_mode[REGNO (x)] == mode
8071               || (GET_MODE_CLASS (reg_last_set_mode[REGNO (x)]) == MODE_INT
8072                   && GET_MODE_CLASS (mode) == MODE_INT))
8073           && (reg_last_set_label[REGNO (x)] == label_tick
8074               || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8075                   && REG_N_SETS (REGNO (x)) == 1
8076                   && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
8077                                         REGNO (x))))
8078           && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
8079         return reg_last_set_nonzero_bits[REGNO (x)] & nonzero;
8080
8081       tem = get_last_value (x);
8082
8083       if (tem)
8084         {
8085 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
8086           /* If X is narrower than MODE and TEM is a non-negative
8087              constant that would appear negative in the mode of X,
8088              sign-extend it for use in reg_nonzero_bits because some
8089              machines (maybe most) will actually do the sign-extension
8090              and this is the conservative approach.
8091
8092              ??? For 2.5, try to tighten up the MD files in this regard
8093              instead of this kludge.  */
8094
8095           if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width
8096               && GET_CODE (tem) == CONST_INT
8097               && INTVAL (tem) > 0
8098               && 0 != (INTVAL (tem)
8099                        & ((HOST_WIDE_INT) 1
8100                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
8101             tem = GEN_INT (INTVAL (tem)
8102                            | ((HOST_WIDE_INT) (-1)
8103                               << GET_MODE_BITSIZE (GET_MODE (x))));
8104 #endif
8105           return nonzero_bits (tem, mode) & nonzero;
8106         }
8107       else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)])
8108         {
8109           unsigned HOST_WIDE_INT mask = reg_nonzero_bits[REGNO (x)];
8110
8111           if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width)
8112             /* We don't know anything about the upper bits.  */
8113             mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
8114           return nonzero & mask;
8115         }
8116       else
8117         return nonzero;
8118
8119     case CONST_INT:
8120 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
8121       /* If X is negative in MODE, sign-extend the value.  */
8122       if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD
8123           && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1))))
8124         return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width));
8125 #endif
8126
8127       return INTVAL (x);
8128
8129     case MEM:
8130 #ifdef LOAD_EXTEND_OP
8131       /* In many, if not most, RISC machines, reading a byte from memory
8132          zeros the rest of the register.  Noticing that fact saves a lot
8133          of extra zero-extends.  */
8134       if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND)
8135         nonzero &= GET_MODE_MASK (GET_MODE (x));
8136 #endif
8137       break;
8138
8139     case EQ:  case NE:
8140     case UNEQ:  case LTGT:
8141     case GT:  case GTU:  case UNGT:
8142     case LT:  case LTU:  case UNLT:
8143     case GE:  case GEU:  case UNGE:
8144     case LE:  case LEU:  case UNLE:
8145     case UNORDERED: case ORDERED:
8146
8147       /* If this produces an integer result, we know which bits are set.
8148          Code here used to clear bits outside the mode of X, but that is
8149          now done above.  */
8150
8151       if (GET_MODE_CLASS (mode) == MODE_INT
8152           && mode_width <= HOST_BITS_PER_WIDE_INT)
8153         nonzero = STORE_FLAG_VALUE;
8154       break;
8155
8156     case NEG:
8157 #if 0
8158       /* Disabled to avoid exponential mutual recursion between nonzero_bits
8159          and num_sign_bit_copies.  */
8160       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
8161           == GET_MODE_BITSIZE (GET_MODE (x)))
8162         nonzero = 1;
8163 #endif
8164
8165       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
8166         nonzero |= (GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x)));
8167       break;
8168
8169     case ABS:
8170 #if 0
8171       /* Disabled to avoid exponential mutual recursion between nonzero_bits
8172          and num_sign_bit_copies.  */
8173       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
8174           == GET_MODE_BITSIZE (GET_MODE (x)))
8175         nonzero = 1;
8176 #endif
8177       break;
8178
8179     case TRUNCATE:
8180       nonzero &= (nonzero_bits (XEXP (x, 0), mode) & GET_MODE_MASK (mode));
8181       break;
8182
8183     case ZERO_EXTEND:
8184       nonzero &= nonzero_bits (XEXP (x, 0), mode);
8185       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
8186         nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
8187       break;
8188
8189     case SIGN_EXTEND:
8190       /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
8191          Otherwise, show all the bits in the outer mode but not the inner
8192          may be non-zero.  */
8193       inner_nz = nonzero_bits (XEXP (x, 0), mode);
8194       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
8195         {
8196           inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
8197           if (inner_nz
8198               & (((HOST_WIDE_INT) 1
8199                   << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
8200             inner_nz |= (GET_MODE_MASK (mode)
8201                          & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
8202         }
8203
8204       nonzero &= inner_nz;
8205       break;
8206
8207     case AND:
8208       nonzero &= (nonzero_bits (XEXP (x, 0), mode)
8209                   & nonzero_bits (XEXP (x, 1), mode));
8210       break;
8211
8212     case XOR:   case IOR:
8213     case UMIN:  case UMAX:  case SMIN:  case SMAX:
8214       {
8215         unsigned HOST_WIDE_INT nonzero0 = nonzero_bits (XEXP (x, 0), mode);
8216
8217         /* Don't call nonzero_bits for the second time if it cannot change
8218            anything.  */
8219         if ((nonzero & nonzero0) != nonzero)
8220           nonzero &= (nonzero0 | nonzero_bits (XEXP (x, 1), mode));
8221       }
8222       break;
8223
8224     case PLUS:  case MINUS:
8225     case MULT:
8226     case DIV:   case UDIV:
8227     case MOD:   case UMOD:
8228       /* We can apply the rules of arithmetic to compute the number of
8229          high- and low-order zero bits of these operations.  We start by
8230          computing the width (position of the highest-order non-zero bit)
8231          and the number of low-order zero bits for each value.  */
8232       {
8233         unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode);
8234         unsigned HOST_WIDE_INT nz1 = nonzero_bits (XEXP (x, 1), mode);
8235         int width0 = floor_log2 (nz0) + 1;
8236         int width1 = floor_log2 (nz1) + 1;
8237         int low0 = floor_log2 (nz0 & -nz0);
8238         int low1 = floor_log2 (nz1 & -nz1);
8239         HOST_WIDE_INT op0_maybe_minusp
8240           = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
8241         HOST_WIDE_INT op1_maybe_minusp
8242           = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
8243         unsigned int result_width = mode_width;
8244         int result_low = 0;
8245
8246         switch (code)
8247           {
8248           case PLUS:
8249             result_width = MAX (width0, width1) + 1;
8250             result_low = MIN (low0, low1);
8251             break;
8252           case MINUS:
8253             result_low = MIN (low0, low1);
8254             break;
8255           case MULT:
8256             result_width = width0 + width1;
8257             result_low = low0 + low1;
8258             break;
8259           case DIV:
8260             if (width1 == 0)
8261               break;
8262             if (! op0_maybe_minusp && ! op1_maybe_minusp)
8263               result_width = width0;
8264             break;
8265           case UDIV:
8266             if (width1 == 0)
8267               break;
8268             result_width = width0;
8269             break;
8270           case MOD:
8271             if (width1 == 0)
8272               break;
8273             if (! op0_maybe_minusp && ! op1_maybe_minusp)
8274               result_width = MIN (width0, width1);
8275             result_low = MIN (low0, low1);
8276             break;
8277           case UMOD:
8278             if (width1 == 0)
8279               break;
8280             result_width = MIN (width0, width1);
8281             result_low = MIN (low0, low1);
8282             break;
8283           default:
8284             abort ();
8285           }
8286
8287         if (result_width < mode_width)
8288           nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1;
8289
8290         if (result_low > 0)
8291           nonzero &= ~(((HOST_WIDE_INT) 1 << result_low) - 1);
8292
8293 #ifdef POINTERS_EXTEND_UNSIGNED
8294         /* If pointers extend unsigned and this is an addition or subtraction
8295            to a pointer in Pmode, all the bits above ptr_mode are known to be
8296            zero.  */
8297         if (POINTERS_EXTEND_UNSIGNED > 0 && GET_MODE (x) == Pmode
8298             && (code == PLUS || code == MINUS)
8299             && GET_CODE (XEXP (x, 0)) == REG && REG_POINTER (XEXP (x, 0)))
8300           nonzero &= GET_MODE_MASK (ptr_mode);
8301 #endif
8302       }
8303       break;
8304
8305     case ZERO_EXTRACT:
8306       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8307           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
8308         nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
8309       break;
8310
8311     case SUBREG:
8312       /* If this is a SUBREG formed for a promoted variable that has
8313          been zero-extended, we know that at least the high-order bits
8314          are zero, though others might be too.  */
8315
8316       if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x) > 0)
8317         nonzero = (GET_MODE_MASK (GET_MODE (x))
8318                    & nonzero_bits (SUBREG_REG (x), GET_MODE (x)));
8319
8320       /* If the inner mode is a single word for both the host and target
8321          machines, we can compute this from which bits of the inner
8322          object might be nonzero.  */
8323       if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
8324           && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
8325               <= HOST_BITS_PER_WIDE_INT))
8326         {
8327           nonzero &= nonzero_bits (SUBREG_REG (x), mode);
8328
8329 #if defined (WORD_REGISTER_OPERATIONS) && defined (LOAD_EXTEND_OP)
8330           /* If this is a typical RISC machine, we only have to worry
8331              about the way loads are extended.  */
8332           if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
8333               ? (((nonzero
8334                    & (((unsigned HOST_WIDE_INT) 1
8335                        << (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) - 1))))
8336                   != 0))
8337               : LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) != ZERO_EXTEND)
8338 #endif
8339             {
8340               /* On many CISC machines, accessing an object in a wider mode
8341                  causes the high-order bits to become undefined.  So they are
8342                  not known to be zero.  */
8343               if (GET_MODE_SIZE (GET_MODE (x))
8344                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8345                 nonzero |= (GET_MODE_MASK (GET_MODE (x))
8346                             & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
8347             }
8348         }
8349       break;
8350
8351     case ASHIFTRT:
8352     case LSHIFTRT:
8353     case ASHIFT:
8354     case ROTATE:
8355       /* The nonzero bits are in two classes: any bits within MODE
8356          that aren't in GET_MODE (x) are always significant.  The rest of the
8357          nonzero bits are those that are significant in the operand of
8358          the shift when shifted the appropriate number of bits.  This
8359          shows that high-order bits are cleared by the right shift and
8360          low-order bits by left shifts.  */
8361       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8362           && INTVAL (XEXP (x, 1)) >= 0
8363           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
8364         {
8365           enum machine_mode inner_mode = GET_MODE (x);
8366           unsigned int width = GET_MODE_BITSIZE (inner_mode);
8367           int count = INTVAL (XEXP (x, 1));
8368           unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
8369           unsigned HOST_WIDE_INT op_nonzero = nonzero_bits (XEXP (x, 0), mode);
8370           unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask;
8371           unsigned HOST_WIDE_INT outer = 0;
8372
8373           if (mode_width > width)
8374             outer = (op_nonzero & nonzero & ~mode_mask);
8375
8376           if (code == LSHIFTRT)
8377             inner >>= count;
8378           else if (code == ASHIFTRT)
8379             {
8380               inner >>= count;
8381
8382               /* If the sign bit may have been nonzero before the shift, we
8383                  need to mark all the places it could have been copied to
8384                  by the shift as possibly nonzero.  */
8385               if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
8386                 inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
8387             }
8388           else if (code == ASHIFT)
8389             inner <<= count;
8390           else
8391             inner = ((inner << (count % width)
8392                       | (inner >> (width - (count % width)))) & mode_mask);
8393
8394           nonzero &= (outer | inner);
8395         }
8396       break;
8397
8398     case FFS:
8399       /* This is at most the number of bits in the mode.  */
8400       nonzero = ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width) + 1)) - 1;
8401       break;
8402
8403     case IF_THEN_ELSE:
8404       nonzero &= (nonzero_bits (XEXP (x, 1), mode)
8405                   | nonzero_bits (XEXP (x, 2), mode));
8406       break;
8407
8408     default:
8409       break;
8410     }
8411
8412   return nonzero;
8413 }
8414
8415 /* See the macro definition above.  */
8416 #undef num_sign_bit_copies
8417 \f
8418 /* Return the number of bits at the high-order end of X that are known to
8419    be equal to the sign bit.  X will be used in mode MODE; if MODE is
8420    VOIDmode, X will be used in its own mode.  The returned value  will always
8421    be between 1 and the number of bits in MODE.  */
8422
8423 static unsigned int
8424 num_sign_bit_copies (x, mode)
8425      rtx x;
8426      enum machine_mode mode;
8427 {
8428   enum rtx_code code = GET_CODE (x);
8429   unsigned int bitwidth;
8430   int num0, num1, result;
8431   unsigned HOST_WIDE_INT nonzero;
8432   rtx tem;
8433
8434   /* If we weren't given a mode, use the mode of X.  If the mode is still
8435      VOIDmode, we don't know anything.  Likewise if one of the modes is
8436      floating-point.  */
8437
8438   if (mode == VOIDmode)
8439     mode = GET_MODE (x);
8440
8441   if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x)))
8442     return 1;
8443
8444   bitwidth = GET_MODE_BITSIZE (mode);
8445
8446   /* For a smaller object, just ignore the high bits.  */
8447   if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x)))
8448     {
8449       num0 = num_sign_bit_copies (x, GET_MODE (x));
8450       return MAX (1,
8451                   num0 - (int) (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth));
8452     }
8453
8454   if (GET_MODE (x) != VOIDmode && bitwidth > GET_MODE_BITSIZE (GET_MODE (x)))
8455     {
8456 #ifndef WORD_REGISTER_OPERATIONS
8457   /* If this machine does not do all register operations on the entire
8458      register and MODE is wider than the mode of X, we can say nothing
8459      at all about the high-order bits.  */
8460       return 1;
8461 #else
8462       /* Likewise on machines that do, if the mode of the object is smaller
8463          than a word and loads of that size don't sign extend, we can say
8464          nothing about the high order bits.  */
8465       if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
8466 #ifdef LOAD_EXTEND_OP
8467           && LOAD_EXTEND_OP (GET_MODE (x)) != SIGN_EXTEND
8468 #endif
8469           )
8470         return 1;
8471 #endif
8472     }
8473
8474   switch (code)
8475     {
8476     case REG:
8477
8478 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
8479       /* If pointers extend signed and this is a pointer in Pmode, say that
8480          all the bits above ptr_mode are known to be sign bit copies.  */
8481       if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode
8482           && REG_POINTER (x))
8483         return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1;
8484 #endif
8485
8486       if (reg_last_set_value[REGNO (x)] != 0
8487           && reg_last_set_mode[REGNO (x)] == mode
8488           && (reg_last_set_label[REGNO (x)] == label_tick
8489               || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8490                   && REG_N_SETS (REGNO (x)) == 1
8491                   && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
8492                                         REGNO (x))))
8493           && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
8494         return reg_last_set_sign_bit_copies[REGNO (x)];
8495
8496       tem = get_last_value (x);
8497       if (tem != 0)
8498         return num_sign_bit_copies (tem, mode);
8499
8500       if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0
8501           && GET_MODE_BITSIZE (GET_MODE (x)) == bitwidth)
8502         return reg_sign_bit_copies[REGNO (x)];
8503       break;
8504
8505     case MEM:
8506 #ifdef LOAD_EXTEND_OP
8507       /* Some RISC machines sign-extend all loads of smaller than a word.  */
8508       if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND)
8509         return MAX (1, ((int) bitwidth
8510                         - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1));
8511 #endif
8512       break;
8513
8514     case CONST_INT:
8515       /* If the constant is negative, take its 1's complement and remask.
8516          Then see how many zero bits we have.  */
8517       nonzero = INTVAL (x) & GET_MODE_MASK (mode);
8518       if (bitwidth <= HOST_BITS_PER_WIDE_INT
8519           && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8520         nonzero = (~nonzero) & GET_MODE_MASK (mode);
8521
8522       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
8523
8524     case SUBREG:
8525       /* If this is a SUBREG for a promoted object that is sign-extended
8526          and we are looking at it in a wider mode, we know that at least the
8527          high-order bits are known to be sign bit copies.  */
8528
8529       if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x))
8530         {
8531           num0 = num_sign_bit_copies (SUBREG_REG (x), mode);
8532           return MAX ((int) bitwidth
8533                       - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1,
8534                       num0);
8535         }
8536
8537       /* For a smaller object, just ignore the high bits.  */
8538       if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
8539         {
8540           num0 = num_sign_bit_copies (SUBREG_REG (x), VOIDmode);
8541           return MAX (1, (num0
8542                           - (int) (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
8543                                    - bitwidth)));
8544         }
8545
8546 #ifdef WORD_REGISTER_OPERATIONS
8547 #ifdef LOAD_EXTEND_OP
8548       /* For paradoxical SUBREGs on machines where all register operations
8549          affect the entire register, just look inside.  Note that we are
8550          passing MODE to the recursive call, so the number of sign bit copies
8551          will remain relative to that mode, not the inner mode.  */
8552
8553       /* This works only if loads sign extend.  Otherwise, if we get a
8554          reload for the inner part, it may be loaded from the stack, and
8555          then we lose all sign bit copies that existed before the store
8556          to the stack.  */
8557
8558       if ((GET_MODE_SIZE (GET_MODE (x))
8559            > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8560           && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND)
8561         return num_sign_bit_copies (SUBREG_REG (x), mode);
8562 #endif
8563 #endif
8564       break;
8565
8566     case SIGN_EXTRACT:
8567       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
8568         return MAX (1, (int) bitwidth - INTVAL (XEXP (x, 1)));
8569       break;
8570
8571     case SIGN_EXTEND:
8572       return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8573               + num_sign_bit_copies (XEXP (x, 0), VOIDmode));
8574
8575     case TRUNCATE:
8576       /* For a smaller object, just ignore the high bits.  */
8577       num0 = num_sign_bit_copies (XEXP (x, 0), VOIDmode);
8578       return MAX (1, (num0 - (int) (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8579                                     - bitwidth)));
8580
8581     case NOT:
8582       return num_sign_bit_copies (XEXP (x, 0), mode);
8583
8584     case ROTATE:       case ROTATERT:
8585       /* If we are rotating left by a number of bits less than the number
8586          of sign bit copies, we can just subtract that amount from the
8587          number.  */
8588       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8589           && INTVAL (XEXP (x, 1)) >= 0
8590           && INTVAL (XEXP (x, 1)) < (int) bitwidth)
8591         {
8592           num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8593           return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
8594                                  : (int) bitwidth - INTVAL (XEXP (x, 1))));
8595         }
8596       break;
8597
8598     case NEG:
8599       /* In general, this subtracts one sign bit copy.  But if the value
8600          is known to be positive, the number of sign bit copies is the
8601          same as that of the input.  Finally, if the input has just one bit
8602          that might be nonzero, all the bits are copies of the sign bit.  */
8603       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8604       if (bitwidth > HOST_BITS_PER_WIDE_INT)
8605         return num0 > 1 ? num0 - 1 : 1;
8606
8607       nonzero = nonzero_bits (XEXP (x, 0), mode);
8608       if (nonzero == 1)
8609         return bitwidth;
8610
8611       if (num0 > 1
8612           && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero))
8613         num0--;
8614
8615       return num0;
8616
8617     case IOR:   case AND:   case XOR:
8618     case SMIN:  case SMAX:  case UMIN:  case UMAX:
8619       /* Logical operations will preserve the number of sign-bit copies.
8620          MIN and MAX operations always return one of the operands.  */
8621       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8622       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8623       return MIN (num0, num1);
8624
8625     case PLUS:  case MINUS:
8626       /* For addition and subtraction, we can have a 1-bit carry.  However,
8627          if we are subtracting 1 from a positive number, there will not
8628          be such a carry.  Furthermore, if the positive number is known to
8629          be 0 or 1, we know the result is either -1 or 0.  */
8630
8631       if (code == PLUS && XEXP (x, 1) == constm1_rtx
8632           && bitwidth <= HOST_BITS_PER_WIDE_INT)
8633         {
8634           nonzero = nonzero_bits (XEXP (x, 0), mode);
8635           if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0)
8636             return (nonzero == 1 || nonzero == 0 ? bitwidth
8637                     : bitwidth - floor_log2 (nonzero) - 1);
8638         }
8639
8640       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8641       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8642       result = MAX (1, MIN (num0, num1) - 1);
8643
8644 #ifdef POINTERS_EXTEND_UNSIGNED
8645       /* If pointers extend signed and this is an addition or subtraction
8646          to a pointer in Pmode, all the bits above ptr_mode are known to be
8647          sign bit copies.  */
8648       if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
8649           && (code == PLUS || code == MINUS)
8650           && GET_CODE (XEXP (x, 0)) == REG && REG_POINTER (XEXP (x, 0)))
8651         result = MAX ((int) (GET_MODE_BITSIZE (Pmode)
8652                              - GET_MODE_BITSIZE (ptr_mode) + 1),
8653                       result);
8654 #endif
8655       return result;
8656
8657     case MULT:
8658       /* The number of bits of the product is the sum of the number of
8659          bits of both terms.  However, unless one of the terms if known
8660          to be positive, we must allow for an additional bit since negating
8661          a negative number can remove one sign bit copy.  */
8662
8663       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8664       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8665
8666       result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
8667       if (result > 0
8668           && (bitwidth > HOST_BITS_PER_WIDE_INT
8669               || (((nonzero_bits (XEXP (x, 0), mode)
8670                     & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8671                   && ((nonzero_bits (XEXP (x, 1), mode)
8672                        & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))))
8673         result--;
8674
8675       return MAX (1, result);
8676
8677     case UDIV:
8678       /* The result must be <= the first operand.  If the first operand
8679          has the high bit set, we know nothing about the number of sign
8680          bit copies.  */
8681       if (bitwidth > HOST_BITS_PER_WIDE_INT)
8682         return 1;
8683       else if ((nonzero_bits (XEXP (x, 0), mode)
8684                 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8685         return 1;
8686       else
8687         return num_sign_bit_copies (XEXP (x, 0), mode);
8688
8689     case UMOD:
8690       /* The result must be <= the second operand.  */
8691       return num_sign_bit_copies (XEXP (x, 1), mode);
8692
8693     case DIV:
8694       /* Similar to unsigned division, except that we have to worry about
8695          the case where the divisor is negative, in which case we have
8696          to add 1.  */
8697       result = num_sign_bit_copies (XEXP (x, 0), mode);
8698       if (result > 1
8699           && (bitwidth > HOST_BITS_PER_WIDE_INT
8700               || (nonzero_bits (XEXP (x, 1), mode)
8701                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8702         result--;
8703
8704       return result;
8705
8706     case MOD:
8707       result = num_sign_bit_copies (XEXP (x, 1), mode);
8708       if (result > 1
8709           && (bitwidth > HOST_BITS_PER_WIDE_INT
8710               || (nonzero_bits (XEXP (x, 1), mode)
8711                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8712         result--;
8713
8714       return result;
8715
8716     case ASHIFTRT:
8717       /* Shifts by a constant add to the number of bits equal to the
8718          sign bit.  */
8719       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8720       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8721           && INTVAL (XEXP (x, 1)) > 0)
8722         num0 = MIN ((int) bitwidth, num0 + INTVAL (XEXP (x, 1)));
8723
8724       return num0;
8725
8726     case ASHIFT:
8727       /* Left shifts destroy copies.  */
8728       if (GET_CODE (XEXP (x, 1)) != CONST_INT
8729           || INTVAL (XEXP (x, 1)) < 0
8730           || INTVAL (XEXP (x, 1)) >= (int) bitwidth)
8731         return 1;
8732
8733       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8734       return MAX (1, num0 - INTVAL (XEXP (x, 1)));
8735
8736     case IF_THEN_ELSE:
8737       num0 = num_sign_bit_copies (XEXP (x, 1), mode);
8738       num1 = num_sign_bit_copies (XEXP (x, 2), mode);
8739       return MIN (num0, num1);
8740
8741     case EQ:  case NE:  case GE:  case GT:  case LE:  case LT:
8742     case UNEQ:  case LTGT:  case UNGE:  case UNGT:  case UNLE:  case UNLT:
8743     case GEU: case GTU: case LEU: case LTU:
8744     case UNORDERED: case ORDERED:
8745       /* If the constant is negative, take its 1's complement and remask.
8746          Then see how many zero bits we have.  */
8747       nonzero = STORE_FLAG_VALUE;
8748       if (bitwidth <= HOST_BITS_PER_WIDE_INT
8749           && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8750         nonzero = (~nonzero) & GET_MODE_MASK (mode);
8751
8752       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
8753       break;
8754
8755     default:
8756       break;
8757     }
8758
8759   /* If we haven't been able to figure it out by one of the above rules,
8760      see if some of the high-order bits are known to be zero.  If so,
8761      count those bits and return one less than that amount.  If we can't
8762      safely compute the mask for this mode, always return BITWIDTH.  */
8763
8764   if (bitwidth > HOST_BITS_PER_WIDE_INT)
8765     return 1;
8766
8767   nonzero = nonzero_bits (x, mode);
8768   return (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))
8769           ? 1 : bitwidth - floor_log2 (nonzero) - 1);
8770 }
8771 \f
8772 /* Return the number of "extended" bits there are in X, when interpreted
8773    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
8774    unsigned quantities, this is the number of high-order zero bits.
8775    For signed quantities, this is the number of copies of the sign bit
8776    minus 1.  In both case, this function returns the number of "spare"
8777    bits.  For example, if two quantities for which this function returns
8778    at least 1 are added, the addition is known not to overflow.
8779
8780    This function will always return 0 unless called during combine, which
8781    implies that it must be called from a define_split.  */
8782
8783 unsigned int
8784 extended_count (x, mode, unsignedp)
8785      rtx x;
8786      enum machine_mode mode;
8787      int unsignedp;
8788 {
8789   if (nonzero_sign_valid == 0)
8790     return 0;
8791
8792   return (unsignedp
8793           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8794              ? (GET_MODE_BITSIZE (mode) - 1
8795                 - floor_log2 (nonzero_bits (x, mode)))
8796              : 0)
8797           : num_sign_bit_copies (x, mode) - 1);
8798 }
8799 \f
8800 /* This function is called from `simplify_shift_const' to merge two
8801    outer operations.  Specifically, we have already found that we need
8802    to perform operation *POP0 with constant *PCONST0 at the outermost
8803    position.  We would now like to also perform OP1 with constant CONST1
8804    (with *POP0 being done last).
8805
8806    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
8807    the resulting operation.  *PCOMP_P is set to 1 if we would need to
8808    complement the innermost operand, otherwise it is unchanged.
8809
8810    MODE is the mode in which the operation will be done.  No bits outside
8811    the width of this mode matter.  It is assumed that the width of this mode
8812    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
8813
8814    If *POP0 or OP1 are NIL, it means no operation is required.  Only NEG, PLUS,
8815    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
8816    result is simply *PCONST0.
8817
8818    If the resulting operation cannot be expressed as one operation, we
8819    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
8820
8821 static int
8822 merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p)
8823      enum rtx_code *pop0;
8824      HOST_WIDE_INT *pconst0;
8825      enum rtx_code op1;
8826      HOST_WIDE_INT const1;
8827      enum machine_mode mode;
8828      int *pcomp_p;
8829 {
8830   enum rtx_code op0 = *pop0;
8831   HOST_WIDE_INT const0 = *pconst0;
8832
8833   const0 &= GET_MODE_MASK (mode);
8834   const1 &= GET_MODE_MASK (mode);
8835
8836   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
8837   if (op0 == AND)
8838     const1 &= const0;
8839
8840   /* If OP0 or OP1 is NIL, this is easy.  Similarly if they are the same or
8841      if OP0 is SET.  */
8842
8843   if (op1 == NIL || op0 == SET)
8844     return 1;
8845
8846   else if (op0 == NIL)
8847     op0 = op1, const0 = const1;
8848
8849   else if (op0 == op1)
8850     {
8851       switch (op0)
8852         {
8853         case AND:
8854           const0 &= const1;
8855           break;
8856         case IOR:
8857           const0 |= const1;
8858           break;
8859         case XOR:
8860           const0 ^= const1;
8861           break;
8862         case PLUS:
8863           const0 += const1;
8864           break;
8865         case NEG:
8866           op0 = NIL;
8867           break;
8868         default:
8869           break;
8870         }
8871     }
8872
8873   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
8874   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
8875     return 0;
8876
8877   /* If the two constants aren't the same, we can't do anything.  The
8878      remaining six cases can all be done.  */
8879   else if (const0 != const1)
8880     return 0;
8881
8882   else
8883     switch (op0)
8884       {
8885       case IOR:
8886         if (op1 == AND)
8887           /* (a & b) | b == b */
8888           op0 = SET;
8889         else /* op1 == XOR */
8890           /* (a ^ b) | b == a | b */
8891           {;}
8892         break;
8893
8894       case XOR:
8895         if (op1 == AND)
8896           /* (a & b) ^ b == (~a) & b */
8897           op0 = AND, *pcomp_p = 1;
8898         else /* op1 == IOR */
8899           /* (a | b) ^ b == a & ~b */
8900           op0 = AND, *pconst0 = ~const0;
8901         break;
8902
8903       case AND:
8904         if (op1 == IOR)
8905           /* (a | b) & b == b */
8906         op0 = SET;
8907         else /* op1 == XOR */
8908           /* (a ^ b) & b) == (~a) & b */
8909           *pcomp_p = 1;
8910         break;
8911       default:
8912         break;
8913       }
8914
8915   /* Check for NO-OP cases.  */
8916   const0 &= GET_MODE_MASK (mode);
8917   if (const0 == 0
8918       && (op0 == IOR || op0 == XOR || op0 == PLUS))
8919     op0 = NIL;
8920   else if (const0 == 0 && op0 == AND)
8921     op0 = SET;
8922   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
8923            && op0 == AND)
8924     op0 = NIL;
8925
8926   /* ??? Slightly redundant with the above mask, but not entirely.
8927      Moving this above means we'd have to sign-extend the mode mask
8928      for the final test.  */
8929   const0 = trunc_int_for_mode (const0, mode);
8930
8931   *pop0 = op0;
8932   *pconst0 = const0;
8933
8934   return 1;
8935 }
8936 \f
8937 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
8938    The result of the shift is RESULT_MODE.  X, if non-zero, is an expression
8939    that we started with.
8940
8941    The shift is normally computed in the widest mode we find in VAROP, as
8942    long as it isn't a different number of words than RESULT_MODE.  Exceptions
8943    are ASHIFTRT and ROTATE, which are always done in their original mode,  */
8944
8945 static rtx
8946 simplify_shift_const (x, code, result_mode, varop, orig_count)
8947      rtx x;
8948      enum rtx_code code;
8949      enum machine_mode result_mode;
8950      rtx varop;
8951      int orig_count;
8952 {
8953   enum rtx_code orig_code = code;
8954   unsigned int count;
8955   int signed_count;
8956   enum machine_mode mode = result_mode;
8957   enum machine_mode shift_mode, tmode;
8958   unsigned int mode_words
8959     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
8960   /* We form (outer_op (code varop count) (outer_const)).  */
8961   enum rtx_code outer_op = NIL;
8962   HOST_WIDE_INT outer_const = 0;
8963   rtx const_rtx;
8964   int complement_p = 0;
8965   rtx new;
8966
8967   /* Make sure and truncate the "natural" shift on the way in.  We don't
8968      want to do this inside the loop as it makes it more difficult to
8969      combine shifts.  */
8970 #ifdef SHIFT_COUNT_TRUNCATED
8971   if (SHIFT_COUNT_TRUNCATED)
8972     orig_count &= GET_MODE_BITSIZE (mode) - 1;
8973 #endif
8974
8975   /* If we were given an invalid count, don't do anything except exactly
8976      what was requested.  */
8977
8978   if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
8979     {
8980       if (x)
8981         return x;
8982
8983       return gen_rtx_fmt_ee (code, mode, varop, GEN_INT (orig_count));
8984     }
8985
8986   count = orig_count;
8987
8988   /* Unless one of the branches of the `if' in this loop does a `continue',
8989      we will `break' the loop after the `if'.  */
8990
8991   while (count != 0)
8992     {
8993       /* If we have an operand of (clobber (const_int 0)), just return that
8994          value.  */
8995       if (GET_CODE (varop) == CLOBBER)
8996         return varop;
8997
8998       /* If we discovered we had to complement VAROP, leave.  Making a NOT
8999          here would cause an infinite loop.  */
9000       if (complement_p)
9001         break;
9002
9003       /* Convert ROTATERT to ROTATE.  */
9004       if (code == ROTATERT)
9005         code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count;
9006
9007       /* We need to determine what mode we will do the shift in.  If the
9008          shift is a right shift or a ROTATE, we must always do it in the mode
9009          it was originally done in.  Otherwise, we can do it in MODE, the
9010          widest mode encountered.  */
9011       shift_mode
9012         = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9013            ? result_mode : mode);
9014
9015       /* Handle cases where the count is greater than the size of the mode
9016          minus 1.  For ASHIFT, use the size minus one as the count (this can
9017          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
9018          take the count modulo the size.  For other shifts, the result is
9019          zero.
9020
9021          Since these shifts are being produced by the compiler by combining
9022          multiple operations, each of which are defined, we know what the
9023          result is supposed to be.  */
9024
9025       if (count > GET_MODE_BITSIZE (shift_mode) - 1)
9026         {
9027           if (code == ASHIFTRT)
9028             count = GET_MODE_BITSIZE (shift_mode) - 1;
9029           else if (code == ROTATE || code == ROTATERT)
9030             count %= GET_MODE_BITSIZE (shift_mode);
9031           else
9032             {
9033               /* We can't simply return zero because there may be an
9034                  outer op.  */
9035               varop = const0_rtx;
9036               count = 0;
9037               break;
9038             }
9039         }
9040
9041       /* An arithmetic right shift of a quantity known to be -1 or 0
9042          is a no-op.  */
9043       if (code == ASHIFTRT
9044           && (num_sign_bit_copies (varop, shift_mode)
9045               == GET_MODE_BITSIZE (shift_mode)))
9046         {
9047           count = 0;
9048           break;
9049         }
9050
9051       /* If we are doing an arithmetic right shift and discarding all but
9052          the sign bit copies, this is equivalent to doing a shift by the
9053          bitsize minus one.  Convert it into that shift because it will often
9054          allow other simplifications.  */
9055
9056       if (code == ASHIFTRT
9057           && (count + num_sign_bit_copies (varop, shift_mode)
9058               >= GET_MODE_BITSIZE (shift_mode)))
9059         count = GET_MODE_BITSIZE (shift_mode) - 1;
9060
9061       /* We simplify the tests below and elsewhere by converting
9062          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
9063          `make_compound_operation' will convert it to an ASHIFTRT for
9064          those machines (such as VAX) that don't have an LSHIFTRT.  */
9065       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9066           && code == ASHIFTRT
9067           && ((nonzero_bits (varop, shift_mode)
9068                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
9069               == 0))
9070         code = LSHIFTRT;
9071
9072       switch (GET_CODE (varop))
9073         {
9074         case SIGN_EXTEND:
9075         case ZERO_EXTEND:
9076         case SIGN_EXTRACT:
9077         case ZERO_EXTRACT:
9078           new = expand_compound_operation (varop);
9079           if (new != varop)
9080             {
9081               varop = new;
9082               continue;
9083             }
9084           break;
9085
9086         case MEM:
9087           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
9088              minus the width of a smaller mode, we can do this with a
9089              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
9090           if ((code == ASHIFTRT || code == LSHIFTRT)
9091               && ! mode_dependent_address_p (XEXP (varop, 0))
9092               && ! MEM_VOLATILE_P (varop)
9093               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9094                                          MODE_INT, 1)) != BLKmode)
9095             {
9096               new = adjust_address_nv (varop, tmode,
9097                                        BYTES_BIG_ENDIAN ? 0
9098                                        : count / BITS_PER_UNIT);
9099
9100               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9101                                      : ZERO_EXTEND, mode, new);
9102               count = 0;
9103               continue;
9104             }
9105           break;
9106
9107         case USE:
9108           /* Similar to the case above, except that we can only do this if
9109              the resulting mode is the same as that of the underlying
9110              MEM and adjust the address depending on the *bits* endianness
9111              because of the way that bit-field extract insns are defined.  */
9112           if ((code == ASHIFTRT || code == LSHIFTRT)
9113               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9114                                          MODE_INT, 1)) != BLKmode
9115               && tmode == GET_MODE (XEXP (varop, 0)))
9116             {
9117               if (BITS_BIG_ENDIAN)
9118                 new = XEXP (varop, 0);
9119               else
9120                 {
9121                   new = copy_rtx (XEXP (varop, 0));
9122                   SUBST (XEXP (new, 0),
9123                          plus_constant (XEXP (new, 0),
9124                                         count / BITS_PER_UNIT));
9125                 }
9126
9127               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9128                                      : ZERO_EXTEND, mode, new);
9129               count = 0;
9130               continue;
9131             }
9132           break;
9133
9134         case SUBREG:
9135           /* If VAROP is a SUBREG, strip it as long as the inner operand has
9136              the same number of words as what we've seen so far.  Then store
9137              the widest mode in MODE.  */
9138           if (subreg_lowpart_p (varop)
9139               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9140                   > GET_MODE_SIZE (GET_MODE (varop)))
9141               && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9142                     + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9143                   == mode_words))
9144             {
9145               varop = SUBREG_REG (varop);
9146               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9147                 mode = GET_MODE (varop);
9148               continue;
9149             }
9150           break;
9151
9152         case MULT:
9153           /* Some machines use MULT instead of ASHIFT because MULT
9154              is cheaper.  But it is still better on those machines to
9155              merge two shifts into one.  */
9156           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9157               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9158             {
9159               varop
9160                 = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
9161                               GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
9162               continue;
9163             }
9164           break;
9165
9166         case UDIV:
9167           /* Similar, for when divides are cheaper.  */
9168           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9169               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9170             {
9171               varop
9172                 = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
9173                               GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
9174               continue;
9175             }
9176           break;
9177
9178         case ASHIFTRT:
9179           /* If we are extracting just the sign bit of an arithmetic
9180              right shift, that shift is not needed.  However, the sign
9181              bit of a wider mode may be different from what would be
9182              interpreted as the sign bit in a narrower mode, so, if
9183              the result is narrower, don't discard the shift.  */
9184           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
9185               && (GET_MODE_BITSIZE (result_mode)
9186                   >= GET_MODE_BITSIZE (GET_MODE (varop))))
9187             {
9188               varop = XEXP (varop, 0);
9189               continue;
9190             }
9191
9192           /* ... fall through ...  */
9193
9194         case LSHIFTRT:
9195         case ASHIFT:
9196         case ROTATE:
9197           /* Here we have two nested shifts.  The result is usually the
9198              AND of a new shift with a mask.  We compute the result below.  */
9199           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9200               && INTVAL (XEXP (varop, 1)) >= 0
9201               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
9202               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9203               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
9204             {
9205               enum rtx_code first_code = GET_CODE (varop);
9206               unsigned int first_count = INTVAL (XEXP (varop, 1));
9207               unsigned HOST_WIDE_INT mask;
9208               rtx mask_rtx;
9209
9210               /* We have one common special case.  We can't do any merging if
9211                  the inner code is an ASHIFTRT of a smaller mode.  However, if
9212                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
9213                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
9214                  we can convert it to
9215                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
9216                  This simplifies certain SIGN_EXTEND operations.  */
9217               if (code == ASHIFT && first_code == ASHIFTRT
9218                   && (GET_MODE_BITSIZE (result_mode)
9219                       - GET_MODE_BITSIZE (GET_MODE (varop))) == count)
9220                 {
9221                   /* C3 has the low-order C1 bits zero.  */
9222
9223                   mask = (GET_MODE_MASK (mode)
9224                           & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
9225
9226                   varop = simplify_and_const_int (NULL_RTX, result_mode,
9227                                                   XEXP (varop, 0), mask);
9228                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
9229                                                 varop, count);
9230                   count = first_count;
9231                   code = ASHIFTRT;
9232                   continue;
9233                 }
9234
9235               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
9236                  than C1 high-order bits equal to the sign bit, we can convert
9237                  this to either an ASHIFT or an ASHIFTRT depending on the
9238                  two counts.
9239
9240                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
9241
9242               if (code == ASHIFTRT && first_code == ASHIFT
9243                   && GET_MODE (varop) == shift_mode
9244                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
9245                       > first_count))
9246                 {
9247                   varop = XEXP (varop, 0);
9248
9249                   signed_count = count - first_count;
9250                   if (signed_count < 0)
9251                     count = -signed_count, code = ASHIFT;
9252                   else
9253                     count = signed_count;
9254
9255                   continue;
9256                 }
9257
9258               /* There are some cases we can't do.  If CODE is ASHIFTRT,
9259                  we can only do this if FIRST_CODE is also ASHIFTRT.
9260
9261                  We can't do the case when CODE is ROTATE and FIRST_CODE is
9262                  ASHIFTRT.
9263
9264                  If the mode of this shift is not the mode of the outer shift,
9265                  we can't do this if either shift is a right shift or ROTATE.
9266
9267                  Finally, we can't do any of these if the mode is too wide
9268                  unless the codes are the same.
9269
9270                  Handle the case where the shift codes are the same
9271                  first.  */
9272
9273               if (code == first_code)
9274                 {
9275                   if (GET_MODE (varop) != result_mode
9276                       && (code == ASHIFTRT || code == LSHIFTRT
9277                           || code == ROTATE))
9278                     break;
9279
9280                   count += first_count;
9281                   varop = XEXP (varop, 0);
9282                   continue;
9283                 }
9284
9285               if (code == ASHIFTRT
9286                   || (code == ROTATE && first_code == ASHIFTRT)
9287                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
9288                   || (GET_MODE (varop) != result_mode
9289                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
9290                           || first_code == ROTATE
9291                           || code == ROTATE)))
9292                 break;
9293
9294               /* To compute the mask to apply after the shift, shift the
9295                  nonzero bits of the inner shift the same way the
9296                  outer shift will.  */
9297
9298               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
9299
9300               mask_rtx
9301                 = simplify_binary_operation (code, result_mode, mask_rtx,
9302                                              GEN_INT (count));
9303
9304               /* Give up if we can't compute an outer operation to use.  */
9305               if (mask_rtx == 0
9306                   || GET_CODE (mask_rtx) != CONST_INT
9307                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
9308                                         INTVAL (mask_rtx),
9309                                         result_mode, &complement_p))
9310                 break;
9311
9312               /* If the shifts are in the same direction, we add the
9313                  counts.  Otherwise, we subtract them.  */
9314               signed_count = count;
9315               if ((code == ASHIFTRT || code == LSHIFTRT)
9316                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
9317                 signed_count += first_count;
9318               else
9319                 signed_count -= first_count;
9320
9321               /* If COUNT is positive, the new shift is usually CODE,
9322                  except for the two exceptions below, in which case it is
9323                  FIRST_CODE.  If the count is negative, FIRST_CODE should
9324                  always be used  */
9325               if (signed_count > 0
9326                   && ((first_code == ROTATE && code == ASHIFT)
9327                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
9328                 code = first_code, count = signed_count;
9329               else if (signed_count < 0)
9330                 code = first_code, count = -signed_count;
9331               else
9332                 count = signed_count;
9333
9334               varop = XEXP (varop, 0);
9335               continue;
9336             }
9337
9338           /* If we have (A << B << C) for any shift, we can convert this to
9339              (A << C << B).  This wins if A is a constant.  Only try this if
9340              B is not a constant.  */
9341
9342           else if (GET_CODE (varop) == code
9343                    && GET_CODE (XEXP (varop, 1)) != CONST_INT
9344                    && 0 != (new
9345                             = simplify_binary_operation (code, mode,
9346                                                          XEXP (varop, 0),
9347                                                          GEN_INT (count))))
9348             {
9349               varop = gen_rtx_fmt_ee (code, mode, new, XEXP (varop, 1));
9350               count = 0;
9351               continue;
9352             }
9353           break;
9354
9355         case NOT:
9356           /* Make this fit the case below.  */
9357           varop = gen_rtx_XOR (mode, XEXP (varop, 0),
9358                                GEN_INT (GET_MODE_MASK (mode)));
9359           continue;
9360
9361         case IOR:
9362         case AND:
9363         case XOR:
9364           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
9365              with C the size of VAROP - 1 and the shift is logical if
9366              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9367              we have an (le X 0) operation.   If we have an arithmetic shift
9368              and STORE_FLAG_VALUE is 1 or we have a logical shift with
9369              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
9370
9371           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
9372               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
9373               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9374               && (code == LSHIFTRT || code == ASHIFTRT)
9375               && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
9376               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9377             {
9378               count = 0;
9379               varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
9380                                   const0_rtx);
9381
9382               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9383                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9384
9385               continue;
9386             }
9387
9388           /* If we have (shift (logical)), move the logical to the outside
9389              to allow it to possibly combine with another logical and the
9390              shift to combine with another shift.  This also canonicalizes to
9391              what a ZERO_EXTRACT looks like.  Also, some machines have
9392              (and (shift)) insns.  */
9393
9394           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9395               && (new = simplify_binary_operation (code, result_mode,
9396                                                    XEXP (varop, 1),
9397                                                    GEN_INT (count))) != 0
9398               && GET_CODE (new) == CONST_INT
9399               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
9400                                   INTVAL (new), result_mode, &complement_p))
9401             {
9402               varop = XEXP (varop, 0);
9403               continue;
9404             }
9405
9406           /* If we can't do that, try to simplify the shift in each arm of the
9407              logical expression, make a new logical expression, and apply
9408              the inverse distributive law.  */
9409           {
9410             rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9411                                             XEXP (varop, 0), count);
9412             rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9413                                             XEXP (varop, 1), count);
9414
9415             varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs);
9416             varop = apply_distributive_law (varop);
9417
9418             count = 0;
9419           }
9420           break;
9421
9422         case EQ:
9423           /* convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
9424              says that the sign bit can be tested, FOO has mode MODE, C is
9425              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
9426              that may be nonzero.  */
9427           if (code == LSHIFTRT
9428               && XEXP (varop, 1) == const0_rtx
9429               && GET_MODE (XEXP (varop, 0)) == result_mode
9430               && count == GET_MODE_BITSIZE (result_mode) - 1
9431               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9432               && ((STORE_FLAG_VALUE
9433                    & ((HOST_WIDE_INT) 1
9434                       < (GET_MODE_BITSIZE (result_mode) - 1))))
9435               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9436               && merge_outer_ops (&outer_op, &outer_const, XOR,
9437                                   (HOST_WIDE_INT) 1, result_mode,
9438                                   &complement_p))
9439             {
9440               varop = XEXP (varop, 0);
9441               count = 0;
9442               continue;
9443             }
9444           break;
9445
9446         case NEG:
9447           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
9448              than the number of bits in the mode is equivalent to A.  */
9449           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
9450               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
9451             {
9452               varop = XEXP (varop, 0);
9453               count = 0;
9454               continue;
9455             }
9456
9457           /* NEG commutes with ASHIFT since it is multiplication.  Move the
9458              NEG outside to allow shifts to combine.  */
9459           if (code == ASHIFT
9460               && merge_outer_ops (&outer_op, &outer_const, NEG,
9461                                   (HOST_WIDE_INT) 0, result_mode,
9462                                   &complement_p))
9463             {
9464               varop = XEXP (varop, 0);
9465               continue;
9466             }
9467           break;
9468
9469         case PLUS:
9470           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9471              is one less than the number of bits in the mode is
9472              equivalent to (xor A 1).  */
9473           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
9474               && XEXP (varop, 1) == constm1_rtx
9475               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9476               && merge_outer_ops (&outer_op, &outer_const, XOR,
9477                                   (HOST_WIDE_INT) 1, result_mode,
9478                                   &complement_p))
9479             {
9480               count = 0;
9481               varop = XEXP (varop, 0);
9482               continue;
9483             }
9484
9485           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
9486              that might be nonzero in BAR are those being shifted out and those
9487              bits are known zero in FOO, we can replace the PLUS with FOO.
9488              Similarly in the other operand order.  This code occurs when
9489              we are computing the size of a variable-size array.  */
9490
9491           if ((code == ASHIFTRT || code == LSHIFTRT)
9492               && count < HOST_BITS_PER_WIDE_INT
9493               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9494               && (nonzero_bits (XEXP (varop, 1), result_mode)
9495                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9496             {
9497               varop = XEXP (varop, 0);
9498               continue;
9499             }
9500           else if ((code == ASHIFTRT || code == LSHIFTRT)
9501                    && count < HOST_BITS_PER_WIDE_INT
9502                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9503                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9504                             >> count)
9505                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9506                             & nonzero_bits (XEXP (varop, 1),
9507                                                  result_mode)))
9508             {
9509               varop = XEXP (varop, 1);
9510               continue;
9511             }
9512
9513           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
9514           if (code == ASHIFT
9515               && GET_CODE (XEXP (varop, 1)) == CONST_INT
9516               && (new = simplify_binary_operation (ASHIFT, result_mode,
9517                                                    XEXP (varop, 1),
9518                                                    GEN_INT (count))) != 0
9519               && GET_CODE (new) == CONST_INT
9520               && merge_outer_ops (&outer_op, &outer_const, PLUS,
9521                                   INTVAL (new), result_mode, &complement_p))
9522             {
9523               varop = XEXP (varop, 0);
9524               continue;
9525             }
9526           break;
9527
9528         case MINUS:
9529           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9530              with C the size of VAROP - 1 and the shift is logical if
9531              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9532              we have a (gt X 0) operation.  If the shift is arithmetic with
9533              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9534              we have a (neg (gt X 0)) operation.  */
9535
9536           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9537               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9538               && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
9539               && (code == LSHIFTRT || code == ASHIFTRT)
9540               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9541               && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
9542               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9543             {
9544               count = 0;
9545               varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9546                                   const0_rtx);
9547
9548               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9549                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9550
9551               continue;
9552             }
9553           break;
9554
9555         case TRUNCATE:
9556           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9557              if the truncate does not affect the value.  */
9558           if (code == LSHIFTRT
9559               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9560               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9561               && (INTVAL (XEXP (XEXP (varop, 0), 1))
9562                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9563                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
9564             {
9565               rtx varop_inner = XEXP (varop, 0);
9566
9567               varop_inner
9568                 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
9569                                     XEXP (varop_inner, 0),
9570                                     GEN_INT
9571                                     (count + INTVAL (XEXP (varop_inner, 1))));
9572               varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
9573               count = 0;
9574               continue;
9575             }
9576           break;
9577
9578         default:
9579           break;
9580         }
9581
9582       break;
9583     }
9584
9585   /* We need to determine what mode to do the shift in.  If the shift is
9586      a right shift or ROTATE, we must always do it in the mode it was
9587      originally done in.  Otherwise, we can do it in MODE, the widest mode
9588      encountered.  The code we care about is that of the shift that will
9589      actually be done, not the shift that was originally requested.  */
9590   shift_mode
9591     = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9592        ? result_mode : mode);
9593
9594   /* We have now finished analyzing the shift.  The result should be
9595      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
9596      OUTER_OP is non-NIL, it is an operation that needs to be applied
9597      to the result of the shift.  OUTER_CONST is the relevant constant,
9598      but we must turn off all bits turned off in the shift.
9599
9600      If we were passed a value for X, see if we can use any pieces of
9601      it.  If not, make new rtx.  */
9602
9603   if (x && GET_RTX_CLASS (GET_CODE (x)) == '2'
9604       && GET_CODE (XEXP (x, 1)) == CONST_INT
9605       && INTVAL (XEXP (x, 1)) == count)
9606     const_rtx = XEXP (x, 1);
9607   else
9608     const_rtx = GEN_INT (count);
9609
9610   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
9611       && GET_MODE (XEXP (x, 0)) == shift_mode
9612       && SUBREG_REG (XEXP (x, 0)) == varop)
9613     varop = XEXP (x, 0);
9614   else if (GET_MODE (varop) != shift_mode)
9615     varop = gen_lowpart_for_combine (shift_mode, varop);
9616
9617   /* If we can't make the SUBREG, try to return what we were given.  */
9618   if (GET_CODE (varop) == CLOBBER)
9619     return x ? x : varop;
9620
9621   new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
9622   if (new != 0)
9623     x = new;
9624   else
9625     x = gen_rtx_fmt_ee (code, shift_mode, varop, const_rtx);
9626
9627   /* If we have an outer operation and we just made a shift, it is
9628      possible that we could have simplified the shift were it not
9629      for the outer operation.  So try to do the simplification
9630      recursively.  */
9631
9632   if (outer_op != NIL && GET_CODE (x) == code
9633       && GET_CODE (XEXP (x, 1)) == CONST_INT)
9634     x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0),
9635                               INTVAL (XEXP (x, 1)));
9636
9637   /* If we were doing an LSHIFTRT in a wider mode than it was originally,
9638      turn off all the bits that the shift would have turned off.  */
9639   if (orig_code == LSHIFTRT && result_mode != shift_mode)
9640     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
9641                                 GET_MODE_MASK (result_mode) >> orig_count);
9642
9643   /* Do the remainder of the processing in RESULT_MODE.  */
9644   x = gen_lowpart_for_combine (result_mode, x);
9645
9646   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
9647      operation.  */
9648   if (complement_p)
9649     x =simplify_gen_unary (NOT, result_mode, x, result_mode);
9650
9651   if (outer_op != NIL)
9652     {
9653       if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
9654         outer_const = trunc_int_for_mode (outer_const, result_mode);
9655
9656       if (outer_op == AND)
9657         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
9658       else if (outer_op == SET)
9659         /* This means that we have determined that the result is
9660            equivalent to a constant.  This should be rare.  */
9661         x = GEN_INT (outer_const);
9662       else if (GET_RTX_CLASS (outer_op) == '1')
9663         x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
9664       else
9665         x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
9666     }
9667
9668   return x;
9669 }
9670 \f
9671 /* Like recog, but we receive the address of a pointer to a new pattern.
9672    We try to match the rtx that the pointer points to.
9673    If that fails, we may try to modify or replace the pattern,
9674    storing the replacement into the same pointer object.
9675
9676    Modifications include deletion or addition of CLOBBERs.
9677
9678    PNOTES is a pointer to a location where any REG_UNUSED notes added for
9679    the CLOBBERs are placed.
9680
9681    The value is the final insn code from the pattern ultimately matched,
9682    or -1.  */
9683
9684 static int
9685 recog_for_combine (pnewpat, insn, pnotes)
9686      rtx *pnewpat;
9687      rtx insn;
9688      rtx *pnotes;
9689 {
9690   rtx pat = *pnewpat;
9691   int insn_code_number;
9692   int num_clobbers_to_add = 0;
9693   int i;
9694   rtx notes = 0;
9695   rtx dummy_insn;
9696
9697   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
9698      we use to indicate that something didn't match.  If we find such a
9699      thing, force rejection.  */
9700   if (GET_CODE (pat) == PARALLEL)
9701     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
9702       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
9703           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
9704         return -1;
9705
9706   /* *pnewpat does not have to be actual PATTERN (insn), so make a dummy
9707      instruction for pattern recognition.  */
9708   dummy_insn = shallow_copy_rtx (insn);
9709   PATTERN (dummy_insn) = pat;
9710   REG_NOTES (dummy_insn) = 0;
9711
9712   insn_code_number = recog (pat, dummy_insn, &num_clobbers_to_add);
9713
9714   /* If it isn't, there is the possibility that we previously had an insn
9715      that clobbered some register as a side effect, but the combined
9716      insn doesn't need to do that.  So try once more without the clobbers
9717      unless this represents an ASM insn.  */
9718
9719   if (insn_code_number < 0 && ! check_asm_operands (pat)
9720       && GET_CODE (pat) == PARALLEL)
9721     {
9722       int pos;
9723
9724       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
9725         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
9726           {
9727             if (i != pos)
9728               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
9729             pos++;
9730           }
9731
9732       SUBST_INT (XVECLEN (pat, 0), pos);
9733
9734       if (pos == 1)
9735         pat = XVECEXP (pat, 0, 0);
9736
9737       PATTERN (dummy_insn) = pat;
9738       insn_code_number = recog (pat, dummy_insn, &num_clobbers_to_add);
9739     }
9740
9741   /* Recognize all noop sets, these will be killed by followup pass.  */
9742   if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
9743     insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
9744
9745   /* If we had any clobbers to add, make a new pattern than contains
9746      them.  Then check to make sure that all of them are dead.  */
9747   if (num_clobbers_to_add)
9748     {
9749       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
9750                                      rtvec_alloc (GET_CODE (pat) == PARALLEL
9751                                                   ? (XVECLEN (pat, 0)
9752                                                      + num_clobbers_to_add)
9753                                                   : num_clobbers_to_add + 1));
9754
9755       if (GET_CODE (pat) == PARALLEL)
9756         for (i = 0; i < XVECLEN (pat, 0); i++)
9757           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
9758       else
9759         XVECEXP (newpat, 0, 0) = pat;
9760
9761       add_clobbers (newpat, insn_code_number);
9762
9763       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
9764            i < XVECLEN (newpat, 0); i++)
9765         {
9766           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG
9767               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
9768             return -1;
9769           notes = gen_rtx_EXPR_LIST (REG_UNUSED,
9770                                      XEXP (XVECEXP (newpat, 0, i), 0), notes);
9771         }
9772       pat = newpat;
9773     }
9774
9775   *pnewpat = pat;
9776   *pnotes = notes;
9777
9778   return insn_code_number;
9779 }
9780 \f
9781 /* Like gen_lowpart but for use by combine.  In combine it is not possible
9782    to create any new pseudoregs.  However, it is safe to create
9783    invalid memory addresses, because combine will try to recognize
9784    them and all they will do is make the combine attempt fail.
9785
9786    If for some reason this cannot do its job, an rtx
9787    (clobber (const_int 0)) is returned.
9788    An insn containing that will not be recognized.  */
9789
9790 #undef gen_lowpart
9791
9792 static rtx
9793 gen_lowpart_for_combine (mode, x)
9794      enum machine_mode mode;
9795      rtx x;
9796 {
9797   rtx result;
9798
9799   if (GET_MODE (x) == mode)
9800     return x;
9801
9802   /* We can only support MODE being wider than a word if X is a
9803      constant integer or has a mode the same size.  */
9804
9805   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
9806       && ! ((GET_MODE (x) == VOIDmode
9807              && (GET_CODE (x) == CONST_INT
9808                  || GET_CODE (x) == CONST_DOUBLE))
9809             || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode)))
9810     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9811
9812   /* simplify_gen_subreg does not know how to handle the case where we try
9813      to convert an integer constant to a vector.
9814      ??? We could try to teach it to generate CONST_VECTORs.  */
9815   if (GET_MODE (x) == VOIDmode && VECTOR_MODE_P (mode))
9816     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9817
9818   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
9819      won't know what to do.  So we will strip off the SUBREG here and
9820      process normally.  */
9821   if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
9822     {
9823       x = SUBREG_REG (x);
9824       if (GET_MODE (x) == mode)
9825         return x;
9826     }
9827
9828   result = gen_lowpart_common (mode, x);
9829 #ifdef CLASS_CANNOT_CHANGE_MODE
9830   if (result != 0
9831       && GET_CODE (result) == SUBREG
9832       && GET_CODE (SUBREG_REG (result)) == REG
9833       && REGNO (SUBREG_REG (result)) >= FIRST_PSEUDO_REGISTER
9834       && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (result),
9835                                      GET_MODE (SUBREG_REG (result))))
9836     REG_CHANGES_MODE (REGNO (SUBREG_REG (result))) = 1;
9837 #endif
9838
9839   if (result)
9840     return result;
9841
9842   if (GET_CODE (x) == MEM)
9843     {
9844       int offset = 0;
9845
9846       /* Refuse to work on a volatile memory ref or one with a mode-dependent
9847          address.  */
9848       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
9849         return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9850
9851       /* If we want to refer to something bigger than the original memref,
9852          generate a perverse subreg instead.  That will force a reload
9853          of the original memref X.  */
9854       if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode))
9855         return gen_rtx_SUBREG (mode, x, 0);
9856
9857       if (WORDS_BIG_ENDIAN)
9858         offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
9859                   - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
9860
9861       if (BYTES_BIG_ENDIAN)
9862         {
9863           /* Adjust the address so that the address-after-the-data is
9864              unchanged.  */
9865           offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
9866                      - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
9867         }
9868
9869       return adjust_address_nv (x, mode, offset);
9870     }
9871
9872   /* If X is a comparison operator, rewrite it in a new mode.  This
9873      probably won't match, but may allow further simplifications.  */
9874   else if (GET_RTX_CLASS (GET_CODE (x)) == '<')
9875     return gen_rtx_fmt_ee (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1));
9876
9877   /* If we couldn't simplify X any other way, just enclose it in a
9878      SUBREG.  Normally, this SUBREG won't match, but some patterns may
9879      include an explicit SUBREG or we may simplify it further in combine.  */
9880   else
9881     {
9882       int offset = 0;
9883       rtx res;
9884
9885       offset = subreg_lowpart_offset (mode, GET_MODE (x));
9886       res = simplify_gen_subreg (mode, x, GET_MODE (x), offset);
9887       if (res)
9888         return res;
9889       return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9890     }
9891 }
9892 \f
9893 /* These routines make binary and unary operations by first seeing if they
9894    fold; if not, a new expression is allocated.  */
9895
9896 static rtx
9897 gen_binary (code, mode, op0, op1)
9898      enum rtx_code code;
9899      enum machine_mode mode;
9900      rtx op0, op1;
9901 {
9902   rtx result;
9903   rtx tem;
9904
9905   if (GET_RTX_CLASS (code) == 'c'
9906       && swap_commutative_operands_p (op0, op1))
9907     tem = op0, op0 = op1, op1 = tem;
9908
9909   if (GET_RTX_CLASS (code) == '<')
9910     {
9911       enum machine_mode op_mode = GET_MODE (op0);
9912
9913       /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get
9914          just (REL_OP X Y).  */
9915       if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
9916         {
9917           op1 = XEXP (op0, 1);
9918           op0 = XEXP (op0, 0);
9919           op_mode = GET_MODE (op0);
9920         }
9921
9922       if (op_mode == VOIDmode)
9923         op_mode = GET_MODE (op1);
9924       result = simplify_relational_operation (code, op_mode, op0, op1);
9925     }
9926   else
9927     result = simplify_binary_operation (code, mode, op0, op1);
9928
9929   if (result)
9930     return result;
9931
9932   /* Put complex operands first and constants second.  */
9933   if (GET_RTX_CLASS (code) == 'c'
9934       && swap_commutative_operands_p (op0, op1))
9935     return gen_rtx_fmt_ee (code, mode, op1, op0);
9936
9937   /* If we are turning off bits already known off in OP0, we need not do
9938      an AND.  */
9939   else if (code == AND && GET_CODE (op1) == CONST_INT
9940            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9941            && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
9942     return op0;
9943
9944   return gen_rtx_fmt_ee (code, mode, op0, op1);
9945 }
9946 \f
9947 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
9948    comparison code that will be tested.
9949
9950    The result is a possibly different comparison code to use.  *POP0 and
9951    *POP1 may be updated.
9952
9953    It is possible that we might detect that a comparison is either always
9954    true or always false.  However, we do not perform general constant
9955    folding in combine, so this knowledge isn't useful.  Such tautologies
9956    should have been detected earlier.  Hence we ignore all such cases.  */
9957
9958 static enum rtx_code
9959 simplify_comparison (code, pop0, pop1)
9960      enum rtx_code code;
9961      rtx *pop0;
9962      rtx *pop1;
9963 {
9964   rtx op0 = *pop0;
9965   rtx op1 = *pop1;
9966   rtx tem, tem1;
9967   int i;
9968   enum machine_mode mode, tmode;
9969
9970   /* Try a few ways of applying the same transformation to both operands.  */
9971   while (1)
9972     {
9973 #ifndef WORD_REGISTER_OPERATIONS
9974       /* The test below this one won't handle SIGN_EXTENDs on these machines,
9975          so check specially.  */
9976       if (code != GTU && code != GEU && code != LTU && code != LEU
9977           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
9978           && GET_CODE (XEXP (op0, 0)) == ASHIFT
9979           && GET_CODE (XEXP (op1, 0)) == ASHIFT
9980           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
9981           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
9982           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
9983               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
9984           && GET_CODE (XEXP (op0, 1)) == CONST_INT
9985           && GET_CODE (XEXP (op1, 1)) == CONST_INT
9986           && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
9987           && GET_CODE (XEXP (XEXP (op1, 0), 1)) == CONST_INT
9988           && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (op1, 1))
9989           && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op0, 0), 1))
9990           && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op1, 0), 1))
9991           && (INTVAL (XEXP (op0, 1))
9992               == (GET_MODE_BITSIZE (GET_MODE (op0))
9993                   - (GET_MODE_BITSIZE
9994                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
9995         {
9996           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
9997           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
9998         }
9999 #endif
10000
10001       /* If both operands are the same constant shift, see if we can ignore the
10002          shift.  We can if the shift is a rotate or if the bits shifted out of
10003          this shift are known to be zero for both inputs and if the type of
10004          comparison is compatible with the shift.  */
10005       if (GET_CODE (op0) == GET_CODE (op1)
10006           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10007           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
10008               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
10009                   && (code != GT && code != LT && code != GE && code != LE))
10010               || (GET_CODE (op0) == ASHIFTRT
10011                   && (code != GTU && code != LTU
10012                       && code != GEU && code != LEU)))
10013           && GET_CODE (XEXP (op0, 1)) == CONST_INT
10014           && INTVAL (XEXP (op0, 1)) >= 0
10015           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10016           && XEXP (op0, 1) == XEXP (op1, 1))
10017         {
10018           enum machine_mode mode = GET_MODE (op0);
10019           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10020           int shift_count = INTVAL (XEXP (op0, 1));
10021
10022           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
10023             mask &= (mask >> shift_count) << shift_count;
10024           else if (GET_CODE (op0) == ASHIFT)
10025             mask = (mask & (mask << shift_count)) >> shift_count;
10026
10027           if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
10028               && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
10029             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
10030           else
10031             break;
10032         }
10033
10034       /* If both operands are AND's of a paradoxical SUBREG by constant, the
10035          SUBREGs are of the same mode, and, in both cases, the AND would
10036          be redundant if the comparison was done in the narrower mode,
10037          do the comparison in the narrower mode (e.g., we are AND'ing with 1
10038          and the operand's possibly nonzero bits are 0xffffff01; in that case
10039          if we only care about QImode, we don't need the AND).  This case
10040          occurs if the output mode of an scc insn is not SImode and
10041          STORE_FLAG_VALUE == 1 (e.g., the 386).
10042
10043          Similarly, check for a case where the AND's are ZERO_EXTEND
10044          operations from some narrower mode even though a SUBREG is not
10045          present.  */
10046
10047       else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
10048                && GET_CODE (XEXP (op0, 1)) == CONST_INT
10049                && GET_CODE (XEXP (op1, 1)) == CONST_INT)
10050         {
10051           rtx inner_op0 = XEXP (op0, 0);
10052           rtx inner_op1 = XEXP (op1, 0);
10053           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
10054           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
10055           int changed = 0;
10056
10057           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
10058               && (GET_MODE_SIZE (GET_MODE (inner_op0))
10059                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
10060               && (GET_MODE (SUBREG_REG (inner_op0))
10061                   == GET_MODE (SUBREG_REG (inner_op1)))
10062               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
10063                   <= HOST_BITS_PER_WIDE_INT)
10064               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
10065                                              GET_MODE (SUBREG_REG (inner_op0)))))
10066               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
10067                                              GET_MODE (SUBREG_REG (inner_op1))))))
10068             {
10069               op0 = SUBREG_REG (inner_op0);
10070               op1 = SUBREG_REG (inner_op1);
10071
10072               /* The resulting comparison is always unsigned since we masked
10073                  off the original sign bit.  */
10074               code = unsigned_condition (code);
10075
10076               changed = 1;
10077             }
10078
10079           else if (c0 == c1)
10080             for (tmode = GET_CLASS_NARROWEST_MODE
10081                  (GET_MODE_CLASS (GET_MODE (op0)));
10082                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
10083               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
10084                 {
10085                   op0 = gen_lowpart_for_combine (tmode, inner_op0);
10086                   op1 = gen_lowpart_for_combine (tmode, inner_op1);
10087                   code = unsigned_condition (code);
10088                   changed = 1;
10089                   break;
10090                 }
10091
10092           if (! changed)
10093             break;
10094         }
10095
10096       /* If both operands are NOT, we can strip off the outer operation
10097          and adjust the comparison code for swapped operands; similarly for
10098          NEG, except that this must be an equality comparison.  */
10099       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
10100                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
10101                    && (code == EQ || code == NE)))
10102         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
10103
10104       else
10105         break;
10106     }
10107
10108   /* If the first operand is a constant, swap the operands and adjust the
10109      comparison code appropriately, but don't do this if the second operand
10110      is already a constant integer.  */
10111   if (swap_commutative_operands_p (op0, op1))
10112     {
10113       tem = op0, op0 = op1, op1 = tem;
10114       code = swap_condition (code);
10115     }
10116
10117   /* We now enter a loop during which we will try to simplify the comparison.
10118      For the most part, we only are concerned with comparisons with zero,
10119      but some things may really be comparisons with zero but not start
10120      out looking that way.  */
10121
10122   while (GET_CODE (op1) == CONST_INT)
10123     {
10124       enum machine_mode mode = GET_MODE (op0);
10125       unsigned int mode_width = GET_MODE_BITSIZE (mode);
10126       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10127       int equality_comparison_p;
10128       int sign_bit_comparison_p;
10129       int unsigned_comparison_p;
10130       HOST_WIDE_INT const_op;
10131
10132       /* We only want to handle integral modes.  This catches VOIDmode,
10133          CCmode, and the floating-point modes.  An exception is that we
10134          can handle VOIDmode if OP0 is a COMPARE or a comparison
10135          operation.  */
10136
10137       if (GET_MODE_CLASS (mode) != MODE_INT
10138           && ! (mode == VOIDmode
10139                 && (GET_CODE (op0) == COMPARE
10140                     || GET_RTX_CLASS (GET_CODE (op0)) == '<')))
10141         break;
10142
10143       /* Get the constant we are comparing against and turn off all bits
10144          not on in our mode.  */
10145       const_op = trunc_int_for_mode (INTVAL (op1), mode);
10146       op1 = GEN_INT (const_op);
10147
10148       /* If we are comparing against a constant power of two and the value
10149          being compared can only have that single bit nonzero (e.g., it was
10150          `and'ed with that bit), we can replace this with a comparison
10151          with zero.  */
10152       if (const_op
10153           && (code == EQ || code == NE || code == GE || code == GEU
10154               || code == LT || code == LTU)
10155           && mode_width <= HOST_BITS_PER_WIDE_INT
10156           && exact_log2 (const_op) >= 0
10157           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
10158         {
10159           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10160           op1 = const0_rtx, const_op = 0;
10161         }
10162
10163       /* Similarly, if we are comparing a value known to be either -1 or
10164          0 with -1, change it to the opposite comparison against zero.  */
10165
10166       if (const_op == -1
10167           && (code == EQ || code == NE || code == GT || code == LE
10168               || code == GEU || code == LTU)
10169           && num_sign_bit_copies (op0, mode) == mode_width)
10170         {
10171           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10172           op1 = const0_rtx, const_op = 0;
10173         }
10174
10175       /* Do some canonicalizations based on the comparison code.  We prefer
10176          comparisons against zero and then prefer equality comparisons.
10177          If we can reduce the size of a constant, we will do that too.  */
10178
10179       switch (code)
10180         {
10181         case LT:
10182           /* < C is equivalent to <= (C - 1) */
10183           if (const_op > 0)
10184             {
10185               const_op -= 1;
10186               op1 = GEN_INT (const_op);
10187               code = LE;
10188               /* ... fall through to LE case below.  */
10189             }
10190           else
10191             break;
10192
10193         case LE:
10194           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
10195           if (const_op < 0)
10196             {
10197               const_op += 1;
10198               op1 = GEN_INT (const_op);
10199               code = LT;
10200             }
10201
10202           /* If we are doing a <= 0 comparison on a value known to have
10203              a zero sign bit, we can replace this with == 0.  */
10204           else if (const_op == 0
10205                    && mode_width <= HOST_BITS_PER_WIDE_INT
10206                    && (nonzero_bits (op0, mode)
10207                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10208             code = EQ;
10209           break;
10210
10211         case GE:
10212           /* >= C is equivalent to > (C - 1).  */
10213           if (const_op > 0)
10214             {
10215               const_op -= 1;
10216               op1 = GEN_INT (const_op);
10217               code = GT;
10218               /* ... fall through to GT below.  */
10219             }
10220           else
10221             break;
10222
10223         case GT:
10224           /* > C is equivalent to >= (C + 1); we do this for C < 0.  */
10225           if (const_op < 0)
10226             {
10227               const_op += 1;
10228               op1 = GEN_INT (const_op);
10229               code = GE;
10230             }
10231
10232           /* If we are doing a > 0 comparison on a value known to have
10233              a zero sign bit, we can replace this with != 0.  */
10234           else if (const_op == 0
10235                    && mode_width <= HOST_BITS_PER_WIDE_INT
10236                    && (nonzero_bits (op0, mode)
10237                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10238             code = NE;
10239           break;
10240
10241         case LTU:
10242           /* < C is equivalent to <= (C - 1).  */
10243           if (const_op > 0)
10244             {
10245               const_op -= 1;
10246               op1 = GEN_INT (const_op);
10247               code = LEU;
10248               /* ... fall through ...  */
10249             }
10250
10251           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
10252           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10253                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10254             {
10255               const_op = 0, op1 = const0_rtx;
10256               code = GE;
10257               break;
10258             }
10259           else
10260             break;
10261
10262         case LEU:
10263           /* unsigned <= 0 is equivalent to == 0 */
10264           if (const_op == 0)
10265             code = EQ;
10266
10267           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
10268           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10269                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10270             {
10271               const_op = 0, op1 = const0_rtx;
10272               code = GE;
10273             }
10274           break;
10275
10276         case GEU:
10277           /* >= C is equivalent to < (C - 1).  */
10278           if (const_op > 1)
10279             {
10280               const_op -= 1;
10281               op1 = GEN_INT (const_op);
10282               code = GTU;
10283               /* ... fall through ...  */
10284             }
10285
10286           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
10287           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10288                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10289             {
10290               const_op = 0, op1 = const0_rtx;
10291               code = LT;
10292               break;
10293             }
10294           else
10295             break;
10296
10297         case GTU:
10298           /* unsigned > 0 is equivalent to != 0 */
10299           if (const_op == 0)
10300             code = NE;
10301
10302           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
10303           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10304                     && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10305             {
10306               const_op = 0, op1 = const0_rtx;
10307               code = LT;
10308             }
10309           break;
10310
10311         default:
10312           break;
10313         }
10314
10315       /* Compute some predicates to simplify code below.  */
10316
10317       equality_comparison_p = (code == EQ || code == NE);
10318       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
10319       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
10320                                || code == GEU);
10321
10322       /* If this is a sign bit comparison and we can do arithmetic in
10323          MODE, say that we will only be needing the sign bit of OP0.  */
10324       if (sign_bit_comparison_p
10325           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10326         op0 = force_to_mode (op0, mode,
10327                              ((HOST_WIDE_INT) 1
10328                               << (GET_MODE_BITSIZE (mode) - 1)),
10329                              NULL_RTX, 0);
10330
10331       /* Now try cases based on the opcode of OP0.  If none of the cases
10332          does a "continue", we exit this loop immediately after the
10333          switch.  */
10334
10335       switch (GET_CODE (op0))
10336         {
10337         case ZERO_EXTRACT:
10338           /* If we are extracting a single bit from a variable position in
10339              a constant that has only a single bit set and are comparing it
10340              with zero, we can convert this into an equality comparison
10341              between the position and the location of the single bit.  */
10342
10343           if (GET_CODE (XEXP (op0, 0)) == CONST_INT
10344               && XEXP (op0, 1) == const1_rtx
10345               && equality_comparison_p && const_op == 0
10346               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
10347             {
10348               if (BITS_BIG_ENDIAN)
10349                 {
10350                   enum machine_mode new_mode
10351                     = mode_for_extraction (EP_extzv, 1);
10352                   if (new_mode == MAX_MACHINE_MODE)
10353                     i = BITS_PER_WORD - 1 - i;
10354                   else
10355                     {
10356                       mode = new_mode;
10357                       i = (GET_MODE_BITSIZE (mode) - 1 - i);
10358                     }
10359                 }
10360
10361               op0 = XEXP (op0, 2);
10362               op1 = GEN_INT (i);
10363               const_op = i;
10364
10365               /* Result is nonzero iff shift count is equal to I.  */
10366               code = reverse_condition (code);
10367               continue;
10368             }
10369
10370           /* ... fall through ...  */
10371
10372         case SIGN_EXTRACT:
10373           tem = expand_compound_operation (op0);
10374           if (tem != op0)
10375             {
10376               op0 = tem;
10377               continue;
10378             }
10379           break;
10380
10381         case NOT:
10382           /* If testing for equality, we can take the NOT of the constant.  */
10383           if (equality_comparison_p
10384               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
10385             {
10386               op0 = XEXP (op0, 0);
10387               op1 = tem;
10388               continue;
10389             }
10390
10391           /* If just looking at the sign bit, reverse the sense of the
10392              comparison.  */
10393           if (sign_bit_comparison_p)
10394             {
10395               op0 = XEXP (op0, 0);
10396               code = (code == GE ? LT : GE);
10397               continue;
10398             }
10399           break;
10400
10401         case NEG:
10402           /* If testing for equality, we can take the NEG of the constant.  */
10403           if (equality_comparison_p
10404               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10405             {
10406               op0 = XEXP (op0, 0);
10407               op1 = tem;
10408               continue;
10409             }
10410
10411           /* The remaining cases only apply to comparisons with zero.  */
10412           if (const_op != 0)
10413             break;
10414
10415           /* When X is ABS or is known positive,
10416              (neg X) is < 0 if and only if X != 0.  */
10417
10418           if (sign_bit_comparison_p
10419               && (GET_CODE (XEXP (op0, 0)) == ABS
10420                   || (mode_width <= HOST_BITS_PER_WIDE_INT
10421                       && (nonzero_bits (XEXP (op0, 0), mode)
10422                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10423             {
10424               op0 = XEXP (op0, 0);
10425               code = (code == LT ? NE : EQ);
10426               continue;
10427             }
10428
10429           /* If we have NEG of something whose two high-order bits are the
10430              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
10431           if (num_sign_bit_copies (op0, mode) >= 2)
10432             {
10433               op0 = XEXP (op0, 0);
10434               code = swap_condition (code);
10435               continue;
10436             }
10437           break;
10438
10439         case ROTATE:
10440           /* If we are testing equality and our count is a constant, we
10441              can perform the inverse operation on our RHS.  */
10442           if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10443               && (tem = simplify_binary_operation (ROTATERT, mode,
10444                                                    op1, XEXP (op0, 1))) != 0)
10445             {
10446               op0 = XEXP (op0, 0);
10447               op1 = tem;
10448               continue;
10449             }
10450
10451           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10452              a particular bit.  Convert it to an AND of a constant of that
10453              bit.  This will be converted into a ZERO_EXTRACT.  */
10454           if (const_op == 0 && sign_bit_comparison_p
10455               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10456               && mode_width <= HOST_BITS_PER_WIDE_INT)
10457             {
10458               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10459                                             ((HOST_WIDE_INT) 1
10460                                              << (mode_width - 1
10461                                                  - INTVAL (XEXP (op0, 1)))));
10462               code = (code == LT ? NE : EQ);
10463               continue;
10464             }
10465
10466           /* Fall through.  */
10467
10468         case ABS:
10469           /* ABS is ignorable inside an equality comparison with zero.  */
10470           if (const_op == 0 && equality_comparison_p)
10471             {
10472               op0 = XEXP (op0, 0);
10473               continue;
10474             }
10475           break;
10476
10477         case SIGN_EXTEND:
10478           /* Can simplify (compare (zero/sign_extend FOO) CONST)
10479              to (compare FOO CONST) if CONST fits in FOO's mode and we
10480              are either testing inequality or have an unsigned comparison
10481              with ZERO_EXTEND or a signed comparison with SIGN_EXTEND.  */
10482           if (! unsigned_comparison_p
10483               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10484                   <= HOST_BITS_PER_WIDE_INT)
10485               && ((unsigned HOST_WIDE_INT) const_op
10486                   < (((unsigned HOST_WIDE_INT) 1
10487                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1)))))
10488             {
10489               op0 = XEXP (op0, 0);
10490               continue;
10491             }
10492           break;
10493
10494         case SUBREG:
10495           /* Check for the case where we are comparing A - C1 with C2,
10496              both constants are smaller than 1/2 the maximum positive
10497              value in MODE, and the comparison is equality or unsigned.
10498              In that case, if A is either zero-extended to MODE or has
10499              sufficient sign bits so that the high-order bit in MODE
10500              is a copy of the sign in the inner mode, we can prove that it is
10501              safe to do the operation in the wider mode.  This simplifies
10502              many range checks.  */
10503
10504           if (mode_width <= HOST_BITS_PER_WIDE_INT
10505               && subreg_lowpart_p (op0)
10506               && GET_CODE (SUBREG_REG (op0)) == PLUS
10507               && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
10508               && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0
10509               && (-INTVAL (XEXP (SUBREG_REG (op0), 1))
10510                   < (HOST_WIDE_INT) (GET_MODE_MASK (mode) / 2))
10511               && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2
10512               && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0),
10513                                       GET_MODE (SUBREG_REG (op0)))
10514                         & ~GET_MODE_MASK (mode))
10515                   || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0),
10516                                            GET_MODE (SUBREG_REG (op0)))
10517                       > (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10518                          - GET_MODE_BITSIZE (mode)))))
10519             {
10520               op0 = SUBREG_REG (op0);
10521               continue;
10522             }
10523
10524           /* If the inner mode is narrower and we are extracting the low part,
10525              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
10526           if (subreg_lowpart_p (op0)
10527               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10528             /* Fall through */ ;
10529           else
10530             break;
10531
10532           /* ... fall through ...  */
10533
10534         case ZERO_EXTEND:
10535           if ((unsigned_comparison_p || equality_comparison_p)
10536               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10537                   <= HOST_BITS_PER_WIDE_INT)
10538               && ((unsigned HOST_WIDE_INT) const_op
10539                   < GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))))
10540             {
10541               op0 = XEXP (op0, 0);
10542               continue;
10543             }
10544           break;
10545
10546         case PLUS:
10547           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
10548              this for equality comparisons due to pathological cases involving
10549              overflows.  */
10550           if (equality_comparison_p
10551               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10552                                                         op1, XEXP (op0, 1))))
10553             {
10554               op0 = XEXP (op0, 0);
10555               op1 = tem;
10556               continue;
10557             }
10558
10559           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
10560           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10561               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10562             {
10563               op0 = XEXP (XEXP (op0, 0), 0);
10564               code = (code == LT ? EQ : NE);
10565               continue;
10566             }
10567           break;
10568
10569         case MINUS:
10570           /* We used to optimize signed comparisons against zero, but that
10571              was incorrect.  Unsigned comparisons against zero (GTU, LEU)
10572              arrive here as equality comparisons, or (GEU, LTU) are
10573              optimized away.  No need to special-case them.  */
10574
10575           /* (eq (minus A B) C) -> (eq A (plus B C)) or
10576              (eq B (minus A C)), whichever simplifies.  We can only do
10577              this for equality comparisons due to pathological cases involving
10578              overflows.  */
10579           if (equality_comparison_p
10580               && 0 != (tem = simplify_binary_operation (PLUS, mode,
10581                                                         XEXP (op0, 1), op1)))
10582             {
10583               op0 = XEXP (op0, 0);
10584               op1 = tem;
10585               continue;
10586             }
10587
10588           if (equality_comparison_p
10589               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10590                                                         XEXP (op0, 0), op1)))
10591             {
10592               op0 = XEXP (op0, 1);
10593               op1 = tem;
10594               continue;
10595             }
10596
10597           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10598              of bits in X minus 1, is one iff X > 0.  */
10599           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10600               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10601               && INTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
10602               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10603             {
10604               op0 = XEXP (op0, 1);
10605               code = (code == GE ? LE : GT);
10606               continue;
10607             }
10608           break;
10609
10610         case XOR:
10611           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
10612              if C is zero or B is a constant.  */
10613           if (equality_comparison_p
10614               && 0 != (tem = simplify_binary_operation (XOR, mode,
10615                                                         XEXP (op0, 1), op1)))
10616             {
10617               op0 = XEXP (op0, 0);
10618               op1 = tem;
10619               continue;
10620             }
10621           break;
10622
10623         case EQ:  case NE:
10624         case UNEQ:  case LTGT:
10625         case LT:  case LTU:  case UNLT:  case LE:  case LEU:  case UNLE:
10626         case GT:  case GTU:  case UNGT:  case GE:  case GEU:  case UNGE:
10627         case UNORDERED: case ORDERED:
10628           /* We can't do anything if OP0 is a condition code value, rather
10629              than an actual data value.  */
10630           if (const_op != 0
10631 #ifdef HAVE_cc0
10632               || XEXP (op0, 0) == cc0_rtx
10633 #endif
10634               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
10635             break;
10636
10637           /* Get the two operands being compared.  */
10638           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
10639             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
10640           else
10641             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
10642
10643           /* Check for the cases where we simply want the result of the
10644              earlier test or the opposite of that result.  */
10645           if (code == NE || code == EQ
10646               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10647                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10648                   && (STORE_FLAG_VALUE
10649                       & (((HOST_WIDE_INT) 1
10650                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
10651                   && (code == LT || code == GE)))
10652             {
10653               enum rtx_code new_code;
10654               if (code == LT || code == NE)
10655                 new_code = GET_CODE (op0);
10656               else
10657                 new_code = combine_reversed_comparison_code (op0);
10658
10659               if (new_code != UNKNOWN)
10660                 {
10661                   code = new_code;
10662                   op0 = tem;
10663                   op1 = tem1;
10664                   continue;
10665                 }
10666             }
10667           break;
10668
10669         case IOR:
10670           /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero
10671              iff X <= 0.  */
10672           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
10673               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
10674               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10675             {
10676               op0 = XEXP (op0, 1);
10677               code = (code == GE ? GT : LE);
10678               continue;
10679             }
10680           break;
10681
10682         case AND:
10683           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
10684              will be converted to a ZERO_EXTRACT later.  */
10685           if (const_op == 0 && equality_comparison_p
10686               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10687               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
10688             {
10689               op0 = simplify_and_const_int
10690                 (op0, mode, gen_rtx_LSHIFTRT (mode,
10691                                               XEXP (op0, 1),
10692                                               XEXP (XEXP (op0, 0), 1)),
10693                  (HOST_WIDE_INT) 1);
10694               continue;
10695             }
10696
10697           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
10698              zero and X is a comparison and C1 and C2 describe only bits set
10699              in STORE_FLAG_VALUE, we can compare with X.  */
10700           if (const_op == 0 && equality_comparison_p
10701               && mode_width <= HOST_BITS_PER_WIDE_INT
10702               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10703               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10704               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10705               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
10706               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
10707             {
10708               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10709                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
10710               if ((~STORE_FLAG_VALUE & mask) == 0
10711                   && (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (op0, 0), 0))) == '<'
10712                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
10713                           && GET_RTX_CLASS (GET_CODE (tem)) == '<')))
10714                 {
10715                   op0 = XEXP (XEXP (op0, 0), 0);
10716                   continue;
10717                 }
10718             }
10719
10720           /* If we are doing an equality comparison of an AND of a bit equal
10721              to the sign bit, replace this with a LT or GE comparison of
10722              the underlying value.  */
10723           if (equality_comparison_p
10724               && const_op == 0
10725               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10726               && mode_width <= HOST_BITS_PER_WIDE_INT
10727               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10728                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10729             {
10730               op0 = XEXP (op0, 0);
10731               code = (code == EQ ? GE : LT);
10732               continue;
10733             }
10734
10735           /* If this AND operation is really a ZERO_EXTEND from a narrower
10736              mode, the constant fits within that mode, and this is either an
10737              equality or unsigned comparison, try to do this comparison in
10738              the narrower mode.  */
10739           if ((equality_comparison_p || unsigned_comparison_p)
10740               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10741               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
10742                                    & GET_MODE_MASK (mode))
10743                                   + 1)) >= 0
10744               && const_op >> i == 0
10745               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
10746             {
10747               op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0));
10748               continue;
10749             }
10750
10751           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1 fits
10752              in both M1 and M2 and the SUBREG is either paradoxical or
10753              represents the low part, permute the SUBREG and the AND and
10754              try again.  */
10755           if (GET_CODE (XEXP (op0, 0)) == SUBREG
10756               && (0
10757 #ifdef WORD_REGISTER_OPERATIONS
10758                   || ((mode_width
10759                        > (GET_MODE_BITSIZE
10760                            (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10761                       && mode_width <= BITS_PER_WORD)
10762 #endif
10763                   || ((mode_width
10764                        <= (GET_MODE_BITSIZE
10765                            (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10766                       && subreg_lowpart_p (XEXP (op0, 0))))
10767 #ifndef WORD_REGISTER_OPERATIONS
10768               /* It is unsafe to commute the AND into the SUBREG if the SUBREG
10769                  is paradoxical and WORD_REGISTER_OPERATIONS is not defined.
10770                  As originally written the upper bits have a defined value
10771                  due to the AND operation.  However, if we commute the AND
10772                  inside the SUBREG then they no longer have defined values
10773                  and the meaning of the code has been changed.  */
10774               && (GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)))
10775                   <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
10776 #endif
10777               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10778               && mode_width <= HOST_BITS_PER_WIDE_INT
10779               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
10780                   <= HOST_BITS_PER_WIDE_INT)
10781               && (INTVAL (XEXP (op0, 1)) & ~mask) == 0
10782               && 0 == (~GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
10783                        & INTVAL (XEXP (op0, 1)))
10784               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1)) != mask
10785               && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
10786                   != GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10787
10788             {
10789               op0
10790                 = gen_lowpart_for_combine
10791                   (mode,
10792                    gen_binary (AND, GET_MODE (SUBREG_REG (XEXP (op0, 0))),
10793                                SUBREG_REG (XEXP (op0, 0)), XEXP (op0, 1)));
10794               continue;
10795             }
10796
10797           /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
10798              (eq (and (lshiftrt X) 1) 0).  */
10799           if (const_op == 0 && equality_comparison_p
10800               && XEXP (op0, 1) == const1_rtx
10801               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10802               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == NOT)
10803             {
10804               op0 = simplify_and_const_int
10805                 (op0, mode,
10806                  gen_rtx_LSHIFTRT (mode, XEXP (XEXP (XEXP (op0, 0), 0), 0),
10807                                    XEXP (XEXP (op0, 0), 1)),
10808                  (HOST_WIDE_INT) 1);
10809               code = (code == NE ? EQ : NE);
10810               continue;
10811             }
10812           break;
10813
10814         case ASHIFT:
10815           /* If we have (compare (ashift FOO N) (const_int C)) and
10816              the high order N bits of FOO (N+1 if an inequality comparison)
10817              are known to be zero, we can do this by comparing FOO with C
10818              shifted right N bits so long as the low-order N bits of C are
10819              zero.  */
10820           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10821               && INTVAL (XEXP (op0, 1)) >= 0
10822               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
10823                   < HOST_BITS_PER_WIDE_INT)
10824               && ((const_op
10825                    & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
10826               && mode_width <= HOST_BITS_PER_WIDE_INT
10827               && (nonzero_bits (XEXP (op0, 0), mode)
10828                   & ~(mask >> (INTVAL (XEXP (op0, 1))
10829                                + ! equality_comparison_p))) == 0)
10830             {
10831               /* We must perform a logical shift, not an arithmetic one,
10832                  as we want the top N bits of C to be zero.  */
10833               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
10834
10835               temp >>= INTVAL (XEXP (op0, 1));
10836               op1 = gen_int_mode (temp, mode);
10837               op0 = XEXP (op0, 0);
10838               continue;
10839             }
10840
10841           /* If we are doing a sign bit comparison, it means we are testing
10842              a particular bit.  Convert it to the appropriate AND.  */
10843           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10844               && mode_width <= HOST_BITS_PER_WIDE_INT)
10845             {
10846               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10847                                             ((HOST_WIDE_INT) 1
10848                                              << (mode_width - 1
10849                                                  - INTVAL (XEXP (op0, 1)))));
10850               code = (code == LT ? NE : EQ);
10851               continue;
10852             }
10853
10854           /* If this an equality comparison with zero and we are shifting
10855              the low bit to the sign bit, we can convert this to an AND of the
10856              low-order bit.  */
10857           if (const_op == 0 && equality_comparison_p
10858               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10859               && INTVAL (XEXP (op0, 1)) == mode_width - 1)
10860             {
10861               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10862                                             (HOST_WIDE_INT) 1);
10863               continue;
10864             }
10865           break;
10866
10867         case ASHIFTRT:
10868           /* If this is an equality comparison with zero, we can do this
10869              as a logical shift, which might be much simpler.  */
10870           if (equality_comparison_p && const_op == 0
10871               && GET_CODE (XEXP (op0, 1)) == CONST_INT)
10872             {
10873               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
10874                                           XEXP (op0, 0),
10875                                           INTVAL (XEXP (op0, 1)));
10876               continue;
10877             }
10878
10879           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
10880              do the comparison in a narrower mode.  */
10881           if (! unsigned_comparison_p
10882               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10883               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10884               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10885               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10886                                          MODE_INT, 1)) != BLKmode
10887               && (((unsigned HOST_WIDE_INT) const_op
10888                    + (GET_MODE_MASK (tmode) >> 1) + 1)
10889                   <= GET_MODE_MASK (tmode)))
10890             {
10891               op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
10892               continue;
10893             }
10894
10895           /* Likewise if OP0 is a PLUS of a sign extension with a
10896              constant, which is usually represented with the PLUS
10897              between the shifts.  */
10898           if (! unsigned_comparison_p
10899               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10900               && GET_CODE (XEXP (op0, 0)) == PLUS
10901               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10902               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
10903               && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
10904               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10905                                          MODE_INT, 1)) != BLKmode
10906               && (((unsigned HOST_WIDE_INT) const_op
10907                    + (GET_MODE_MASK (tmode) >> 1) + 1)
10908                   <= GET_MODE_MASK (tmode)))
10909             {
10910               rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
10911               rtx add_const = XEXP (XEXP (op0, 0), 1);
10912               rtx new_const = gen_binary (ASHIFTRT, GET_MODE (op0), add_const,
10913                                           XEXP (op0, 1));
10914
10915               op0 = gen_binary (PLUS, tmode,
10916                                 gen_lowpart_for_combine (tmode, inner),
10917                                 new_const);
10918               continue;
10919             }
10920
10921           /* ... fall through ...  */
10922         case LSHIFTRT:
10923           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
10924              the low order N bits of FOO are known to be zero, we can do this
10925              by comparing FOO with C shifted left N bits so long as no
10926              overflow occurs.  */
10927           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10928               && INTVAL (XEXP (op0, 1)) >= 0
10929               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10930               && mode_width <= HOST_BITS_PER_WIDE_INT
10931               && (nonzero_bits (XEXP (op0, 0), mode)
10932                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
10933               && (((unsigned HOST_WIDE_INT) const_op
10934                    + (GET_CODE (op0) != LSHIFTRT
10935                       ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
10936                          + 1)
10937                       : 0))
10938                   <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
10939             {
10940               /* If the shift was logical, then we must make the condition
10941                  unsigned.  */
10942               if (GET_CODE (op0) == LSHIFTRT)
10943                 code = unsigned_condition (code);
10944
10945               const_op <<= INTVAL (XEXP (op0, 1));
10946               op1 = GEN_INT (const_op);
10947               op0 = XEXP (op0, 0);
10948               continue;
10949             }
10950
10951           /* If we are using this shift to extract just the sign bit, we
10952              can replace this with an LT or GE comparison.  */
10953           if (const_op == 0
10954               && (equality_comparison_p || sign_bit_comparison_p)
10955               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10956               && INTVAL (XEXP (op0, 1)) == mode_width - 1)
10957             {
10958               op0 = XEXP (op0, 0);
10959               code = (code == NE || code == GT ? LT : GE);
10960               continue;
10961             }
10962           break;
10963
10964         default:
10965           break;
10966         }
10967
10968       break;
10969     }
10970
10971   /* Now make any compound operations involved in this comparison.  Then,
10972      check for an outmost SUBREG on OP0 that is not doing anything or is
10973      paradoxical.  The latter transformation must only be performed when
10974      it is known that the "extra" bits will be the same in op0 and op1 or
10975      that they don't matter.  There are three cases to consider:
10976
10977      1. SUBREG_REG (op0) is a register.  In this case the bits are don't
10978      care bits and we can assume they have any convenient value.  So
10979      making the transformation is safe.
10980
10981      2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
10982      In this case the upper bits of op0 are undefined.  We should not make
10983      the simplification in that case as we do not know the contents of
10984      those bits.
10985
10986      3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
10987      NIL.  In that case we know those bits are zeros or ones.  We must
10988      also be sure that they are the same as the upper bits of op1.
10989
10990      We can never remove a SUBREG for a non-equality comparison because
10991      the sign bit is in a different place in the underlying object.  */
10992
10993   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
10994   op1 = make_compound_operation (op1, SET);
10995
10996   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
10997       /* Case 3 above, to sometimes allow (subreg (mem x)), isn't
10998          implemented.  */
10999       && GET_CODE (SUBREG_REG (op0)) == REG
11000       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11001       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
11002       && (code == NE || code == EQ))
11003     {
11004       if (GET_MODE_SIZE (GET_MODE (op0))
11005           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
11006         {
11007           op0 = SUBREG_REG (op0);
11008           op1 = gen_lowpart_for_combine (GET_MODE (op0), op1);
11009         }
11010       else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
11011                 <= HOST_BITS_PER_WIDE_INT)
11012                && (nonzero_bits (SUBREG_REG (op0),
11013                                  GET_MODE (SUBREG_REG (op0)))
11014                    & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11015         {
11016           tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)), op1);
11017
11018           if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
11019                & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11020             op0 = SUBREG_REG (op0), op1 = tem;
11021         }
11022     }
11023
11024   /* We now do the opposite procedure: Some machines don't have compare
11025      insns in all modes.  If OP0's mode is an integer mode smaller than a
11026      word and we can't do a compare in that mode, see if there is a larger
11027      mode for which we can do the compare.  There are a number of cases in
11028      which we can use the wider mode.  */
11029
11030   mode = GET_MODE (op0);
11031   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11032       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
11033       && ! have_insn_for (COMPARE, mode))
11034     for (tmode = GET_MODE_WIDER_MODE (mode);
11035          (tmode != VOIDmode
11036           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
11037          tmode = GET_MODE_WIDER_MODE (tmode))
11038       if (have_insn_for (COMPARE, tmode))
11039         {
11040           int zero_extended;
11041
11042           /* If the only nonzero bits in OP0 and OP1 are those in the
11043              narrower mode and this is an equality or unsigned comparison,
11044              we can use the wider mode.  Similarly for sign-extended
11045              values, in which case it is true for all comparisons.  */
11046           zero_extended = ((code == EQ || code == NE
11047                             || code == GEU || code == GTU
11048                             || code == LEU || code == LTU)
11049                            && (nonzero_bits (op0, tmode)
11050                                & ~GET_MODE_MASK (mode)) == 0
11051                            && ((GET_CODE (op1) == CONST_INT
11052                                 || (nonzero_bits (op1, tmode)
11053                                     & ~GET_MODE_MASK (mode)) == 0)));
11054
11055           if (zero_extended
11056               || ((num_sign_bit_copies (op0, tmode)
11057                    > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
11058                   && (num_sign_bit_copies (op1, tmode)
11059                       > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))))
11060             {
11061               /* If OP0 is an AND and we don't have an AND in MODE either,
11062                  make a new AND in the proper mode.  */
11063               if (GET_CODE (op0) == AND
11064                   && !have_insn_for (AND, mode))
11065                 op0 = gen_binary (AND, tmode,
11066                                   gen_lowpart_for_combine (tmode,
11067                                                            XEXP (op0, 0)),
11068                                   gen_lowpart_for_combine (tmode,
11069                                                            XEXP (op0, 1)));
11070
11071               op0 = gen_lowpart_for_combine (tmode, op0);
11072               if (zero_extended && GET_CODE (op1) == CONST_INT)
11073                 op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
11074               op1 = gen_lowpart_for_combine (tmode, op1);
11075               break;
11076             }
11077
11078           /* If this is a test for negative, we can make an explicit
11079              test of the sign bit.  */
11080
11081           if (op1 == const0_rtx && (code == LT || code == GE)
11082               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11083             {
11084               op0 = gen_binary (AND, tmode,
11085                                 gen_lowpart_for_combine (tmode, op0),
11086                                 GEN_INT ((HOST_WIDE_INT) 1
11087                                          << (GET_MODE_BITSIZE (mode) - 1)));
11088               code = (code == LT) ? NE : EQ;
11089               break;
11090             }
11091         }
11092
11093 #ifdef CANONICALIZE_COMPARISON
11094   /* If this machine only supports a subset of valid comparisons, see if we
11095      can convert an unsupported one into a supported one.  */
11096   CANONICALIZE_COMPARISON (code, op0, op1);
11097 #endif
11098
11099   *pop0 = op0;
11100   *pop1 = op1;
11101
11102   return code;
11103 }
11104 \f
11105 /* Like jump.c' reversed_comparison_code, but use combine infrastructure for
11106    searching backward.  */
11107 static enum rtx_code
11108 combine_reversed_comparison_code (exp)
11109      rtx exp;
11110 {
11111   enum rtx_code code1 = reversed_comparison_code (exp, NULL);
11112   rtx x;
11113
11114   if (code1 != UNKNOWN
11115       || GET_MODE_CLASS (GET_MODE (XEXP (exp, 0))) != MODE_CC)
11116     return code1;
11117   /* Otherwise try and find where the condition codes were last set and
11118      use that.  */
11119   x = get_last_value (XEXP (exp, 0));
11120   if (!x || GET_CODE (x) != COMPARE)
11121     return UNKNOWN;
11122   return reversed_comparison_code_parts (GET_CODE (exp),
11123                                          XEXP (x, 0), XEXP (x, 1), NULL);
11124 }
11125 /* Return comparison with reversed code of EXP and operands OP0 and OP1.
11126    Return NULL_RTX in case we fail to do the reversal.  */
11127 static rtx
11128 reversed_comparison (exp, mode, op0, op1)
11129      rtx exp, op0, op1;
11130      enum machine_mode mode;
11131 {
11132   enum rtx_code reversed_code = combine_reversed_comparison_code (exp);
11133   if (reversed_code == UNKNOWN)
11134     return NULL_RTX;
11135   else
11136     return gen_binary (reversed_code, mode, op0, op1);
11137 }
11138 \f
11139 /* Utility function for following routine.  Called when X is part of a value
11140    being stored into reg_last_set_value.  Sets reg_last_set_table_tick
11141    for each register mentioned.  Similar to mention_regs in cse.c  */
11142
11143 static void
11144 update_table_tick (x)
11145      rtx x;
11146 {
11147   enum rtx_code code = GET_CODE (x);
11148   const char *fmt = GET_RTX_FORMAT (code);
11149   int i;
11150
11151   if (code == REG)
11152     {
11153       unsigned int regno = REGNO (x);
11154       unsigned int endregno
11155         = regno + (regno < FIRST_PSEUDO_REGISTER
11156                    ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
11157       unsigned int r;
11158
11159       for (r = regno; r < endregno; r++)
11160         reg_last_set_table_tick[r] = label_tick;
11161
11162       return;
11163     }
11164
11165   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11166     /* Note that we can't have an "E" in values stored; see
11167        get_last_value_validate.  */
11168     if (fmt[i] == 'e')
11169       update_table_tick (XEXP (x, i));
11170 }
11171
11172 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
11173    are saying that the register is clobbered and we no longer know its
11174    value.  If INSN is zero, don't update reg_last_set; this is only permitted
11175    with VALUE also zero and is used to invalidate the register.  */
11176
11177 static void
11178 record_value_for_reg (reg, insn, value)
11179      rtx reg;
11180      rtx insn;
11181      rtx value;
11182 {
11183   unsigned int regno = REGNO (reg);
11184   unsigned int endregno
11185     = regno + (regno < FIRST_PSEUDO_REGISTER
11186                ? HARD_REGNO_NREGS (regno, GET_MODE (reg)) : 1);
11187   unsigned int i;
11188
11189   /* If VALUE contains REG and we have a previous value for REG, substitute
11190      the previous value.  */
11191   if (value && insn && reg_overlap_mentioned_p (reg, value))
11192     {
11193       rtx tem;
11194
11195       /* Set things up so get_last_value is allowed to see anything set up to
11196          our insn.  */
11197       subst_low_cuid = INSN_CUID (insn);
11198       tem = get_last_value (reg);
11199
11200       /* If TEM is simply a binary operation with two CLOBBERs as operands,
11201          it isn't going to be useful and will take a lot of time to process,
11202          so just use the CLOBBER.  */
11203
11204       if (tem)
11205         {
11206           if ((GET_RTX_CLASS (GET_CODE (tem)) == '2'
11207                || GET_RTX_CLASS (GET_CODE (tem)) == 'c')
11208               && GET_CODE (XEXP (tem, 0)) == CLOBBER
11209               && GET_CODE (XEXP (tem, 1)) == CLOBBER)
11210             tem = XEXP (tem, 0);
11211
11212           value = replace_rtx (copy_rtx (value), reg, tem);
11213         }
11214     }
11215
11216   /* For each register modified, show we don't know its value, that
11217      we don't know about its bitwise content, that its value has been
11218      updated, and that we don't know the location of the death of the
11219      register.  */
11220   for (i = regno; i < endregno; i++)
11221     {
11222       if (insn)
11223         reg_last_set[i] = insn;
11224
11225       reg_last_set_value[i] = 0;
11226       reg_last_set_mode[i] = 0;
11227       reg_last_set_nonzero_bits[i] = 0;
11228       reg_last_set_sign_bit_copies[i] = 0;
11229       reg_last_death[i] = 0;
11230     }
11231
11232   /* Mark registers that are being referenced in this value.  */
11233   if (value)
11234     update_table_tick (value);
11235
11236   /* Now update the status of each register being set.
11237      If someone is using this register in this block, set this register
11238      to invalid since we will get confused between the two lives in this
11239      basic block.  This makes using this register always invalid.  In cse, we
11240      scan the table to invalidate all entries using this register, but this
11241      is too much work for us.  */
11242
11243   for (i = regno; i < endregno; i++)
11244     {
11245       reg_last_set_label[i] = label_tick;
11246       if (value && reg_last_set_table_tick[i] == label_tick)
11247         reg_last_set_invalid[i] = 1;
11248       else
11249         reg_last_set_invalid[i] = 0;
11250     }
11251
11252   /* The value being assigned might refer to X (like in "x++;").  In that
11253      case, we must replace it with (clobber (const_int 0)) to prevent
11254      infinite loops.  */
11255   if (value && ! get_last_value_validate (&value, insn,
11256                                           reg_last_set_label[regno], 0))
11257     {
11258       value = copy_rtx (value);
11259       if (! get_last_value_validate (&value, insn,
11260                                      reg_last_set_label[regno], 1))
11261         value = 0;
11262     }
11263
11264   /* For the main register being modified, update the value, the mode, the
11265      nonzero bits, and the number of sign bit copies.  */
11266
11267   reg_last_set_value[regno] = value;
11268
11269   if (value)
11270     {
11271       enum machine_mode mode = GET_MODE (reg);
11272       subst_low_cuid = INSN_CUID (insn);
11273       reg_last_set_mode[regno] = mode;
11274       if (GET_MODE_CLASS (mode) == MODE_INT
11275           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11276         mode = nonzero_bits_mode;
11277       reg_last_set_nonzero_bits[regno] = nonzero_bits (value, mode);
11278       reg_last_set_sign_bit_copies[regno]
11279         = num_sign_bit_copies (value, GET_MODE (reg));
11280     }
11281 }
11282
11283 /* Called via note_stores from record_dead_and_set_regs to handle one
11284    SET or CLOBBER in an insn.  DATA is the instruction in which the
11285    set is occurring.  */
11286
11287 static void
11288 record_dead_and_set_regs_1 (dest, setter, data)
11289      rtx dest, setter;
11290      void *data;
11291 {
11292   rtx record_dead_insn = (rtx) data;
11293
11294   if (GET_CODE (dest) == SUBREG)
11295     dest = SUBREG_REG (dest);
11296
11297   if (GET_CODE (dest) == REG)
11298     {
11299       /* If we are setting the whole register, we know its value.  Otherwise
11300          show that we don't know the value.  We can handle SUBREG in
11301          some cases.  */
11302       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11303         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11304       else if (GET_CODE (setter) == SET
11305                && GET_CODE (SET_DEST (setter)) == SUBREG
11306                && SUBREG_REG (SET_DEST (setter)) == dest
11307                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
11308                && subreg_lowpart_p (SET_DEST (setter)))
11309         record_value_for_reg (dest, record_dead_insn,
11310                               gen_lowpart_for_combine (GET_MODE (dest),
11311                                                        SET_SRC (setter)));
11312       else
11313         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
11314     }
11315   else if (GET_CODE (dest) == MEM
11316            /* Ignore pushes, they clobber nothing.  */
11317            && ! push_operand (dest, GET_MODE (dest)))
11318     mem_last_set = INSN_CUID (record_dead_insn);
11319 }
11320
11321 /* Update the records of when each REG was most recently set or killed
11322    for the things done by INSN.  This is the last thing done in processing
11323    INSN in the combiner loop.
11324
11325    We update reg_last_set, reg_last_set_value, reg_last_set_mode,
11326    reg_last_set_nonzero_bits, reg_last_set_sign_bit_copies, reg_last_death,
11327    and also the similar information mem_last_set (which insn most recently
11328    modified memory) and last_call_cuid (which insn was the most recent
11329    subroutine call).  */
11330
11331 static void
11332 record_dead_and_set_regs (insn)
11333      rtx insn;
11334 {
11335   rtx link;
11336   unsigned int i;
11337
11338   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11339     {
11340       if (REG_NOTE_KIND (link) == REG_DEAD
11341           && GET_CODE (XEXP (link, 0)) == REG)
11342         {
11343           unsigned int regno = REGNO (XEXP (link, 0));
11344           unsigned int endregno
11345             = regno + (regno < FIRST_PSEUDO_REGISTER
11346                        ? HARD_REGNO_NREGS (regno, GET_MODE (XEXP (link, 0)))
11347                        : 1);
11348
11349           for (i = regno; i < endregno; i++)
11350             reg_last_death[i] = insn;
11351         }
11352       else if (REG_NOTE_KIND (link) == REG_INC)
11353         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
11354     }
11355
11356   if (GET_CODE (insn) == CALL_INSN)
11357     {
11358       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11359         if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
11360           {
11361             reg_last_set_value[i] = 0;
11362             reg_last_set_mode[i] = 0;
11363             reg_last_set_nonzero_bits[i] = 0;
11364             reg_last_set_sign_bit_copies[i] = 0;
11365             reg_last_death[i] = 0;
11366           }
11367
11368       last_call_cuid = mem_last_set = INSN_CUID (insn);
11369
11370       /* Don't bother recording what this insn does.  It might set the
11371          return value register, but we can't combine into a call
11372          pattern anyway, so there's no point trying (and it may cause
11373          a crash, if e.g. we wind up asking for last_set_value of a
11374          SUBREG of the return value register).  */
11375       return;
11376     }
11377
11378   note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
11379 }
11380
11381 /* If a SUBREG has the promoted bit set, it is in fact a property of the
11382    register present in the SUBREG, so for each such SUBREG go back and
11383    adjust nonzero and sign bit information of the registers that are
11384    known to have some zero/sign bits set.
11385
11386    This is needed because when combine blows the SUBREGs away, the
11387    information on zero/sign bits is lost and further combines can be
11388    missed because of that.  */
11389
11390 static void
11391 record_promoted_value (insn, subreg)
11392      rtx insn;
11393      rtx subreg;
11394 {
11395   rtx links, set;
11396   unsigned int regno = REGNO (SUBREG_REG (subreg));
11397   enum machine_mode mode = GET_MODE (subreg);
11398
11399   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
11400     return;
11401
11402   for (links = LOG_LINKS (insn); links;)
11403     {
11404       insn = XEXP (links, 0);
11405       set = single_set (insn);
11406
11407       if (! set || GET_CODE (SET_DEST (set)) != REG
11408           || REGNO (SET_DEST (set)) != regno
11409           || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11410         {
11411           links = XEXP (links, 1);
11412           continue;
11413         }
11414
11415       if (reg_last_set[regno] == insn)
11416         {
11417           if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
11418             reg_last_set_nonzero_bits[regno] &= GET_MODE_MASK (mode);
11419         }
11420
11421       if (GET_CODE (SET_SRC (set)) == REG)
11422         {
11423           regno = REGNO (SET_SRC (set));
11424           links = LOG_LINKS (insn);
11425         }
11426       else
11427         break;
11428     }
11429 }
11430
11431 /* Scan X for promoted SUBREGs.  For each one found,
11432    note what it implies to the registers used in it.  */
11433
11434 static void
11435 check_promoted_subreg (insn, x)
11436      rtx insn;
11437      rtx x;
11438 {
11439   if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x)
11440       && GET_CODE (SUBREG_REG (x)) == REG)
11441     record_promoted_value (insn, x);
11442   else
11443     {
11444       const char *format = GET_RTX_FORMAT (GET_CODE (x));
11445       int i, j;
11446
11447       for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
11448         switch (format[i])
11449           {
11450           case 'e':
11451             check_promoted_subreg (insn, XEXP (x, i));
11452             break;
11453           case 'V':
11454           case 'E':
11455             if (XVEC (x, i) != 0)
11456               for (j = 0; j < XVECLEN (x, i); j++)
11457                 check_promoted_subreg (insn, XVECEXP (x, i, j));
11458             break;
11459           }
11460     }
11461 }
11462 \f
11463 /* Utility routine for the following function.  Verify that all the registers
11464    mentioned in *LOC are valid when *LOC was part of a value set when
11465    label_tick == TICK.  Return 0 if some are not.
11466
11467    If REPLACE is non-zero, replace the invalid reference with
11468    (clobber (const_int 0)) and return 1.  This replacement is useful because
11469    we often can get useful information about the form of a value (e.g., if
11470    it was produced by a shift that always produces -1 or 0) even though
11471    we don't know exactly what registers it was produced from.  */
11472
11473 static int
11474 get_last_value_validate (loc, insn, tick, replace)
11475      rtx *loc;
11476      rtx insn;
11477      int tick;
11478      int replace;
11479 {
11480   rtx x = *loc;
11481   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
11482   int len = GET_RTX_LENGTH (GET_CODE (x));
11483   int i;
11484
11485   if (GET_CODE (x) == REG)
11486     {
11487       unsigned int regno = REGNO (x);
11488       unsigned int endregno
11489         = regno + (regno < FIRST_PSEUDO_REGISTER
11490                    ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
11491       unsigned int j;
11492
11493       for (j = regno; j < endregno; j++)
11494         if (reg_last_set_invalid[j]
11495             /* If this is a pseudo-register that was only set once and not
11496                live at the beginning of the function, it is always valid.  */
11497             || (! (regno >= FIRST_PSEUDO_REGISTER
11498                    && REG_N_SETS (regno) == 1
11499                    && (! REGNO_REG_SET_P
11500                        (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))
11501                 && reg_last_set_label[j] > tick))
11502           {
11503             if (replace)
11504               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11505             return replace;
11506           }
11507
11508       return 1;
11509     }
11510   /* If this is a memory reference, make sure that there were
11511      no stores after it that might have clobbered the value.  We don't
11512      have alias info, so we assume any store invalidates it.  */
11513   else if (GET_CODE (x) == MEM && ! RTX_UNCHANGING_P (x)
11514            && INSN_CUID (insn) <= mem_last_set)
11515     {
11516       if (replace)
11517         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11518       return replace;
11519     }
11520
11521   for (i = 0; i < len; i++)
11522     if ((fmt[i] == 'e'
11523          && get_last_value_validate (&XEXP (x, i), insn, tick, replace) == 0)
11524         /* Don't bother with these.  They shouldn't occur anyway.  */
11525         || fmt[i] == 'E')
11526       return 0;
11527
11528   /* If we haven't found a reason for it to be invalid, it is valid.  */
11529   return 1;
11530 }
11531
11532 /* Get the last value assigned to X, if known.  Some registers
11533    in the value may be replaced with (clobber (const_int 0)) if their value
11534    is known longer known reliably.  */
11535
11536 static rtx
11537 get_last_value (x)
11538      rtx x;
11539 {
11540   unsigned int regno;
11541   rtx value;
11542
11543   /* If this is a non-paradoxical SUBREG, get the value of its operand and
11544      then convert it to the desired mode.  If this is a paradoxical SUBREG,
11545      we cannot predict what values the "extra" bits might have.  */
11546   if (GET_CODE (x) == SUBREG
11547       && subreg_lowpart_p (x)
11548       && (GET_MODE_SIZE (GET_MODE (x))
11549           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
11550       && (value = get_last_value (SUBREG_REG (x))) != 0)
11551     return gen_lowpart_for_combine (GET_MODE (x), value);
11552
11553   if (GET_CODE (x) != REG)
11554     return 0;
11555
11556   regno = REGNO (x);
11557   value = reg_last_set_value[regno];
11558
11559   /* If we don't have a value, or if it isn't for this basic block and
11560      it's either a hard register, set more than once, or it's a live
11561      at the beginning of the function, return 0.
11562
11563      Because if it's not live at the beginning of the function then the reg
11564      is always set before being used (is never used without being set).
11565      And, if it's set only once, and it's always set before use, then all
11566      uses must have the same last value, even if it's not from this basic
11567      block.  */
11568
11569   if (value == 0
11570       || (reg_last_set_label[regno] != label_tick
11571           && (regno < FIRST_PSEUDO_REGISTER
11572               || REG_N_SETS (regno) != 1
11573               || (REGNO_REG_SET_P
11574                   (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))))
11575     return 0;
11576
11577   /* If the value was set in a later insn than the ones we are processing,
11578      we can't use it even if the register was only set once.  */
11579   if (INSN_CUID (reg_last_set[regno]) >= subst_low_cuid)
11580     return 0;
11581
11582   /* If the value has all its registers valid, return it.  */
11583   if (get_last_value_validate (&value, reg_last_set[regno],
11584                                reg_last_set_label[regno], 0))
11585     return value;
11586
11587   /* Otherwise, make a copy and replace any invalid register with
11588      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
11589
11590   value = copy_rtx (value);
11591   if (get_last_value_validate (&value, reg_last_set[regno],
11592                                reg_last_set_label[regno], 1))
11593     return value;
11594
11595   return 0;
11596 }
11597 \f
11598 /* Return nonzero if expression X refers to a REG or to memory
11599    that is set in an instruction more recent than FROM_CUID.  */
11600
11601 static int
11602 use_crosses_set_p (x, from_cuid)
11603      rtx x;
11604      int from_cuid;
11605 {
11606   const char *fmt;
11607   int i;
11608   enum rtx_code code = GET_CODE (x);
11609
11610   if (code == REG)
11611     {
11612       unsigned int regno = REGNO (x);
11613       unsigned endreg = regno + (regno < FIRST_PSEUDO_REGISTER
11614                                  ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
11615
11616 #ifdef PUSH_ROUNDING
11617       /* Don't allow uses of the stack pointer to be moved,
11618          because we don't know whether the move crosses a push insn.  */
11619       if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
11620         return 1;
11621 #endif
11622       for (; regno < endreg; regno++)
11623         if (reg_last_set[regno]
11624             && INSN_CUID (reg_last_set[regno]) > from_cuid)
11625           return 1;
11626       return 0;
11627     }
11628
11629   if (code == MEM && mem_last_set > from_cuid)
11630     return 1;
11631
11632   fmt = GET_RTX_FORMAT (code);
11633
11634   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11635     {
11636       if (fmt[i] == 'E')
11637         {
11638           int j;
11639           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11640             if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
11641               return 1;
11642         }
11643       else if (fmt[i] == 'e'
11644                && use_crosses_set_p (XEXP (x, i), from_cuid))
11645         return 1;
11646     }
11647   return 0;
11648 }
11649 \f
11650 /* Define three variables used for communication between the following
11651    routines.  */
11652
11653 static unsigned int reg_dead_regno, reg_dead_endregno;
11654 static int reg_dead_flag;
11655
11656 /* Function called via note_stores from reg_dead_at_p.
11657
11658    If DEST is within [reg_dead_regno, reg_dead_endregno), set
11659    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
11660
11661 static void
11662 reg_dead_at_p_1 (dest, x, data)
11663      rtx dest;
11664      rtx x;
11665      void *data ATTRIBUTE_UNUSED;
11666 {
11667   unsigned int regno, endregno;
11668
11669   if (GET_CODE (dest) != REG)
11670     return;
11671
11672   regno = REGNO (dest);
11673   endregno = regno + (regno < FIRST_PSEUDO_REGISTER
11674                       ? HARD_REGNO_NREGS (regno, GET_MODE (dest)) : 1);
11675
11676   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
11677     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
11678 }
11679
11680 /* Return non-zero if REG is known to be dead at INSN.
11681
11682    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
11683    referencing REG, it is dead.  If we hit a SET referencing REG, it is
11684    live.  Otherwise, see if it is live or dead at the start of the basic
11685    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
11686    must be assumed to be always live.  */
11687
11688 static int
11689 reg_dead_at_p (reg, insn)
11690      rtx reg;
11691      rtx insn;
11692 {
11693   basic_block block;
11694   unsigned int i;
11695
11696   /* Set variables for reg_dead_at_p_1.  */
11697   reg_dead_regno = REGNO (reg);
11698   reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
11699                                         ? HARD_REGNO_NREGS (reg_dead_regno,
11700                                                             GET_MODE (reg))
11701                                         : 1);
11702
11703   reg_dead_flag = 0;
11704
11705   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  */
11706   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
11707     {
11708       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11709         if (TEST_HARD_REG_BIT (newpat_used_regs, i))
11710           return 0;
11711     }
11712
11713   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
11714      beginning of function.  */
11715   for (; insn && GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != BARRIER;
11716        insn = prev_nonnote_insn (insn))
11717     {
11718       note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
11719       if (reg_dead_flag)
11720         return reg_dead_flag == 1 ? 1 : 0;
11721
11722       if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
11723         return 1;
11724     }
11725
11726   /* Get the basic block that we were in.  */
11727   if (insn == 0)
11728     block = ENTRY_BLOCK_PTR->next_bb;
11729   else
11730     {
11731       FOR_EACH_BB (block)
11732         if (insn == block->head)
11733           break;
11734
11735       if (block == EXIT_BLOCK_PTR)
11736         return 0;
11737     }
11738
11739   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11740     if (REGNO_REG_SET_P (block->global_live_at_start, i))
11741       return 0;
11742
11743   return 1;
11744 }
11745 \f
11746 /* Note hard registers in X that are used.  This code is similar to
11747    that in flow.c, but much simpler since we don't care about pseudos.  */
11748
11749 static void
11750 mark_used_regs_combine (x)
11751      rtx x;
11752 {
11753   RTX_CODE code = GET_CODE (x);
11754   unsigned int regno;
11755   int i;
11756
11757   switch (code)
11758     {
11759     case LABEL_REF:
11760     case SYMBOL_REF:
11761     case CONST_INT:
11762     case CONST:
11763     case CONST_DOUBLE:
11764     case CONST_VECTOR:
11765     case PC:
11766     case ADDR_VEC:
11767     case ADDR_DIFF_VEC:
11768     case ASM_INPUT:
11769 #ifdef HAVE_cc0
11770     /* CC0 must die in the insn after it is set, so we don't need to take
11771        special note of it here.  */
11772     case CC0:
11773 #endif
11774       return;
11775
11776     case CLOBBER:
11777       /* If we are clobbering a MEM, mark any hard registers inside the
11778          address as used.  */
11779       if (GET_CODE (XEXP (x, 0)) == MEM)
11780         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
11781       return;
11782
11783     case REG:
11784       regno = REGNO (x);
11785       /* A hard reg in a wide mode may really be multiple registers.
11786          If so, mark all of them just like the first.  */
11787       if (regno < FIRST_PSEUDO_REGISTER)
11788         {
11789           unsigned int endregno, r;
11790
11791           /* None of this applies to the stack, frame or arg pointers */
11792           if (regno == STACK_POINTER_REGNUM
11793 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
11794               || regno == HARD_FRAME_POINTER_REGNUM
11795 #endif
11796 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
11797               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
11798 #endif
11799               || regno == FRAME_POINTER_REGNUM)
11800             return;
11801
11802           endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11803           for (r = regno; r < endregno; r++)
11804             SET_HARD_REG_BIT (newpat_used_regs, r);
11805         }
11806       return;
11807
11808     case SET:
11809       {
11810         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
11811            the address.  */
11812         rtx testreg = SET_DEST (x);
11813
11814         while (GET_CODE (testreg) == SUBREG
11815                || GET_CODE (testreg) == ZERO_EXTRACT
11816                || GET_CODE (testreg) == SIGN_EXTRACT
11817                || GET_CODE (testreg) == STRICT_LOW_PART)
11818           testreg = XEXP (testreg, 0);
11819
11820         if (GET_CODE (testreg) == MEM)
11821           mark_used_regs_combine (XEXP (testreg, 0));
11822
11823         mark_used_regs_combine (SET_SRC (x));
11824       }
11825       return;
11826
11827     default:
11828       break;
11829     }
11830
11831   /* Recursively scan the operands of this expression.  */
11832
11833   {
11834     const char *fmt = GET_RTX_FORMAT (code);
11835
11836     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11837       {
11838         if (fmt[i] == 'e')
11839           mark_used_regs_combine (XEXP (x, i));
11840         else if (fmt[i] == 'E')
11841           {
11842             int j;
11843
11844             for (j = 0; j < XVECLEN (x, i); j++)
11845               mark_used_regs_combine (XVECEXP (x, i, j));
11846           }
11847       }
11848   }
11849 }
11850 \f
11851 /* Remove register number REGNO from the dead registers list of INSN.
11852
11853    Return the note used to record the death, if there was one.  */
11854
11855 rtx
11856 remove_death (regno, insn)
11857      unsigned int regno;
11858      rtx insn;
11859 {
11860   rtx note = find_regno_note (insn, REG_DEAD, regno);
11861
11862   if (note)
11863     {
11864       REG_N_DEATHS (regno)--;
11865       remove_note (insn, note);
11866     }
11867
11868   return note;
11869 }
11870
11871 /* For each register (hardware or pseudo) used within expression X, if its
11872    death is in an instruction with cuid between FROM_CUID (inclusive) and
11873    TO_INSN (exclusive), put a REG_DEAD note for that register in the
11874    list headed by PNOTES.
11875
11876    That said, don't move registers killed by maybe_kill_insn.
11877
11878    This is done when X is being merged by combination into TO_INSN.  These
11879    notes will then be distributed as needed.  */
11880
11881 static void
11882 move_deaths (x, maybe_kill_insn, from_cuid, to_insn, pnotes)
11883      rtx x;
11884      rtx maybe_kill_insn;
11885      int from_cuid;
11886      rtx to_insn;
11887      rtx *pnotes;
11888 {
11889   const char *fmt;
11890   int len, i;
11891   enum rtx_code code = GET_CODE (x);
11892
11893   if (code == REG)
11894     {
11895       unsigned int regno = REGNO (x);
11896       rtx where_dead = reg_last_death[regno];
11897       rtx before_dead, after_dead;
11898
11899       /* Don't move the register if it gets killed in between from and to */
11900       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
11901           && ! reg_referenced_p (x, maybe_kill_insn))
11902         return;
11903
11904       /* WHERE_DEAD could be a USE insn made by combine, so first we
11905          make sure that we have insns with valid INSN_CUID values.  */
11906       before_dead = where_dead;
11907       while (before_dead && INSN_UID (before_dead) > max_uid_cuid)
11908         before_dead = PREV_INSN (before_dead);
11909
11910       after_dead = where_dead;
11911       while (after_dead && INSN_UID (after_dead) > max_uid_cuid)
11912         after_dead = NEXT_INSN (after_dead);
11913
11914       if (before_dead && after_dead
11915           && INSN_CUID (before_dead) >= from_cuid
11916           && (INSN_CUID (after_dead) < INSN_CUID (to_insn)
11917               || (where_dead != after_dead
11918                   && INSN_CUID (after_dead) == INSN_CUID (to_insn))))
11919         {
11920           rtx note = remove_death (regno, where_dead);
11921
11922           /* It is possible for the call above to return 0.  This can occur
11923              when reg_last_death points to I2 or I1 that we combined with.
11924              In that case make a new note.
11925
11926              We must also check for the case where X is a hard register
11927              and NOTE is a death note for a range of hard registers
11928              including X.  In that case, we must put REG_DEAD notes for
11929              the remaining registers in place of NOTE.  */
11930
11931           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
11932               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11933                   > GET_MODE_SIZE (GET_MODE (x))))
11934             {
11935               unsigned int deadregno = REGNO (XEXP (note, 0));
11936               unsigned int deadend
11937                 = (deadregno + HARD_REGNO_NREGS (deadregno,
11938                                                  GET_MODE (XEXP (note, 0))));
11939               unsigned int ourend
11940                 = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11941               unsigned int i;
11942
11943               for (i = deadregno; i < deadend; i++)
11944                 if (i < regno || i >= ourend)
11945                   REG_NOTES (where_dead)
11946                     = gen_rtx_EXPR_LIST (REG_DEAD,
11947                                          gen_rtx_REG (reg_raw_mode[i], i),
11948                                          REG_NOTES (where_dead));
11949             }
11950
11951           /* If we didn't find any note, or if we found a REG_DEAD note that
11952              covers only part of the given reg, and we have a multi-reg hard
11953              register, then to be safe we must check for REG_DEAD notes
11954              for each register other than the first.  They could have
11955              their own REG_DEAD notes lying around.  */
11956           else if ((note == 0
11957                     || (note != 0
11958                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11959                             < GET_MODE_SIZE (GET_MODE (x)))))
11960                    && regno < FIRST_PSEUDO_REGISTER
11961                    && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
11962             {
11963               unsigned int ourend
11964                 = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11965               unsigned int i, offset;
11966               rtx oldnotes = 0;
11967
11968               if (note)
11969                 offset = HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0)));
11970               else
11971                 offset = 1;
11972
11973               for (i = regno + offset; i < ourend; i++)
11974                 move_deaths (gen_rtx_REG (reg_raw_mode[i], i),
11975                              maybe_kill_insn, from_cuid, to_insn, &oldnotes);
11976             }
11977
11978           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
11979             {
11980               XEXP (note, 1) = *pnotes;
11981               *pnotes = note;
11982             }
11983           else
11984             *pnotes = gen_rtx_EXPR_LIST (REG_DEAD, x, *pnotes);
11985
11986           REG_N_DEATHS (regno)++;
11987         }
11988
11989       return;
11990     }
11991
11992   else if (GET_CODE (x) == SET)
11993     {
11994       rtx dest = SET_DEST (x);
11995
11996       move_deaths (SET_SRC (x), maybe_kill_insn, from_cuid, to_insn, pnotes);
11997
11998       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
11999          that accesses one word of a multi-word item, some
12000          piece of everything register in the expression is used by
12001          this insn, so remove any old death.  */
12002       /* ??? So why do we test for equality of the sizes?  */
12003
12004       if (GET_CODE (dest) == ZERO_EXTRACT
12005           || GET_CODE (dest) == STRICT_LOW_PART
12006           || (GET_CODE (dest) == SUBREG
12007               && (((GET_MODE_SIZE (GET_MODE (dest))
12008                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
12009                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
12010                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
12011         {
12012           move_deaths (dest, maybe_kill_insn, from_cuid, to_insn, pnotes);
12013           return;
12014         }
12015
12016       /* If this is some other SUBREG, we know it replaces the entire
12017          value, so use that as the destination.  */
12018       if (GET_CODE (dest) == SUBREG)
12019         dest = SUBREG_REG (dest);
12020
12021       /* If this is a MEM, adjust deaths of anything used in the address.
12022          For a REG (the only other possibility), the entire value is
12023          being replaced so the old value is not used in this insn.  */
12024
12025       if (GET_CODE (dest) == MEM)
12026         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_cuid,
12027                      to_insn, pnotes);
12028       return;
12029     }
12030
12031   else if (GET_CODE (x) == CLOBBER)
12032     return;
12033
12034   len = GET_RTX_LENGTH (code);
12035   fmt = GET_RTX_FORMAT (code);
12036
12037   for (i = 0; i < len; i++)
12038     {
12039       if (fmt[i] == 'E')
12040         {
12041           int j;
12042           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12043             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_cuid,
12044                          to_insn, pnotes);
12045         }
12046       else if (fmt[i] == 'e')
12047         move_deaths (XEXP (x, i), maybe_kill_insn, from_cuid, to_insn, pnotes);
12048     }
12049 }
12050 \f
12051 /* Return 1 if X is the target of a bit-field assignment in BODY, the
12052    pattern of an insn.  X must be a REG.  */
12053
12054 static int
12055 reg_bitfield_target_p (x, body)
12056      rtx x;
12057      rtx body;
12058 {
12059   int i;
12060
12061   if (GET_CODE (body) == SET)
12062     {
12063       rtx dest = SET_DEST (body);
12064       rtx target;
12065       unsigned int regno, tregno, endregno, endtregno;
12066
12067       if (GET_CODE (dest) == ZERO_EXTRACT)
12068         target = XEXP (dest, 0);
12069       else if (GET_CODE (dest) == STRICT_LOW_PART)
12070         target = SUBREG_REG (XEXP (dest, 0));
12071       else
12072         return 0;
12073
12074       if (GET_CODE (target) == SUBREG)
12075         target = SUBREG_REG (target);
12076
12077       if (GET_CODE (target) != REG)
12078         return 0;
12079
12080       tregno = REGNO (target), regno = REGNO (x);
12081       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
12082         return target == x;
12083
12084       endtregno = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (target));
12085       endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
12086
12087       return endregno > tregno && regno < endtregno;
12088     }
12089
12090   else if (GET_CODE (body) == PARALLEL)
12091     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
12092       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
12093         return 1;
12094
12095   return 0;
12096 }
12097 \f
12098 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
12099    as appropriate.  I3 and I2 are the insns resulting from the combination
12100    insns including FROM (I2 may be zero).
12101
12102    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
12103    not need REG_DEAD notes because they are being substituted for.  This
12104    saves searching in the most common cases.
12105
12106    Each note in the list is either ignored or placed on some insns, depending
12107    on the type of note.  */
12108
12109 static void
12110 distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
12111      rtx notes;
12112      rtx from_insn;
12113      rtx i3, i2;
12114      rtx elim_i2, elim_i1;
12115 {
12116   rtx note, next_note;
12117   rtx tem;
12118
12119   for (note = notes; note; note = next_note)
12120     {
12121       rtx place = 0, place2 = 0;
12122
12123       /* If this NOTE references a pseudo register, ensure it references
12124          the latest copy of that register.  */
12125       if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG
12126           && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
12127         XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
12128
12129       next_note = XEXP (note, 1);
12130       switch (REG_NOTE_KIND (note))
12131         {
12132         case REG_BR_PROB:
12133         case REG_BR_PRED:
12134         case REG_EXEC_COUNT:
12135           /* Doesn't matter much where we put this, as long as it's somewhere.
12136              It is preferable to keep these notes on branches, which is most
12137              likely to be i3.  */
12138           place = i3;
12139           break;
12140
12141         case REG_VTABLE_REF:
12142           /* ??? Should remain with *a particular* memory load.  Given the
12143              nature of vtable data, the last insn seems relatively safe.  */
12144           place = i3;
12145           break;
12146
12147         case REG_NON_LOCAL_GOTO:
12148           if (GET_CODE (i3) == JUMP_INSN)
12149             place = i3;
12150           else if (i2 && GET_CODE (i2) == JUMP_INSN)
12151             place = i2;
12152           else
12153             abort ();
12154           break;
12155
12156         case REG_EH_REGION:
12157           /* These notes must remain with the call or trapping instruction.  */
12158           if (GET_CODE (i3) == CALL_INSN)
12159             place = i3;
12160           else if (i2 && GET_CODE (i2) == CALL_INSN)
12161             place = i2;
12162           else if (flag_non_call_exceptions)
12163             {
12164               if (may_trap_p (i3))
12165                 place = i3;
12166               else if (i2 && may_trap_p (i2))
12167                 place = i2;
12168               /* ??? Otherwise assume we've combined things such that we
12169                  can now prove that the instructions can't trap.  Drop the
12170                  note in this case.  */
12171             }
12172           else
12173             abort ();
12174           break;
12175
12176         case REG_NORETURN:
12177         case REG_SETJMP:
12178           /* These notes must remain with the call.  It should not be
12179              possible for both I2 and I3 to be a call.  */
12180           if (GET_CODE (i3) == CALL_INSN)
12181             place = i3;
12182           else if (i2 && GET_CODE (i2) == CALL_INSN)
12183             place = i2;
12184           else
12185             abort ();
12186           break;
12187
12188         case REG_UNUSED:
12189           /* Any clobbers for i3 may still exist, and so we must process
12190              REG_UNUSED notes from that insn.
12191
12192              Any clobbers from i2 or i1 can only exist if they were added by
12193              recog_for_combine.  In that case, recog_for_combine created the
12194              necessary REG_UNUSED notes.  Trying to keep any original
12195              REG_UNUSED notes from these insns can cause incorrect output
12196              if it is for the same register as the original i3 dest.
12197              In that case, we will notice that the register is set in i3,
12198              and then add a REG_UNUSED note for the destination of i3, which
12199              is wrong.  However, it is possible to have REG_UNUSED notes from
12200              i2 or i1 for register which were both used and clobbered, so
12201              we keep notes from i2 or i1 if they will turn into REG_DEAD
12202              notes.  */
12203
12204           /* If this register is set or clobbered in I3, put the note there
12205              unless there is one already.  */
12206           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
12207             {
12208               if (from_insn != i3)
12209                 break;
12210
12211               if (! (GET_CODE (XEXP (note, 0)) == REG
12212                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
12213                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
12214                 place = i3;
12215             }
12216           /* Otherwise, if this register is used by I3, then this register
12217              now dies here, so we must put a REG_DEAD note here unless there
12218              is one already.  */
12219           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
12220                    && ! (GET_CODE (XEXP (note, 0)) == REG
12221                          ? find_regno_note (i3, REG_DEAD,
12222                                             REGNO (XEXP (note, 0)))
12223                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
12224             {
12225               PUT_REG_NOTE_KIND (note, REG_DEAD);
12226               place = i3;
12227             }
12228           break;
12229
12230         case REG_EQUAL:
12231         case REG_EQUIV:
12232         case REG_NOALIAS:
12233           /* These notes say something about results of an insn.  We can
12234              only support them if they used to be on I3 in which case they
12235              remain on I3.  Otherwise they are ignored.
12236
12237              If the note refers to an expression that is not a constant, we
12238              must also ignore the note since we cannot tell whether the
12239              equivalence is still true.  It might be possible to do
12240              slightly better than this (we only have a problem if I2DEST
12241              or I1DEST is present in the expression), but it doesn't
12242              seem worth the trouble.  */
12243
12244           if (from_insn == i3
12245               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
12246             place = i3;
12247           break;
12248
12249         case REG_INC:
12250         case REG_NO_CONFLICT:
12251           /* These notes say something about how a register is used.  They must
12252              be present on any use of the register in I2 or I3.  */
12253           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
12254             place = i3;
12255
12256           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
12257             {
12258               if (place)
12259                 place2 = i2;
12260               else
12261                 place = i2;
12262             }
12263           break;
12264
12265         case REG_LABEL:
12266           /* This can show up in several ways -- either directly in the
12267              pattern, or hidden off in the constant pool with (or without?)
12268              a REG_EQUAL note.  */
12269           /* ??? Ignore the without-reg_equal-note problem for now.  */
12270           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
12271               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
12272                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12273                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
12274             place = i3;
12275
12276           if (i2
12277               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
12278                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
12279                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12280                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
12281             {
12282               if (place)
12283                 place2 = i2;
12284               else
12285                 place = i2;
12286             }
12287
12288           /* Don't attach REG_LABEL note to a JUMP_INSN which has
12289              JUMP_LABEL already.  Instead, decrement LABEL_NUSES.  */
12290           if (place && GET_CODE (place) == JUMP_INSN && JUMP_LABEL (place))
12291             {
12292               if (JUMP_LABEL (place) != XEXP (note, 0))
12293                 abort ();
12294               if (GET_CODE (JUMP_LABEL (place)) == CODE_LABEL)
12295                 LABEL_NUSES (JUMP_LABEL (place))--;
12296               place = 0;
12297             }
12298           if (place2 && GET_CODE (place2) == JUMP_INSN && JUMP_LABEL (place2))
12299             {
12300               if (JUMP_LABEL (place2) != XEXP (note, 0))
12301                 abort ();
12302               if (GET_CODE (JUMP_LABEL (place2)) == CODE_LABEL)
12303                 LABEL_NUSES (JUMP_LABEL (place2))--;
12304               place2 = 0;
12305             }
12306           break;
12307
12308         case REG_NONNEG:
12309         case REG_WAS_0:
12310           /* These notes say something about the value of a register prior
12311              to the execution of an insn.  It is too much trouble to see
12312              if the note is still correct in all situations.  It is better
12313              to simply delete it.  */
12314           break;
12315
12316         case REG_RETVAL:
12317           /* If the insn previously containing this note still exists,
12318              put it back where it was.  Otherwise move it to the previous
12319              insn.  Adjust the corresponding REG_LIBCALL note.  */
12320           if (GET_CODE (from_insn) != NOTE)
12321             place = from_insn;
12322           else
12323             {
12324               tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
12325               place = prev_real_insn (from_insn);
12326               if (tem && place)
12327                 XEXP (tem, 0) = place;
12328               /* If we're deleting the last remaining instruction of a
12329                  libcall sequence, don't add the notes.  */
12330               else if (XEXP (note, 0) == from_insn)
12331                 tem = place = 0;
12332             }
12333           break;
12334
12335         case REG_LIBCALL:
12336           /* This is handled similarly to REG_RETVAL.  */
12337           if (GET_CODE (from_insn) != NOTE)
12338             place = from_insn;
12339           else
12340             {
12341               tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
12342               place = next_real_insn (from_insn);
12343               if (tem && place)
12344                 XEXP (tem, 0) = place;
12345               /* If we're deleting the last remaining instruction of a
12346                  libcall sequence, don't add the notes.  */
12347               else if (XEXP (note, 0) == from_insn)
12348                 tem = place = 0;
12349             }
12350           break;
12351
12352         case REG_DEAD:
12353           /* If the register is used as an input in I3, it dies there.
12354              Similarly for I2, if it is non-zero and adjacent to I3.
12355
12356              If the register is not used as an input in either I3 or I2
12357              and it is not one of the registers we were supposed to eliminate,
12358              there are two possibilities.  We might have a non-adjacent I2
12359              or we might have somehow eliminated an additional register
12360              from a computation.  For example, we might have had A & B where
12361              we discover that B will always be zero.  In this case we will
12362              eliminate the reference to A.
12363
12364              In both cases, we must search to see if we can find a previous
12365              use of A and put the death note there.  */
12366
12367           if (from_insn
12368               && GET_CODE (from_insn) == CALL_INSN
12369               && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
12370             place = from_insn;
12371           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
12372             place = i3;
12373           else if (i2 != 0 && next_nonnote_insn (i2) == i3
12374                    && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12375             place = i2;
12376
12377           if (rtx_equal_p (XEXP (note, 0), elim_i2)
12378               || rtx_equal_p (XEXP (note, 0), elim_i1))
12379             break;
12380
12381           if (place == 0)
12382             {
12383               basic_block bb = this_basic_block;
12384
12385               for (tem = PREV_INSN (i3); place == 0; tem = PREV_INSN (tem))
12386                 {
12387                   if (! INSN_P (tem))
12388                     {
12389                       if (tem == bb->head)
12390                         break;
12391                       continue;
12392                     }
12393
12394                   /* If the register is being set at TEM, see if that is all
12395                      TEM is doing.  If so, delete TEM.  Otherwise, make this
12396                      into a REG_UNUSED note instead.  */
12397                   if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
12398                     {
12399                       rtx set = single_set (tem);
12400                       rtx inner_dest = 0;
12401 #ifdef HAVE_cc0
12402                       rtx cc0_setter = NULL_RTX;
12403 #endif
12404
12405                       if (set != 0)
12406                         for (inner_dest = SET_DEST (set);
12407                              (GET_CODE (inner_dest) == STRICT_LOW_PART
12408                               || GET_CODE (inner_dest) == SUBREG
12409                               || GET_CODE (inner_dest) == ZERO_EXTRACT);
12410                              inner_dest = XEXP (inner_dest, 0))
12411                           ;
12412
12413                       /* Verify that it was the set, and not a clobber that
12414                          modified the register.
12415
12416                          CC0 targets must be careful to maintain setter/user
12417                          pairs.  If we cannot delete the setter due to side
12418                          effects, mark the user with an UNUSED note instead
12419                          of deleting it.  */
12420
12421                       if (set != 0 && ! side_effects_p (SET_SRC (set))
12422                           && rtx_equal_p (XEXP (note, 0), inner_dest)
12423 #ifdef HAVE_cc0
12424                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
12425                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
12426                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
12427 #endif
12428                           )
12429                         {
12430                           /* Move the notes and links of TEM elsewhere.
12431                              This might delete other dead insns recursively.
12432                              First set the pattern to something that won't use
12433                              any register.  */
12434
12435                           PATTERN (tem) = pc_rtx;
12436
12437                           distribute_notes (REG_NOTES (tem), tem, tem,
12438                                             NULL_RTX, NULL_RTX, NULL_RTX);
12439                           distribute_links (LOG_LINKS (tem));
12440
12441                           PUT_CODE (tem, NOTE);
12442                           NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
12443                           NOTE_SOURCE_FILE (tem) = 0;
12444
12445 #ifdef HAVE_cc0
12446                           /* Delete the setter too.  */
12447                           if (cc0_setter)
12448                             {
12449                               PATTERN (cc0_setter) = pc_rtx;
12450
12451                               distribute_notes (REG_NOTES (cc0_setter),
12452                                                 cc0_setter, cc0_setter,
12453                                                 NULL_RTX, NULL_RTX, NULL_RTX);
12454                               distribute_links (LOG_LINKS (cc0_setter));
12455
12456                               PUT_CODE (cc0_setter, NOTE);
12457                               NOTE_LINE_NUMBER (cc0_setter)
12458                                 = NOTE_INSN_DELETED;
12459                               NOTE_SOURCE_FILE (cc0_setter) = 0;
12460                             }
12461 #endif
12462                         }
12463                       /* If the register is both set and used here, put the
12464                          REG_DEAD note here, but place a REG_UNUSED note
12465                          here too unless there already is one.  */
12466                       else if (reg_referenced_p (XEXP (note, 0),
12467                                                  PATTERN (tem)))
12468                         {
12469                           place = tem;
12470
12471                           if (! find_regno_note (tem, REG_UNUSED,
12472                                                  REGNO (XEXP (note, 0))))
12473                             REG_NOTES (tem)
12474                               = gen_rtx_EXPR_LIST (REG_UNUSED, XEXP (note, 0),
12475                                                    REG_NOTES (tem));
12476                         }
12477                       else
12478                         {
12479                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
12480
12481                           /*  If there isn't already a REG_UNUSED note, put one
12482                               here.  */
12483                           if (! find_regno_note (tem, REG_UNUSED,
12484                                                  REGNO (XEXP (note, 0))))
12485                             place = tem;
12486                           break;
12487                         }
12488                     }
12489                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
12490                            || (GET_CODE (tem) == CALL_INSN
12491                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
12492                     {
12493                       place = tem;
12494
12495                       /* If we are doing a 3->2 combination, and we have a
12496                          register which formerly died in i3 and was not used
12497                          by i2, which now no longer dies in i3 and is used in
12498                          i2 but does not die in i2, and place is between i2
12499                          and i3, then we may need to move a link from place to
12500                          i2.  */
12501                       if (i2 && INSN_UID (place) <= max_uid_cuid
12502                           && INSN_CUID (place) > INSN_CUID (i2)
12503                           && from_insn
12504                           && INSN_CUID (from_insn) > INSN_CUID (i2)
12505                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12506                         {
12507                           rtx links = LOG_LINKS (place);
12508                           LOG_LINKS (place) = 0;
12509                           distribute_links (links);
12510                         }
12511                       break;
12512                     }
12513
12514                   if (tem == bb->head)
12515                     break;
12516                 }
12517
12518               /* We haven't found an insn for the death note and it
12519                  is still a REG_DEAD note, but we have hit the beginning
12520                  of the block.  If the existing life info says the reg
12521                  was dead, there's nothing left to do.  Otherwise, we'll
12522                  need to do a global life update after combine.  */
12523               if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
12524                   && REGNO_REG_SET_P (bb->global_live_at_start,
12525                                       REGNO (XEXP (note, 0))))
12526                 {
12527                   SET_BIT (refresh_blocks, this_basic_block->index);
12528                   need_refresh = 1;
12529                 }
12530             }
12531
12532           /* If the register is set or already dead at PLACE, we needn't do
12533              anything with this note if it is still a REG_DEAD note.
12534              We can here if it is set at all, not if is it totally replace,
12535              which is what `dead_or_set_p' checks, so also check for it being
12536              set partially.  */
12537
12538           if (place && REG_NOTE_KIND (note) == REG_DEAD)
12539             {
12540               unsigned int regno = REGNO (XEXP (note, 0));
12541
12542               /* Similarly, if the instruction on which we want to place
12543                  the note is a noop, we'll need do a global live update
12544                  after we remove them in delete_noop_moves.  */
12545               if (noop_move_p (place))
12546                 {
12547                   SET_BIT (refresh_blocks, this_basic_block->index);
12548                   need_refresh = 1;
12549                 }
12550
12551               if (dead_or_set_p (place, XEXP (note, 0))
12552                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
12553                 {
12554                   /* Unless the register previously died in PLACE, clear
12555                      reg_last_death.  [I no longer understand why this is
12556                      being done.] */
12557                   if (reg_last_death[regno] != place)
12558                     reg_last_death[regno] = 0;
12559                   place = 0;
12560                 }
12561               else
12562                 reg_last_death[regno] = place;
12563
12564               /* If this is a death note for a hard reg that is occupying
12565                  multiple registers, ensure that we are still using all
12566                  parts of the object.  If we find a piece of the object
12567                  that is unused, we must arrange for an appropriate REG_DEAD
12568                  note to be added for it.  However, we can't just emit a USE
12569                  and tag the note to it, since the register might actually
12570                  be dead; so we recourse, and the recursive call then finds
12571                  the previous insn that used this register.  */
12572
12573               if (place && regno < FIRST_PSEUDO_REGISTER
12574                   && HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0))) > 1)
12575                 {
12576                   unsigned int endregno
12577                     = regno + HARD_REGNO_NREGS (regno,
12578                                                 GET_MODE (XEXP (note, 0)));
12579                   int all_used = 1;
12580                   unsigned int i;
12581
12582                   for (i = regno; i < endregno; i++)
12583                     if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
12584                          && ! find_regno_fusage (place, USE, i))
12585                         || dead_or_set_regno_p (place, i))
12586                       all_used = 0;
12587
12588                   if (! all_used)
12589                     {
12590                       /* Put only REG_DEAD notes for pieces that are
12591                          not already dead or set.  */
12592
12593                       for (i = regno; i < endregno;
12594                            i += HARD_REGNO_NREGS (i, reg_raw_mode[i]))
12595                         {
12596                           rtx piece = gen_rtx_REG (reg_raw_mode[i], i);
12597                           basic_block bb = this_basic_block;
12598
12599                           if (! dead_or_set_p (place, piece)
12600                               && ! reg_bitfield_target_p (piece,
12601                                                           PATTERN (place)))
12602                             {
12603                               rtx new_note
12604                                 = gen_rtx_EXPR_LIST (REG_DEAD, piece, NULL_RTX);
12605
12606                               distribute_notes (new_note, place, place,
12607                                                 NULL_RTX, NULL_RTX, NULL_RTX);
12608                             }
12609                           else if (! refers_to_regno_p (i, i + 1,
12610                                                         PATTERN (place), 0)
12611                                    && ! find_regno_fusage (place, USE, i))
12612                             for (tem = PREV_INSN (place); ;
12613                                  tem = PREV_INSN (tem))
12614                               {
12615                                 if (! INSN_P (tem))
12616                                   {
12617                                     if (tem == bb->head)
12618                                       {
12619                                         SET_BIT (refresh_blocks,
12620                                                  this_basic_block->index);
12621                                         need_refresh = 1;
12622                                         break;
12623                                       }
12624                                     continue;
12625                                   }
12626                                 if (dead_or_set_p (tem, piece)
12627                                     || reg_bitfield_target_p (piece,
12628                                                               PATTERN (tem)))
12629                                   {
12630                                     REG_NOTES (tem)
12631                                       = gen_rtx_EXPR_LIST (REG_UNUSED, piece,
12632                                                            REG_NOTES (tem));
12633                                     break;
12634                                   }
12635                               }
12636
12637                         }
12638
12639                       place = 0;
12640                     }
12641                 }
12642             }
12643           break;
12644
12645         default:
12646           /* Any other notes should not be present at this point in the
12647              compilation.  */
12648           abort ();
12649         }
12650
12651       if (place)
12652         {
12653           XEXP (note, 1) = REG_NOTES (place);
12654           REG_NOTES (place) = note;
12655         }
12656       else if ((REG_NOTE_KIND (note) == REG_DEAD
12657                 || REG_NOTE_KIND (note) == REG_UNUSED)
12658                && GET_CODE (XEXP (note, 0)) == REG)
12659         REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
12660
12661       if (place2)
12662         {
12663           if ((REG_NOTE_KIND (note) == REG_DEAD
12664                || REG_NOTE_KIND (note) == REG_UNUSED)
12665               && GET_CODE (XEXP (note, 0)) == REG)
12666             REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
12667
12668           REG_NOTES (place2) = gen_rtx_fmt_ee (GET_CODE (note),
12669                                                REG_NOTE_KIND (note),
12670                                                XEXP (note, 0),
12671                                                REG_NOTES (place2));
12672         }
12673     }
12674 }
12675 \f
12676 /* Similarly to above, distribute the LOG_LINKS that used to be present on
12677    I3, I2, and I1 to new locations.  This is also called in one case to
12678    add a link pointing at I3 when I3's destination is changed.  */
12679
12680 static void
12681 distribute_links (links)
12682      rtx links;
12683 {
12684   rtx link, next_link;
12685
12686   for (link = links; link; link = next_link)
12687     {
12688       rtx place = 0;
12689       rtx insn;
12690       rtx set, reg;
12691
12692       next_link = XEXP (link, 1);
12693
12694       /* If the insn that this link points to is a NOTE or isn't a single
12695          set, ignore it.  In the latter case, it isn't clear what we
12696          can do other than ignore the link, since we can't tell which
12697          register it was for.  Such links wouldn't be used by combine
12698          anyway.
12699
12700          It is not possible for the destination of the target of the link to
12701          have been changed by combine.  The only potential of this is if we
12702          replace I3, I2, and I1 by I3 and I2.  But in that case the
12703          destination of I2 also remains unchanged.  */
12704
12705       if (GET_CODE (XEXP (link, 0)) == NOTE
12706           || (set = single_set (XEXP (link, 0))) == 0)
12707         continue;
12708
12709       reg = SET_DEST (set);
12710       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
12711              || GET_CODE (reg) == SIGN_EXTRACT
12712              || GET_CODE (reg) == STRICT_LOW_PART)
12713         reg = XEXP (reg, 0);
12714
12715       /* A LOG_LINK is defined as being placed on the first insn that uses
12716          a register and points to the insn that sets the register.  Start
12717          searching at the next insn after the target of the link and stop
12718          when we reach a set of the register or the end of the basic block.
12719
12720          Note that this correctly handles the link that used to point from
12721          I3 to I2.  Also note that not much searching is typically done here
12722          since most links don't point very far away.  */
12723
12724       for (insn = NEXT_INSN (XEXP (link, 0));
12725            (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
12726                      || this_basic_block->next_bb->head != insn));
12727            insn = NEXT_INSN (insn))
12728         if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
12729           {
12730             if (reg_referenced_p (reg, PATTERN (insn)))
12731               place = insn;
12732             break;
12733           }
12734         else if (GET_CODE (insn) == CALL_INSN
12735                  && find_reg_fusage (insn, USE, reg))
12736           {
12737             place = insn;
12738             break;
12739           }
12740
12741       /* If we found a place to put the link, place it there unless there
12742          is already a link to the same insn as LINK at that point.  */
12743
12744       if (place)
12745         {
12746           rtx link2;
12747
12748           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
12749             if (XEXP (link2, 0) == XEXP (link, 0))
12750               break;
12751
12752           if (link2 == 0)
12753             {
12754               XEXP (link, 1) = LOG_LINKS (place);
12755               LOG_LINKS (place) = link;
12756
12757               /* Set added_links_insn to the earliest insn we added a
12758                  link to.  */
12759               if (added_links_insn == 0
12760                   || INSN_CUID (added_links_insn) > INSN_CUID (place))
12761                 added_links_insn = place;
12762             }
12763         }
12764     }
12765 }
12766 \f
12767 /* Compute INSN_CUID for INSN, which is an insn made by combine.  */
12768
12769 static int
12770 insn_cuid (insn)
12771      rtx insn;
12772 {
12773   while (insn != 0 && INSN_UID (insn) > max_uid_cuid
12774          && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == USE)
12775     insn = NEXT_INSN (insn);
12776
12777   if (INSN_UID (insn) > max_uid_cuid)
12778     abort ();
12779
12780   return INSN_CUID (insn);
12781 }
12782 \f
12783 void
12784 dump_combine_stats (file)
12785      FILE *file;
12786 {
12787   fnotice
12788     (file,
12789      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
12790      combine_attempts, combine_merges, combine_extras, combine_successes);
12791 }
12792
12793 void
12794 dump_combine_total_stats (file)
12795      FILE *file;
12796 {
12797   fnotice
12798     (file,
12799      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
12800      total_attempts, total_merges, total_extras, total_successes);
12801 }