OSDN Git Service

testsuite:
[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, 2003, 2004 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    - a LOG_LINKS entry that refers to an insn with multiple SETs may be
57      removed because there is no way to know which register it was
58      linking
59
60    To simplify substitution, we combine only when the earlier insn(s)
61    consist of only a single assignment.  To simplify updating afterward,
62    we never combine when a subroutine call appears in the middle.
63
64    Since we do not represent assignments to CC0 explicitly except when that
65    is all an insn does, there is no LOG_LINKS entry in an insn that uses
66    the condition code for the insn that set the condition code.
67    Fortunately, these two insns must be consecutive.
68    Therefore, every JUMP_INSN is taken to have an implicit logical link
69    to the preceding insn.  This is not quite right, since non-jumps can
70    also use the condition code; but in practice such insns would not
71    combine anyway.  */
72
73 #include "config.h"
74 #include "system.h"
75 #include "coretypes.h"
76 #include "tm.h"
77 #include "rtl.h"
78 #include "tree.h"
79 #include "tm_p.h"
80 #include "flags.h"
81 #include "regs.h"
82 #include "hard-reg-set.h"
83 #include "basic-block.h"
84 #include "insn-config.h"
85 #include "function.h"
86 /* Include expr.h after insn-config.h so we get HAVE_conditional_move.  */
87 #include "expr.h"
88 #include "insn-attr.h"
89 #include "recog.h"
90 #include "real.h"
91 #include "toplev.h"
92 #include "target.h"
93
94 /* Number of attempts to combine instructions in this function.  */
95
96 static int combine_attempts;
97
98 /* Number of attempts that got as far as substitution in this function.  */
99
100 static int combine_merges;
101
102 /* Number of instructions combined with added SETs in this function.  */
103
104 static int combine_extras;
105
106 /* Number of instructions combined in this function.  */
107
108 static int combine_successes;
109
110 /* Totals over entire compilation.  */
111
112 static int total_attempts, total_merges, total_extras, total_successes;
113
114 \f
115 /* Vector mapping INSN_UIDs to cuids.
116    The cuids are like uids but increase monotonically always.
117    Combine always uses cuids so that it can compare them.
118    But actually renumbering the uids, which we used to do,
119    proves to be a bad idea because it makes it hard to compare
120    the dumps produced by earlier passes with those from later passes.  */
121
122 static int *uid_cuid;
123 static int max_uid_cuid;
124
125 /* Get the cuid of an insn.  */
126
127 #define INSN_CUID(INSN) \
128 (INSN_UID (INSN) > max_uid_cuid ? insn_cuid (INSN) : uid_cuid[INSN_UID (INSN)])
129
130 /* In case BITS_PER_WORD == HOST_BITS_PER_WIDE_INT, shifting by
131    BITS_PER_WORD would invoke undefined behavior.  Work around it.  */
132
133 #define UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD(val) \
134   (((unsigned HOST_WIDE_INT) (val) << (BITS_PER_WORD - 1)) << 1)
135
136 #define nonzero_bits(X, M) \
137   cached_nonzero_bits (X, M, NULL_RTX, VOIDmode, 0)
138
139 #define num_sign_bit_copies(X, M) \
140   cached_num_sign_bit_copies (X, M, NULL_RTX, VOIDmode, 0)
141
142 /* Maximum register number, which is the size of the tables below.  */
143
144 static unsigned int combine_max_regno;
145
146 struct reg_stat {
147   /* Record last point of death of (hard or pseudo) register n.  */
148   rtx                           last_death;
149
150   /* Record last point of modification of (hard or pseudo) register n.  */
151   rtx                           last_set;
152
153   /* The next group of fields allows the recording of the last value assigned
154      to (hard or pseudo) register n.  We use this information to see if an
155      operation being processed is redundant given a prior operation performed
156      on the register.  For example, an `and' with a constant is redundant if
157      all the zero bits are already known to be turned off.
158
159      We use an approach similar to that used by cse, but change it in the
160      following ways:
161
162      (1) We do not want to reinitialize at each label.
163      (2) It is useful, but not critical, to know the actual value assigned
164          to a register.  Often just its form is helpful.
165
166      Therefore, we maintain the following fields:
167
168      last_set_value             the last value assigned
169      last_set_label             records the value of label_tick when the
170                                 register was assigned
171      last_set_table_tick        records the value of label_tick when a
172                                 value using the register is assigned
173      last_set_invalid           set to nonzero when it is not valid
174                                 to use the value of this register in some
175                                 register's value
176
177      To understand the usage of these tables, it is important to understand
178      the distinction between the value in last_set_value being valid and
179      the register being validly contained in some other expression in the
180      table.
181
182      (The next two parameters are out of date).
183
184      reg_stat[i].last_set_value is valid if it is nonzero, and either
185      reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
186
187      Register I may validly appear in any expression returned for the value
188      of another register if reg_n_sets[i] is 1.  It may also appear in the
189      value for register J if reg_stat[j].last_set_invalid is zero, or
190      reg_stat[i].last_set_label < reg_stat[j].last_set_label.
191
192      If an expression is found in the table containing a register which may
193      not validly appear in an expression, the register is replaced by
194      something that won't match, (clobber (const_int 0)).  */
195
196   /* Record last value assigned to (hard or pseudo) register n.  */
197
198   rtx                           last_set_value;
199
200   /* Record the value of label_tick when an expression involving register n
201      is placed in last_set_value.  */
202
203   int                           last_set_table_tick;
204
205   /* Record the value of label_tick when the value for register n is placed in
206      last_set_value.  */
207
208   int                           last_set_label;
209
210   /* These fields are maintained in parallel with last_set_value and are
211      used to store the mode in which the register was last set, te bits
212      that were known to be zero when it was last set, and the number of
213      sign bits copies it was known to have when it was last set.  */
214
215   unsigned HOST_WIDE_INT        last_set_nonzero_bits;
216   char                          last_set_sign_bit_copies;
217   ENUM_BITFIELD(machine_mode)   last_set_mode : 8; 
218
219   /* Set nonzero if references to register n in expressions should not be
220      used.  last_set_invalid is set nonzero when this register is being
221      assigned to and last_set_table_tick == label_tick.  */
222
223   char                          last_set_invalid;
224
225   /* Some registers that are set more than once and used in more than one
226      basic block are nevertheless always set in similar ways.  For example,
227      a QImode register may be loaded from memory in two places on a machine
228      where byte loads zero extend.
229
230      We record in the following fields if a register has some leading bits
231      that are always equal to the sign bit, and what we know about the
232      nonzero bits of a register, specifically which bits are known to be
233      zero.
234
235      If an entry is zero, it means that we don't know anything special.  */
236
237   unsigned char                 sign_bit_copies;
238
239   unsigned HOST_WIDE_INT        nonzero_bits;
240 };
241
242 static struct reg_stat *reg_stat;
243
244 /* Record the cuid of the last insn that invalidated memory
245    (anything that writes memory, and subroutine calls, but not pushes).  */
246
247 static int mem_last_set;
248
249 /* Record the cuid of the last CALL_INSN
250    so we can tell whether a potential combination crosses any calls.  */
251
252 static int last_call_cuid;
253
254 /* When `subst' is called, this is the insn that is being modified
255    (by combining in a previous insn).  The PATTERN of this insn
256    is still the old pattern partially modified and it should not be
257    looked at, but this may be used to examine the successors of the insn
258    to judge whether a simplification is valid.  */
259
260 static rtx subst_insn;
261
262 /* This is the lowest CUID that `subst' is currently dealing with.
263    get_last_value will not return a value if the register was set at or
264    after this CUID.  If not for this mechanism, we could get confused if
265    I2 or I1 in try_combine were an insn that used the old value of a register
266    to obtain a new value.  In that case, we might erroneously get the
267    new value of the register when we wanted the old one.  */
268
269 static int subst_low_cuid;
270
271 /* This contains any hard registers that are used in newpat; reg_dead_at_p
272    must consider all these registers to be always live.  */
273
274 static HARD_REG_SET newpat_used_regs;
275
276 /* This is an insn to which a LOG_LINKS entry has been added.  If this
277    insn is the earlier than I2 or I3, combine should rescan starting at
278    that location.  */
279
280 static rtx added_links_insn;
281
282 /* Basic block in which we are performing combines.  */
283 static basic_block this_basic_block;
284
285 /* A bitmap indicating which blocks had registers go dead at entry.
286    After combine, we'll need to re-do global life analysis with
287    those blocks as starting points.  */
288 static sbitmap refresh_blocks;
289 \f
290 /* Incremented for each label.  */
291
292 static int label_tick;
293
294 /* Mode used to compute significance in reg_stat[].nonzero_bits.  It is the
295    largest integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
296
297 static enum machine_mode nonzero_bits_mode;
298
299 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
300    be safely used.  It is zero while computing them and after combine has
301    completed.  This former test prevents propagating values based on
302    previously set values, which can be incorrect if a variable is modified
303    in a loop.  */
304
305 static int nonzero_sign_valid;
306
307 \f
308 /* Record one modification to rtl structure
309    to be undone by storing old_contents into *where.
310    is_int is 1 if the contents are an int.  */
311
312 struct undo
313 {
314   struct undo *next;
315   int is_int;
316   union {rtx r; int i;} old_contents;
317   union {rtx *r; int *i;} where;
318 };
319
320 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
321    num_undo says how many are currently recorded.
322
323    other_insn is nonzero if we have modified some other insn in the process
324    of working on subst_insn.  It must be verified too.  */
325
326 struct undobuf
327 {
328   struct undo *undos;
329   struct undo *frees;
330   rtx other_insn;
331 };
332
333 static struct undobuf undobuf;
334
335 /* Number of times the pseudo being substituted for
336    was found and replaced.  */
337
338 static int n_occurrences;
339
340 static void do_SUBST (rtx *, rtx);
341 static void do_SUBST_INT (int *, int);
342 static void init_reg_last (void);
343 static void setup_incoming_promotions (void);
344 static void set_nonzero_bits_and_sign_copies (rtx, rtx, void *);
345 static int cant_combine_insn_p (rtx);
346 static int can_combine_p (rtx, rtx, rtx, rtx, rtx *, rtx *);
347 static int combinable_i3pat (rtx, rtx *, rtx, rtx, int, rtx *);
348 static int contains_muldiv (rtx);
349 static rtx try_combine (rtx, rtx, rtx, int *);
350 static void undo_all (void);
351 static void undo_commit (void);
352 static rtx *find_split_point (rtx *, rtx);
353 static rtx subst (rtx, rtx, rtx, int, int);
354 static rtx combine_simplify_rtx (rtx, enum machine_mode, int);
355 static rtx simplify_if_then_else (rtx);
356 static rtx simplify_set (rtx);
357 static rtx simplify_logical (rtx);
358 static rtx expand_compound_operation (rtx);
359 static rtx expand_field_assignment (rtx);
360 static rtx make_extraction (enum machine_mode, rtx, HOST_WIDE_INT,
361                             rtx, unsigned HOST_WIDE_INT, int, int, int);
362 static rtx extract_left_shift (rtx, int);
363 static rtx make_compound_operation (rtx, enum rtx_code);
364 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
365                               unsigned HOST_WIDE_INT *);
366 static rtx force_to_mode (rtx, enum machine_mode,
367                           unsigned HOST_WIDE_INT, rtx, int);
368 static rtx if_then_else_cond (rtx, rtx *, rtx *);
369 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
370 static int rtx_equal_for_field_assignment_p (rtx, rtx);
371 static rtx make_field_assignment (rtx);
372 static rtx apply_distributive_law (rtx);
373 static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
374                                    unsigned HOST_WIDE_INT);
375 static unsigned HOST_WIDE_INT cached_nonzero_bits (rtx, enum machine_mode,
376                                                    rtx, enum machine_mode,
377                                                    unsigned HOST_WIDE_INT);
378 static unsigned HOST_WIDE_INT nonzero_bits1 (rtx, enum machine_mode, rtx,
379                                              enum machine_mode,
380                                              unsigned HOST_WIDE_INT);
381 static unsigned int cached_num_sign_bit_copies (rtx, enum machine_mode, rtx,
382                                                 enum machine_mode,
383                                                 unsigned int);
384 static unsigned int num_sign_bit_copies1 (rtx, enum machine_mode, rtx,
385                                           enum machine_mode, unsigned int);
386 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
387                             HOST_WIDE_INT, enum machine_mode, int *);
388 static rtx simplify_shift_const (rtx, enum rtx_code, enum machine_mode, rtx,
389                                  int);
390 static int recog_for_combine (rtx *, rtx, rtx *);
391 static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
392 static rtx gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
393 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
394 static void update_table_tick (rtx);
395 static void record_value_for_reg (rtx, rtx, rtx);
396 static void check_promoted_subreg (rtx, rtx);
397 static void record_dead_and_set_regs_1 (rtx, rtx, void *);
398 static void record_dead_and_set_regs (rtx);
399 static int get_last_value_validate (rtx *, rtx, int, int);
400 static rtx get_last_value (rtx);
401 static int use_crosses_set_p (rtx, int);
402 static void reg_dead_at_p_1 (rtx, rtx, void *);
403 static int reg_dead_at_p (rtx, rtx);
404 static void move_deaths (rtx, rtx, int, rtx, rtx *);
405 static int reg_bitfield_target_p (rtx, rtx);
406 static void distribute_notes (rtx, rtx, rtx, rtx);
407 static void distribute_links (rtx);
408 static void mark_used_regs_combine (rtx);
409 static int insn_cuid (rtx);
410 static void record_promoted_value (rtx, rtx);
411 static rtx reversed_comparison (rtx, enum machine_mode, rtx, rtx);
412 static enum rtx_code combine_reversed_comparison_code (rtx);
413 static int unmentioned_reg_p_1 (rtx *, void *);
414 static bool unmentioned_reg_p (rtx, rtx);
415 \f
416 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
417    insn.  The substitution can be undone by undo_all.  If INTO is already
418    set to NEWVAL, do not record this change.  Because computing NEWVAL might
419    also call SUBST, we have to compute it before we put anything into
420    the undo table.  */
421
422 static void
423 do_SUBST (rtx *into, rtx newval)
424 {
425   struct undo *buf;
426   rtx oldval = *into;
427
428   if (oldval == newval)
429     return;
430
431   /* We'd like to catch as many invalid transformations here as
432      possible.  Unfortunately, there are way too many mode changes
433      that are perfectly valid, so we'd waste too much effort for
434      little gain doing the checks here.  Focus on catching invalid
435      transformations involving integer constants.  */
436   if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
437       && GET_CODE (newval) == CONST_INT)
438     {
439       /* Sanity check that we're replacing oldval with a CONST_INT
440          that is a valid sign-extension for the original mode.  */
441       if (INTVAL (newval) != trunc_int_for_mode (INTVAL (newval),
442                                                  GET_MODE (oldval)))
443         abort ();
444
445       /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
446          CONST_INT is not valid, because after the replacement, the
447          original mode would be gone.  Unfortunately, we can't tell
448          when do_SUBST is called to replace the operand thereof, so we
449          perform this test on oldval instead, checking whether an
450          invalid replacement took place before we got here.  */
451       if ((GET_CODE (oldval) == SUBREG
452            && GET_CODE (SUBREG_REG (oldval)) == CONST_INT)
453           || (GET_CODE (oldval) == ZERO_EXTEND
454               && GET_CODE (XEXP (oldval, 0)) == CONST_INT))
455         abort ();
456     }
457
458   if (undobuf.frees)
459     buf = undobuf.frees, undobuf.frees = buf->next;
460   else
461     buf = xmalloc (sizeof (struct undo));
462
463   buf->is_int = 0;
464   buf->where.r = into;
465   buf->old_contents.r = oldval;
466   *into = newval;
467
468   buf->next = undobuf.undos, undobuf.undos = buf;
469 }
470
471 #define SUBST(INTO, NEWVAL)     do_SUBST(&(INTO), (NEWVAL))
472
473 /* Similar to SUBST, but NEWVAL is an int expression.  Note that substitution
474    for the value of a HOST_WIDE_INT value (including CONST_INT) is
475    not safe.  */
476
477 static void
478 do_SUBST_INT (int *into, int newval)
479 {
480   struct undo *buf;
481   int oldval = *into;
482
483   if (oldval == newval)
484     return;
485
486   if (undobuf.frees)
487     buf = undobuf.frees, undobuf.frees = buf->next;
488   else
489     buf = xmalloc (sizeof (struct undo));
490
491   buf->is_int = 1;
492   buf->where.i = into;
493   buf->old_contents.i = oldval;
494   *into = newval;
495
496   buf->next = undobuf.undos, undobuf.undos = buf;
497 }
498
499 #define SUBST_INT(INTO, NEWVAL)  do_SUBST_INT(&(INTO), (NEWVAL))
500 \f
501 /* Main entry point for combiner.  F is the first insn of the function.
502    NREGS is the first unused pseudo-reg number.
503
504    Return nonzero if the combiner has turned an indirect jump
505    instruction into a direct jump.  */
506 int
507 combine_instructions (rtx f, unsigned int nregs)
508 {
509   rtx insn, next;
510 #ifdef HAVE_cc0
511   rtx prev;
512 #endif
513   int i;
514   rtx links, nextlinks;
515
516   int new_direct_jump_p = 0;
517
518   combine_attempts = 0;
519   combine_merges = 0;
520   combine_extras = 0;
521   combine_successes = 0;
522
523   combine_max_regno = nregs;
524
525   /* It is not safe to use ordinary gen_lowpart in combine.
526      See comments in gen_lowpart_for_combine.  */
527   gen_lowpart = gen_lowpart_for_combine;
528
529   reg_stat = xcalloc (nregs, sizeof (struct reg_stat));
530
531   init_recog_no_volatile ();
532
533   /* Compute maximum uid value so uid_cuid can be allocated.  */
534
535   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
536     if (INSN_UID (insn) > i)
537       i = INSN_UID (insn);
538
539   uid_cuid = xmalloc ((i + 1) * sizeof (int));
540   max_uid_cuid = i;
541
542   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
543
544   /* Don't use reg_stat[].nonzero_bits when computing it.  This can cause
545      problems when, for example, we have j <<= 1 in a loop.  */
546
547   nonzero_sign_valid = 0;
548
549   /* Compute the mapping from uids to cuids.
550      Cuids are numbers assigned to insns, like uids,
551      except that cuids increase monotonically through the code.
552
553      Scan all SETs and see if we can deduce anything about what
554      bits are known to be zero for some registers and how many copies
555      of the sign bit are known to exist for those registers.
556
557      Also set any known values so that we can use it while searching
558      for what bits are known to be set.  */
559
560   label_tick = 1;
561
562   setup_incoming_promotions ();
563
564   refresh_blocks = sbitmap_alloc (last_basic_block);
565   sbitmap_zero (refresh_blocks);
566
567   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
568     {
569       uid_cuid[INSN_UID (insn)] = ++i;
570       subst_low_cuid = i;
571       subst_insn = insn;
572
573       if (INSN_P (insn))
574         {
575           note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
576                        NULL);
577           record_dead_and_set_regs (insn);
578
579 #ifdef AUTO_INC_DEC
580           for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
581             if (REG_NOTE_KIND (links) == REG_INC)
582               set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
583                                                 NULL);
584 #endif
585         }
586
587       if (GET_CODE (insn) == CODE_LABEL)
588         label_tick++;
589     }
590
591   nonzero_sign_valid = 1;
592
593   /* Now scan all the insns in forward order.  */
594
595   label_tick = 1;
596   last_call_cuid = 0;
597   mem_last_set = 0;
598   init_reg_last ();
599   setup_incoming_promotions ();
600
601   FOR_EACH_BB (this_basic_block)
602     {
603       for (insn = BB_HEAD (this_basic_block);
604            insn != NEXT_INSN (BB_END (this_basic_block));
605            insn = next ? next : NEXT_INSN (insn))
606         {
607           next = 0;
608
609           if (GET_CODE (insn) == CODE_LABEL)
610             label_tick++;
611
612           else if (INSN_P (insn))
613             {
614               /* See if we know about function return values before this
615                  insn based upon SUBREG flags.  */
616               check_promoted_subreg (insn, PATTERN (insn));
617
618               /* Try this insn with each insn it links back to.  */
619
620               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
621                 if ((next = try_combine (insn, XEXP (links, 0),
622                                          NULL_RTX, &new_direct_jump_p)) != 0)
623                   goto retry;
624
625               /* Try each sequence of three linked insns ending with this one.  */
626
627               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
628                 {
629                   rtx link = XEXP (links, 0);
630
631                   /* If the linked insn has been replaced by a note, then there
632                      is no point in pursuing this chain any further.  */
633                   if (GET_CODE (link) == NOTE)
634                     continue;
635
636                   for (nextlinks = LOG_LINKS (link);
637                        nextlinks;
638                        nextlinks = XEXP (nextlinks, 1))
639                     if ((next = try_combine (insn, link,
640                                              XEXP (nextlinks, 0),
641                                              &new_direct_jump_p)) != 0)
642                       goto retry;
643                 }
644
645 #ifdef HAVE_cc0
646               /* Try to combine a jump insn that uses CC0
647                  with a preceding insn that sets CC0, and maybe with its
648                  logical predecessor as well.
649                  This is how we make decrement-and-branch insns.
650                  We need this special code because data flow connections
651                  via CC0 do not get entered in LOG_LINKS.  */
652
653               if (GET_CODE (insn) == JUMP_INSN
654                   && (prev = prev_nonnote_insn (insn)) != 0
655                   && GET_CODE (prev) == INSN
656                   && sets_cc0_p (PATTERN (prev)))
657                 {
658                   if ((next = try_combine (insn, prev,
659                                            NULL_RTX, &new_direct_jump_p)) != 0)
660                     goto retry;
661
662                   for (nextlinks = LOG_LINKS (prev); nextlinks;
663                        nextlinks = XEXP (nextlinks, 1))
664                     if ((next = try_combine (insn, prev,
665                                              XEXP (nextlinks, 0),
666                                              &new_direct_jump_p)) != 0)
667                       goto retry;
668                 }
669
670               /* Do the same for an insn that explicitly references CC0.  */
671               if (GET_CODE (insn) == INSN
672                   && (prev = prev_nonnote_insn (insn)) != 0
673                   && GET_CODE (prev) == INSN
674                   && sets_cc0_p (PATTERN (prev))
675                   && GET_CODE (PATTERN (insn)) == SET
676                   && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
677                 {
678                   if ((next = try_combine (insn, prev,
679                                            NULL_RTX, &new_direct_jump_p)) != 0)
680                     goto retry;
681
682                   for (nextlinks = LOG_LINKS (prev); nextlinks;
683                        nextlinks = XEXP (nextlinks, 1))
684                     if ((next = try_combine (insn, prev,
685                                              XEXP (nextlinks, 0),
686                                              &new_direct_jump_p)) != 0)
687                       goto retry;
688                 }
689
690               /* Finally, see if any of the insns that this insn links to
691                  explicitly references CC0.  If so, try this insn, that insn,
692                  and its predecessor if it sets CC0.  */
693               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
694                 if (GET_CODE (XEXP (links, 0)) == INSN
695                     && GET_CODE (PATTERN (XEXP (links, 0))) == SET
696                     && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
697                     && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
698                     && GET_CODE (prev) == INSN
699                     && sets_cc0_p (PATTERN (prev))
700                     && (next = try_combine (insn, XEXP (links, 0),
701                                             prev, &new_direct_jump_p)) != 0)
702                   goto retry;
703 #endif
704
705               /* Try combining an insn with two different insns whose results it
706                  uses.  */
707               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
708                 for (nextlinks = XEXP (links, 1); nextlinks;
709                      nextlinks = XEXP (nextlinks, 1))
710                   if ((next = try_combine (insn, XEXP (links, 0),
711                                            XEXP (nextlinks, 0),
712                                            &new_direct_jump_p)) != 0)
713                     goto retry;
714
715               /* Try this insn with each REG_EQUAL note it links back to.  */
716               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
717                 {
718                   rtx set, note;
719                   rtx temp = XEXP (links, 0);
720                   if ((set = single_set (temp)) != 0
721                       && (note = find_reg_equal_equiv_note (temp)) != 0
722                       && GET_CODE (XEXP (note, 0)) != EXPR_LIST
723                       /* Avoid using a register that may already been marked
724                          dead by an earlier instruction.  */
725                       && ! unmentioned_reg_p (XEXP (note, 0), SET_SRC (set)))
726                     {
727                       /* Temporarily replace the set's source with the
728                          contents of the REG_EQUAL note.  The insn will
729                          be deleted or recognized by try_combine.  */
730                       rtx orig = SET_SRC (set);
731                       SET_SRC (set) = XEXP (note, 0);
732                       next = try_combine (insn, temp, NULL_RTX,
733                                           &new_direct_jump_p);
734                       if (next)
735                         goto retry;
736                       SET_SRC (set) = orig;
737                     }
738                 }
739
740               if (GET_CODE (insn) != NOTE)
741                 record_dead_and_set_regs (insn);
742
743             retry:
744               ;
745             }
746         }
747     }
748   clear_bb_flags ();
749
750   EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, i,
751                              BASIC_BLOCK (i)->flags |= BB_DIRTY);
752   new_direct_jump_p |= purge_all_dead_edges (0);
753   delete_noop_moves ();
754
755   update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
756                                     PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
757                                     | PROP_KILL_DEAD_CODE);
758
759   /* Clean up.  */
760   sbitmap_free (refresh_blocks);
761   free (reg_stat);
762   free (uid_cuid);
763
764   {
765     struct undo *undo, *next;
766     for (undo = undobuf.frees; undo; undo = next)
767       {
768         next = undo->next;
769         free (undo);
770       }
771     undobuf.frees = 0;
772   }
773
774   total_attempts += combine_attempts;
775   total_merges += combine_merges;
776   total_extras += combine_extras;
777   total_successes += combine_successes;
778
779   nonzero_sign_valid = 0;
780   gen_lowpart = gen_lowpart_general;
781
782   /* Make recognizer allow volatile MEMs again.  */
783   init_recog ();
784
785   return new_direct_jump_p;
786 }
787
788 /* Wipe the last_xxx fields of reg_stat in preparation for another pass.  */
789
790 static void
791 init_reg_last (void)
792 {
793   unsigned int i;
794   for (i = 0; i < combine_max_regno; i++)
795     memset (reg_stat + i, 0, offsetof (struct reg_stat, sign_bit_copies));
796 }
797 \f
798 /* Set up any promoted values for incoming argument registers.  */
799
800 static void
801 setup_incoming_promotions (void)
802 {
803   unsigned int regno;
804   rtx reg;
805   enum machine_mode mode;
806   int unsignedp;
807   rtx first = get_insns ();
808
809   if (targetm.calls.promote_function_args (TREE_TYPE (cfun->decl)))
810     {
811       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
812         /* Check whether this register can hold an incoming pointer
813            argument.  FUNCTION_ARG_REGNO_P tests outgoing register
814            numbers, so translate if necessary due to register windows.  */
815         if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (regno))
816             && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0)
817           {
818             record_value_for_reg
819               (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND
820                                            : SIGN_EXTEND),
821                                           GET_MODE (reg),
822                                           gen_rtx_CLOBBER (mode, const0_rtx)));
823           }
824     }
825 }
826 \f
827 /* Called via note_stores.  If X is a pseudo that is narrower than
828    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
829
830    If we are setting only a portion of X and we can't figure out what
831    portion, assume all bits will be used since we don't know what will
832    be happening.
833
834    Similarly, set how many bits of X are known to be copies of the sign bit
835    at all locations in the function.  This is the smallest number implied
836    by any set of X.  */
837
838 static void
839 set_nonzero_bits_and_sign_copies (rtx x, rtx set,
840                                   void *data ATTRIBUTE_UNUSED)
841 {
842   unsigned int num;
843
844   if (GET_CODE (x) == REG
845       && REGNO (x) >= FIRST_PSEUDO_REGISTER
846       /* If this register is undefined at the start of the file, we can't
847          say what its contents were.  */
848       && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, REGNO (x))
849       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
850     {
851       if (set == 0 || GET_CODE (set) == CLOBBER)
852         {
853           reg_stat[REGNO (x)].nonzero_bits = GET_MODE_MASK (GET_MODE (x));
854           reg_stat[REGNO (x)].sign_bit_copies = 1;
855           return;
856         }
857
858       /* If this is a complex assignment, see if we can convert it into a
859          simple assignment.  */
860       set = expand_field_assignment (set);
861
862       /* If this is a simple assignment, or we have a paradoxical SUBREG,
863          set what we know about X.  */
864
865       if (SET_DEST (set) == x
866           || (GET_CODE (SET_DEST (set)) == SUBREG
867               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
868                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
869               && SUBREG_REG (SET_DEST (set)) == x))
870         {
871           rtx src = SET_SRC (set);
872
873 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
874           /* If X is narrower than a word and SRC is a non-negative
875              constant that would appear negative in the mode of X,
876              sign-extend it for use in reg_stat[].nonzero_bits because some
877              machines (maybe most) will actually do the sign-extension
878              and this is the conservative approach.
879
880              ??? For 2.5, try to tighten up the MD files in this regard
881              instead of this kludge.  */
882
883           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
884               && GET_CODE (src) == CONST_INT
885               && INTVAL (src) > 0
886               && 0 != (INTVAL (src)
887                        & ((HOST_WIDE_INT) 1
888                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
889             src = GEN_INT (INTVAL (src)
890                            | ((HOST_WIDE_INT) (-1)
891                               << GET_MODE_BITSIZE (GET_MODE (x))));
892 #endif
893
894           /* Don't call nonzero_bits if it cannot change anything.  */
895           if (reg_stat[REGNO (x)].nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
896             reg_stat[REGNO (x)].nonzero_bits
897               |= nonzero_bits (src, nonzero_bits_mode);
898           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
899           if (reg_stat[REGNO (x)].sign_bit_copies == 0
900               || reg_stat[REGNO (x)].sign_bit_copies > num)
901             reg_stat[REGNO (x)].sign_bit_copies = num;
902         }
903       else
904         {
905           reg_stat[REGNO (x)].nonzero_bits = GET_MODE_MASK (GET_MODE (x));
906           reg_stat[REGNO (x)].sign_bit_copies = 1;
907         }
908     }
909 }
910 \f
911 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
912    insns that were previously combined into I3 or that will be combined
913    into the merger of INSN and I3.
914
915    Return 0 if the combination is not allowed for any reason.
916
917    If the combination is allowed, *PDEST will be set to the single
918    destination of INSN and *PSRC to the single source, and this function
919    will return 1.  */
920
921 static int
922 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
923                rtx *pdest, rtx *psrc)
924 {
925   int i;
926   rtx set = 0, src, dest;
927   rtx p;
928 #ifdef AUTO_INC_DEC
929   rtx link;
930 #endif
931   int all_adjacent = (succ ? (next_active_insn (insn) == succ
932                               && next_active_insn (succ) == i3)
933                       : next_active_insn (insn) == i3);
934
935   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
936      or a PARALLEL consisting of such a SET and CLOBBERs.
937
938      If INSN has CLOBBER parallel parts, ignore them for our processing.
939      By definition, these happen during the execution of the insn.  When it
940      is merged with another insn, all bets are off.  If they are, in fact,
941      needed and aren't also supplied in I3, they may be added by
942      recog_for_combine.  Otherwise, it won't match.
943
944      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
945      note.
946
947      Get the source and destination of INSN.  If more than one, can't
948      combine.  */
949
950   if (GET_CODE (PATTERN (insn)) == SET)
951     set = PATTERN (insn);
952   else if (GET_CODE (PATTERN (insn)) == PARALLEL
953            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
954     {
955       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
956         {
957           rtx elt = XVECEXP (PATTERN (insn), 0, i);
958           rtx note;
959
960           switch (GET_CODE (elt))
961             {
962             /* This is important to combine floating point insns
963                for the SH4 port.  */
964             case USE:
965               /* Combining an isolated USE doesn't make sense.
966                  We depend here on combinable_i3pat to reject them.  */
967               /* The code below this loop only verifies that the inputs of
968                  the SET in INSN do not change.  We call reg_set_between_p
969                  to verify that the REG in the USE does not change between
970                  I3 and INSN.
971                  If the USE in INSN was for a pseudo register, the matching
972                  insn pattern will likely match any register; combining this
973                  with any other USE would only be safe if we knew that the
974                  used registers have identical values, or if there was
975                  something to tell them apart, e.g. different modes.  For
976                  now, we forgo such complicated tests and simply disallow
977                  combining of USES of pseudo registers with any other USE.  */
978               if (GET_CODE (XEXP (elt, 0)) == REG
979                   && GET_CODE (PATTERN (i3)) == PARALLEL)
980                 {
981                   rtx i3pat = PATTERN (i3);
982                   int i = XVECLEN (i3pat, 0) - 1;
983                   unsigned int regno = REGNO (XEXP (elt, 0));
984
985                   do
986                     {
987                       rtx i3elt = XVECEXP (i3pat, 0, i);
988
989                       if (GET_CODE (i3elt) == USE
990                           && GET_CODE (XEXP (i3elt, 0)) == REG
991                           && (REGNO (XEXP (i3elt, 0)) == regno
992                               ? reg_set_between_p (XEXP (elt, 0),
993                                                    PREV_INSN (insn), i3)
994                               : regno >= FIRST_PSEUDO_REGISTER))
995                         return 0;
996                     }
997                   while (--i >= 0);
998                 }
999               break;
1000
1001               /* We can ignore CLOBBERs.  */
1002             case CLOBBER:
1003               break;
1004
1005             case SET:
1006               /* Ignore SETs whose result isn't used but not those that
1007                  have side-effects.  */
1008               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1009                   && (!(note = find_reg_note (insn, REG_EH_REGION, NULL_RTX))
1010                       || INTVAL (XEXP (note, 0)) <= 0)
1011                   && ! side_effects_p (elt))
1012                 break;
1013
1014               /* If we have already found a SET, this is a second one and
1015                  so we cannot combine with this insn.  */
1016               if (set)
1017                 return 0;
1018
1019               set = elt;
1020               break;
1021
1022             default:
1023               /* Anything else means we can't combine.  */
1024               return 0;
1025             }
1026         }
1027
1028       if (set == 0
1029           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1030              so don't do anything with it.  */
1031           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1032         return 0;
1033     }
1034   else
1035     return 0;
1036
1037   if (set == 0)
1038     return 0;
1039
1040   set = expand_field_assignment (set);
1041   src = SET_SRC (set), dest = SET_DEST (set);
1042
1043   /* Don't eliminate a store in the stack pointer.  */
1044   if (dest == stack_pointer_rtx
1045       /* Don't combine with an insn that sets a register to itself if it has
1046          a REG_EQUAL note.  This may be part of a REG_NO_CONFLICT sequence.  */
1047       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1048       /* Can't merge an ASM_OPERANDS.  */
1049       || GET_CODE (src) == ASM_OPERANDS
1050       /* Can't merge a function call.  */
1051       || GET_CODE (src) == CALL
1052       /* Don't eliminate a function call argument.  */
1053       || (GET_CODE (i3) == CALL_INSN
1054           && (find_reg_fusage (i3, USE, dest)
1055               || (GET_CODE (dest) == REG
1056                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
1057                   && global_regs[REGNO (dest)])))
1058       /* Don't substitute into an incremented register.  */
1059       || FIND_REG_INC_NOTE (i3, dest)
1060       || (succ && FIND_REG_INC_NOTE (succ, dest))
1061 #if 0
1062       /* Don't combine the end of a libcall into anything.  */
1063       /* ??? This gives worse code, and appears to be unnecessary, since no
1064          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  Local-alloc does
1065          use REG_RETVAL notes for noconflict blocks, but other code here
1066          makes sure that those insns don't disappear.  */
1067       || find_reg_note (insn, REG_RETVAL, NULL_RTX)
1068 #endif
1069       /* Make sure that DEST is not used after SUCC but before I3.  */
1070       || (succ && ! all_adjacent
1071           && reg_used_between_p (dest, succ, i3))
1072       /* Make sure that the value that is to be substituted for the register
1073          does not use any registers whose values alter in between.  However,
1074          If the insns are adjacent, a use can't cross a set even though we
1075          think it might (this can happen for a sequence of insns each setting
1076          the same destination; last_set of that register might point to
1077          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1078          equivalent to the memory so the substitution is valid even if there
1079          are intervening stores.  Also, don't move a volatile asm or
1080          UNSPEC_VOLATILE across any other insns.  */
1081       || (! all_adjacent
1082           && (((GET_CODE (src) != MEM
1083                 || ! find_reg_note (insn, REG_EQUIV, src))
1084                && use_crosses_set_p (src, INSN_CUID (insn)))
1085               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1086               || GET_CODE (src) == UNSPEC_VOLATILE))
1087       /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
1088          better register allocation by not doing the combine.  */
1089       || find_reg_note (i3, REG_NO_CONFLICT, dest)
1090       || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
1091       /* Don't combine across a CALL_INSN, because that would possibly
1092          change whether the life span of some REGs crosses calls or not,
1093          and it is a pain to update that information.
1094          Exception: if source is a constant, moving it later can't hurt.
1095          Accept that special case, because it helps -fforce-addr a lot.  */
1096       || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
1097     return 0;
1098
1099   /* DEST must either be a REG or CC0.  */
1100   if (GET_CODE (dest) == REG)
1101     {
1102       /* If register alignment is being enforced for multi-word items in all
1103          cases except for parameters, it is possible to have a register copy
1104          insn referencing a hard register that is not allowed to contain the
1105          mode being copied and which would not be valid as an operand of most
1106          insns.  Eliminate this problem by not combining with such an insn.
1107
1108          Also, on some machines we don't want to extend the life of a hard
1109          register.  */
1110
1111       if (GET_CODE (src) == REG
1112           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1113                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1114               /* Don't extend the life of a hard register unless it is
1115                  user variable (if we have few registers) or it can't
1116                  fit into the desired register (meaning something special
1117                  is going on).
1118                  Also avoid substituting a return register into I3, because
1119                  reload can't handle a conflict with constraints of other
1120                  inputs.  */
1121               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1122                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1123         return 0;
1124     }
1125   else if (GET_CODE (dest) != CC0)
1126     return 0;
1127
1128   /* Don't substitute for a register intended as a clobberable operand.
1129      Similarly, don't substitute an expression containing a register that
1130      will be clobbered in I3.  */
1131   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1132     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1133       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER
1134           && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0),
1135                                        src)
1136               || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest)))
1137         return 0;
1138
1139   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1140      or not), reject, unless nothing volatile comes between it and I3 */
1141
1142   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1143     {
1144       /* Make sure succ doesn't contain a volatile reference.  */
1145       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1146         return 0;
1147
1148       for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1149         if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
1150           return 0;
1151     }
1152
1153   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1154      to be an explicit register variable, and was chosen for a reason.  */
1155
1156   if (GET_CODE (src) == ASM_OPERANDS
1157       && GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1158     return 0;
1159
1160   /* If there are any volatile insns between INSN and I3, reject, because
1161      they might affect machine state.  */
1162
1163   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1164     if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
1165       return 0;
1166
1167   /* If INSN or I2 contains an autoincrement or autodecrement,
1168      make sure that register is not used between there and I3,
1169      and not already used in I3 either.
1170      Also insist that I3 not be a jump; if it were one
1171      and the incremented register were spilled, we would lose.  */
1172
1173 #ifdef AUTO_INC_DEC
1174   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1175     if (REG_NOTE_KIND (link) == REG_INC
1176         && (GET_CODE (i3) == JUMP_INSN
1177             || reg_used_between_p (XEXP (link, 0), insn, i3)
1178             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1179       return 0;
1180 #endif
1181
1182 #ifdef HAVE_cc0
1183   /* Don't combine an insn that follows a CC0-setting insn.
1184      An insn that uses CC0 must not be separated from the one that sets it.
1185      We do, however, allow I2 to follow a CC0-setting insn if that insn
1186      is passed as I1; in that case it will be deleted also.
1187      We also allow combining in this case if all the insns are adjacent
1188      because that would leave the two CC0 insns adjacent as well.
1189      It would be more logical to test whether CC0 occurs inside I1 or I2,
1190      but that would be much slower, and this ought to be equivalent.  */
1191
1192   p = prev_nonnote_insn (insn);
1193   if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p))
1194       && ! all_adjacent)
1195     return 0;
1196 #endif
1197
1198   /* If we get here, we have passed all the tests and the combination is
1199      to be allowed.  */
1200
1201   *pdest = dest;
1202   *psrc = src;
1203
1204   return 1;
1205 }
1206 \f
1207 /* LOC is the location within I3 that contains its pattern or the component
1208    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1209
1210    One problem is if I3 modifies its output, as opposed to replacing it
1211    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1212    so would produce an insn that is not equivalent to the original insns.
1213
1214    Consider:
1215
1216          (set (reg:DI 101) (reg:DI 100))
1217          (set (subreg:SI (reg:DI 101) 0) <foo>)
1218
1219    This is NOT equivalent to:
1220
1221          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1222                     (set (reg:DI 101) (reg:DI 100))])
1223
1224    Not only does this modify 100 (in which case it might still be valid
1225    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1226
1227    We can also run into a problem if I2 sets a register that I1
1228    uses and I1 gets directly substituted into I3 (not via I2).  In that
1229    case, we would be getting the wrong value of I2DEST into I3, so we
1230    must reject the combination.  This case occurs when I2 and I1 both
1231    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1232    If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
1233    of a SET must prevent combination from occurring.
1234
1235    Before doing the above check, we first try to expand a field assignment
1236    into a set of logical operations.
1237
1238    If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
1239    we place a register that is both set and used within I3.  If more than one
1240    such register is detected, we fail.
1241
1242    Return 1 if the combination is valid, zero otherwise.  */
1243
1244 static int
1245 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
1246                   int i1_not_in_src, rtx *pi3dest_killed)
1247 {
1248   rtx x = *loc;
1249
1250   if (GET_CODE (x) == SET)
1251     {
1252       rtx set = x ;
1253       rtx dest = SET_DEST (set);
1254       rtx src = SET_SRC (set);
1255       rtx inner_dest = dest;
1256
1257       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1258              || GET_CODE (inner_dest) == SUBREG
1259              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1260         inner_dest = XEXP (inner_dest, 0);
1261
1262       /* Check for the case where I3 modifies its output, as discussed
1263          above.  We don't want to prevent pseudos from being combined
1264          into the address of a MEM, so only prevent the combination if
1265          i1 or i2 set the same MEM.  */
1266       if ((inner_dest != dest &&
1267            (GET_CODE (inner_dest) != MEM
1268             || rtx_equal_p (i2dest, inner_dest)
1269             || (i1dest && rtx_equal_p (i1dest, inner_dest)))
1270            && (reg_overlap_mentioned_p (i2dest, inner_dest)
1271                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1272
1273           /* This is the same test done in can_combine_p except we can't test
1274              all_adjacent; we don't have to, since this instruction will stay
1275              in place, thus we are not considering increasing the lifetime of
1276              INNER_DEST.
1277
1278              Also, if this insn sets a function argument, combining it with
1279              something that might need a spill could clobber a previous
1280              function argument; the all_adjacent test in can_combine_p also
1281              checks this; here, we do a more specific test for this case.  */
1282
1283           || (GET_CODE (inner_dest) == REG
1284               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1285               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1286                                         GET_MODE (inner_dest))))
1287           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1288         return 0;
1289
1290       /* If DEST is used in I3, it is being killed in this insn,
1291          so record that for later.
1292          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1293          STACK_POINTER_REGNUM, since these are always considered to be
1294          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1295       if (pi3dest_killed && GET_CODE (dest) == REG
1296           && reg_referenced_p (dest, PATTERN (i3))
1297           && REGNO (dest) != FRAME_POINTER_REGNUM
1298 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1299           && REGNO (dest) != HARD_FRAME_POINTER_REGNUM
1300 #endif
1301 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1302           && (REGNO (dest) != ARG_POINTER_REGNUM
1303               || ! fixed_regs [REGNO (dest)])
1304 #endif
1305           && REGNO (dest) != STACK_POINTER_REGNUM)
1306         {
1307           if (*pi3dest_killed)
1308             return 0;
1309
1310           *pi3dest_killed = dest;
1311         }
1312     }
1313
1314   else if (GET_CODE (x) == PARALLEL)
1315     {
1316       int i;
1317
1318       for (i = 0; i < XVECLEN (x, 0); i++)
1319         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1320                                 i1_not_in_src, pi3dest_killed))
1321           return 0;
1322     }
1323
1324   return 1;
1325 }
1326 \f
1327 /* Return 1 if X is an arithmetic expression that contains a multiplication
1328    and division.  We don't count multiplications by powers of two here.  */
1329
1330 static int
1331 contains_muldiv (rtx x)
1332 {
1333   switch (GET_CODE (x))
1334     {
1335     case MOD:  case DIV:  case UMOD:  case UDIV:
1336       return 1;
1337
1338     case MULT:
1339       return ! (GET_CODE (XEXP (x, 1)) == CONST_INT
1340                 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1341     default:
1342       if (BINARY_P (x))
1343         return contains_muldiv (XEXP (x, 0))
1344             || contains_muldiv (XEXP (x, 1));
1345
1346       if (UNARY_P (x))
1347         return contains_muldiv (XEXP (x, 0));
1348
1349       return 0;
1350     }
1351 }
1352 \f
1353 /* Determine whether INSN can be used in a combination.  Return nonzero if
1354    not.  This is used in try_combine to detect early some cases where we
1355    can't perform combinations.  */
1356
1357 static int
1358 cant_combine_insn_p (rtx insn)
1359 {
1360   rtx set;
1361   rtx src, dest;
1362
1363   /* If this isn't really an insn, we can't do anything.
1364      This can occur when flow deletes an insn that it has merged into an
1365      auto-increment address.  */
1366   if (! INSN_P (insn))
1367     return 1;
1368
1369   /* Never combine loads and stores involving hard regs that are likely
1370      to be spilled.  The register allocator can usually handle such
1371      reg-reg moves by tying.  If we allow the combiner to make
1372      substitutions of likely-spilled regs, we may abort in reload.
1373      As an exception, we allow combinations involving fixed regs; these are
1374      not available to the register allocator so there's no risk involved.  */
1375
1376   set = single_set (insn);
1377   if (! set)
1378     return 0;
1379   src = SET_SRC (set);
1380   dest = SET_DEST (set);
1381   if (GET_CODE (src) == SUBREG)
1382     src = SUBREG_REG (src);
1383   if (GET_CODE (dest) == SUBREG)
1384     dest = SUBREG_REG (dest);
1385   if (REG_P (src) && REG_P (dest)
1386       && ((REGNO (src) < FIRST_PSEUDO_REGISTER
1387            && ! fixed_regs[REGNO (src)]
1388            && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (src))))
1389           || (REGNO (dest) < FIRST_PSEUDO_REGISTER
1390               && ! fixed_regs[REGNO (dest)]
1391               && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (dest))))))
1392     return 1;
1393
1394   return 0;
1395 }
1396
1397 /* Adjust INSN after we made a change to its destination.
1398
1399    Changing the destination can invalidate notes that say something about
1400    the results of the insn and a LOG_LINK pointing to the insn.  */
1401
1402 static void
1403 adjust_for_new_dest (rtx insn)
1404 {
1405   rtx *loc;
1406
1407   /* For notes, be conservative and simply remove them.  */
1408   loc = &REG_NOTES (insn);
1409   while (*loc)
1410     {
1411       enum reg_note kind = REG_NOTE_KIND (*loc);
1412       if (kind == REG_EQUAL || kind == REG_EQUIV)
1413         *loc = XEXP (*loc, 1);
1414       else
1415         loc = &XEXP (*loc, 1);
1416     }
1417
1418   /* The new insn will have a destination that was previously the destination
1419      of an insn just above it.  Call distribute_links to make a LOG_LINK from
1420      the next use of that destination.  */
1421   distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
1422 }
1423
1424 /* Try to combine the insns I1 and I2 into I3.
1425    Here I1 and I2 appear earlier than I3.
1426    I1 can be zero; then we combine just I2 into I3.
1427
1428    If we are combining three insns and the resulting insn is not recognized,
1429    try splitting it into two insns.  If that happens, I2 and I3 are retained
1430    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
1431    are pseudo-deleted.
1432
1433    Return 0 if the combination does not work.  Then nothing is changed.
1434    If we did the combination, return the insn at which combine should
1435    resume scanning.
1436
1437    Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
1438    new direct jump instruction.  */
1439
1440 static rtx
1441 try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
1442 {
1443   /* New patterns for I3 and I2, respectively.  */
1444   rtx newpat, newi2pat = 0;
1445   int substed_i2 = 0, substed_i1 = 0;
1446   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
1447   int added_sets_1, added_sets_2;
1448   /* Total number of SETs to put into I3.  */
1449   int total_sets;
1450   /* Nonzero if I2's body now appears in I3.  */
1451   int i2_is_used;
1452   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
1453   int insn_code_number, i2_code_number = 0, other_code_number = 0;
1454   /* Contains I3 if the destination of I3 is used in its source, which means
1455      that the old life of I3 is being killed.  If that usage is placed into
1456      I2 and not in I3, a REG_DEAD note must be made.  */
1457   rtx i3dest_killed = 0;
1458   /* SET_DEST and SET_SRC of I2 and I1.  */
1459   rtx i2dest, i2src, i1dest = 0, i1src = 0;
1460   /* PATTERN (I2), or a copy of it in certain cases.  */
1461   rtx i2pat;
1462   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
1463   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
1464   int i1_feeds_i3 = 0;
1465   /* Notes that must be added to REG_NOTES in I3 and I2.  */
1466   rtx new_i3_notes, new_i2_notes;
1467   /* Notes that we substituted I3 into I2 instead of the normal case.  */
1468   int i3_subst_into_i2 = 0;
1469   /* Notes that I1, I2 or I3 is a MULT operation.  */
1470   int have_mult = 0;
1471
1472   int maxreg;
1473   rtx temp;
1474   rtx link;
1475   int i;
1476
1477   /* Exit early if one of the insns involved can't be used for
1478      combinations.  */
1479   if (cant_combine_insn_p (i3)
1480       || cant_combine_insn_p (i2)
1481       || (i1 && cant_combine_insn_p (i1))
1482       /* We also can't do anything if I3 has a
1483          REG_LIBCALL note since we don't want to disrupt the contiguity of a
1484          libcall.  */
1485 #if 0
1486       /* ??? This gives worse code, and appears to be unnecessary, since no
1487          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  */
1488       || find_reg_note (i3, REG_LIBCALL, NULL_RTX)
1489 #endif
1490       )
1491     return 0;
1492
1493   combine_attempts++;
1494   undobuf.other_insn = 0;
1495
1496   /* Reset the hard register usage information.  */
1497   CLEAR_HARD_REG_SET (newpat_used_regs);
1498
1499   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
1500      code below, set I1 to be the earlier of the two insns.  */
1501   if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
1502     temp = i1, i1 = i2, i2 = temp;
1503
1504   added_links_insn = 0;
1505
1506   /* First check for one important special-case that the code below will
1507      not handle.  Namely, the case where I1 is zero, I2 is a PARALLEL
1508      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
1509      we may be able to replace that destination with the destination of I3.
1510      This occurs in the common code where we compute both a quotient and
1511      remainder into a structure, in which case we want to do the computation
1512      directly into the structure to avoid register-register copies.
1513
1514      Note that this case handles both multiple sets in I2 and also
1515      cases where I2 has a number of CLOBBER or PARALLELs.
1516
1517      We make very conservative checks below and only try to handle the
1518      most common cases of this.  For example, we only handle the case
1519      where I2 and I3 are adjacent to avoid making difficult register
1520      usage tests.  */
1521
1522   if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
1523       && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1524       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
1525       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
1526       && GET_CODE (PATTERN (i2)) == PARALLEL
1527       && ! side_effects_p (SET_DEST (PATTERN (i3)))
1528       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
1529          below would need to check what is inside (and reg_overlap_mentioned_p
1530          doesn't support those codes anyway).  Don't allow those destinations;
1531          the resulting insn isn't likely to be recognized anyway.  */
1532       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
1533       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
1534       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
1535                                     SET_DEST (PATTERN (i3)))
1536       && next_real_insn (i2) == i3)
1537     {
1538       rtx p2 = PATTERN (i2);
1539
1540       /* Make sure that the destination of I3,
1541          which we are going to substitute into one output of I2,
1542          is not used within another output of I2.  We must avoid making this:
1543          (parallel [(set (mem (reg 69)) ...)
1544                     (set (reg 69) ...)])
1545          which is not well-defined as to order of actions.
1546          (Besides, reload can't handle output reloads for this.)
1547
1548          The problem can also happen if the dest of I3 is a memory ref,
1549          if another dest in I2 is an indirect memory ref.  */
1550       for (i = 0; i < XVECLEN (p2, 0); i++)
1551         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1552              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1553             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
1554                                         SET_DEST (XVECEXP (p2, 0, i))))
1555           break;
1556
1557       if (i == XVECLEN (p2, 0))
1558         for (i = 0; i < XVECLEN (p2, 0); i++)
1559           if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1560                || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1561               && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
1562             {
1563               combine_merges++;
1564
1565               subst_insn = i3;
1566               subst_low_cuid = INSN_CUID (i2);
1567
1568               added_sets_2 = added_sets_1 = 0;
1569               i2dest = SET_SRC (PATTERN (i3));
1570
1571               /* Replace the dest in I2 with our dest and make the resulting
1572                  insn the new pattern for I3.  Then skip to where we
1573                  validate the pattern.  Everything was set up above.  */
1574               SUBST (SET_DEST (XVECEXP (p2, 0, i)),
1575                      SET_DEST (PATTERN (i3)));
1576
1577               newpat = p2;
1578               i3_subst_into_i2 = 1;
1579               goto validate_replacement;
1580             }
1581     }
1582
1583   /* If I2 is setting a double-word pseudo to a constant and I3 is setting
1584      one of those words to another constant, merge them by making a new
1585      constant.  */
1586   if (i1 == 0
1587       && (temp = single_set (i2)) != 0
1588       && (GET_CODE (SET_SRC (temp)) == CONST_INT
1589           || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
1590       && GET_CODE (SET_DEST (temp)) == REG
1591       && GET_MODE_CLASS (GET_MODE (SET_DEST (temp))) == MODE_INT
1592       && GET_MODE_SIZE (GET_MODE (SET_DEST (temp))) == 2 * UNITS_PER_WORD
1593       && GET_CODE (PATTERN (i3)) == SET
1594       && GET_CODE (SET_DEST (PATTERN (i3))) == SUBREG
1595       && SUBREG_REG (SET_DEST (PATTERN (i3))) == SET_DEST (temp)
1596       && GET_MODE_CLASS (GET_MODE (SET_DEST (PATTERN (i3)))) == MODE_INT
1597       && GET_MODE_SIZE (GET_MODE (SET_DEST (PATTERN (i3)))) == UNITS_PER_WORD
1598       && GET_CODE (SET_SRC (PATTERN (i3))) == CONST_INT)
1599     {
1600       HOST_WIDE_INT lo, hi;
1601
1602       if (GET_CODE (SET_SRC (temp)) == CONST_INT)
1603         lo = INTVAL (SET_SRC (temp)), hi = lo < 0 ? -1 : 0;
1604       else
1605         {
1606           lo = CONST_DOUBLE_LOW (SET_SRC (temp));
1607           hi = CONST_DOUBLE_HIGH (SET_SRC (temp));
1608         }
1609
1610       if (subreg_lowpart_p (SET_DEST (PATTERN (i3))))
1611         {
1612           /* We don't handle the case of the target word being wider
1613              than a host wide int.  */
1614           if (HOST_BITS_PER_WIDE_INT < BITS_PER_WORD)
1615             abort ();
1616
1617           lo &= ~(UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1);
1618           lo |= (INTVAL (SET_SRC (PATTERN (i3)))
1619                  & (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1620         }
1621       else if (HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1622         hi = INTVAL (SET_SRC (PATTERN (i3)));
1623       else if (HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD)
1624         {
1625           int sign = -(int) ((unsigned HOST_WIDE_INT) lo
1626                              >> (HOST_BITS_PER_WIDE_INT - 1));
1627
1628           lo &= ~ (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1629                    (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1630           lo |= (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1631                  (INTVAL (SET_SRC (PATTERN (i3)))));
1632           if (hi == sign)
1633             hi = lo < 0 ? -1 : 0;
1634         }
1635       else
1636         /* We don't handle the case of the higher word not fitting
1637            entirely in either hi or lo.  */
1638         abort ();
1639
1640       combine_merges++;
1641       subst_insn = i3;
1642       subst_low_cuid = INSN_CUID (i2);
1643       added_sets_2 = added_sets_1 = 0;
1644       i2dest = SET_DEST (temp);
1645
1646       SUBST (SET_SRC (temp),
1647              immed_double_const (lo, hi, GET_MODE (SET_DEST (temp))));
1648
1649       newpat = PATTERN (i2);
1650       goto validate_replacement;
1651     }
1652
1653 #ifndef HAVE_cc0
1654   /* If we have no I1 and I2 looks like:
1655         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
1656                    (set Y OP)])
1657      make up a dummy I1 that is
1658         (set Y OP)
1659      and change I2 to be
1660         (set (reg:CC X) (compare:CC Y (const_int 0)))
1661
1662      (We can ignore any trailing CLOBBERs.)
1663
1664      This undoes a previous combination and allows us to match a branch-and-
1665      decrement insn.  */
1666
1667   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
1668       && XVECLEN (PATTERN (i2), 0) >= 2
1669       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
1670       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
1671           == MODE_CC)
1672       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
1673       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
1674       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
1675       && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG
1676       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
1677                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
1678     {
1679       for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
1680         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
1681           break;
1682
1683       if (i == 1)
1684         {
1685           /* We make I1 with the same INSN_UID as I2.  This gives it
1686              the same INSN_CUID for value tracking.  Our fake I1 will
1687              never appear in the insn stream so giving it the same INSN_UID
1688              as I2 will not cause a problem.  */
1689
1690           i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
1691                              BLOCK_FOR_INSN (i2), INSN_LOCATOR (i2),
1692                              XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
1693                              NULL_RTX);
1694
1695           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
1696           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
1697                  SET_DEST (PATTERN (i1)));
1698         }
1699     }
1700 #endif
1701
1702   /* Verify that I2 and I1 are valid for combining.  */
1703   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
1704       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
1705     {
1706       undo_all ();
1707       return 0;
1708     }
1709
1710   /* Record whether I2DEST is used in I2SRC and similarly for the other
1711      cases.  Knowing this will help in register status updating below.  */
1712   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
1713   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
1714   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
1715
1716   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
1717      in I2SRC.  */
1718   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
1719
1720   /* Ensure that I3's pattern can be the destination of combines.  */
1721   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
1722                           i1 && i2dest_in_i1src && i1_feeds_i3,
1723                           &i3dest_killed))
1724     {
1725       undo_all ();
1726       return 0;
1727     }
1728
1729   /* See if any of the insns is a MULT operation.  Unless one is, we will
1730      reject a combination that is, since it must be slower.  Be conservative
1731      here.  */
1732   if (GET_CODE (i2src) == MULT
1733       || (i1 != 0 && GET_CODE (i1src) == MULT)
1734       || (GET_CODE (PATTERN (i3)) == SET
1735           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
1736     have_mult = 1;
1737
1738   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
1739      We used to do this EXCEPT in one case: I3 has a post-inc in an
1740      output operand.  However, that exception can give rise to insns like
1741         mov r3,(r3)+
1742      which is a famous insn on the PDP-11 where the value of r3 used as the
1743      source was model-dependent.  Avoid this sort of thing.  */
1744
1745 #if 0
1746   if (!(GET_CODE (PATTERN (i3)) == SET
1747         && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1748         && GET_CODE (SET_DEST (PATTERN (i3))) == MEM
1749         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
1750             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
1751     /* It's not the exception.  */
1752 #endif
1753 #ifdef AUTO_INC_DEC
1754     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
1755       if (REG_NOTE_KIND (link) == REG_INC
1756           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
1757               || (i1 != 0
1758                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
1759         {
1760           undo_all ();
1761           return 0;
1762         }
1763 #endif
1764
1765   /* See if the SETs in I1 or I2 need to be kept around in the merged
1766      instruction: whenever the value set there is still needed past I3.
1767      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
1768
1769      For the SET in I1, we have two cases:  If I1 and I2 independently
1770      feed into I3, the set in I1 needs to be kept around if I1DEST dies
1771      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
1772      in I1 needs to be kept around unless I1DEST dies or is set in either
1773      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
1774      I1DEST.  If so, we know I1 feeds into I2.  */
1775
1776   added_sets_2 = ! dead_or_set_p (i3, i2dest);
1777
1778   added_sets_1
1779     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
1780                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
1781
1782   /* If the set in I2 needs to be kept around, we must make a copy of
1783      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
1784      PATTERN (I2), we are only substituting for the original I1DEST, not into
1785      an already-substituted copy.  This also prevents making self-referential
1786      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
1787      I2DEST.  */
1788
1789   i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
1790            ? gen_rtx_SET (VOIDmode, i2dest, i2src)
1791            : PATTERN (i2));
1792
1793   if (added_sets_2)
1794     i2pat = copy_rtx (i2pat);
1795
1796   combine_merges++;
1797
1798   /* Substitute in the latest insn for the regs set by the earlier ones.  */
1799
1800   maxreg = max_reg_num ();
1801
1802   subst_insn = i3;
1803
1804   /* It is possible that the source of I2 or I1 may be performing an
1805      unneeded operation, such as a ZERO_EXTEND of something that is known
1806      to have the high part zero.  Handle that case by letting subst look at
1807      the innermost one of them.
1808
1809      Another way to do this would be to have a function that tries to
1810      simplify a single insn instead of merging two or more insns.  We don't
1811      do this because of the potential of infinite loops and because
1812      of the potential extra memory required.  However, doing it the way
1813      we are is a bit of a kludge and doesn't catch all cases.
1814
1815      But only do this if -fexpensive-optimizations since it slows things down
1816      and doesn't usually win.  */
1817
1818   if (flag_expensive_optimizations)
1819     {
1820       /* Pass pc_rtx so no substitutions are done, just simplifications.  */
1821       if (i1)
1822         {
1823           subst_low_cuid = INSN_CUID (i1);
1824           i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
1825         }
1826       else
1827         {
1828           subst_low_cuid = INSN_CUID (i2);
1829           i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
1830         }
1831     }
1832
1833 #ifndef HAVE_cc0
1834   /* Many machines that don't use CC0 have insns that can both perform an
1835      arithmetic operation and set the condition code.  These operations will
1836      be represented as a PARALLEL with the first element of the vector
1837      being a COMPARE of an arithmetic operation with the constant zero.
1838      The second element of the vector will set some pseudo to the result
1839      of the same arithmetic operation.  If we simplify the COMPARE, we won't
1840      match such a pattern and so will generate an extra insn.   Here we test
1841      for this case, where both the comparison and the operation result are
1842      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
1843      I2SRC.  Later we will make the PARALLEL that contains I2.  */
1844
1845   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
1846       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
1847       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
1848       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
1849     {
1850 #ifdef SELECT_CC_MODE
1851       rtx *cc_use;
1852       enum machine_mode compare_mode;
1853 #endif
1854
1855       newpat = PATTERN (i3);
1856       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
1857
1858       i2_is_used = 1;
1859
1860 #ifdef SELECT_CC_MODE
1861       /* See if a COMPARE with the operand we substituted in should be done
1862          with the mode that is currently being used.  If not, do the same
1863          processing we do in `subst' for a SET; namely, if the destination
1864          is used only once, try to replace it with a register of the proper
1865          mode and also replace the COMPARE.  */
1866       if (undobuf.other_insn == 0
1867           && (cc_use = find_single_use (SET_DEST (newpat), i3,
1868                                         &undobuf.other_insn))
1869           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
1870                                               i2src, const0_rtx))
1871               != GET_MODE (SET_DEST (newpat))))
1872         {
1873           unsigned int regno = REGNO (SET_DEST (newpat));
1874           rtx new_dest = gen_rtx_REG (compare_mode, regno);
1875
1876           if (regno < FIRST_PSEUDO_REGISTER
1877               || (REG_N_SETS (regno) == 1 && ! added_sets_2
1878                   && ! REG_USERVAR_P (SET_DEST (newpat))))
1879             {
1880               if (regno >= FIRST_PSEUDO_REGISTER)
1881                 SUBST (regno_reg_rtx[regno], new_dest);
1882
1883               SUBST (SET_DEST (newpat), new_dest);
1884               SUBST (XEXP (*cc_use, 0), new_dest);
1885               SUBST (SET_SRC (newpat),
1886                      gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
1887             }
1888           else
1889             undobuf.other_insn = 0;
1890         }
1891 #endif
1892     }
1893   else
1894 #endif
1895     {
1896       n_occurrences = 0;                /* `subst' counts here */
1897
1898       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
1899          need to make a unique copy of I2SRC each time we substitute it
1900          to avoid self-referential rtl.  */
1901
1902       subst_low_cuid = INSN_CUID (i2);
1903       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
1904                       ! i1_feeds_i3 && i1dest_in_i1src);
1905       substed_i2 = 1;
1906
1907       /* Record whether i2's body now appears within i3's body.  */
1908       i2_is_used = n_occurrences;
1909     }
1910
1911   /* If we already got a failure, don't try to do more.  Otherwise,
1912      try to substitute in I1 if we have it.  */
1913
1914   if (i1 && GET_CODE (newpat) != CLOBBER)
1915     {
1916       /* Before we can do this substitution, we must redo the test done
1917          above (see detailed comments there) that ensures  that I1DEST
1918          isn't mentioned in any SETs in NEWPAT that are field assignments.  */
1919
1920       if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
1921                               0, (rtx*) 0))
1922         {
1923           undo_all ();
1924           return 0;
1925         }
1926
1927       n_occurrences = 0;
1928       subst_low_cuid = INSN_CUID (i1);
1929       newpat = subst (newpat, i1dest, i1src, 0, 0);
1930       substed_i1 = 1;
1931     }
1932
1933   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
1934      to count all the ways that I2SRC and I1SRC can be used.  */
1935   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
1936        && i2_is_used + added_sets_2 > 1)
1937       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
1938           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
1939               > 1))
1940       /* Fail if we tried to make a new register (we used to abort, but there's
1941          really no reason to).  */
1942       || max_reg_num () != maxreg
1943       /* Fail if we couldn't do something and have a CLOBBER.  */
1944       || GET_CODE (newpat) == CLOBBER
1945       /* Fail if this new pattern is a MULT and we didn't have one before
1946          at the outer level.  */
1947       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
1948           && ! have_mult))
1949     {
1950       undo_all ();
1951       return 0;
1952     }
1953
1954   /* If the actions of the earlier insns must be kept
1955      in addition to substituting them into the latest one,
1956      we must make a new PARALLEL for the latest insn
1957      to hold additional the SETs.  */
1958
1959   if (added_sets_1 || added_sets_2)
1960     {
1961       combine_extras++;
1962
1963       if (GET_CODE (newpat) == PARALLEL)
1964         {
1965           rtvec old = XVEC (newpat, 0);
1966           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
1967           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
1968           memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
1969                   sizeof (old->elem[0]) * old->num_elem);
1970         }
1971       else
1972         {
1973           rtx old = newpat;
1974           total_sets = 1 + added_sets_1 + added_sets_2;
1975           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
1976           XVECEXP (newpat, 0, 0) = old;
1977         }
1978
1979       if (added_sets_1)
1980         XVECEXP (newpat, 0, --total_sets)
1981           = (GET_CODE (PATTERN (i1)) == PARALLEL
1982              ? gen_rtx_SET (VOIDmode, i1dest, i1src) : PATTERN (i1));
1983
1984       if (added_sets_2)
1985         {
1986           /* If there is no I1, use I2's body as is.  We used to also not do
1987              the subst call below if I2 was substituted into I3,
1988              but that could lose a simplification.  */
1989           if (i1 == 0)
1990             XVECEXP (newpat, 0, --total_sets) = i2pat;
1991           else
1992             /* See comment where i2pat is assigned.  */
1993             XVECEXP (newpat, 0, --total_sets)
1994               = subst (i2pat, i1dest, i1src, 0, 0);
1995         }
1996     }
1997
1998   /* We come here when we are replacing a destination in I2 with the
1999      destination of I3.  */
2000  validate_replacement:
2001
2002   /* Note which hard regs this insn has as inputs.  */
2003   mark_used_regs_combine (newpat);
2004
2005   /* Is the result of combination a valid instruction?  */
2006   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2007
2008   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
2009      the second SET's destination is a register that is unused and isn't
2010      marked as an instruction that might trap in an EH region.  In that case,
2011      we just need the first SET.   This can occur when simplifying a divmod
2012      insn.  We *must* test for this case here because the code below that
2013      splits two independent SETs doesn't handle this case correctly when it
2014      updates the register status.
2015
2016      It's pointless doing this if we originally had two sets, one from
2017      i3, and one from i2.  Combining then splitting the parallel results
2018      in the original i2 again plus an invalid insn (which we delete).
2019      The net effect is only to move instructions around, which makes
2020      debug info less accurate.
2021
2022      Also check the case where the first SET's destination is unused.
2023      That would not cause incorrect code, but does cause an unneeded
2024      insn to remain.  */
2025
2026   if (insn_code_number < 0
2027       && !(added_sets_2 && i1 == 0)
2028       && GET_CODE (newpat) == PARALLEL
2029       && XVECLEN (newpat, 0) == 2
2030       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2031       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2032       && asm_noperands (newpat) < 0)
2033     {
2034       rtx set0 = XVECEXP (newpat, 0, 0);
2035       rtx set1 = XVECEXP (newpat, 0, 1);
2036       rtx note;
2037
2038       if (((GET_CODE (SET_DEST (set1)) == REG
2039             && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
2040            || (GET_CODE (SET_DEST (set1)) == SUBREG
2041                && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
2042           && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2043               || INTVAL (XEXP (note, 0)) <= 0)
2044           && ! side_effects_p (SET_SRC (set1)))
2045         {
2046           newpat = set0;
2047           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2048         }
2049
2050       else if (((GET_CODE (SET_DEST (set0)) == REG
2051                  && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
2052                 || (GET_CODE (SET_DEST (set0)) == SUBREG
2053                     && find_reg_note (i3, REG_UNUSED,
2054                                       SUBREG_REG (SET_DEST (set0)))))
2055                && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2056                    || INTVAL (XEXP (note, 0)) <= 0)
2057                && ! side_effects_p (SET_SRC (set0)))
2058         {
2059           newpat = set1;
2060           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2061
2062           if (insn_code_number >= 0)
2063             {
2064               /* If we will be able to accept this, we have made a
2065                  change to the destination of I3.  This requires us to
2066                  do a few adjustments.  */
2067
2068               PATTERN (i3) = newpat;
2069               adjust_for_new_dest (i3);
2070             }
2071         }
2072     }
2073
2074   /* If we were combining three insns and the result is a simple SET
2075      with no ASM_OPERANDS that wasn't recognized, try to split it into two
2076      insns.  There are two ways to do this.  It can be split using a
2077      machine-specific method (like when you have an addition of a large
2078      constant) or by combine in the function find_split_point.  */
2079
2080   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
2081       && asm_noperands (newpat) < 0)
2082     {
2083       rtx m_split, *split;
2084       rtx ni2dest = i2dest;
2085
2086       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
2087          use I2DEST as a scratch register will help.  In the latter case,
2088          convert I2DEST to the mode of the source of NEWPAT if we can.  */
2089
2090       m_split = split_insns (newpat, i3);
2091
2092       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
2093          inputs of NEWPAT.  */
2094
2095       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
2096          possible to try that as a scratch reg.  This would require adding
2097          more code to make it work though.  */
2098
2099       if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat))
2100         {
2101           /* If I2DEST is a hard register or the only use of a pseudo,
2102              we can change its mode.  */
2103           if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest)
2104               && GET_MODE (SET_DEST (newpat)) != VOIDmode
2105               && GET_CODE (i2dest) == REG
2106               && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
2107                   || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
2108                       && ! REG_USERVAR_P (i2dest))))
2109             ni2dest = gen_rtx_REG (GET_MODE (SET_DEST (newpat)),
2110                                    REGNO (i2dest));
2111
2112           m_split = split_insns (gen_rtx_PARALLEL
2113                                  (VOIDmode,
2114                                   gen_rtvec (2, newpat,
2115                                              gen_rtx_CLOBBER (VOIDmode,
2116                                                               ni2dest))),
2117                                  i3);
2118           /* If the split with the mode-changed register didn't work, try
2119              the original register.  */
2120           if (! m_split && ni2dest != i2dest)
2121             {
2122               ni2dest = i2dest;
2123               m_split = split_insns (gen_rtx_PARALLEL
2124                                      (VOIDmode,
2125                                       gen_rtvec (2, newpat,
2126                                                  gen_rtx_CLOBBER (VOIDmode,
2127                                                                   i2dest))),
2128                                      i3);
2129             }
2130         }
2131
2132       if (m_split && NEXT_INSN (m_split) == NULL_RTX)
2133         {
2134           m_split = PATTERN (m_split);
2135           insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
2136           if (insn_code_number >= 0)
2137             newpat = m_split;
2138         }
2139       else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
2140                && (next_real_insn (i2) == i3
2141                    || ! use_crosses_set_p (PATTERN (m_split), INSN_CUID (i2))))
2142         {
2143           rtx i2set, i3set;
2144           rtx newi3pat = PATTERN (NEXT_INSN (m_split));
2145           newi2pat = PATTERN (m_split);
2146
2147           i3set = single_set (NEXT_INSN (m_split));
2148           i2set = single_set (m_split);
2149
2150           /* In case we changed the mode of I2DEST, replace it in the
2151              pseudo-register table here.  We can't do it above in case this
2152              code doesn't get executed and we do a split the other way.  */
2153
2154           if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2155             SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
2156
2157           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2158
2159           /* If I2 or I3 has multiple SETs, we won't know how to track
2160              register status, so don't use these insns.  If I2's destination
2161              is used between I2 and I3, we also can't use these insns.  */
2162
2163           if (i2_code_number >= 0 && i2set && i3set
2164               && (next_real_insn (i2) == i3
2165                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
2166             insn_code_number = recog_for_combine (&newi3pat, i3,
2167                                                   &new_i3_notes);
2168           if (insn_code_number >= 0)
2169             newpat = newi3pat;
2170
2171           /* It is possible that both insns now set the destination of I3.
2172              If so, we must show an extra use of it.  */
2173
2174           if (insn_code_number >= 0)
2175             {
2176               rtx new_i3_dest = SET_DEST (i3set);
2177               rtx new_i2_dest = SET_DEST (i2set);
2178
2179               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
2180                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
2181                      || GET_CODE (new_i3_dest) == SUBREG)
2182                 new_i3_dest = XEXP (new_i3_dest, 0);
2183
2184               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
2185                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
2186                      || GET_CODE (new_i2_dest) == SUBREG)
2187                 new_i2_dest = XEXP (new_i2_dest, 0);
2188
2189               if (GET_CODE (new_i3_dest) == REG
2190                   && GET_CODE (new_i2_dest) == REG
2191                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
2192                 REG_N_SETS (REGNO (new_i2_dest))++;
2193             }
2194         }
2195
2196       /* If we can split it and use I2DEST, go ahead and see if that
2197          helps things be recognized.  Verify that none of the registers
2198          are set between I2 and I3.  */
2199       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
2200 #ifdef HAVE_cc0
2201           && GET_CODE (i2dest) == REG
2202 #endif
2203           /* We need I2DEST in the proper mode.  If it is a hard register
2204              or the only use of a pseudo, we can change its mode.  */
2205           && (GET_MODE (*split) == GET_MODE (i2dest)
2206               || GET_MODE (*split) == VOIDmode
2207               || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
2208               || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
2209                   && ! REG_USERVAR_P (i2dest)))
2210           && (next_real_insn (i2) == i3
2211               || ! use_crosses_set_p (*split, INSN_CUID (i2)))
2212           /* We can't overwrite I2DEST if its value is still used by
2213              NEWPAT.  */
2214           && ! reg_referenced_p (i2dest, newpat))
2215         {
2216           rtx newdest = i2dest;
2217           enum rtx_code split_code = GET_CODE (*split);
2218           enum machine_mode split_mode = GET_MODE (*split);
2219
2220           /* Get NEWDEST as a register in the proper mode.  We have already
2221              validated that we can do this.  */
2222           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
2223             {
2224               newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
2225
2226               if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2227                 SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
2228             }
2229
2230           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
2231              an ASHIFT.  This can occur if it was inside a PLUS and hence
2232              appeared to be a memory address.  This is a kludge.  */
2233           if (split_code == MULT
2234               && GET_CODE (XEXP (*split, 1)) == CONST_INT
2235               && INTVAL (XEXP (*split, 1)) > 0
2236               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
2237             {
2238               SUBST (*split, gen_rtx_ASHIFT (split_mode,
2239                                              XEXP (*split, 0), GEN_INT (i)));
2240               /* Update split_code because we may not have a multiply
2241                  anymore.  */
2242               split_code = GET_CODE (*split);
2243             }
2244
2245 #ifdef INSN_SCHEDULING
2246           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
2247              be written as a ZERO_EXTEND.  */
2248           if (split_code == SUBREG && GET_CODE (SUBREG_REG (*split)) == MEM)
2249             {
2250 #ifdef LOAD_EXTEND_OP
2251               /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
2252                  what it really is.  */
2253               if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
2254                   == SIGN_EXTEND)
2255                 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
2256                                                     SUBREG_REG (*split)));
2257               else
2258 #endif
2259                 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
2260                                                     SUBREG_REG (*split)));
2261             }
2262 #endif
2263
2264           newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
2265           SUBST (*split, newdest);
2266           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2267
2268           /* If the split point was a MULT and we didn't have one before,
2269              don't use one now.  */
2270           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
2271             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2272         }
2273     }
2274
2275   /* Check for a case where we loaded from memory in a narrow mode and
2276      then sign extended it, but we need both registers.  In that case,
2277      we have a PARALLEL with both loads from the same memory location.
2278      We can split this into a load from memory followed by a register-register
2279      copy.  This saves at least one insn, more if register allocation can
2280      eliminate the copy.
2281
2282      We cannot do this if the destination of the first assignment is a
2283      condition code register or cc0.  We eliminate this case by making sure
2284      the SET_DEST and SET_SRC have the same mode.
2285
2286      We cannot do this if the destination of the second assignment is
2287      a register that we have already assumed is zero-extended.  Similarly
2288      for a SUBREG of such a register.  */
2289
2290   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2291            && GET_CODE (newpat) == PARALLEL
2292            && XVECLEN (newpat, 0) == 2
2293            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2294            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
2295            && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
2296                == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
2297            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2298            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2299                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
2300            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2301                                    INSN_CUID (i2))
2302            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2303            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2304            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
2305                  (GET_CODE (temp) == REG
2306                   && reg_stat[REGNO (temp)].nonzero_bits != 0
2307                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2308                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2309                   && (reg_stat[REGNO (temp)].nonzero_bits
2310                       != GET_MODE_MASK (word_mode))))
2311            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
2312                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
2313                      (GET_CODE (temp) == REG
2314                       && reg_stat[REGNO (temp)].nonzero_bits != 0
2315                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2316                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2317                       && (reg_stat[REGNO (temp)].nonzero_bits
2318                           != GET_MODE_MASK (word_mode)))))
2319            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2320                                          SET_SRC (XVECEXP (newpat, 0, 1)))
2321            && ! find_reg_note (i3, REG_UNUSED,
2322                                SET_DEST (XVECEXP (newpat, 0, 0))))
2323     {
2324       rtx ni2dest;
2325
2326       newi2pat = XVECEXP (newpat, 0, 0);
2327       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
2328       newpat = XVECEXP (newpat, 0, 1);
2329       SUBST (SET_SRC (newpat),
2330              gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
2331       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2332
2333       if (i2_code_number >= 0)
2334         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2335
2336       if (insn_code_number >= 0)
2337         {
2338           rtx insn;
2339           rtx link;
2340
2341           /* If we will be able to accept this, we have made a change to the
2342              destination of I3.  This requires us to do a few adjustments.  */
2343           PATTERN (i3) = newpat;
2344           adjust_for_new_dest (i3);
2345
2346           /* I3 now uses what used to be its destination and which is
2347              now I2's destination.  That means we need a LOG_LINK from
2348              I3 to I2.  But we used to have one, so we still will.
2349
2350              However, some later insn might be using I2's dest and have
2351              a LOG_LINK pointing at I3.  We must remove this link.
2352              The simplest way to remove the link is to point it at I1,
2353              which we know will be a NOTE.  */
2354
2355           for (insn = NEXT_INSN (i3);
2356                insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2357                         || insn != BB_HEAD (this_basic_block->next_bb));
2358                insn = NEXT_INSN (insn))
2359             {
2360               if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
2361                 {
2362                   for (link = LOG_LINKS (insn); link;
2363                        link = XEXP (link, 1))
2364                     if (XEXP (link, 0) == i3)
2365                       XEXP (link, 0) = i1;
2366
2367                   break;
2368                 }
2369             }
2370         }
2371     }
2372
2373   /* Similarly, check for a case where we have a PARALLEL of two independent
2374      SETs but we started with three insns.  In this case, we can do the sets
2375      as two separate insns.  This case occurs when some SET allows two
2376      other insns to combine, but the destination of that SET is still live.  */
2377
2378   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2379            && GET_CODE (newpat) == PARALLEL
2380            && XVECLEN (newpat, 0) == 2
2381            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2382            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
2383            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
2384            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2385            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2386            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2387            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2388                                    INSN_CUID (i2))
2389            /* Don't pass sets with (USE (MEM ...)) dests to the following.  */
2390            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
2391            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
2392            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2393                                   XVECEXP (newpat, 0, 0))
2394            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
2395                                   XVECEXP (newpat, 0, 1))
2396            && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
2397                  && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
2398     {
2399       /* Normally, it doesn't matter which of the two is done first,
2400          but it does if one references cc0.  In that case, it has to
2401          be first.  */
2402 #ifdef HAVE_cc0
2403       if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
2404         {
2405           newi2pat = XVECEXP (newpat, 0, 0);
2406           newpat = XVECEXP (newpat, 0, 1);
2407         }
2408       else
2409 #endif
2410         {
2411           newi2pat = XVECEXP (newpat, 0, 1);
2412           newpat = XVECEXP (newpat, 0, 0);
2413         }
2414
2415       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2416
2417       if (i2_code_number >= 0)
2418         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2419     }
2420
2421   /* If it still isn't recognized, fail and change things back the way they
2422      were.  */
2423   if ((insn_code_number < 0
2424        /* Is the result a reasonable ASM_OPERANDS?  */
2425        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
2426     {
2427       undo_all ();
2428       return 0;
2429     }
2430
2431   /* If we had to change another insn, make sure it is valid also.  */
2432   if (undobuf.other_insn)
2433     {
2434       rtx other_pat = PATTERN (undobuf.other_insn);
2435       rtx new_other_notes;
2436       rtx note, next;
2437
2438       CLEAR_HARD_REG_SET (newpat_used_regs);
2439
2440       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
2441                                              &new_other_notes);
2442
2443       if (other_code_number < 0 && ! check_asm_operands (other_pat))
2444         {
2445           undo_all ();
2446           return 0;
2447         }
2448
2449       PATTERN (undobuf.other_insn) = other_pat;
2450
2451       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
2452          are still valid.  Then add any non-duplicate notes added by
2453          recog_for_combine.  */
2454       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
2455         {
2456           next = XEXP (note, 1);
2457
2458           if (REG_NOTE_KIND (note) == REG_UNUSED
2459               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
2460             {
2461               if (GET_CODE (XEXP (note, 0)) == REG)
2462                 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
2463
2464               remove_note (undobuf.other_insn, note);
2465             }
2466         }
2467
2468       for (note = new_other_notes; note; note = XEXP (note, 1))
2469         if (GET_CODE (XEXP (note, 0)) == REG)
2470           REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
2471
2472       distribute_notes (new_other_notes, undobuf.other_insn,
2473                         undobuf.other_insn, NULL_RTX);
2474     }
2475 #ifdef HAVE_cc0
2476   /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
2477      they are adjacent to each other or not.  */
2478   {
2479     rtx p = prev_nonnote_insn (i3);
2480     if (p && p != i2 && GET_CODE (p) == INSN && newi2pat
2481         && sets_cc0_p (newi2pat))
2482       {
2483         undo_all ();
2484         return 0;
2485       }
2486   }
2487 #endif
2488
2489   /* We now know that we can do this combination.  Merge the insns and
2490      update the status of registers and LOG_LINKS.  */
2491
2492   {
2493     rtx i3notes, i2notes, i1notes = 0;
2494     rtx i3links, i2links, i1links = 0;
2495     rtx midnotes = 0;
2496     unsigned int regno;
2497
2498     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
2499        clear them.  */
2500     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
2501     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
2502     if (i1)
2503       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
2504
2505     /* Ensure that we do not have something that should not be shared but
2506        occurs multiple times in the new insns.  Check this by first
2507        resetting all the `used' flags and then copying anything is shared.  */
2508
2509     reset_used_flags (i3notes);
2510     reset_used_flags (i2notes);
2511     reset_used_flags (i1notes);
2512     reset_used_flags (newpat);
2513     reset_used_flags (newi2pat);
2514     if (undobuf.other_insn)
2515       reset_used_flags (PATTERN (undobuf.other_insn));
2516
2517     i3notes = copy_rtx_if_shared (i3notes);
2518     i2notes = copy_rtx_if_shared (i2notes);
2519     i1notes = copy_rtx_if_shared (i1notes);
2520     newpat = copy_rtx_if_shared (newpat);
2521     newi2pat = copy_rtx_if_shared (newi2pat);
2522     if (undobuf.other_insn)
2523       reset_used_flags (PATTERN (undobuf.other_insn));
2524
2525     INSN_CODE (i3) = insn_code_number;
2526     PATTERN (i3) = newpat;
2527
2528     if (GET_CODE (i3) == CALL_INSN && CALL_INSN_FUNCTION_USAGE (i3))
2529       {
2530         rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
2531
2532         reset_used_flags (call_usage);
2533         call_usage = copy_rtx (call_usage);
2534
2535         if (substed_i2)
2536           replace_rtx (call_usage, i2dest, i2src);
2537
2538         if (substed_i1)
2539           replace_rtx (call_usage, i1dest, i1src);
2540
2541         CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
2542       }
2543
2544     if (undobuf.other_insn)
2545       INSN_CODE (undobuf.other_insn) = other_code_number;
2546
2547     /* We had one special case above where I2 had more than one set and
2548        we replaced a destination of one of those sets with the destination
2549        of I3.  In that case, we have to update LOG_LINKS of insns later
2550        in this basic block.  Note that this (expensive) case is rare.
2551
2552        Also, in this case, we must pretend that all REG_NOTEs for I2
2553        actually came from I3, so that REG_UNUSED notes from I2 will be
2554        properly handled.  */
2555
2556     if (i3_subst_into_i2)
2557       {
2558         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
2559           if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != USE
2560               && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG
2561               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
2562               && ! find_reg_note (i2, REG_UNUSED,
2563                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
2564             for (temp = NEXT_INSN (i2);
2565                  temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2566                           || BB_HEAD (this_basic_block) != temp);
2567                  temp = NEXT_INSN (temp))
2568               if (temp != i3 && INSN_P (temp))
2569                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
2570                   if (XEXP (link, 0) == i2)
2571                     XEXP (link, 0) = i3;
2572
2573         if (i3notes)
2574           {
2575             rtx link = i3notes;
2576             while (XEXP (link, 1))
2577               link = XEXP (link, 1);
2578             XEXP (link, 1) = i2notes;
2579           }
2580         else
2581           i3notes = i2notes;
2582         i2notes = 0;
2583       }
2584
2585     LOG_LINKS (i3) = 0;
2586     REG_NOTES (i3) = 0;
2587     LOG_LINKS (i2) = 0;
2588     REG_NOTES (i2) = 0;
2589
2590     if (newi2pat)
2591       {
2592         INSN_CODE (i2) = i2_code_number;
2593         PATTERN (i2) = newi2pat;
2594       }
2595     else
2596       {
2597         PUT_CODE (i2, NOTE);
2598         NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED;
2599         NOTE_SOURCE_FILE (i2) = 0;
2600       }
2601
2602     if (i1)
2603       {
2604         LOG_LINKS (i1) = 0;
2605         REG_NOTES (i1) = 0;
2606         PUT_CODE (i1, NOTE);
2607         NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED;
2608         NOTE_SOURCE_FILE (i1) = 0;
2609       }
2610
2611     /* Get death notes for everything that is now used in either I3 or
2612        I2 and used to die in a previous insn.  If we built two new
2613        patterns, move from I1 to I2 then I2 to I3 so that we get the
2614        proper movement on registers that I2 modifies.  */
2615
2616     if (newi2pat)
2617       {
2618         move_deaths (newi2pat, NULL_RTX, INSN_CUID (i1), i2, &midnotes);
2619         move_deaths (newpat, newi2pat, INSN_CUID (i1), i3, &midnotes);
2620       }
2621     else
2622       move_deaths (newpat, NULL_RTX, i1 ? INSN_CUID (i1) : INSN_CUID (i2),
2623                    i3, &midnotes);
2624
2625     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
2626     if (i3notes)
2627       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX);
2628     if (i2notes)
2629       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX);
2630     if (i1notes)
2631       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX);
2632     if (midnotes)
2633       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2634
2635     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
2636        know these are REG_UNUSED and want them to go to the desired insn,
2637        so we always pass it as i3.  We have not counted the notes in
2638        reg_n_deaths yet, so we need to do so now.  */
2639
2640     if (newi2pat && new_i2_notes)
2641       {
2642         for (temp = new_i2_notes; temp; temp = XEXP (temp, 1))
2643           if (GET_CODE (XEXP (temp, 0)) == REG)
2644             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2645
2646         distribute_notes (new_i2_notes, i2, i2, NULL_RTX);
2647       }
2648
2649     if (new_i3_notes)
2650       {
2651         for (temp = new_i3_notes; temp; temp = XEXP (temp, 1))
2652           if (GET_CODE (XEXP (temp, 0)) == REG)
2653             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2654
2655         distribute_notes (new_i3_notes, i3, i3, NULL_RTX);
2656       }
2657
2658     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
2659        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
2660        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
2661        in that case, it might delete I2.  Similarly for I2 and I1.
2662        Show an additional death due to the REG_DEAD note we make here.  If
2663        we discard it in distribute_notes, we will decrement it again.  */
2664
2665     if (i3dest_killed)
2666       {
2667         if (GET_CODE (i3dest_killed) == REG)
2668           REG_N_DEATHS (REGNO (i3dest_killed))++;
2669
2670         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
2671           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2672                                                NULL_RTX),
2673                             NULL_RTX, i2, NULL_RTX);
2674         else
2675           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2676                                                NULL_RTX),
2677                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2678       }
2679
2680     if (i2dest_in_i2src)
2681       {
2682         if (GET_CODE (i2dest) == REG)
2683           REG_N_DEATHS (REGNO (i2dest))++;
2684
2685         if (newi2pat && reg_set_p (i2dest, newi2pat))
2686           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2687                             NULL_RTX, i2, NULL_RTX);
2688         else
2689           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2690                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2691       }
2692
2693     if (i1dest_in_i1src)
2694       {
2695         if (GET_CODE (i1dest) == REG)
2696           REG_N_DEATHS (REGNO (i1dest))++;
2697
2698         if (newi2pat && reg_set_p (i1dest, newi2pat))
2699           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2700                             NULL_RTX, i2, NULL_RTX);
2701         else
2702           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2703                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2704       }
2705
2706     distribute_links (i3links);
2707     distribute_links (i2links);
2708     distribute_links (i1links);
2709
2710     if (GET_CODE (i2dest) == REG)
2711       {
2712         rtx link;
2713         rtx i2_insn = 0, i2_val = 0, set;
2714
2715         /* The insn that used to set this register doesn't exist, and
2716            this life of the register may not exist either.  See if one of
2717            I3's links points to an insn that sets I2DEST.  If it does,
2718            that is now the last known value for I2DEST. If we don't update
2719            this and I2 set the register to a value that depended on its old
2720            contents, we will get confused.  If this insn is used, thing
2721            will be set correctly in combine_instructions.  */
2722
2723         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2724           if ((set = single_set (XEXP (link, 0))) != 0
2725               && rtx_equal_p (i2dest, SET_DEST (set)))
2726             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
2727
2728         record_value_for_reg (i2dest, i2_insn, i2_val);
2729
2730         /* If the reg formerly set in I2 died only once and that was in I3,
2731            zero its use count so it won't make `reload' do any work.  */
2732         if (! added_sets_2
2733             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
2734             && ! i2dest_in_i2src)
2735           {
2736             regno = REGNO (i2dest);
2737             REG_N_SETS (regno)--;
2738           }
2739       }
2740
2741     if (i1 && GET_CODE (i1dest) == REG)
2742       {
2743         rtx link;
2744         rtx i1_insn = 0, i1_val = 0, set;
2745
2746         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2747           if ((set = single_set (XEXP (link, 0))) != 0
2748               && rtx_equal_p (i1dest, SET_DEST (set)))
2749             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
2750
2751         record_value_for_reg (i1dest, i1_insn, i1_val);
2752
2753         regno = REGNO (i1dest);
2754         if (! added_sets_1 && ! i1dest_in_i1src)
2755           REG_N_SETS (regno)--;
2756       }
2757
2758     /* Update reg_stat[].nonzero_bits et al for any changes that may have
2759        been made to this insn.  The order of
2760        set_nonzero_bits_and_sign_copies() is important.  Because newi2pat
2761        can affect nonzero_bits of newpat */
2762     if (newi2pat)
2763       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
2764     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
2765
2766     /* Set new_direct_jump_p if a new return or simple jump instruction
2767        has been created.
2768
2769        If I3 is now an unconditional jump, ensure that it has a
2770        BARRIER following it since it may have initially been a
2771        conditional jump.  It may also be the last nonnote insn.  */
2772
2773     if (returnjump_p (i3) || any_uncondjump_p (i3))
2774       {
2775         *new_direct_jump_p = 1;
2776         mark_jump_label (PATTERN (i3), i3, 0);
2777
2778         if ((temp = next_nonnote_insn (i3)) == NULL_RTX
2779             || GET_CODE (temp) != BARRIER)
2780           emit_barrier_after (i3);
2781       }
2782
2783     if (undobuf.other_insn != NULL_RTX
2784         && (returnjump_p (undobuf.other_insn)
2785             || any_uncondjump_p (undobuf.other_insn)))
2786       {
2787         *new_direct_jump_p = 1;
2788
2789         if ((temp = next_nonnote_insn (undobuf.other_insn)) == NULL_RTX
2790             || GET_CODE (temp) != BARRIER)
2791           emit_barrier_after (undobuf.other_insn);
2792       }
2793
2794     /* An NOOP jump does not need barrier, but it does need cleaning up
2795        of CFG.  */
2796     if (GET_CODE (newpat) == SET
2797         && SET_SRC (newpat) == pc_rtx
2798         && SET_DEST (newpat) == pc_rtx)
2799       *new_direct_jump_p = 1;
2800   }
2801
2802   combine_successes++;
2803   undo_commit ();
2804
2805   if (added_links_insn
2806       && (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2))
2807       && INSN_CUID (added_links_insn) < INSN_CUID (i3))
2808     return added_links_insn;
2809   else
2810     return newi2pat ? i2 : i3;
2811 }
2812 \f
2813 /* Undo all the modifications recorded in undobuf.  */
2814
2815 static void
2816 undo_all (void)
2817 {
2818   struct undo *undo, *next;
2819
2820   for (undo = undobuf.undos; undo; undo = next)
2821     {
2822       next = undo->next;
2823       if (undo->is_int)
2824         *undo->where.i = undo->old_contents.i;
2825       else
2826         *undo->where.r = undo->old_contents.r;
2827
2828       undo->next = undobuf.frees;
2829       undobuf.frees = undo;
2830     }
2831
2832   undobuf.undos = 0;
2833 }
2834
2835 /* We've committed to accepting the changes we made.  Move all
2836    of the undos to the free list.  */
2837
2838 static void
2839 undo_commit (void)
2840 {
2841   struct undo *undo, *next;
2842
2843   for (undo = undobuf.undos; undo; undo = next)
2844     {
2845       next = undo->next;
2846       undo->next = undobuf.frees;
2847       undobuf.frees = undo;
2848     }
2849   undobuf.undos = 0;
2850 }
2851
2852 \f
2853 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
2854    where we have an arithmetic expression and return that point.  LOC will
2855    be inside INSN.
2856
2857    try_combine will call this function to see if an insn can be split into
2858    two insns.  */
2859
2860 static rtx *
2861 find_split_point (rtx *loc, rtx insn)
2862 {
2863   rtx x = *loc;
2864   enum rtx_code code = GET_CODE (x);
2865   rtx *split;
2866   unsigned HOST_WIDE_INT len = 0;
2867   HOST_WIDE_INT pos = 0;
2868   int unsignedp = 0;
2869   rtx inner = NULL_RTX;
2870
2871   /* First special-case some codes.  */
2872   switch (code)
2873     {
2874     case SUBREG:
2875 #ifdef INSN_SCHEDULING
2876       /* If we are making a paradoxical SUBREG invalid, it becomes a split
2877          point.  */
2878       if (GET_CODE (SUBREG_REG (x)) == MEM)
2879         return loc;
2880 #endif
2881       return find_split_point (&SUBREG_REG (x), insn);
2882
2883     case MEM:
2884 #ifdef HAVE_lo_sum
2885       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
2886          using LO_SUM and HIGH.  */
2887       if (GET_CODE (XEXP (x, 0)) == CONST
2888           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
2889         {
2890           SUBST (XEXP (x, 0),
2891                  gen_rtx_LO_SUM (Pmode,
2892                                  gen_rtx_HIGH (Pmode, XEXP (x, 0)),
2893                                  XEXP (x, 0)));
2894           return &XEXP (XEXP (x, 0), 0);
2895         }
2896 #endif
2897
2898       /* If we have a PLUS whose second operand is a constant and the
2899          address is not valid, perhaps will can split it up using
2900          the machine-specific way to split large constants.  We use
2901          the first pseudo-reg (one of the virtual regs) as a placeholder;
2902          it will not remain in the result.  */
2903       if (GET_CODE (XEXP (x, 0)) == PLUS
2904           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2905           && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
2906         {
2907           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
2908           rtx seq = split_insns (gen_rtx_SET (VOIDmode, reg, XEXP (x, 0)),
2909                                  subst_insn);
2910
2911           /* This should have produced two insns, each of which sets our
2912              placeholder.  If the source of the second is a valid address,
2913              we can make put both sources together and make a split point
2914              in the middle.  */
2915
2916           if (seq
2917               && NEXT_INSN (seq) != NULL_RTX
2918               && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
2919               && GET_CODE (seq) == INSN
2920               && GET_CODE (PATTERN (seq)) == SET
2921               && SET_DEST (PATTERN (seq)) == reg
2922               && ! reg_mentioned_p (reg,
2923                                     SET_SRC (PATTERN (seq)))
2924               && GET_CODE (NEXT_INSN (seq)) == INSN
2925               && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
2926               && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
2927               && memory_address_p (GET_MODE (x),
2928                                    SET_SRC (PATTERN (NEXT_INSN (seq)))))
2929             {
2930               rtx src1 = SET_SRC (PATTERN (seq));
2931               rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
2932
2933               /* Replace the placeholder in SRC2 with SRC1.  If we can
2934                  find where in SRC2 it was placed, that can become our
2935                  split point and we can replace this address with SRC2.
2936                  Just try two obvious places.  */
2937
2938               src2 = replace_rtx (src2, reg, src1);
2939               split = 0;
2940               if (XEXP (src2, 0) == src1)
2941                 split = &XEXP (src2, 0);
2942               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
2943                        && XEXP (XEXP (src2, 0), 0) == src1)
2944                 split = &XEXP (XEXP (src2, 0), 0);
2945
2946               if (split)
2947                 {
2948                   SUBST (XEXP (x, 0), src2);
2949                   return split;
2950                 }
2951             }
2952
2953           /* If that didn't work, perhaps the first operand is complex and
2954              needs to be computed separately, so make a split point there.
2955              This will occur on machines that just support REG + CONST
2956              and have a constant moved through some previous computation.  */
2957
2958           else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
2959                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
2960                          && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
2961             return &XEXP (XEXP (x, 0), 0);
2962         }
2963       break;
2964
2965     case SET:
2966 #ifdef HAVE_cc0
2967       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
2968          ZERO_EXTRACT, the most likely reason why this doesn't match is that
2969          we need to put the operand into a register.  So split at that
2970          point.  */
2971
2972       if (SET_DEST (x) == cc0_rtx
2973           && GET_CODE (SET_SRC (x)) != COMPARE
2974           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
2975           && !OBJECT_P (SET_SRC (x))
2976           && ! (GET_CODE (SET_SRC (x)) == SUBREG
2977                 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
2978         return &SET_SRC (x);
2979 #endif
2980
2981       /* See if we can split SET_SRC as it stands.  */
2982       split = find_split_point (&SET_SRC (x), insn);
2983       if (split && split != &SET_SRC (x))
2984         return split;
2985
2986       /* See if we can split SET_DEST as it stands.  */
2987       split = find_split_point (&SET_DEST (x), insn);
2988       if (split && split != &SET_DEST (x))
2989         return split;
2990
2991       /* See if this is a bitfield assignment with everything constant.  If
2992          so, this is an IOR of an AND, so split it into that.  */
2993       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
2994           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
2995               <= HOST_BITS_PER_WIDE_INT)
2996           && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
2997           && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
2998           && GET_CODE (SET_SRC (x)) == CONST_INT
2999           && ((INTVAL (XEXP (SET_DEST (x), 1))
3000                + INTVAL (XEXP (SET_DEST (x), 2)))
3001               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
3002           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
3003         {
3004           HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
3005           unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
3006           unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
3007           rtx dest = XEXP (SET_DEST (x), 0);
3008           enum machine_mode mode = GET_MODE (dest);
3009           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
3010
3011           if (BITS_BIG_ENDIAN)
3012             pos = GET_MODE_BITSIZE (mode) - len - pos;
3013
3014           if (src == mask)
3015             SUBST (SET_SRC (x),
3016                    gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
3017           else
3018             SUBST (SET_SRC (x),
3019                    gen_binary (IOR, mode,
3020                                gen_binary (AND, mode, dest,
3021                                            gen_int_mode (~(mask << pos),
3022                                                          mode)),
3023                                GEN_INT (src << pos)));
3024
3025           SUBST (SET_DEST (x), dest);
3026
3027           split = find_split_point (&SET_SRC (x), insn);
3028           if (split && split != &SET_SRC (x))
3029             return split;
3030         }
3031
3032       /* Otherwise, see if this is an operation that we can split into two.
3033          If so, try to split that.  */
3034       code = GET_CODE (SET_SRC (x));
3035
3036       switch (code)
3037         {
3038         case AND:
3039           /* If we are AND'ing with a large constant that is only a single
3040              bit and the result is only being used in a context where we
3041              need to know if it is zero or nonzero, replace it with a bit
3042              extraction.  This will avoid the large constant, which might
3043              have taken more than one insn to make.  If the constant were
3044              not a valid argument to the AND but took only one insn to make,
3045              this is no worse, but if it took more than one insn, it will
3046              be better.  */
3047
3048           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3049               && GET_CODE (XEXP (SET_SRC (x), 0)) == REG
3050               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
3051               && GET_CODE (SET_DEST (x)) == REG
3052               && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
3053               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
3054               && XEXP (*split, 0) == SET_DEST (x)
3055               && XEXP (*split, 1) == const0_rtx)
3056             {
3057               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
3058                                                 XEXP (SET_SRC (x), 0),
3059                                                 pos, NULL_RTX, 1, 1, 0, 0);
3060               if (extraction != 0)
3061                 {
3062                   SUBST (SET_SRC (x), extraction);
3063                   return find_split_point (loc, insn);
3064                 }
3065             }
3066           break;
3067
3068         case NE:
3069           /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
3070              is known to be on, this can be converted into a NEG of a shift.  */
3071           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
3072               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
3073               && 1 <= (pos = exact_log2
3074                        (nonzero_bits (XEXP (SET_SRC (x), 0),
3075                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
3076             {
3077               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
3078
3079               SUBST (SET_SRC (x),
3080                      gen_rtx_NEG (mode,
3081                                   gen_rtx_LSHIFTRT (mode,
3082                                                     XEXP (SET_SRC (x), 0),
3083                                                     GEN_INT (pos))));
3084
3085               split = find_split_point (&SET_SRC (x), insn);
3086               if (split && split != &SET_SRC (x))
3087                 return split;
3088             }
3089           break;
3090
3091         case SIGN_EXTEND:
3092           inner = XEXP (SET_SRC (x), 0);
3093
3094           /* We can't optimize if either mode is a partial integer
3095              mode as we don't know how many bits are significant
3096              in those modes.  */
3097           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
3098               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
3099             break;
3100
3101           pos = 0;
3102           len = GET_MODE_BITSIZE (GET_MODE (inner));
3103           unsignedp = 0;
3104           break;
3105
3106         case SIGN_EXTRACT:
3107         case ZERO_EXTRACT:
3108           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3109               && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
3110             {
3111               inner = XEXP (SET_SRC (x), 0);
3112               len = INTVAL (XEXP (SET_SRC (x), 1));
3113               pos = INTVAL (XEXP (SET_SRC (x), 2));
3114
3115               if (BITS_BIG_ENDIAN)
3116                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
3117               unsignedp = (code == ZERO_EXTRACT);
3118             }
3119           break;
3120
3121         default:
3122           break;
3123         }
3124
3125       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
3126         {
3127           enum machine_mode mode = GET_MODE (SET_SRC (x));
3128
3129           /* For unsigned, we have a choice of a shift followed by an
3130              AND or two shifts.  Use two shifts for field sizes where the
3131              constant might be too large.  We assume here that we can
3132              always at least get 8-bit constants in an AND insn, which is
3133              true for every current RISC.  */
3134
3135           if (unsignedp && len <= 8)
3136             {
3137               SUBST (SET_SRC (x),
3138                      gen_rtx_AND (mode,
3139                                   gen_rtx_LSHIFTRT
3140                                   (mode, gen_lowpart (mode, inner),
3141                                    GEN_INT (pos)),
3142                                   GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
3143
3144               split = find_split_point (&SET_SRC (x), insn);
3145               if (split && split != &SET_SRC (x))
3146                 return split;
3147             }
3148           else
3149             {
3150               SUBST (SET_SRC (x),
3151                      gen_rtx_fmt_ee
3152                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
3153                       gen_rtx_ASHIFT (mode,
3154                                       gen_lowpart (mode, inner),
3155                                       GEN_INT (GET_MODE_BITSIZE (mode)
3156                                                - len - pos)),
3157                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
3158
3159               split = find_split_point (&SET_SRC (x), insn);
3160               if (split && split != &SET_SRC (x))
3161                 return split;
3162             }
3163         }
3164
3165       /* See if this is a simple operation with a constant as the second
3166          operand.  It might be that this constant is out of range and hence
3167          could be used as a split point.  */
3168       if (BINARY_P (SET_SRC (x))
3169           && CONSTANT_P (XEXP (SET_SRC (x), 1))
3170           && (OBJECT_P (XEXP (SET_SRC (x), 0))
3171               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
3172                   && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
3173         return &XEXP (SET_SRC (x), 1);
3174
3175       /* Finally, see if this is a simple operation with its first operand
3176          not in a register.  The operation might require this operand in a
3177          register, so return it as a split point.  We can always do this
3178          because if the first operand were another operation, we would have
3179          already found it as a split point.  */
3180       if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
3181           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
3182         return &XEXP (SET_SRC (x), 0);
3183
3184       return 0;
3185
3186     case AND:
3187     case IOR:
3188       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
3189          it is better to write this as (not (ior A B)) so we can split it.
3190          Similarly for IOR.  */
3191       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
3192         {
3193           SUBST (*loc,
3194                  gen_rtx_NOT (GET_MODE (x),
3195                               gen_rtx_fmt_ee (code == IOR ? AND : IOR,
3196                                               GET_MODE (x),
3197                                               XEXP (XEXP (x, 0), 0),
3198                                               XEXP (XEXP (x, 1), 0))));
3199           return find_split_point (loc, insn);
3200         }
3201
3202       /* Many RISC machines have a large set of logical insns.  If the
3203          second operand is a NOT, put it first so we will try to split the
3204          other operand first.  */
3205       if (GET_CODE (XEXP (x, 1)) == NOT)
3206         {
3207           rtx tem = XEXP (x, 0);
3208           SUBST (XEXP (x, 0), XEXP (x, 1));
3209           SUBST (XEXP (x, 1), tem);
3210         }
3211       break;
3212
3213     default:
3214       break;
3215     }
3216
3217   /* Otherwise, select our actions depending on our rtx class.  */
3218   switch (GET_RTX_CLASS (code))
3219     {
3220     case RTX_BITFIELD_OPS:              /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
3221     case RTX_TERNARY:
3222       split = find_split_point (&XEXP (x, 2), insn);
3223       if (split)
3224         return split;
3225       /* ... fall through ...  */
3226     case RTX_BIN_ARITH:
3227     case RTX_COMM_ARITH:
3228     case RTX_COMPARE:
3229     case RTX_COMM_COMPARE:
3230       split = find_split_point (&XEXP (x, 1), insn);
3231       if (split)
3232         return split;
3233       /* ... fall through ...  */
3234     case RTX_UNARY:
3235       /* Some machines have (and (shift ...) ...) insns.  If X is not
3236          an AND, but XEXP (X, 0) is, use it as our split point.  */
3237       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
3238         return &XEXP (x, 0);
3239
3240       split = find_split_point (&XEXP (x, 0), insn);
3241       if (split)
3242         return split;
3243       return loc;
3244
3245     default:
3246       /* Otherwise, we don't have a split point.  */
3247       return 0;
3248     }
3249 }
3250 \f
3251 /* Throughout X, replace FROM with TO, and return the result.
3252    The result is TO if X is FROM;
3253    otherwise the result is X, but its contents may have been modified.
3254    If they were modified, a record was made in undobuf so that
3255    undo_all will (among other things) return X to its original state.
3256
3257    If the number of changes necessary is too much to record to undo,
3258    the excess changes are not made, so the result is invalid.
3259    The changes already made can still be undone.
3260    undobuf.num_undo is incremented for such changes, so by testing that
3261    the caller can tell whether the result is valid.
3262
3263    `n_occurrences' is incremented each time FROM is replaced.
3264
3265    IN_DEST is nonzero if we are processing the SET_DEST of a SET.
3266
3267    UNIQUE_COPY is nonzero if each substitution must be unique.  We do this
3268    by copying if `n_occurrences' is nonzero.  */
3269
3270 static rtx
3271 subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
3272 {
3273   enum rtx_code code = GET_CODE (x);
3274   enum machine_mode op0_mode = VOIDmode;
3275   const char *fmt;
3276   int len, i;
3277   rtx new;
3278
3279 /* Two expressions are equal if they are identical copies of a shared
3280    RTX or if they are both registers with the same register number
3281    and mode.  */
3282
3283 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
3284   ((X) == (Y)                                           \
3285    || (GET_CODE (X) == REG && GET_CODE (Y) == REG       \
3286        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
3287
3288   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
3289     {
3290       n_occurrences++;
3291       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
3292     }
3293
3294   /* If X and FROM are the same register but different modes, they will
3295      not have been seen as equal above.  However, flow.c will make a
3296      LOG_LINKS entry for that case.  If we do nothing, we will try to
3297      rerecognize our original insn and, when it succeeds, we will
3298      delete the feeding insn, which is incorrect.
3299
3300      So force this insn not to match in this (rare) case.  */
3301   if (! in_dest && code == REG && GET_CODE (from) == REG
3302       && REGNO (x) == REGNO (from))
3303     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
3304
3305   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
3306      of which may contain things that can be combined.  */
3307   if (code != MEM && code != LO_SUM && OBJECT_P (x))
3308     return x;
3309
3310   /* It is possible to have a subexpression appear twice in the insn.
3311      Suppose that FROM is a register that appears within TO.
3312      Then, after that subexpression has been scanned once by `subst',
3313      the second time it is scanned, TO may be found.  If we were
3314      to scan TO here, we would find FROM within it and create a
3315      self-referent rtl structure which is completely wrong.  */
3316   if (COMBINE_RTX_EQUAL_P (x, to))
3317     return to;
3318
3319   /* Parallel asm_operands need special attention because all of the
3320      inputs are shared across the arms.  Furthermore, unsharing the
3321      rtl results in recognition failures.  Failure to handle this case
3322      specially can result in circular rtl.
3323
3324      Solve this by doing a normal pass across the first entry of the
3325      parallel, and only processing the SET_DESTs of the subsequent
3326      entries.  Ug.  */
3327
3328   if (code == PARALLEL
3329       && GET_CODE (XVECEXP (x, 0, 0)) == SET
3330       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
3331     {
3332       new = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
3333
3334       /* If this substitution failed, this whole thing fails.  */
3335       if (GET_CODE (new) == CLOBBER
3336           && XEXP (new, 0) == const0_rtx)
3337         return new;
3338
3339       SUBST (XVECEXP (x, 0, 0), new);
3340
3341       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
3342         {
3343           rtx dest = SET_DEST (XVECEXP (x, 0, i));
3344
3345           if (GET_CODE (dest) != REG
3346               && GET_CODE (dest) != CC0
3347               && GET_CODE (dest) != PC)
3348             {
3349               new = subst (dest, from, to, 0, unique_copy);
3350
3351               /* If this substitution failed, this whole thing fails.  */
3352               if (GET_CODE (new) == CLOBBER
3353                   && XEXP (new, 0) == const0_rtx)
3354                 return new;
3355
3356               SUBST (SET_DEST (XVECEXP (x, 0, i)), new);
3357             }
3358         }
3359     }
3360   else
3361     {
3362       len = GET_RTX_LENGTH (code);
3363       fmt = GET_RTX_FORMAT (code);
3364
3365       /* We don't need to process a SET_DEST that is a register, CC0,
3366          or PC, so set up to skip this common case.  All other cases
3367          where we want to suppress replacing something inside a
3368          SET_SRC are handled via the IN_DEST operand.  */
3369       if (code == SET
3370           && (GET_CODE (SET_DEST (x)) == REG
3371               || GET_CODE (SET_DEST (x)) == CC0
3372               || GET_CODE (SET_DEST (x)) == PC))
3373         fmt = "ie";
3374
3375       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
3376          constant.  */
3377       if (fmt[0] == 'e')
3378         op0_mode = GET_MODE (XEXP (x, 0));
3379
3380       for (i = 0; i < len; i++)
3381         {
3382           if (fmt[i] == 'E')
3383             {
3384               int j;
3385               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3386                 {
3387                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
3388                     {
3389                       new = (unique_copy && n_occurrences
3390                              ? copy_rtx (to) : to);
3391                       n_occurrences++;
3392                     }
3393                   else
3394                     {
3395                       new = subst (XVECEXP (x, i, j), from, to, 0,
3396                                    unique_copy);
3397
3398                       /* If this substitution failed, this whole thing
3399                          fails.  */
3400                       if (GET_CODE (new) == CLOBBER
3401                           && XEXP (new, 0) == const0_rtx)
3402                         return new;
3403                     }
3404
3405                   SUBST (XVECEXP (x, i, j), new);
3406                 }
3407             }
3408           else if (fmt[i] == 'e')
3409             {
3410               /* If this is a register being set, ignore it.  */
3411               new = XEXP (x, i);
3412               if (in_dest
3413                   && (code == SUBREG || code == STRICT_LOW_PART
3414                       || code == ZERO_EXTRACT)
3415                   && i == 0
3416                   && GET_CODE (new) == REG)
3417                 ;
3418
3419               else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
3420                 {
3421                   /* In general, don't install a subreg involving two
3422                      modes not tieable.  It can worsen register
3423                      allocation, and can even make invalid reload
3424                      insns, since the reg inside may need to be copied
3425                      from in the outside mode, and that may be invalid
3426                      if it is an fp reg copied in integer mode.
3427
3428                      We allow two exceptions to this: It is valid if
3429                      it is inside another SUBREG and the mode of that
3430                      SUBREG and the mode of the inside of TO is
3431                      tieable and it is valid if X is a SET that copies
3432                      FROM to CC0.  */
3433
3434                   if (GET_CODE (to) == SUBREG
3435                       && ! MODES_TIEABLE_P (GET_MODE (to),
3436                                             GET_MODE (SUBREG_REG (to)))
3437                       && ! (code == SUBREG
3438                             && MODES_TIEABLE_P (GET_MODE (x),
3439                                                 GET_MODE (SUBREG_REG (to))))
3440 #ifdef HAVE_cc0
3441                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
3442 #endif
3443                       )
3444                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3445
3446 #ifdef CANNOT_CHANGE_MODE_CLASS
3447                   if (code == SUBREG
3448                       && GET_CODE (to) == REG
3449                       && REGNO (to) < FIRST_PSEUDO_REGISTER
3450                       && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
3451                                                    GET_MODE (to),
3452                                                    GET_MODE (x)))
3453                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3454 #endif
3455
3456                   new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
3457                   n_occurrences++;
3458                 }
3459               else
3460                 /* If we are in a SET_DEST, suppress most cases unless we
3461                    have gone inside a MEM, in which case we want to
3462                    simplify the address.  We assume here that things that
3463                    are actually part of the destination have their inner
3464                    parts in the first expression.  This is true for SUBREG,
3465                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
3466                    things aside from REG and MEM that should appear in a
3467                    SET_DEST.  */
3468                 new = subst (XEXP (x, i), from, to,
3469                              (((in_dest
3470                                 && (code == SUBREG || code == STRICT_LOW_PART
3471                                     || code == ZERO_EXTRACT))
3472                                || code == SET)
3473                               && i == 0), unique_copy);
3474
3475               /* If we found that we will have to reject this combination,
3476                  indicate that by returning the CLOBBER ourselves, rather than
3477                  an expression containing it.  This will speed things up as
3478                  well as prevent accidents where two CLOBBERs are considered
3479                  to be equal, thus producing an incorrect simplification.  */
3480
3481               if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
3482                 return new;
3483
3484               if (GET_CODE (x) == SUBREG
3485                   && (GET_CODE (new) == CONST_INT
3486                       || GET_CODE (new) == CONST_DOUBLE))
3487                 {
3488                   enum machine_mode mode = GET_MODE (x);
3489
3490                   x = simplify_subreg (GET_MODE (x), new,
3491                                        GET_MODE (SUBREG_REG (x)),
3492                                        SUBREG_BYTE (x));
3493                   if (! x)
3494                     x = gen_rtx_CLOBBER (mode, const0_rtx);
3495                 }
3496               else if (GET_CODE (new) == CONST_INT
3497                        && GET_CODE (x) == ZERO_EXTEND)
3498                 {
3499                   x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
3500                                                 new, GET_MODE (XEXP (x, 0)));
3501                   if (! x)
3502                     abort ();
3503                 }
3504               else
3505                 SUBST (XEXP (x, i), new);
3506             }
3507         }
3508     }
3509
3510   /* Try to simplify X.  If the simplification changed the code, it is likely
3511      that further simplification will help, so loop, but limit the number
3512      of repetitions that will be performed.  */
3513
3514   for (i = 0; i < 4; i++)
3515     {
3516       /* If X is sufficiently simple, don't bother trying to do anything
3517          with it.  */
3518       if (code != CONST_INT && code != REG && code != CLOBBER)
3519         x = combine_simplify_rtx (x, op0_mode, in_dest);
3520
3521       if (GET_CODE (x) == code)
3522         break;
3523
3524       code = GET_CODE (x);
3525
3526       /* We no longer know the original mode of operand 0 since we
3527          have changed the form of X)  */
3528       op0_mode = VOIDmode;
3529     }
3530
3531   return x;
3532 }
3533 \f
3534 /* Simplify X, a piece of RTL.  We just operate on the expression at the
3535    outer level; call `subst' to simplify recursively.  Return the new
3536    expression.
3537
3538    OP0_MODE is the original mode of XEXP (x, 0).  IN_DEST is nonzero
3539    if we are inside a SET_DEST.  */
3540
3541 static rtx
3542 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
3543 {
3544   enum rtx_code code = GET_CODE (x);
3545   enum machine_mode mode = GET_MODE (x);
3546   rtx temp;
3547   rtx reversed;
3548   int i;
3549
3550   /* If this is a commutative operation, put a constant last and a complex
3551      expression first.  We don't need to do this for comparisons here.  */
3552   if (COMMUTATIVE_ARITH_P (x)
3553       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
3554     {
3555       temp = XEXP (x, 0);
3556       SUBST (XEXP (x, 0), XEXP (x, 1));
3557       SUBST (XEXP (x, 1), temp);
3558     }
3559
3560   /* If this is a PLUS, MINUS, or MULT, and the first operand is the
3561      sign extension of a PLUS with a constant, reverse the order of the sign
3562      extension and the addition. Note that this not the same as the original
3563      code, but overflow is undefined for signed values.  Also note that the
3564      PLUS will have been partially moved "inside" the sign-extension, so that
3565      the first operand of X will really look like:
3566          (ashiftrt (plus (ashift A C4) C5) C4).
3567      We convert this to
3568          (plus (ashiftrt (ashift A C4) C2) C4)
3569      and replace the first operand of X with that expression.  Later parts
3570      of this function may simplify the expression further.
3571
3572      For example, if we start with (mult (sign_extend (plus A C1)) C2),
3573      we swap the SIGN_EXTEND and PLUS.  Later code will apply the
3574      distributive law to produce (plus (mult (sign_extend X) C1) C3).
3575
3576      We do this to simplify address expressions.  */
3577
3578   if ((code == PLUS || code == MINUS || code == MULT)
3579       && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3580       && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
3581       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT
3582       && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT
3583       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3584       && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1)
3585       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
3586       && (temp = simplify_binary_operation (ASHIFTRT, mode,
3587                                             XEXP (XEXP (XEXP (x, 0), 0), 1),
3588                                             XEXP (XEXP (x, 0), 1))) != 0)
3589     {
3590       rtx new
3591         = simplify_shift_const (NULL_RTX, ASHIFT, mode,
3592                                 XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0),
3593                                 INTVAL (XEXP (XEXP (x, 0), 1)));
3594
3595       new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
3596                                   INTVAL (XEXP (XEXP (x, 0), 1)));
3597
3598       SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
3599     }
3600
3601   /* If this is a simple operation applied to an IF_THEN_ELSE, try
3602      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
3603      things.  Check for cases where both arms are testing the same
3604      condition.
3605
3606      Don't do anything if all operands are very simple.  */
3607
3608   if ((BINARY_P (x)
3609        && ((!OBJECT_P (XEXP (x, 0))
3610             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3611                   && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
3612            || (!OBJECT_P (XEXP (x, 1))
3613                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
3614                      && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
3615       || (UNARY_P (x)
3616           && (!OBJECT_P (XEXP (x, 0))
3617                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3618                      && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
3619     {
3620       rtx cond, true_rtx, false_rtx;
3621
3622       cond = if_then_else_cond (x, &true_rtx, &false_rtx);
3623       if (cond != 0
3624           /* If everything is a comparison, what we have is highly unlikely
3625              to be simpler, so don't use it.  */
3626           && ! (COMPARISON_P (x)
3627                 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
3628         {
3629           rtx cop1 = const0_rtx;
3630           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
3631
3632           if (cond_code == NE && COMPARISON_P (cond))
3633             return x;
3634
3635           /* Simplify the alternative arms; this may collapse the true and
3636              false arms to store-flag values.  Be careful to use copy_rtx
3637              here since true_rtx or false_rtx might share RTL with x as a
3638              result of the if_then_else_cond call above.  */
3639           true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0);
3640           false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0);
3641
3642           /* If true_rtx and false_rtx are not general_operands, an if_then_else
3643              is unlikely to be simpler.  */
3644           if (general_operand (true_rtx, VOIDmode)
3645               && general_operand (false_rtx, VOIDmode))
3646             {
3647               enum rtx_code reversed;
3648
3649               /* Restarting if we generate a store-flag expression will cause
3650                  us to loop.  Just drop through in this case.  */
3651
3652               /* If the result values are STORE_FLAG_VALUE and zero, we can
3653                  just make the comparison operation.  */
3654               if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
3655                 x = gen_binary (cond_code, mode, cond, cop1);
3656               else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
3657                        && ((reversed = reversed_comparison_code_parts
3658                                         (cond_code, cond, cop1, NULL))
3659                            != UNKNOWN))
3660                 x = gen_binary (reversed, mode, cond, cop1);
3661
3662               /* Likewise, we can make the negate of a comparison operation
3663                  if the result values are - STORE_FLAG_VALUE and zero.  */
3664               else if (GET_CODE (true_rtx) == CONST_INT
3665                        && INTVAL (true_rtx) == - STORE_FLAG_VALUE
3666                        && false_rtx == const0_rtx)
3667                 x = simplify_gen_unary (NEG, mode,
3668                                         gen_binary (cond_code, mode, cond,
3669                                                     cop1),
3670                                         mode);
3671               else if (GET_CODE (false_rtx) == CONST_INT
3672                        && INTVAL (false_rtx) == - STORE_FLAG_VALUE
3673                        && true_rtx == const0_rtx
3674                        && ((reversed = reversed_comparison_code_parts
3675                                         (cond_code, cond, cop1, NULL))
3676                            != UNKNOWN))
3677                 x = simplify_gen_unary (NEG, mode,
3678                                         gen_binary (reversed, mode,
3679                                                     cond, cop1),
3680                                         mode);
3681               else
3682                 return gen_rtx_IF_THEN_ELSE (mode,
3683                                              gen_binary (cond_code, VOIDmode,
3684                                                          cond, cop1),
3685                                              true_rtx, false_rtx);
3686
3687               code = GET_CODE (x);
3688               op0_mode = VOIDmode;
3689             }
3690         }
3691     }
3692
3693   /* Try to fold this expression in case we have constants that weren't
3694      present before.  */
3695   temp = 0;
3696   switch (GET_RTX_CLASS (code))
3697     {
3698     case RTX_UNARY:
3699       if (op0_mode == VOIDmode)
3700         op0_mode = GET_MODE (XEXP (x, 0));
3701       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
3702       break;
3703     case RTX_COMPARE:
3704     case RTX_COMM_COMPARE:
3705       {
3706         enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
3707         if (cmp_mode == VOIDmode)
3708           {
3709             cmp_mode = GET_MODE (XEXP (x, 1));
3710             if (cmp_mode == VOIDmode)
3711               cmp_mode = op0_mode;
3712           }
3713         temp = simplify_relational_operation (code, mode, cmp_mode,
3714                                               XEXP (x, 0), XEXP (x, 1));
3715       }
3716       break;
3717     case RTX_COMM_ARITH:
3718     case RTX_BIN_ARITH:
3719       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
3720       break;
3721     case RTX_BITFIELD_OPS:
3722     case RTX_TERNARY:
3723       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
3724                                          XEXP (x, 1), XEXP (x, 2));
3725       break;
3726     default:
3727       break;
3728     }
3729
3730   if (temp)
3731     {
3732       x = temp;
3733       code = GET_CODE (temp);
3734       op0_mode = VOIDmode;
3735       mode = GET_MODE (temp);
3736     }
3737
3738   /* First see if we can apply the inverse distributive law.  */
3739   if (code == PLUS || code == MINUS
3740       || code == AND || code == IOR || code == XOR)
3741     {
3742       x = apply_distributive_law (x);
3743       code = GET_CODE (x);
3744       op0_mode = VOIDmode;
3745     }
3746
3747   /* If CODE is an associative operation not otherwise handled, see if we
3748      can associate some operands.  This can win if they are constants or
3749      if they are logically related (i.e. (a & b) & a).  */
3750   if ((code == PLUS || code == MINUS || code == MULT || code == DIV
3751        || code == AND || code == IOR || code == XOR
3752        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
3753       && ((INTEGRAL_MODE_P (mode) && code != DIV)
3754           || (flag_unsafe_math_optimizations && FLOAT_MODE_P (mode))))
3755     {
3756       if (GET_CODE (XEXP (x, 0)) == code)
3757         {
3758           rtx other = XEXP (XEXP (x, 0), 0);
3759           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
3760           rtx inner_op1 = XEXP (x, 1);
3761           rtx inner;
3762
3763           /* Make sure we pass the constant operand if any as the second
3764              one if this is a commutative operation.  */
3765           if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
3766             {
3767               rtx tem = inner_op0;
3768               inner_op0 = inner_op1;
3769               inner_op1 = tem;
3770             }
3771           inner = simplify_binary_operation (code == MINUS ? PLUS
3772                                              : code == DIV ? MULT
3773                                              : code,
3774                                              mode, inner_op0, inner_op1);
3775
3776           /* For commutative operations, try the other pair if that one
3777              didn't simplify.  */
3778           if (inner == 0 && COMMUTATIVE_ARITH_P (x))
3779             {
3780               other = XEXP (XEXP (x, 0), 1);
3781               inner = simplify_binary_operation (code, mode,
3782                                                  XEXP (XEXP (x, 0), 0),
3783                                                  XEXP (x, 1));
3784             }
3785
3786           if (inner)
3787             return gen_binary (code, mode, other, inner);
3788         }
3789     }
3790
3791   /* A little bit of algebraic simplification here.  */
3792   switch (code)
3793     {
3794     case MEM:
3795       /* Ensure that our address has any ASHIFTs converted to MULT in case
3796          address-recognizing predicates are called later.  */
3797       temp = make_compound_operation (XEXP (x, 0), MEM);
3798       SUBST (XEXP (x, 0), temp);
3799       break;
3800
3801     case SUBREG:
3802       if (op0_mode == VOIDmode)
3803         op0_mode = GET_MODE (SUBREG_REG (x));
3804
3805       /* See if this can be moved to simplify_subreg.  */
3806       if (CONSTANT_P (SUBREG_REG (x))
3807           && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
3808              /* Don't call gen_lowpart if the inner mode
3809                 is VOIDmode and we cannot simplify it, as SUBREG without
3810                 inner mode is invalid.  */
3811           && (GET_MODE (SUBREG_REG (x)) != VOIDmode
3812               || gen_lowpart_common (mode, SUBREG_REG (x))))
3813         return gen_lowpart (mode, SUBREG_REG (x));
3814
3815       if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
3816         break;
3817       {
3818         rtx temp;
3819         temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
3820                                 SUBREG_BYTE (x));
3821         if (temp)
3822           return temp;
3823       }
3824
3825       /* Don't change the mode of the MEM if that would change the meaning
3826          of the address.  */
3827       if (GET_CODE (SUBREG_REG (x)) == MEM
3828           && (MEM_VOLATILE_P (SUBREG_REG (x))
3829               || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
3830         return gen_rtx_CLOBBER (mode, const0_rtx);
3831
3832       /* Note that we cannot do any narrowing for non-constants since
3833          we might have been counting on using the fact that some bits were
3834          zero.  We now do this in the SET.  */
3835
3836       break;
3837
3838     case NOT:
3839       if (GET_CODE (XEXP (x, 0)) == SUBREG
3840           && subreg_lowpart_p (XEXP (x, 0))
3841           && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
3842               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
3843           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
3844           && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
3845         {
3846           enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
3847
3848           x = gen_rtx_ROTATE (inner_mode,
3849                               simplify_gen_unary (NOT, inner_mode, const1_rtx,
3850                                                   inner_mode),
3851                               XEXP (SUBREG_REG (XEXP (x, 0)), 1));
3852           return gen_lowpart (mode, x);
3853         }
3854
3855       /* Apply De Morgan's laws to reduce number of patterns for machines
3856          with negating logical insns (and-not, nand, etc.).  If result has
3857          only one NOT, put it first, since that is how the patterns are
3858          coded.  */
3859
3860       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
3861         {
3862           rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
3863           enum machine_mode op_mode;
3864
3865           op_mode = GET_MODE (in1);
3866           in1 = simplify_gen_unary (NOT, op_mode, in1, op_mode);
3867
3868           op_mode = GET_MODE (in2);
3869           if (op_mode == VOIDmode)
3870             op_mode = mode;
3871           in2 = simplify_gen_unary (NOT, op_mode, in2, op_mode);
3872
3873           if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
3874             {
3875               rtx tem = in2;
3876               in2 = in1; in1 = tem;
3877             }
3878
3879           return gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
3880                                  mode, in1, in2);
3881         }
3882       break;
3883
3884     case NEG:
3885       /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1.  */
3886       if (GET_CODE (XEXP (x, 0)) == XOR
3887           && XEXP (XEXP (x, 0), 1) == const1_rtx
3888           && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
3889         return gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
3890
3891       temp = expand_compound_operation (XEXP (x, 0));
3892
3893       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
3894          replaced by (lshiftrt X C).  This will convert
3895          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
3896
3897       if (GET_CODE (temp) == ASHIFTRT
3898           && GET_CODE (XEXP (temp, 1)) == CONST_INT
3899           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
3900         return simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
3901                                      INTVAL (XEXP (temp, 1)));
3902
3903       /* If X has only a single bit that might be nonzero, say, bit I, convert
3904          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
3905          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
3906          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
3907          or a SUBREG of one since we'd be making the expression more
3908          complex if it was just a register.  */
3909
3910       if (GET_CODE (temp) != REG
3911           && ! (GET_CODE (temp) == SUBREG
3912                 && GET_CODE (SUBREG_REG (temp)) == REG)
3913           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
3914         {
3915           rtx temp1 = simplify_shift_const
3916             (NULL_RTX, ASHIFTRT, mode,
3917              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
3918                                    GET_MODE_BITSIZE (mode) - 1 - i),
3919              GET_MODE_BITSIZE (mode) - 1 - i);
3920
3921           /* If all we did was surround TEMP with the two shifts, we
3922              haven't improved anything, so don't use it.  Otherwise,
3923              we are better off with TEMP1.  */
3924           if (GET_CODE (temp1) != ASHIFTRT
3925               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
3926               || XEXP (XEXP (temp1, 0), 0) != temp)
3927             return temp1;
3928         }
3929       break;
3930
3931     case TRUNCATE:
3932       /* We can't handle truncation to a partial integer mode here
3933          because we don't know the real bitsize of the partial
3934          integer mode.  */
3935       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
3936         break;
3937
3938       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3939           && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
3940                                     GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
3941         SUBST (XEXP (x, 0),
3942                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
3943                               GET_MODE_MASK (mode), NULL_RTX, 0));
3944
3945       /* (truncate:SI ({sign,zero}_extend:DI foo:SI)) == foo:SI.  */
3946       if ((GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
3947            || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
3948           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
3949         return XEXP (XEXP (x, 0), 0);
3950
3951       /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
3952          (OP:SI foo:SI) if OP is NEG or ABS.  */
3953       if ((GET_CODE (XEXP (x, 0)) == ABS
3954            || GET_CODE (XEXP (x, 0)) == NEG)
3955           && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SIGN_EXTEND
3956               || GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND)
3957           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
3958         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
3959                                    XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
3960
3961       /* (truncate:SI (subreg:DI (truncate:SI X) 0)) is
3962          (truncate:SI x).  */
3963       if (GET_CODE (XEXP (x, 0)) == SUBREG
3964           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == TRUNCATE
3965           && subreg_lowpart_p (XEXP (x, 0)))
3966         return SUBREG_REG (XEXP (x, 0));
3967
3968       /* If we know that the value is already truncated, we can
3969          replace the TRUNCATE with a SUBREG if TRULY_NOOP_TRUNCATION
3970          is nonzero for the corresponding modes.  But don't do this
3971          for an (LSHIFTRT (MULT ...)) since this will cause problems
3972          with the umulXi3_highpart patterns.  */
3973       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
3974                                  GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
3975           && num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
3976              >= (unsigned int) (GET_MODE_BITSIZE (mode) + 1)
3977           && ! (GET_CODE (XEXP (x, 0)) == LSHIFTRT
3978                 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT))
3979         return gen_lowpart (mode, XEXP (x, 0));
3980
3981       /* A truncate of a comparison can be replaced with a subreg if
3982          STORE_FLAG_VALUE permits.  This is like the previous test,
3983          but it works even if the comparison is done in a mode larger
3984          than HOST_BITS_PER_WIDE_INT.  */
3985       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3986           && COMPARISON_P (XEXP (x, 0))
3987           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0)
3988         return gen_lowpart (mode, XEXP (x, 0));
3989
3990       /* Similarly, a truncate of a register whose value is a
3991          comparison can be replaced with a subreg if STORE_FLAG_VALUE
3992          permits.  */
3993       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3994           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
3995           && (temp = get_last_value (XEXP (x, 0)))
3996           && COMPARISON_P (temp))
3997         return gen_lowpart (mode, XEXP (x, 0));
3998
3999       break;
4000
4001     case FLOAT_TRUNCATE:
4002       /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF.  */
4003       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4004           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
4005         return XEXP (XEXP (x, 0), 0);
4006
4007       /* (float_truncate:SF (float_truncate:DF foo:XF))
4008          = (float_truncate:SF foo:XF).
4009          This may eliminate double rounding, so it is unsafe.
4010
4011          (float_truncate:SF (float_extend:XF foo:DF))
4012          = (float_truncate:SF foo:DF).
4013
4014          (float_truncate:DF (float_extend:XF foo:SF))
4015          = (float_extend:SF foo:DF).  */
4016       if ((GET_CODE (XEXP (x, 0)) == FLOAT_TRUNCATE
4017            && flag_unsafe_math_optimizations)
4018           || GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND)
4019         return simplify_gen_unary (GET_MODE_SIZE (GET_MODE (XEXP (XEXP (x, 0),
4020                                                             0)))
4021                                    > GET_MODE_SIZE (mode)
4022                                    ? FLOAT_TRUNCATE : FLOAT_EXTEND,
4023                                    mode,
4024                                    XEXP (XEXP (x, 0), 0), mode);
4025
4026       /*  (float_truncate (float x)) is (float x)  */
4027       if (GET_CODE (XEXP (x, 0)) == FLOAT
4028           && (flag_unsafe_math_optimizations
4029               || ((unsigned)significand_size (GET_MODE (XEXP (x, 0)))
4030                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
4031                       - num_sign_bit_copies (XEXP (XEXP (x, 0), 0),
4032                                              GET_MODE (XEXP (XEXP (x, 0), 0)))))))
4033         return simplify_gen_unary (FLOAT, mode,
4034                                    XEXP (XEXP (x, 0), 0),
4035                                    GET_MODE (XEXP (XEXP (x, 0), 0)));
4036
4037       /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
4038          (OP:SF foo:SF) if OP is NEG or ABS.  */
4039       if ((GET_CODE (XEXP (x, 0)) == ABS
4040            || GET_CODE (XEXP (x, 0)) == NEG)
4041           && GET_CODE (XEXP (XEXP (x, 0), 0)) == FLOAT_EXTEND
4042           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
4043         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4044                                    XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
4045
4046       /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
4047          is (float_truncate:SF x).  */
4048       if (GET_CODE (XEXP (x, 0)) == SUBREG
4049           && subreg_lowpart_p (XEXP (x, 0))
4050           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE)
4051         return SUBREG_REG (XEXP (x, 0));
4052       break;
4053     case FLOAT_EXTEND:
4054       /*  (float_extend (float_extend x)) is (float_extend x)
4055
4056           (float_extend (float x)) is (float x) assuming that double
4057           rounding can't happen.
4058           */
4059       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4060           || (GET_CODE (XEXP (x, 0)) == FLOAT
4061               && ((unsigned)significand_size (GET_MODE (XEXP (x, 0)))
4062                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
4063                       - num_sign_bit_copies (XEXP (XEXP (x, 0), 0),
4064                                              GET_MODE (XEXP (XEXP (x, 0), 0)))))))
4065         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4066                                    XEXP (XEXP (x, 0), 0),
4067                                    GET_MODE (XEXP (XEXP (x, 0), 0)));
4068
4069       break;
4070 #ifdef HAVE_cc0
4071     case COMPARE:
4072       /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
4073          using cc0, in which case we want to leave it as a COMPARE
4074          so we can distinguish it from a register-register-copy.  */
4075       if (XEXP (x, 1) == const0_rtx)
4076         return XEXP (x, 0);
4077
4078       /* x - 0 is the same as x unless x's mode has signed zeros and
4079          allows rounding towards -infinity.  Under those conditions,
4080          0 - 0 is -0.  */
4081       if (!(HONOR_SIGNED_ZEROS (GET_MODE (XEXP (x, 0)))
4082             && HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (XEXP (x, 0))))
4083           && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
4084         return XEXP (x, 0);
4085       break;
4086 #endif
4087
4088     case CONST:
4089       /* (const (const X)) can become (const X).  Do it this way rather than
4090          returning the inner CONST since CONST can be shared with a
4091          REG_EQUAL note.  */
4092       if (GET_CODE (XEXP (x, 0)) == CONST)
4093         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4094       break;
4095
4096 #ifdef HAVE_lo_sum
4097     case LO_SUM:
4098       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
4099          can add in an offset.  find_split_point will split this address up
4100          again if it doesn't match.  */
4101       if (GET_CODE (XEXP (x, 0)) == HIGH
4102           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
4103         return XEXP (x, 1);
4104       break;
4105 #endif
4106
4107     case PLUS:
4108       /* Canonicalize (plus (mult (neg B) C) A) to (minus A (mult B C)).
4109        */
4110       if (GET_CODE (XEXP (x, 0)) == MULT
4111           && GET_CODE (XEXP (XEXP (x, 0), 0)) == NEG)
4112         {
4113           rtx in1, in2;
4114
4115           in1 = XEXP (XEXP (XEXP (x, 0), 0), 0);
4116           in2 = XEXP (XEXP (x, 0), 1);
4117           return gen_binary (MINUS, mode, XEXP (x, 1),
4118                              gen_binary (MULT, mode, in1, in2));
4119         }
4120
4121       /* If we have (plus (plus (A const) B)), associate it so that CONST is
4122          outermost.  That's because that's the way indexed addresses are
4123          supposed to appear.  This code used to check many more cases, but
4124          they are now checked elsewhere.  */
4125       if (GET_CODE (XEXP (x, 0)) == PLUS
4126           && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
4127         return gen_binary (PLUS, mode,
4128                            gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
4129                                        XEXP (x, 1)),
4130                            XEXP (XEXP (x, 0), 1));
4131
4132       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
4133          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
4134          bit-field and can be replaced by either a sign_extend or a
4135          sign_extract.  The `and' may be a zero_extend and the two
4136          <c>, -<c> constants may be reversed.  */
4137       if (GET_CODE (XEXP (x, 0)) == XOR
4138           && GET_CODE (XEXP (x, 1)) == CONST_INT
4139           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4140           && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
4141           && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
4142               || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
4143           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4144           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
4145                && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4146                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
4147                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
4148               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
4149                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
4150                       == (unsigned int) i + 1))))
4151         return simplify_shift_const
4152           (NULL_RTX, ASHIFTRT, mode,
4153            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4154                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
4155                                  GET_MODE_BITSIZE (mode) - (i + 1)),
4156            GET_MODE_BITSIZE (mode) - (i + 1));
4157
4158       /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
4159          C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
4160          is 1.  This produces better code than the alternative immediately
4161          below.  */
4162       if (COMPARISON_P (XEXP (x, 0))
4163           && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx)
4164               || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx))
4165           && (reversed = reversed_comparison (XEXP (x, 0), mode,
4166                                               XEXP (XEXP (x, 0), 0),
4167                                               XEXP (XEXP (x, 0), 1))))
4168         return
4169           simplify_gen_unary (NEG, mode, reversed, mode);
4170
4171       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
4172          can become (ashiftrt (ashift (xor x 1) C) C) where C is
4173          the bitsize of the mode - 1.  This allows simplification of
4174          "a = (b & 8) == 0;"  */
4175       if (XEXP (x, 1) == constm1_rtx
4176           && GET_CODE (XEXP (x, 0)) != REG
4177           && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4178                 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)
4179           && nonzero_bits (XEXP (x, 0), mode) == 1)
4180         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
4181            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4182                                  gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
4183                                  GET_MODE_BITSIZE (mode) - 1),
4184            GET_MODE_BITSIZE (mode) - 1);
4185
4186       /* If we are adding two things that have no bits in common, convert
4187          the addition into an IOR.  This will often be further simplified,
4188          for example in cases like ((a & 1) + (a & 2)), which can
4189          become a & 3.  */
4190
4191       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4192           && (nonzero_bits (XEXP (x, 0), mode)
4193               & nonzero_bits (XEXP (x, 1), mode)) == 0)
4194         {
4195           /* Try to simplify the expression further.  */
4196           rtx tor = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
4197           temp = combine_simplify_rtx (tor, mode, in_dest);
4198
4199           /* If we could, great.  If not, do not go ahead with the IOR
4200              replacement, since PLUS appears in many special purpose
4201              address arithmetic instructions.  */
4202           if (GET_CODE (temp) != CLOBBER && temp != tor)
4203             return temp;
4204         }
4205       break;
4206
4207     case MINUS:
4208       /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
4209          by reversing the comparison code if valid.  */
4210       if (STORE_FLAG_VALUE == 1
4211           && XEXP (x, 0) == const1_rtx
4212           && COMPARISON_P (XEXP (x, 1))
4213           && (reversed = reversed_comparison (XEXP (x, 1), mode,
4214                                               XEXP (XEXP (x, 1), 0),
4215                                               XEXP (XEXP (x, 1), 1))))
4216         return reversed;
4217
4218       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
4219          (and <foo> (const_int pow2-1))  */
4220       if (GET_CODE (XEXP (x, 1)) == AND
4221           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
4222           && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
4223           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
4224         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
4225                                        -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
4226
4227       /* Canonicalize (minus A (mult (neg B) C)) to (plus (mult B C) A).
4228        */
4229       if (GET_CODE (XEXP (x, 1)) == MULT
4230           && GET_CODE (XEXP (XEXP (x, 1), 0)) == NEG)
4231         {
4232           rtx in1, in2;
4233
4234           in1 = XEXP (XEXP (XEXP (x, 1), 0), 0);
4235           in2 = XEXP (XEXP (x, 1), 1);
4236           return gen_binary (PLUS, mode, gen_binary (MULT, mode, in1, in2),
4237                              XEXP (x, 0));
4238         }
4239
4240       /* Canonicalize (minus (neg A) (mult B C)) to
4241          (minus (mult (neg B) C) A).  */
4242       if (GET_CODE (XEXP (x, 1)) == MULT
4243           && GET_CODE (XEXP (x, 0)) == NEG)
4244         {
4245           rtx in1, in2;
4246
4247           in1 = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 1), 0), mode);
4248           in2 = XEXP (XEXP (x, 1), 1);
4249           return gen_binary (MINUS, mode, gen_binary (MULT, mode, in1, in2),
4250                              XEXP (XEXP (x, 0), 0));
4251         }
4252
4253       /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
4254          integers.  */
4255       if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
4256         return gen_binary (MINUS, mode,
4257                            gen_binary (MINUS, mode, XEXP (x, 0),
4258                                        XEXP (XEXP (x, 1), 0)),
4259                            XEXP (XEXP (x, 1), 1));
4260       break;
4261
4262     case MULT:
4263       /* If we have (mult (plus A B) C), apply the distributive law and then
4264          the inverse distributive law to see if things simplify.  This
4265          occurs mostly in addresses, often when unrolling loops.  */
4266
4267       if (GET_CODE (XEXP (x, 0)) == PLUS)
4268         {
4269           x = apply_distributive_law
4270             (gen_binary (PLUS, mode,
4271                          gen_binary (MULT, mode,
4272                                      XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
4273                          gen_binary (MULT, mode,
4274                                      XEXP (XEXP (x, 0), 1),
4275                                      copy_rtx (XEXP (x, 1)))));
4276
4277           if (GET_CODE (x) != MULT)
4278             return x;
4279         }
4280       /* Try simplify a*(b/c) as (a*b)/c.  */
4281       if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
4282           && GET_CODE (XEXP (x, 0)) == DIV)
4283         {
4284           rtx tem = simplify_binary_operation (MULT, mode,
4285                                                XEXP (XEXP (x, 0), 0),
4286                                                XEXP (x, 1));
4287           if (tem)
4288             return gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
4289         }
4290       break;
4291
4292     case UDIV:
4293       /* If this is a divide by a power of two, treat it as a shift if
4294          its first operand is a shift.  */
4295       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4296           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
4297           && (GET_CODE (XEXP (x, 0)) == ASHIFT
4298               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
4299               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
4300               || GET_CODE (XEXP (x, 0)) == ROTATE
4301               || GET_CODE (XEXP (x, 0)) == ROTATERT))
4302         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
4303       break;
4304
4305     case EQ:  case NE:
4306     case GT:  case GTU:  case GE:  case GEU:
4307     case LT:  case LTU:  case LE:  case LEU:
4308     case UNEQ:  case LTGT:
4309     case UNGT:  case UNGE:
4310     case UNLT:  case UNLE:
4311     case UNORDERED: case ORDERED:
4312       /* If the first operand is a condition code, we can't do anything
4313          with it.  */
4314       if (GET_CODE (XEXP (x, 0)) == COMPARE
4315           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
4316               && ! CC0_P (XEXP (x, 0))))
4317         {
4318           rtx op0 = XEXP (x, 0);
4319           rtx op1 = XEXP (x, 1);
4320           enum rtx_code new_code;
4321
4322           if (GET_CODE (op0) == COMPARE)
4323             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4324
4325           /* Simplify our comparison, if possible.  */
4326           new_code = simplify_comparison (code, &op0, &op1);
4327
4328           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
4329              if only the low-order bit is possibly nonzero in X (such as when
4330              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
4331              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
4332              known to be either 0 or -1, NE becomes a NEG and EQ becomes
4333              (plus X 1).
4334
4335              Remove any ZERO_EXTRACT we made when thinking this was a
4336              comparison.  It may now be simpler to use, e.g., an AND.  If a
4337              ZERO_EXTRACT is indeed appropriate, it will be placed back by
4338              the call to make_compound_operation in the SET case.  */
4339
4340           if (STORE_FLAG_VALUE == 1
4341               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4342               && op1 == const0_rtx
4343               && mode == GET_MODE (op0)
4344               && nonzero_bits (op0, mode) == 1)
4345             return gen_lowpart (mode,
4346                                 expand_compound_operation (op0));
4347
4348           else if (STORE_FLAG_VALUE == 1
4349                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4350                    && op1 == const0_rtx
4351                    && mode == GET_MODE (op0)
4352                    && (num_sign_bit_copies (op0, mode)
4353                        == GET_MODE_BITSIZE (mode)))
4354             {
4355               op0 = expand_compound_operation (op0);
4356               return simplify_gen_unary (NEG, mode,
4357                                          gen_lowpart (mode, op0),
4358                                          mode);
4359             }
4360
4361           else if (STORE_FLAG_VALUE == 1
4362                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4363                    && op1 == const0_rtx
4364                    && mode == GET_MODE (op0)
4365                    && nonzero_bits (op0, mode) == 1)
4366             {
4367               op0 = expand_compound_operation (op0);
4368               return gen_binary (XOR, mode,
4369                                  gen_lowpart (mode, op0),
4370                                  const1_rtx);
4371             }
4372
4373           else if (STORE_FLAG_VALUE == 1
4374                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4375                    && op1 == const0_rtx
4376                    && mode == GET_MODE (op0)
4377                    && (num_sign_bit_copies (op0, mode)
4378                        == GET_MODE_BITSIZE (mode)))
4379             {
4380               op0 = expand_compound_operation (op0);
4381               return plus_constant (gen_lowpart (mode, op0), 1);
4382             }
4383
4384           /* If STORE_FLAG_VALUE is -1, we have cases similar to
4385              those above.  */
4386           if (STORE_FLAG_VALUE == -1
4387               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4388               && op1 == const0_rtx
4389               && (num_sign_bit_copies (op0, mode)
4390                   == GET_MODE_BITSIZE (mode)))
4391             return gen_lowpart (mode,
4392                                 expand_compound_operation (op0));
4393
4394           else if (STORE_FLAG_VALUE == -1
4395                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4396                    && op1 == const0_rtx
4397                    && mode == GET_MODE (op0)
4398                    && nonzero_bits (op0, mode) == 1)
4399             {
4400               op0 = expand_compound_operation (op0);
4401               return simplify_gen_unary (NEG, mode,
4402                                          gen_lowpart (mode, op0),
4403                                          mode);
4404             }
4405
4406           else if (STORE_FLAG_VALUE == -1
4407                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4408                    && op1 == const0_rtx
4409                    && mode == GET_MODE (op0)
4410                    && (num_sign_bit_copies (op0, mode)
4411                        == GET_MODE_BITSIZE (mode)))
4412             {
4413               op0 = expand_compound_operation (op0);
4414               return simplify_gen_unary (NOT, mode,
4415                                          gen_lowpart (mode, op0),
4416                                          mode);
4417             }
4418
4419           /* If X is 0/1, (eq X 0) is X-1.  */
4420           else if (STORE_FLAG_VALUE == -1
4421                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4422                    && op1 == const0_rtx
4423                    && mode == GET_MODE (op0)
4424                    && nonzero_bits (op0, mode) == 1)
4425             {
4426               op0 = expand_compound_operation (op0);
4427               return plus_constant (gen_lowpart (mode, op0), -1);
4428             }
4429
4430           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
4431              one bit that might be nonzero, we can convert (ne x 0) to
4432              (ashift x c) where C puts the bit in the sign bit.  Remove any
4433              AND with STORE_FLAG_VALUE when we are done, since we are only
4434              going to test the sign bit.  */
4435           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4436               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4437               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
4438                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
4439               && op1 == const0_rtx
4440               && mode == GET_MODE (op0)
4441               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
4442             {
4443               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
4444                                         expand_compound_operation (op0),
4445                                         GET_MODE_BITSIZE (mode) - 1 - i);
4446               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
4447                 return XEXP (x, 0);
4448               else
4449                 return x;
4450             }
4451
4452           /* If the code changed, return a whole new comparison.  */
4453           if (new_code != code)
4454             return gen_rtx_fmt_ee (new_code, mode, op0, op1);
4455
4456           /* Otherwise, keep this operation, but maybe change its operands.
4457              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
4458           SUBST (XEXP (x, 0), op0);
4459           SUBST (XEXP (x, 1), op1);
4460         }
4461       break;
4462
4463     case IF_THEN_ELSE:
4464       return simplify_if_then_else (x);
4465
4466     case ZERO_EXTRACT:
4467     case SIGN_EXTRACT:
4468     case ZERO_EXTEND:
4469     case SIGN_EXTEND:
4470       /* If we are processing SET_DEST, we are done.  */
4471       if (in_dest)
4472         return x;
4473
4474       return expand_compound_operation (x);
4475
4476     case SET:
4477       return simplify_set (x);
4478
4479     case AND:
4480     case IOR:
4481     case XOR:
4482       return simplify_logical (x);
4483
4484     case ABS:
4485       /* (abs (neg <foo>)) -> (abs <foo>) */
4486       if (GET_CODE (XEXP (x, 0)) == NEG)
4487         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4488
4489       /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
4490          do nothing.  */
4491       if (GET_MODE (XEXP (x, 0)) == VOIDmode)
4492         break;
4493
4494       /* If operand is something known to be positive, ignore the ABS.  */
4495       if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
4496           || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4497                <= HOST_BITS_PER_WIDE_INT)
4498               && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4499                    & ((HOST_WIDE_INT) 1
4500                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
4501                   == 0)))
4502         return XEXP (x, 0);
4503
4504       /* If operand is known to be only -1 or 0, convert ABS to NEG.  */
4505       if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
4506         return gen_rtx_NEG (mode, XEXP (x, 0));
4507
4508       break;
4509
4510     case FFS:
4511       /* (ffs (*_extend <X>)) = (ffs <X>) */
4512       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4513           || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4514         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4515       break;
4516
4517     case POPCOUNT:
4518     case PARITY:
4519       /* (pop* (zero_extend <X>)) = (pop* <X>) */
4520       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4521         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4522       break;
4523
4524     case FLOAT:
4525       /* (float (sign_extend <X>)) = (float <X>).  */
4526       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
4527         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4528       break;
4529
4530     case ASHIFT:
4531     case LSHIFTRT:
4532     case ASHIFTRT:
4533     case ROTATE:
4534     case ROTATERT:
4535       /* If this is a shift by a constant amount, simplify it.  */
4536       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4537         return simplify_shift_const (x, code, mode, XEXP (x, 0),
4538                                      INTVAL (XEXP (x, 1)));
4539
4540       else if (SHIFT_COUNT_TRUNCATED && GET_CODE (XEXP (x, 1)) != REG)
4541         SUBST (XEXP (x, 1),
4542                force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
4543                               ((HOST_WIDE_INT) 1
4544                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
4545                               - 1,
4546                               NULL_RTX, 0));
4547       break;
4548
4549     case VEC_SELECT:
4550       {
4551         rtx op0 = XEXP (x, 0);
4552         rtx op1 = XEXP (x, 1);
4553         int len;
4554
4555         if (GET_CODE (op1) != PARALLEL)
4556           abort ();
4557         len = XVECLEN (op1, 0);
4558         if (len == 1
4559             && GET_CODE (XVECEXP (op1, 0, 0)) == CONST_INT
4560             && GET_CODE (op0) == VEC_CONCAT)
4561           {
4562             int offset = INTVAL (XVECEXP (op1, 0, 0)) * GET_MODE_SIZE (GET_MODE (x));
4563
4564             /* Try to find the element in the VEC_CONCAT.  */
4565             for (;;)
4566               {
4567                 if (GET_MODE (op0) == GET_MODE (x))
4568                   return op0;
4569                 if (GET_CODE (op0) == VEC_CONCAT)
4570                   {
4571                     HOST_WIDE_INT op0_size = GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)));
4572                     if (op0_size < offset)
4573                       op0 = XEXP (op0, 0);
4574                     else
4575                       {
4576                         offset -= op0_size;
4577                         op0 = XEXP (op0, 1);
4578                       }
4579                   }
4580                 else
4581                   break;
4582               }
4583           }
4584       }
4585
4586       break;
4587
4588     default:
4589       break;
4590     }
4591
4592   return x;
4593 }
4594 \f
4595 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
4596
4597 static rtx
4598 simplify_if_then_else (rtx x)
4599 {
4600   enum machine_mode mode = GET_MODE (x);
4601   rtx cond = XEXP (x, 0);
4602   rtx true_rtx = XEXP (x, 1);
4603   rtx false_rtx = XEXP (x, 2);
4604   enum rtx_code true_code = GET_CODE (cond);
4605   int comparison_p = COMPARISON_P (cond);
4606   rtx temp;
4607   int i;
4608   enum rtx_code false_code;
4609   rtx reversed;
4610
4611   /* Simplify storing of the truth value.  */
4612   if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
4613     return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1));
4614
4615   /* Also when the truth value has to be reversed.  */
4616   if (comparison_p
4617       && true_rtx == const0_rtx && false_rtx == const_true_rtx
4618       && (reversed = reversed_comparison (cond, mode, XEXP (cond, 0),
4619                                           XEXP (cond, 1))))
4620     return reversed;
4621
4622   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
4623      in it is being compared against certain values.  Get the true and false
4624      comparisons and see if that says anything about the value of each arm.  */
4625
4626   if (comparison_p
4627       && ((false_code = combine_reversed_comparison_code (cond))
4628           != UNKNOWN)
4629       && GET_CODE (XEXP (cond, 0)) == REG)
4630     {
4631       HOST_WIDE_INT nzb;
4632       rtx from = XEXP (cond, 0);
4633       rtx true_val = XEXP (cond, 1);
4634       rtx false_val = true_val;
4635       int swapped = 0;
4636
4637       /* If FALSE_CODE is EQ, swap the codes and arms.  */
4638
4639       if (false_code == EQ)
4640         {
4641           swapped = 1, true_code = EQ, false_code = NE;
4642           temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4643         }
4644
4645       /* If we are comparing against zero and the expression being tested has
4646          only a single bit that might be nonzero, that is its value when it is
4647          not equal to zero.  Similarly if it is known to be -1 or 0.  */
4648
4649       if (true_code == EQ && true_val == const0_rtx
4650           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
4651         false_code = EQ, false_val = GEN_INT (nzb);
4652       else if (true_code == EQ && true_val == const0_rtx
4653                && (num_sign_bit_copies (from, GET_MODE (from))
4654                    == GET_MODE_BITSIZE (GET_MODE (from))))
4655         false_code = EQ, false_val = constm1_rtx;
4656
4657       /* Now simplify an arm if we know the value of the register in the
4658          branch and it is used in the arm.  Be careful due to the potential
4659          of locally-shared RTL.  */
4660
4661       if (reg_mentioned_p (from, true_rtx))
4662         true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
4663                                       from, true_val),
4664                       pc_rtx, pc_rtx, 0, 0);
4665       if (reg_mentioned_p (from, false_rtx))
4666         false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
4667                                    from, false_val),
4668                        pc_rtx, pc_rtx, 0, 0);
4669
4670       SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
4671       SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
4672
4673       true_rtx = XEXP (x, 1);
4674       false_rtx = XEXP (x, 2);
4675       true_code = GET_CODE (cond);
4676     }
4677
4678   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
4679      reversed, do so to avoid needing two sets of patterns for
4680      subtract-and-branch insns.  Similarly if we have a constant in the true
4681      arm, the false arm is the same as the first operand of the comparison, or
4682      the false arm is more complicated than the true arm.  */
4683
4684   if (comparison_p
4685       && combine_reversed_comparison_code (cond) != UNKNOWN
4686       && (true_rtx == pc_rtx
4687           || (CONSTANT_P (true_rtx)
4688               && GET_CODE (false_rtx) != CONST_INT && false_rtx != pc_rtx)
4689           || true_rtx == const0_rtx
4690           || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
4691           || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
4692               && !OBJECT_P (false_rtx))
4693           || reg_mentioned_p (true_rtx, false_rtx)
4694           || rtx_equal_p (false_rtx, XEXP (cond, 0))))
4695     {
4696       true_code = reversed_comparison_code (cond, NULL);
4697       SUBST (XEXP (x, 0),
4698              reversed_comparison (cond, GET_MODE (cond), XEXP (cond, 0),
4699                                   XEXP (cond, 1)));
4700
4701       SUBST (XEXP (x, 1), false_rtx);
4702       SUBST (XEXP (x, 2), true_rtx);
4703
4704       temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4705       cond = XEXP (x, 0);
4706
4707       /* It is possible that the conditional has been simplified out.  */
4708       true_code = GET_CODE (cond);
4709       comparison_p = COMPARISON_P (cond);
4710     }
4711
4712   /* If the two arms are identical, we don't need the comparison.  */
4713
4714   if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
4715     return true_rtx;
4716
4717   /* Convert a == b ? b : a to "a".  */
4718   if (true_code == EQ && ! side_effects_p (cond)
4719       && !HONOR_NANS (mode)
4720       && rtx_equal_p (XEXP (cond, 0), false_rtx)
4721       && rtx_equal_p (XEXP (cond, 1), true_rtx))
4722     return false_rtx;
4723   else if (true_code == NE && ! side_effects_p (cond)
4724            && !HONOR_NANS (mode)
4725            && rtx_equal_p (XEXP (cond, 0), true_rtx)
4726            && rtx_equal_p (XEXP (cond, 1), false_rtx))
4727     return true_rtx;
4728
4729   /* Look for cases where we have (abs x) or (neg (abs X)).  */
4730
4731   if (GET_MODE_CLASS (mode) == MODE_INT
4732       && GET_CODE (false_rtx) == NEG
4733       && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
4734       && comparison_p
4735       && rtx_equal_p (true_rtx, XEXP (cond, 0))
4736       && ! side_effects_p (true_rtx))
4737     switch (true_code)
4738       {
4739       case GT:
4740       case GE:
4741         return simplify_gen_unary (ABS, mode, true_rtx, mode);
4742       case LT:
4743       case LE:
4744         return
4745           simplify_gen_unary (NEG, mode,
4746                               simplify_gen_unary (ABS, mode, true_rtx, mode),
4747                               mode);
4748       default:
4749         break;
4750       }
4751
4752   /* Look for MIN or MAX.  */
4753
4754   if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
4755       && comparison_p
4756       && rtx_equal_p (XEXP (cond, 0), true_rtx)
4757       && rtx_equal_p (XEXP (cond, 1), false_rtx)
4758       && ! side_effects_p (cond))
4759     switch (true_code)
4760       {
4761       case GE:
4762       case GT:
4763         return gen_binary (SMAX, mode, true_rtx, false_rtx);
4764       case LE:
4765       case LT:
4766         return gen_binary (SMIN, mode, true_rtx, false_rtx);
4767       case GEU:
4768       case GTU:
4769         return gen_binary (UMAX, mode, true_rtx, false_rtx);
4770       case LEU:
4771       case LTU:
4772         return gen_binary (UMIN, mode, true_rtx, false_rtx);
4773       default:
4774         break;
4775       }
4776
4777   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
4778      second operand is zero, this can be done as (OP Z (mult COND C2)) where
4779      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
4780      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
4781      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
4782      neither 1 or -1, but it isn't worth checking for.  */
4783
4784   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
4785       && comparison_p
4786       && GET_MODE_CLASS (mode) == MODE_INT
4787       && ! side_effects_p (x))
4788     {
4789       rtx t = make_compound_operation (true_rtx, SET);
4790       rtx f = make_compound_operation (false_rtx, SET);
4791       rtx cond_op0 = XEXP (cond, 0);
4792       rtx cond_op1 = XEXP (cond, 1);
4793       enum rtx_code op = NIL, extend_op = NIL;
4794       enum machine_mode m = mode;
4795       rtx z = 0, c1 = NULL_RTX;
4796
4797       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
4798            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
4799            || GET_CODE (t) == ASHIFT
4800            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
4801           && rtx_equal_p (XEXP (t, 0), f))
4802         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
4803
4804       /* If an identity-zero op is commutative, check whether there
4805          would be a match if we swapped the operands.  */
4806       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
4807                 || GET_CODE (t) == XOR)
4808                && rtx_equal_p (XEXP (t, 1), f))
4809         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
4810       else if (GET_CODE (t) == SIGN_EXTEND
4811                && (GET_CODE (XEXP (t, 0)) == PLUS
4812                    || GET_CODE (XEXP (t, 0)) == MINUS
4813                    || GET_CODE (XEXP (t, 0)) == IOR
4814                    || GET_CODE (XEXP (t, 0)) == XOR
4815                    || GET_CODE (XEXP (t, 0)) == ASHIFT
4816                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4817                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4818                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4819                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4820                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4821                && (num_sign_bit_copies (f, GET_MODE (f))
4822                    > (unsigned int)
4823                      (GET_MODE_BITSIZE (mode)
4824                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
4825         {
4826           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4827           extend_op = SIGN_EXTEND;
4828           m = GET_MODE (XEXP (t, 0));
4829         }
4830       else if (GET_CODE (t) == SIGN_EXTEND
4831                && (GET_CODE (XEXP (t, 0)) == PLUS
4832                    || GET_CODE (XEXP (t, 0)) == IOR
4833                    || GET_CODE (XEXP (t, 0)) == XOR)
4834                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4835                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4836                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4837                && (num_sign_bit_copies (f, GET_MODE (f))
4838                    > (unsigned int)
4839                      (GET_MODE_BITSIZE (mode)
4840                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
4841         {
4842           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4843           extend_op = SIGN_EXTEND;
4844           m = GET_MODE (XEXP (t, 0));
4845         }
4846       else if (GET_CODE (t) == ZERO_EXTEND
4847                && (GET_CODE (XEXP (t, 0)) == PLUS
4848                    || GET_CODE (XEXP (t, 0)) == MINUS
4849                    || GET_CODE (XEXP (t, 0)) == IOR
4850                    || GET_CODE (XEXP (t, 0)) == XOR
4851                    || GET_CODE (XEXP (t, 0)) == ASHIFT
4852                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4853                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4854                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4855                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4856                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4857                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4858                && ((nonzero_bits (f, GET_MODE (f))
4859                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
4860                    == 0))
4861         {
4862           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4863           extend_op = ZERO_EXTEND;
4864           m = GET_MODE (XEXP (t, 0));
4865         }
4866       else if (GET_CODE (t) == ZERO_EXTEND
4867                && (GET_CODE (XEXP (t, 0)) == PLUS
4868                    || GET_CODE (XEXP (t, 0)) == IOR
4869                    || GET_CODE (XEXP (t, 0)) == XOR)
4870                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4871                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4872                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4873                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4874                && ((nonzero_bits (f, GET_MODE (f))
4875                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
4876                    == 0))
4877         {
4878           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4879           extend_op = ZERO_EXTEND;
4880           m = GET_MODE (XEXP (t, 0));
4881         }
4882
4883       if (z)
4884         {
4885           temp = subst (gen_binary (true_code, m, cond_op0, cond_op1),
4886                         pc_rtx, pc_rtx, 0, 0);
4887           temp = gen_binary (MULT, m, temp,
4888                              gen_binary (MULT, m, c1, const_true_rtx));
4889           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
4890           temp = gen_binary (op, m, gen_lowpart (m, z), temp);
4891
4892           if (extend_op != NIL)
4893             temp = simplify_gen_unary (extend_op, mode, temp, m);
4894
4895           return temp;
4896         }
4897     }
4898
4899   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
4900      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
4901      negation of a single bit, we can convert this operation to a shift.  We
4902      can actually do this more generally, but it doesn't seem worth it.  */
4903
4904   if (true_code == NE && XEXP (cond, 1) == const0_rtx
4905       && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
4906       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
4907            && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
4908           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
4909                == GET_MODE_BITSIZE (mode))
4910               && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
4911     return
4912       simplify_shift_const (NULL_RTX, ASHIFT, mode,
4913                             gen_lowpart (mode, XEXP (cond, 0)), i);
4914
4915   /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8.  */
4916   if (true_code == NE && XEXP (cond, 1) == const0_rtx
4917       && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
4918       && GET_MODE (XEXP (cond, 0)) == mode
4919       && (INTVAL (true_rtx) & GET_MODE_MASK (mode))
4920           == nonzero_bits (XEXP (cond, 0), mode)
4921       && (i = exact_log2 (INTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
4922     return XEXP (cond, 0);
4923
4924   return x;
4925 }
4926 \f
4927 /* Simplify X, a SET expression.  Return the new expression.  */
4928
4929 static rtx
4930 simplify_set (rtx x)
4931 {
4932   rtx src = SET_SRC (x);
4933   rtx dest = SET_DEST (x);
4934   enum machine_mode mode
4935     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
4936   rtx other_insn;
4937   rtx *cc_use;
4938
4939   /* (set (pc) (return)) gets written as (return).  */
4940   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
4941     return src;
4942
4943   /* Now that we know for sure which bits of SRC we are using, see if we can
4944      simplify the expression for the object knowing that we only need the
4945      low-order bits.  */
4946
4947   if (GET_MODE_CLASS (mode) == MODE_INT
4948       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
4949     {
4950       src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
4951       SUBST (SET_SRC (x), src);
4952     }
4953
4954   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
4955      the comparison result and try to simplify it unless we already have used
4956      undobuf.other_insn.  */
4957   if ((GET_MODE_CLASS (mode) == MODE_CC
4958        || GET_CODE (src) == COMPARE
4959        || CC0_P (dest))
4960       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
4961       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
4962       && COMPARISON_P (*cc_use)
4963       && rtx_equal_p (XEXP (*cc_use, 0), dest))
4964     {
4965       enum rtx_code old_code = GET_CODE (*cc_use);
4966       enum rtx_code new_code;
4967       rtx op0, op1, tmp;
4968       int other_changed = 0;
4969       enum machine_mode compare_mode = GET_MODE (dest);
4970
4971       if (GET_CODE (src) == COMPARE)
4972         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
4973       else
4974         op0 = src, op1 = const0_rtx;
4975
4976       tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
4977                                            op0, op1);
4978       if (!tmp)
4979         new_code = old_code;
4980       else if (!CONSTANT_P (tmp))
4981         {
4982           new_code = GET_CODE (tmp);
4983           op0 = XEXP (tmp, 0);
4984           op1 = XEXP (tmp, 1);
4985         }
4986       else
4987         {
4988           rtx pat = PATTERN (other_insn);
4989           undobuf.other_insn = other_insn;
4990           SUBST (*cc_use, tmp);
4991
4992           /* Attempt to simplify CC user.  */
4993           if (GET_CODE (pat) == SET)
4994             {
4995               rtx new = simplify_rtx (SET_SRC (pat));
4996               if (new != NULL_RTX)
4997                 SUBST (SET_SRC (pat), new);
4998             }
4999
5000           /* Convert X into a no-op move.  */
5001           SUBST (SET_DEST (x), pc_rtx);
5002           SUBST (SET_SRC (x), pc_rtx);
5003           return x;
5004         }
5005
5006       /* Simplify our comparison, if possible.  */
5007       new_code = simplify_comparison (new_code, &op0, &op1);
5008
5009 #ifdef SELECT_CC_MODE
5010       /* If this machine has CC modes other than CCmode, check to see if we
5011          need to use a different CC mode here.  */
5012       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
5013         compare_mode = GET_MODE (op0);
5014       else
5015         compare_mode = SELECT_CC_MODE (new_code, op0, op1);
5016
5017 #ifndef HAVE_cc0
5018       /* If the mode changed, we have to change SET_DEST, the mode in the
5019          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
5020          a hard register, just build new versions with the proper mode.  If it
5021          is a pseudo, we lose unless it is only time we set the pseudo, in
5022          which case we can safely change its mode.  */
5023       if (compare_mode != GET_MODE (dest))
5024         {
5025           unsigned int regno = REGNO (dest);
5026           rtx new_dest = gen_rtx_REG (compare_mode, regno);
5027
5028           if (regno < FIRST_PSEUDO_REGISTER
5029               || (REG_N_SETS (regno) == 1 && ! REG_USERVAR_P (dest)))
5030             {
5031               if (regno >= FIRST_PSEUDO_REGISTER)
5032                 SUBST (regno_reg_rtx[regno], new_dest);
5033
5034               SUBST (SET_DEST (x), new_dest);
5035               SUBST (XEXP (*cc_use, 0), new_dest);
5036               other_changed = 1;
5037
5038               dest = new_dest;
5039             }
5040         }
5041 #endif  /* cc0 */
5042 #endif  /* SELECT_CC_MODE */
5043
5044       /* If the code changed, we have to build a new comparison in
5045          undobuf.other_insn.  */
5046       if (new_code != old_code)
5047         {
5048           int other_changed_previously = other_changed;
5049           unsigned HOST_WIDE_INT mask;
5050
5051           SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
5052                                           dest, const0_rtx));
5053           other_changed = 1;
5054
5055           /* If the only change we made was to change an EQ into an NE or
5056              vice versa, OP0 has only one bit that might be nonzero, and OP1
5057              is zero, check if changing the user of the condition code will
5058              produce a valid insn.  If it won't, we can keep the original code
5059              in that insn by surrounding our operation with an XOR.  */
5060
5061           if (((old_code == NE && new_code == EQ)
5062                || (old_code == EQ && new_code == NE))
5063               && ! other_changed_previously && op1 == const0_rtx
5064               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
5065               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
5066             {
5067               rtx pat = PATTERN (other_insn), note = 0;
5068
5069               if ((recog_for_combine (&pat, other_insn, &note) < 0
5070                    && ! check_asm_operands (pat)))
5071                 {
5072                   PUT_CODE (*cc_use, old_code);
5073                   other_changed = 0;
5074
5075                   op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask));
5076                 }
5077             }
5078         }
5079
5080       if (other_changed)
5081         undobuf.other_insn = other_insn;
5082
5083 #ifdef HAVE_cc0
5084       /* If we are now comparing against zero, change our source if
5085          needed.  If we do not use cc0, we always have a COMPARE.  */
5086       if (op1 == const0_rtx && dest == cc0_rtx)
5087         {
5088           SUBST (SET_SRC (x), op0);
5089           src = op0;
5090         }
5091       else
5092 #endif
5093
5094       /* Otherwise, if we didn't previously have a COMPARE in the
5095          correct mode, we need one.  */
5096       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
5097         {
5098           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
5099           src = SET_SRC (x);
5100         }
5101       else
5102         {
5103           /* Otherwise, update the COMPARE if needed.  */
5104           SUBST (XEXP (src, 0), op0);
5105           SUBST (XEXP (src, 1), op1);
5106         }
5107     }
5108   else
5109     {
5110       /* Get SET_SRC in a form where we have placed back any
5111          compound expressions.  Then do the checks below.  */
5112       src = make_compound_operation (src, SET);
5113       SUBST (SET_SRC (x), src);
5114     }
5115
5116   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
5117      and X being a REG or (subreg (reg)), we may be able to convert this to
5118      (set (subreg:m2 x) (op)).
5119
5120      We can always do this if M1 is narrower than M2 because that means that
5121      we only care about the low bits of the result.
5122
5123      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
5124      perform a narrower operation than requested since the high-order bits will
5125      be undefined.  On machine where it is defined, this transformation is safe
5126      as long as M1 and M2 have the same number of words.  */
5127
5128   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5129       && !OBJECT_P (SUBREG_REG (src))
5130       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
5131            / UNITS_PER_WORD)
5132           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5133                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
5134 #ifndef WORD_REGISTER_OPERATIONS
5135       && (GET_MODE_SIZE (GET_MODE (src))
5136         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5137 #endif
5138 #ifdef CANNOT_CHANGE_MODE_CLASS
5139       && ! (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER
5140             && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
5141                                          GET_MODE (SUBREG_REG (src)),
5142                                          GET_MODE (src)))
5143 #endif
5144       && (GET_CODE (dest) == REG
5145           || (GET_CODE (dest) == SUBREG
5146               && GET_CODE (SUBREG_REG (dest)) == REG)))
5147     {
5148       SUBST (SET_DEST (x),
5149              gen_lowpart (GET_MODE (SUBREG_REG (src)),
5150                                       dest));
5151       SUBST (SET_SRC (x), SUBREG_REG (src));
5152
5153       src = SET_SRC (x), dest = SET_DEST (x);
5154     }
5155
5156 #ifdef HAVE_cc0
5157   /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
5158      in SRC.  */
5159   if (dest == cc0_rtx
5160       && GET_CODE (src) == SUBREG
5161       && subreg_lowpart_p (src)
5162       && (GET_MODE_BITSIZE (GET_MODE (src))
5163           < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
5164     {
5165       rtx inner = SUBREG_REG (src);
5166       enum machine_mode inner_mode = GET_MODE (inner);
5167
5168       /* Here we make sure that we don't have a sign bit on.  */
5169       if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
5170           && (nonzero_bits (inner, inner_mode)
5171               < ((unsigned HOST_WIDE_INT) 1
5172                  << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
5173         {
5174           SUBST (SET_SRC (x), inner);
5175           src = SET_SRC (x);
5176         }
5177     }
5178 #endif
5179
5180 #ifdef LOAD_EXTEND_OP
5181   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
5182      would require a paradoxical subreg.  Replace the subreg with a
5183      zero_extend to avoid the reload that would otherwise be required.  */
5184
5185   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5186       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != NIL
5187       && SUBREG_BYTE (src) == 0
5188       && (GET_MODE_SIZE (GET_MODE (src))
5189           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5190       && GET_CODE (SUBREG_REG (src)) == MEM)
5191     {
5192       SUBST (SET_SRC (x),
5193              gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
5194                             GET_MODE (src), SUBREG_REG (src)));
5195
5196       src = SET_SRC (x);
5197     }
5198 #endif
5199
5200   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
5201      are comparing an item known to be 0 or -1 against 0, use a logical
5202      operation instead. Check for one of the arms being an IOR of the other
5203      arm with some value.  We compute three terms to be IOR'ed together.  In
5204      practice, at most two will be nonzero.  Then we do the IOR's.  */
5205
5206   if (GET_CODE (dest) != PC
5207       && GET_CODE (src) == IF_THEN_ELSE
5208       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
5209       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
5210       && XEXP (XEXP (src, 0), 1) == const0_rtx
5211       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
5212 #ifdef HAVE_conditional_move
5213       && ! can_conditionally_move_p (GET_MODE (src))
5214 #endif
5215       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
5216                                GET_MODE (XEXP (XEXP (src, 0), 0)))
5217           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
5218       && ! side_effects_p (src))
5219     {
5220       rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
5221                       ? XEXP (src, 1) : XEXP (src, 2));
5222       rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
5223                    ? XEXP (src, 2) : XEXP (src, 1));
5224       rtx term1 = const0_rtx, term2, term3;
5225
5226       if (GET_CODE (true_rtx) == IOR
5227           && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
5228         term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
5229       else if (GET_CODE (true_rtx) == IOR
5230                && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
5231         term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
5232       else if (GET_CODE (false_rtx) == IOR
5233                && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
5234         term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
5235       else if (GET_CODE (false_rtx) == IOR
5236                && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
5237         term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
5238
5239       term2 = gen_binary (AND, GET_MODE (src),
5240                           XEXP (XEXP (src, 0), 0), true_rtx);
5241       term3 = gen_binary (AND, GET_MODE (src),
5242                           simplify_gen_unary (NOT, GET_MODE (src),
5243                                               XEXP (XEXP (src, 0), 0),
5244                                               GET_MODE (src)),
5245                           false_rtx);
5246
5247       SUBST (SET_SRC (x),
5248              gen_binary (IOR, GET_MODE (src),
5249                          gen_binary (IOR, GET_MODE (src), term1, term2),
5250                          term3));
5251
5252       src = SET_SRC (x);
5253     }
5254
5255   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
5256      whole thing fail.  */
5257   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
5258     return src;
5259   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
5260     return dest;
5261   else
5262     /* Convert this into a field assignment operation, if possible.  */
5263     return make_field_assignment (x);
5264 }
5265 \f
5266 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
5267    result.  */
5268
5269 static rtx
5270 simplify_logical (rtx x)
5271 {
5272   enum machine_mode mode = GET_MODE (x);
5273   rtx op0 = XEXP (x, 0);
5274   rtx op1 = XEXP (x, 1);
5275   rtx reversed;
5276
5277   switch (GET_CODE (x))
5278     {
5279     case AND:
5280       /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
5281          insn (and may simplify more).  */
5282       if (GET_CODE (op0) == XOR
5283           && rtx_equal_p (XEXP (op0, 0), op1)
5284           && ! side_effects_p (op1))
5285         x = gen_binary (AND, mode,
5286                         simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
5287                         op1);
5288
5289       if (GET_CODE (op0) == XOR
5290           && rtx_equal_p (XEXP (op0, 1), op1)
5291           && ! side_effects_p (op1))
5292         x = gen_binary (AND, mode,
5293                         simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
5294                         op1);
5295
5296       /* Similarly for (~(A ^ B)) & A.  */
5297       if (GET_CODE (op0) == NOT
5298           && GET_CODE (XEXP (op0, 0)) == XOR
5299           && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
5300           && ! side_effects_p (op1))
5301         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
5302
5303       if (GET_CODE (op0) == NOT
5304           && GET_CODE (XEXP (op0, 0)) == XOR
5305           && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
5306           && ! side_effects_p (op1))
5307         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
5308
5309       /* We can call simplify_and_const_int only if we don't lose
5310          any (sign) bits when converting INTVAL (op1) to
5311          "unsigned HOST_WIDE_INT".  */
5312       if (GET_CODE (op1) == CONST_INT
5313           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5314               || INTVAL (op1) > 0))
5315         {
5316           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
5317
5318           /* If we have (ior (and (X C1) C2)) and the next restart would be
5319              the last, simplify this by making C1 as small as possible
5320              and then exit.  Only do this if C1 actually changes: for now
5321              this only saves memory but, should this transformation be
5322              moved to simplify-rtx.c, we'd risk unbounded recursion there.  */
5323           if (GET_CODE (x) == IOR && GET_CODE (op0) == AND
5324               && GET_CODE (XEXP (op0, 1)) == CONST_INT
5325               && GET_CODE (op1) == CONST_INT
5326               && (INTVAL (XEXP (op0, 1)) & INTVAL (op1)) != 0)
5327             return gen_binary (IOR, mode,
5328                                gen_binary (AND, mode, XEXP (op0, 0),
5329                                            GEN_INT (INTVAL (XEXP (op0, 1))
5330                                                     & ~INTVAL (op1))), op1);
5331
5332           if (GET_CODE (x) != AND)
5333             return x;
5334
5335           op0 = XEXP (x, 0);
5336           op1 = XEXP (x, 1);
5337         }
5338
5339       /* Convert (A | B) & A to A.  */
5340       if (GET_CODE (op0) == IOR
5341           && (rtx_equal_p (XEXP (op0, 0), op1)
5342               || rtx_equal_p (XEXP (op0, 1), op1))
5343           && ! side_effects_p (XEXP (op0, 0))
5344           && ! side_effects_p (XEXP (op0, 1)))
5345         return op1;
5346
5347       /* In the following group of tests (and those in case IOR below),
5348          we start with some combination of logical operations and apply
5349          the distributive law followed by the inverse distributive law.
5350          Most of the time, this results in no change.  However, if some of
5351          the operands are the same or inverses of each other, simplifications
5352          will result.
5353
5354          For example, (and (ior A B) (not B)) can occur as the result of
5355          expanding a bit field assignment.  When we apply the distributive
5356          law to this, we get (ior (and (A (not B))) (and (B (not B)))),
5357          which then simplifies to (and (A (not B))).
5358
5359          If we have (and (ior A B) C), apply the distributive law and then
5360          the inverse distributive law to see if things simplify.  */
5361
5362       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
5363         {
5364           x = apply_distributive_law
5365             (gen_binary (GET_CODE (op0), mode,
5366                          gen_binary (AND, mode, XEXP (op0, 0), op1),
5367                          gen_binary (AND, mode, XEXP (op0, 1),
5368                                      copy_rtx (op1))));
5369           if (GET_CODE (x) != AND)
5370             return x;
5371         }
5372
5373       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
5374         return apply_distributive_law
5375           (gen_binary (GET_CODE (op1), mode,
5376                        gen_binary (AND, mode, XEXP (op1, 0), op0),
5377                        gen_binary (AND, mode, XEXP (op1, 1),
5378                                    copy_rtx (op0))));
5379
5380       /* Similarly, taking advantage of the fact that
5381          (and (not A) (xor B C)) == (xor (ior A B) (ior A C))  */
5382
5383       if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR)
5384         return apply_distributive_law
5385           (gen_binary (XOR, mode,
5386                        gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)),
5387                        gen_binary (IOR, mode, copy_rtx (XEXP (op0, 0)),
5388                                    XEXP (op1, 1))));
5389
5390       else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR)
5391         return apply_distributive_law
5392           (gen_binary (XOR, mode,
5393                        gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)),
5394                        gen_binary (IOR, mode, copy_rtx (XEXP (op1, 0)), XEXP (op0, 1))));
5395       break;
5396
5397     case IOR:
5398       /* (ior A C) is C if all bits of A that might be nonzero are on in C.  */
5399       if (GET_CODE (op1) == CONST_INT
5400           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5401           && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
5402         return op1;
5403
5404       /* Convert (A & B) | A to A.  */
5405       if (GET_CODE (op0) == AND
5406           && (rtx_equal_p (XEXP (op0, 0), op1)
5407               || rtx_equal_p (XEXP (op0, 1), op1))
5408           && ! side_effects_p (XEXP (op0, 0))
5409           && ! side_effects_p (XEXP (op0, 1)))
5410         return op1;
5411
5412       /* If we have (ior (and A B) C), apply the distributive law and then
5413          the inverse distributive law to see if things simplify.  */
5414
5415       if (GET_CODE (op0) == AND)
5416         {
5417           x = apply_distributive_law
5418             (gen_binary (AND, mode,
5419                          gen_binary (IOR, mode, XEXP (op0, 0), op1),
5420                          gen_binary (IOR, mode, XEXP (op0, 1),
5421                                      copy_rtx (op1))));
5422
5423           if (GET_CODE (x) != IOR)
5424             return x;
5425         }
5426
5427       if (GET_CODE (op1) == AND)
5428         {
5429           x = apply_distributive_law
5430             (gen_binary (AND, mode,
5431                          gen_binary (IOR, mode, XEXP (op1, 0), op0),
5432                          gen_binary (IOR, mode, XEXP (op1, 1),
5433                                      copy_rtx (op0))));
5434
5435           if (GET_CODE (x) != IOR)
5436             return x;
5437         }
5438
5439       /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
5440          mode size to (rotate A CX).  */
5441
5442       if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT)
5443            || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT))
5444           && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
5445           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5446           && GET_CODE (XEXP (op1, 1)) == CONST_INT
5447           && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
5448               == GET_MODE_BITSIZE (mode)))
5449         return gen_rtx_ROTATE (mode, XEXP (op0, 0),
5450                                (GET_CODE (op0) == ASHIFT
5451                                 ? XEXP (op0, 1) : XEXP (op1, 1)));
5452
5453       /* If OP0 is (ashiftrt (plus ...) C), it might actually be
5454          a (sign_extend (plus ...)).  If so, OP1 is a CONST_INT, and the PLUS
5455          does not affect any of the bits in OP1, it can really be done
5456          as a PLUS and we can associate.  We do this by seeing if OP1
5457          can be safely shifted left C bits.  */
5458       if (GET_CODE (op1) == CONST_INT && GET_CODE (op0) == ASHIFTRT
5459           && GET_CODE (XEXP (op0, 0)) == PLUS
5460           && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
5461           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5462           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT)
5463         {
5464           int count = INTVAL (XEXP (op0, 1));
5465           HOST_WIDE_INT mask = INTVAL (op1) << count;
5466
5467           if (mask >> count == INTVAL (op1)
5468               && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0)
5469             {
5470               SUBST (XEXP (XEXP (op0, 0), 1),
5471                      GEN_INT (INTVAL (XEXP (XEXP (op0, 0), 1)) | mask));
5472               return op0;
5473             }
5474         }
5475       break;
5476
5477     case XOR:
5478       /* If we are XORing two things that have no bits in common,
5479          convert them into an IOR.  This helps to detect rotation encoded
5480          using those methods and possibly other simplifications.  */
5481
5482       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5483           && (nonzero_bits (op0, mode)
5484               & nonzero_bits (op1, mode)) == 0)
5485         return (gen_binary (IOR, mode, op0, op1));
5486
5487       /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
5488          Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
5489          (NOT y).  */
5490       {
5491         int num_negated = 0;
5492
5493         if (GET_CODE (op0) == NOT)
5494           num_negated++, op0 = XEXP (op0, 0);
5495         if (GET_CODE (op1) == NOT)
5496           num_negated++, op1 = XEXP (op1, 0);
5497
5498         if (num_negated == 2)
5499           {
5500             SUBST (XEXP (x, 0), op0);
5501             SUBST (XEXP (x, 1), op1);
5502           }
5503         else if (num_negated == 1)
5504           return
5505             simplify_gen_unary (NOT, mode, gen_binary (XOR, mode, op0, op1),
5506                                 mode);
5507       }
5508
5509       /* Convert (xor (and A B) B) to (and (not A) B).  The latter may
5510          correspond to a machine insn or result in further simplifications
5511          if B is a constant.  */
5512
5513       if (GET_CODE (op0) == AND
5514           && rtx_equal_p (XEXP (op0, 1), op1)
5515           && ! side_effects_p (op1))
5516         return gen_binary (AND, mode,
5517                            simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
5518                            op1);
5519
5520       else if (GET_CODE (op0) == AND
5521                && rtx_equal_p (XEXP (op0, 0), op1)
5522                && ! side_effects_p (op1))
5523         return gen_binary (AND, mode,
5524                            simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
5525                            op1);
5526
5527       /* (xor (comparison foo bar) (const_int 1)) can become the reversed
5528          comparison if STORE_FLAG_VALUE is 1.  */
5529       if (STORE_FLAG_VALUE == 1
5530           && op1 == const1_rtx
5531           && COMPARISON_P (op0)
5532           && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5533                                               XEXP (op0, 1))))
5534         return reversed;
5535
5536       /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
5537          is (lt foo (const_int 0)), so we can perform the above
5538          simplification if STORE_FLAG_VALUE is 1.  */
5539
5540       if (STORE_FLAG_VALUE == 1
5541           && op1 == const1_rtx
5542           && GET_CODE (op0) == LSHIFTRT
5543           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5544           && INTVAL (XEXP (op0, 1)) == GET_MODE_BITSIZE (mode) - 1)
5545         return gen_rtx_GE (mode, XEXP (op0, 0), const0_rtx);
5546
5547       /* (xor (comparison foo bar) (const_int sign-bit))
5548          when STORE_FLAG_VALUE is the sign bit.  */
5549       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5550           && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5551               == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5552           && op1 == const_true_rtx
5553           && COMPARISON_P (op0)
5554           && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5555                                               XEXP (op0, 1))))
5556         return reversed;
5557
5558       break;
5559
5560     default:
5561       abort ();
5562     }
5563
5564   return x;
5565 }
5566 \f
5567 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
5568    operations" because they can be replaced with two more basic operations.
5569    ZERO_EXTEND is also considered "compound" because it can be replaced with
5570    an AND operation, which is simpler, though only one operation.
5571
5572    The function expand_compound_operation is called with an rtx expression
5573    and will convert it to the appropriate shifts and AND operations,
5574    simplifying at each stage.
5575
5576    The function make_compound_operation is called to convert an expression
5577    consisting of shifts and ANDs into the equivalent compound expression.
5578    It is the inverse of this function, loosely speaking.  */
5579
5580 static rtx
5581 expand_compound_operation (rtx x)
5582 {
5583   unsigned HOST_WIDE_INT pos = 0, len;
5584   int unsignedp = 0;
5585   unsigned int modewidth;
5586   rtx tem;
5587
5588   switch (GET_CODE (x))
5589     {
5590     case ZERO_EXTEND:
5591       unsignedp = 1;
5592     case SIGN_EXTEND:
5593       /* We can't necessarily use a const_int for a multiword mode;
5594          it depends on implicitly extending the value.
5595          Since we don't know the right way to extend it,
5596          we can't tell whether the implicit way is right.
5597
5598          Even for a mode that is no wider than a const_int,
5599          we can't win, because we need to sign extend one of its bits through
5600          the rest of it, and we don't know which bit.  */
5601       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
5602         return x;
5603
5604       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
5605          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
5606          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
5607          reloaded. If not for that, MEM's would very rarely be safe.
5608
5609          Reject MODEs bigger than a word, because we might not be able
5610          to reference a two-register group starting with an arbitrary register
5611          (and currently gen_lowpart might crash for a SUBREG).  */
5612
5613       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
5614         return x;
5615
5616       /* Reject MODEs that aren't scalar integers because turning vector
5617          or complex modes into shifts causes problems.  */
5618
5619       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
5620         return x;
5621
5622       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
5623       /* If the inner object has VOIDmode (the only way this can happen
5624          is if it is an ASM_OPERANDS), we can't do anything since we don't
5625          know how much masking to do.  */
5626       if (len == 0)
5627         return x;
5628
5629       break;
5630
5631     case ZERO_EXTRACT:
5632       unsignedp = 1;
5633     case SIGN_EXTRACT:
5634       /* If the operand is a CLOBBER, just return it.  */
5635       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
5636         return XEXP (x, 0);
5637
5638       if (GET_CODE (XEXP (x, 1)) != CONST_INT
5639           || GET_CODE (XEXP (x, 2)) != CONST_INT
5640           || GET_MODE (XEXP (x, 0)) == VOIDmode)
5641         return x;
5642
5643       /* Reject MODEs that aren't scalar integers because turning vector
5644          or complex modes into shifts causes problems.  */
5645
5646       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
5647         return x;
5648
5649       len = INTVAL (XEXP (x, 1));
5650       pos = INTVAL (XEXP (x, 2));
5651
5652       /* If this goes outside the object being extracted, replace the object
5653          with a (use (mem ...)) construct that only combine understands
5654          and is used only for this purpose.  */
5655       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
5656         SUBST (XEXP (x, 0), gen_rtx_USE (GET_MODE (x), XEXP (x, 0)));
5657
5658       if (BITS_BIG_ENDIAN)
5659         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
5660
5661       break;
5662
5663     default:
5664       return x;
5665     }
5666   /* Convert sign extension to zero extension, if we know that the high
5667      bit is not set, as this is easier to optimize.  It will be converted
5668      back to cheaper alternative in make_extraction.  */
5669   if (GET_CODE (x) == SIGN_EXTEND
5670       && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5671           && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
5672                 & ~(((unsigned HOST_WIDE_INT)
5673                       GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
5674                      >> 1))
5675                == 0)))
5676     {
5677       rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
5678       rtx temp2 = expand_compound_operation (temp);
5679
5680       /* Make sure this is a profitable operation.  */
5681       if (rtx_cost (x, SET) > rtx_cost (temp2, SET))
5682        return temp2;
5683       else if (rtx_cost (x, SET) > rtx_cost (temp, SET))
5684        return temp;
5685       else
5686        return x;
5687     }
5688
5689   /* We can optimize some special cases of ZERO_EXTEND.  */
5690   if (GET_CODE (x) == ZERO_EXTEND)
5691     {
5692       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
5693          know that the last value didn't have any inappropriate bits
5694          set.  */
5695       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5696           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5697           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5698           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
5699               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5700         return XEXP (XEXP (x, 0), 0);
5701
5702       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5703       if (GET_CODE (XEXP (x, 0)) == SUBREG
5704           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5705           && subreg_lowpart_p (XEXP (x, 0))
5706           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5707           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
5708               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5709         return SUBREG_REG (XEXP (x, 0));
5710
5711       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
5712          is a comparison and STORE_FLAG_VALUE permits.  This is like
5713          the first case, but it works even when GET_MODE (x) is larger
5714          than HOST_WIDE_INT.  */
5715       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5716           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5717           && COMPARISON_P (XEXP (XEXP (x, 0), 0))
5718           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5719               <= HOST_BITS_PER_WIDE_INT)
5720           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5721               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5722         return XEXP (XEXP (x, 0), 0);
5723
5724       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5725       if (GET_CODE (XEXP (x, 0)) == SUBREG
5726           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5727           && subreg_lowpart_p (XEXP (x, 0))
5728           && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
5729           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5730               <= HOST_BITS_PER_WIDE_INT)
5731           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5732               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5733         return SUBREG_REG (XEXP (x, 0));
5734
5735     }
5736
5737   /* If we reach here, we want to return a pair of shifts.  The inner
5738      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
5739      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
5740      logical depending on the value of UNSIGNEDP.
5741
5742      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
5743      converted into an AND of a shift.
5744
5745      We must check for the case where the left shift would have a negative
5746      count.  This can happen in a case like (x >> 31) & 255 on machines
5747      that can't shift by a constant.  On those machines, we would first
5748      combine the shift with the AND to produce a variable-position
5749      extraction.  Then the constant of 31 would be substituted in to produce
5750      a such a position.  */
5751
5752   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
5753   if (modewidth + len >= pos)
5754     tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
5755                                 GET_MODE (x),
5756                                 simplify_shift_const (NULL_RTX, ASHIFT,
5757                                                       GET_MODE (x),
5758                                                       XEXP (x, 0),
5759                                                       modewidth - pos - len),
5760                                 modewidth - len);
5761
5762   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
5763     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
5764                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
5765                                                         GET_MODE (x),
5766                                                         XEXP (x, 0), pos),
5767                                   ((HOST_WIDE_INT) 1 << len) - 1);
5768   else
5769     /* Any other cases we can't handle.  */
5770     return x;
5771
5772   /* If we couldn't do this for some reason, return the original
5773      expression.  */
5774   if (GET_CODE (tem) == CLOBBER)
5775     return x;
5776
5777   return tem;
5778 }
5779 \f
5780 /* X is a SET which contains an assignment of one object into
5781    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
5782    or certain SUBREGS). If possible, convert it into a series of
5783    logical operations.
5784
5785    We half-heartedly support variable positions, but do not at all
5786    support variable lengths.  */
5787
5788 static rtx
5789 expand_field_assignment (rtx x)
5790 {
5791   rtx inner;
5792   rtx pos;                      /* Always counts from low bit.  */
5793   int len;
5794   rtx mask;
5795   enum machine_mode compute_mode;
5796
5797   /* Loop until we find something we can't simplify.  */
5798   while (1)
5799     {
5800       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
5801           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
5802         {
5803           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
5804           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
5805           pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
5806         }
5807       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
5808                && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
5809         {
5810           inner = XEXP (SET_DEST (x), 0);
5811           len = INTVAL (XEXP (SET_DEST (x), 1));
5812           pos = XEXP (SET_DEST (x), 2);
5813
5814           /* If the position is constant and spans the width of INNER,
5815              surround INNER  with a USE to indicate this.  */
5816           if (GET_CODE (pos) == CONST_INT
5817               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
5818             inner = gen_rtx_USE (GET_MODE (SET_DEST (x)), inner);
5819
5820           if (BITS_BIG_ENDIAN)
5821             {
5822               if (GET_CODE (pos) == CONST_INT)
5823                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
5824                                - INTVAL (pos));
5825               else if (GET_CODE (pos) == MINUS
5826                        && GET_CODE (XEXP (pos, 1)) == CONST_INT
5827                        && (INTVAL (XEXP (pos, 1))
5828                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
5829                 /* If position is ADJUST - X, new position is X.  */
5830                 pos = XEXP (pos, 0);
5831               else
5832                 pos = gen_binary (MINUS, GET_MODE (pos),
5833                                   GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
5834                                            - len),
5835                                   pos);
5836             }
5837         }
5838
5839       /* A SUBREG between two modes that occupy the same numbers of words
5840          can be done by moving the SUBREG to the source.  */
5841       else if (GET_CODE (SET_DEST (x)) == SUBREG
5842                /* We need SUBREGs to compute nonzero_bits properly.  */
5843                && nonzero_sign_valid
5844                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
5845                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
5846                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
5847                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
5848         {
5849           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
5850                            gen_lowpart
5851                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
5852                             SET_SRC (x)));
5853           continue;
5854         }
5855       else
5856         break;
5857
5858       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
5859         inner = SUBREG_REG (inner);
5860
5861       compute_mode = GET_MODE (inner);
5862
5863       /* Don't attempt bitwise arithmetic on non scalar integer modes.  */
5864       if (! SCALAR_INT_MODE_P (compute_mode))
5865         {
5866           enum machine_mode imode;
5867
5868           /* Don't do anything for vector or complex integral types.  */
5869           if (! FLOAT_MODE_P (compute_mode))
5870             break;
5871
5872           /* Try to find an integral mode to pun with.  */
5873           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
5874           if (imode == BLKmode)
5875             break;
5876
5877           compute_mode = imode;
5878           inner = gen_lowpart (imode, inner);
5879         }
5880
5881       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
5882       if (len < HOST_BITS_PER_WIDE_INT)
5883         mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
5884       else
5885         break;
5886
5887       /* Now compute the equivalent expression.  Make a copy of INNER
5888          for the SET_DEST in case it is a MEM into which we will substitute;
5889          we don't want shared RTL in that case.  */
5890       x = gen_rtx_SET
5891         (VOIDmode, copy_rtx (inner),
5892          gen_binary (IOR, compute_mode,
5893                      gen_binary (AND, compute_mode,
5894                                  simplify_gen_unary (NOT, compute_mode,
5895                                                      gen_binary (ASHIFT,
5896                                                                  compute_mode,
5897                                                                  mask, pos),
5898                                                      compute_mode),
5899                                  inner),
5900                      gen_binary (ASHIFT, compute_mode,
5901                                  gen_binary (AND, compute_mode,
5902                                              gen_lowpart
5903                                              (compute_mode, SET_SRC (x)),
5904                                              mask),
5905                                  pos)));
5906     }
5907
5908   return x;
5909 }
5910 \f
5911 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
5912    it is an RTX that represents a variable starting position; otherwise,
5913    POS is the (constant) starting bit position (counted from the LSB).
5914
5915    INNER may be a USE.  This will occur when we started with a bitfield
5916    that went outside the boundary of the object in memory, which is
5917    allowed on most machines.  To isolate this case, we produce a USE
5918    whose mode is wide enough and surround the MEM with it.  The only
5919    code that understands the USE is this routine.  If it is not removed,
5920    it will cause the resulting insn not to match.
5921
5922    UNSIGNEDP is nonzero for an unsigned reference and zero for a
5923    signed reference.
5924
5925    IN_DEST is nonzero if this is a reference in the destination of a
5926    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If nonzero,
5927    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
5928    be used.
5929
5930    IN_COMPARE is nonzero if we are in a COMPARE.  This means that a
5931    ZERO_EXTRACT should be built even for bits starting at bit 0.
5932
5933    MODE is the desired mode of the result (if IN_DEST == 0).
5934
5935    The result is an RTX for the extraction or NULL_RTX if the target
5936    can't handle it.  */
5937
5938 static rtx
5939 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
5940                  rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
5941                  int in_dest, int in_compare)
5942 {
5943   /* This mode describes the size of the storage area
5944      to fetch the overall value from.  Within that, we
5945      ignore the POS lowest bits, etc.  */
5946   enum machine_mode is_mode = GET_MODE (inner);
5947   enum machine_mode inner_mode;
5948   enum machine_mode wanted_inner_mode = byte_mode;
5949   enum machine_mode wanted_inner_reg_mode = word_mode;
5950   enum machine_mode pos_mode = word_mode;
5951   enum machine_mode extraction_mode = word_mode;
5952   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
5953   int spans_byte = 0;
5954   rtx new = 0;
5955   rtx orig_pos_rtx = pos_rtx;
5956   HOST_WIDE_INT orig_pos;
5957
5958   /* Get some information about INNER and get the innermost object.  */
5959   if (GET_CODE (inner) == USE)
5960     /* (use:SI (mem:QI foo)) stands for (mem:SI foo).  */
5961     /* We don't need to adjust the position because we set up the USE
5962        to pretend that it was a full-word object.  */
5963     spans_byte = 1, inner = XEXP (inner, 0);
5964   else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
5965     {
5966       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
5967          consider just the QI as the memory to extract from.
5968          The subreg adds or removes high bits; its mode is
5969          irrelevant to the meaning of this extraction,
5970          since POS and LEN count from the lsb.  */
5971       if (GET_CODE (SUBREG_REG (inner)) == MEM)
5972         is_mode = GET_MODE (SUBREG_REG (inner));
5973       inner = SUBREG_REG (inner);
5974     }
5975   else if (GET_CODE (inner) == ASHIFT
5976            && GET_CODE (XEXP (inner, 1)) == CONST_INT
5977            && pos_rtx == 0 && pos == 0
5978            && len > (unsigned HOST_WIDE_INT) INTVAL (XEXP (inner, 1)))
5979     {
5980       /* We're extracting the least significant bits of an rtx
5981          (ashift X (const_int C)), where LEN > C.  Extract the
5982          least significant (LEN - C) bits of X, giving an rtx
5983          whose mode is MODE, then shift it left C times.  */
5984       new = make_extraction (mode, XEXP (inner, 0),
5985                              0, 0, len - INTVAL (XEXP (inner, 1)),
5986                              unsignedp, in_dest, in_compare);
5987       if (new != 0)
5988         return gen_rtx_ASHIFT (mode, new, XEXP (inner, 1));
5989     }
5990
5991   inner_mode = GET_MODE (inner);
5992
5993   if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
5994     pos = INTVAL (pos_rtx), pos_rtx = 0;
5995
5996   /* See if this can be done without an extraction.  We never can if the
5997      width of the field is not the same as that of some integer mode. For
5998      registers, we can only avoid the extraction if the position is at the
5999      low-order bit and this is either not in the destination or we have the
6000      appropriate STRICT_LOW_PART operation available.
6001
6002      For MEM, we can avoid an extract if the field starts on an appropriate
6003      boundary and we can change the mode of the memory reference.  However,
6004      we cannot directly access the MEM if we have a USE and the underlying
6005      MEM is not TMODE.  This combination means that MEM was being used in a
6006      context where bits outside its mode were being referenced; that is only
6007      valid in bit-field insns.  */
6008
6009   if (tmode != BLKmode
6010       && ! (spans_byte && inner_mode != tmode)
6011       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
6012            && GET_CODE (inner) != MEM
6013            && (! in_dest
6014                || (GET_CODE (inner) == REG
6015                    && have_insn_for (STRICT_LOW_PART, tmode))))
6016           || (GET_CODE (inner) == MEM && pos_rtx == 0
6017               && (pos
6018                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
6019                      : BITS_PER_UNIT)) == 0
6020               /* We can't do this if we are widening INNER_MODE (it
6021                  may not be aligned, for one thing).  */
6022               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
6023               && (inner_mode == tmode
6024                   || (! mode_dependent_address_p (XEXP (inner, 0))
6025                       && ! MEM_VOLATILE_P (inner))))))
6026     {
6027       /* If INNER is a MEM, make a new MEM that encompasses just the desired
6028          field.  If the original and current mode are the same, we need not
6029          adjust the offset.  Otherwise, we do if bytes big endian.
6030
6031          If INNER is not a MEM, get a piece consisting of just the field
6032          of interest (in this case POS % BITS_PER_WORD must be 0).  */
6033
6034       if (GET_CODE (inner) == MEM)
6035         {
6036           HOST_WIDE_INT offset;
6037
6038           /* POS counts from lsb, but make OFFSET count in memory order.  */
6039           if (BYTES_BIG_ENDIAN)
6040             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
6041           else
6042             offset = pos / BITS_PER_UNIT;
6043
6044           new = adjust_address_nv (inner, tmode, offset);
6045         }
6046       else if (GET_CODE (inner) == REG)
6047         {
6048           if (tmode != inner_mode)
6049             {
6050               /* We can't call gen_lowpart in a DEST since we
6051                  always want a SUBREG (see below) and it would sometimes
6052                  return a new hard register.  */
6053               if (pos || in_dest)
6054                 {
6055                   HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
6056
6057                   if (WORDS_BIG_ENDIAN
6058                       && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
6059                     final_word = ((GET_MODE_SIZE (inner_mode)
6060                                    - GET_MODE_SIZE (tmode))
6061                                   / UNITS_PER_WORD) - final_word;
6062
6063                   final_word *= UNITS_PER_WORD;
6064                   if (BYTES_BIG_ENDIAN &&
6065                       GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
6066                     final_word += (GET_MODE_SIZE (inner_mode)
6067                                    - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
6068
6069                   /* Avoid creating invalid subregs, for example when
6070                      simplifying (x>>32)&255.  */
6071                   if (final_word >= GET_MODE_SIZE (inner_mode))
6072                     return NULL_RTX;
6073
6074                   new = gen_rtx_SUBREG (tmode, inner, final_word);
6075                 }
6076               else
6077                 new = gen_lowpart (tmode, inner);
6078             }
6079           else
6080             new = inner;
6081         }
6082       else
6083         new = force_to_mode (inner, tmode,
6084                              len >= HOST_BITS_PER_WIDE_INT
6085                              ? ~(unsigned HOST_WIDE_INT) 0
6086                              : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
6087                              NULL_RTX, 0);
6088
6089       /* If this extraction is going into the destination of a SET,
6090          make a STRICT_LOW_PART unless we made a MEM.  */
6091
6092       if (in_dest)
6093         return (GET_CODE (new) == MEM ? new
6094                 : (GET_CODE (new) != SUBREG
6095                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
6096                    : gen_rtx_STRICT_LOW_PART (VOIDmode, new)));
6097
6098       if (mode == tmode)
6099         return new;
6100
6101       if (GET_CODE (new) == CONST_INT)
6102         return gen_int_mode (INTVAL (new), mode);
6103
6104       /* If we know that no extraneous bits are set, and that the high
6105          bit is not set, convert the extraction to the cheaper of
6106          sign and zero extension, that are equivalent in these cases.  */
6107       if (flag_expensive_optimizations
6108           && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
6109               && ((nonzero_bits (new, tmode)
6110                    & ~(((unsigned HOST_WIDE_INT)
6111                         GET_MODE_MASK (tmode))
6112                        >> 1))
6113                   == 0)))
6114         {
6115           rtx temp = gen_rtx_ZERO_EXTEND (mode, new);
6116           rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new);
6117
6118           /* Prefer ZERO_EXTENSION, since it gives more information to
6119              backends.  */
6120           if (rtx_cost (temp, SET) <= rtx_cost (temp1, SET))
6121             return temp;
6122           return temp1;
6123         }
6124
6125       /* Otherwise, sign- or zero-extend unless we already are in the
6126          proper mode.  */
6127
6128       return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6129                              mode, new));
6130     }
6131
6132   /* Unless this is a COMPARE or we have a funny memory reference,
6133      don't do anything with zero-extending field extracts starting at
6134      the low-order bit since they are simple AND operations.  */
6135   if (pos_rtx == 0 && pos == 0 && ! in_dest
6136       && ! in_compare && ! spans_byte && unsignedp)
6137     return 0;
6138
6139   /* Unless we are allowed to span bytes or INNER is not MEM, reject this if
6140      we would be spanning bytes or if the position is not a constant and the
6141      length is not 1.  In all other cases, we would only be going outside
6142      our object in cases when an original shift would have been
6143      undefined.  */
6144   if (! spans_byte && GET_CODE (inner) == MEM
6145       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6146           || (pos_rtx != 0 && len != 1)))
6147     return 0;
6148
6149   /* Get the mode to use should INNER not be a MEM, the mode for the position,
6150      and the mode for the result.  */
6151   if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
6152     {
6153       wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6154       pos_mode = mode_for_extraction (EP_insv, 2);
6155       extraction_mode = mode_for_extraction (EP_insv, 3);
6156     }
6157
6158   if (! in_dest && unsignedp
6159       && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
6160     {
6161       wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6162       pos_mode = mode_for_extraction (EP_extzv, 3);
6163       extraction_mode = mode_for_extraction (EP_extzv, 0);
6164     }
6165
6166   if (! in_dest && ! unsignedp
6167       && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
6168     {
6169       wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6170       pos_mode = mode_for_extraction (EP_extv, 3);
6171       extraction_mode = mode_for_extraction (EP_extv, 0);
6172     }
6173
6174   /* Never narrow an object, since that might not be safe.  */
6175
6176   if (mode != VOIDmode
6177       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6178     extraction_mode = mode;
6179
6180   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6181       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6182     pos_mode = GET_MODE (pos_rtx);
6183
6184   /* If this is not from memory, the desired mode is wanted_inner_reg_mode;
6185      if we have to change the mode of memory and cannot, the desired mode is
6186      EXTRACTION_MODE.  */
6187   if (GET_CODE (inner) != MEM)
6188     wanted_inner_mode = wanted_inner_reg_mode;
6189   else if (inner_mode != wanted_inner_mode
6190            && (mode_dependent_address_p (XEXP (inner, 0))
6191                || MEM_VOLATILE_P (inner)))
6192     wanted_inner_mode = extraction_mode;
6193
6194   orig_pos = pos;
6195
6196   if (BITS_BIG_ENDIAN)
6197     {
6198       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6199          BITS_BIG_ENDIAN style.  If position is constant, compute new
6200          position.  Otherwise, build subtraction.
6201          Note that POS is relative to the mode of the original argument.
6202          If it's a MEM we need to recompute POS relative to that.
6203          However, if we're extracting from (or inserting into) a register,
6204          we want to recompute POS relative to wanted_inner_mode.  */
6205       int width = (GET_CODE (inner) == MEM
6206                    ? GET_MODE_BITSIZE (is_mode)
6207                    : GET_MODE_BITSIZE (wanted_inner_mode));
6208
6209       if (pos_rtx == 0)
6210         pos = width - len - pos;
6211       else
6212         pos_rtx
6213           = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
6214       /* POS may be less than 0 now, but we check for that below.
6215          Note that it can only be less than 0 if GET_CODE (inner) != MEM.  */
6216     }
6217
6218   /* If INNER has a wider mode, make it smaller.  If this is a constant
6219      extract, try to adjust the byte to point to the byte containing
6220      the value.  */
6221   if (wanted_inner_mode != VOIDmode
6222       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
6223       && ((GET_CODE (inner) == MEM
6224            && (inner_mode == wanted_inner_mode
6225                || (! mode_dependent_address_p (XEXP (inner, 0))
6226                    && ! MEM_VOLATILE_P (inner))))))
6227     {
6228       int offset = 0;
6229
6230       /* The computations below will be correct if the machine is big
6231          endian in both bits and bytes or little endian in bits and bytes.
6232          If it is mixed, we must adjust.  */
6233
6234       /* If bytes are big endian and we had a paradoxical SUBREG, we must
6235          adjust OFFSET to compensate.  */
6236       if (BYTES_BIG_ENDIAN
6237           && ! spans_byte
6238           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6239         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
6240
6241       /* If this is a constant position, we can move to the desired byte.  */
6242       if (pos_rtx == 0)
6243         {
6244           offset += pos / BITS_PER_UNIT;
6245           pos %= GET_MODE_BITSIZE (wanted_inner_mode);
6246         }
6247
6248       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6249           && ! spans_byte
6250           && is_mode != wanted_inner_mode)
6251         offset = (GET_MODE_SIZE (is_mode)
6252                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
6253
6254       if (offset != 0 || inner_mode != wanted_inner_mode)
6255         inner = adjust_address_nv (inner, wanted_inner_mode, offset);
6256     }
6257
6258   /* If INNER is not memory, we can always get it into the proper mode.  If we
6259      are changing its mode, POS must be a constant and smaller than the size
6260      of the new mode.  */
6261   else if (GET_CODE (inner) != MEM)
6262     {
6263       if (GET_MODE (inner) != wanted_inner_mode
6264           && (pos_rtx != 0
6265               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6266         return 0;
6267
6268       inner = force_to_mode (inner, wanted_inner_mode,
6269                              pos_rtx
6270                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
6271                              ? ~(unsigned HOST_WIDE_INT) 0
6272                              : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6273                                 << orig_pos),
6274                              NULL_RTX, 0);
6275     }
6276
6277   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
6278      have to zero extend.  Otherwise, we can just use a SUBREG.  */
6279   if (pos_rtx != 0
6280       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
6281     {
6282       rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
6283
6284       /* If we know that no extraneous bits are set, and that the high
6285          bit is not set, convert extraction to cheaper one - either
6286          SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6287          cases.  */
6288       if (flag_expensive_optimizations
6289           && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6290               && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
6291                    & ~(((unsigned HOST_WIDE_INT)
6292                         GET_MODE_MASK (GET_MODE (pos_rtx)))
6293                        >> 1))
6294                   == 0)))
6295         {
6296           rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
6297
6298           /* Prefer ZERO_EXTENSION, since it gives more information to
6299              backends.  */
6300           if (rtx_cost (temp1, SET) < rtx_cost (temp, SET))
6301             temp = temp1;
6302         }
6303       pos_rtx = temp;
6304     }
6305   else if (pos_rtx != 0
6306            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6307     pos_rtx = gen_lowpart (pos_mode, pos_rtx);
6308
6309   /* Make POS_RTX unless we already have it and it is correct.  If we don't
6310      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
6311      be a CONST_INT.  */
6312   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
6313     pos_rtx = orig_pos_rtx;
6314
6315   else if (pos_rtx == 0)
6316     pos_rtx = GEN_INT (pos);
6317
6318   /* Make the required operation.  See if we can use existing rtx.  */
6319   new = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
6320                          extraction_mode, inner, GEN_INT (len), pos_rtx);
6321   if (! in_dest)
6322     new = gen_lowpart (mode, new);
6323
6324   return new;
6325 }
6326 \f
6327 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
6328    with any other operations in X.  Return X without that shift if so.  */
6329
6330 static rtx
6331 extract_left_shift (rtx x, int count)
6332 {
6333   enum rtx_code code = GET_CODE (x);
6334   enum machine_mode mode = GET_MODE (x);
6335   rtx tem;
6336
6337   switch (code)
6338     {
6339     case ASHIFT:
6340       /* This is the shift itself.  If it is wide enough, we will return
6341          either the value being shifted if the shift count is equal to
6342          COUNT or a shift for the difference.  */
6343       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6344           && INTVAL (XEXP (x, 1)) >= count)
6345         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
6346                                      INTVAL (XEXP (x, 1)) - count);
6347       break;
6348
6349     case NEG:  case NOT:
6350       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6351         return simplify_gen_unary (code, mode, tem, mode);
6352
6353       break;
6354
6355     case PLUS:  case IOR:  case XOR:  case AND:
6356       /* If we can safely shift this constant and we find the inner shift,
6357          make a new operation.  */
6358       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6359           && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
6360           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6361         return gen_binary (code, mode, tem,
6362                            GEN_INT (INTVAL (XEXP (x, 1)) >> count));
6363
6364       break;
6365
6366     default:
6367       break;
6368     }
6369
6370   return 0;
6371 }
6372 \f
6373 /* Look at the expression rooted at X.  Look for expressions
6374    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
6375    Form these expressions.
6376
6377    Return the new rtx, usually just X.
6378
6379    Also, for machines like the VAX that don't have logical shift insns,
6380    try to convert logical to arithmetic shift operations in cases where
6381    they are equivalent.  This undoes the canonicalizations to logical
6382    shifts done elsewhere.
6383
6384    We try, as much as possible, to re-use rtl expressions to save memory.
6385
6386    IN_CODE says what kind of expression we are processing.  Normally, it is
6387    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
6388    being kludges), it is MEM.  When processing the arguments of a comparison
6389    or a COMPARE against zero, it is COMPARE.  */
6390
6391 static rtx
6392 make_compound_operation (rtx x, enum rtx_code in_code)
6393 {
6394   enum rtx_code code = GET_CODE (x);
6395   enum machine_mode mode = GET_MODE (x);
6396   int mode_width = GET_MODE_BITSIZE (mode);
6397   rtx rhs, lhs;
6398   enum rtx_code next_code;
6399   int i;
6400   rtx new = 0;
6401   rtx tem;
6402   const char *fmt;
6403
6404   /* Select the code to be used in recursive calls.  Once we are inside an
6405      address, we stay there.  If we have a comparison, set to COMPARE,
6406      but once inside, go back to our default of SET.  */
6407
6408   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
6409                : ((code == COMPARE || COMPARISON_P (x))
6410                   && XEXP (x, 1) == const0_rtx) ? COMPARE
6411                : in_code == COMPARE ? SET : in_code);
6412
6413   /* Process depending on the code of this operation.  If NEW is set
6414      nonzero, it will be returned.  */
6415
6416   switch (code)
6417     {
6418     case ASHIFT:
6419       /* Convert shifts by constants into multiplications if inside
6420          an address.  */
6421       if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
6422           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6423           && INTVAL (XEXP (x, 1)) >= 0)
6424         {
6425           new = make_compound_operation (XEXP (x, 0), next_code);
6426           new = gen_rtx_MULT (mode, new,
6427                               GEN_INT ((HOST_WIDE_INT) 1
6428                                        << INTVAL (XEXP (x, 1))));
6429         }
6430       break;
6431
6432     case AND:
6433       /* If the second operand is not a constant, we can't do anything
6434          with it.  */
6435       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6436         break;
6437
6438       /* If the constant is a power of two minus one and the first operand
6439          is a logical right shift, make an extraction.  */
6440       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6441           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6442         {
6443           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6444           new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1,
6445                                  0, in_code == COMPARE);
6446         }
6447
6448       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
6449       else if (GET_CODE (XEXP (x, 0)) == SUBREG
6450                && subreg_lowpart_p (XEXP (x, 0))
6451                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
6452                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6453         {
6454           new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
6455                                          next_code);
6456           new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0,
6457                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
6458                                  0, in_code == COMPARE);
6459         }
6460       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
6461       else if ((GET_CODE (XEXP (x, 0)) == XOR
6462                 || GET_CODE (XEXP (x, 0)) == IOR)
6463                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
6464                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
6465                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6466         {
6467           /* Apply the distributive law, and then try to make extractions.  */
6468           new = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
6469                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
6470                                              XEXP (x, 1)),
6471                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
6472                                              XEXP (x, 1)));
6473           new = make_compound_operation (new, in_code);
6474         }
6475
6476       /* If we are have (and (rotate X C) M) and C is larger than the number
6477          of bits in M, this is an extraction.  */
6478
6479       else if (GET_CODE (XEXP (x, 0)) == ROTATE
6480                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6481                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
6482                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
6483         {
6484           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6485           new = make_extraction (mode, new,
6486                                  (GET_MODE_BITSIZE (mode)
6487                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
6488                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
6489         }
6490
6491       /* On machines without logical shifts, if the operand of the AND is
6492          a logical shift and our mask turns off all the propagated sign
6493          bits, we can replace the logical shift with an arithmetic shift.  */
6494       else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6495                && !have_insn_for (LSHIFTRT, mode)
6496                && have_insn_for (ASHIFTRT, mode)
6497                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6498                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6499                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6500                && mode_width <= HOST_BITS_PER_WIDE_INT)
6501         {
6502           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
6503
6504           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
6505           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
6506             SUBST (XEXP (x, 0),
6507                    gen_rtx_ASHIFTRT (mode,
6508                                      make_compound_operation
6509                                      (XEXP (XEXP (x, 0), 0), next_code),
6510                                      XEXP (XEXP (x, 0), 1)));
6511         }
6512
6513       /* If the constant is one less than a power of two, this might be
6514          representable by an extraction even if no shift is present.
6515          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
6516          we are in a COMPARE.  */
6517       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6518         new = make_extraction (mode,
6519                                make_compound_operation (XEXP (x, 0),
6520                                                         next_code),
6521                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
6522
6523       /* If we are in a comparison and this is an AND with a power of two,
6524          convert this into the appropriate bit extract.  */
6525       else if (in_code == COMPARE
6526                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
6527         new = make_extraction (mode,
6528                                make_compound_operation (XEXP (x, 0),
6529                                                         next_code),
6530                                i, NULL_RTX, 1, 1, 0, 1);
6531
6532       break;
6533
6534     case LSHIFTRT:
6535       /* If the sign bit is known to be zero, replace this with an
6536          arithmetic shift.  */
6537       if (have_insn_for (ASHIFTRT, mode)
6538           && ! have_insn_for (LSHIFTRT, mode)
6539           && mode_width <= HOST_BITS_PER_WIDE_INT
6540           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
6541         {
6542           new = gen_rtx_ASHIFTRT (mode,
6543                                   make_compound_operation (XEXP (x, 0),
6544                                                            next_code),
6545                                   XEXP (x, 1));
6546           break;
6547         }
6548
6549       /* ... fall through ...  */
6550
6551     case ASHIFTRT:
6552       lhs = XEXP (x, 0);
6553       rhs = XEXP (x, 1);
6554
6555       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
6556          this is a SIGN_EXTRACT.  */
6557       if (GET_CODE (rhs) == CONST_INT
6558           && GET_CODE (lhs) == ASHIFT
6559           && GET_CODE (XEXP (lhs, 1)) == CONST_INT
6560           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)))
6561         {
6562           new = make_compound_operation (XEXP (lhs, 0), next_code);
6563           new = make_extraction (mode, new,
6564                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
6565                                  NULL_RTX, mode_width - INTVAL (rhs),
6566                                  code == LSHIFTRT, 0, in_code == COMPARE);
6567           break;
6568         }
6569
6570       /* See if we have operations between an ASHIFTRT and an ASHIFT.
6571          If so, try to merge the shifts into a SIGN_EXTEND.  We could
6572          also do this for some cases of SIGN_EXTRACT, but it doesn't
6573          seem worth the effort; the case checked for occurs on Alpha.  */
6574
6575       if (!OBJECT_P (lhs)
6576           && ! (GET_CODE (lhs) == SUBREG
6577                 && (OBJECT_P (SUBREG_REG (lhs))))
6578           && GET_CODE (rhs) == CONST_INT
6579           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
6580           && (new = extract_left_shift (lhs, INTVAL (rhs))) != 0)
6581         new = make_extraction (mode, make_compound_operation (new, next_code),
6582                                0, NULL_RTX, mode_width - INTVAL (rhs),
6583                                code == LSHIFTRT, 0, in_code == COMPARE);
6584
6585       break;
6586
6587     case SUBREG:
6588       /* Call ourselves recursively on the inner expression.  If we are
6589          narrowing the object and it has a different RTL code from
6590          what it originally did, do this SUBREG as a force_to_mode.  */
6591
6592       tem = make_compound_operation (SUBREG_REG (x), in_code);
6593       if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
6594           && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
6595           && subreg_lowpart_p (x))
6596         {
6597           rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
6598                                      NULL_RTX, 0);
6599
6600           /* If we have something other than a SUBREG, we might have
6601              done an expansion, so rerun ourselves.  */
6602           if (GET_CODE (newer) != SUBREG)
6603             newer = make_compound_operation (newer, in_code);
6604
6605           return newer;
6606         }
6607
6608       /* If this is a paradoxical subreg, and the new code is a sign or
6609          zero extension, omit the subreg and widen the extension.  If it
6610          is a regular subreg, we can still get rid of the subreg by not
6611          widening so much, or in fact removing the extension entirely.  */
6612       if ((GET_CODE (tem) == SIGN_EXTEND
6613            || GET_CODE (tem) == ZERO_EXTEND)
6614           && subreg_lowpart_p (x))
6615         {
6616           if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
6617               || (GET_MODE_SIZE (mode) >
6618                   GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
6619             {
6620               if (! SCALAR_INT_MODE_P (mode))
6621                 break;
6622               tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0));
6623             }
6624           else
6625             tem = gen_lowpart (mode, XEXP (tem, 0));
6626           return tem;
6627         }
6628       break;
6629
6630     default:
6631       break;
6632     }
6633
6634   if (new)
6635     {
6636       x = gen_lowpart (mode, new);
6637       code = GET_CODE (x);
6638     }
6639
6640   /* Now recursively process each operand of this operation.  */
6641   fmt = GET_RTX_FORMAT (code);
6642   for (i = 0; i < GET_RTX_LENGTH (code); i++)
6643     if (fmt[i] == 'e')
6644       {
6645         new = make_compound_operation (XEXP (x, i), next_code);
6646         SUBST (XEXP (x, i), new);
6647       }
6648
6649   return x;
6650 }
6651 \f
6652 /* Given M see if it is a value that would select a field of bits
6653    within an item, but not the entire word.  Return -1 if not.
6654    Otherwise, return the starting position of the field, where 0 is the
6655    low-order bit.
6656
6657    *PLEN is set to the length of the field.  */
6658
6659 static int
6660 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
6661 {
6662   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
6663   int pos = exact_log2 (m & -m);
6664   int len = 0;
6665
6666   if (pos >= 0)
6667     /* Now shift off the low-order zero bits and see if we have a
6668        power of two minus 1.  */
6669     len = exact_log2 ((m >> pos) + 1);
6670
6671   if (len <= 0)
6672     pos = -1;
6673
6674   *plen = len;
6675   return pos;
6676 }
6677 \f
6678 /* See if X can be simplified knowing that we will only refer to it in
6679    MODE and will only refer to those bits that are nonzero in MASK.
6680    If other bits are being computed or if masking operations are done
6681    that select a superset of the bits in MASK, they can sometimes be
6682    ignored.
6683
6684    Return a possibly simplified expression, but always convert X to
6685    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
6686
6687    Also, if REG is nonzero and X is a register equal in value to REG,
6688    replace X with REG.
6689
6690    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
6691    are all off in X.  This is used when X will be complemented, by either
6692    NOT, NEG, or XOR.  */
6693
6694 static rtx
6695 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
6696                rtx reg, int just_select)
6697 {
6698   enum rtx_code code = GET_CODE (x);
6699   int next_select = just_select || code == XOR || code == NOT || code == NEG;
6700   enum machine_mode op_mode;
6701   unsigned HOST_WIDE_INT fuller_mask, nonzero;
6702   rtx op0, op1, temp;
6703
6704   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
6705      code below will do the wrong thing since the mode of such an
6706      expression is VOIDmode.
6707
6708      Also do nothing if X is a CLOBBER; this can happen if X was
6709      the return value from a call to gen_lowpart.  */
6710   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
6711     return x;
6712
6713   /* We want to perform the operation is its present mode unless we know
6714      that the operation is valid in MODE, in which case we do the operation
6715      in MODE.  */
6716   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
6717               && have_insn_for (code, mode))
6718              ? mode : GET_MODE (x));
6719
6720   /* It is not valid to do a right-shift in a narrower mode
6721      than the one it came in with.  */
6722   if ((code == LSHIFTRT || code == ASHIFTRT)
6723       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
6724     op_mode = GET_MODE (x);
6725
6726   /* Truncate MASK to fit OP_MODE.  */
6727   if (op_mode)
6728     mask &= GET_MODE_MASK (op_mode);
6729
6730   /* When we have an arithmetic operation, or a shift whose count we
6731      do not know, we need to assume that all bits up to the highest-order
6732      bit in MASK will be needed.  This is how we form such a mask.  */
6733   if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
6734     fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
6735   else
6736     fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
6737                    - 1);
6738
6739   /* Determine what bits of X are guaranteed to be (non)zero.  */
6740   nonzero = nonzero_bits (x, mode);
6741
6742   /* If none of the bits in X are needed, return a zero.  */
6743   if (! just_select && (nonzero & mask) == 0)
6744     x = const0_rtx;
6745
6746   /* If X is a CONST_INT, return a new one.  Do this here since the
6747      test below will fail.  */
6748   if (GET_CODE (x) == CONST_INT)
6749     {
6750       if (SCALAR_INT_MODE_P (mode))
6751         return gen_int_mode (INTVAL (x) & mask, mode);
6752       else
6753         {
6754           x = GEN_INT (INTVAL (x) & mask);
6755           return gen_lowpart_common (mode, x);
6756         }
6757     }
6758
6759   /* If X is narrower than MODE and we want all the bits in X's mode, just
6760      get X in the proper mode.  */
6761   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
6762       && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
6763     return gen_lowpart (mode, x);
6764
6765   /* If we aren't changing the mode, X is not a SUBREG, and all zero bits in
6766      MASK are already known to be zero in X, we need not do anything.  */
6767   if (GET_MODE (x) == mode && code != SUBREG && (~mask & nonzero) == 0)
6768     return x;
6769
6770   switch (code)
6771     {
6772     case CLOBBER:
6773       /* If X is a (clobber (const_int)), return it since we know we are
6774          generating something that won't match.  */
6775       return x;
6776
6777     case USE:
6778       /* X is a (use (mem ..)) that was made from a bit-field extraction that
6779          spanned the boundary of the MEM.  If we are now masking so it is
6780          within that boundary, we don't need the USE any more.  */
6781       if (! BITS_BIG_ENDIAN
6782           && (mask & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6783         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6784       break;
6785
6786     case SIGN_EXTEND:
6787     case ZERO_EXTEND:
6788     case ZERO_EXTRACT:
6789     case SIGN_EXTRACT:
6790       x = expand_compound_operation (x);
6791       if (GET_CODE (x) != code)
6792         return force_to_mode (x, mode, mask, reg, next_select);
6793       break;
6794
6795     case REG:
6796       if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
6797                        || rtx_equal_p (reg, get_last_value (x))))
6798         x = reg;
6799       break;
6800
6801     case SUBREG:
6802       if (subreg_lowpart_p (x)
6803           /* We can ignore the effect of this SUBREG if it narrows the mode or
6804              if the constant masks to zero all the bits the mode doesn't
6805              have.  */
6806           && ((GET_MODE_SIZE (GET_MODE (x))
6807                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
6808               || (0 == (mask
6809                         & GET_MODE_MASK (GET_MODE (x))
6810                         & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
6811         return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select);
6812       break;
6813
6814     case AND:
6815       /* If this is an AND with a constant, convert it into an AND
6816          whose constant is the AND of that constant with MASK.  If it
6817          remains an AND of MASK, delete it since it is redundant.  */
6818
6819       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6820         {
6821           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
6822                                       mask & INTVAL (XEXP (x, 1)));
6823
6824           /* If X is still an AND, see if it is an AND with a mask that
6825              is just some low-order bits.  If so, and it is MASK, we don't
6826              need it.  */
6827
6828           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6829               && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
6830                   == mask))
6831             x = XEXP (x, 0);
6832
6833           /* If it remains an AND, try making another AND with the bits
6834              in the mode mask that aren't in MASK turned on.  If the
6835              constant in the AND is wide enough, this might make a
6836              cheaper constant.  */
6837
6838           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6839               && GET_MODE_MASK (GET_MODE (x)) != mask
6840               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
6841             {
6842               HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
6843                                     | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
6844               int width = GET_MODE_BITSIZE (GET_MODE (x));
6845               rtx y;
6846
6847               /* If MODE is narrower than HOST_WIDE_INT and CVAL is a negative
6848                  number, sign extend it.  */
6849               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
6850                   && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6851                 cval |= (HOST_WIDE_INT) -1 << width;
6852
6853               y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval));
6854               if (rtx_cost (y, SET) < rtx_cost (x, SET))
6855                 x = y;
6856             }
6857
6858           break;
6859         }
6860
6861       goto binop;
6862
6863     case PLUS:
6864       /* In (and (plus FOO C1) M), if M is a mask that just turns off
6865          low-order bits (as in an alignment operation) and FOO is already
6866          aligned to that boundary, mask C1 to that boundary as well.
6867          This may eliminate that PLUS and, later, the AND.  */
6868
6869       {
6870         unsigned int width = GET_MODE_BITSIZE (mode);
6871         unsigned HOST_WIDE_INT smask = mask;
6872
6873         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
6874            number, sign extend it.  */
6875
6876         if (width < HOST_BITS_PER_WIDE_INT
6877             && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6878           smask |= (HOST_WIDE_INT) -1 << width;
6879
6880         if (GET_CODE (XEXP (x, 1)) == CONST_INT
6881             && exact_log2 (- smask) >= 0
6882             && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
6883             && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
6884           return force_to_mode (plus_constant (XEXP (x, 0),
6885                                                (INTVAL (XEXP (x, 1)) & smask)),
6886                                 mode, smask, reg, next_select);
6887       }
6888
6889       /* ... fall through ...  */
6890
6891     case MULT:
6892       /* For PLUS, MINUS and MULT, we need any bits less significant than the
6893          most significant bit in MASK since carries from those bits will
6894          affect the bits we are interested in.  */
6895       mask = fuller_mask;
6896       goto binop;
6897
6898     case MINUS:
6899       /* If X is (minus C Y) where C's least set bit is larger than any bit
6900          in the mask, then we may replace with (neg Y).  */
6901       if (GET_CODE (XEXP (x, 0)) == CONST_INT
6902           && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
6903                                         & -INTVAL (XEXP (x, 0))))
6904               > mask))
6905         {
6906           x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
6907                                   GET_MODE (x));
6908           return force_to_mode (x, mode, mask, reg, next_select);
6909         }
6910
6911       /* Similarly, if C contains every bit in the fuller_mask, then we may
6912          replace with (not Y).  */
6913       if (GET_CODE (XEXP (x, 0)) == CONST_INT
6914           && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) fuller_mask)
6915               == INTVAL (XEXP (x, 0))))
6916         {
6917           x = simplify_gen_unary (NOT, GET_MODE (x),
6918                                   XEXP (x, 1), GET_MODE (x));
6919           return force_to_mode (x, mode, mask, reg, next_select);
6920         }
6921
6922       mask = fuller_mask;
6923       goto binop;
6924
6925     case IOR:
6926     case XOR:
6927       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
6928          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
6929          operation which may be a bitfield extraction.  Ensure that the
6930          constant we form is not wider than the mode of X.  */
6931
6932       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6933           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6934           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6935           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6936           && GET_CODE (XEXP (x, 1)) == CONST_INT
6937           && ((INTVAL (XEXP (XEXP (x, 0), 1))
6938                + floor_log2 (INTVAL (XEXP (x, 1))))
6939               < GET_MODE_BITSIZE (GET_MODE (x)))
6940           && (INTVAL (XEXP (x, 1))
6941               & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
6942         {
6943           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
6944                           << INTVAL (XEXP (XEXP (x, 0), 1)));
6945           temp = gen_binary (GET_CODE (x), GET_MODE (x),
6946                              XEXP (XEXP (x, 0), 0), temp);
6947           x = gen_binary (LSHIFTRT, GET_MODE (x), temp,
6948                           XEXP (XEXP (x, 0), 1));
6949           return force_to_mode (x, mode, mask, reg, next_select);
6950         }
6951
6952     binop:
6953       /* For most binary operations, just propagate into the operation and
6954          change the mode if we have an operation of that mode.  */
6955
6956       op0 = gen_lowpart (op_mode,
6957                          force_to_mode (XEXP (x, 0), mode, mask,
6958                                         reg, next_select));
6959       op1 = gen_lowpart (op_mode,
6960                          force_to_mode (XEXP (x, 1), mode, mask,
6961                                         reg, next_select));
6962
6963       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
6964         x = gen_binary (code, op_mode, op0, op1);
6965       break;
6966
6967     case ASHIFT:
6968       /* For left shifts, do the same, but just for the first operand.
6969          However, we cannot do anything with shifts where we cannot
6970          guarantee that the counts are smaller than the size of the mode
6971          because such a count will have a different meaning in a
6972          wider mode.  */
6973
6974       if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
6975              && INTVAL (XEXP (x, 1)) >= 0
6976              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
6977           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
6978                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
6979                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
6980         break;
6981
6982       /* If the shift count is a constant and we can do arithmetic in
6983          the mode of the shift, refine which bits we need.  Otherwise, use the
6984          conservative form of the mask.  */
6985       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6986           && INTVAL (XEXP (x, 1)) >= 0
6987           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
6988           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
6989         mask >>= INTVAL (XEXP (x, 1));
6990       else
6991         mask = fuller_mask;
6992
6993       op0 = gen_lowpart (op_mode,
6994                          force_to_mode (XEXP (x, 0), op_mode,
6995                                         mask, reg, next_select));
6996
6997       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
6998         x = gen_binary (code, op_mode, op0, XEXP (x, 1));
6999       break;
7000
7001     case LSHIFTRT:
7002       /* Here we can only do something if the shift count is a constant,
7003          this shift constant is valid for the host, and we can do arithmetic
7004          in OP_MODE.  */
7005
7006       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7007           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7008           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7009         {
7010           rtx inner = XEXP (x, 0);
7011           unsigned HOST_WIDE_INT inner_mask;
7012
7013           /* Select the mask of the bits we need for the shift operand.  */
7014           inner_mask = mask << INTVAL (XEXP (x, 1));
7015
7016           /* We can only change the mode of the shift if we can do arithmetic
7017              in the mode of the shift and INNER_MASK is no wider than the
7018              width of OP_MODE.  */
7019           if (GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT
7020               || (inner_mask & ~GET_MODE_MASK (op_mode)) != 0)
7021             op_mode = GET_MODE (x);
7022
7023           inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
7024
7025           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
7026             x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
7027         }
7028
7029       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
7030          shift and AND produces only copies of the sign bit (C2 is one less
7031          than a power of two), we can do this with just a shift.  */
7032
7033       if (GET_CODE (x) == LSHIFTRT
7034           && GET_CODE (XEXP (x, 1)) == CONST_INT
7035           /* The shift puts one of the sign bit copies in the least significant
7036              bit.  */
7037           && ((INTVAL (XEXP (x, 1))
7038                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
7039               >= GET_MODE_BITSIZE (GET_MODE (x)))
7040           && exact_log2 (mask + 1) >= 0
7041           /* Number of bits left after the shift must be more than the mask
7042              needs.  */
7043           && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
7044               <= GET_MODE_BITSIZE (GET_MODE (x)))
7045           /* Must be more sign bit copies than the mask needs.  */
7046           && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
7047               >= exact_log2 (mask + 1)))
7048         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7049                         GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
7050                                  - exact_log2 (mask + 1)));
7051
7052       goto shiftrt;
7053
7054     case ASHIFTRT:
7055       /* If we are just looking for the sign bit, we don't need this shift at
7056          all, even if it has a variable count.  */
7057       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7058           && (mask == ((unsigned HOST_WIDE_INT) 1
7059                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7060         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7061
7062       /* If this is a shift by a constant, get a mask that contains those bits
7063          that are not copies of the sign bit.  We then have two cases:  If
7064          MASK only includes those bits, this can be a logical shift, which may
7065          allow simplifications.  If MASK is a single-bit field not within
7066          those bits, we are requesting a copy of the sign bit and hence can
7067          shift the sign bit to the appropriate location.  */
7068
7069       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0
7070           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7071         {
7072           int i = -1;
7073
7074           /* If the considered data is wider than HOST_WIDE_INT, we can't
7075              represent a mask for all its bits in a single scalar.
7076              But we only care about the lower bits, so calculate these.  */
7077
7078           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
7079             {
7080               nonzero = ~(HOST_WIDE_INT) 0;
7081
7082               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7083                  is the number of bits a full-width mask would have set.
7084                  We need only shift if these are fewer than nonzero can
7085                  hold.  If not, we must keep all bits set in nonzero.  */
7086
7087               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7088                   < HOST_BITS_PER_WIDE_INT)
7089                 nonzero >>= INTVAL (XEXP (x, 1))
7090                             + HOST_BITS_PER_WIDE_INT
7091                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
7092             }
7093           else
7094             {
7095               nonzero = GET_MODE_MASK (GET_MODE (x));
7096               nonzero >>= INTVAL (XEXP (x, 1));
7097             }
7098
7099           if ((mask & ~nonzero) == 0
7100               || (i = exact_log2 (mask)) >= 0)
7101             {
7102               x = simplify_shift_const
7103                 (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7104                  i < 0 ? INTVAL (XEXP (x, 1))
7105                  : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
7106
7107               if (GET_CODE (x) != ASHIFTRT)
7108                 return force_to_mode (x, mode, mask, reg, next_select);
7109             }
7110         }
7111
7112       /* If MASK is 1, convert this to an LSHIFTRT.  This can be done
7113          even if the shift count isn't a constant.  */
7114       if (mask == 1)
7115         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1));
7116
7117     shiftrt:
7118
7119       /* If this is a zero- or sign-extension operation that just affects bits
7120          we don't care about, remove it.  Be sure the call above returned
7121          something that is still a shift.  */
7122
7123       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
7124           && GET_CODE (XEXP (x, 1)) == CONST_INT
7125           && INTVAL (XEXP (x, 1)) >= 0
7126           && (INTVAL (XEXP (x, 1))
7127               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
7128           && GET_CODE (XEXP (x, 0)) == ASHIFT
7129           && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
7130         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
7131                               reg, next_select);
7132
7133       break;
7134
7135     case ROTATE:
7136     case ROTATERT:
7137       /* If the shift count is constant and we can do computations
7138          in the mode of X, compute where the bits we care about are.
7139          Otherwise, we can't do anything.  Don't change the mode of
7140          the shift or propagate MODE into the shift, though.  */
7141       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7142           && INTVAL (XEXP (x, 1)) >= 0)
7143         {
7144           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
7145                                             GET_MODE (x), GEN_INT (mask),
7146                                             XEXP (x, 1));
7147           if (temp && GET_CODE (temp) == CONST_INT)
7148             SUBST (XEXP (x, 0),
7149                    force_to_mode (XEXP (x, 0), GET_MODE (x),
7150                                   INTVAL (temp), reg, next_select));
7151         }
7152       break;
7153
7154     case NEG:
7155       /* If we just want the low-order bit, the NEG isn't needed since it
7156          won't change the low-order bit.  */
7157       if (mask == 1)
7158         return force_to_mode (XEXP (x, 0), mode, mask, reg, just_select);
7159
7160       /* We need any bits less significant than the most significant bit in
7161          MASK since carries from those bits will affect the bits we are
7162          interested in.  */
7163       mask = fuller_mask;
7164       goto unop;
7165
7166     case NOT:
7167       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
7168          same as the XOR case above.  Ensure that the constant we form is not
7169          wider than the mode of X.  */
7170
7171       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7172           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7173           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7174           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
7175               < GET_MODE_BITSIZE (GET_MODE (x)))
7176           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
7177         {
7178           temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
7179                                GET_MODE (x));
7180           temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp);
7181           x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1));
7182
7183           return force_to_mode (x, mode, mask, reg, next_select);
7184         }
7185
7186       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
7187          use the full mask inside the NOT.  */
7188       mask = fuller_mask;
7189
7190     unop:
7191       op0 = gen_lowpart (op_mode,
7192                          force_to_mode (XEXP (x, 0), mode, mask,
7193                                         reg, next_select));
7194       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7195         x = simplify_gen_unary (code, op_mode, op0, op_mode);
7196       break;
7197
7198     case NE:
7199       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
7200          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
7201          which is equal to STORE_FLAG_VALUE.  */
7202       if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
7203           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
7204           && (nonzero_bits (XEXP (x, 0), mode)
7205               == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
7206         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7207
7208       break;
7209
7210     case IF_THEN_ELSE:
7211       /* We have no way of knowing if the IF_THEN_ELSE can itself be
7212          written in a narrower mode.  We play it safe and do not do so.  */
7213
7214       SUBST (XEXP (x, 1),
7215              gen_lowpart (GET_MODE (x),
7216                                       force_to_mode (XEXP (x, 1), mode,
7217                                                      mask, reg, next_select)));
7218       SUBST (XEXP (x, 2),
7219              gen_lowpart (GET_MODE (x),
7220                                       force_to_mode (XEXP (x, 2), mode,
7221                                                      mask, reg, next_select)));
7222       break;
7223
7224     default:
7225       break;
7226     }
7227
7228   /* Ensure we return a value of the proper mode.  */
7229   return gen_lowpart (mode, x);
7230 }
7231 \f
7232 /* Return nonzero if X is an expression that has one of two values depending on
7233    whether some other value is zero or nonzero.  In that case, we return the
7234    value that is being tested, *PTRUE is set to the value if the rtx being
7235    returned has a nonzero value, and *PFALSE is set to the other alternative.
7236
7237    If we return zero, we set *PTRUE and *PFALSE to X.  */
7238
7239 static rtx
7240 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
7241 {
7242   enum machine_mode mode = GET_MODE (x);
7243   enum rtx_code code = GET_CODE (x);
7244   rtx cond0, cond1, true0, true1, false0, false1;
7245   unsigned HOST_WIDE_INT nz;
7246
7247   /* If we are comparing a value against zero, we are done.  */
7248   if ((code == NE || code == EQ)
7249       && XEXP (x, 1) == const0_rtx)
7250     {
7251       *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
7252       *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
7253       return XEXP (x, 0);
7254     }
7255
7256   /* If this is a unary operation whose operand has one of two values, apply
7257      our opcode to compute those values.  */
7258   else if (UNARY_P (x)
7259            && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
7260     {
7261       *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
7262       *pfalse = simplify_gen_unary (code, mode, false0,
7263                                     GET_MODE (XEXP (x, 0)));
7264       return cond0;
7265     }
7266
7267   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
7268      make can't possibly match and would suppress other optimizations.  */
7269   else if (code == COMPARE)
7270     ;
7271
7272   /* If this is a binary operation, see if either side has only one of two
7273      values.  If either one does or if both do and they are conditional on
7274      the same value, compute the new true and false values.  */
7275   else if (BINARY_P (x))
7276     {
7277       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
7278       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
7279
7280       if ((cond0 != 0 || cond1 != 0)
7281           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
7282         {
7283           /* If if_then_else_cond returned zero, then true/false are the
7284              same rtl.  We must copy one of them to prevent invalid rtl
7285              sharing.  */
7286           if (cond0 == 0)
7287             true0 = copy_rtx (true0);
7288           else if (cond1 == 0)
7289             true1 = copy_rtx (true1);
7290
7291           *ptrue = gen_binary (code, mode, true0, true1);
7292           *pfalse = gen_binary (code, mode, false0, false1);
7293           return cond0 ? cond0 : cond1;
7294         }
7295
7296       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
7297          operands is zero when the other is nonzero, and vice-versa,
7298          and STORE_FLAG_VALUE is 1 or -1.  */
7299
7300       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7301           && (code == PLUS || code == IOR || code == XOR || code == MINUS
7302               || code == UMAX)
7303           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7304         {
7305           rtx op0 = XEXP (XEXP (x, 0), 1);
7306           rtx op1 = XEXP (XEXP (x, 1), 1);
7307
7308           cond0 = XEXP (XEXP (x, 0), 0);
7309           cond1 = XEXP (XEXP (x, 1), 0);
7310
7311           if (COMPARISON_P (cond0)
7312               && COMPARISON_P (cond1)
7313               && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
7314                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7315                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7316                   || ((swap_condition (GET_CODE (cond0))
7317                        == combine_reversed_comparison_code (cond1))
7318                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7319                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7320               && ! side_effects_p (x))
7321             {
7322               *ptrue = gen_binary (MULT, mode, op0, const_true_rtx);
7323               *pfalse = gen_binary (MULT, mode,
7324                                     (code == MINUS
7325                                      ? simplify_gen_unary (NEG, mode, op1,
7326                                                            mode)
7327                                      : op1),
7328                                     const_true_rtx);
7329               return cond0;
7330             }
7331         }
7332
7333       /* Similarly for MULT, AND and UMIN, except that for these the result
7334          is always zero.  */
7335       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7336           && (code == MULT || code == AND || code == UMIN)
7337           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7338         {
7339           cond0 = XEXP (XEXP (x, 0), 0);
7340           cond1 = XEXP (XEXP (x, 1), 0);
7341
7342           if (COMPARISON_P (cond0)
7343               && COMPARISON_P (cond1)
7344               && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
7345                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7346                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7347                   || ((swap_condition (GET_CODE (cond0))
7348                        == combine_reversed_comparison_code (cond1))
7349                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7350                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7351               && ! side_effects_p (x))
7352             {
7353               *ptrue = *pfalse = const0_rtx;
7354               return cond0;
7355             }
7356         }
7357     }
7358
7359   else if (code == IF_THEN_ELSE)
7360     {
7361       /* If we have IF_THEN_ELSE already, extract the condition and
7362          canonicalize it if it is NE or EQ.  */
7363       cond0 = XEXP (x, 0);
7364       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
7365       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
7366         return XEXP (cond0, 0);
7367       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
7368         {
7369           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
7370           return XEXP (cond0, 0);
7371         }
7372       else
7373         return cond0;
7374     }
7375
7376   /* If X is a SUBREG, we can narrow both the true and false values
7377      if the inner expression, if there is a condition.  */
7378   else if (code == SUBREG
7379            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
7380                                                &true0, &false0)))
7381     {
7382       true0 = simplify_gen_subreg (mode, true0,
7383                                    GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7384       false0 = simplify_gen_subreg (mode, false0,
7385                                     GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7386       if (true0 && false0)
7387         {
7388           *ptrue = true0;
7389           *pfalse = false0;
7390           return cond0;
7391         }
7392     }
7393
7394   /* If X is a constant, this isn't special and will cause confusions
7395      if we treat it as such.  Likewise if it is equivalent to a constant.  */
7396   else if (CONSTANT_P (x)
7397            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
7398     ;
7399
7400   /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
7401      will be least confusing to the rest of the compiler.  */
7402   else if (mode == BImode)
7403     {
7404       *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
7405       return x;
7406     }
7407
7408   /* If X is known to be either 0 or -1, those are the true and
7409      false values when testing X.  */
7410   else if (x == constm1_rtx || x == const0_rtx
7411            || (mode != VOIDmode
7412                && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
7413     {
7414       *ptrue = constm1_rtx, *pfalse = const0_rtx;
7415       return x;
7416     }
7417
7418   /* Likewise for 0 or a single bit.  */
7419   else if (SCALAR_INT_MODE_P (mode)
7420            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7421            && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
7422     {
7423       *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
7424       return x;
7425     }
7426
7427   /* Otherwise fail; show no condition with true and false values the same.  */
7428   *ptrue = *pfalse = x;
7429   return 0;
7430 }
7431 \f
7432 /* Return the value of expression X given the fact that condition COND
7433    is known to be true when applied to REG as its first operand and VAL
7434    as its second.  X is known to not be shared and so can be modified in
7435    place.
7436
7437    We only handle the simplest cases, and specifically those cases that
7438    arise with IF_THEN_ELSE expressions.  */
7439
7440 static rtx
7441 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
7442 {
7443   enum rtx_code code = GET_CODE (x);
7444   rtx temp;
7445   const char *fmt;
7446   int i, j;
7447
7448   if (side_effects_p (x))
7449     return x;
7450
7451   /* If either operand of the condition is a floating point value,
7452      then we have to avoid collapsing an EQ comparison.  */
7453   if (cond == EQ
7454       && rtx_equal_p (x, reg)
7455       && ! FLOAT_MODE_P (GET_MODE (x))
7456       && ! FLOAT_MODE_P (GET_MODE (val)))
7457     return val;
7458
7459   if (cond == UNEQ && rtx_equal_p (x, reg))
7460     return val;
7461
7462   /* If X is (abs REG) and we know something about REG's relationship
7463      with zero, we may be able to simplify this.  */
7464
7465   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
7466     switch (cond)
7467       {
7468       case GE:  case GT:  case EQ:
7469         return XEXP (x, 0);
7470       case LT:  case LE:
7471         return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
7472                                    XEXP (x, 0),
7473                                    GET_MODE (XEXP (x, 0)));
7474       default:
7475         break;
7476       }
7477
7478   /* The only other cases we handle are MIN, MAX, and comparisons if the
7479      operands are the same as REG and VAL.  */
7480
7481   else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
7482     {
7483       if (rtx_equal_p (XEXP (x, 0), val))
7484         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
7485
7486       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
7487         {
7488           if (COMPARISON_P (x))
7489             {
7490               if (comparison_dominates_p (cond, code))
7491                 return const_true_rtx;
7492
7493               code = combine_reversed_comparison_code (x);
7494               if (code != UNKNOWN
7495                   && comparison_dominates_p (cond, code))
7496                 return const0_rtx;
7497               else
7498                 return x;
7499             }
7500           else if (code == SMAX || code == SMIN
7501                    || code == UMIN || code == UMAX)
7502             {
7503               int unsignedp = (code == UMIN || code == UMAX);
7504
7505               /* Do not reverse the condition when it is NE or EQ.
7506                  This is because we cannot conclude anything about
7507                  the value of 'SMAX (x, y)' when x is not equal to y,
7508                  but we can when x equals y.  */
7509               if ((code == SMAX || code == UMAX)
7510                   && ! (cond == EQ || cond == NE))
7511                 cond = reverse_condition (cond);
7512
7513               switch (cond)
7514                 {
7515                 case GE:   case GT:
7516                   return unsignedp ? x : XEXP (x, 1);
7517                 case LE:   case LT:
7518                   return unsignedp ? x : XEXP (x, 0);
7519                 case GEU:  case GTU:
7520                   return unsignedp ? XEXP (x, 1) : x;
7521                 case LEU:  case LTU:
7522                   return unsignedp ? XEXP (x, 0) : x;
7523                 default:
7524                   break;
7525                 }
7526             }
7527         }
7528     }
7529   else if (code == SUBREG)
7530     {
7531       enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
7532       rtx new, r = known_cond (SUBREG_REG (x), cond, reg, val);
7533
7534       if (SUBREG_REG (x) != r)
7535         {
7536           /* We must simplify subreg here, before we lose track of the
7537              original inner_mode.  */
7538           new = simplify_subreg (GET_MODE (x), r,
7539                                  inner_mode, SUBREG_BYTE (x));
7540           if (new)
7541             return new;
7542           else
7543             SUBST (SUBREG_REG (x), r);
7544         }
7545
7546       return x;
7547     }
7548   /* We don't have to handle SIGN_EXTEND here, because even in the
7549      case of replacing something with a modeless CONST_INT, a
7550      CONST_INT is already (supposed to be) a valid sign extension for
7551      its narrower mode, which implies it's already properly
7552      sign-extended for the wider mode.  Now, for ZERO_EXTEND, the
7553      story is different.  */
7554   else if (code == ZERO_EXTEND)
7555     {
7556       enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
7557       rtx new, r = known_cond (XEXP (x, 0), cond, reg, val);
7558
7559       if (XEXP (x, 0) != r)
7560         {
7561           /* We must simplify the zero_extend here, before we lose
7562              track of the original inner_mode.  */
7563           new = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
7564                                           r, inner_mode);
7565           if (new)
7566             return new;
7567           else
7568             SUBST (XEXP (x, 0), r);
7569         }
7570
7571       return x;
7572     }
7573
7574   fmt = GET_RTX_FORMAT (code);
7575   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7576     {
7577       if (fmt[i] == 'e')
7578         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
7579       else if (fmt[i] == 'E')
7580         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7581           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
7582                                                 cond, reg, val));
7583     }
7584
7585   return x;
7586 }
7587 \f
7588 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
7589    assignment as a field assignment.  */
7590
7591 static int
7592 rtx_equal_for_field_assignment_p (rtx x, rtx y)
7593 {
7594   if (x == y || rtx_equal_p (x, y))
7595     return 1;
7596
7597   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
7598     return 0;
7599
7600   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
7601      Note that all SUBREGs of MEM are paradoxical; otherwise they
7602      would have been rewritten.  */
7603   if (GET_CODE (x) == MEM && GET_CODE (y) == SUBREG
7604       && GET_CODE (SUBREG_REG (y)) == MEM
7605       && rtx_equal_p (SUBREG_REG (y),
7606                       gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
7607     return 1;
7608
7609   if (GET_CODE (y) == MEM && GET_CODE (x) == SUBREG
7610       && GET_CODE (SUBREG_REG (x)) == MEM
7611       && rtx_equal_p (SUBREG_REG (x),
7612                       gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
7613     return 1;
7614
7615   /* We used to see if get_last_value of X and Y were the same but that's
7616      not correct.  In one direction, we'll cause the assignment to have
7617      the wrong destination and in the case, we'll import a register into this
7618      insn that might have already have been dead.   So fail if none of the
7619      above cases are true.  */
7620   return 0;
7621 }
7622 \f
7623 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
7624    Return that assignment if so.
7625
7626    We only handle the most common cases.  */
7627
7628 static rtx
7629 make_field_assignment (rtx x)
7630 {
7631   rtx dest = SET_DEST (x);
7632   rtx src = SET_SRC (x);
7633   rtx assign;
7634   rtx rhs, lhs;
7635   HOST_WIDE_INT c1;
7636   HOST_WIDE_INT pos;
7637   unsigned HOST_WIDE_INT len;
7638   rtx other;
7639   enum machine_mode mode;
7640
7641   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
7642      a clear of a one-bit field.  We will have changed it to
7643      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
7644      for a SUBREG.  */
7645
7646   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
7647       && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
7648       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
7649       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7650     {
7651       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7652                                 1, 1, 1, 0);
7653       if (assign != 0)
7654         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7655       return x;
7656     }
7657
7658   else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
7659            && subreg_lowpart_p (XEXP (src, 0))
7660            && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
7661                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
7662            && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
7663            && GET_CODE (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == CONST_INT
7664            && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
7665            && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7666     {
7667       assign = make_extraction (VOIDmode, dest, 0,
7668                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
7669                                 1, 1, 1, 0);
7670       if (assign != 0)
7671         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7672       return x;
7673     }
7674
7675   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
7676      one-bit field.  */
7677   else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
7678            && XEXP (XEXP (src, 0), 0) == const1_rtx
7679            && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7680     {
7681       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7682                                 1, 1, 1, 0);
7683       if (assign != 0)
7684         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
7685       return x;
7686     }
7687
7688   /* The other case we handle is assignments into a constant-position
7689      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
7690      a mask that has all one bits except for a group of zero bits and
7691      OTHER is known to have zeros where C1 has ones, this is such an
7692      assignment.  Compute the position and length from C1.  Shift OTHER
7693      to the appropriate position, force it to the required mode, and
7694      make the extraction.  Check for the AND in both operands.  */
7695
7696   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
7697     return x;
7698
7699   rhs = expand_compound_operation (XEXP (src, 0));
7700   lhs = expand_compound_operation (XEXP (src, 1));
7701
7702   if (GET_CODE (rhs) == AND
7703       && GET_CODE (XEXP (rhs, 1)) == CONST_INT
7704       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
7705     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
7706   else if (GET_CODE (lhs) == AND
7707            && GET_CODE (XEXP (lhs, 1)) == CONST_INT
7708            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
7709     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
7710   else
7711     return x;
7712
7713   pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
7714   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
7715       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
7716       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
7717     return x;
7718
7719   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
7720   if (assign == 0)
7721     return x;
7722
7723   /* The mode to use for the source is the mode of the assignment, or of
7724      what is inside a possible STRICT_LOW_PART.  */
7725   mode = (GET_CODE (assign) == STRICT_LOW_PART
7726           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
7727
7728   /* Shift OTHER right POS places and make it the source, restricting it
7729      to the proper length and mode.  */
7730
7731   src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
7732                                              GET_MODE (src), other, pos),
7733                        mode,
7734                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
7735                        ? ~(unsigned HOST_WIDE_INT) 0
7736                        : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
7737                        dest, 0);
7738
7739   /* If SRC is masked by an AND that does not make a difference in
7740      the value being stored, strip it.  */
7741   if (GET_CODE (assign) == ZERO_EXTRACT
7742       && GET_CODE (XEXP (assign, 1)) == CONST_INT
7743       && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
7744       && GET_CODE (src) == AND
7745       && GET_CODE (XEXP (src, 1)) == CONST_INT
7746       && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (src, 1))
7747           == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1))
7748     src = XEXP (src, 0);
7749
7750   return gen_rtx_SET (VOIDmode, assign, src);
7751 }
7752 \f
7753 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
7754    if so.  */
7755
7756 static rtx
7757 apply_distributive_law (rtx x)
7758 {
7759   enum rtx_code code = GET_CODE (x);
7760   enum rtx_code inner_code;
7761   rtx lhs, rhs, other;
7762   rtx tem;
7763
7764   /* Distributivity is not true for floating point as it can change the
7765      value.  So we don't do it unless -funsafe-math-optimizations.  */
7766   if (FLOAT_MODE_P (GET_MODE (x))
7767       && ! flag_unsafe_math_optimizations)
7768     return x;
7769
7770   /* The outer operation can only be one of the following:  */
7771   if (code != IOR && code != AND && code != XOR
7772       && code != PLUS && code != MINUS)
7773     return x;
7774
7775   lhs = XEXP (x, 0);
7776   rhs = XEXP (x, 1);
7777
7778   /* If either operand is a primitive we can't do anything, so get out
7779      fast.  */
7780   if (OBJECT_P (lhs) || OBJECT_P (rhs))
7781     return x;
7782
7783   lhs = expand_compound_operation (lhs);
7784   rhs = expand_compound_operation (rhs);
7785   inner_code = GET_CODE (lhs);
7786   if (inner_code != GET_CODE (rhs))
7787     return x;
7788
7789   /* See if the inner and outer operations distribute.  */
7790   switch (inner_code)
7791     {
7792     case LSHIFTRT:
7793     case ASHIFTRT:
7794     case AND:
7795     case IOR:
7796       /* These all distribute except over PLUS.  */
7797       if (code == PLUS || code == MINUS)
7798         return x;
7799       break;
7800
7801     case MULT:
7802       if (code != PLUS && code != MINUS)
7803         return x;
7804       break;
7805
7806     case ASHIFT:
7807       /* This is also a multiply, so it distributes over everything.  */
7808       break;
7809
7810     case SUBREG:
7811       /* Non-paradoxical SUBREGs distributes over all operations, provided
7812          the inner modes and byte offsets are the same, this is an extraction
7813          of a low-order part, we don't convert an fp operation to int or
7814          vice versa, and we would not be converting a single-word
7815          operation into a multi-word operation.  The latter test is not
7816          required, but it prevents generating unneeded multi-word operations.
7817          Some of the previous tests are redundant given the latter test, but
7818          are retained because they are required for correctness.
7819
7820          We produce the result slightly differently in this case.  */
7821
7822       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
7823           || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
7824           || ! subreg_lowpart_p (lhs)
7825           || (GET_MODE_CLASS (GET_MODE (lhs))
7826               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
7827           || (GET_MODE_SIZE (GET_MODE (lhs))
7828               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
7829           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
7830         return x;
7831
7832       tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
7833                         SUBREG_REG (lhs), SUBREG_REG (rhs));
7834       return gen_lowpart (GET_MODE (x), tem);
7835
7836     default:
7837       return x;
7838     }
7839
7840   /* Set LHS and RHS to the inner operands (A and B in the example
7841      above) and set OTHER to the common operand (C in the example).
7842      There is only one way to do this unless the inner operation is
7843      commutative.  */
7844   if (COMMUTATIVE_ARITH_P (lhs)
7845       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
7846     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
7847   else if (COMMUTATIVE_ARITH_P (lhs)
7848            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
7849     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
7850   else if (COMMUTATIVE_ARITH_P (lhs)
7851            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
7852     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
7853   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
7854     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
7855   else
7856     return x;
7857
7858   /* Form the new inner operation, seeing if it simplifies first.  */
7859   tem = gen_binary (code, GET_MODE (x), lhs, rhs);
7860
7861   /* There is one exception to the general way of distributing:
7862      (a | c) ^ (b | c) -> (a ^ b) & ~c  */
7863   if (code == XOR && inner_code == IOR)
7864     {
7865       inner_code = AND;
7866       other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
7867     }
7868
7869   /* We may be able to continuing distributing the result, so call
7870      ourselves recursively on the inner operation before forming the
7871      outer operation, which we return.  */
7872   return gen_binary (inner_code, GET_MODE (x),
7873                      apply_distributive_law (tem), other);
7874 }
7875 \f
7876 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
7877    in MODE.
7878
7879    Return an equivalent form, if different from X.  Otherwise, return X.  If
7880    X is zero, we are to always construct the equivalent form.  */
7881
7882 static rtx
7883 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
7884                         unsigned HOST_WIDE_INT constop)
7885 {
7886   unsigned HOST_WIDE_INT nonzero;
7887   int i;
7888
7889   /* Simplify VAROP knowing that we will be only looking at some of the
7890      bits in it.
7891
7892      Note by passing in CONSTOP, we guarantee that the bits not set in
7893      CONSTOP are not significant and will never be examined.  We must
7894      ensure that is the case by explicitly masking out those bits
7895      before returning.  */
7896   varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
7897
7898   /* If VAROP is a CLOBBER, we will fail so return it.  */
7899   if (GET_CODE (varop) == CLOBBER)
7900     return varop;
7901
7902   /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
7903      to VAROP and return the new constant.  */
7904   if (GET_CODE (varop) == CONST_INT)
7905     return GEN_INT (trunc_int_for_mode (INTVAL (varop) & constop, mode));
7906
7907   /* See what bits may be nonzero in VAROP.  Unlike the general case of
7908      a call to nonzero_bits, here we don't care about bits outside
7909      MODE.  */
7910
7911   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
7912
7913   /* Turn off all bits in the constant that are known to already be zero.
7914      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
7915      which is tested below.  */
7916
7917   constop &= nonzero;
7918
7919   /* If we don't have any bits left, return zero.  */
7920   if (constop == 0)
7921     return const0_rtx;
7922
7923   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
7924      a power of two, we can replace this with an ASHIFT.  */
7925   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
7926       && (i = exact_log2 (constop)) >= 0)
7927     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
7928
7929   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
7930      or XOR, then try to apply the distributive law.  This may eliminate
7931      operations if either branch can be simplified because of the AND.
7932      It may also make some cases more complex, but those cases probably
7933      won't match a pattern either with or without this.  */
7934
7935   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
7936     return
7937       gen_lowpart
7938         (mode,
7939          apply_distributive_law
7940          (gen_binary (GET_CODE (varop), GET_MODE (varop),
7941                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7942                                               XEXP (varop, 0), constop),
7943                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7944                                               XEXP (varop, 1), constop))));
7945
7946   /* If VAROP is PLUS, and the constant is a mask of low bite, distribute
7947      the AND and see if one of the operands simplifies to zero.  If so, we
7948      may eliminate it.  */
7949
7950   if (GET_CODE (varop) == PLUS
7951       && exact_log2 (constop + 1) >= 0)
7952     {
7953       rtx o0, o1;
7954
7955       o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
7956       o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
7957       if (o0 == const0_rtx)
7958         return o1;
7959       if (o1 == const0_rtx)
7960         return o0;
7961     }
7962
7963   /* Get VAROP in MODE.  Try to get a SUBREG if not.  Don't make a new SUBREG
7964      if we already had one (just check for the simplest cases).  */
7965   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
7966       && GET_MODE (XEXP (x, 0)) == mode
7967       && SUBREG_REG (XEXP (x, 0)) == varop)
7968     varop = XEXP (x, 0);
7969   else
7970     varop = gen_lowpart (mode, varop);
7971
7972   /* If we can't make the SUBREG, try to return what we were given.  */
7973   if (GET_CODE (varop) == CLOBBER)
7974     return x ? x : varop;
7975
7976   /* If we are only masking insignificant bits, return VAROP.  */
7977   if (constop == nonzero)
7978     x = varop;
7979   else
7980     {
7981       /* Otherwise, return an AND.  */
7982       constop = trunc_int_for_mode (constop, mode);
7983       /* See how much, if any, of X we can use.  */
7984       if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
7985         x = gen_binary (AND, mode, varop, GEN_INT (constop));
7986
7987       else
7988         {
7989           if (GET_CODE (XEXP (x, 1)) != CONST_INT
7990               || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop)
7991             SUBST (XEXP (x, 1), GEN_INT (constop));
7992
7993           SUBST (XEXP (x, 0), varop);
7994         }
7995     }
7996
7997   return x;
7998 }
7999 \f
8000 #define nonzero_bits_with_known(X, MODE) \
8001   cached_nonzero_bits (X, MODE, known_x, known_mode, known_ret)
8002
8003 /* The function cached_nonzero_bits is a wrapper around nonzero_bits1.
8004    It avoids exponential behavior in nonzero_bits1 when X has
8005    identical subexpressions on the first or the second level.  */
8006
8007 static unsigned HOST_WIDE_INT
8008 cached_nonzero_bits (rtx x, enum machine_mode mode, rtx known_x,
8009                      enum machine_mode known_mode,
8010                      unsigned HOST_WIDE_INT known_ret)
8011 {
8012   if (x == known_x && mode == known_mode)
8013     return known_ret;
8014
8015   /* Try to find identical subexpressions.  If found call
8016      nonzero_bits1 on X with the subexpressions as KNOWN_X and the
8017      precomputed value for the subexpression as KNOWN_RET.  */
8018
8019   if (ARITHMETIC_P (x))
8020     {
8021       rtx x0 = XEXP (x, 0);
8022       rtx x1 = XEXP (x, 1);
8023
8024       /* Check the first level.  */
8025       if (x0 == x1)
8026         return nonzero_bits1 (x, mode, x0, mode,
8027                               nonzero_bits_with_known (x0, mode));
8028
8029       /* Check the second level.  */
8030       if (ARITHMETIC_P (x0)
8031           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
8032         return nonzero_bits1 (x, mode, x1, mode,
8033                               nonzero_bits_with_known (x1, mode));
8034
8035       if (ARITHMETIC_P (x1)
8036           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
8037         return nonzero_bits1 (x, mode, x0, mode,
8038                          nonzero_bits_with_known (x0, mode));
8039     }
8040
8041   return nonzero_bits1 (x, mode, known_x, known_mode, known_ret);
8042 }
8043
8044 /* We let num_sign_bit_copies recur into nonzero_bits as that is useful.
8045    We don't let nonzero_bits recur into num_sign_bit_copies, because that
8046    is less useful.  We can't allow both, because that results in exponential
8047    run time recursion.  There is a nullstone testcase that triggered
8048    this.  This macro avoids accidental uses of num_sign_bit_copies.  */
8049 #define cached_num_sign_bit_copies()
8050
8051 /* Given an expression, X, compute which bits in X can be nonzero.
8052    We don't care about bits outside of those defined in MODE.
8053
8054    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
8055    a shift, AND, or zero_extract, we can do better.  */
8056
8057 static unsigned HOST_WIDE_INT
8058 nonzero_bits1 (rtx x, enum machine_mode mode, rtx known_x,
8059                enum machine_mode known_mode,
8060                unsigned HOST_WIDE_INT known_ret)
8061 {
8062   unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode);
8063   unsigned HOST_WIDE_INT inner_nz;
8064   enum rtx_code code;
8065   unsigned int mode_width = GET_MODE_BITSIZE (mode);
8066   rtx tem;
8067
8068   /* For floating-point values, assume all bits are needed.  */
8069   if (FLOAT_MODE_P (GET_MODE (x)) || FLOAT_MODE_P (mode))
8070     return nonzero;
8071
8072   /* If X is wider than MODE, use its mode instead.  */
8073   if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
8074     {
8075       mode = GET_MODE (x);
8076       nonzero = GET_MODE_MASK (mode);
8077       mode_width = GET_MODE_BITSIZE (mode);
8078     }
8079
8080   if (mode_width > HOST_BITS_PER_WIDE_INT)
8081     /* Our only callers in this case look for single bit values.  So
8082        just return the mode mask.  Those tests will then be false.  */
8083     return nonzero;
8084
8085 #ifndef WORD_REGISTER_OPERATIONS
8086   /* If MODE is wider than X, but both are a single word for both the host
8087      and target machines, we can compute this from which bits of the
8088      object might be nonzero in its own mode, taking into account the fact
8089      that on many CISC machines, accessing an object in a wider mode
8090      causes the high-order bits to become undefined.  So they are
8091      not known to be zero.  */
8092
8093   if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode
8094       && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD
8095       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
8096       && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x)))
8097     {
8098       nonzero &= nonzero_bits_with_known (x, GET_MODE (x));
8099       nonzero |= GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x));
8100       return nonzero;
8101     }
8102 #endif
8103
8104   code = GET_CODE (x);
8105   switch (code)
8106     {
8107     case REG:
8108 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
8109       /* If pointers extend unsigned and this is a pointer in Pmode, say that
8110          all the bits above ptr_mode are known to be zero.  */
8111       if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
8112           && REG_POINTER (x))
8113         nonzero &= GET_MODE_MASK (ptr_mode);
8114 #endif
8115
8116       /* Include declared information about alignment of pointers.  */
8117       /* ??? We don't properly preserve REG_POINTER changes across
8118          pointer-to-integer casts, so we can't trust it except for
8119          things that we know must be pointers.  See execute/960116-1.c.  */
8120       if ((x == stack_pointer_rtx
8121            || x == frame_pointer_rtx
8122            || x == arg_pointer_rtx)
8123           && REGNO_POINTER_ALIGN (REGNO (x)))
8124         {
8125           unsigned HOST_WIDE_INT alignment
8126             = REGNO_POINTER_ALIGN (REGNO (x)) / BITS_PER_UNIT;
8127
8128 #ifdef PUSH_ROUNDING
8129           /* If PUSH_ROUNDING is defined, it is possible for the
8130              stack to be momentarily aligned only to that amount,
8131              so we pick the least alignment.  */
8132           if (x == stack_pointer_rtx && PUSH_ARGS)
8133             alignment = MIN ((unsigned HOST_WIDE_INT) PUSH_ROUNDING (1),
8134                              alignment);
8135 #endif
8136
8137           nonzero &= ~(alignment - 1);
8138         }
8139
8140       /* If X is a register whose nonzero bits value is current, use it.
8141          Otherwise, if X is a register whose value we can find, use that
8142          value.  Otherwise, use the previously-computed global nonzero bits
8143          for this register.  */
8144
8145       if (reg_stat[REGNO (x)].last_set_value != 0
8146           && (reg_stat[REGNO (x)].last_set_mode == mode
8147               || (GET_MODE_CLASS (reg_stat[REGNO (x)].last_set_mode) == MODE_INT
8148                   && GET_MODE_CLASS (mode) == MODE_INT))
8149           && (reg_stat[REGNO (x)].last_set_label == label_tick
8150               || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8151                   && REG_N_SETS (REGNO (x)) == 1
8152                   && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
8153                                         REGNO (x))))
8154           && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
8155         return reg_stat[REGNO (x)].last_set_nonzero_bits & nonzero;
8156
8157       tem = get_last_value (x);
8158
8159       if (tem)
8160         {
8161 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
8162           /* If X is narrower than MODE and TEM is a non-negative
8163              constant that would appear negative in the mode of X,
8164              sign-extend it for use in reg_stat[].nonzero_bits because
8165              some machines (maybe most) will actually do the sign-extension
8166              and this is the conservative approach.
8167
8168              ??? For 2.5, try to tighten up the MD files in this regard
8169              instead of this kludge.  */
8170
8171           if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width
8172               && GET_CODE (tem) == CONST_INT
8173               && INTVAL (tem) > 0
8174               && 0 != (INTVAL (tem)
8175                        & ((HOST_WIDE_INT) 1
8176                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
8177             tem = GEN_INT (INTVAL (tem)
8178                            | ((HOST_WIDE_INT) (-1)
8179                               << GET_MODE_BITSIZE (GET_MODE (x))));
8180 #endif
8181           return nonzero_bits_with_known (tem, mode) & nonzero;
8182         }
8183       else if (nonzero_sign_valid && reg_stat[REGNO (x)].nonzero_bits)
8184         {
8185           unsigned HOST_WIDE_INT mask = reg_stat[REGNO (x)].nonzero_bits;
8186
8187           if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width)
8188             /* We don't know anything about the upper bits.  */
8189             mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
8190           return nonzero & mask;
8191         }
8192       else
8193         return nonzero;
8194
8195     case CONST_INT:
8196 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
8197       /* If X is negative in MODE, sign-extend the value.  */
8198       if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD
8199           && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1))))
8200         return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width));
8201 #endif
8202
8203       return INTVAL (x);
8204
8205     case MEM:
8206 #ifdef LOAD_EXTEND_OP
8207       /* In many, if not most, RISC machines, reading a byte from memory
8208          zeros the rest of the register.  Noticing that fact saves a lot
8209          of extra zero-extends.  */
8210       if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND)
8211         nonzero &= GET_MODE_MASK (GET_MODE (x));
8212 #endif
8213       break;
8214
8215     case EQ:  case NE:
8216     case UNEQ:  case LTGT:
8217     case GT:  case GTU:  case UNGT:
8218     case LT:  case LTU:  case UNLT:
8219     case GE:  case GEU:  case UNGE:
8220     case LE:  case LEU:  case UNLE:
8221     case UNORDERED: case ORDERED:
8222
8223       /* If this produces an integer result, we know which bits are set.
8224          Code here used to clear bits outside the mode of X, but that is
8225          now done above.  */
8226
8227       if (GET_MODE_CLASS (mode) == MODE_INT
8228           && mode_width <= HOST_BITS_PER_WIDE_INT)
8229         nonzero = STORE_FLAG_VALUE;
8230       break;
8231
8232     case NEG:
8233 #if 0
8234       /* Disabled to avoid exponential mutual recursion between nonzero_bits
8235          and num_sign_bit_copies.  */
8236       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
8237           == GET_MODE_BITSIZE (GET_MODE (x)))
8238         nonzero = 1;
8239 #endif
8240
8241       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
8242         nonzero |= (GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x)));
8243       break;
8244
8245     case ABS:
8246 #if 0
8247       /* Disabled to avoid exponential mutual recursion between nonzero_bits
8248          and num_sign_bit_copies.  */
8249       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
8250           == GET_MODE_BITSIZE (GET_MODE (x)))
8251         nonzero = 1;
8252 #endif
8253       break;
8254
8255     case TRUNCATE:
8256       nonzero &= (nonzero_bits_with_known (XEXP (x, 0), mode)
8257                   & GET_MODE_MASK (mode));
8258       break;
8259
8260     case ZERO_EXTEND:
8261       nonzero &= nonzero_bits_with_known (XEXP (x, 0), mode);
8262       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
8263         nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
8264       break;
8265
8266     case SIGN_EXTEND:
8267       /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
8268          Otherwise, show all the bits in the outer mode but not the inner
8269          may be nonzero.  */
8270       inner_nz = nonzero_bits_with_known (XEXP (x, 0), mode);
8271       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
8272         {
8273           inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
8274           if (inner_nz
8275               & (((HOST_WIDE_INT) 1
8276                   << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
8277             inner_nz |= (GET_MODE_MASK (mode)
8278                          & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
8279         }
8280
8281       nonzero &= inner_nz;
8282       break;
8283
8284     case AND:
8285       nonzero &= (nonzero_bits_with_known (XEXP (x, 0), mode)
8286                   & nonzero_bits_with_known (XEXP (x, 1), mode));
8287       break;
8288
8289     case XOR:   case IOR:
8290     case UMIN:  case UMAX:  case SMIN:  case SMAX:
8291       {
8292         unsigned HOST_WIDE_INT nonzero0 =
8293           nonzero_bits_with_known (XEXP (x, 0), mode);
8294
8295         /* Don't call nonzero_bits for the second time if it cannot change
8296            anything.  */
8297         if ((nonzero & nonzero0) != nonzero)
8298           nonzero &= (nonzero0
8299                       | nonzero_bits_with_known (XEXP (x, 1), mode));
8300       }
8301       break;
8302
8303     case PLUS:  case MINUS:
8304     case MULT:
8305     case DIV:   case UDIV:
8306     case MOD:   case UMOD:
8307       /* We can apply the rules of arithmetic to compute the number of
8308          high- and low-order zero bits of these operations.  We start by
8309          computing the width (position of the highest-order nonzero bit)
8310          and the number of low-order zero bits for each value.  */
8311       {
8312         unsigned HOST_WIDE_INT nz0 =
8313           nonzero_bits_with_known (XEXP (x, 0), mode);
8314         unsigned HOST_WIDE_INT nz1 =
8315           nonzero_bits_with_known (XEXP (x, 1), mode);
8316         int sign_index = GET_MODE_BITSIZE (GET_MODE (x)) - 1;
8317         int width0 = floor_log2 (nz0) + 1;
8318         int width1 = floor_log2 (nz1) + 1;
8319         int low0 = floor_log2 (nz0 & -nz0);
8320         int low1 = floor_log2 (nz1 & -nz1);
8321         HOST_WIDE_INT op0_maybe_minusp
8322           = (nz0 & ((HOST_WIDE_INT) 1 << sign_index));
8323         HOST_WIDE_INT op1_maybe_minusp
8324           = (nz1 & ((HOST_WIDE_INT) 1 << sign_index));
8325         unsigned int result_width = mode_width;
8326         int result_low = 0;
8327
8328         switch (code)
8329           {
8330           case PLUS:
8331             result_width = MAX (width0, width1) + 1;
8332             result_low = MIN (low0, low1);
8333             break;
8334           case MINUS:
8335             result_low = MIN (low0, low1);
8336             break;
8337           case MULT:
8338             result_width = width0 + width1;
8339             result_low = low0 + low1;
8340             break;
8341           case DIV:
8342             if (width1 == 0)
8343               break;
8344             if (! op0_maybe_minusp && ! op1_maybe_minusp)
8345               result_width = width0;
8346             break;
8347           case UDIV:
8348             if (width1 == 0)
8349               break;
8350             result_width = width0;
8351             break;
8352           case MOD:
8353             if (width1 == 0)
8354               break;
8355             if (! op0_maybe_minusp && ! op1_maybe_minusp)
8356               result_width = MIN (width0, width1);
8357             result_low = MIN (low0, low1);
8358             break;
8359           case UMOD:
8360             if (width1 == 0)
8361               break;
8362             result_width = MIN (width0, width1);
8363             result_low = MIN (low0, low1);
8364             break;
8365           default:
8366             abort ();
8367           }
8368
8369         if (result_width < mode_width)
8370           nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1;
8371
8372         if (result_low > 0)
8373           nonzero &= ~(((HOST_WIDE_INT) 1 << result_low) - 1);
8374
8375 #ifdef POINTERS_EXTEND_UNSIGNED
8376         /* If pointers extend unsigned and this is an addition or subtraction
8377            to a pointer in Pmode, all the bits above ptr_mode are known to be
8378            zero.  */
8379         if (POINTERS_EXTEND_UNSIGNED > 0 && GET_MODE (x) == Pmode
8380             && (code == PLUS || code == MINUS)
8381             && GET_CODE (XEXP (x, 0)) == REG && REG_POINTER (XEXP (x, 0)))
8382           nonzero &= GET_MODE_MASK (ptr_mode);
8383 #endif
8384       }
8385       break;
8386
8387     case ZERO_EXTRACT:
8388       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8389           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
8390         nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
8391       break;
8392
8393     case SUBREG:
8394       /* If this is a SUBREG formed for a promoted variable that has
8395          been zero-extended, we know that at least the high-order bits
8396          are zero, though others might be too.  */
8397
8398       if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x) > 0)
8399         nonzero = (GET_MODE_MASK (GET_MODE (x))
8400                    & nonzero_bits_with_known (SUBREG_REG (x), GET_MODE (x)));
8401
8402       /* If the inner mode is a single word for both the host and target
8403          machines, we can compute this from which bits of the inner
8404          object might be nonzero.  */
8405       if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
8406           && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
8407               <= HOST_BITS_PER_WIDE_INT))
8408         {
8409           nonzero &= nonzero_bits_with_known (SUBREG_REG (x), mode);
8410
8411 #if defined (WORD_REGISTER_OPERATIONS) && defined (LOAD_EXTEND_OP)
8412           /* If this is a typical RISC machine, we only have to worry
8413              about the way loads are extended.  */
8414           if ((LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
8415                ? (((nonzero
8416                     & (((unsigned HOST_WIDE_INT) 1
8417                         << (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) - 1))))
8418                    != 0))
8419                : LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) != ZERO_EXTEND)
8420               || GET_CODE (SUBREG_REG (x)) != MEM)
8421 #endif
8422             {
8423               /* On many CISC machines, accessing an object in a wider mode
8424                  causes the high-order bits to become undefined.  So they are
8425                  not known to be zero.  */
8426               if (GET_MODE_SIZE (GET_MODE (x))
8427                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8428                 nonzero |= (GET_MODE_MASK (GET_MODE (x))
8429                             & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
8430             }
8431         }
8432       break;
8433
8434     case ASHIFTRT:
8435     case LSHIFTRT:
8436     case ASHIFT:
8437     case ROTATE:
8438       /* The nonzero bits are in two classes: any bits within MODE
8439          that aren't in GET_MODE (x) are always significant.  The rest of the
8440          nonzero bits are those that are significant in the operand of
8441          the shift when shifted the appropriate number of bits.  This
8442          shows that high-order bits are cleared by the right shift and
8443          low-order bits by left shifts.  */
8444       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8445           && INTVAL (XEXP (x, 1)) >= 0
8446           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
8447         {
8448           enum machine_mode inner_mode = GET_MODE (x);
8449           unsigned int width = GET_MODE_BITSIZE (inner_mode);
8450           int count = INTVAL (XEXP (x, 1));
8451           unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
8452           unsigned HOST_WIDE_INT op_nonzero =
8453             nonzero_bits_with_known (XEXP (x, 0), mode);
8454           unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask;
8455           unsigned HOST_WIDE_INT outer = 0;
8456
8457           if (mode_width > width)
8458             outer = (op_nonzero & nonzero & ~mode_mask);
8459
8460           if (code == LSHIFTRT)
8461             inner >>= count;
8462           else if (code == ASHIFTRT)
8463             {
8464               inner >>= count;
8465
8466               /* If the sign bit may have been nonzero before the shift, we
8467                  need to mark all the places it could have been copied to
8468                  by the shift as possibly nonzero.  */
8469               if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
8470                 inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
8471             }
8472           else if (code == ASHIFT)
8473             inner <<= count;
8474           else
8475             inner = ((inner << (count % width)
8476                       | (inner >> (width - (count % width)))) & mode_mask);
8477
8478           nonzero &= (outer | inner);
8479         }
8480       break;
8481
8482     case FFS:
8483     case POPCOUNT:
8484       /* This is at most the number of bits in the mode.  */
8485       nonzero = ((HOST_WIDE_INT) 2 << (floor_log2 (mode_width))) - 1;
8486       break;
8487
8488     case CLZ:
8489       /* If CLZ has a known value at zero, then the nonzero bits are
8490          that value, plus the number of bits in the mode minus one.  */
8491       if (CLZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
8492         nonzero |= ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width))) - 1;
8493       else
8494         nonzero = -1;
8495       break;
8496
8497     case CTZ:
8498       /* If CTZ has a known value at zero, then the nonzero bits are
8499          that value, plus the number of bits in the mode minus one.  */
8500       if (CTZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
8501         nonzero |= ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width))) - 1;
8502       else
8503         nonzero = -1;
8504       break;
8505
8506     case PARITY:
8507       nonzero = 1;
8508       break;
8509
8510     case IF_THEN_ELSE:
8511       nonzero &= (nonzero_bits_with_known (XEXP (x, 1), mode)
8512                   | nonzero_bits_with_known (XEXP (x, 2), mode));
8513       break;
8514
8515     default:
8516       break;
8517     }
8518
8519   return nonzero;
8520 }
8521
8522 /* See the macro definition above.  */
8523 #undef cached_num_sign_bit_copies
8524 \f
8525 #define num_sign_bit_copies_with_known(X, M) \
8526   cached_num_sign_bit_copies (X, M, known_x, known_mode, known_ret)
8527
8528 /* The function cached_num_sign_bit_copies is a wrapper around
8529    num_sign_bit_copies1.  It avoids exponential behavior in
8530    num_sign_bit_copies1 when X has identical subexpressions on the
8531    first or the second level.  */
8532
8533 static unsigned int
8534 cached_num_sign_bit_copies (rtx x, enum machine_mode mode, rtx known_x,
8535                             enum machine_mode known_mode,
8536                             unsigned int known_ret)
8537 {
8538   if (x == known_x && mode == known_mode)
8539     return known_ret;
8540
8541   /* Try to find identical subexpressions.  If found call
8542      num_sign_bit_copies1 on X with the subexpressions as KNOWN_X and
8543      the precomputed value for the subexpression as KNOWN_RET.  */
8544
8545   if (ARITHMETIC_P (x))
8546     {
8547       rtx x0 = XEXP (x, 0);
8548       rtx x1 = XEXP (x, 1);
8549
8550       /* Check the first level.  */
8551       if (x0 == x1)
8552         return
8553           num_sign_bit_copies1 (x, mode, x0, mode,
8554                                 num_sign_bit_copies_with_known (x0, mode));
8555
8556       /* Check the second level.  */
8557       if (ARITHMETIC_P (x0)
8558           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
8559         return
8560           num_sign_bit_copies1 (x, mode, x1, mode,
8561                                 num_sign_bit_copies_with_known (x1, mode));
8562
8563       if (ARITHMETIC_P (x1)
8564           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
8565         return
8566           num_sign_bit_copies1 (x, mode, x0, mode,
8567                                 num_sign_bit_copies_with_known (x0, mode));
8568     }
8569
8570   return num_sign_bit_copies1 (x, mode, known_x, known_mode, known_ret);
8571 }
8572
8573 /* Return the number of bits at the high-order end of X that are known to
8574    be equal to the sign bit.  X will be used in mode MODE; if MODE is
8575    VOIDmode, X will be used in its own mode.  The returned value  will always
8576    be between 1 and the number of bits in MODE.  */
8577
8578 static unsigned int
8579 num_sign_bit_copies1 (rtx x, enum machine_mode mode, rtx known_x,
8580                       enum machine_mode known_mode,
8581                       unsigned int known_ret)
8582 {
8583   enum rtx_code code = GET_CODE (x);
8584   unsigned int bitwidth;
8585   int num0, num1, result;
8586   unsigned HOST_WIDE_INT nonzero;
8587   rtx tem;
8588
8589   /* If we weren't given a mode, use the mode of X.  If the mode is still
8590      VOIDmode, we don't know anything.  Likewise if one of the modes is
8591      floating-point.  */
8592
8593   if (mode == VOIDmode)
8594     mode = GET_MODE (x);
8595
8596   if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x)))
8597     return 1;
8598
8599   bitwidth = GET_MODE_BITSIZE (mode);
8600
8601   /* For a smaller object, just ignore the high bits.  */
8602   if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x)))
8603     {
8604       num0 = num_sign_bit_copies_with_known (x, GET_MODE (x));
8605       return MAX (1,
8606                   num0 - (int) (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth));
8607     }
8608
8609   if (GET_MODE (x) != VOIDmode && bitwidth > GET_MODE_BITSIZE (GET_MODE (x)))
8610     {
8611 #ifndef WORD_REGISTER_OPERATIONS
8612   /* If this machine does not do all register operations on the entire
8613      register and MODE is wider than the mode of X, we can say nothing
8614      at all about the high-order bits.  */
8615       return 1;
8616 #else
8617       /* Likewise on machines that do, if the mode of the object is smaller
8618          than a word and loads of that size don't sign extend, we can say
8619          nothing about the high order bits.  */
8620       if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
8621 #ifdef LOAD_EXTEND_OP
8622           && LOAD_EXTEND_OP (GET_MODE (x)) != SIGN_EXTEND
8623 #endif
8624           )
8625         return 1;
8626 #endif
8627     }
8628
8629   switch (code)
8630     {
8631     case REG:
8632
8633 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
8634       /* If pointers extend signed and this is a pointer in Pmode, say that
8635          all the bits above ptr_mode are known to be sign bit copies.  */
8636       if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode
8637           && REG_POINTER (x))
8638         return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1;
8639 #endif
8640
8641       if (reg_stat[REGNO (x)].last_set_value != 0
8642           && reg_stat[REGNO (x)].last_set_mode == mode
8643           && (reg_stat[REGNO (x)].last_set_label == label_tick
8644               || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8645                   && REG_N_SETS (REGNO (x)) == 1
8646                   && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
8647                                         REGNO (x))))
8648           && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
8649         return reg_stat[REGNO (x)].last_set_sign_bit_copies;
8650
8651       tem = get_last_value (x);
8652       if (tem != 0)
8653         return num_sign_bit_copies_with_known (tem, mode);
8654
8655       if (nonzero_sign_valid && reg_stat[REGNO (x)].sign_bit_copies != 0
8656           && GET_MODE_BITSIZE (GET_MODE (x)) == bitwidth)
8657         return reg_stat[REGNO (x)].sign_bit_copies;
8658       break;
8659
8660     case MEM:
8661 #ifdef LOAD_EXTEND_OP
8662       /* Some RISC machines sign-extend all loads of smaller than a word.  */
8663       if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND)
8664         return MAX (1, ((int) bitwidth
8665                         - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1));
8666 #endif
8667       break;
8668
8669     case CONST_INT:
8670       /* If the constant is negative, take its 1's complement and remask.
8671          Then see how many zero bits we have.  */
8672       nonzero = INTVAL (x) & GET_MODE_MASK (mode);
8673       if (bitwidth <= HOST_BITS_PER_WIDE_INT
8674           && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8675         nonzero = (~nonzero) & GET_MODE_MASK (mode);
8676
8677       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
8678
8679     case SUBREG:
8680       /* If this is a SUBREG for a promoted object that is sign-extended
8681          and we are looking at it in a wider mode, we know that at least the
8682          high-order bits are known to be sign bit copies.  */
8683
8684       if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x))
8685         {
8686           num0 = num_sign_bit_copies_with_known (SUBREG_REG (x), mode);
8687           return MAX ((int) bitwidth
8688                       - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1,
8689                       num0);
8690         }
8691
8692       /* For a smaller object, just ignore the high bits.  */
8693       if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
8694         {
8695           num0 = num_sign_bit_copies_with_known (SUBREG_REG (x), VOIDmode);
8696           return MAX (1, (num0
8697                           - (int) (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
8698                                    - bitwidth)));
8699         }
8700
8701 #ifdef WORD_REGISTER_OPERATIONS
8702 #ifdef LOAD_EXTEND_OP
8703       /* For paradoxical SUBREGs on machines where all register operations
8704          affect the entire register, just look inside.  Note that we are
8705          passing MODE to the recursive call, so the number of sign bit copies
8706          will remain relative to that mode, not the inner mode.  */
8707
8708       /* This works only if loads sign extend.  Otherwise, if we get a
8709          reload for the inner part, it may be loaded from the stack, and
8710          then we lose all sign bit copies that existed before the store
8711          to the stack.  */
8712
8713       if ((GET_MODE_SIZE (GET_MODE (x))
8714            > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8715           && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
8716           && GET_CODE (SUBREG_REG (x)) == MEM)
8717         return num_sign_bit_copies_with_known (SUBREG_REG (x), mode);
8718 #endif
8719 #endif
8720       break;
8721
8722     case SIGN_EXTRACT:
8723       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
8724         return MAX (1, (int) bitwidth - INTVAL (XEXP (x, 1)));
8725       break;
8726
8727     case SIGN_EXTEND:
8728       return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8729               + num_sign_bit_copies_with_known (XEXP (x, 0), VOIDmode));
8730
8731     case TRUNCATE:
8732       /* For a smaller object, just ignore the high bits.  */
8733       num0 = num_sign_bit_copies_with_known (XEXP (x, 0), VOIDmode);
8734       return MAX (1, (num0 - (int) (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8735                                     - bitwidth)));
8736
8737     case NOT:
8738       return num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8739
8740     case ROTATE:       case ROTATERT:
8741       /* If we are rotating left by a number of bits less than the number
8742          of sign bit copies, we can just subtract that amount from the
8743          number.  */
8744       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8745           && INTVAL (XEXP (x, 1)) >= 0
8746           && INTVAL (XEXP (x, 1)) < (int) bitwidth)
8747         {
8748           num0 = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8749           return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
8750                                  : (int) bitwidth - INTVAL (XEXP (x, 1))));
8751         }
8752       break;
8753
8754     case NEG:
8755       /* In general, this subtracts one sign bit copy.  But if the value
8756          is known to be positive, the number of sign bit copies is the
8757          same as that of the input.  Finally, if the input has just one bit
8758          that might be nonzero, all the bits are copies of the sign bit.  */
8759       num0 = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8760       if (bitwidth > HOST_BITS_PER_WIDE_INT)
8761         return num0 > 1 ? num0 - 1 : 1;
8762
8763       nonzero = nonzero_bits (XEXP (x, 0), mode);
8764       if (nonzero == 1)
8765         return bitwidth;
8766
8767       if (num0 > 1
8768           && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero))
8769         num0--;
8770
8771       return num0;
8772
8773     case IOR:   case AND:   case XOR:
8774     case SMIN:  case SMAX:  case UMIN:  case UMAX:
8775       /* Logical operations will preserve the number of sign-bit copies.
8776          MIN and MAX operations always return one of the operands.  */
8777       num0 = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8778       num1 = num_sign_bit_copies_with_known (XEXP (x, 1), mode);
8779       return MIN (num0, num1);
8780
8781     case PLUS:  case MINUS:
8782       /* For addition and subtraction, we can have a 1-bit carry.  However,
8783          if we are subtracting 1 from a positive number, there will not
8784          be such a carry.  Furthermore, if the positive number is known to
8785          be 0 or 1, we know the result is either -1 or 0.  */
8786
8787       if (code == PLUS && XEXP (x, 1) == constm1_rtx
8788           && bitwidth <= HOST_BITS_PER_WIDE_INT)
8789         {
8790           nonzero = nonzero_bits (XEXP (x, 0), mode);
8791           if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0)
8792             return (nonzero == 1 || nonzero == 0 ? bitwidth
8793                     : bitwidth - floor_log2 (nonzero) - 1);
8794         }
8795
8796       num0 = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8797       num1 = num_sign_bit_copies_with_known (XEXP (x, 1), mode);
8798       result = MAX (1, MIN (num0, num1) - 1);
8799
8800 #ifdef POINTERS_EXTEND_UNSIGNED
8801       /* If pointers extend signed and this is an addition or subtraction
8802          to a pointer in Pmode, all the bits above ptr_mode are known to be
8803          sign bit copies.  */
8804       if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
8805           && (code == PLUS || code == MINUS)
8806           && GET_CODE (XEXP (x, 0)) == REG && REG_POINTER (XEXP (x, 0)))
8807         result = MAX ((int) (GET_MODE_BITSIZE (Pmode)
8808                              - GET_MODE_BITSIZE (ptr_mode) + 1),
8809                       result);
8810 #endif
8811       return result;
8812
8813     case MULT:
8814       /* The number of bits of the product is the sum of the number of
8815          bits of both terms.  However, unless one of the terms if known
8816          to be positive, we must allow for an additional bit since negating
8817          a negative number can remove one sign bit copy.  */
8818
8819       num0 = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8820       num1 = num_sign_bit_copies_with_known (XEXP (x, 1), mode);
8821
8822       result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
8823       if (result > 0
8824           && (bitwidth > HOST_BITS_PER_WIDE_INT
8825               || (((nonzero_bits (XEXP (x, 0), mode)
8826                     & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8827                   && ((nonzero_bits (XEXP (x, 1), mode)
8828                        & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))))
8829         result--;
8830
8831       return MAX (1, result);
8832
8833     case UDIV:
8834       /* The result must be <= the first operand.  If the first operand
8835          has the high bit set, we know nothing about the number of sign
8836          bit copies.  */
8837       if (bitwidth > HOST_BITS_PER_WIDE_INT)
8838         return 1;
8839       else if ((nonzero_bits (XEXP (x, 0), mode)
8840                 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8841         return 1;
8842       else
8843         return num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8844
8845     case UMOD:
8846       /* The result must be <= the second operand.  */
8847       return num_sign_bit_copies_with_known (XEXP (x, 1), mode);
8848
8849     case DIV:
8850       /* Similar to unsigned division, except that we have to worry about
8851          the case where the divisor is negative, in which case we have
8852          to add 1.  */
8853       result = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8854       if (result > 1
8855           && (bitwidth > HOST_BITS_PER_WIDE_INT
8856               || (nonzero_bits (XEXP (x, 1), mode)
8857                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8858         result--;
8859
8860       return result;
8861
8862     case MOD:
8863       result = num_sign_bit_copies_with_known (XEXP (x, 1), mode);
8864       if (result > 1
8865           && (bitwidth > HOST_BITS_PER_WIDE_INT
8866               || (nonzero_bits (XEXP (x, 1), mode)
8867                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8868         result--;
8869
8870       return result;
8871
8872     case ASHIFTRT:
8873       /* Shifts by a constant add to the number of bits equal to the
8874          sign bit.  */
8875       num0 = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8876       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8877           && INTVAL (XEXP (x, 1)) > 0)
8878         num0 = MIN ((int) bitwidth, num0 + INTVAL (XEXP (x, 1)));
8879
8880       return num0;
8881
8882     case ASHIFT:
8883       /* Left shifts destroy copies.  */
8884       if (GET_CODE (XEXP (x, 1)) != CONST_INT
8885           || INTVAL (XEXP (x, 1)) < 0
8886           || INTVAL (XEXP (x, 1)) >= (int) bitwidth)
8887         return 1;
8888
8889       num0 = num_sign_bit_copies_with_known (XEXP (x, 0), mode);
8890       return MAX (1, num0 - INTVAL (XEXP (x, 1)));
8891
8892     case IF_THEN_ELSE:
8893       num0 = num_sign_bit_copies_with_known (XEXP (x, 1), mode);
8894       num1 = num_sign_bit_copies_with_known (XEXP (x, 2), mode);
8895       return MIN (num0, num1);
8896
8897     case EQ:  case NE:  case GE:  case GT:  case LE:  case LT:
8898     case UNEQ:  case LTGT:  case UNGE:  case UNGT:  case UNLE:  case UNLT:
8899     case GEU: case GTU: case LEU: case LTU:
8900     case UNORDERED: case ORDERED:
8901       /* If the constant is negative, take its 1's complement and remask.
8902          Then see how many zero bits we have.  */
8903       nonzero = STORE_FLAG_VALUE;
8904       if (bitwidth <= HOST_BITS_PER_WIDE_INT
8905           && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8906         nonzero = (~nonzero) & GET_MODE_MASK (mode);
8907
8908       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
8909       break;
8910
8911     default:
8912       break;
8913     }
8914
8915   /* If we haven't been able to figure it out by one of the above rules,
8916      see if some of the high-order bits are known to be zero.  If so,
8917      count those bits and return one less than that amount.  If we can't
8918      safely compute the mask for this mode, always return BITWIDTH.  */
8919
8920   if (bitwidth > HOST_BITS_PER_WIDE_INT)
8921     return 1;
8922
8923   nonzero = nonzero_bits (x, mode);
8924   return (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))
8925           ? 1 : bitwidth - floor_log2 (nonzero) - 1);
8926 }
8927 \f
8928 /* Return the number of "extended" bits there are in X, when interpreted
8929    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
8930    unsigned quantities, this is the number of high-order zero bits.
8931    For signed quantities, this is the number of copies of the sign bit
8932    minus 1.  In both case, this function returns the number of "spare"
8933    bits.  For example, if two quantities for which this function returns
8934    at least 1 are added, the addition is known not to overflow.
8935
8936    This function will always return 0 unless called during combine, which
8937    implies that it must be called from a define_split.  */
8938
8939 unsigned int
8940 extended_count (rtx x, enum machine_mode mode, int unsignedp)
8941 {
8942   if (nonzero_sign_valid == 0)
8943     return 0;
8944
8945   return (unsignedp
8946           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8947              ? (unsigned int) (GET_MODE_BITSIZE (mode) - 1
8948                                - floor_log2 (nonzero_bits (x, mode)))
8949              : 0)
8950           : num_sign_bit_copies (x, mode) - 1);
8951 }
8952 \f
8953 /* This function is called from `simplify_shift_const' to merge two
8954    outer operations.  Specifically, we have already found that we need
8955    to perform operation *POP0 with constant *PCONST0 at the outermost
8956    position.  We would now like to also perform OP1 with constant CONST1
8957    (with *POP0 being done last).
8958
8959    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
8960    the resulting operation.  *PCOMP_P is set to 1 if we would need to
8961    complement the innermost operand, otherwise it is unchanged.
8962
8963    MODE is the mode in which the operation will be done.  No bits outside
8964    the width of this mode matter.  It is assumed that the width of this mode
8965    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
8966
8967    If *POP0 or OP1 are NIL, it means no operation is required.  Only NEG, PLUS,
8968    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
8969    result is simply *PCONST0.
8970
8971    If the resulting operation cannot be expressed as one operation, we
8972    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
8973
8974 static int
8975 merge_outer_ops (enum rtx_code *pop0, HOST_WIDE_INT *pconst0, enum rtx_code op1, HOST_WIDE_INT const1, enum machine_mode mode, int *pcomp_p)
8976 {
8977   enum rtx_code op0 = *pop0;
8978   HOST_WIDE_INT const0 = *pconst0;
8979
8980   const0 &= GET_MODE_MASK (mode);
8981   const1 &= GET_MODE_MASK (mode);
8982
8983   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
8984   if (op0 == AND)
8985     const1 &= const0;
8986
8987   /* If OP0 or OP1 is NIL, this is easy.  Similarly if they are the same or
8988      if OP0 is SET.  */
8989
8990   if (op1 == NIL || op0 == SET)
8991     return 1;
8992
8993   else if (op0 == NIL)
8994     op0 = op1, const0 = const1;
8995
8996   else if (op0 == op1)
8997     {
8998       switch (op0)
8999         {
9000         case AND:
9001           const0 &= const1;
9002           break;
9003         case IOR:
9004           const0 |= const1;
9005           break;
9006         case XOR:
9007           const0 ^= const1;
9008           break;
9009         case PLUS:
9010           const0 += const1;
9011           break;
9012         case NEG:
9013           op0 = NIL;
9014           break;
9015         default:
9016           break;
9017         }
9018     }
9019
9020   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
9021   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
9022     return 0;
9023
9024   /* If the two constants aren't the same, we can't do anything.  The
9025      remaining six cases can all be done.  */
9026   else if (const0 != const1)
9027     return 0;
9028
9029   else
9030     switch (op0)
9031       {
9032       case IOR:
9033         if (op1 == AND)
9034           /* (a & b) | b == b */
9035           op0 = SET;
9036         else /* op1 == XOR */
9037           /* (a ^ b) | b == a | b */
9038           {;}
9039         break;
9040
9041       case XOR:
9042         if (op1 == AND)
9043           /* (a & b) ^ b == (~a) & b */
9044           op0 = AND, *pcomp_p = 1;
9045         else /* op1 == IOR */
9046           /* (a | b) ^ b == a & ~b */
9047           op0 = AND, const0 = ~const0;
9048         break;
9049
9050       case AND:
9051         if (op1 == IOR)
9052           /* (a | b) & b == b */
9053         op0 = SET;
9054         else /* op1 == XOR */
9055           /* (a ^ b) & b) == (~a) & b */
9056           *pcomp_p = 1;
9057         break;
9058       default:
9059         break;
9060       }
9061
9062   /* Check for NO-OP cases.  */
9063   const0 &= GET_MODE_MASK (mode);
9064   if (const0 == 0
9065       && (op0 == IOR || op0 == XOR || op0 == PLUS))
9066     op0 = NIL;
9067   else if (const0 == 0 && op0 == AND)
9068     op0 = SET;
9069   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
9070            && op0 == AND)
9071     op0 = NIL;
9072
9073   /* ??? Slightly redundant with the above mask, but not entirely.
9074      Moving this above means we'd have to sign-extend the mode mask
9075      for the final test.  */
9076   const0 = trunc_int_for_mode (const0, mode);
9077
9078   *pop0 = op0;
9079   *pconst0 = const0;
9080
9081   return 1;
9082 }
9083 \f
9084 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
9085    The result of the shift is RESULT_MODE.  X, if nonzero, is an expression
9086    that we started with.
9087
9088    The shift is normally computed in the widest mode we find in VAROP, as
9089    long as it isn't a different number of words than RESULT_MODE.  Exceptions
9090    are ASHIFTRT and ROTATE, which are always done in their original mode,  */
9091
9092 static rtx
9093 simplify_shift_const (rtx x, enum rtx_code code,
9094                       enum machine_mode result_mode, rtx varop,
9095                       int orig_count)
9096 {
9097   enum rtx_code orig_code = code;
9098   unsigned int count;
9099   int signed_count;
9100   enum machine_mode mode = result_mode;
9101   enum machine_mode shift_mode, tmode;
9102   unsigned int mode_words
9103     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
9104   /* We form (outer_op (code varop count) (outer_const)).  */
9105   enum rtx_code outer_op = NIL;
9106   HOST_WIDE_INT outer_const = 0;
9107   rtx const_rtx;
9108   int complement_p = 0;
9109   rtx new;
9110
9111   /* Make sure and truncate the "natural" shift on the way in.  We don't
9112      want to do this inside the loop as it makes it more difficult to
9113      combine shifts.  */
9114   if (SHIFT_COUNT_TRUNCATED)
9115     orig_count &= GET_MODE_BITSIZE (mode) - 1;
9116
9117   /* If we were given an invalid count, don't do anything except exactly
9118      what was requested.  */
9119
9120   if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
9121     {
9122       if (x)
9123         return x;
9124
9125       return gen_rtx_fmt_ee (code, mode, varop, GEN_INT (orig_count));
9126     }
9127
9128   count = orig_count;
9129
9130   /* Unless one of the branches of the `if' in this loop does a `continue',
9131      we will `break' the loop after the `if'.  */
9132
9133   while (count != 0)
9134     {
9135       /* If we have an operand of (clobber (const_int 0)), just return that
9136          value.  */
9137       if (GET_CODE (varop) == CLOBBER)
9138         return varop;
9139
9140       /* If we discovered we had to complement VAROP, leave.  Making a NOT
9141          here would cause an infinite loop.  */
9142       if (complement_p)
9143         break;
9144
9145       /* Convert ROTATERT to ROTATE.  */
9146       if (code == ROTATERT)
9147         {
9148           unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
9149           code = ROTATE;
9150           if (VECTOR_MODE_P (result_mode))
9151             count = bitsize / GET_MODE_NUNITS (result_mode) - count;
9152           else
9153             count = bitsize - count;
9154         }
9155
9156       /* We need to determine what mode we will do the shift in.  If the
9157          shift is a right shift or a ROTATE, we must always do it in the mode
9158          it was originally done in.  Otherwise, we can do it in MODE, the
9159          widest mode encountered.  */
9160       shift_mode
9161         = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9162            ? result_mode : mode);
9163
9164       /* Handle cases where the count is greater than the size of the mode
9165          minus 1.  For ASHIFT, use the size minus one as the count (this can
9166          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
9167          take the count modulo the size.  For other shifts, the result is
9168          zero.
9169
9170          Since these shifts are being produced by the compiler by combining
9171          multiple operations, each of which are defined, we know what the
9172          result is supposed to be.  */
9173
9174       if (count > (unsigned int) (GET_MODE_BITSIZE (shift_mode) - 1))
9175         {
9176           if (code == ASHIFTRT)
9177             count = GET_MODE_BITSIZE (shift_mode) - 1;
9178           else if (code == ROTATE || code == ROTATERT)
9179             count %= GET_MODE_BITSIZE (shift_mode);
9180           else
9181             {
9182               /* We can't simply return zero because there may be an
9183                  outer op.  */
9184               varop = const0_rtx;
9185               count = 0;
9186               break;
9187             }
9188         }
9189
9190       /* An arithmetic right shift of a quantity known to be -1 or 0
9191          is a no-op.  */
9192       if (code == ASHIFTRT
9193           && (num_sign_bit_copies (varop, shift_mode)
9194               == GET_MODE_BITSIZE (shift_mode)))
9195         {
9196           count = 0;
9197           break;
9198         }
9199
9200       /* If we are doing an arithmetic right shift and discarding all but
9201          the sign bit copies, this is equivalent to doing a shift by the
9202          bitsize minus one.  Convert it into that shift because it will often
9203          allow other simplifications.  */
9204
9205       if (code == ASHIFTRT
9206           && (count + num_sign_bit_copies (varop, shift_mode)
9207               >= GET_MODE_BITSIZE (shift_mode)))
9208         count = GET_MODE_BITSIZE (shift_mode) - 1;
9209
9210       /* We simplify the tests below and elsewhere by converting
9211          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
9212          `make_compound_operation' will convert it to an ASHIFTRT for
9213          those machines (such as VAX) that don't have an LSHIFTRT.  */
9214       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9215           && code == ASHIFTRT
9216           && ((nonzero_bits (varop, shift_mode)
9217                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
9218               == 0))
9219         code = LSHIFTRT;
9220
9221       if (code == LSHIFTRT
9222           && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9223           && !(nonzero_bits (varop, shift_mode) >> count))
9224         varop = const0_rtx;
9225       if (code == ASHIFT
9226           && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9227           && !((nonzero_bits (varop, shift_mode) << count)
9228                & GET_MODE_MASK (shift_mode)))
9229         varop = const0_rtx;
9230
9231       switch (GET_CODE (varop))
9232         {
9233         case SIGN_EXTEND:
9234         case ZERO_EXTEND:
9235         case SIGN_EXTRACT:
9236         case ZERO_EXTRACT:
9237           new = expand_compound_operation (varop);
9238           if (new != varop)
9239             {
9240               varop = new;
9241               continue;
9242             }
9243           break;
9244
9245         case MEM:
9246           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
9247              minus the width of a smaller mode, we can do this with a
9248              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
9249           if ((code == ASHIFTRT || code == LSHIFTRT)
9250               && ! mode_dependent_address_p (XEXP (varop, 0))
9251               && ! MEM_VOLATILE_P (varop)
9252               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9253                                          MODE_INT, 1)) != BLKmode)
9254             {
9255               new = adjust_address_nv (varop, tmode,
9256                                        BYTES_BIG_ENDIAN ? 0
9257                                        : count / BITS_PER_UNIT);
9258
9259               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9260                                      : ZERO_EXTEND, mode, new);
9261               count = 0;
9262               continue;
9263             }
9264           break;
9265
9266         case USE:
9267           /* Similar to the case above, except that we can only do this if
9268              the resulting mode is the same as that of the underlying
9269              MEM and adjust the address depending on the *bits* endianness
9270              because of the way that bit-field extract insns are defined.  */
9271           if ((code == ASHIFTRT || code == LSHIFTRT)
9272               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9273                                          MODE_INT, 1)) != BLKmode
9274               && tmode == GET_MODE (XEXP (varop, 0)))
9275             {
9276               if (BITS_BIG_ENDIAN)
9277                 new = XEXP (varop, 0);
9278               else
9279                 {
9280                   new = copy_rtx (XEXP (varop, 0));
9281                   SUBST (XEXP (new, 0),
9282                          plus_constant (XEXP (new, 0),
9283                                         count / BITS_PER_UNIT));
9284                 }
9285
9286               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9287                                      : ZERO_EXTEND, mode, new);
9288               count = 0;
9289               continue;
9290             }
9291           break;
9292
9293         case SUBREG:
9294           /* If VAROP is a SUBREG, strip it as long as the inner operand has
9295              the same number of words as what we've seen so far.  Then store
9296              the widest mode in MODE.  */
9297           if (subreg_lowpart_p (varop)
9298               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9299                   > GET_MODE_SIZE (GET_MODE (varop)))
9300               && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9301                                   + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9302                  == mode_words)
9303             {
9304               varop = SUBREG_REG (varop);
9305               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9306                 mode = GET_MODE (varop);
9307               continue;
9308             }
9309           break;
9310
9311         case MULT:
9312           /* Some machines use MULT instead of ASHIFT because MULT
9313              is cheaper.  But it is still better on those machines to
9314              merge two shifts into one.  */
9315           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9316               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9317             {
9318               varop
9319                 = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
9320                               GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
9321               continue;
9322             }
9323           break;
9324
9325         case UDIV:
9326           /* Similar, for when divides are cheaper.  */
9327           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9328               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9329             {
9330               varop
9331                 = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
9332                               GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
9333               continue;
9334             }
9335           break;
9336
9337         case ASHIFTRT:
9338           /* If we are extracting just the sign bit of an arithmetic
9339              right shift, that shift is not needed.  However, the sign
9340              bit of a wider mode may be different from what would be
9341              interpreted as the sign bit in a narrower mode, so, if
9342              the result is narrower, don't discard the shift.  */
9343           if (code == LSHIFTRT
9344               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9345               && (GET_MODE_BITSIZE (result_mode)
9346                   >= GET_MODE_BITSIZE (GET_MODE (varop))))
9347             {
9348               varop = XEXP (varop, 0);
9349               continue;
9350             }
9351
9352           /* ... fall through ...  */
9353
9354         case LSHIFTRT:
9355         case ASHIFT:
9356         case ROTATE:
9357           /* Here we have two nested shifts.  The result is usually the
9358              AND of a new shift with a mask.  We compute the result below.  */
9359           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9360               && INTVAL (XEXP (varop, 1)) >= 0
9361               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
9362               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9363               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
9364             {
9365               enum rtx_code first_code = GET_CODE (varop);
9366               unsigned int first_count = INTVAL (XEXP (varop, 1));
9367               unsigned HOST_WIDE_INT mask;
9368               rtx mask_rtx;
9369
9370               /* We have one common special case.  We can't do any merging if
9371                  the inner code is an ASHIFTRT of a smaller mode.  However, if
9372                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
9373                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
9374                  we can convert it to
9375                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
9376                  This simplifies certain SIGN_EXTEND operations.  */
9377               if (code == ASHIFT && first_code == ASHIFTRT
9378                   && count == (unsigned int)
9379                               (GET_MODE_BITSIZE (result_mode)
9380                                - GET_MODE_BITSIZE (GET_MODE (varop))))
9381                 {
9382                   /* C3 has the low-order C1 bits zero.  */
9383
9384                   mask = (GET_MODE_MASK (mode)
9385                           & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
9386
9387                   varop = simplify_and_const_int (NULL_RTX, result_mode,
9388                                                   XEXP (varop, 0), mask);
9389                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
9390                                                 varop, count);
9391                   count = first_count;
9392                   code = ASHIFTRT;
9393                   continue;
9394                 }
9395
9396               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
9397                  than C1 high-order bits equal to the sign bit, we can convert
9398                  this to either an ASHIFT or an ASHIFTRT depending on the
9399                  two counts.
9400
9401                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
9402
9403               if (code == ASHIFTRT && first_code == ASHIFT
9404                   && GET_MODE (varop) == shift_mode
9405                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
9406                       > first_count))
9407                 {
9408                   varop = XEXP (varop, 0);
9409
9410                   signed_count = count - first_count;
9411                   if (signed_count < 0)
9412                     count = -signed_count, code = ASHIFT;
9413                   else
9414                     count = signed_count;
9415
9416                   continue;
9417                 }
9418
9419               /* There are some cases we can't do.  If CODE is ASHIFTRT,
9420                  we can only do this if FIRST_CODE is also ASHIFTRT.
9421
9422                  We can't do the case when CODE is ROTATE and FIRST_CODE is
9423                  ASHIFTRT.
9424
9425                  If the mode of this shift is not the mode of the outer shift,
9426                  we can't do this if either shift is a right shift or ROTATE.
9427
9428                  Finally, we can't do any of these if the mode is too wide
9429                  unless the codes are the same.
9430
9431                  Handle the case where the shift codes are the same
9432                  first.  */
9433
9434               if (code == first_code)
9435                 {
9436                   if (GET_MODE (varop) != result_mode
9437                       && (code == ASHIFTRT || code == LSHIFTRT
9438                           || code == ROTATE))
9439                     break;
9440
9441                   count += first_count;
9442                   varop = XEXP (varop, 0);
9443                   continue;
9444                 }
9445
9446               if (code == ASHIFTRT
9447                   || (code == ROTATE && first_code == ASHIFTRT)
9448                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
9449                   || (GET_MODE (varop) != result_mode
9450                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
9451                           || first_code == ROTATE
9452                           || code == ROTATE)))
9453                 break;
9454
9455               /* To compute the mask to apply after the shift, shift the
9456                  nonzero bits of the inner shift the same way the
9457                  outer shift will.  */
9458
9459               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
9460
9461               mask_rtx
9462                 = simplify_binary_operation (code, result_mode, mask_rtx,
9463                                              GEN_INT (count));
9464
9465               /* Give up if we can't compute an outer operation to use.  */
9466               if (mask_rtx == 0
9467                   || GET_CODE (mask_rtx) != CONST_INT
9468                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
9469                                         INTVAL (mask_rtx),
9470                                         result_mode, &complement_p))
9471                 break;
9472
9473               /* If the shifts are in the same direction, we add the
9474                  counts.  Otherwise, we subtract them.  */
9475               signed_count = count;
9476               if ((code == ASHIFTRT || code == LSHIFTRT)
9477                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
9478                 signed_count += first_count;
9479               else
9480                 signed_count -= first_count;
9481
9482               /* If COUNT is positive, the new shift is usually CODE,
9483                  except for the two exceptions below, in which case it is
9484                  FIRST_CODE.  If the count is negative, FIRST_CODE should
9485                  always be used  */
9486               if (signed_count > 0
9487                   && ((first_code == ROTATE && code == ASHIFT)
9488                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
9489                 code = first_code, count = signed_count;
9490               else if (signed_count < 0)
9491                 code = first_code, count = -signed_count;
9492               else
9493                 count = signed_count;
9494
9495               varop = XEXP (varop, 0);
9496               continue;
9497             }
9498
9499           /* If we have (A << B << C) for any shift, we can convert this to
9500              (A << C << B).  This wins if A is a constant.  Only try this if
9501              B is not a constant.  */
9502
9503           else if (GET_CODE (varop) == code
9504                    && GET_CODE (XEXP (varop, 1)) != CONST_INT
9505                    && 0 != (new
9506                             = simplify_binary_operation (code, mode,
9507                                                          XEXP (varop, 0),
9508                                                          GEN_INT (count))))
9509             {
9510               varop = gen_rtx_fmt_ee (code, mode, new, XEXP (varop, 1));
9511               count = 0;
9512               continue;
9513             }
9514           break;
9515
9516         case NOT:
9517           /* Make this fit the case below.  */
9518           varop = gen_rtx_XOR (mode, XEXP (varop, 0),
9519                                GEN_INT (GET_MODE_MASK (mode)));
9520           continue;
9521
9522         case IOR:
9523         case AND:
9524         case XOR:
9525           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
9526              with C the size of VAROP - 1 and the shift is logical if
9527              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9528              we have an (le X 0) operation.   If we have an arithmetic shift
9529              and STORE_FLAG_VALUE is 1 or we have a logical shift with
9530              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
9531
9532           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
9533               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
9534               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9535               && (code == LSHIFTRT || code == ASHIFTRT)
9536               && count == (unsigned int)
9537                           (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9538               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9539             {
9540               count = 0;
9541               varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
9542                                   const0_rtx);
9543
9544               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9545                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9546
9547               continue;
9548             }
9549
9550           /* If we have (shift (logical)), move the logical to the outside
9551              to allow it to possibly combine with another logical and the
9552              shift to combine with another shift.  This also canonicalizes to
9553              what a ZERO_EXTRACT looks like.  Also, some machines have
9554              (and (shift)) insns.  */
9555
9556           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9557               /* We can't do this if we have (ashiftrt (xor))  and the
9558                  constant has its sign bit set in shift_mode.  */
9559               && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9560                    && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9561                                               shift_mode))
9562               && (new = simplify_binary_operation (code, result_mode,
9563                                                    XEXP (varop, 1),
9564                                                    GEN_INT (count))) != 0
9565               && GET_CODE (new) == CONST_INT
9566               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
9567                                   INTVAL (new), result_mode, &complement_p))
9568             {
9569               varop = XEXP (varop, 0);
9570               continue;
9571             }
9572
9573           /* If we can't do that, try to simplify the shift in each arm of the
9574              logical expression, make a new logical expression, and apply
9575              the inverse distributive law.  This also can't be done
9576              for some (ashiftrt (xor)).  */
9577           if (code != ASHIFTRT || GET_CODE (varop)!= XOR
9578               || 0 <= trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9579                                           shift_mode))
9580             {
9581               rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9582                                               XEXP (varop, 0), count);
9583               rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9584                                               XEXP (varop, 1), count);
9585
9586               varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs);
9587               varop = apply_distributive_law (varop);
9588
9589               count = 0;
9590             }
9591           break;
9592
9593         case EQ:
9594           /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
9595              says that the sign bit can be tested, FOO has mode MODE, C is
9596              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
9597              that may be nonzero.  */
9598           if (code == LSHIFTRT
9599               && XEXP (varop, 1) == const0_rtx
9600               && GET_MODE (XEXP (varop, 0)) == result_mode
9601               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9602               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9603               && ((STORE_FLAG_VALUE
9604                    & ((HOST_WIDE_INT) 1
9605                       < (GET_MODE_BITSIZE (result_mode) - 1))))
9606               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9607               && merge_outer_ops (&outer_op, &outer_const, XOR,
9608                                   (HOST_WIDE_INT) 1, result_mode,
9609                                   &complement_p))
9610             {
9611               varop = XEXP (varop, 0);
9612               count = 0;
9613               continue;
9614             }
9615           break;
9616
9617         case NEG:
9618           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
9619              than the number of bits in the mode is equivalent to A.  */
9620           if (code == LSHIFTRT
9621               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9622               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
9623             {
9624               varop = XEXP (varop, 0);
9625               count = 0;
9626               continue;
9627             }
9628
9629           /* NEG commutes with ASHIFT since it is multiplication.  Move the
9630              NEG outside to allow shifts to combine.  */
9631           if (code == ASHIFT
9632               && merge_outer_ops (&outer_op, &outer_const, NEG,
9633                                   (HOST_WIDE_INT) 0, result_mode,
9634                                   &complement_p))
9635             {
9636               varop = XEXP (varop, 0);
9637               continue;
9638             }
9639           break;
9640
9641         case PLUS:
9642           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9643              is one less than the number of bits in the mode is
9644              equivalent to (xor A 1).  */
9645           if (code == LSHIFTRT
9646               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9647               && XEXP (varop, 1) == constm1_rtx
9648               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9649               && merge_outer_ops (&outer_op, &outer_const, XOR,
9650                                   (HOST_WIDE_INT) 1, result_mode,
9651                                   &complement_p))
9652             {
9653               count = 0;
9654               varop = XEXP (varop, 0);
9655               continue;
9656             }
9657
9658           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
9659              that might be nonzero in BAR are those being shifted out and those
9660              bits are known zero in FOO, we can replace the PLUS with FOO.
9661              Similarly in the other operand order.  This code occurs when
9662              we are computing the size of a variable-size array.  */
9663
9664           if ((code == ASHIFTRT || code == LSHIFTRT)
9665               && count < HOST_BITS_PER_WIDE_INT
9666               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9667               && (nonzero_bits (XEXP (varop, 1), result_mode)
9668                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9669             {
9670               varop = XEXP (varop, 0);
9671               continue;
9672             }
9673           else if ((code == ASHIFTRT || code == LSHIFTRT)
9674                    && count < HOST_BITS_PER_WIDE_INT
9675                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9676                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9677                             >> count)
9678                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9679                             & nonzero_bits (XEXP (varop, 1),
9680                                                  result_mode)))
9681             {
9682               varop = XEXP (varop, 1);
9683               continue;
9684             }
9685
9686           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
9687           if (code == ASHIFT
9688               && GET_CODE (XEXP (varop, 1)) == CONST_INT
9689               && (new = simplify_binary_operation (ASHIFT, result_mode,
9690                                                    XEXP (varop, 1),
9691                                                    GEN_INT (count))) != 0
9692               && GET_CODE (new) == CONST_INT
9693               && merge_outer_ops (&outer_op, &outer_const, PLUS,
9694                                   INTVAL (new), result_mode, &complement_p))
9695             {
9696               varop = XEXP (varop, 0);
9697               continue;
9698             }
9699           break;
9700
9701         case MINUS:
9702           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9703              with C the size of VAROP - 1 and the shift is logical if
9704              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9705              we have a (gt X 0) operation.  If the shift is arithmetic with
9706              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9707              we have a (neg (gt X 0)) operation.  */
9708
9709           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9710               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9711               && count == (unsigned int)
9712                           (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9713               && (code == LSHIFTRT || code == ASHIFTRT)
9714               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9715               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (varop, 0), 1))
9716                  == count
9717               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9718             {
9719               count = 0;
9720               varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9721                                   const0_rtx);
9722
9723               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9724                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9725
9726               continue;
9727             }
9728           break;
9729
9730         case TRUNCATE:
9731           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9732              if the truncate does not affect the value.  */
9733           if (code == LSHIFTRT
9734               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9735               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9736               && (INTVAL (XEXP (XEXP (varop, 0), 1))
9737                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9738                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
9739             {
9740               rtx varop_inner = XEXP (varop, 0);
9741
9742               varop_inner
9743                 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
9744                                     XEXP (varop_inner, 0),
9745                                     GEN_INT
9746                                     (count + INTVAL (XEXP (varop_inner, 1))));
9747               varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
9748               count = 0;
9749               continue;
9750             }
9751           break;
9752
9753         default:
9754           break;
9755         }
9756
9757       break;
9758     }
9759
9760   /* We need to determine what mode to do the shift in.  If the shift is
9761      a right shift or ROTATE, we must always do it in the mode it was
9762      originally done in.  Otherwise, we can do it in MODE, the widest mode
9763      encountered.  The code we care about is that of the shift that will
9764      actually be done, not the shift that was originally requested.  */
9765   shift_mode
9766     = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9767        ? result_mode : mode);
9768
9769   /* We have now finished analyzing the shift.  The result should be
9770      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
9771      OUTER_OP is non-NIL, it is an operation that needs to be applied
9772      to the result of the shift.  OUTER_CONST is the relevant constant,
9773      but we must turn off all bits turned off in the shift.
9774
9775      If we were passed a value for X, see if we can use any pieces of
9776      it.  If not, make new rtx.  */
9777
9778   if (x && GET_RTX_CLASS (GET_CODE (x)) == RTX_BIN_ARITH
9779       && GET_CODE (XEXP (x, 1)) == CONST_INT
9780       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) == count)
9781     const_rtx = XEXP (x, 1);
9782   else
9783     const_rtx = GEN_INT (count);
9784
9785   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
9786       && GET_MODE (XEXP (x, 0)) == shift_mode
9787       && SUBREG_REG (XEXP (x, 0)) == varop)
9788     varop = XEXP (x, 0);
9789   else if (GET_MODE (varop) != shift_mode)
9790     varop = gen_lowpart (shift_mode, varop);
9791
9792   /* If we can't make the SUBREG, try to return what we were given.  */
9793   if (GET_CODE (varop) == CLOBBER)
9794     return x ? x : varop;
9795
9796   new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
9797   if (new != 0)
9798     x = new;
9799   else
9800     x = gen_rtx_fmt_ee (code, shift_mode, varop, const_rtx);
9801
9802   /* If we have an outer operation and we just made a shift, it is
9803      possible that we could have simplified the shift were it not
9804      for the outer operation.  So try to do the simplification
9805      recursively.  */
9806
9807   if (outer_op != NIL && GET_CODE (x) == code
9808       && GET_CODE (XEXP (x, 1)) == CONST_INT)
9809     x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0),
9810                               INTVAL (XEXP (x, 1)));
9811
9812   /* If we were doing an LSHIFTRT in a wider mode than it was originally,
9813      turn off all the bits that the shift would have turned off.  */
9814   if (orig_code == LSHIFTRT && result_mode != shift_mode)
9815     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
9816                                 GET_MODE_MASK (result_mode) >> orig_count);
9817
9818   /* Do the remainder of the processing in RESULT_MODE.  */
9819   x = gen_lowpart (result_mode, x);
9820
9821   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
9822      operation.  */
9823   if (complement_p)
9824     x = simplify_gen_unary (NOT, result_mode, x, result_mode);
9825
9826   if (outer_op != NIL)
9827     {
9828       if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
9829         outer_const = trunc_int_for_mode (outer_const, result_mode);
9830
9831       if (outer_op == AND)
9832         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
9833       else if (outer_op == SET)
9834         /* This means that we have determined that the result is
9835            equivalent to a constant.  This should be rare.  */
9836         x = GEN_INT (outer_const);
9837       else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
9838         x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
9839       else
9840         x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
9841     }
9842
9843   return x;
9844 }
9845 \f
9846 /* Like recog, but we receive the address of a pointer to a new pattern.
9847    We try to match the rtx that the pointer points to.
9848    If that fails, we may try to modify or replace the pattern,
9849    storing the replacement into the same pointer object.
9850
9851    Modifications include deletion or addition of CLOBBERs.
9852
9853    PNOTES is a pointer to a location where any REG_UNUSED notes added for
9854    the CLOBBERs are placed.
9855
9856    The value is the final insn code from the pattern ultimately matched,
9857    or -1.  */
9858
9859 static int
9860 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
9861 {
9862   rtx pat = *pnewpat;
9863   int insn_code_number;
9864   int num_clobbers_to_add = 0;
9865   int i;
9866   rtx notes = 0;
9867   rtx old_notes, old_pat;
9868
9869   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
9870      we use to indicate that something didn't match.  If we find such a
9871      thing, force rejection.  */
9872   if (GET_CODE (pat) == PARALLEL)
9873     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
9874       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
9875           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
9876         return -1;
9877
9878   old_pat = PATTERN (insn);
9879   old_notes = REG_NOTES (insn);
9880   PATTERN (insn) = pat;
9881   REG_NOTES (insn) = 0;
9882
9883   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9884
9885   /* If it isn't, there is the possibility that we previously had an insn
9886      that clobbered some register as a side effect, but the combined
9887      insn doesn't need to do that.  So try once more without the clobbers
9888      unless this represents an ASM insn.  */
9889
9890   if (insn_code_number < 0 && ! check_asm_operands (pat)
9891       && GET_CODE (pat) == PARALLEL)
9892     {
9893       int pos;
9894
9895       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
9896         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
9897           {
9898             if (i != pos)
9899               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
9900             pos++;
9901           }
9902
9903       SUBST_INT (XVECLEN (pat, 0), pos);
9904
9905       if (pos == 1)
9906         pat = XVECEXP (pat, 0, 0);
9907
9908       PATTERN (insn) = pat;
9909       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9910     }
9911   PATTERN (insn) = old_pat;
9912   REG_NOTES (insn) = old_notes;
9913
9914   /* Recognize all noop sets, these will be killed by followup pass.  */
9915   if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
9916     insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
9917
9918   /* If we had any clobbers to add, make a new pattern than contains
9919      them.  Then check to make sure that all of them are dead.  */
9920   if (num_clobbers_to_add)
9921     {
9922       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
9923                                      rtvec_alloc (GET_CODE (pat) == PARALLEL
9924                                                   ? (XVECLEN (pat, 0)
9925                                                      + num_clobbers_to_add)
9926                                                   : num_clobbers_to_add + 1));
9927
9928       if (GET_CODE (pat) == PARALLEL)
9929         for (i = 0; i < XVECLEN (pat, 0); i++)
9930           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
9931       else
9932         XVECEXP (newpat, 0, 0) = pat;
9933
9934       add_clobbers (newpat, insn_code_number);
9935
9936       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
9937            i < XVECLEN (newpat, 0); i++)
9938         {
9939           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG
9940               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
9941             return -1;
9942           notes = gen_rtx_EXPR_LIST (REG_UNUSED,
9943                                      XEXP (XVECEXP (newpat, 0, i), 0), notes);
9944         }
9945       pat = newpat;
9946     }
9947
9948   *pnewpat = pat;
9949   *pnotes = notes;
9950
9951   return insn_code_number;
9952 }
9953 \f
9954 /* Like gen_lowpart_general but for use by combine.  In combine it
9955    is not possible to create any new pseudoregs.  However, it is
9956    safe to create invalid memory addresses, because combine will
9957    try to recognize them and all they will do is make the combine
9958    attempt fail.
9959
9960    If for some reason this cannot do its job, an rtx
9961    (clobber (const_int 0)) is returned.
9962    An insn containing that will not be recognized.  */
9963
9964 static rtx
9965 gen_lowpart_for_combine (enum machine_mode mode, rtx x)
9966 {
9967   rtx result;
9968
9969   if (GET_MODE (x) == mode)
9970     return x;
9971
9972   /* Return identity if this is a CONST or symbolic
9973      reference.  */
9974   if (mode == Pmode
9975       && (GET_CODE (x) == CONST
9976           || GET_CODE (x) == SYMBOL_REF
9977           || GET_CODE (x) == LABEL_REF))
9978     return x;
9979
9980   /* We can only support MODE being wider than a word if X is a
9981      constant integer or has a mode the same size.  */
9982
9983   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
9984       && ! ((GET_MODE (x) == VOIDmode
9985              && (GET_CODE (x) == CONST_INT
9986                  || GET_CODE (x) == CONST_DOUBLE))
9987             || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode)))
9988     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9989
9990   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
9991      won't know what to do.  So we will strip off the SUBREG here and
9992      process normally.  */
9993   if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
9994     {
9995       x = SUBREG_REG (x);
9996       if (GET_MODE (x) == mode)
9997         return x;
9998     }
9999
10000   result = gen_lowpart_common (mode, x);
10001 #ifdef CANNOT_CHANGE_MODE_CLASS
10002   if (result != 0
10003       && GET_CODE (result) == SUBREG
10004       && GET_CODE (SUBREG_REG (result)) == REG
10005       && REGNO (SUBREG_REG (result)) >= FIRST_PSEUDO_REGISTER)
10006     bitmap_set_bit (&subregs_of_mode, REGNO (SUBREG_REG (result))
10007                                       * MAX_MACHINE_MODE
10008                                       + GET_MODE (result));
10009 #endif
10010
10011   if (result)
10012     return result;
10013
10014   if (GET_CODE (x) == MEM)
10015     {
10016       int offset = 0;
10017
10018       /* Refuse to work on a volatile memory ref or one with a mode-dependent
10019          address.  */
10020       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
10021         return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
10022
10023       /* If we want to refer to something bigger than the original memref,
10024          generate a paradoxical subreg instead.  That will force a reload
10025          of the original memref X.  */
10026       if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode))
10027         return gen_rtx_SUBREG (mode, x, 0);
10028
10029       if (WORDS_BIG_ENDIAN)
10030         offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
10031                   - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
10032
10033       if (BYTES_BIG_ENDIAN)
10034         {
10035           /* Adjust the address so that the address-after-the-data is
10036              unchanged.  */
10037           offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
10038                      - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
10039         }
10040
10041       return adjust_address_nv (x, mode, offset);
10042     }
10043
10044   /* If X is a comparison operator, rewrite it in a new mode.  This
10045      probably won't match, but may allow further simplifications.  */
10046   else if (COMPARISON_P (x))
10047     return gen_rtx_fmt_ee (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1));
10048
10049   /* If we couldn't simplify X any other way, just enclose it in a
10050      SUBREG.  Normally, this SUBREG won't match, but some patterns may
10051      include an explicit SUBREG or we may simplify it further in combine.  */
10052   else
10053     {
10054       int offset = 0;
10055       rtx res;
10056       enum machine_mode sub_mode = GET_MODE (x);
10057
10058       offset = subreg_lowpart_offset (mode, sub_mode);
10059       if (sub_mode == VOIDmode)
10060         {
10061           sub_mode = int_mode_for_mode (mode);
10062           x = gen_lowpart_common (sub_mode, x);
10063           if (x == 0)
10064             return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
10065         }
10066       res = simplify_gen_subreg (mode, x, sub_mode, offset);
10067       if (res)
10068         return res;
10069       return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
10070     }
10071 }
10072 \f
10073 /* These routines make binary and unary operations by first seeing if they
10074    fold; if not, a new expression is allocated.  */
10075
10076 static rtx
10077 gen_binary (enum rtx_code code, enum machine_mode mode, rtx op0, rtx op1)
10078 {
10079   rtx result;
10080   rtx tem;
10081
10082   if (GET_CODE (op0) == CLOBBER)
10083     return op0;
10084   else if (GET_CODE (op1) == CLOBBER)
10085     return op1;
10086   
10087   if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
10088       && swap_commutative_operands_p (op0, op1))
10089     tem = op0, op0 = op1, op1 = tem;
10090
10091   if (GET_RTX_CLASS (code) == RTX_COMPARE
10092       || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
10093     {
10094       enum machine_mode op_mode = GET_MODE (op0);
10095
10096       /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get
10097          just (REL_OP X Y).  */
10098       if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
10099         {
10100           op1 = XEXP (op0, 1);
10101           op0 = XEXP (op0, 0);
10102           op_mode = GET_MODE (op0);
10103         }
10104
10105       if (op_mode == VOIDmode)
10106         op_mode = GET_MODE (op1);
10107       result = simplify_relational_operation (code, mode, op_mode, op0, op1);
10108     }
10109   else
10110     result = simplify_binary_operation (code, mode, op0, op1);
10111
10112   if (result)
10113     return result;
10114
10115   /* Put complex operands first and constants second.  */
10116   if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
10117       && swap_commutative_operands_p (op0, op1))
10118     return gen_rtx_fmt_ee (code, mode, op1, op0);
10119
10120   /* If we are turning off bits already known off in OP0, we need not do
10121      an AND.  */
10122   else if (code == AND && GET_CODE (op1) == CONST_INT
10123            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
10124            && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
10125     return op0;
10126
10127   return gen_rtx_fmt_ee (code, mode, op0, op1);
10128 }
10129 \f
10130 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
10131    comparison code that will be tested.
10132
10133    The result is a possibly different comparison code to use.  *POP0 and
10134    *POP1 may be updated.
10135
10136    It is possible that we might detect that a comparison is either always
10137    true or always false.  However, we do not perform general constant
10138    folding in combine, so this knowledge isn't useful.  Such tautologies
10139    should have been detected earlier.  Hence we ignore all such cases.  */
10140
10141 static enum rtx_code
10142 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
10143 {
10144   rtx op0 = *pop0;
10145   rtx op1 = *pop1;
10146   rtx tem, tem1;
10147   int i;
10148   enum machine_mode mode, tmode;
10149
10150   /* Try a few ways of applying the same transformation to both operands.  */
10151   while (1)
10152     {
10153 #ifndef WORD_REGISTER_OPERATIONS
10154       /* The test below this one won't handle SIGN_EXTENDs on these machines,
10155          so check specially.  */
10156       if (code != GTU && code != GEU && code != LTU && code != LEU
10157           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
10158           && GET_CODE (XEXP (op0, 0)) == ASHIFT
10159           && GET_CODE (XEXP (op1, 0)) == ASHIFT
10160           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
10161           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
10162           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
10163               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
10164           && GET_CODE (XEXP (op0, 1)) == CONST_INT
10165           && XEXP (op0, 1) == XEXP (op1, 1)
10166           && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10167           && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
10168           && (INTVAL (XEXP (op0, 1))
10169               == (GET_MODE_BITSIZE (GET_MODE (op0))
10170                   - (GET_MODE_BITSIZE
10171                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
10172         {
10173           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
10174           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
10175         }
10176 #endif
10177
10178       /* If both operands are the same constant shift, see if we can ignore the
10179          shift.  We can if the shift is a rotate or if the bits shifted out of
10180          this shift are known to be zero for both inputs and if the type of
10181          comparison is compatible with the shift.  */
10182       if (GET_CODE (op0) == GET_CODE (op1)
10183           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10184           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
10185               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
10186                   && (code != GT && code != LT && code != GE && code != LE))
10187               || (GET_CODE (op0) == ASHIFTRT
10188                   && (code != GTU && code != LTU
10189                       && code != GEU && code != LEU)))
10190           && GET_CODE (XEXP (op0, 1)) == CONST_INT
10191           && INTVAL (XEXP (op0, 1)) >= 0
10192           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10193           && XEXP (op0, 1) == XEXP (op1, 1))
10194         {
10195           enum machine_mode mode = GET_MODE (op0);
10196           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10197           int shift_count = INTVAL (XEXP (op0, 1));
10198
10199           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
10200             mask &= (mask >> shift_count) << shift_count;
10201           else if (GET_CODE (op0) == ASHIFT)
10202             mask = (mask & (mask << shift_count)) >> shift_count;
10203
10204           if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
10205               && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
10206             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
10207           else
10208             break;
10209         }
10210
10211       /* If both operands are AND's of a paradoxical SUBREG by constant, the
10212          SUBREGs are of the same mode, and, in both cases, the AND would
10213          be redundant if the comparison was done in the narrower mode,
10214          do the comparison in the narrower mode (e.g., we are AND'ing with 1
10215          and the operand's possibly nonzero bits are 0xffffff01; in that case
10216          if we only care about QImode, we don't need the AND).  This case
10217          occurs if the output mode of an scc insn is not SImode and
10218          STORE_FLAG_VALUE == 1 (e.g., the 386).
10219
10220          Similarly, check for a case where the AND's are ZERO_EXTEND
10221          operations from some narrower mode even though a SUBREG is not
10222          present.  */
10223
10224       else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
10225                && GET_CODE (XEXP (op0, 1)) == CONST_INT
10226                && GET_CODE (XEXP (op1, 1)) == CONST_INT)
10227         {
10228           rtx inner_op0 = XEXP (op0, 0);
10229           rtx inner_op1 = XEXP (op1, 0);
10230           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
10231           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
10232           int changed = 0;
10233
10234           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
10235               && (GET_MODE_SIZE (GET_MODE (inner_op0))
10236                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
10237               && (GET_MODE (SUBREG_REG (inner_op0))
10238                   == GET_MODE (SUBREG_REG (inner_op1)))
10239               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
10240                   <= HOST_BITS_PER_WIDE_INT)
10241               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
10242                                              GET_MODE (SUBREG_REG (inner_op0)))))
10243               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
10244                                              GET_MODE (SUBREG_REG (inner_op1))))))
10245             {
10246               op0 = SUBREG_REG (inner_op0);
10247               op1 = SUBREG_REG (inner_op1);
10248
10249               /* The resulting comparison is always unsigned since we masked
10250                  off the original sign bit.  */
10251               code = unsigned_condition (code);
10252
10253               changed = 1;
10254             }
10255
10256           else if (c0 == c1)
10257             for (tmode = GET_CLASS_NARROWEST_MODE
10258                  (GET_MODE_CLASS (GET_MODE (op0)));
10259                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
10260               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
10261                 {
10262                   op0 = gen_lowpart (tmode, inner_op0);
10263                   op1 = gen_lowpart (tmode, inner_op1);
10264                   code = unsigned_condition (code);
10265                   changed = 1;
10266                   break;
10267                 }
10268
10269           if (! changed)
10270             break;
10271         }
10272
10273       /* If both operands are NOT, we can strip off the outer operation
10274          and adjust the comparison code for swapped operands; similarly for
10275          NEG, except that this must be an equality comparison.  */
10276       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
10277                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
10278                    && (code == EQ || code == NE)))
10279         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
10280
10281       else
10282         break;
10283     }
10284
10285   /* If the first operand is a constant, swap the operands and adjust the
10286      comparison code appropriately, but don't do this if the second operand
10287      is already a constant integer.  */
10288   if (swap_commutative_operands_p (op0, op1))
10289     {
10290       tem = op0, op0 = op1, op1 = tem;
10291       code = swap_condition (code);
10292     }
10293
10294   /* We now enter a loop during which we will try to simplify the comparison.
10295      For the most part, we only are concerned with comparisons with zero,
10296      but some things may really be comparisons with zero but not start
10297      out looking that way.  */
10298
10299   while (GET_CODE (op1) == CONST_INT)
10300     {
10301       enum machine_mode mode = GET_MODE (op0);
10302       unsigned int mode_width = GET_MODE_BITSIZE (mode);
10303       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10304       int equality_comparison_p;
10305       int sign_bit_comparison_p;
10306       int unsigned_comparison_p;
10307       HOST_WIDE_INT const_op;
10308
10309       /* We only want to handle integral modes.  This catches VOIDmode,
10310          CCmode, and the floating-point modes.  An exception is that we
10311          can handle VOIDmode if OP0 is a COMPARE or a comparison
10312          operation.  */
10313
10314       if (GET_MODE_CLASS (mode) != MODE_INT
10315           && ! (mode == VOIDmode
10316                 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
10317         break;
10318
10319       /* Get the constant we are comparing against and turn off all bits
10320          not on in our mode.  */
10321       const_op = INTVAL (op1);
10322       if (mode != VOIDmode)
10323         const_op = trunc_int_for_mode (const_op, mode);
10324       op1 = GEN_INT (const_op);
10325
10326       /* If we are comparing against a constant power of two and the value
10327          being compared can only have that single bit nonzero (e.g., it was
10328          `and'ed with that bit), we can replace this with a comparison
10329          with zero.  */
10330       if (const_op
10331           && (code == EQ || code == NE || code == GE || code == GEU
10332               || code == LT || code == LTU)
10333           && mode_width <= HOST_BITS_PER_WIDE_INT
10334           && exact_log2 (const_op) >= 0
10335           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
10336         {
10337           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10338           op1 = const0_rtx, const_op = 0;
10339         }
10340
10341       /* Similarly, if we are comparing a value known to be either -1 or
10342          0 with -1, change it to the opposite comparison against zero.  */
10343
10344       if (const_op == -1
10345           && (code == EQ || code == NE || code == GT || code == LE
10346               || code == GEU || code == LTU)
10347           && num_sign_bit_copies (op0, mode) == mode_width)
10348         {
10349           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10350           op1 = const0_rtx, const_op = 0;
10351         }
10352
10353       /* Do some canonicalizations based on the comparison code.  We prefer
10354          comparisons against zero and then prefer equality comparisons.
10355          If we can reduce the size of a constant, we will do that too.  */
10356
10357       switch (code)
10358         {
10359         case LT:
10360           /* < C is equivalent to <= (C - 1) */
10361           if (const_op > 0)
10362             {
10363               const_op -= 1;
10364               op1 = GEN_INT (const_op);
10365               code = LE;
10366               /* ... fall through to LE case below.  */
10367             }
10368           else
10369             break;
10370
10371         case LE:
10372           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
10373           if (const_op < 0)
10374             {
10375               const_op += 1;
10376               op1 = GEN_INT (const_op);
10377               code = LT;
10378             }
10379
10380           /* If we are doing a <= 0 comparison on a value known to have
10381              a zero sign bit, we can replace this with == 0.  */
10382           else if (const_op == 0
10383                    && mode_width <= HOST_BITS_PER_WIDE_INT
10384                    && (nonzero_bits (op0, mode)
10385                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10386             code = EQ;
10387           break;
10388
10389         case GE:
10390           /* >= C is equivalent to > (C - 1).  */
10391           if (const_op > 0)
10392             {
10393               const_op -= 1;
10394               op1 = GEN_INT (const_op);
10395               code = GT;
10396               /* ... fall through to GT below.  */
10397             }
10398           else
10399             break;
10400
10401         case GT:
10402           /* > C is equivalent to >= (C + 1); we do this for C < 0.  */
10403           if (const_op < 0)
10404             {
10405               const_op += 1;
10406               op1 = GEN_INT (const_op);
10407               code = GE;
10408             }
10409
10410           /* If we are doing a > 0 comparison on a value known to have
10411              a zero sign bit, we can replace this with != 0.  */
10412           else if (const_op == 0
10413                    && mode_width <= HOST_BITS_PER_WIDE_INT
10414                    && (nonzero_bits (op0, mode)
10415                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10416             code = NE;
10417           break;
10418
10419         case LTU:
10420           /* < C is equivalent to <= (C - 1).  */
10421           if (const_op > 0)
10422             {
10423               const_op -= 1;
10424               op1 = GEN_INT (const_op);
10425               code = LEU;
10426               /* ... fall through ...  */
10427             }
10428
10429           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
10430           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10431                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10432             {
10433               const_op = 0, op1 = const0_rtx;
10434               code = GE;
10435               break;
10436             }
10437           else
10438             break;
10439
10440         case LEU:
10441           /* unsigned <= 0 is equivalent to == 0 */
10442           if (const_op == 0)
10443             code = EQ;
10444
10445           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
10446           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10447                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10448             {
10449               const_op = 0, op1 = const0_rtx;
10450               code = GE;
10451             }
10452           break;
10453
10454         case GEU:
10455           /* >= C is equivalent to < (C - 1).  */
10456           if (const_op > 1)
10457             {
10458               const_op -= 1;
10459               op1 = GEN_INT (const_op);
10460               code = GTU;
10461               /* ... fall through ...  */
10462             }
10463
10464           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
10465           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10466                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10467             {
10468               const_op = 0, op1 = const0_rtx;
10469               code = LT;
10470               break;
10471             }
10472           else
10473             break;
10474
10475         case GTU:
10476           /* unsigned > 0 is equivalent to != 0 */
10477           if (const_op == 0)
10478             code = NE;
10479
10480           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
10481           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10482                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10483             {
10484               const_op = 0, op1 = const0_rtx;
10485               code = LT;
10486             }
10487           break;
10488
10489         default:
10490           break;
10491         }
10492
10493       /* Compute some predicates to simplify code below.  */
10494
10495       equality_comparison_p = (code == EQ || code == NE);
10496       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
10497       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
10498                                || code == GEU);
10499
10500       /* If this is a sign bit comparison and we can do arithmetic in
10501          MODE, say that we will only be needing the sign bit of OP0.  */
10502       if (sign_bit_comparison_p
10503           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10504         op0 = force_to_mode (op0, mode,
10505                              ((HOST_WIDE_INT) 1
10506                               << (GET_MODE_BITSIZE (mode) - 1)),
10507                              NULL_RTX, 0);
10508
10509       /* Now try cases based on the opcode of OP0.  If none of the cases
10510          does a "continue", we exit this loop immediately after the
10511          switch.  */
10512
10513       switch (GET_CODE (op0))
10514         {
10515         case ZERO_EXTRACT:
10516           /* If we are extracting a single bit from a variable position in
10517              a constant that has only a single bit set and are comparing it
10518              with zero, we can convert this into an equality comparison
10519              between the position and the location of the single bit.  */
10520           /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
10521              have already reduced the shift count modulo the word size.  */
10522           if (!SHIFT_COUNT_TRUNCATED
10523               && GET_CODE (XEXP (op0, 0)) == CONST_INT
10524               && XEXP (op0, 1) == const1_rtx
10525               && equality_comparison_p && const_op == 0
10526               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
10527             {
10528               if (BITS_BIG_ENDIAN)
10529                 {
10530                   enum machine_mode new_mode
10531                     = mode_for_extraction (EP_extzv, 1);
10532                   if (new_mode == MAX_MACHINE_MODE)
10533                     i = BITS_PER_WORD - 1 - i;
10534                   else
10535                     {
10536                       mode = new_mode;
10537                       i = (GET_MODE_BITSIZE (mode) - 1 - i);
10538                     }
10539                 }
10540
10541               op0 = XEXP (op0, 2);
10542               op1 = GEN_INT (i);
10543               const_op = i;
10544
10545               /* Result is nonzero iff shift count is equal to I.  */
10546               code = reverse_condition (code);
10547               continue;
10548             }
10549
10550           /* ... fall through ...  */
10551
10552         case SIGN_EXTRACT:
10553           tem = expand_compound_operation (op0);
10554           if (tem != op0)
10555             {
10556               op0 = tem;
10557               continue;
10558             }
10559           break;
10560
10561         case NOT:
10562           /* If testing for equality, we can take the NOT of the constant.  */
10563           if (equality_comparison_p
10564               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
10565             {
10566               op0 = XEXP (op0, 0);
10567               op1 = tem;
10568               continue;
10569             }
10570
10571           /* If just looking at the sign bit, reverse the sense of the
10572              comparison.  */
10573           if (sign_bit_comparison_p)
10574             {
10575               op0 = XEXP (op0, 0);
10576               code = (code == GE ? LT : GE);
10577               continue;
10578             }
10579           break;
10580
10581         case NEG:
10582           /* If testing for equality, we can take the NEG of the constant.  */
10583           if (equality_comparison_p
10584               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10585             {
10586               op0 = XEXP (op0, 0);
10587               op1 = tem;
10588               continue;
10589             }
10590
10591           /* The remaining cases only apply to comparisons with zero.  */
10592           if (const_op != 0)
10593             break;
10594
10595           /* When X is ABS or is known positive,
10596              (neg X) is < 0 if and only if X != 0.  */
10597
10598           if (sign_bit_comparison_p
10599               && (GET_CODE (XEXP (op0, 0)) == ABS
10600                   || (mode_width <= HOST_BITS_PER_WIDE_INT
10601                       && (nonzero_bits (XEXP (op0, 0), mode)
10602                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10603             {
10604               op0 = XEXP (op0, 0);
10605               code = (code == LT ? NE : EQ);
10606               continue;
10607             }
10608
10609           /* If we have NEG of something whose two high-order bits are the
10610              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
10611           if (num_sign_bit_copies (op0, mode) >= 2)
10612             {
10613               op0 = XEXP (op0, 0);
10614               code = swap_condition (code);
10615               continue;
10616             }
10617           break;
10618
10619         case ROTATE:
10620           /* If we are testing equality and our count is a constant, we
10621              can perform the inverse operation on our RHS.  */
10622           if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10623               && (tem = simplify_binary_operation (ROTATERT, mode,
10624                                                    op1, XEXP (op0, 1))) != 0)
10625             {
10626               op0 = XEXP (op0, 0);
10627               op1 = tem;
10628               continue;
10629             }
10630
10631           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10632              a particular bit.  Convert it to an AND of a constant of that
10633              bit.  This will be converted into a ZERO_EXTRACT.  */
10634           if (const_op == 0 && sign_bit_comparison_p
10635               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10636               && mode_width <= HOST_BITS_PER_WIDE_INT)
10637             {
10638               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10639                                             ((HOST_WIDE_INT) 1
10640                                              << (mode_width - 1
10641                                                  - INTVAL (XEXP (op0, 1)))));
10642               code = (code == LT ? NE : EQ);
10643               continue;
10644             }
10645
10646           /* Fall through.  */
10647
10648         case ABS:
10649           /* ABS is ignorable inside an equality comparison with zero.  */
10650           if (const_op == 0 && equality_comparison_p)
10651             {
10652               op0 = XEXP (op0, 0);
10653               continue;
10654             }
10655           break;
10656
10657         case SIGN_EXTEND:
10658           /* Can simplify (compare (zero/sign_extend FOO) CONST)
10659              to (compare FOO CONST) if CONST fits in FOO's mode and we
10660              are either testing inequality or have an unsigned comparison
10661              with ZERO_EXTEND or a signed comparison with SIGN_EXTEND.  */
10662           if (! unsigned_comparison_p
10663               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10664                   <= HOST_BITS_PER_WIDE_INT)
10665               && ((unsigned HOST_WIDE_INT) const_op
10666                   < (((unsigned HOST_WIDE_INT) 1
10667                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1)))))
10668             {
10669               op0 = XEXP (op0, 0);
10670               continue;
10671             }
10672           break;
10673
10674         case SUBREG:
10675           /* Check for the case where we are comparing A - C1 with C2,
10676              both constants are smaller than 1/2 the maximum positive
10677              value in MODE, and the comparison is equality or unsigned.
10678              In that case, if A is either zero-extended to MODE or has
10679              sufficient sign bits so that the high-order bit in MODE
10680              is a copy of the sign in the inner mode, we can prove that it is
10681              safe to do the operation in the wider mode.  This simplifies
10682              many range checks.  */
10683
10684           if (mode_width <= HOST_BITS_PER_WIDE_INT
10685               && subreg_lowpart_p (op0)
10686               && GET_CODE (SUBREG_REG (op0)) == PLUS
10687               && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
10688               && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0
10689               && (-INTVAL (XEXP (SUBREG_REG (op0), 1))
10690                   < (HOST_WIDE_INT) (GET_MODE_MASK (mode) / 2))
10691               && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2
10692               && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0),
10693                                       GET_MODE (SUBREG_REG (op0)))
10694                         & ~GET_MODE_MASK (mode))
10695                   || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0),
10696                                            GET_MODE (SUBREG_REG (op0)))
10697                       > (unsigned int)
10698                         (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10699                          - GET_MODE_BITSIZE (mode)))))
10700             {
10701               op0 = SUBREG_REG (op0);
10702               continue;
10703             }
10704
10705           /* If the inner mode is narrower and we are extracting the low part,
10706              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
10707           if (subreg_lowpart_p (op0)
10708               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10709             /* Fall through */ ;
10710           else
10711             break;
10712
10713           /* ... fall through ...  */
10714
10715         case ZERO_EXTEND:
10716           if ((unsigned_comparison_p || equality_comparison_p)
10717               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10718                   <= HOST_BITS_PER_WIDE_INT)
10719               && ((unsigned HOST_WIDE_INT) const_op
10720                   < GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))))
10721             {
10722               op0 = XEXP (op0, 0);
10723               continue;
10724             }
10725           break;
10726
10727         case PLUS:
10728           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
10729              this for equality comparisons due to pathological cases involving
10730              overflows.  */
10731           if (equality_comparison_p
10732               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10733                                                         op1, XEXP (op0, 1))))
10734             {
10735               op0 = XEXP (op0, 0);
10736               op1 = tem;
10737               continue;
10738             }
10739
10740           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
10741           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10742               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10743             {
10744               op0 = XEXP (XEXP (op0, 0), 0);
10745               code = (code == LT ? EQ : NE);
10746               continue;
10747             }
10748           break;
10749
10750         case MINUS:
10751           /* We used to optimize signed comparisons against zero, but that
10752              was incorrect.  Unsigned comparisons against zero (GTU, LEU)
10753              arrive here as equality comparisons, or (GEU, LTU) are
10754              optimized away.  No need to special-case them.  */
10755
10756           /* (eq (minus A B) C) -> (eq A (plus B C)) or
10757              (eq B (minus A C)), whichever simplifies.  We can only do
10758              this for equality comparisons due to pathological cases involving
10759              overflows.  */
10760           if (equality_comparison_p
10761               && 0 != (tem = simplify_binary_operation (PLUS, mode,
10762                                                         XEXP (op0, 1), op1)))
10763             {
10764               op0 = XEXP (op0, 0);
10765               op1 = tem;
10766               continue;
10767             }
10768
10769           if (equality_comparison_p
10770               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10771                                                         XEXP (op0, 0), op1)))
10772             {
10773               op0 = XEXP (op0, 1);
10774               op1 = tem;
10775               continue;
10776             }
10777
10778           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10779              of bits in X minus 1, is one iff X > 0.  */
10780           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10781               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10782               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (op0, 0), 1))
10783                  == mode_width - 1
10784               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10785             {
10786               op0 = XEXP (op0, 1);
10787               code = (code == GE ? LE : GT);
10788               continue;
10789             }
10790           break;
10791
10792         case XOR:
10793           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
10794              if C is zero or B is a constant.  */
10795           if (equality_comparison_p
10796               && 0 != (tem = simplify_binary_operation (XOR, mode,
10797                                                         XEXP (op0, 1), op1)))
10798             {
10799               op0 = XEXP (op0, 0);
10800               op1 = tem;
10801               continue;
10802             }
10803           break;
10804
10805         case EQ:  case NE:
10806         case UNEQ:  case LTGT:
10807         case LT:  case LTU:  case UNLT:  case LE:  case LEU:  case UNLE:
10808         case GT:  case GTU:  case UNGT:  case GE:  case GEU:  case UNGE:
10809         case UNORDERED: case ORDERED:
10810           /* We can't do anything if OP0 is a condition code value, rather
10811              than an actual data value.  */
10812           if (const_op != 0
10813               || CC0_P (XEXP (op0, 0))
10814               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
10815             break;
10816
10817           /* Get the two operands being compared.  */
10818           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
10819             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
10820           else
10821             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
10822
10823           /* Check for the cases where we simply want the result of the
10824              earlier test or the opposite of that result.  */
10825           if (code == NE || code == EQ
10826               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10827                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10828                   && (STORE_FLAG_VALUE
10829                       & (((HOST_WIDE_INT) 1
10830                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
10831                   && (code == LT || code == GE)))
10832             {
10833               enum rtx_code new_code;
10834               if (code == LT || code == NE)
10835                 new_code = GET_CODE (op0);
10836               else
10837                 new_code = combine_reversed_comparison_code (op0);
10838
10839               if (new_code != UNKNOWN)
10840                 {
10841                   code = new_code;
10842                   op0 = tem;
10843                   op1 = tem1;
10844                   continue;
10845                 }
10846             }
10847           break;
10848
10849         case IOR:
10850           /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
10851              iff X <= 0.  */
10852           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
10853               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
10854               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10855             {
10856               op0 = XEXP (op0, 1);
10857               code = (code == GE ? GT : LE);
10858               continue;
10859             }
10860           break;
10861
10862         case AND:
10863           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
10864              will be converted to a ZERO_EXTRACT later.  */
10865           if (const_op == 0 && equality_comparison_p
10866               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10867               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
10868             {
10869               op0 = simplify_and_const_int
10870                 (op0, mode, gen_rtx_LSHIFTRT (mode,
10871                                               XEXP (op0, 1),
10872                                               XEXP (XEXP (op0, 0), 1)),
10873                  (HOST_WIDE_INT) 1);
10874               continue;
10875             }
10876
10877           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
10878              zero and X is a comparison and C1 and C2 describe only bits set
10879              in STORE_FLAG_VALUE, we can compare with X.  */
10880           if (const_op == 0 && equality_comparison_p
10881               && mode_width <= HOST_BITS_PER_WIDE_INT
10882               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10883               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10884               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10885               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
10886               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
10887             {
10888               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10889                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
10890               if ((~STORE_FLAG_VALUE & mask) == 0
10891                   && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
10892                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
10893                           && COMPARISON_P (tem))))
10894                 {
10895                   op0 = XEXP (XEXP (op0, 0), 0);
10896                   continue;
10897                 }
10898             }
10899
10900           /* If we are doing an equality comparison of an AND of a bit equal
10901              to the sign bit, replace this with a LT or GE comparison of
10902              the underlying value.  */
10903           if (equality_comparison_p
10904               && const_op == 0
10905               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10906               && mode_width <= HOST_BITS_PER_WIDE_INT
10907               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10908                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10909             {
10910               op0 = XEXP (op0, 0);
10911               code = (code == EQ ? GE : LT);
10912               continue;
10913             }
10914
10915           /* If this AND operation is really a ZERO_EXTEND from a narrower
10916              mode, the constant fits within that mode, and this is either an
10917              equality or unsigned comparison, try to do this comparison in
10918              the narrower mode.  */
10919           if ((equality_comparison_p || unsigned_comparison_p)
10920               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10921               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
10922                                    & GET_MODE_MASK (mode))
10923                                   + 1)) >= 0
10924               && const_op >> i == 0
10925               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
10926             {
10927               op0 = gen_lowpart (tmode, XEXP (op0, 0));
10928               continue;
10929             }
10930
10931           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
10932              fits in both M1 and M2 and the SUBREG is either paradoxical
10933              or represents the low part, permute the SUBREG and the AND
10934              and try again.  */
10935           if (GET_CODE (XEXP (op0, 0)) == SUBREG)
10936             {
10937               unsigned HOST_WIDE_INT c1;
10938               tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
10939               /* Require an integral mode, to avoid creating something like
10940                  (AND:SF ...).  */
10941               if (SCALAR_INT_MODE_P (tmode)
10942                   /* It is unsafe to commute the AND into the SUBREG if the
10943                      SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
10944                      not defined.  As originally written the upper bits
10945                      have a defined value due to the AND operation.
10946                      However, if we commute the AND inside the SUBREG then
10947                      they no longer have defined values and the meaning of
10948                      the code has been changed.  */
10949                   && (0
10950 #ifdef WORD_REGISTER_OPERATIONS
10951                       || (mode_width > GET_MODE_BITSIZE (tmode)
10952                           && mode_width <= BITS_PER_WORD)
10953 #endif
10954                       || (mode_width <= GET_MODE_BITSIZE (tmode)
10955                           && subreg_lowpart_p (XEXP (op0, 0))))
10956                   && GET_CODE (XEXP (op0, 1)) == CONST_INT
10957                   && mode_width <= HOST_BITS_PER_WIDE_INT
10958                   && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
10959                   && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
10960                   && (c1 & ~GET_MODE_MASK (tmode)) == 0
10961                   && c1 != mask
10962                   && c1 != GET_MODE_MASK (tmode))
10963                 {
10964                   op0 = gen_binary (AND, tmode,
10965                                     SUBREG_REG (XEXP (op0, 0)),
10966                                     gen_int_mode (c1, tmode));
10967                   op0 = gen_lowpart (mode, op0);
10968                   continue;
10969                 }
10970             }
10971
10972           /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0).  */
10973           if (const_op == 0 && equality_comparison_p
10974               && XEXP (op0, 1) == const1_rtx
10975               && GET_CODE (XEXP (op0, 0)) == NOT)
10976             {
10977               op0 = simplify_and_const_int
10978                 (NULL_RTX, mode, XEXP (XEXP (op0, 0), 0), (HOST_WIDE_INT) 1);
10979               code = (code == NE ? EQ : NE);
10980               continue;
10981             }
10982
10983           /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
10984              (eq (and (lshiftrt X) 1) 0).
10985              Also handle the case where (not X) is expressed using xor.  */
10986           if (const_op == 0 && equality_comparison_p
10987               && XEXP (op0, 1) == const1_rtx
10988               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
10989             {
10990               rtx shift_op = XEXP (XEXP (op0, 0), 0);
10991               rtx shift_count = XEXP (XEXP (op0, 0), 1);
10992
10993               if (GET_CODE (shift_op) == NOT
10994                   || (GET_CODE (shift_op) == XOR
10995                       && GET_CODE (XEXP (shift_op, 1)) == CONST_INT
10996                       && GET_CODE (shift_count) == CONST_INT
10997                       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
10998                       && (INTVAL (XEXP (shift_op, 1))
10999                           == (HOST_WIDE_INT) 1 << INTVAL (shift_count))))
11000                 {
11001                   op0 = simplify_and_const_int
11002                     (NULL_RTX, mode,
11003                      gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count),
11004                      (HOST_WIDE_INT) 1);
11005                   code = (code == NE ? EQ : NE);
11006                   continue;
11007                 }
11008             }
11009           break;
11010
11011         case ASHIFT:
11012           /* If we have (compare (ashift FOO N) (const_int C)) and
11013              the high order N bits of FOO (N+1 if an inequality comparison)
11014              are known to be zero, we can do this by comparing FOO with C
11015              shifted right N bits so long as the low-order N bits of C are
11016              zero.  */
11017           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
11018               && INTVAL (XEXP (op0, 1)) >= 0
11019               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
11020                   < HOST_BITS_PER_WIDE_INT)
11021               && ((const_op
11022                    & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
11023               && mode_width <= HOST_BITS_PER_WIDE_INT
11024               && (nonzero_bits (XEXP (op0, 0), mode)
11025                   & ~(mask >> (INTVAL (XEXP (op0, 1))
11026                                + ! equality_comparison_p))) == 0)
11027             {
11028               /* We must perform a logical shift, not an arithmetic one,
11029                  as we want the top N bits of C to be zero.  */
11030               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
11031
11032               temp >>= INTVAL (XEXP (op0, 1));
11033               op1 = gen_int_mode (temp, mode);
11034               op0 = XEXP (op0, 0);
11035               continue;
11036             }
11037
11038           /* If we are doing a sign bit comparison, it means we are testing
11039              a particular bit.  Convert it to the appropriate AND.  */
11040           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
11041               && mode_width <= HOST_BITS_PER_WIDE_INT)
11042             {
11043               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11044                                             ((HOST_WIDE_INT) 1
11045                                              << (mode_width - 1
11046                                                  - INTVAL (XEXP (op0, 1)))));
11047               code = (code == LT ? NE : EQ);
11048               continue;
11049             }
11050
11051           /* If this an equality comparison with zero and we are shifting
11052              the low bit to the sign bit, we can convert this to an AND of the
11053              low-order bit.  */
11054           if (const_op == 0 && equality_comparison_p
11055               && GET_CODE (XEXP (op0, 1)) == CONST_INT
11056               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
11057                  == mode_width - 1)
11058             {
11059               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11060                                             (HOST_WIDE_INT) 1);
11061               continue;
11062             }
11063           break;
11064
11065         case ASHIFTRT:
11066           /* If this is an equality comparison with zero, we can do this
11067              as a logical shift, which might be much simpler.  */
11068           if (equality_comparison_p && const_op == 0
11069               && GET_CODE (XEXP (op0, 1)) == CONST_INT)
11070             {
11071               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
11072                                           XEXP (op0, 0),
11073                                           INTVAL (XEXP (op0, 1)));
11074               continue;
11075             }
11076
11077           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
11078              do the comparison in a narrower mode.  */
11079           if (! unsigned_comparison_p
11080               && GET_CODE (XEXP (op0, 1)) == CONST_INT
11081               && GET_CODE (XEXP (op0, 0)) == ASHIFT
11082               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
11083               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11084                                          MODE_INT, 1)) != BLKmode
11085               && (((unsigned HOST_WIDE_INT) const_op
11086                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11087                   <= GET_MODE_MASK (tmode)))
11088             {
11089               op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
11090               continue;
11091             }
11092
11093           /* Likewise if OP0 is a PLUS of a sign extension with a
11094              constant, which is usually represented with the PLUS
11095              between the shifts.  */
11096           if (! unsigned_comparison_p
11097               && GET_CODE (XEXP (op0, 1)) == CONST_INT
11098               && GET_CODE (XEXP (op0, 0)) == PLUS
11099               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
11100               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
11101               && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
11102               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11103                                          MODE_INT, 1)) != BLKmode
11104               && (((unsigned HOST_WIDE_INT) const_op
11105                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11106                   <= GET_MODE_MASK (tmode)))
11107             {
11108               rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
11109               rtx add_const = XEXP (XEXP (op0, 0), 1);
11110               rtx new_const = gen_binary (ASHIFTRT, GET_MODE (op0), add_const,
11111                                           XEXP (op0, 1));
11112
11113               op0 = gen_binary (PLUS, tmode,
11114                                 gen_lowpart (tmode, inner),
11115                                 new_const);
11116               continue;
11117             }
11118
11119           /* ... fall through ...  */
11120         case LSHIFTRT:
11121           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
11122              the low order N bits of FOO are known to be zero, we can do this
11123              by comparing FOO with C shifted left N bits so long as no
11124              overflow occurs.  */
11125           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
11126               && INTVAL (XEXP (op0, 1)) >= 0
11127               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11128               && mode_width <= HOST_BITS_PER_WIDE_INT
11129               && (nonzero_bits (XEXP (op0, 0), mode)
11130                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
11131               && (((unsigned HOST_WIDE_INT) const_op
11132                    + (GET_CODE (op0) != LSHIFTRT
11133                       ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
11134                          + 1)
11135                       : 0))
11136                   <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
11137             {
11138               /* If the shift was logical, then we must make the condition
11139                  unsigned.  */
11140               if (GET_CODE (op0) == LSHIFTRT)
11141                 code = unsigned_condition (code);
11142
11143               const_op <<= INTVAL (XEXP (op0, 1));
11144               op1 = GEN_INT (const_op);
11145               op0 = XEXP (op0, 0);
11146               continue;
11147             }
11148
11149           /* If we are using this shift to extract just the sign bit, we
11150              can replace this with an LT or GE comparison.  */
11151           if (const_op == 0
11152               && (equality_comparison_p || sign_bit_comparison_p)
11153               && GET_CODE (XEXP (op0, 1)) == CONST_INT
11154               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
11155                  == mode_width - 1)
11156             {
11157               op0 = XEXP (op0, 0);
11158               code = (code == NE || code == GT ? LT : GE);
11159               continue;
11160             }
11161           break;
11162
11163         default:
11164           break;
11165         }
11166
11167       break;
11168     }
11169
11170   /* Now make any compound operations involved in this comparison.  Then,
11171      check for an outmost SUBREG on OP0 that is not doing anything or is
11172      paradoxical.  The latter transformation must only be performed when
11173      it is known that the "extra" bits will be the same in op0 and op1 or
11174      that they don't matter.  There are three cases to consider:
11175
11176      1. SUBREG_REG (op0) is a register.  In this case the bits are don't
11177      care bits and we can assume they have any convenient value.  So
11178      making the transformation is safe.
11179
11180      2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
11181      In this case the upper bits of op0 are undefined.  We should not make
11182      the simplification in that case as we do not know the contents of
11183      those bits.
11184
11185      3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
11186      NIL.  In that case we know those bits are zeros or ones.  We must
11187      also be sure that they are the same as the upper bits of op1.
11188
11189      We can never remove a SUBREG for a non-equality comparison because
11190      the sign bit is in a different place in the underlying object.  */
11191
11192   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
11193   op1 = make_compound_operation (op1, SET);
11194
11195   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
11196       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11197       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
11198       && (code == NE || code == EQ))
11199     {
11200       if (GET_MODE_SIZE (GET_MODE (op0))
11201           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
11202         {
11203           /* For paradoxical subregs, allow case 1 as above.  Case 3 isn't
11204              implemented.  */
11205           if (GET_CODE (SUBREG_REG (op0)) == REG)
11206             {
11207               op0 = SUBREG_REG (op0);
11208               op1 = gen_lowpart (GET_MODE (op0), op1);
11209             }
11210         }
11211       else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
11212                 <= HOST_BITS_PER_WIDE_INT)
11213                && (nonzero_bits (SUBREG_REG (op0),
11214                                  GET_MODE (SUBREG_REG (op0)))
11215                    & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11216         {
11217           tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
11218
11219           if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
11220                & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11221             op0 = SUBREG_REG (op0), op1 = tem;
11222         }
11223     }
11224
11225   /* We now do the opposite procedure: Some machines don't have compare
11226      insns in all modes.  If OP0's mode is an integer mode smaller than a
11227      word and we can't do a compare in that mode, see if there is a larger
11228      mode for which we can do the compare.  There are a number of cases in
11229      which we can use the wider mode.  */
11230
11231   mode = GET_MODE (op0);
11232   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11233       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
11234       && ! have_insn_for (COMPARE, mode))
11235     for (tmode = GET_MODE_WIDER_MODE (mode);
11236          (tmode != VOIDmode
11237           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
11238          tmode = GET_MODE_WIDER_MODE (tmode))
11239       if (have_insn_for (COMPARE, tmode))
11240         {
11241           int zero_extended;
11242
11243           /* If the only nonzero bits in OP0 and OP1 are those in the
11244              narrower mode and this is an equality or unsigned comparison,
11245              we can use the wider mode.  Similarly for sign-extended
11246              values, in which case it is true for all comparisons.  */
11247           zero_extended = ((code == EQ || code == NE
11248                             || code == GEU || code == GTU
11249                             || code == LEU || code == LTU)
11250                            && (nonzero_bits (op0, tmode)
11251                                & ~GET_MODE_MASK (mode)) == 0
11252                            && ((GET_CODE (op1) == CONST_INT
11253                                 || (nonzero_bits (op1, tmode)
11254                                     & ~GET_MODE_MASK (mode)) == 0)));
11255
11256           if (zero_extended
11257               || ((num_sign_bit_copies (op0, tmode)
11258                    > (unsigned int) (GET_MODE_BITSIZE (tmode)
11259                                      - GET_MODE_BITSIZE (mode)))
11260                   && (num_sign_bit_copies (op1, tmode)
11261                       > (unsigned int) (GET_MODE_BITSIZE (tmode)
11262                                         - GET_MODE_BITSIZE (mode)))))
11263             {
11264               /* If OP0 is an AND and we don't have an AND in MODE either,
11265                  make a new AND in the proper mode.  */
11266               if (GET_CODE (op0) == AND
11267                   && !have_insn_for (AND, mode))
11268                 op0 = gen_binary (AND, tmode,
11269                                   gen_lowpart (tmode,
11270                                                XEXP (op0, 0)),
11271                                   gen_lowpart (tmode,
11272                                                XEXP (op0, 1)));
11273
11274               op0 = gen_lowpart (tmode, op0);
11275               if (zero_extended && GET_CODE (op1) == CONST_INT)
11276                 op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
11277               op1 = gen_lowpart (tmode, op1);
11278               break;
11279             }
11280
11281           /* If this is a test for negative, we can make an explicit
11282              test of the sign bit.  */
11283
11284           if (op1 == const0_rtx && (code == LT || code == GE)
11285               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11286             {
11287               op0 = gen_binary (AND, tmode,
11288                                 gen_lowpart (tmode, op0),
11289                                 GEN_INT ((HOST_WIDE_INT) 1
11290                                          << (GET_MODE_BITSIZE (mode) - 1)));
11291               code = (code == LT) ? NE : EQ;
11292               break;
11293             }
11294         }
11295
11296 #ifdef CANONICALIZE_COMPARISON
11297   /* If this machine only supports a subset of valid comparisons, see if we
11298      can convert an unsupported one into a supported one.  */
11299   CANONICALIZE_COMPARISON (code, op0, op1);
11300 #endif
11301
11302   *pop0 = op0;
11303   *pop1 = op1;
11304
11305   return code;
11306 }
11307 \f
11308 /* Like jump.c' reversed_comparison_code, but use combine infrastructure for
11309    searching backward.  */
11310 static enum rtx_code
11311 combine_reversed_comparison_code (rtx exp)
11312 {
11313   enum rtx_code code1 = reversed_comparison_code (exp, NULL);
11314   rtx x;
11315
11316   if (code1 != UNKNOWN
11317       || GET_MODE_CLASS (GET_MODE (XEXP (exp, 0))) != MODE_CC)
11318     return code1;
11319   /* Otherwise try and find where the condition codes were last set and
11320      use that.  */
11321   x = get_last_value (XEXP (exp, 0));
11322   if (!x || GET_CODE (x) != COMPARE)
11323     return UNKNOWN;
11324   return reversed_comparison_code_parts (GET_CODE (exp),
11325                                          XEXP (x, 0), XEXP (x, 1), NULL);
11326 }
11327
11328 /* Return comparison with reversed code of EXP and operands OP0 and OP1.
11329    Return NULL_RTX in case we fail to do the reversal.  */
11330 static rtx
11331 reversed_comparison (rtx exp, enum machine_mode mode, rtx op0, rtx op1)
11332 {
11333   enum rtx_code reversed_code = combine_reversed_comparison_code (exp);
11334   if (reversed_code == UNKNOWN)
11335     return NULL_RTX;
11336   else
11337     return gen_binary (reversed_code, mode, op0, op1);
11338 }
11339 \f
11340 /* Utility function for following routine.  Called when X is part of a value
11341    being stored into last_set_value.  Sets last_set_table_tick
11342    for each register mentioned.  Similar to mention_regs in cse.c  */
11343
11344 static void
11345 update_table_tick (rtx x)
11346 {
11347   enum rtx_code code = GET_CODE (x);
11348   const char *fmt = GET_RTX_FORMAT (code);
11349   int i;
11350
11351   if (code == REG)
11352     {
11353       unsigned int regno = REGNO (x);
11354       unsigned int endregno
11355         = regno + (regno < FIRST_PSEUDO_REGISTER
11356                    ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
11357       unsigned int r;
11358
11359       for (r = regno; r < endregno; r++)
11360         reg_stat[r].last_set_table_tick = label_tick;
11361
11362       return;
11363     }
11364
11365   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11366     /* Note that we can't have an "E" in values stored; see
11367        get_last_value_validate.  */
11368     if (fmt[i] == 'e')
11369       {
11370         /* Check for identical subexpressions.  If x contains
11371            identical subexpression we only have to traverse one of
11372            them.  */
11373         if (i == 0 && ARITHMETIC_P (x))
11374           {
11375             /* Note that at this point x1 has already been
11376                processed.  */
11377             rtx x0 = XEXP (x, 0);
11378             rtx x1 = XEXP (x, 1);
11379
11380             /* If x0 and x1 are identical then there is no need to
11381                process x0.  */
11382             if (x0 == x1)
11383               break;
11384
11385             /* If x0 is identical to a subexpression of x1 then while
11386                processing x1, x0 has already been processed.  Thus we
11387                are done with x.  */
11388             if (ARITHMETIC_P (x1)
11389                 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11390               break;
11391
11392             /* If x1 is identical to a subexpression of x0 then we
11393                still have to process the rest of x0.  */
11394             if (ARITHMETIC_P (x0)
11395                 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11396               {
11397                 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
11398                 break;
11399               }
11400           }
11401
11402         update_table_tick (XEXP (x, i));
11403       }
11404 }
11405
11406 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
11407    are saying that the register is clobbered and we no longer know its
11408    value.  If INSN is zero, don't update reg_stat[].last_set; this is
11409    only permitted with VALUE also zero and is used to invalidate the
11410    register.  */
11411
11412 static void
11413 record_value_for_reg (rtx reg, rtx insn, rtx value)
11414 {
11415   unsigned int regno = REGNO (reg);
11416   unsigned int endregno
11417     = regno + (regno < FIRST_PSEUDO_REGISTER
11418                ? hard_regno_nregs[regno][GET_MODE (reg)] : 1);
11419   unsigned int i;
11420
11421   /* If VALUE contains REG and we have a previous value for REG, substitute
11422      the previous value.  */
11423   if (value && insn && reg_overlap_mentioned_p (reg, value))
11424     {
11425       rtx tem;
11426
11427       /* Set things up so get_last_value is allowed to see anything set up to
11428          our insn.  */
11429       subst_low_cuid = INSN_CUID (insn);
11430       tem = get_last_value (reg);
11431
11432       /* If TEM is simply a binary operation with two CLOBBERs as operands,
11433          it isn't going to be useful and will take a lot of time to process,
11434          so just use the CLOBBER.  */
11435
11436       if (tem)
11437         {
11438           if (ARITHMETIC_P (tem)
11439               && GET_CODE (XEXP (tem, 0)) == CLOBBER
11440               && GET_CODE (XEXP (tem, 1)) == CLOBBER)
11441             tem = XEXP (tem, 0);
11442
11443           value = replace_rtx (copy_rtx (value), reg, tem);
11444         }
11445     }
11446
11447   /* For each register modified, show we don't know its value, that
11448      we don't know about its bitwise content, that its value has been
11449      updated, and that we don't know the location of the death of the
11450      register.  */
11451   for (i = regno; i < endregno; i++)
11452     {
11453       if (insn)
11454         reg_stat[i].last_set = insn;
11455
11456       reg_stat[i].last_set_value = 0;
11457       reg_stat[i].last_set_mode = 0;
11458       reg_stat[i].last_set_nonzero_bits = 0;
11459       reg_stat[i].last_set_sign_bit_copies = 0;
11460       reg_stat[i].last_death = 0;
11461     }
11462
11463   /* Mark registers that are being referenced in this value.  */
11464   if (value)
11465     update_table_tick (value);
11466
11467   /* Now update the status of each register being set.
11468      If someone is using this register in this block, set this register
11469      to invalid since we will get confused between the two lives in this
11470      basic block.  This makes using this register always invalid.  In cse, we
11471      scan the table to invalidate all entries using this register, but this
11472      is too much work for us.  */
11473
11474   for (i = regno; i < endregno; i++)
11475     {
11476       reg_stat[i].last_set_label = label_tick;
11477       if (value && reg_stat[i].last_set_table_tick == label_tick)
11478         reg_stat[i].last_set_invalid = 1;
11479       else
11480         reg_stat[i].last_set_invalid = 0;
11481     }
11482
11483   /* The value being assigned might refer to X (like in "x++;").  In that
11484      case, we must replace it with (clobber (const_int 0)) to prevent
11485      infinite loops.  */
11486   if (value && ! get_last_value_validate (&value, insn,
11487                                           reg_stat[regno].last_set_label, 0))
11488     {
11489       value = copy_rtx (value);
11490       if (! get_last_value_validate (&value, insn,
11491                                      reg_stat[regno].last_set_label, 1))
11492         value = 0;
11493     }
11494
11495   /* For the main register being modified, update the value, the mode, the
11496      nonzero bits, and the number of sign bit copies.  */
11497
11498   reg_stat[regno].last_set_value = value;
11499
11500   if (value)
11501     {
11502       enum machine_mode mode = GET_MODE (reg);
11503       subst_low_cuid = INSN_CUID (insn);
11504       reg_stat[regno].last_set_mode = mode;
11505       if (GET_MODE_CLASS (mode) == MODE_INT
11506           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11507         mode = nonzero_bits_mode;
11508       reg_stat[regno].last_set_nonzero_bits = nonzero_bits (value, mode);
11509       reg_stat[regno].last_set_sign_bit_copies
11510         = num_sign_bit_copies (value, GET_MODE (reg));
11511     }
11512 }
11513
11514 /* Called via note_stores from record_dead_and_set_regs to handle one
11515    SET or CLOBBER in an insn.  DATA is the instruction in which the
11516    set is occurring.  */
11517
11518 static void
11519 record_dead_and_set_regs_1 (rtx dest, rtx setter, void *data)
11520 {
11521   rtx record_dead_insn = (rtx) data;
11522
11523   if (GET_CODE (dest) == SUBREG)
11524     dest = SUBREG_REG (dest);
11525
11526   if (GET_CODE (dest) == REG)
11527     {
11528       /* If we are setting the whole register, we know its value.  Otherwise
11529          show that we don't know the value.  We can handle SUBREG in
11530          some cases.  */
11531       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11532         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11533       else if (GET_CODE (setter) == SET
11534                && GET_CODE (SET_DEST (setter)) == SUBREG
11535                && SUBREG_REG (SET_DEST (setter)) == dest
11536                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
11537                && subreg_lowpart_p (SET_DEST (setter)))
11538         record_value_for_reg (dest, record_dead_insn,
11539                               gen_lowpart (GET_MODE (dest),
11540                                                        SET_SRC (setter)));
11541       else
11542         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
11543     }
11544   else if (GET_CODE (dest) == MEM
11545            /* Ignore pushes, they clobber nothing.  */
11546            && ! push_operand (dest, GET_MODE (dest)))
11547     mem_last_set = INSN_CUID (record_dead_insn);
11548 }
11549
11550 /* Update the records of when each REG was most recently set or killed
11551    for the things done by INSN.  This is the last thing done in processing
11552    INSN in the combiner loop.
11553
11554    We update reg_stat[], in particular fields last_set, last_set_value,
11555    last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
11556    last_death, and also the similar information mem_last_set (which insn
11557    most recently modified memory) and last_call_cuid (which insn was the
11558    most recent subroutine call).  */
11559
11560 static void
11561 record_dead_and_set_regs (rtx insn)
11562 {
11563   rtx link;
11564   unsigned int i;
11565
11566   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11567     {
11568       if (REG_NOTE_KIND (link) == REG_DEAD
11569           && GET_CODE (XEXP (link, 0)) == REG)
11570         {
11571           unsigned int regno = REGNO (XEXP (link, 0));
11572           unsigned int endregno
11573             = regno + (regno < FIRST_PSEUDO_REGISTER
11574                        ? hard_regno_nregs[regno][GET_MODE (XEXP (link, 0))]
11575                        : 1);
11576
11577           for (i = regno; i < endregno; i++)
11578             reg_stat[i].last_death = insn;
11579         }
11580       else if (REG_NOTE_KIND (link) == REG_INC)
11581         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
11582     }
11583
11584   if (GET_CODE (insn) == CALL_INSN)
11585     {
11586       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11587         if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
11588           {
11589             reg_stat[i].last_set_value = 0;
11590             reg_stat[i].last_set_mode = 0;
11591             reg_stat[i].last_set_nonzero_bits = 0;
11592             reg_stat[i].last_set_sign_bit_copies = 0;
11593             reg_stat[i].last_death = 0;
11594           }
11595
11596       last_call_cuid = mem_last_set = INSN_CUID (insn);
11597
11598       /* Don't bother recording what this insn does.  It might set the
11599          return value register, but we can't combine into a call
11600          pattern anyway, so there's no point trying (and it may cause
11601          a crash, if e.g. we wind up asking for last_set_value of a
11602          SUBREG of the return value register).  */
11603       return;
11604     }
11605
11606   note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
11607 }
11608
11609 /* If a SUBREG has the promoted bit set, it is in fact a property of the
11610    register present in the SUBREG, so for each such SUBREG go back and
11611    adjust nonzero and sign bit information of the registers that are
11612    known to have some zero/sign bits set.
11613
11614    This is needed because when combine blows the SUBREGs away, the
11615    information on zero/sign bits is lost and further combines can be
11616    missed because of that.  */
11617
11618 static void
11619 record_promoted_value (rtx insn, rtx subreg)
11620 {
11621   rtx links, set;
11622   unsigned int regno = REGNO (SUBREG_REG (subreg));
11623   enum machine_mode mode = GET_MODE (subreg);
11624
11625   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
11626     return;
11627
11628   for (links = LOG_LINKS (insn); links;)
11629     {
11630       insn = XEXP (links, 0);
11631       set = single_set (insn);
11632
11633       if (! set || GET_CODE (SET_DEST (set)) != REG
11634           || REGNO (SET_DEST (set)) != regno
11635           || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11636         {
11637           links = XEXP (links, 1);
11638           continue;
11639         }
11640
11641       if (reg_stat[regno].last_set == insn)
11642         {
11643           if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
11644             reg_stat[regno].last_set_nonzero_bits &= GET_MODE_MASK (mode);
11645         }
11646
11647       if (GET_CODE (SET_SRC (set)) == REG)
11648         {
11649           regno = REGNO (SET_SRC (set));
11650           links = LOG_LINKS (insn);
11651         }
11652       else
11653         break;
11654     }
11655 }
11656
11657 /* Scan X for promoted SUBREGs.  For each one found,
11658    note what it implies to the registers used in it.  */
11659
11660 static void
11661 check_promoted_subreg (rtx insn, rtx x)
11662 {
11663   if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x)
11664       && GET_CODE (SUBREG_REG (x)) == REG)
11665     record_promoted_value (insn, x);
11666   else
11667     {
11668       const char *format = GET_RTX_FORMAT (GET_CODE (x));
11669       int i, j;
11670
11671       for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
11672         switch (format[i])
11673           {
11674           case 'e':
11675             check_promoted_subreg (insn, XEXP (x, i));
11676             break;
11677           case 'V':
11678           case 'E':
11679             if (XVEC (x, i) != 0)
11680               for (j = 0; j < XVECLEN (x, i); j++)
11681                 check_promoted_subreg (insn, XVECEXP (x, i, j));
11682             break;
11683           }
11684     }
11685 }
11686 \f
11687 /* Utility routine for the following function.  Verify that all the registers
11688    mentioned in *LOC are valid when *LOC was part of a value set when
11689    label_tick == TICK.  Return 0 if some are not.
11690
11691    If REPLACE is nonzero, replace the invalid reference with
11692    (clobber (const_int 0)) and return 1.  This replacement is useful because
11693    we often can get useful information about the form of a value (e.g., if
11694    it was produced by a shift that always produces -1 or 0) even though
11695    we don't know exactly what registers it was produced from.  */
11696
11697 static int
11698 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
11699 {
11700   rtx x = *loc;
11701   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
11702   int len = GET_RTX_LENGTH (GET_CODE (x));
11703   int i;
11704
11705   if (GET_CODE (x) == REG)
11706     {
11707       unsigned int regno = REGNO (x);
11708       unsigned int endregno
11709         = regno + (regno < FIRST_PSEUDO_REGISTER
11710                    ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
11711       unsigned int j;
11712
11713       for (j = regno; j < endregno; j++)
11714         if (reg_stat[j].last_set_invalid
11715             /* If this is a pseudo-register that was only set once and not
11716                live at the beginning of the function, it is always valid.  */
11717             || (! (regno >= FIRST_PSEUDO_REGISTER
11718                    && REG_N_SETS (regno) == 1
11719                    && (! REGNO_REG_SET_P
11720                        (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))
11721                 && reg_stat[j].last_set_label > tick))
11722           {
11723             if (replace)
11724               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11725             return replace;
11726           }
11727
11728       return 1;
11729     }
11730   /* If this is a memory reference, make sure that there were
11731      no stores after it that might have clobbered the value.  We don't
11732      have alias info, so we assume any store invalidates it.  */
11733   else if (GET_CODE (x) == MEM && ! RTX_UNCHANGING_P (x)
11734            && INSN_CUID (insn) <= mem_last_set)
11735     {
11736       if (replace)
11737         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11738       return replace;
11739     }
11740
11741   for (i = 0; i < len; i++)
11742     {
11743       if (fmt[i] == 'e')
11744         {
11745           /* Check for identical subexpressions.  If x contains
11746              identical subexpression we only have to traverse one of
11747              them.  */
11748           if (i == 1 && ARITHMETIC_P (x))
11749             {
11750               /* Note that at this point x0 has already been checked
11751                  and found valid.  */
11752               rtx x0 = XEXP (x, 0);
11753               rtx x1 = XEXP (x, 1);
11754
11755               /* If x0 and x1 are identical then x is also valid.  */
11756               if (x0 == x1)
11757                 return 1;
11758
11759               /* If x1 is identical to a subexpression of x0 then
11760                  while checking x0, x1 has already been checked.  Thus
11761                  it is valid and so as x.  */
11762               if (ARITHMETIC_P (x0)
11763                   && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11764                 return 1;
11765
11766               /* If x0 is identical to a subexpression of x1 then x is
11767                  valid iff the rest of x1 is valid.  */
11768               if (ARITHMETIC_P (x1)
11769                   && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11770                 return
11771                   get_last_value_validate (&XEXP (x1,
11772                                                   x0 == XEXP (x1, 0) ? 1 : 0),
11773                                            insn, tick, replace);
11774             }
11775
11776           if (get_last_value_validate (&XEXP (x, i), insn, tick,
11777                                        replace) == 0)
11778             return 0;
11779         }
11780       /* Don't bother with these.  They shouldn't occur anyway.  */
11781       else if (fmt[i] == 'E')
11782         return 0;
11783     }
11784
11785   /* If we haven't found a reason for it to be invalid, it is valid.  */
11786   return 1;
11787 }
11788
11789 /* Get the last value assigned to X, if known.  Some registers
11790    in the value may be replaced with (clobber (const_int 0)) if their value
11791    is known longer known reliably.  */
11792
11793 static rtx
11794 get_last_value (rtx x)
11795 {
11796   unsigned int regno;
11797   rtx value;
11798
11799   /* If this is a non-paradoxical SUBREG, get the value of its operand and
11800      then convert it to the desired mode.  If this is a paradoxical SUBREG,
11801      we cannot predict what values the "extra" bits might have.  */
11802   if (GET_CODE (x) == SUBREG
11803       && subreg_lowpart_p (x)
11804       && (GET_MODE_SIZE (GET_MODE (x))
11805           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
11806       && (value = get_last_value (SUBREG_REG (x))) != 0)
11807     return gen_lowpart (GET_MODE (x), value);
11808
11809   if (GET_CODE (x) != REG)
11810     return 0;
11811
11812   regno = REGNO (x);
11813   value = reg_stat[regno].last_set_value;
11814
11815   /* If we don't have a value, or if it isn't for this basic block and
11816      it's either a hard register, set more than once, or it's a live
11817      at the beginning of the function, return 0.
11818
11819      Because if it's not live at the beginning of the function then the reg
11820      is always set before being used (is never used without being set).
11821      And, if it's set only once, and it's always set before use, then all
11822      uses must have the same last value, even if it's not from this basic
11823      block.  */
11824
11825   if (value == 0
11826       || (reg_stat[regno].last_set_label != label_tick
11827           && (regno < FIRST_PSEUDO_REGISTER
11828               || REG_N_SETS (regno) != 1
11829               || (REGNO_REG_SET_P
11830                   (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))))
11831     return 0;
11832
11833   /* If the value was set in a later insn than the ones we are processing,
11834      we can't use it even if the register was only set once.  */
11835   if (INSN_CUID (reg_stat[regno].last_set) >= subst_low_cuid)
11836     return 0;
11837
11838   /* If the value has all its registers valid, return it.  */
11839   if (get_last_value_validate (&value, reg_stat[regno].last_set,
11840                                reg_stat[regno].last_set_label, 0))
11841     return value;
11842
11843   /* Otherwise, make a copy and replace any invalid register with
11844      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
11845
11846   value = copy_rtx (value);
11847   if (get_last_value_validate (&value, reg_stat[regno].last_set,
11848                                reg_stat[regno].last_set_label, 1))
11849     return value;
11850
11851   return 0;
11852 }
11853 \f
11854 /* Return nonzero if expression X refers to a REG or to memory
11855    that is set in an instruction more recent than FROM_CUID.  */
11856
11857 static int
11858 use_crosses_set_p (rtx x, int from_cuid)
11859 {
11860   const char *fmt;
11861   int i;
11862   enum rtx_code code = GET_CODE (x);
11863
11864   if (code == REG)
11865     {
11866       unsigned int regno = REGNO (x);
11867       unsigned endreg = regno + (regno < FIRST_PSEUDO_REGISTER
11868                                  ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
11869
11870 #ifdef PUSH_ROUNDING
11871       /* Don't allow uses of the stack pointer to be moved,
11872          because we don't know whether the move crosses a push insn.  */
11873       if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
11874         return 1;
11875 #endif
11876       for (; regno < endreg; regno++)
11877         if (reg_stat[regno].last_set
11878             && INSN_CUID (reg_stat[regno].last_set) > from_cuid)
11879           return 1;
11880       return 0;
11881     }
11882
11883   if (code == MEM && mem_last_set > from_cuid)
11884     return 1;
11885
11886   fmt = GET_RTX_FORMAT (code);
11887
11888   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11889     {
11890       if (fmt[i] == 'E')
11891         {
11892           int j;
11893           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11894             if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
11895               return 1;
11896         }
11897       else if (fmt[i] == 'e'
11898                && use_crosses_set_p (XEXP (x, i), from_cuid))
11899         return 1;
11900     }
11901   return 0;
11902 }
11903 \f
11904 /* Define three variables used for communication between the following
11905    routines.  */
11906
11907 static unsigned int reg_dead_regno, reg_dead_endregno;
11908 static int reg_dead_flag;
11909
11910 /* Function called via note_stores from reg_dead_at_p.
11911
11912    If DEST is within [reg_dead_regno, reg_dead_endregno), set
11913    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
11914
11915 static void
11916 reg_dead_at_p_1 (rtx dest, rtx x, void *data ATTRIBUTE_UNUSED)
11917 {
11918   unsigned int regno, endregno;
11919
11920   if (GET_CODE (dest) != REG)
11921     return;
11922
11923   regno = REGNO (dest);
11924   endregno = regno + (regno < FIRST_PSEUDO_REGISTER
11925                       ? hard_regno_nregs[regno][GET_MODE (dest)] : 1);
11926
11927   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
11928     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
11929 }
11930
11931 /* Return nonzero if REG is known to be dead at INSN.
11932
11933    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
11934    referencing REG, it is dead.  If we hit a SET referencing REG, it is
11935    live.  Otherwise, see if it is live or dead at the start of the basic
11936    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
11937    must be assumed to be always live.  */
11938
11939 static int
11940 reg_dead_at_p (rtx reg, rtx insn)
11941 {
11942   basic_block block;
11943   unsigned int i;
11944
11945   /* Set variables for reg_dead_at_p_1.  */
11946   reg_dead_regno = REGNO (reg);
11947   reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
11948                                         ? hard_regno_nregs[reg_dead_regno]
11949                                                           [GET_MODE (reg)]
11950                                         : 1);
11951
11952   reg_dead_flag = 0;
11953
11954   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  */
11955   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
11956     {
11957       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11958         if (TEST_HARD_REG_BIT (newpat_used_regs, i))
11959           return 0;
11960     }
11961
11962   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
11963      beginning of function.  */
11964   for (; insn && GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != BARRIER;
11965        insn = prev_nonnote_insn (insn))
11966     {
11967       note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
11968       if (reg_dead_flag)
11969         return reg_dead_flag == 1 ? 1 : 0;
11970
11971       if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
11972         return 1;
11973     }
11974
11975   /* Get the basic block that we were in.  */
11976   if (insn == 0)
11977     block = ENTRY_BLOCK_PTR->next_bb;
11978   else
11979     {
11980       FOR_EACH_BB (block)
11981         if (insn == BB_HEAD (block))
11982           break;
11983
11984       if (block == EXIT_BLOCK_PTR)
11985         return 0;
11986     }
11987
11988   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11989     if (REGNO_REG_SET_P (block->global_live_at_start, i))
11990       return 0;
11991
11992   return 1;
11993 }
11994 \f
11995 /* Note hard registers in X that are used.  This code is similar to
11996    that in flow.c, but much simpler since we don't care about pseudos.  */
11997
11998 static void
11999 mark_used_regs_combine (rtx x)
12000 {
12001   RTX_CODE code = GET_CODE (x);
12002   unsigned int regno;
12003   int i;
12004
12005   switch (code)
12006     {
12007     case LABEL_REF:
12008     case SYMBOL_REF:
12009     case CONST_INT:
12010     case CONST:
12011     case CONST_DOUBLE:
12012     case CONST_VECTOR:
12013     case PC:
12014     case ADDR_VEC:
12015     case ADDR_DIFF_VEC:
12016     case ASM_INPUT:
12017 #ifdef HAVE_cc0
12018     /* CC0 must die in the insn after it is set, so we don't need to take
12019        special note of it here.  */
12020     case CC0:
12021 #endif
12022       return;
12023
12024     case CLOBBER:
12025       /* If we are clobbering a MEM, mark any hard registers inside the
12026          address as used.  */
12027       if (GET_CODE (XEXP (x, 0)) == MEM)
12028         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
12029       return;
12030
12031     case REG:
12032       regno = REGNO (x);
12033       /* A hard reg in a wide mode may really be multiple registers.
12034          If so, mark all of them just like the first.  */
12035       if (regno < FIRST_PSEUDO_REGISTER)
12036         {
12037           unsigned int endregno, r;
12038
12039           /* None of this applies to the stack, frame or arg pointers.  */
12040           if (regno == STACK_POINTER_REGNUM
12041 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
12042               || regno == HARD_FRAME_POINTER_REGNUM
12043 #endif
12044 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
12045               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
12046 #endif
12047               || regno == FRAME_POINTER_REGNUM)
12048             return;
12049
12050           endregno = regno + hard_regno_nregs[regno][GET_MODE (x)];
12051           for (r = regno; r < endregno; r++)
12052             SET_HARD_REG_BIT (newpat_used_regs, r);
12053         }
12054       return;
12055
12056     case SET:
12057       {
12058         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
12059            the address.  */
12060         rtx testreg = SET_DEST (x);
12061
12062         while (GET_CODE (testreg) == SUBREG
12063                || GET_CODE (testreg) == ZERO_EXTRACT
12064                || GET_CODE (testreg) == SIGN_EXTRACT
12065                || GET_CODE (testreg) == STRICT_LOW_PART)
12066           testreg = XEXP (testreg, 0);
12067
12068         if (GET_CODE (testreg) == MEM)
12069           mark_used_regs_combine (XEXP (testreg, 0));
12070
12071         mark_used_regs_combine (SET_SRC (x));
12072       }
12073       return;
12074
12075     default:
12076       break;
12077     }
12078
12079   /* Recursively scan the operands of this expression.  */
12080
12081   {
12082     const char *fmt = GET_RTX_FORMAT (code);
12083
12084     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12085       {
12086         if (fmt[i] == 'e')
12087           mark_used_regs_combine (XEXP (x, i));
12088         else if (fmt[i] == 'E')
12089           {
12090             int j;
12091
12092             for (j = 0; j < XVECLEN (x, i); j++)
12093               mark_used_regs_combine (XVECEXP (x, i, j));
12094           }
12095       }
12096   }
12097 }
12098 \f
12099 /* Remove register number REGNO from the dead registers list of INSN.
12100
12101    Return the note used to record the death, if there was one.  */
12102
12103 rtx
12104 remove_death (unsigned int regno, rtx insn)
12105 {
12106   rtx note = find_regno_note (insn, REG_DEAD, regno);
12107
12108   if (note)
12109     {
12110       REG_N_DEATHS (regno)--;
12111       remove_note (insn, note);
12112     }
12113
12114   return note;
12115 }
12116
12117 /* For each register (hardware or pseudo) used within expression X, if its
12118    death is in an instruction with cuid between FROM_CUID (inclusive) and
12119    TO_INSN (exclusive), put a REG_DEAD note for that register in the
12120    list headed by PNOTES.
12121
12122    That said, don't move registers killed by maybe_kill_insn.
12123
12124    This is done when X is being merged by combination into TO_INSN.  These
12125    notes will then be distributed as needed.  */
12126
12127 static void
12128 move_deaths (rtx x, rtx maybe_kill_insn, int from_cuid, rtx to_insn,
12129              rtx *pnotes)
12130 {
12131   const char *fmt;
12132   int len, i;
12133   enum rtx_code code = GET_CODE (x);
12134
12135   if (code == REG)
12136     {
12137       unsigned int regno = REGNO (x);
12138       rtx where_dead = reg_stat[regno].last_death;
12139       rtx before_dead, after_dead;
12140
12141       /* Don't move the register if it gets killed in between from and to.  */
12142       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
12143           && ! reg_referenced_p (x, maybe_kill_insn))
12144         return;
12145
12146       /* WHERE_DEAD could be a USE insn made by combine, so first we
12147          make sure that we have insns with valid INSN_CUID values.  */
12148       before_dead = where_dead;
12149       while (before_dead && INSN_UID (before_dead) > max_uid_cuid)
12150         before_dead = PREV_INSN (before_dead);
12151
12152       after_dead = where_dead;
12153       while (after_dead && INSN_UID (after_dead) > max_uid_cuid)
12154         after_dead = NEXT_INSN (after_dead);
12155
12156       if (before_dead && after_dead
12157           && INSN_CUID (before_dead) >= from_cuid
12158           && (INSN_CUID (after_dead) < INSN_CUID (to_insn)
12159               || (where_dead != after_dead
12160                   && INSN_CUID (after_dead) == INSN_CUID (to_insn))))
12161         {
12162           rtx note = remove_death (regno, where_dead);
12163
12164           /* It is possible for the call above to return 0.  This can occur
12165              when last_death points to I2 or I1 that we combined with.
12166              In that case make a new note.
12167
12168              We must also check for the case where X is a hard register
12169              and NOTE is a death note for a range of hard registers
12170              including X.  In that case, we must put REG_DEAD notes for
12171              the remaining registers in place of NOTE.  */
12172
12173           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
12174               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12175                   > GET_MODE_SIZE (GET_MODE (x))))
12176             {
12177               unsigned int deadregno = REGNO (XEXP (note, 0));
12178               unsigned int deadend
12179                 = (deadregno + hard_regno_nregs[deadregno]
12180                                                [GET_MODE (XEXP (note, 0))]);
12181               unsigned int ourend
12182                 = regno + hard_regno_nregs[regno][GET_MODE (x)];
12183               unsigned int i;
12184
12185               for (i = deadregno; i < deadend; i++)
12186                 if (i < regno || i >= ourend)
12187                   REG_NOTES (where_dead)
12188                     = gen_rtx_EXPR_LIST (REG_DEAD,
12189                                          regno_reg_rtx[i],
12190                                          REG_NOTES (where_dead));
12191             }
12192
12193           /* If we didn't find any note, or if we found a REG_DEAD note that
12194              covers only part of the given reg, and we have a multi-reg hard
12195              register, then to be safe we must check for REG_DEAD notes
12196              for each register other than the first.  They could have
12197              their own REG_DEAD notes lying around.  */
12198           else if ((note == 0
12199                     || (note != 0
12200                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12201                             < GET_MODE_SIZE (GET_MODE (x)))))
12202                    && regno < FIRST_PSEUDO_REGISTER
12203                    && hard_regno_nregs[regno][GET_MODE (x)] > 1)
12204             {
12205               unsigned int ourend
12206                 = regno + hard_regno_nregs[regno][GET_MODE (x)];
12207               unsigned int i, offset;
12208               rtx oldnotes = 0;
12209
12210               if (note)
12211                 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
12212               else
12213                 offset = 1;
12214
12215               for (i = regno + offset; i < ourend; i++)
12216                 move_deaths (regno_reg_rtx[i],
12217                              maybe_kill_insn, from_cuid, to_insn, &oldnotes);
12218             }
12219
12220           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
12221             {
12222               XEXP (note, 1) = *pnotes;
12223               *pnotes = note;
12224             }
12225           else
12226             *pnotes = gen_rtx_EXPR_LIST (REG_DEAD, x, *pnotes);
12227
12228           REG_N_DEATHS (regno)++;
12229         }
12230
12231       return;
12232     }
12233
12234   else if (GET_CODE (x) == SET)
12235     {
12236       rtx dest = SET_DEST (x);
12237
12238       move_deaths (SET_SRC (x), maybe_kill_insn, from_cuid, to_insn, pnotes);
12239
12240       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
12241          that accesses one word of a multi-word item, some
12242          piece of everything register in the expression is used by
12243          this insn, so remove any old death.  */
12244       /* ??? So why do we test for equality of the sizes?  */
12245
12246       if (GET_CODE (dest) == ZERO_EXTRACT
12247           || GET_CODE (dest) == STRICT_LOW_PART
12248           || (GET_CODE (dest) == SUBREG
12249               && (((GET_MODE_SIZE (GET_MODE (dest))
12250                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
12251                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
12252                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
12253         {
12254           move_deaths (dest, maybe_kill_insn, from_cuid, to_insn, pnotes);
12255           return;
12256         }
12257
12258       /* If this is some other SUBREG, we know it replaces the entire
12259          value, so use that as the destination.  */
12260       if (GET_CODE (dest) == SUBREG)
12261         dest = SUBREG_REG (dest);
12262
12263       /* If this is a MEM, adjust deaths of anything used in the address.
12264          For a REG (the only other possibility), the entire value is
12265          being replaced so the old value is not used in this insn.  */
12266
12267       if (GET_CODE (dest) == MEM)
12268         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_cuid,
12269                      to_insn, pnotes);
12270       return;
12271     }
12272
12273   else if (GET_CODE (x) == CLOBBER)
12274     return;
12275
12276   len = GET_RTX_LENGTH (code);
12277   fmt = GET_RTX_FORMAT (code);
12278
12279   for (i = 0; i < len; i++)
12280     {
12281       if (fmt[i] == 'E')
12282         {
12283           int j;
12284           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12285             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_cuid,
12286                          to_insn, pnotes);
12287         }
12288       else if (fmt[i] == 'e')
12289         move_deaths (XEXP (x, i), maybe_kill_insn, from_cuid, to_insn, pnotes);
12290     }
12291 }
12292 \f
12293 /* Return 1 if X is the target of a bit-field assignment in BODY, the
12294    pattern of an insn.  X must be a REG.  */
12295
12296 static int
12297 reg_bitfield_target_p (rtx x, rtx body)
12298 {
12299   int i;
12300
12301   if (GET_CODE (body) == SET)
12302     {
12303       rtx dest = SET_DEST (body);
12304       rtx target;
12305       unsigned int regno, tregno, endregno, endtregno;
12306
12307       if (GET_CODE (dest) == ZERO_EXTRACT)
12308         target = XEXP (dest, 0);
12309       else if (GET_CODE (dest) == STRICT_LOW_PART)
12310         target = SUBREG_REG (XEXP (dest, 0));
12311       else
12312         return 0;
12313
12314       if (GET_CODE (target) == SUBREG)
12315         target = SUBREG_REG (target);
12316
12317       if (GET_CODE (target) != REG)
12318         return 0;
12319
12320       tregno = REGNO (target), regno = REGNO (x);
12321       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
12322         return target == x;
12323
12324       endtregno = tregno + hard_regno_nregs[tregno][GET_MODE (target)];
12325       endregno = regno + hard_regno_nregs[regno][GET_MODE (x)];
12326
12327       return endregno > tregno && regno < endtregno;
12328     }
12329
12330   else if (GET_CODE (body) == PARALLEL)
12331     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
12332       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
12333         return 1;
12334
12335   return 0;
12336 }
12337 \f
12338 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
12339    as appropriate.  I3 and I2 are the insns resulting from the combination
12340    insns including FROM (I2 may be zero).
12341
12342    Each note in the list is either ignored or placed on some insns, depending
12343    on the type of note.  */
12344
12345 static void
12346 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2)
12347 {
12348   rtx note, next_note;
12349   rtx tem;
12350
12351   for (note = notes; note; note = next_note)
12352     {
12353       rtx place = 0, place2 = 0;
12354
12355       /* If this NOTE references a pseudo register, ensure it references
12356          the latest copy of that register.  */
12357       if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG
12358           && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
12359         XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
12360
12361       next_note = XEXP (note, 1);
12362       switch (REG_NOTE_KIND (note))
12363         {
12364         case REG_BR_PROB:
12365         case REG_BR_PRED:
12366           /* Doesn't matter much where we put this, as long as it's somewhere.
12367              It is preferable to keep these notes on branches, which is most
12368              likely to be i3.  */
12369           place = i3;
12370           break;
12371
12372         case REG_VALUE_PROFILE:
12373           /* Just get rid of this note, as it is unused later anyway.  */
12374           break;
12375
12376         case REG_VTABLE_REF:
12377           /* ??? Should remain with *a particular* memory load.  Given the
12378              nature of vtable data, the last insn seems relatively safe.  */
12379           place = i3;
12380           break;
12381
12382         case REG_NON_LOCAL_GOTO:
12383           if (GET_CODE (i3) == JUMP_INSN)
12384             place = i3;
12385           else if (i2 && GET_CODE (i2) == JUMP_INSN)
12386             place = i2;
12387           else
12388             abort ();
12389           break;
12390
12391         case REG_EH_REGION:
12392           /* These notes must remain with the call or trapping instruction.  */
12393           if (GET_CODE (i3) == CALL_INSN)
12394             place = i3;
12395           else if (i2 && GET_CODE (i2) == CALL_INSN)
12396             place = i2;
12397           else if (flag_non_call_exceptions)
12398             {
12399               if (may_trap_p (i3))
12400                 place = i3;
12401               else if (i2 && may_trap_p (i2))
12402                 place = i2;
12403               /* ??? Otherwise assume we've combined things such that we
12404                  can now prove that the instructions can't trap.  Drop the
12405                  note in this case.  */
12406             }
12407           else
12408             abort ();
12409           break;
12410
12411         case REG_ALWAYS_RETURN:
12412         case REG_NORETURN:
12413         case REG_SETJMP:
12414           /* These notes must remain with the call.  It should not be
12415              possible for both I2 and I3 to be a call.  */
12416           if (GET_CODE (i3) == CALL_INSN)
12417             place = i3;
12418           else if (i2 && GET_CODE (i2) == CALL_INSN)
12419             place = i2;
12420           else
12421             abort ();
12422           break;
12423
12424         case REG_UNUSED:
12425           /* Any clobbers for i3 may still exist, and so we must process
12426              REG_UNUSED notes from that insn.
12427
12428              Any clobbers from i2 or i1 can only exist if they were added by
12429              recog_for_combine.  In that case, recog_for_combine created the
12430              necessary REG_UNUSED notes.  Trying to keep any original
12431              REG_UNUSED notes from these insns can cause incorrect output
12432              if it is for the same register as the original i3 dest.
12433              In that case, we will notice that the register is set in i3,
12434              and then add a REG_UNUSED note for the destination of i3, which
12435              is wrong.  However, it is possible to have REG_UNUSED notes from
12436              i2 or i1 for register which were both used and clobbered, so
12437              we keep notes from i2 or i1 if they will turn into REG_DEAD
12438              notes.  */
12439
12440           /* If this register is set or clobbered in I3, put the note there
12441              unless there is one already.  */
12442           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
12443             {
12444               if (from_insn != i3)
12445                 break;
12446
12447               if (! (GET_CODE (XEXP (note, 0)) == REG
12448                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
12449                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
12450                 place = i3;
12451             }
12452           /* Otherwise, if this register is used by I3, then this register
12453              now dies here, so we must put a REG_DEAD note here unless there
12454              is one already.  */
12455           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
12456                    && ! (GET_CODE (XEXP (note, 0)) == REG
12457                          ? find_regno_note (i3, REG_DEAD,
12458                                             REGNO (XEXP (note, 0)))
12459                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
12460             {
12461               PUT_REG_NOTE_KIND (note, REG_DEAD);
12462               place = i3;
12463             }
12464           break;
12465
12466         case REG_EQUAL:
12467         case REG_EQUIV:
12468         case REG_NOALIAS:
12469           /* These notes say something about results of an insn.  We can
12470              only support them if they used to be on I3 in which case they
12471              remain on I3.  Otherwise they are ignored.
12472
12473              If the note refers to an expression that is not a constant, we
12474              must also ignore the note since we cannot tell whether the
12475              equivalence is still true.  It might be possible to do
12476              slightly better than this (we only have a problem if I2DEST
12477              or I1DEST is present in the expression), but it doesn't
12478              seem worth the trouble.  */
12479
12480           if (from_insn == i3
12481               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
12482             place = i3;
12483           break;
12484
12485         case REG_INC:
12486         case REG_NO_CONFLICT:
12487           /* These notes say something about how a register is used.  They must
12488              be present on any use of the register in I2 or I3.  */
12489           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
12490             place = i3;
12491
12492           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
12493             {
12494               if (place)
12495                 place2 = i2;
12496               else
12497                 place = i2;
12498             }
12499           break;
12500
12501         case REG_LABEL:
12502           /* This can show up in several ways -- either directly in the
12503              pattern, or hidden off in the constant pool with (or without?)
12504              a REG_EQUAL note.  */
12505           /* ??? Ignore the without-reg_equal-note problem for now.  */
12506           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
12507               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
12508                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12509                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
12510             place = i3;
12511
12512           if (i2
12513               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
12514                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
12515                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12516                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
12517             {
12518               if (place)
12519                 place2 = i2;
12520               else
12521                 place = i2;
12522             }
12523
12524           /* Don't attach REG_LABEL note to a JUMP_INSN which has
12525              JUMP_LABEL already.  Instead, decrement LABEL_NUSES.  */
12526           if (place && GET_CODE (place) == JUMP_INSN && JUMP_LABEL (place))
12527             {
12528               if (JUMP_LABEL (place) != XEXP (note, 0))
12529                 abort ();
12530               if (GET_CODE (JUMP_LABEL (place)) == CODE_LABEL)
12531                 LABEL_NUSES (JUMP_LABEL (place))--;
12532               place = 0;
12533             }
12534           if (place2 && GET_CODE (place2) == JUMP_INSN && JUMP_LABEL (place2))
12535             {
12536               if (JUMP_LABEL (place2) != XEXP (note, 0))
12537                 abort ();
12538               if (GET_CODE (JUMP_LABEL (place2)) == CODE_LABEL)
12539                 LABEL_NUSES (JUMP_LABEL (place2))--;
12540               place2 = 0;
12541             }
12542           break;
12543
12544         case REG_NONNEG:
12545           /* This note says something about the value of a register prior
12546              to the execution of an insn.  It is too much trouble to see
12547              if the note is still correct in all situations.  It is better
12548              to simply delete it.  */
12549           break;
12550
12551         case REG_RETVAL:
12552           /* If the insn previously containing this note still exists,
12553              put it back where it was.  Otherwise move it to the previous
12554              insn.  Adjust the corresponding REG_LIBCALL note.  */
12555           if (GET_CODE (from_insn) != NOTE)
12556             place = from_insn;
12557           else
12558             {
12559               tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
12560               place = prev_real_insn (from_insn);
12561               if (tem && place)
12562                 XEXP (tem, 0) = place;
12563               /* If we're deleting the last remaining instruction of a
12564                  libcall sequence, don't add the notes.  */
12565               else if (XEXP (note, 0) == from_insn)
12566                 tem = place = 0;
12567               /* Don't add the dangling REG_RETVAL note.  */
12568               else if (! tem)
12569                 place = 0;
12570             }
12571           break;
12572
12573         case REG_LIBCALL:
12574           /* This is handled similarly to REG_RETVAL.  */
12575           if (GET_CODE (from_insn) != NOTE)
12576             place = from_insn;
12577           else
12578             {
12579               tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
12580               place = next_real_insn (from_insn);
12581               if (tem && place)
12582                 XEXP (tem, 0) = place;
12583               /* If we're deleting the last remaining instruction of a
12584                  libcall sequence, don't add the notes.  */
12585               else if (XEXP (note, 0) == from_insn)
12586                 tem = place = 0;
12587               /* Don't add the dangling REG_LIBCALL note.  */
12588               else if (! tem)
12589                 place = 0;
12590             }
12591           break;
12592
12593         case REG_DEAD:
12594           /* If the register is used as an input in I3, it dies there.
12595              Similarly for I2, if it is nonzero and adjacent to I3.
12596
12597              If the register is not used as an input in either I3 or I2
12598              and it is not one of the registers we were supposed to eliminate,
12599              there are two possibilities.  We might have a non-adjacent I2
12600              or we might have somehow eliminated an additional register
12601              from a computation.  For example, we might have had A & B where
12602              we discover that B will always be zero.  In this case we will
12603              eliminate the reference to A.
12604
12605              In both cases, we must search to see if we can find a previous
12606              use of A and put the death note there.  */
12607
12608           if (from_insn
12609               && GET_CODE (from_insn) == CALL_INSN
12610               && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
12611             place = from_insn;
12612           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
12613             place = i3;
12614           else if (i2 != 0 && next_nonnote_insn (i2) == i3
12615                    && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12616             place = i2;
12617
12618           if (place == 0)
12619             {
12620               basic_block bb = this_basic_block;
12621
12622               for (tem = PREV_INSN (i3); place == 0; tem = PREV_INSN (tem))
12623                 {
12624                   if (! INSN_P (tem))
12625                     {
12626                       if (tem == BB_HEAD (bb))
12627                         break;
12628                       continue;
12629                     }
12630
12631                   /* If the register is being set at TEM, see if that is all
12632                      TEM is doing.  If so, delete TEM.  Otherwise, make this
12633                      into a REG_UNUSED note instead.  */
12634                   if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
12635                     {
12636                       rtx set = single_set (tem);
12637                       rtx inner_dest = 0;
12638 #ifdef HAVE_cc0
12639                       rtx cc0_setter = NULL_RTX;
12640 #endif
12641
12642                       if (set != 0)
12643                         for (inner_dest = SET_DEST (set);
12644                              (GET_CODE (inner_dest) == STRICT_LOW_PART
12645                               || GET_CODE (inner_dest) == SUBREG
12646                               || GET_CODE (inner_dest) == ZERO_EXTRACT);
12647                              inner_dest = XEXP (inner_dest, 0))
12648                           ;
12649
12650                       /* Verify that it was the set, and not a clobber that
12651                          modified the register.
12652
12653                          CC0 targets must be careful to maintain setter/user
12654                          pairs.  If we cannot delete the setter due to side
12655                          effects, mark the user with an UNUSED note instead
12656                          of deleting it.  */
12657
12658                       if (set != 0 && ! side_effects_p (SET_SRC (set))
12659                           && rtx_equal_p (XEXP (note, 0), inner_dest)
12660 #ifdef HAVE_cc0
12661                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
12662                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
12663                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
12664 #endif
12665                           )
12666                         {
12667                           /* Move the notes and links of TEM elsewhere.
12668                              This might delete other dead insns recursively.
12669                              First set the pattern to something that won't use
12670                              any register.  */
12671                           rtx old_notes = REG_NOTES (tem);
12672
12673                           PATTERN (tem) = pc_rtx;
12674                           REG_NOTES (tem) = NULL;
12675
12676                           distribute_notes (old_notes, tem, tem, NULL_RTX);
12677                           distribute_links (LOG_LINKS (tem));
12678
12679                           PUT_CODE (tem, NOTE);
12680                           NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
12681                           NOTE_SOURCE_FILE (tem) = 0;
12682
12683 #ifdef HAVE_cc0
12684                           /* Delete the setter too.  */
12685                           if (cc0_setter)
12686                             {
12687                               PATTERN (cc0_setter) = pc_rtx;
12688                               old_notes = REG_NOTES (cc0_setter);
12689                               REG_NOTES (cc0_setter) = NULL;
12690
12691                               distribute_notes (old_notes, cc0_setter,
12692                                                 cc0_setter, NULL_RTX);
12693                               distribute_links (LOG_LINKS (cc0_setter));
12694
12695                               PUT_CODE (cc0_setter, NOTE);
12696                               NOTE_LINE_NUMBER (cc0_setter)
12697                                 = NOTE_INSN_DELETED;
12698                               NOTE_SOURCE_FILE (cc0_setter) = 0;
12699                             }
12700 #endif
12701                         }
12702                       else
12703                         {
12704                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
12705
12706                           /*  If there isn't already a REG_UNUSED note, put one
12707                               here.  Do not place a REG_DEAD note, even if
12708                               the register is also used here; that would not
12709                               match the algorithm used in lifetime analysis
12710                               and can cause the consistency check in the
12711                               scheduler to fail.  */
12712                           if (! find_regno_note (tem, REG_UNUSED,
12713                                                  REGNO (XEXP (note, 0))))
12714                             place = tem;
12715                           break;
12716                         }
12717                     }
12718                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
12719                            || (GET_CODE (tem) == CALL_INSN
12720                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
12721                     {
12722                       place = tem;
12723
12724                       /* If we are doing a 3->2 combination, and we have a
12725                          register which formerly died in i3 and was not used
12726                          by i2, which now no longer dies in i3 and is used in
12727                          i2 but does not die in i2, and place is between i2
12728                          and i3, then we may need to move a link from place to
12729                          i2.  */
12730                       if (i2 && INSN_UID (place) <= max_uid_cuid
12731                           && INSN_CUID (place) > INSN_CUID (i2)
12732                           && from_insn
12733                           && INSN_CUID (from_insn) > INSN_CUID (i2)
12734                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12735                         {
12736                           rtx links = LOG_LINKS (place);
12737                           LOG_LINKS (place) = 0;
12738                           distribute_links (links);
12739                         }
12740                       break;
12741                     }
12742
12743                   if (tem == BB_HEAD (bb))
12744                     break;
12745                 }
12746
12747               /* We haven't found an insn for the death note and it
12748                  is still a REG_DEAD note, but we have hit the beginning
12749                  of the block.  If the existing life info says the reg
12750                  was dead, there's nothing left to do.  Otherwise, we'll
12751                  need to do a global life update after combine.  */
12752               if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
12753                   && REGNO_REG_SET_P (bb->global_live_at_start,
12754                                       REGNO (XEXP (note, 0))))
12755                 SET_BIT (refresh_blocks, this_basic_block->index);
12756             }
12757
12758           /* If the register is set or already dead at PLACE, we needn't do
12759              anything with this note if it is still a REG_DEAD note.
12760              We can here if it is set at all, not if is it totally replace,
12761              which is what `dead_or_set_p' checks, so also check for it being
12762              set partially.  */
12763
12764           if (place && REG_NOTE_KIND (note) == REG_DEAD)
12765             {
12766               unsigned int regno = REGNO (XEXP (note, 0));
12767
12768               /* Similarly, if the instruction on which we want to place
12769                  the note is a noop, we'll need do a global live update
12770                  after we remove them in delete_noop_moves.  */
12771               if (noop_move_p (place))
12772                 SET_BIT (refresh_blocks, this_basic_block->index);
12773
12774               if (dead_or_set_p (place, XEXP (note, 0))
12775                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
12776                 {
12777                   /* Unless the register previously died in PLACE, clear
12778                      last_death.  [I no longer understand why this is
12779                      being done.] */
12780                   if (reg_stat[regno].last_death != place)
12781                     reg_stat[regno].last_death = 0;
12782                   place = 0;
12783                 }
12784               else
12785                 reg_stat[regno].last_death = place;
12786
12787               /* If this is a death note for a hard reg that is occupying
12788                  multiple registers, ensure that we are still using all
12789                  parts of the object.  If we find a piece of the object
12790                  that is unused, we must arrange for an appropriate REG_DEAD
12791                  note to be added for it.  However, we can't just emit a USE
12792                  and tag the note to it, since the register might actually
12793                  be dead; so we recourse, and the recursive call then finds
12794                  the previous insn that used this register.  */
12795
12796               if (place && regno < FIRST_PSEUDO_REGISTER
12797                   && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
12798                 {
12799                   unsigned int endregno
12800                     = regno + hard_regno_nregs[regno]
12801                                               [GET_MODE (XEXP (note, 0))];
12802                   int all_used = 1;
12803                   unsigned int i;
12804
12805                   for (i = regno; i < endregno; i++)
12806                     if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
12807                          && ! find_regno_fusage (place, USE, i))
12808                         || dead_or_set_regno_p (place, i))
12809                       all_used = 0;
12810
12811                   if (! all_used)
12812                     {
12813                       /* Put only REG_DEAD notes for pieces that are
12814                          not already dead or set.  */
12815
12816                       for (i = regno; i < endregno;
12817                            i += hard_regno_nregs[i][reg_raw_mode[i]])
12818                         {
12819                           rtx piece = regno_reg_rtx[i];
12820                           basic_block bb = this_basic_block;
12821
12822                           if (! dead_or_set_p (place, piece)
12823                               && ! reg_bitfield_target_p (piece,
12824                                                           PATTERN (place)))
12825                             {
12826                               rtx new_note
12827                                 = gen_rtx_EXPR_LIST (REG_DEAD, piece, NULL_RTX);
12828
12829                               distribute_notes (new_note, place, place,
12830                                                 NULL_RTX);
12831                             }
12832                           else if (! refers_to_regno_p (i, i + 1,
12833                                                         PATTERN (place), 0)
12834                                    && ! find_regno_fusage (place, USE, i))
12835                             for (tem = PREV_INSN (place); ;
12836                                  tem = PREV_INSN (tem))
12837                               {
12838                                 if (! INSN_P (tem))
12839                                   {
12840                                     if (tem == BB_HEAD (bb))
12841                                       {
12842                                         SET_BIT (refresh_blocks,
12843                                                  this_basic_block->index);
12844                                         break;
12845                                       }
12846                                     continue;
12847                                   }
12848                                 if (dead_or_set_p (tem, piece)
12849                                     || reg_bitfield_target_p (piece,
12850                                                               PATTERN (tem)))
12851                                   {
12852                                     REG_NOTES (tem)
12853                                       = gen_rtx_EXPR_LIST (REG_UNUSED, piece,
12854                                                            REG_NOTES (tem));
12855                                     break;
12856                                   }
12857                               }
12858
12859                         }
12860
12861                       place = 0;
12862                     }
12863                 }
12864             }
12865           break;
12866
12867         default:
12868           /* Any other notes should not be present at this point in the
12869              compilation.  */
12870           abort ();
12871         }
12872
12873       if (place)
12874         {
12875           XEXP (note, 1) = REG_NOTES (place);
12876           REG_NOTES (place) = note;
12877         }
12878       else if ((REG_NOTE_KIND (note) == REG_DEAD
12879                 || REG_NOTE_KIND (note) == REG_UNUSED)
12880                && GET_CODE (XEXP (note, 0)) == REG)
12881         REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
12882
12883       if (place2)
12884         {
12885           if ((REG_NOTE_KIND (note) == REG_DEAD
12886                || REG_NOTE_KIND (note) == REG_UNUSED)
12887               && GET_CODE (XEXP (note, 0)) == REG)
12888             REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
12889
12890           REG_NOTES (place2) = gen_rtx_fmt_ee (GET_CODE (note),
12891                                                REG_NOTE_KIND (note),
12892                                                XEXP (note, 0),
12893                                                REG_NOTES (place2));
12894         }
12895     }
12896 }
12897 \f
12898 /* Similarly to above, distribute the LOG_LINKS that used to be present on
12899    I3, I2, and I1 to new locations.  This is also called to add a link
12900    pointing at I3 when I3's destination is changed.  */
12901
12902 static void
12903 distribute_links (rtx links)
12904 {
12905   rtx link, next_link;
12906
12907   for (link = links; link; link = next_link)
12908     {
12909       rtx place = 0;
12910       rtx insn;
12911       rtx set, reg;
12912
12913       next_link = XEXP (link, 1);
12914
12915       /* If the insn that this link points to is a NOTE or isn't a single
12916          set, ignore it.  In the latter case, it isn't clear what we
12917          can do other than ignore the link, since we can't tell which
12918          register it was for.  Such links wouldn't be used by combine
12919          anyway.
12920
12921          It is not possible for the destination of the target of the link to
12922          have been changed by combine.  The only potential of this is if we
12923          replace I3, I2, and I1 by I3 and I2.  But in that case the
12924          destination of I2 also remains unchanged.  */
12925
12926       if (GET_CODE (XEXP (link, 0)) == NOTE
12927           || (set = single_set (XEXP (link, 0))) == 0)
12928         continue;
12929
12930       reg = SET_DEST (set);
12931       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
12932              || GET_CODE (reg) == SIGN_EXTRACT
12933              || GET_CODE (reg) == STRICT_LOW_PART)
12934         reg = XEXP (reg, 0);
12935
12936       /* A LOG_LINK is defined as being placed on the first insn that uses
12937          a register and points to the insn that sets the register.  Start
12938          searching at the next insn after the target of the link and stop
12939          when we reach a set of the register or the end of the basic block.
12940
12941          Note that this correctly handles the link that used to point from
12942          I3 to I2.  Also note that not much searching is typically done here
12943          since most links don't point very far away.  */
12944
12945       for (insn = NEXT_INSN (XEXP (link, 0));
12946            (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
12947                      || BB_HEAD (this_basic_block->next_bb) != insn));
12948            insn = NEXT_INSN (insn))
12949         if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
12950           {
12951             if (reg_referenced_p (reg, PATTERN (insn)))
12952               place = insn;
12953             break;
12954           }
12955         else if (GET_CODE (insn) == CALL_INSN
12956                  && find_reg_fusage (insn, USE, reg))
12957           {
12958             place = insn;
12959             break;
12960           }
12961         else if (INSN_P (insn) && reg_set_p (reg, insn))
12962           break;
12963
12964       /* If we found a place to put the link, place it there unless there
12965          is already a link to the same insn as LINK at that point.  */
12966
12967       if (place)
12968         {
12969           rtx link2;
12970
12971           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
12972             if (XEXP (link2, 0) == XEXP (link, 0))
12973               break;
12974
12975           if (link2 == 0)
12976             {
12977               XEXP (link, 1) = LOG_LINKS (place);
12978               LOG_LINKS (place) = link;
12979
12980               /* Set added_links_insn to the earliest insn we added a
12981                  link to.  */
12982               if (added_links_insn == 0
12983                   || INSN_CUID (added_links_insn) > INSN_CUID (place))
12984                 added_links_insn = place;
12985             }
12986         }
12987     }
12988 }
12989 \f
12990 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
12991    Check whether the expression pointer to by LOC is a register or
12992    memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
12993    Otherwise return zero.  */
12994
12995 static int
12996 unmentioned_reg_p_1 (rtx *loc, void *expr)
12997 {
12998   rtx x = *loc;
12999
13000   if (x != NULL_RTX
13001       && (GET_CODE (x) == REG || GET_CODE (x) == MEM)
13002       && ! reg_mentioned_p (x, (rtx) expr))
13003     return 1;
13004   return 0;
13005 }
13006
13007 /* Check for any register or memory mentioned in EQUIV that is not
13008    mentioned in EXPR.  This is used to restrict EQUIV to "specializations"
13009    of EXPR where some registers may have been replaced by constants.  */
13010
13011 static bool
13012 unmentioned_reg_p (rtx equiv, rtx expr)
13013 {
13014   return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
13015 }
13016 \f
13017 /* Compute INSN_CUID for INSN, which is an insn made by combine.  */
13018
13019 static int
13020 insn_cuid (rtx insn)
13021 {
13022   while (insn != 0 && INSN_UID (insn) > max_uid_cuid
13023          && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == USE)
13024     insn = NEXT_INSN (insn);
13025
13026   if (INSN_UID (insn) > max_uid_cuid)
13027     abort ();
13028
13029   return INSN_CUID (insn);
13030 }
13031 \f
13032 void
13033 dump_combine_stats (FILE *file)
13034 {
13035   fnotice
13036     (file,
13037      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
13038      combine_attempts, combine_merges, combine_extras, combine_successes);
13039 }
13040
13041 void
13042 dump_combine_total_stats (FILE *file)
13043 {
13044   fnotice
13045     (file,
13046      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
13047      total_attempts, total_merges, total_extras, total_successes);
13048 }