OSDN Git Service

* gcc.dg/ppc64-toc.c: Don't explicitly use -m64.
[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, 2005 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 #include "rtlhooks-def.h"
94 /* Include output.h for dump_file.  */
95 #include "output.h"
96 #include "params.h"
97
98 /* Number of attempts to combine instructions in this function.  */
99
100 static int combine_attempts;
101
102 /* Number of attempts that got as far as substitution in this function.  */
103
104 static int combine_merges;
105
106 /* Number of instructions combined with added SETs in this function.  */
107
108 static int combine_extras;
109
110 /* Number of instructions combined in this function.  */
111
112 static int combine_successes;
113
114 /* Totals over entire compilation.  */
115
116 static int total_attempts, total_merges, total_extras, total_successes;
117
118 \f
119 /* Vector mapping INSN_UIDs to cuids.
120    The cuids are like uids but increase monotonically always.
121    Combine always uses cuids so that it can compare them.
122    But actually renumbering the uids, which we used to do,
123    proves to be a bad idea because it makes it hard to compare
124    the dumps produced by earlier passes with those from later passes.  */
125
126 static int *uid_cuid;
127 static int max_uid_cuid;
128
129 /* Get the cuid of an insn.  */
130
131 #define INSN_CUID(INSN) \
132 (INSN_UID (INSN) > max_uid_cuid ? insn_cuid (INSN) : uid_cuid[INSN_UID (INSN)])
133
134 /* In case BITS_PER_WORD == HOST_BITS_PER_WIDE_INT, shifting by
135    BITS_PER_WORD would invoke undefined behavior.  Work around it.  */
136
137 #define UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD(val) \
138   (((unsigned HOST_WIDE_INT) (val) << (BITS_PER_WORD - 1)) << 1)
139
140 /* Maximum register number, which is the size of the tables below.  */
141
142 static unsigned int combine_max_regno;
143
144 struct reg_stat {
145   /* Record last point of death of (hard or pseudo) register n.  */
146   rtx                           last_death;
147
148   /* Record last point of modification of (hard or pseudo) register n.  */
149   rtx                           last_set;
150
151   /* The next group of fields allows the recording of the last value assigned
152      to (hard or pseudo) register n.  We use this information to see if an
153      operation being processed is redundant given a prior operation performed
154      on the register.  For example, an `and' with a constant is redundant if
155      all the zero bits are already known to be turned off.
156
157      We use an approach similar to that used by cse, but change it in the
158      following ways:
159
160      (1) We do not want to reinitialize at each label.
161      (2) It is useful, but not critical, to know the actual value assigned
162          to a register.  Often just its form is helpful.
163
164      Therefore, we maintain the following fields:
165
166      last_set_value             the last value assigned
167      last_set_label             records the value of label_tick when the
168                                 register was assigned
169      last_set_table_tick        records the value of label_tick when a
170                                 value using the register is assigned
171      last_set_invalid           set to nonzero when it is not valid
172                                 to use the value of this register in some
173                                 register's value
174
175      To understand the usage of these tables, it is important to understand
176      the distinction between the value in last_set_value being valid and
177      the register being validly contained in some other expression in the
178      table.
179
180      (The next two parameters are out of date).
181
182      reg_stat[i].last_set_value is valid if it is nonzero, and either
183      reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
184
185      Register I may validly appear in any expression returned for the value
186      of another register if reg_n_sets[i] is 1.  It may also appear in the
187      value for register J if reg_stat[j].last_set_invalid is zero, or
188      reg_stat[i].last_set_label < reg_stat[j].last_set_label.
189
190      If an expression is found in the table containing a register which may
191      not validly appear in an expression, the register is replaced by
192      something that won't match, (clobber (const_int 0)).  */
193
194   /* Record last value assigned to (hard or pseudo) register n.  */
195
196   rtx                           last_set_value;
197
198   /* Record the value of label_tick when an expression involving register n
199      is placed in last_set_value.  */
200
201   int                           last_set_table_tick;
202
203   /* Record the value of label_tick when the value for register n is placed in
204      last_set_value.  */
205
206   int                           last_set_label;
207
208   /* These fields are maintained in parallel with last_set_value and are
209      used to store the mode in which the register was last set, the bits
210      that were known to be zero when it was last set, and the number of
211      sign bits copies it was known to have when it was last set.  */
212
213   unsigned HOST_WIDE_INT        last_set_nonzero_bits;
214   char                          last_set_sign_bit_copies;
215   ENUM_BITFIELD(machine_mode)   last_set_mode : 8; 
216
217   /* Set nonzero if references to register n in expressions should not be
218      used.  last_set_invalid is set nonzero when this register is being
219      assigned to and last_set_table_tick == label_tick.  */
220
221   char                          last_set_invalid;
222
223   /* Some registers that are set more than once and used in more than one
224      basic block are nevertheless always set in similar ways.  For example,
225      a QImode register may be loaded from memory in two places on a machine
226      where byte loads zero extend.
227
228      We record in the following fields if a register has some leading bits
229      that are always equal to the sign bit, and what we know about the
230      nonzero bits of a register, specifically which bits are known to be
231      zero.
232
233      If an entry is zero, it means that we don't know anything special.  */
234
235   unsigned char                 sign_bit_copies;
236
237   unsigned HOST_WIDE_INT        nonzero_bits;
238 };
239
240 static struct reg_stat *reg_stat;
241
242 /* Record the cuid of the last insn that invalidated memory
243    (anything that writes memory, and subroutine calls, but not pushes).  */
244
245 static int mem_last_set;
246
247 /* Record the cuid of the last CALL_INSN
248    so we can tell whether a potential combination crosses any calls.  */
249
250 static int last_call_cuid;
251
252 /* When `subst' is called, this is the insn that is being modified
253    (by combining in a previous insn).  The PATTERN of this insn
254    is still the old pattern partially modified and it should not be
255    looked at, but this may be used to examine the successors of the insn
256    to judge whether a simplification is valid.  */
257
258 static rtx subst_insn;
259
260 /* This is the lowest CUID that `subst' is currently dealing with.
261    get_last_value will not return a value if the register was set at or
262    after this CUID.  If not for this mechanism, we could get confused if
263    I2 or I1 in try_combine were an insn that used the old value of a register
264    to obtain a new value.  In that case, we might erroneously get the
265    new value of the register when we wanted the old one.  */
266
267 static int subst_low_cuid;
268
269 /* This contains any hard registers that are used in newpat; reg_dead_at_p
270    must consider all these registers to be always live.  */
271
272 static HARD_REG_SET newpat_used_regs;
273
274 /* This is an insn to which a LOG_LINKS entry has been added.  If this
275    insn is the earlier than I2 or I3, combine should rescan starting at
276    that location.  */
277
278 static rtx added_links_insn;
279
280 /* Basic block in which we are performing combines.  */
281 static basic_block this_basic_block;
282
283 /* A bitmap indicating which blocks had registers go dead at entry.
284    After combine, we'll need to re-do global life analysis with
285    those blocks as starting points.  */
286 static sbitmap refresh_blocks;
287 \f
288 /* The following array records the insn_rtx_cost for every insn
289    in the instruction stream.  */
290
291 static int *uid_insn_cost;
292
293 /* Length of the currently allocated uid_insn_cost array.  */
294
295 static int last_insn_cost;
296
297 /* Incremented for each label.  */
298
299 static int label_tick;
300
301 /* Mode used to compute significance in reg_stat[].nonzero_bits.  It is the
302    largest integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
303
304 static enum machine_mode nonzero_bits_mode;
305
306 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
307    be safely used.  It is zero while computing them and after combine has
308    completed.  This former test prevents propagating values based on
309    previously set values, which can be incorrect if a variable is modified
310    in a loop.  */
311
312 static int nonzero_sign_valid;
313
314 \f
315 /* Record one modification to rtl structure
316    to be undone by storing old_contents into *where.
317    is_int is 1 if the contents are an int.  */
318
319 struct undo
320 {
321   struct undo *next;
322   int is_int;
323   union {rtx r; int i;} old_contents;
324   union {rtx *r; int *i;} where;
325 };
326
327 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
328    num_undo says how many are currently recorded.
329
330    other_insn is nonzero if we have modified some other insn in the process
331    of working on subst_insn.  It must be verified too.  */
332
333 struct undobuf
334 {
335   struct undo *undos;
336   struct undo *frees;
337   rtx other_insn;
338 };
339
340 static struct undobuf undobuf;
341
342 /* Number of times the pseudo being substituted for
343    was found and replaced.  */
344
345 static int n_occurrences;
346
347 static rtx reg_nonzero_bits_for_combine (rtx, enum machine_mode, rtx,
348                                          enum machine_mode,
349                                          unsigned HOST_WIDE_INT,
350                                          unsigned HOST_WIDE_INT *);
351 static rtx reg_num_sign_bit_copies_for_combine (rtx, enum machine_mode, rtx,
352                                                 enum machine_mode,
353                                                 unsigned int, unsigned int *);
354 static void do_SUBST (rtx *, rtx);
355 static void do_SUBST_INT (int *, int);
356 static void init_reg_last (void);
357 static void setup_incoming_promotions (void);
358 static void set_nonzero_bits_and_sign_copies (rtx, rtx, void *);
359 static int cant_combine_insn_p (rtx);
360 static int can_combine_p (rtx, rtx, rtx, rtx, rtx *, rtx *);
361 static int combinable_i3pat (rtx, rtx *, rtx, rtx, int, rtx *);
362 static int contains_muldiv (rtx);
363 static rtx try_combine (rtx, rtx, rtx, int *);
364 static void undo_all (void);
365 static void undo_commit (void);
366 static rtx *find_split_point (rtx *, rtx);
367 static rtx subst (rtx, rtx, rtx, int, int);
368 static rtx combine_simplify_rtx (rtx, enum machine_mode, int);
369 static rtx simplify_if_then_else (rtx);
370 static rtx simplify_set (rtx);
371 static rtx simplify_logical (rtx);
372 static rtx expand_compound_operation (rtx);
373 static rtx expand_field_assignment (rtx);
374 static rtx make_extraction (enum machine_mode, rtx, HOST_WIDE_INT,
375                             rtx, unsigned HOST_WIDE_INT, int, int, int);
376 static rtx extract_left_shift (rtx, int);
377 static rtx make_compound_operation (rtx, enum rtx_code);
378 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
379                               unsigned HOST_WIDE_INT *);
380 static rtx force_to_mode (rtx, enum machine_mode,
381                           unsigned HOST_WIDE_INT, rtx, int);
382 static rtx if_then_else_cond (rtx, rtx *, rtx *);
383 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
384 static int rtx_equal_for_field_assignment_p (rtx, rtx);
385 static rtx make_field_assignment (rtx);
386 static rtx apply_distributive_law (rtx);
387 static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
388                                    unsigned HOST_WIDE_INT);
389 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
390                             HOST_WIDE_INT, enum machine_mode, int *);
391 static rtx simplify_shift_const (rtx, enum rtx_code, enum machine_mode, rtx,
392                                  int);
393 static int recog_for_combine (rtx *, rtx, rtx *);
394 static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
395 static rtx gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
396 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
397 static void update_table_tick (rtx);
398 static void record_value_for_reg (rtx, rtx, rtx);
399 static void check_promoted_subreg (rtx, rtx);
400 static void record_dead_and_set_regs_1 (rtx, rtx, void *);
401 static void record_dead_and_set_regs (rtx);
402 static int get_last_value_validate (rtx *, rtx, int, int);
403 static rtx get_last_value (rtx);
404 static int use_crosses_set_p (rtx, int);
405 static void reg_dead_at_p_1 (rtx, rtx, void *);
406 static int reg_dead_at_p (rtx, rtx);
407 static void move_deaths (rtx, rtx, int, rtx, rtx *);
408 static int reg_bitfield_target_p (rtx, rtx);
409 static void distribute_notes (rtx, rtx, rtx, rtx);
410 static void distribute_links (rtx);
411 static void mark_used_regs_combine (rtx);
412 static int insn_cuid (rtx);
413 static void record_promoted_value (rtx, rtx);
414 static rtx reversed_comparison (rtx, enum machine_mode, rtx, rtx);
415 static enum rtx_code combine_reversed_comparison_code (rtx);
416 static int unmentioned_reg_p_1 (rtx *, void *);
417 static bool unmentioned_reg_p (rtx, rtx);
418 \f
419
420 /* It is not safe to use ordinary gen_lowpart in combine.
421    See comments in gen_lowpart_for_combine.  */
422 #undef RTL_HOOKS_GEN_LOWPART
423 #define RTL_HOOKS_GEN_LOWPART              gen_lowpart_for_combine
424
425 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
426 #define RTL_HOOKS_REG_NONZERO_REG_BITS     reg_nonzero_bits_for_combine
427
428 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
429 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES  reg_num_sign_bit_copies_for_combine
430
431 static const struct rtl_hooks combine_rtl_hooks = RTL_HOOKS_INITIALIZER;
432
433 \f
434 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
435    insn.  The substitution can be undone by undo_all.  If INTO is already
436    set to NEWVAL, do not record this change.  Because computing NEWVAL might
437    also call SUBST, we have to compute it before we put anything into
438    the undo table.  */
439
440 static void
441 do_SUBST (rtx *into, rtx newval)
442 {
443   struct undo *buf;
444   rtx oldval = *into;
445
446   if (oldval == newval)
447     return;
448
449   /* We'd like to catch as many invalid transformations here as
450      possible.  Unfortunately, there are way too many mode changes
451      that are perfectly valid, so we'd waste too much effort for
452      little gain doing the checks here.  Focus on catching invalid
453      transformations involving integer constants.  */
454   if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
455       && GET_CODE (newval) == CONST_INT)
456     {
457       /* Sanity check that we're replacing oldval with a CONST_INT
458          that is a valid sign-extension for the original mode.  */
459       gcc_assert (INTVAL (newval)
460                   == trunc_int_for_mode (INTVAL (newval), GET_MODE (oldval)));
461
462       /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
463          CONST_INT is not valid, because after the replacement, the
464          original mode would be gone.  Unfortunately, we can't tell
465          when do_SUBST is called to replace the operand thereof, so we
466          perform this test on oldval instead, checking whether an
467          invalid replacement took place before we got here.  */
468       gcc_assert (!(GET_CODE (oldval) == SUBREG
469                     && GET_CODE (SUBREG_REG (oldval)) == CONST_INT));
470       gcc_assert (!(GET_CODE (oldval) == ZERO_EXTEND
471                     && GET_CODE (XEXP (oldval, 0)) == CONST_INT));
472     }
473
474   if (undobuf.frees)
475     buf = undobuf.frees, undobuf.frees = buf->next;
476   else
477     buf = xmalloc (sizeof (struct undo));
478
479   buf->is_int = 0;
480   buf->where.r = into;
481   buf->old_contents.r = oldval;
482   *into = newval;
483
484   buf->next = undobuf.undos, undobuf.undos = buf;
485 }
486
487 #define SUBST(INTO, NEWVAL)     do_SUBST(&(INTO), (NEWVAL))
488
489 /* Similar to SUBST, but NEWVAL is an int expression.  Note that substitution
490    for the value of a HOST_WIDE_INT value (including CONST_INT) is
491    not safe.  */
492
493 static void
494 do_SUBST_INT (int *into, int newval)
495 {
496   struct undo *buf;
497   int oldval = *into;
498
499   if (oldval == newval)
500     return;
501
502   if (undobuf.frees)
503     buf = undobuf.frees, undobuf.frees = buf->next;
504   else
505     buf = xmalloc (sizeof (struct undo));
506
507   buf->is_int = 1;
508   buf->where.i = into;
509   buf->old_contents.i = oldval;
510   *into = newval;
511
512   buf->next = undobuf.undos, undobuf.undos = buf;
513 }
514
515 #define SUBST_INT(INTO, NEWVAL)  do_SUBST_INT(&(INTO), (NEWVAL))
516 \f
517 /* Subroutine of try_combine.  Determine whether the combine replacement
518    patterns NEWPAT and NEWI2PAT are cheaper according to insn_rtx_cost
519    that the original instruction sequence I1, I2 and I3.  Note that I1
520    and/or NEWI2PAT may be NULL_RTX.  This function returns false, if the
521    costs of all instructions can be estimated, and the replacements are
522    more expensive than the original sequence.  */
523
524 static bool
525 combine_validate_cost (rtx i1, rtx i2, rtx i3, rtx newpat, rtx newi2pat)
526 {
527   int i1_cost, i2_cost, i3_cost;
528   int new_i2_cost, new_i3_cost;
529   int old_cost, new_cost;
530
531   /* Lookup the original insn_rtx_costs.  */
532   i2_cost = INSN_UID (i2) <= last_insn_cost
533             ? uid_insn_cost[INSN_UID (i2)] : 0;
534   i3_cost = INSN_UID (i3) <= last_insn_cost
535             ? uid_insn_cost[INSN_UID (i3)] : 0;
536
537   if (i1)
538     {
539       i1_cost = INSN_UID (i1) <= last_insn_cost
540                 ? uid_insn_cost[INSN_UID (i1)] : 0;
541       old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0)
542                  ? i1_cost + i2_cost + i3_cost : 0;
543     }
544   else
545     {
546       old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
547       i1_cost = 0;
548     }
549
550   /* Calculate the replacement insn_rtx_costs.  */
551   new_i3_cost = insn_rtx_cost (newpat);
552   if (newi2pat)
553     {
554       new_i2_cost = insn_rtx_cost (newi2pat);
555       new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
556                  ? new_i2_cost + new_i3_cost : 0;
557     }
558   else
559     {
560       new_cost = new_i3_cost;
561       new_i2_cost = 0;
562     }
563
564   if (undobuf.other_insn)
565     {
566       int old_other_cost, new_other_cost;
567
568       old_other_cost = (INSN_UID (undobuf.other_insn) <= last_insn_cost
569                         ? uid_insn_cost[INSN_UID (undobuf.other_insn)] : 0);
570       new_other_cost = insn_rtx_cost (PATTERN (undobuf.other_insn));
571       if (old_other_cost > 0 && new_other_cost > 0)
572         {
573           old_cost += old_other_cost;
574           new_cost += new_other_cost;
575         }
576       else
577         old_cost = 0;
578     }
579
580   /* Disallow this recombination if both new_cost and old_cost are
581      greater than zero, and new_cost is greater than old cost.  */
582   if (old_cost > 0
583       && new_cost > old_cost)
584     {
585       if (dump_file)
586         {
587           if (i1)
588             {
589               fprintf (dump_file,
590                        "rejecting combination of insns %d, %d and %d\n",
591                        INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
592               fprintf (dump_file, "original costs %d + %d + %d = %d\n",
593                        i1_cost, i2_cost, i3_cost, old_cost);
594             }
595           else
596             {
597               fprintf (dump_file,
598                        "rejecting combination of insns %d and %d\n",
599                        INSN_UID (i2), INSN_UID (i3));
600               fprintf (dump_file, "original costs %d + %d = %d\n",
601                        i2_cost, i3_cost, old_cost);
602             }
603
604           if (newi2pat)
605             {
606               fprintf (dump_file, "replacement costs %d + %d = %d\n",
607                        new_i2_cost, new_i3_cost, new_cost);
608             }
609           else
610             fprintf (dump_file, "replacement cost %d\n", new_cost);
611         }
612
613       return false;
614     }
615
616   /* Update the uid_insn_cost array with the replacement costs.  */
617   uid_insn_cost[INSN_UID (i2)] = new_i2_cost;
618   uid_insn_cost[INSN_UID (i3)] = new_i3_cost;
619   if (i1)
620     uid_insn_cost[INSN_UID (i1)] = 0;
621
622   return true;
623 }
624 \f
625 /* Main entry point for combiner.  F is the first insn of the function.
626    NREGS is the first unused pseudo-reg number.
627
628    Return nonzero if the combiner has turned an indirect jump
629    instruction into a direct jump.  */
630 int
631 combine_instructions (rtx f, unsigned int nregs)
632 {
633   rtx insn, next;
634 #ifdef HAVE_cc0
635   rtx prev;
636 #endif
637   int i;
638   rtx links, nextlinks;
639
640   int new_direct_jump_p = 0;
641
642   combine_attempts = 0;
643   combine_merges = 0;
644   combine_extras = 0;
645   combine_successes = 0;
646
647   combine_max_regno = nregs;
648
649   rtl_hooks = combine_rtl_hooks;
650
651   reg_stat = xcalloc (nregs, sizeof (struct reg_stat));
652
653   init_recog_no_volatile ();
654
655   /* Compute maximum uid value so uid_cuid can be allocated.  */
656
657   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
658     if (INSN_UID (insn) > i)
659       i = INSN_UID (insn);
660
661   uid_cuid = xmalloc ((i + 1) * sizeof (int));
662   max_uid_cuid = i;
663
664   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
665
666   /* Don't use reg_stat[].nonzero_bits when computing it.  This can cause
667      problems when, for example, we have j <<= 1 in a loop.  */
668
669   nonzero_sign_valid = 0;
670
671   /* Compute the mapping from uids to cuids.
672      Cuids are numbers assigned to insns, like uids,
673      except that cuids increase monotonically through the code.
674
675      Scan all SETs and see if we can deduce anything about what
676      bits are known to be zero for some registers and how many copies
677      of the sign bit are known to exist for those registers.
678
679      Also set any known values so that we can use it while searching
680      for what bits are known to be set.  */
681
682   label_tick = 1;
683
684   setup_incoming_promotions ();
685
686   refresh_blocks = sbitmap_alloc (last_basic_block);
687   sbitmap_zero (refresh_blocks);
688
689   /* Allocate array of current insn_rtx_costs.  */
690   uid_insn_cost = xcalloc (max_uid_cuid + 1, sizeof (int));
691   last_insn_cost = max_uid_cuid;
692
693   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
694     {
695       uid_cuid[INSN_UID (insn)] = ++i;
696       subst_low_cuid = i;
697       subst_insn = insn;
698
699       if (INSN_P (insn))
700         {
701           note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
702                        NULL);
703           record_dead_and_set_regs (insn);
704
705 #ifdef AUTO_INC_DEC
706           for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
707             if (REG_NOTE_KIND (links) == REG_INC)
708               set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
709                                                 NULL);
710 #endif
711
712           /* Record the current insn_rtx_cost of this instruction.  */
713           if (NONJUMP_INSN_P (insn))
714             uid_insn_cost[INSN_UID (insn)] = insn_rtx_cost (PATTERN (insn));
715           if (dump_file)
716             fprintf(dump_file, "insn_cost %d: %d\n",
717                     INSN_UID (insn), uid_insn_cost[INSN_UID (insn)]);
718         }
719
720       if (LABEL_P (insn))
721         label_tick++;
722     }
723
724   nonzero_sign_valid = 1;
725
726   /* Now scan all the insns in forward order.  */
727
728   label_tick = 1;
729   last_call_cuid = 0;
730   mem_last_set = 0;
731   init_reg_last ();
732   setup_incoming_promotions ();
733
734   FOR_EACH_BB (this_basic_block)
735     {
736       for (insn = BB_HEAD (this_basic_block);
737            insn != NEXT_INSN (BB_END (this_basic_block));
738            insn = next ? next : NEXT_INSN (insn))
739         {
740           next = 0;
741
742           if (LABEL_P (insn))
743             label_tick++;
744
745           else if (INSN_P (insn))
746             {
747               /* See if we know about function return values before this
748                  insn based upon SUBREG flags.  */
749               check_promoted_subreg (insn, PATTERN (insn));
750
751               /* Try this insn with each insn it links back to.  */
752
753               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
754                 if ((next = try_combine (insn, XEXP (links, 0),
755                                          NULL_RTX, &new_direct_jump_p)) != 0)
756                   goto retry;
757
758               /* Try each sequence of three linked insns ending with this one.  */
759
760               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
761                 {
762                   rtx link = XEXP (links, 0);
763
764                   /* If the linked insn has been replaced by a note, then there
765                      is no point in pursuing this chain any further.  */
766                   if (NOTE_P (link))
767                     continue;
768
769                   for (nextlinks = LOG_LINKS (link);
770                        nextlinks;
771                        nextlinks = XEXP (nextlinks, 1))
772                     if ((next = try_combine (insn, link,
773                                              XEXP (nextlinks, 0),
774                                              &new_direct_jump_p)) != 0)
775                       goto retry;
776                 }
777
778 #ifdef HAVE_cc0
779               /* Try to combine a jump insn that uses CC0
780                  with a preceding insn that sets CC0, and maybe with its
781                  logical predecessor as well.
782                  This is how we make decrement-and-branch insns.
783                  We need this special code because data flow connections
784                  via CC0 do not get entered in LOG_LINKS.  */
785
786               if (JUMP_P (insn)
787                   && (prev = prev_nonnote_insn (insn)) != 0
788                   && NONJUMP_INSN_P (prev)
789                   && sets_cc0_p (PATTERN (prev)))
790                 {
791                   if ((next = try_combine (insn, prev,
792                                            NULL_RTX, &new_direct_jump_p)) != 0)
793                     goto retry;
794
795                   for (nextlinks = LOG_LINKS (prev); nextlinks;
796                        nextlinks = XEXP (nextlinks, 1))
797                     if ((next = try_combine (insn, prev,
798                                              XEXP (nextlinks, 0),
799                                              &new_direct_jump_p)) != 0)
800                       goto retry;
801                 }
802
803               /* Do the same for an insn that explicitly references CC0.  */
804               if (NONJUMP_INSN_P (insn)
805                   && (prev = prev_nonnote_insn (insn)) != 0
806                   && NONJUMP_INSN_P (prev)
807                   && sets_cc0_p (PATTERN (prev))
808                   && GET_CODE (PATTERN (insn)) == SET
809                   && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
810                 {
811                   if ((next = try_combine (insn, prev,
812                                            NULL_RTX, &new_direct_jump_p)) != 0)
813                     goto retry;
814
815                   for (nextlinks = LOG_LINKS (prev); nextlinks;
816                        nextlinks = XEXP (nextlinks, 1))
817                     if ((next = try_combine (insn, prev,
818                                              XEXP (nextlinks, 0),
819                                              &new_direct_jump_p)) != 0)
820                       goto retry;
821                 }
822
823               /* Finally, see if any of the insns that this insn links to
824                  explicitly references CC0.  If so, try this insn, that insn,
825                  and its predecessor if it sets CC0.  */
826               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
827                 if (NONJUMP_INSN_P (XEXP (links, 0))
828                     && GET_CODE (PATTERN (XEXP (links, 0))) == SET
829                     && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
830                     && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
831                     && NONJUMP_INSN_P (prev)
832                     && sets_cc0_p (PATTERN (prev))
833                     && (next = try_combine (insn, XEXP (links, 0),
834                                             prev, &new_direct_jump_p)) != 0)
835                   goto retry;
836 #endif
837
838               /* Try combining an insn with two different insns whose results it
839                  uses.  */
840               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
841                 for (nextlinks = XEXP (links, 1); nextlinks;
842                      nextlinks = XEXP (nextlinks, 1))
843                   if ((next = try_combine (insn, XEXP (links, 0),
844                                            XEXP (nextlinks, 0),
845                                            &new_direct_jump_p)) != 0)
846                     goto retry;
847
848               /* Try this insn with each REG_EQUAL note it links back to.  */
849               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
850                 {
851                   rtx set, note;
852                   rtx temp = XEXP (links, 0);
853                   if ((set = single_set (temp)) != 0
854                       && (note = find_reg_equal_equiv_note (temp)) != 0
855                       && GET_CODE (XEXP (note, 0)) != EXPR_LIST
856                       /* Avoid using a register that may already been marked
857                          dead by an earlier instruction.  */
858                       && ! unmentioned_reg_p (XEXP (note, 0), SET_SRC (set)))
859                     {
860                       /* Temporarily replace the set's source with the
861                          contents of the REG_EQUAL note.  The insn will
862                          be deleted or recognized by try_combine.  */
863                       rtx orig = SET_SRC (set);
864                       SET_SRC (set) = XEXP (note, 0);
865                       next = try_combine (insn, temp, NULL_RTX,
866                                           &new_direct_jump_p);
867                       if (next)
868                         goto retry;
869                       SET_SRC (set) = orig;
870                     }
871                 }
872
873               if (!NOTE_P (insn))
874                 record_dead_and_set_regs (insn);
875
876             retry:
877               ;
878             }
879         }
880     }
881   clear_bb_flags ();
882
883   EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, i,
884                              BASIC_BLOCK (i)->flags |= BB_DIRTY);
885   new_direct_jump_p |= purge_all_dead_edges (0);
886   delete_noop_moves ();
887
888   update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
889                                     PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
890                                     | PROP_KILL_DEAD_CODE);
891
892   /* Clean up.  */
893   sbitmap_free (refresh_blocks);
894   free (uid_insn_cost);
895   free (reg_stat);
896   free (uid_cuid);
897
898   {
899     struct undo *undo, *next;
900     for (undo = undobuf.frees; undo; undo = next)
901       {
902         next = undo->next;
903         free (undo);
904       }
905     undobuf.frees = 0;
906   }
907
908   total_attempts += combine_attempts;
909   total_merges += combine_merges;
910   total_extras += combine_extras;
911   total_successes += combine_successes;
912
913   nonzero_sign_valid = 0;
914   rtl_hooks = general_rtl_hooks;
915
916   /* Make recognizer allow volatile MEMs again.  */
917   init_recog ();
918
919   return new_direct_jump_p;
920 }
921
922 /* Wipe the last_xxx fields of reg_stat in preparation for another pass.  */
923
924 static void
925 init_reg_last (void)
926 {
927   unsigned int i;
928   for (i = 0; i < combine_max_regno; i++)
929     memset (reg_stat + i, 0, offsetof (struct reg_stat, sign_bit_copies));
930 }
931 \f
932 /* Set up any promoted values for incoming argument registers.  */
933
934 static void
935 setup_incoming_promotions (void)
936 {
937   unsigned int regno;
938   rtx reg;
939   enum machine_mode mode;
940   int unsignedp;
941   rtx first = get_insns ();
942
943   if (targetm.calls.promote_function_args (TREE_TYPE (cfun->decl)))
944     {
945       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
946         /* Check whether this register can hold an incoming pointer
947            argument.  FUNCTION_ARG_REGNO_P tests outgoing register
948            numbers, so translate if necessary due to register windows.  */
949         if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (regno))
950             && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0)
951           {
952             record_value_for_reg
953               (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND
954                                            : SIGN_EXTEND),
955                                           GET_MODE (reg),
956                                           gen_rtx_CLOBBER (mode, const0_rtx)));
957           }
958     }
959 }
960 \f
961 /* Called via note_stores.  If X is a pseudo that is narrower than
962    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
963
964    If we are setting only a portion of X and we can't figure out what
965    portion, assume all bits will be used since we don't know what will
966    be happening.
967
968    Similarly, set how many bits of X are known to be copies of the sign bit
969    at all locations in the function.  This is the smallest number implied
970    by any set of X.  */
971
972 static void
973 set_nonzero_bits_and_sign_copies (rtx x, rtx set,
974                                   void *data ATTRIBUTE_UNUSED)
975 {
976   unsigned int num;
977
978   if (REG_P (x)
979       && REGNO (x) >= FIRST_PSEUDO_REGISTER
980       /* If this register is undefined at the start of the file, we can't
981          say what its contents were.  */
982       && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, REGNO (x))
983       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
984     {
985       if (set == 0 || GET_CODE (set) == CLOBBER)
986         {
987           reg_stat[REGNO (x)].nonzero_bits = GET_MODE_MASK (GET_MODE (x));
988           reg_stat[REGNO (x)].sign_bit_copies = 1;
989           return;
990         }
991
992       /* If this is a complex assignment, see if we can convert it into a
993          simple assignment.  */
994       set = expand_field_assignment (set);
995
996       /* If this is a simple assignment, or we have a paradoxical SUBREG,
997          set what we know about X.  */
998
999       if (SET_DEST (set) == x
1000           || (GET_CODE (SET_DEST (set)) == SUBREG
1001               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
1002                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
1003               && SUBREG_REG (SET_DEST (set)) == x))
1004         {
1005           rtx src = SET_SRC (set);
1006
1007 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
1008           /* If X is narrower than a word and SRC is a non-negative
1009              constant that would appear negative in the mode of X,
1010              sign-extend it for use in reg_stat[].nonzero_bits because some
1011              machines (maybe most) will actually do the sign-extension
1012              and this is the conservative approach.
1013
1014              ??? For 2.5, try to tighten up the MD files in this regard
1015              instead of this kludge.  */
1016
1017           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
1018               && GET_CODE (src) == CONST_INT
1019               && INTVAL (src) > 0
1020               && 0 != (INTVAL (src)
1021                        & ((HOST_WIDE_INT) 1
1022                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
1023             src = GEN_INT (INTVAL (src)
1024                            | ((HOST_WIDE_INT) (-1)
1025                               << GET_MODE_BITSIZE (GET_MODE (x))));
1026 #endif
1027
1028           /* Don't call nonzero_bits if it cannot change anything.  */
1029           if (reg_stat[REGNO (x)].nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
1030             reg_stat[REGNO (x)].nonzero_bits
1031               |= nonzero_bits (src, nonzero_bits_mode);
1032           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1033           if (reg_stat[REGNO (x)].sign_bit_copies == 0
1034               || reg_stat[REGNO (x)].sign_bit_copies > num)
1035             reg_stat[REGNO (x)].sign_bit_copies = num;
1036         }
1037       else
1038         {
1039           reg_stat[REGNO (x)].nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1040           reg_stat[REGNO (x)].sign_bit_copies = 1;
1041         }
1042     }
1043 }
1044 \f
1045 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
1046    insns that were previously combined into I3 or that will be combined
1047    into the merger of INSN and I3.
1048
1049    Return 0 if the combination is not allowed for any reason.
1050
1051    If the combination is allowed, *PDEST will be set to the single
1052    destination of INSN and *PSRC to the single source, and this function
1053    will return 1.  */
1054
1055 static int
1056 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
1057                rtx *pdest, rtx *psrc)
1058 {
1059   int i;
1060   rtx set = 0, src, dest;
1061   rtx p;
1062 #ifdef AUTO_INC_DEC
1063   rtx link;
1064 #endif
1065   int all_adjacent = (succ ? (next_active_insn (insn) == succ
1066                               && next_active_insn (succ) == i3)
1067                       : next_active_insn (insn) == i3);
1068
1069   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1070      or a PARALLEL consisting of such a SET and CLOBBERs.
1071
1072      If INSN has CLOBBER parallel parts, ignore them for our processing.
1073      By definition, these happen during the execution of the insn.  When it
1074      is merged with another insn, all bets are off.  If they are, in fact,
1075      needed and aren't also supplied in I3, they may be added by
1076      recog_for_combine.  Otherwise, it won't match.
1077
1078      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1079      note.
1080
1081      Get the source and destination of INSN.  If more than one, can't
1082      combine.  */
1083
1084   if (GET_CODE (PATTERN (insn)) == SET)
1085     set = PATTERN (insn);
1086   else if (GET_CODE (PATTERN (insn)) == PARALLEL
1087            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1088     {
1089       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1090         {
1091           rtx elt = XVECEXP (PATTERN (insn), 0, i);
1092           rtx note;
1093
1094           switch (GET_CODE (elt))
1095             {
1096             /* This is important to combine floating point insns
1097                for the SH4 port.  */
1098             case USE:
1099               /* Combining an isolated USE doesn't make sense.
1100                  We depend here on combinable_i3pat to reject them.  */
1101               /* The code below this loop only verifies that the inputs of
1102                  the SET in INSN do not change.  We call reg_set_between_p
1103                  to verify that the REG in the USE does not change between
1104                  I3 and INSN.
1105                  If the USE in INSN was for a pseudo register, the matching
1106                  insn pattern will likely match any register; combining this
1107                  with any other USE would only be safe if we knew that the
1108                  used registers have identical values, or if there was
1109                  something to tell them apart, e.g. different modes.  For
1110                  now, we forgo such complicated tests and simply disallow
1111                  combining of USES of pseudo registers with any other USE.  */
1112               if (REG_P (XEXP (elt, 0))
1113                   && GET_CODE (PATTERN (i3)) == PARALLEL)
1114                 {
1115                   rtx i3pat = PATTERN (i3);
1116                   int i = XVECLEN (i3pat, 0) - 1;
1117                   unsigned int regno = REGNO (XEXP (elt, 0));
1118
1119                   do
1120                     {
1121                       rtx i3elt = XVECEXP (i3pat, 0, i);
1122
1123                       if (GET_CODE (i3elt) == USE
1124                           && REG_P (XEXP (i3elt, 0))
1125                           && (REGNO (XEXP (i3elt, 0)) == regno
1126                               ? reg_set_between_p (XEXP (elt, 0),
1127                                                    PREV_INSN (insn), i3)
1128                               : regno >= FIRST_PSEUDO_REGISTER))
1129                         return 0;
1130                     }
1131                   while (--i >= 0);
1132                 }
1133               break;
1134
1135               /* We can ignore CLOBBERs.  */
1136             case CLOBBER:
1137               break;
1138
1139             case SET:
1140               /* Ignore SETs whose result isn't used but not those that
1141                  have side-effects.  */
1142               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1143                   && (!(note = find_reg_note (insn, REG_EH_REGION, NULL_RTX))
1144                       || INTVAL (XEXP (note, 0)) <= 0)
1145                   && ! side_effects_p (elt))
1146                 break;
1147
1148               /* If we have already found a SET, this is a second one and
1149                  so we cannot combine with this insn.  */
1150               if (set)
1151                 return 0;
1152
1153               set = elt;
1154               break;
1155
1156             default:
1157               /* Anything else means we can't combine.  */
1158               return 0;
1159             }
1160         }
1161
1162       if (set == 0
1163           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1164              so don't do anything with it.  */
1165           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1166         return 0;
1167     }
1168   else
1169     return 0;
1170
1171   if (set == 0)
1172     return 0;
1173
1174   set = expand_field_assignment (set);
1175   src = SET_SRC (set), dest = SET_DEST (set);
1176
1177   /* Don't eliminate a store in the stack pointer.  */
1178   if (dest == stack_pointer_rtx
1179       /* Don't combine with an insn that sets a register to itself if it has
1180          a REG_EQUAL note.  This may be part of a REG_NO_CONFLICT sequence.  */
1181       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1182       /* Can't merge an ASM_OPERANDS.  */
1183       || GET_CODE (src) == ASM_OPERANDS
1184       /* Can't merge a function call.  */
1185       || GET_CODE (src) == CALL
1186       /* Don't eliminate a function call argument.  */
1187       || (CALL_P (i3)
1188           && (find_reg_fusage (i3, USE, dest)
1189               || (REG_P (dest)
1190                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
1191                   && global_regs[REGNO (dest)])))
1192       /* Don't substitute into an incremented register.  */
1193       || FIND_REG_INC_NOTE (i3, dest)
1194       || (succ && FIND_REG_INC_NOTE (succ, dest))
1195       /* Don't substitute into a non-local goto, this confuses CFG.  */
1196       || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1197 #if 0
1198       /* Don't combine the end of a libcall into anything.  */
1199       /* ??? This gives worse code, and appears to be unnecessary, since no
1200          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  Local-alloc does
1201          use REG_RETVAL notes for noconflict blocks, but other code here
1202          makes sure that those insns don't disappear.  */
1203       || find_reg_note (insn, REG_RETVAL, NULL_RTX)
1204 #endif
1205       /* Make sure that DEST is not used after SUCC but before I3.  */
1206       || (succ && ! all_adjacent
1207           && reg_used_between_p (dest, succ, i3))
1208       /* Make sure that the value that is to be substituted for the register
1209          does not use any registers whose values alter in between.  However,
1210          If the insns are adjacent, a use can't cross a set even though we
1211          think it might (this can happen for a sequence of insns each setting
1212          the same destination; last_set of that register might point to
1213          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1214          equivalent to the memory so the substitution is valid even if there
1215          are intervening stores.  Also, don't move a volatile asm or
1216          UNSPEC_VOLATILE across any other insns.  */
1217       || (! all_adjacent
1218           && (((!MEM_P (src)
1219                 || ! find_reg_note (insn, REG_EQUIV, src))
1220                && use_crosses_set_p (src, INSN_CUID (insn)))
1221               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1222               || GET_CODE (src) == UNSPEC_VOLATILE))
1223       /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
1224          better register allocation by not doing the combine.  */
1225       || find_reg_note (i3, REG_NO_CONFLICT, dest)
1226       || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
1227       /* Don't combine across a CALL_INSN, because that would possibly
1228          change whether the life span of some REGs crosses calls or not,
1229          and it is a pain to update that information.
1230          Exception: if source is a constant, moving it later can't hurt.
1231          Accept that special case, because it helps -fforce-addr a lot.  */
1232       || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
1233     return 0;
1234
1235   /* DEST must either be a REG or CC0.  */
1236   if (REG_P (dest))
1237     {
1238       /* If register alignment is being enforced for multi-word items in all
1239          cases except for parameters, it is possible to have a register copy
1240          insn referencing a hard register that is not allowed to contain the
1241          mode being copied and which would not be valid as an operand of most
1242          insns.  Eliminate this problem by not combining with such an insn.
1243
1244          Also, on some machines we don't want to extend the life of a hard
1245          register.  */
1246
1247       if (REG_P (src)
1248           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1249                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1250               /* Don't extend the life of a hard register unless it is
1251                  user variable (if we have few registers) or it can't
1252                  fit into the desired register (meaning something special
1253                  is going on).
1254                  Also avoid substituting a return register into I3, because
1255                  reload can't handle a conflict with constraints of other
1256                  inputs.  */
1257               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1258                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1259         return 0;
1260     }
1261   else if (GET_CODE (dest) != CC0)
1262     return 0;
1263
1264
1265   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1266     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1267       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
1268         {
1269           /* Don't substitute for a register intended as a clobberable
1270              operand.  */
1271           rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
1272           if (rtx_equal_p (reg, dest))
1273             return 0;
1274
1275           /* If the clobber represents an earlyclobber operand, we must not
1276              substitute an expression containing the clobbered register.
1277              As we do not analyse the constraint strings here, we have to
1278              make the conservative assumption.  However, if the register is
1279              a fixed hard reg, the clobber cannot represent any operand;
1280              we leave it up to the machine description to either accept or
1281              reject use-and-clobber patterns.  */
1282           if (!REG_P (reg)
1283               || REGNO (reg) >= FIRST_PSEUDO_REGISTER
1284               || !fixed_regs[REGNO (reg)])
1285             if (reg_overlap_mentioned_p (reg, src))
1286               return 0;
1287         }
1288
1289   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1290      or not), reject, unless nothing volatile comes between it and I3 */
1291
1292   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1293     {
1294       /* Make sure succ doesn't contain a volatile reference.  */
1295       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1296         return 0;
1297
1298       for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1299         if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
1300           return 0;
1301     }
1302
1303   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1304      to be an explicit register variable, and was chosen for a reason.  */
1305
1306   if (GET_CODE (src) == ASM_OPERANDS
1307       && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1308     return 0;
1309
1310   /* If there are any volatile insns between INSN and I3, reject, because
1311      they might affect machine state.  */
1312
1313   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1314     if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
1315       return 0;
1316
1317   /* If INSN or I2 contains an autoincrement or autodecrement,
1318      make sure that register is not used between there and I3,
1319      and not already used in I3 either.
1320      Also insist that I3 not be a jump; if it were one
1321      and the incremented register were spilled, we would lose.  */
1322
1323 #ifdef AUTO_INC_DEC
1324   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1325     if (REG_NOTE_KIND (link) == REG_INC
1326         && (JUMP_P (i3)
1327             || reg_used_between_p (XEXP (link, 0), insn, i3)
1328             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1329       return 0;
1330 #endif
1331
1332 #ifdef HAVE_cc0
1333   /* Don't combine an insn that follows a CC0-setting insn.
1334      An insn that uses CC0 must not be separated from the one that sets it.
1335      We do, however, allow I2 to follow a CC0-setting insn if that insn
1336      is passed as I1; in that case it will be deleted also.
1337      We also allow combining in this case if all the insns are adjacent
1338      because that would leave the two CC0 insns adjacent as well.
1339      It would be more logical to test whether CC0 occurs inside I1 or I2,
1340      but that would be much slower, and this ought to be equivalent.  */
1341
1342   p = prev_nonnote_insn (insn);
1343   if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
1344       && ! all_adjacent)
1345     return 0;
1346 #endif
1347
1348   /* If we get here, we have passed all the tests and the combination is
1349      to be allowed.  */
1350
1351   *pdest = dest;
1352   *psrc = src;
1353
1354   return 1;
1355 }
1356 \f
1357 /* LOC is the location within I3 that contains its pattern or the component
1358    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1359
1360    One problem is if I3 modifies its output, as opposed to replacing it
1361    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1362    so would produce an insn that is not equivalent to the original insns.
1363
1364    Consider:
1365
1366          (set (reg:DI 101) (reg:DI 100))
1367          (set (subreg:SI (reg:DI 101) 0) <foo>)
1368
1369    This is NOT equivalent to:
1370
1371          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1372                     (set (reg:DI 101) (reg:DI 100))])
1373
1374    Not only does this modify 100 (in which case it might still be valid
1375    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1376
1377    We can also run into a problem if I2 sets a register that I1
1378    uses and I1 gets directly substituted into I3 (not via I2).  In that
1379    case, we would be getting the wrong value of I2DEST into I3, so we
1380    must reject the combination.  This case occurs when I2 and I1 both
1381    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1382    If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
1383    of a SET must prevent combination from occurring.
1384
1385    Before doing the above check, we first try to expand a field assignment
1386    into a set of logical operations.
1387
1388    If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
1389    we place a register that is both set and used within I3.  If more than one
1390    such register is detected, we fail.
1391
1392    Return 1 if the combination is valid, zero otherwise.  */
1393
1394 static int
1395 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
1396                   int i1_not_in_src, rtx *pi3dest_killed)
1397 {
1398   rtx x = *loc;
1399
1400   if (GET_CODE (x) == SET)
1401     {
1402       rtx set = x ;
1403       rtx dest = SET_DEST (set);
1404       rtx src = SET_SRC (set);
1405       rtx inner_dest = dest;
1406
1407       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1408              || GET_CODE (inner_dest) == SUBREG
1409              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1410         inner_dest = XEXP (inner_dest, 0);
1411
1412       /* Check for the case where I3 modifies its output, as discussed
1413          above.  We don't want to prevent pseudos from being combined
1414          into the address of a MEM, so only prevent the combination if
1415          i1 or i2 set the same MEM.  */
1416       if ((inner_dest != dest &&
1417            (!MEM_P (inner_dest)
1418             || rtx_equal_p (i2dest, inner_dest)
1419             || (i1dest && rtx_equal_p (i1dest, inner_dest)))
1420            && (reg_overlap_mentioned_p (i2dest, inner_dest)
1421                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1422
1423           /* This is the same test done in can_combine_p except we can't test
1424              all_adjacent; we don't have to, since this instruction will stay
1425              in place, thus we are not considering increasing the lifetime of
1426              INNER_DEST.
1427
1428              Also, if this insn sets a function argument, combining it with
1429              something that might need a spill could clobber a previous
1430              function argument; the all_adjacent test in can_combine_p also
1431              checks this; here, we do a more specific test for this case.  */
1432
1433           || (REG_P (inner_dest)
1434               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1435               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1436                                         GET_MODE (inner_dest))))
1437           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1438         return 0;
1439
1440       /* If DEST is used in I3, it is being killed in this insn,
1441          so record that for later.
1442          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1443          STACK_POINTER_REGNUM, since these are always considered to be
1444          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1445       if (pi3dest_killed && REG_P (dest)
1446           && reg_referenced_p (dest, PATTERN (i3))
1447           && REGNO (dest) != FRAME_POINTER_REGNUM
1448 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1449           && REGNO (dest) != HARD_FRAME_POINTER_REGNUM
1450 #endif
1451 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1452           && (REGNO (dest) != ARG_POINTER_REGNUM
1453               || ! fixed_regs [REGNO (dest)])
1454 #endif
1455           && REGNO (dest) != STACK_POINTER_REGNUM)
1456         {
1457           if (*pi3dest_killed)
1458             return 0;
1459
1460           *pi3dest_killed = dest;
1461         }
1462     }
1463
1464   else if (GET_CODE (x) == PARALLEL)
1465     {
1466       int i;
1467
1468       for (i = 0; i < XVECLEN (x, 0); i++)
1469         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1470                                 i1_not_in_src, pi3dest_killed))
1471           return 0;
1472     }
1473
1474   return 1;
1475 }
1476 \f
1477 /* Return 1 if X is an arithmetic expression that contains a multiplication
1478    and division.  We don't count multiplications by powers of two here.  */
1479
1480 static int
1481 contains_muldiv (rtx x)
1482 {
1483   switch (GET_CODE (x))
1484     {
1485     case MOD:  case DIV:  case UMOD:  case UDIV:
1486       return 1;
1487
1488     case MULT:
1489       return ! (GET_CODE (XEXP (x, 1)) == CONST_INT
1490                 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1491     default:
1492       if (BINARY_P (x))
1493         return contains_muldiv (XEXP (x, 0))
1494             || contains_muldiv (XEXP (x, 1));
1495
1496       if (UNARY_P (x))
1497         return contains_muldiv (XEXP (x, 0));
1498
1499       return 0;
1500     }
1501 }
1502 \f
1503 /* Determine whether INSN can be used in a combination.  Return nonzero if
1504    not.  This is used in try_combine to detect early some cases where we
1505    can't perform combinations.  */
1506
1507 static int
1508 cant_combine_insn_p (rtx insn)
1509 {
1510   rtx set;
1511   rtx src, dest;
1512
1513   /* If this isn't really an insn, we can't do anything.
1514      This can occur when flow deletes an insn that it has merged into an
1515      auto-increment address.  */
1516   if (! INSN_P (insn))
1517     return 1;
1518
1519   /* Never combine loads and stores involving hard regs that are likely
1520      to be spilled.  The register allocator can usually handle such
1521      reg-reg moves by tying.  If we allow the combiner to make
1522      substitutions of likely-spilled regs, we may abort in reload.
1523      As an exception, we allow combinations involving fixed regs; these are
1524      not available to the register allocator so there's no risk involved.  */
1525
1526   set = single_set (insn);
1527   if (! set)
1528     return 0;
1529   src = SET_SRC (set);
1530   dest = SET_DEST (set);
1531   if (GET_CODE (src) == SUBREG)
1532     src = SUBREG_REG (src);
1533   if (GET_CODE (dest) == SUBREG)
1534     dest = SUBREG_REG (dest);
1535   if (REG_P (src) && REG_P (dest)
1536       && ((REGNO (src) < FIRST_PSEUDO_REGISTER
1537            && ! fixed_regs[REGNO (src)]
1538            && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (src))))
1539           || (REGNO (dest) < FIRST_PSEUDO_REGISTER
1540               && ! fixed_regs[REGNO (dest)]
1541               && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (dest))))))
1542     return 1;
1543
1544   return 0;
1545 }
1546
1547 /* Adjust INSN after we made a change to its destination.
1548
1549    Changing the destination can invalidate notes that say something about
1550    the results of the insn and a LOG_LINK pointing to the insn.  */
1551
1552 static void
1553 adjust_for_new_dest (rtx insn)
1554 {
1555   rtx *loc;
1556
1557   /* For notes, be conservative and simply remove them.  */
1558   loc = &REG_NOTES (insn);
1559   while (*loc)
1560     {
1561       enum reg_note kind = REG_NOTE_KIND (*loc);
1562       if (kind == REG_EQUAL || kind == REG_EQUIV)
1563         *loc = XEXP (*loc, 1);
1564       else
1565         loc = &XEXP (*loc, 1);
1566     }
1567
1568   /* The new insn will have a destination that was previously the destination
1569      of an insn just above it.  Call distribute_links to make a LOG_LINK from
1570      the next use of that destination.  */
1571   distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
1572 }
1573
1574 /* Try to combine the insns I1 and I2 into I3.
1575    Here I1 and I2 appear earlier than I3.
1576    I1 can be zero; then we combine just I2 into I3.
1577
1578    If we are combining three insns and the resulting insn is not recognized,
1579    try splitting it into two insns.  If that happens, I2 and I3 are retained
1580    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
1581    are pseudo-deleted.
1582
1583    Return 0 if the combination does not work.  Then nothing is changed.
1584    If we did the combination, return the insn at which combine should
1585    resume scanning.
1586
1587    Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
1588    new direct jump instruction.  */
1589
1590 static rtx
1591 try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
1592 {
1593   /* New patterns for I3 and I2, respectively.  */
1594   rtx newpat, newi2pat = 0;
1595   int substed_i2 = 0, substed_i1 = 0;
1596   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
1597   int added_sets_1, added_sets_2;
1598   /* Total number of SETs to put into I3.  */
1599   int total_sets;
1600   /* Nonzero if I2's body now appears in I3.  */
1601   int i2_is_used;
1602   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
1603   int insn_code_number, i2_code_number = 0, other_code_number = 0;
1604   /* Contains I3 if the destination of I3 is used in its source, which means
1605      that the old life of I3 is being killed.  If that usage is placed into
1606      I2 and not in I3, a REG_DEAD note must be made.  */
1607   rtx i3dest_killed = 0;
1608   /* SET_DEST and SET_SRC of I2 and I1.  */
1609   rtx i2dest, i2src, i1dest = 0, i1src = 0;
1610   /* PATTERN (I2), or a copy of it in certain cases.  */
1611   rtx i2pat;
1612   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
1613   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
1614   int i1_feeds_i3 = 0;
1615   /* Notes that must be added to REG_NOTES in I3 and I2.  */
1616   rtx new_i3_notes, new_i2_notes;
1617   /* Notes that we substituted I3 into I2 instead of the normal case.  */
1618   int i3_subst_into_i2 = 0;
1619   /* Notes that I1, I2 or I3 is a MULT operation.  */
1620   int have_mult = 0;
1621   int swap_i2i3 = 0;
1622
1623   int maxreg;
1624   rtx temp;
1625   rtx link;
1626   int i;
1627
1628   /* Exit early if one of the insns involved can't be used for
1629      combinations.  */
1630   if (cant_combine_insn_p (i3)
1631       || cant_combine_insn_p (i2)
1632       || (i1 && cant_combine_insn_p (i1))
1633       /* We also can't do anything if I3 has a
1634          REG_LIBCALL note since we don't want to disrupt the contiguity of a
1635          libcall.  */
1636 #if 0
1637       /* ??? This gives worse code, and appears to be unnecessary, since no
1638          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  */
1639       || find_reg_note (i3, REG_LIBCALL, NULL_RTX)
1640 #endif
1641       )
1642     return 0;
1643
1644   combine_attempts++;
1645   undobuf.other_insn = 0;
1646
1647   /* Reset the hard register usage information.  */
1648   CLEAR_HARD_REG_SET (newpat_used_regs);
1649
1650   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
1651      code below, set I1 to be the earlier of the two insns.  */
1652   if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
1653     temp = i1, i1 = i2, i2 = temp;
1654
1655   added_links_insn = 0;
1656
1657   /* First check for one important special-case that the code below will
1658      not handle.  Namely, the case where I1 is zero, I2 is a PARALLEL
1659      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
1660      we may be able to replace that destination with the destination of I3.
1661      This occurs in the common code where we compute both a quotient and
1662      remainder into a structure, in which case we want to do the computation
1663      directly into the structure to avoid register-register copies.
1664
1665      Note that this case handles both multiple sets in I2 and also
1666      cases where I2 has a number of CLOBBER or PARALLELs.
1667
1668      We make very conservative checks below and only try to handle the
1669      most common cases of this.  For example, we only handle the case
1670      where I2 and I3 are adjacent to avoid making difficult register
1671      usage tests.  */
1672
1673   if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
1674       && REG_P (SET_SRC (PATTERN (i3)))
1675       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
1676       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
1677       && GET_CODE (PATTERN (i2)) == PARALLEL
1678       && ! side_effects_p (SET_DEST (PATTERN (i3)))
1679       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
1680          below would need to check what is inside (and reg_overlap_mentioned_p
1681          doesn't support those codes anyway).  Don't allow those destinations;
1682          the resulting insn isn't likely to be recognized anyway.  */
1683       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
1684       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
1685       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
1686                                     SET_DEST (PATTERN (i3)))
1687       && next_real_insn (i2) == i3)
1688     {
1689       rtx p2 = PATTERN (i2);
1690
1691       /* Make sure that the destination of I3,
1692          which we are going to substitute into one output of I2,
1693          is not used within another output of I2.  We must avoid making this:
1694          (parallel [(set (mem (reg 69)) ...)
1695                     (set (reg 69) ...)])
1696          which is not well-defined as to order of actions.
1697          (Besides, reload can't handle output reloads for this.)
1698
1699          The problem can also happen if the dest of I3 is a memory ref,
1700          if another dest in I2 is an indirect memory ref.  */
1701       for (i = 0; i < XVECLEN (p2, 0); i++)
1702         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1703              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1704             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
1705                                         SET_DEST (XVECEXP (p2, 0, i))))
1706           break;
1707
1708       if (i == XVECLEN (p2, 0))
1709         for (i = 0; i < XVECLEN (p2, 0); i++)
1710           if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1711                || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1712               && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
1713             {
1714               combine_merges++;
1715
1716               subst_insn = i3;
1717               subst_low_cuid = INSN_CUID (i2);
1718
1719               added_sets_2 = added_sets_1 = 0;
1720               i2dest = SET_SRC (PATTERN (i3));
1721
1722               /* Replace the dest in I2 with our dest and make the resulting
1723                  insn the new pattern for I3.  Then skip to where we
1724                  validate the pattern.  Everything was set up above.  */
1725               SUBST (SET_DEST (XVECEXP (p2, 0, i)),
1726                      SET_DEST (PATTERN (i3)));
1727
1728               newpat = p2;
1729               i3_subst_into_i2 = 1;
1730               goto validate_replacement;
1731             }
1732     }
1733
1734   /* If I2 is setting a double-word pseudo to a constant and I3 is setting
1735      one of those words to another constant, merge them by making a new
1736      constant.  */
1737   if (i1 == 0
1738       && (temp = single_set (i2)) != 0
1739       && (GET_CODE (SET_SRC (temp)) == CONST_INT
1740           || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
1741       && REG_P (SET_DEST (temp))
1742       && GET_MODE_CLASS (GET_MODE (SET_DEST (temp))) == MODE_INT
1743       && GET_MODE_SIZE (GET_MODE (SET_DEST (temp))) == 2 * UNITS_PER_WORD
1744       && GET_CODE (PATTERN (i3)) == SET
1745       && GET_CODE (SET_DEST (PATTERN (i3))) == SUBREG
1746       && SUBREG_REG (SET_DEST (PATTERN (i3))) == SET_DEST (temp)
1747       && GET_MODE_CLASS (GET_MODE (SET_DEST (PATTERN (i3)))) == MODE_INT
1748       && GET_MODE_SIZE (GET_MODE (SET_DEST (PATTERN (i3)))) == UNITS_PER_WORD
1749       && GET_CODE (SET_SRC (PATTERN (i3))) == CONST_INT)
1750     {
1751       HOST_WIDE_INT lo, hi;
1752
1753       if (GET_CODE (SET_SRC (temp)) == CONST_INT)
1754         lo = INTVAL (SET_SRC (temp)), hi = lo < 0 ? -1 : 0;
1755       else
1756         {
1757           lo = CONST_DOUBLE_LOW (SET_SRC (temp));
1758           hi = CONST_DOUBLE_HIGH (SET_SRC (temp));
1759         }
1760
1761       if (subreg_lowpart_p (SET_DEST (PATTERN (i3))))
1762         {
1763           /* We don't handle the case of the target word being wider
1764              than a host wide int.  */
1765           gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD);
1766
1767           lo &= ~(UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1);
1768           lo |= (INTVAL (SET_SRC (PATTERN (i3)))
1769                  & (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1770         }
1771       else if (HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1772         hi = INTVAL (SET_SRC (PATTERN (i3)));
1773       else if (HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD)
1774         {
1775           int sign = -(int) ((unsigned HOST_WIDE_INT) lo
1776                              >> (HOST_BITS_PER_WIDE_INT - 1));
1777
1778           lo &= ~ (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1779                    (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1780           lo |= (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1781                  (INTVAL (SET_SRC (PATTERN (i3)))));
1782           if (hi == sign)
1783             hi = lo < 0 ? -1 : 0;
1784         }
1785       else
1786         /* We don't handle the case of the higher word not fitting
1787            entirely in either hi or lo.  */
1788         gcc_unreachable ();
1789
1790       combine_merges++;
1791       subst_insn = i3;
1792       subst_low_cuid = INSN_CUID (i2);
1793       added_sets_2 = added_sets_1 = 0;
1794       i2dest = SET_DEST (temp);
1795
1796       SUBST (SET_SRC (temp),
1797              immed_double_const (lo, hi, GET_MODE (SET_DEST (temp))));
1798
1799       newpat = PATTERN (i2);
1800       goto validate_replacement;
1801     }
1802
1803 #ifndef HAVE_cc0
1804   /* If we have no I1 and I2 looks like:
1805         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
1806                    (set Y OP)])
1807      make up a dummy I1 that is
1808         (set Y OP)
1809      and change I2 to be
1810         (set (reg:CC X) (compare:CC Y (const_int 0)))
1811
1812      (We can ignore any trailing CLOBBERs.)
1813
1814      This undoes a previous combination and allows us to match a branch-and-
1815      decrement insn.  */
1816
1817   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
1818       && XVECLEN (PATTERN (i2), 0) >= 2
1819       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
1820       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
1821           == MODE_CC)
1822       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
1823       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
1824       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
1825       && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
1826       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
1827                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
1828     {
1829       for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
1830         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
1831           break;
1832
1833       if (i == 1)
1834         {
1835           /* We make I1 with the same INSN_UID as I2.  This gives it
1836              the same INSN_CUID for value tracking.  Our fake I1 will
1837              never appear in the insn stream so giving it the same INSN_UID
1838              as I2 will not cause a problem.  */
1839
1840           i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
1841                              BLOCK_FOR_INSN (i2), INSN_LOCATOR (i2),
1842                              XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
1843                              NULL_RTX);
1844
1845           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
1846           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
1847                  SET_DEST (PATTERN (i1)));
1848         }
1849     }
1850 #endif
1851
1852   /* Verify that I2 and I1 are valid for combining.  */
1853   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
1854       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
1855     {
1856       undo_all ();
1857       return 0;
1858     }
1859
1860   /* Record whether I2DEST is used in I2SRC and similarly for the other
1861      cases.  Knowing this will help in register status updating below.  */
1862   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
1863   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
1864   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
1865
1866   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
1867      in I2SRC.  */
1868   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
1869
1870   /* Ensure that I3's pattern can be the destination of combines.  */
1871   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
1872                           i1 && i2dest_in_i1src && i1_feeds_i3,
1873                           &i3dest_killed))
1874     {
1875       undo_all ();
1876       return 0;
1877     }
1878
1879   /* See if any of the insns is a MULT operation.  Unless one is, we will
1880      reject a combination that is, since it must be slower.  Be conservative
1881      here.  */
1882   if (GET_CODE (i2src) == MULT
1883       || (i1 != 0 && GET_CODE (i1src) == MULT)
1884       || (GET_CODE (PATTERN (i3)) == SET
1885           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
1886     have_mult = 1;
1887
1888   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
1889      We used to do this EXCEPT in one case: I3 has a post-inc in an
1890      output operand.  However, that exception can give rise to insns like
1891         mov r3,(r3)+
1892      which is a famous insn on the PDP-11 where the value of r3 used as the
1893      source was model-dependent.  Avoid this sort of thing.  */
1894
1895 #if 0
1896   if (!(GET_CODE (PATTERN (i3)) == SET
1897         && REG_P (SET_SRC (PATTERN (i3)))
1898         && MEM_P (SET_DEST (PATTERN (i3)))
1899         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
1900             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
1901     /* It's not the exception.  */
1902 #endif
1903 #ifdef AUTO_INC_DEC
1904     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
1905       if (REG_NOTE_KIND (link) == REG_INC
1906           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
1907               || (i1 != 0
1908                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
1909         {
1910           undo_all ();
1911           return 0;
1912         }
1913 #endif
1914
1915   /* See if the SETs in I1 or I2 need to be kept around in the merged
1916      instruction: whenever the value set there is still needed past I3.
1917      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
1918
1919      For the SET in I1, we have two cases:  If I1 and I2 independently
1920      feed into I3, the set in I1 needs to be kept around if I1DEST dies
1921      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
1922      in I1 needs to be kept around unless I1DEST dies or is set in either
1923      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
1924      I1DEST.  If so, we know I1 feeds into I2.  */
1925
1926   added_sets_2 = ! dead_or_set_p (i3, i2dest);
1927
1928   added_sets_1
1929     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
1930                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
1931
1932   /* If the set in I2 needs to be kept around, we must make a copy of
1933      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
1934      PATTERN (I2), we are only substituting for the original I1DEST, not into
1935      an already-substituted copy.  This also prevents making self-referential
1936      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
1937      I2DEST.  */
1938
1939   i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
1940            ? gen_rtx_SET (VOIDmode, i2dest, i2src)
1941            : PATTERN (i2));
1942
1943   if (added_sets_2)
1944     i2pat = copy_rtx (i2pat);
1945
1946   combine_merges++;
1947
1948   /* Substitute in the latest insn for the regs set by the earlier ones.  */
1949
1950   maxreg = max_reg_num ();
1951
1952   subst_insn = i3;
1953
1954   /* It is possible that the source of I2 or I1 may be performing an
1955      unneeded operation, such as a ZERO_EXTEND of something that is known
1956      to have the high part zero.  Handle that case by letting subst look at
1957      the innermost one of them.
1958
1959      Another way to do this would be to have a function that tries to
1960      simplify a single insn instead of merging two or more insns.  We don't
1961      do this because of the potential of infinite loops and because
1962      of the potential extra memory required.  However, doing it the way
1963      we are is a bit of a kludge and doesn't catch all cases.
1964
1965      But only do this if -fexpensive-optimizations since it slows things down
1966      and doesn't usually win.  */
1967
1968   if (flag_expensive_optimizations)
1969     {
1970       /* Pass pc_rtx so no substitutions are done, just simplifications.  */
1971       if (i1)
1972         {
1973           subst_low_cuid = INSN_CUID (i1);
1974           i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
1975         }
1976       else
1977         {
1978           subst_low_cuid = INSN_CUID (i2);
1979           i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
1980         }
1981     }
1982
1983 #ifndef HAVE_cc0
1984   /* Many machines that don't use CC0 have insns that can both perform an
1985      arithmetic operation and set the condition code.  These operations will
1986      be represented as a PARALLEL with the first element of the vector
1987      being a COMPARE of an arithmetic operation with the constant zero.
1988      The second element of the vector will set some pseudo to the result
1989      of the same arithmetic operation.  If we simplify the COMPARE, we won't
1990      match such a pattern and so will generate an extra insn.   Here we test
1991      for this case, where both the comparison and the operation result are
1992      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
1993      I2SRC.  Later we will make the PARALLEL that contains I2.  */
1994
1995   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
1996       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
1997       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
1998       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
1999     {
2000 #ifdef SELECT_CC_MODE
2001       rtx *cc_use;
2002       enum machine_mode compare_mode;
2003 #endif
2004
2005       newpat = PATTERN (i3);
2006       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
2007
2008       i2_is_used = 1;
2009
2010 #ifdef SELECT_CC_MODE
2011       /* See if a COMPARE with the operand we substituted in should be done
2012          with the mode that is currently being used.  If not, do the same
2013          processing we do in `subst' for a SET; namely, if the destination
2014          is used only once, try to replace it with a register of the proper
2015          mode and also replace the COMPARE.  */
2016       if (undobuf.other_insn == 0
2017           && (cc_use = find_single_use (SET_DEST (newpat), i3,
2018                                         &undobuf.other_insn))
2019           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
2020                                               i2src, const0_rtx))
2021               != GET_MODE (SET_DEST (newpat))))
2022         {
2023           unsigned int regno = REGNO (SET_DEST (newpat));
2024           rtx new_dest = gen_rtx_REG (compare_mode, regno);
2025
2026           if (regno < FIRST_PSEUDO_REGISTER
2027               || (REG_N_SETS (regno) == 1 && ! added_sets_2
2028                   && ! REG_USERVAR_P (SET_DEST (newpat))))
2029             {
2030               if (regno >= FIRST_PSEUDO_REGISTER)
2031                 SUBST (regno_reg_rtx[regno], new_dest);
2032
2033               SUBST (SET_DEST (newpat), new_dest);
2034               SUBST (XEXP (*cc_use, 0), new_dest);
2035               SUBST (SET_SRC (newpat),
2036                      gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
2037             }
2038           else
2039             undobuf.other_insn = 0;
2040         }
2041 #endif
2042     }
2043   else
2044 #endif
2045     {
2046       n_occurrences = 0;                /* `subst' counts here */
2047
2048       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
2049          need to make a unique copy of I2SRC each time we substitute it
2050          to avoid self-referential rtl.  */
2051
2052       subst_low_cuid = INSN_CUID (i2);
2053       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
2054                       ! i1_feeds_i3 && i1dest_in_i1src);
2055       substed_i2 = 1;
2056
2057       /* Record whether i2's body now appears within i3's body.  */
2058       i2_is_used = n_occurrences;
2059     }
2060
2061   /* If we already got a failure, don't try to do more.  Otherwise,
2062      try to substitute in I1 if we have it.  */
2063
2064   if (i1 && GET_CODE (newpat) != CLOBBER)
2065     {
2066       /* Before we can do this substitution, we must redo the test done
2067          above (see detailed comments there) that ensures  that I1DEST
2068          isn't mentioned in any SETs in NEWPAT that are field assignments.  */
2069
2070       if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
2071                               0, (rtx*) 0))
2072         {
2073           undo_all ();
2074           return 0;
2075         }
2076
2077       n_occurrences = 0;
2078       subst_low_cuid = INSN_CUID (i1);
2079       newpat = subst (newpat, i1dest, i1src, 0, 0);
2080       substed_i1 = 1;
2081     }
2082
2083   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
2084      to count all the ways that I2SRC and I1SRC can be used.  */
2085   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
2086        && i2_is_used + added_sets_2 > 1)
2087       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2088           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
2089               > 1))
2090       /* Fail if we tried to make a new register (we used to abort, but there's
2091          really no reason to).  */
2092       || max_reg_num () != maxreg
2093       /* Fail if we couldn't do something and have a CLOBBER.  */
2094       || GET_CODE (newpat) == CLOBBER
2095       /* Fail if this new pattern is a MULT and we didn't have one before
2096          at the outer level.  */
2097       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
2098           && ! have_mult))
2099     {
2100       undo_all ();
2101       return 0;
2102     }
2103
2104   /* If the actions of the earlier insns must be kept
2105      in addition to substituting them into the latest one,
2106      we must make a new PARALLEL for the latest insn
2107      to hold additional the SETs.  */
2108
2109   if (added_sets_1 || added_sets_2)
2110     {
2111       combine_extras++;
2112
2113       if (GET_CODE (newpat) == PARALLEL)
2114         {
2115           rtvec old = XVEC (newpat, 0);
2116           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
2117           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2118           memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
2119                   sizeof (old->elem[0]) * old->num_elem);
2120         }
2121       else
2122         {
2123           rtx old = newpat;
2124           total_sets = 1 + added_sets_1 + added_sets_2;
2125           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2126           XVECEXP (newpat, 0, 0) = old;
2127         }
2128
2129       if (added_sets_1)
2130         XVECEXP (newpat, 0, --total_sets)
2131           = (GET_CODE (PATTERN (i1)) == PARALLEL
2132              ? gen_rtx_SET (VOIDmode, i1dest, i1src) : PATTERN (i1));
2133
2134       if (added_sets_2)
2135         {
2136           /* If there is no I1, use I2's body as is.  We used to also not do
2137              the subst call below if I2 was substituted into I3,
2138              but that could lose a simplification.  */
2139           if (i1 == 0)
2140             XVECEXP (newpat, 0, --total_sets) = i2pat;
2141           else
2142             /* See comment where i2pat is assigned.  */
2143             XVECEXP (newpat, 0, --total_sets)
2144               = subst (i2pat, i1dest, i1src, 0, 0);
2145         }
2146     }
2147
2148   /* We come here when we are replacing a destination in I2 with the
2149      destination of I3.  */
2150  validate_replacement:
2151
2152   /* Note which hard regs this insn has as inputs.  */
2153   mark_used_regs_combine (newpat);
2154
2155   /* Is the result of combination a valid instruction?  */
2156   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2157
2158   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
2159      the second SET's destination is a register that is unused and isn't
2160      marked as an instruction that might trap in an EH region.  In that case,
2161      we just need the first SET.   This can occur when simplifying a divmod
2162      insn.  We *must* test for this case here because the code below that
2163      splits two independent SETs doesn't handle this case correctly when it
2164      updates the register status.
2165
2166      It's pointless doing this if we originally had two sets, one from
2167      i3, and one from i2.  Combining then splitting the parallel results
2168      in the original i2 again plus an invalid insn (which we delete).
2169      The net effect is only to move instructions around, which makes
2170      debug info less accurate.
2171
2172      Also check the case where the first SET's destination is unused.
2173      That would not cause incorrect code, but does cause an unneeded
2174      insn to remain.  */
2175
2176   if (insn_code_number < 0
2177       && !(added_sets_2 && i1 == 0)
2178       && GET_CODE (newpat) == PARALLEL
2179       && XVECLEN (newpat, 0) == 2
2180       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2181       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2182       && asm_noperands (newpat) < 0)
2183     {
2184       rtx set0 = XVECEXP (newpat, 0, 0);
2185       rtx set1 = XVECEXP (newpat, 0, 1);
2186       rtx note;
2187
2188       if (((REG_P (SET_DEST (set1))
2189             && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
2190            || (GET_CODE (SET_DEST (set1)) == SUBREG
2191                && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
2192           && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2193               || INTVAL (XEXP (note, 0)) <= 0)
2194           && ! side_effects_p (SET_SRC (set1)))
2195         {
2196           newpat = set0;
2197           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2198         }
2199
2200       else if (((REG_P (SET_DEST (set0))
2201                  && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
2202                 || (GET_CODE (SET_DEST (set0)) == SUBREG
2203                     && find_reg_note (i3, REG_UNUSED,
2204                                       SUBREG_REG (SET_DEST (set0)))))
2205                && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2206                    || INTVAL (XEXP (note, 0)) <= 0)
2207                && ! side_effects_p (SET_SRC (set0)))
2208         {
2209           newpat = set1;
2210           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2211
2212           if (insn_code_number >= 0)
2213             {
2214               /* If we will be able to accept this, we have made a
2215                  change to the destination of I3.  This requires us to
2216                  do a few adjustments.  */
2217
2218               PATTERN (i3) = newpat;
2219               adjust_for_new_dest (i3);
2220             }
2221         }
2222     }
2223
2224   /* If we were combining three insns and the result is a simple SET
2225      with no ASM_OPERANDS that wasn't recognized, try to split it into two
2226      insns.  There are two ways to do this.  It can be split using a
2227      machine-specific method (like when you have an addition of a large
2228      constant) or by combine in the function find_split_point.  */
2229
2230   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
2231       && asm_noperands (newpat) < 0)
2232     {
2233       rtx m_split, *split;
2234       rtx ni2dest = i2dest;
2235
2236       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
2237          use I2DEST as a scratch register will help.  In the latter case,
2238          convert I2DEST to the mode of the source of NEWPAT if we can.  */
2239
2240       m_split = split_insns (newpat, i3);
2241
2242       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
2243          inputs of NEWPAT.  */
2244
2245       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
2246          possible to try that as a scratch reg.  This would require adding
2247          more code to make it work though.  */
2248
2249       if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat))
2250         {
2251           /* If I2DEST is a hard register or the only use of a pseudo,
2252              we can change its mode.  */
2253           if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest)
2254               && GET_MODE (SET_DEST (newpat)) != VOIDmode
2255               && REG_P (i2dest)
2256               && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
2257                   || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
2258                       && ! REG_USERVAR_P (i2dest))))
2259             ni2dest = gen_rtx_REG (GET_MODE (SET_DEST (newpat)),
2260                                    REGNO (i2dest));
2261
2262           m_split = split_insns (gen_rtx_PARALLEL
2263                                  (VOIDmode,
2264                                   gen_rtvec (2, newpat,
2265                                              gen_rtx_CLOBBER (VOIDmode,
2266                                                               ni2dest))),
2267                                  i3);
2268           /* If the split with the mode-changed register didn't work, try
2269              the original register.  */
2270           if (! m_split && ni2dest != i2dest)
2271             {
2272               ni2dest = i2dest;
2273               m_split = split_insns (gen_rtx_PARALLEL
2274                                      (VOIDmode,
2275                                       gen_rtvec (2, newpat,
2276                                                  gen_rtx_CLOBBER (VOIDmode,
2277                                                                   i2dest))),
2278                                      i3);
2279             }
2280         }
2281
2282       if (m_split && NEXT_INSN (m_split) == NULL_RTX)
2283         {
2284           m_split = PATTERN (m_split);
2285           insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
2286           if (insn_code_number >= 0)
2287             newpat = m_split;
2288         }
2289       else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
2290                && (next_real_insn (i2) == i3
2291                    || ! use_crosses_set_p (PATTERN (m_split), INSN_CUID (i2))))
2292         {
2293           rtx i2set, i3set;
2294           rtx newi3pat = PATTERN (NEXT_INSN (m_split));
2295           newi2pat = PATTERN (m_split);
2296
2297           i3set = single_set (NEXT_INSN (m_split));
2298           i2set = single_set (m_split);
2299
2300           /* In case we changed the mode of I2DEST, replace it in the
2301              pseudo-register table here.  We can't do it above in case this
2302              code doesn't get executed and we do a split the other way.  */
2303
2304           if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2305             SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
2306
2307           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2308
2309           /* If I2 or I3 has multiple SETs, we won't know how to track
2310              register status, so don't use these insns.  If I2's destination
2311              is used between I2 and I3, we also can't use these insns.  */
2312
2313           if (i2_code_number >= 0 && i2set && i3set
2314               && (next_real_insn (i2) == i3
2315                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
2316             insn_code_number = recog_for_combine (&newi3pat, i3,
2317                                                   &new_i3_notes);
2318           if (insn_code_number >= 0)
2319             newpat = newi3pat;
2320
2321           /* It is possible that both insns now set the destination of I3.
2322              If so, we must show an extra use of it.  */
2323
2324           if (insn_code_number >= 0)
2325             {
2326               rtx new_i3_dest = SET_DEST (i3set);
2327               rtx new_i2_dest = SET_DEST (i2set);
2328
2329               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
2330                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
2331                      || GET_CODE (new_i3_dest) == SUBREG)
2332                 new_i3_dest = XEXP (new_i3_dest, 0);
2333
2334               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
2335                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
2336                      || GET_CODE (new_i2_dest) == SUBREG)
2337                 new_i2_dest = XEXP (new_i2_dest, 0);
2338
2339               if (REG_P (new_i3_dest)
2340                   && REG_P (new_i2_dest)
2341                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
2342                 REG_N_SETS (REGNO (new_i2_dest))++;
2343             }
2344         }
2345
2346       /* If we can split it and use I2DEST, go ahead and see if that
2347          helps things be recognized.  Verify that none of the registers
2348          are set between I2 and I3.  */
2349       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
2350 #ifdef HAVE_cc0
2351           && REG_P (i2dest)
2352 #endif
2353           /* We need I2DEST in the proper mode.  If it is a hard register
2354              or the only use of a pseudo, we can change its mode.  */
2355           && (GET_MODE (*split) == GET_MODE (i2dest)
2356               || GET_MODE (*split) == VOIDmode
2357               || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
2358               || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
2359                   && ! REG_USERVAR_P (i2dest)))
2360           && (next_real_insn (i2) == i3
2361               || ! use_crosses_set_p (*split, INSN_CUID (i2)))
2362           /* We can't overwrite I2DEST if its value is still used by
2363              NEWPAT.  */
2364           && ! reg_referenced_p (i2dest, newpat))
2365         {
2366           rtx newdest = i2dest;
2367           enum rtx_code split_code = GET_CODE (*split);
2368           enum machine_mode split_mode = GET_MODE (*split);
2369
2370           /* Get NEWDEST as a register in the proper mode.  We have already
2371              validated that we can do this.  */
2372           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
2373             {
2374               newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
2375
2376               if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2377                 SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
2378             }
2379
2380           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
2381              an ASHIFT.  This can occur if it was inside a PLUS and hence
2382              appeared to be a memory address.  This is a kludge.  */
2383           if (split_code == MULT
2384               && GET_CODE (XEXP (*split, 1)) == CONST_INT
2385               && INTVAL (XEXP (*split, 1)) > 0
2386               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
2387             {
2388               SUBST (*split, gen_rtx_ASHIFT (split_mode,
2389                                              XEXP (*split, 0), GEN_INT (i)));
2390               /* Update split_code because we may not have a multiply
2391                  anymore.  */
2392               split_code = GET_CODE (*split);
2393             }
2394
2395 #ifdef INSN_SCHEDULING
2396           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
2397              be written as a ZERO_EXTEND.  */
2398           if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
2399             {
2400 #ifdef LOAD_EXTEND_OP
2401               /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
2402                  what it really is.  */
2403               if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
2404                   == SIGN_EXTEND)
2405                 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
2406                                                     SUBREG_REG (*split)));
2407               else
2408 #endif
2409                 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
2410                                                     SUBREG_REG (*split)));
2411             }
2412 #endif
2413
2414           newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
2415           SUBST (*split, newdest);
2416           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2417
2418           /* If the split point was a MULT and we didn't have one before,
2419              don't use one now.  */
2420           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
2421             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2422         }
2423     }
2424
2425   /* Check for a case where we loaded from memory in a narrow mode and
2426      then sign extended it, but we need both registers.  In that case,
2427      we have a PARALLEL with both loads from the same memory location.
2428      We can split this into a load from memory followed by a register-register
2429      copy.  This saves at least one insn, more if register allocation can
2430      eliminate the copy.
2431
2432      We cannot do this if the destination of the first assignment is a
2433      condition code register or cc0.  We eliminate this case by making sure
2434      the SET_DEST and SET_SRC have the same mode.
2435
2436      We cannot do this if the destination of the second assignment is
2437      a register that we have already assumed is zero-extended.  Similarly
2438      for a SUBREG of such a register.  */
2439
2440   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2441            && GET_CODE (newpat) == PARALLEL
2442            && XVECLEN (newpat, 0) == 2
2443            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2444            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
2445            && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
2446                == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
2447            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2448            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2449                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
2450            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2451                                    INSN_CUID (i2))
2452            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2453            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2454            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
2455                  (REG_P (temp)
2456                   && reg_stat[REGNO (temp)].nonzero_bits != 0
2457                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2458                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2459                   && (reg_stat[REGNO (temp)].nonzero_bits
2460                       != GET_MODE_MASK (word_mode))))
2461            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
2462                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
2463                      (REG_P (temp)
2464                       && reg_stat[REGNO (temp)].nonzero_bits != 0
2465                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2466                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2467                       && (reg_stat[REGNO (temp)].nonzero_bits
2468                           != GET_MODE_MASK (word_mode)))))
2469            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2470                                          SET_SRC (XVECEXP (newpat, 0, 1)))
2471            && ! find_reg_note (i3, REG_UNUSED,
2472                                SET_DEST (XVECEXP (newpat, 0, 0))))
2473     {
2474       rtx ni2dest;
2475
2476       newi2pat = XVECEXP (newpat, 0, 0);
2477       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
2478       newpat = XVECEXP (newpat, 0, 1);
2479       SUBST (SET_SRC (newpat),
2480              gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
2481       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2482
2483       if (i2_code_number >= 0)
2484         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2485
2486       if (insn_code_number >= 0)
2487         swap_i2i3 = 1;
2488     }
2489
2490   /* Similarly, check for a case where we have a PARALLEL of two independent
2491      SETs but we started with three insns.  In this case, we can do the sets
2492      as two separate insns.  This case occurs when some SET allows two
2493      other insns to combine, but the destination of that SET is still live.  */
2494
2495   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2496            && GET_CODE (newpat) == PARALLEL
2497            && XVECLEN (newpat, 0) == 2
2498            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2499            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
2500            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
2501            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2502            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2503            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2504            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2505                                    INSN_CUID (i2))
2506            /* Don't pass sets with (USE (MEM ...)) dests to the following.  */
2507            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
2508            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
2509            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2510                                   XVECEXP (newpat, 0, 0))
2511            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
2512                                   XVECEXP (newpat, 0, 1))
2513            && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
2514                  && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
2515     {
2516       /* Normally, it doesn't matter which of the two is done first,
2517          but it does if one references cc0.  In that case, it has to
2518          be first.  */
2519 #ifdef HAVE_cc0
2520       if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
2521         {
2522           newi2pat = XVECEXP (newpat, 0, 0);
2523           newpat = XVECEXP (newpat, 0, 1);
2524         }
2525       else
2526 #endif
2527         {
2528           newi2pat = XVECEXP (newpat, 0, 1);
2529           newpat = XVECEXP (newpat, 0, 0);
2530         }
2531
2532       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2533
2534       if (i2_code_number >= 0)
2535         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2536     }
2537
2538   /* If it still isn't recognized, fail and change things back the way they
2539      were.  */
2540   if ((insn_code_number < 0
2541        /* Is the result a reasonable ASM_OPERANDS?  */
2542        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
2543     {
2544       undo_all ();
2545       return 0;
2546     }
2547
2548   /* If we had to change another insn, make sure it is valid also.  */
2549   if (undobuf.other_insn)
2550     {
2551       rtx other_pat = PATTERN (undobuf.other_insn);
2552       rtx new_other_notes;
2553       rtx note, next;
2554
2555       CLEAR_HARD_REG_SET (newpat_used_regs);
2556
2557       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
2558                                              &new_other_notes);
2559
2560       if (other_code_number < 0 && ! check_asm_operands (other_pat))
2561         {
2562           undo_all ();
2563           return 0;
2564         }
2565
2566       PATTERN (undobuf.other_insn) = other_pat;
2567
2568       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
2569          are still valid.  Then add any non-duplicate notes added by
2570          recog_for_combine.  */
2571       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
2572         {
2573           next = XEXP (note, 1);
2574
2575           if (REG_NOTE_KIND (note) == REG_UNUSED
2576               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
2577             {
2578               if (REG_P (XEXP (note, 0)))
2579                 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
2580
2581               remove_note (undobuf.other_insn, note);
2582             }
2583         }
2584
2585       for (note = new_other_notes; note; note = XEXP (note, 1))
2586         if (REG_P (XEXP (note, 0)))
2587           REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
2588
2589       distribute_notes (new_other_notes, undobuf.other_insn,
2590                         undobuf.other_insn, NULL_RTX);
2591     }
2592 #ifdef HAVE_cc0
2593   /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
2594      they are adjacent to each other or not.  */
2595   {
2596     rtx p = prev_nonnote_insn (i3);
2597     if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
2598         && sets_cc0_p (newi2pat))
2599       {
2600         undo_all ();
2601         return 0;
2602       }
2603   }
2604 #endif
2605
2606   /* Only allow this combination if insn_rtx_costs reports that the
2607      replacement instructions are cheaper than the originals.  */
2608   if (!combine_validate_cost (i1, i2, i3, newpat, newi2pat))
2609     {
2610       undo_all ();
2611       return 0;
2612     }
2613
2614   /* We now know that we can do this combination.  Merge the insns and
2615      update the status of registers and LOG_LINKS.  */
2616
2617   if (swap_i2i3)
2618     {
2619       rtx insn;
2620       rtx link;
2621       rtx ni2dest;
2622
2623       /* I3 now uses what used to be its destination and which is now
2624          I2's destination.  This requires us to do a few adjustments.  */
2625       PATTERN (i3) = newpat;
2626       adjust_for_new_dest (i3);
2627
2628       /* We need a LOG_LINK from I3 to I2.  But we used to have one,
2629          so we still will.
2630
2631          However, some later insn might be using I2's dest and have
2632          a LOG_LINK pointing at I3.  We must remove this link.
2633          The simplest way to remove the link is to point it at I1,
2634          which we know will be a NOTE.  */
2635
2636       /* newi2pat is usually a SET here; however, recog_for_combine might
2637          have added some clobbers.  */
2638       if (GET_CODE (newi2pat) == PARALLEL)
2639         ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
2640       else
2641         ni2dest = SET_DEST (newi2pat);
2642
2643       for (insn = NEXT_INSN (i3);
2644            insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2645                     || insn != BB_HEAD (this_basic_block->next_bb));
2646            insn = NEXT_INSN (insn))
2647         {
2648           if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
2649             {
2650               for (link = LOG_LINKS (insn); link;
2651                    link = XEXP (link, 1))
2652                 if (XEXP (link, 0) == i3)
2653                   XEXP (link, 0) = i1;
2654
2655               break;
2656             }
2657         }
2658     }
2659
2660   {
2661     rtx i3notes, i2notes, i1notes = 0;
2662     rtx i3links, i2links, i1links = 0;
2663     rtx midnotes = 0;
2664     unsigned int regno;
2665
2666     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
2667        clear them.  */
2668     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
2669     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
2670     if (i1)
2671       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
2672
2673     /* Ensure that we do not have something that should not be shared but
2674        occurs multiple times in the new insns.  Check this by first
2675        resetting all the `used' flags and then copying anything is shared.  */
2676
2677     reset_used_flags (i3notes);
2678     reset_used_flags (i2notes);
2679     reset_used_flags (i1notes);
2680     reset_used_flags (newpat);
2681     reset_used_flags (newi2pat);
2682     if (undobuf.other_insn)
2683       reset_used_flags (PATTERN (undobuf.other_insn));
2684
2685     i3notes = copy_rtx_if_shared (i3notes);
2686     i2notes = copy_rtx_if_shared (i2notes);
2687     i1notes = copy_rtx_if_shared (i1notes);
2688     newpat = copy_rtx_if_shared (newpat);
2689     newi2pat = copy_rtx_if_shared (newi2pat);
2690     if (undobuf.other_insn)
2691       reset_used_flags (PATTERN (undobuf.other_insn));
2692
2693     INSN_CODE (i3) = insn_code_number;
2694     PATTERN (i3) = newpat;
2695
2696     if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
2697       {
2698         rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
2699
2700         reset_used_flags (call_usage);
2701         call_usage = copy_rtx (call_usage);
2702
2703         if (substed_i2)
2704           replace_rtx (call_usage, i2dest, i2src);
2705
2706         if (substed_i1)
2707           replace_rtx (call_usage, i1dest, i1src);
2708
2709         CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
2710       }
2711
2712     if (undobuf.other_insn)
2713       INSN_CODE (undobuf.other_insn) = other_code_number;
2714
2715     /* We had one special case above where I2 had more than one set and
2716        we replaced a destination of one of those sets with the destination
2717        of I3.  In that case, we have to update LOG_LINKS of insns later
2718        in this basic block.  Note that this (expensive) case is rare.
2719
2720        Also, in this case, we must pretend that all REG_NOTEs for I2
2721        actually came from I3, so that REG_UNUSED notes from I2 will be
2722        properly handled.  */
2723
2724     if (i3_subst_into_i2)
2725       {
2726         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
2727           if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != USE
2728               && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
2729               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
2730               && ! find_reg_note (i2, REG_UNUSED,
2731                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
2732             for (temp = NEXT_INSN (i2);
2733                  temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2734                           || BB_HEAD (this_basic_block) != temp);
2735                  temp = NEXT_INSN (temp))
2736               if (temp != i3 && INSN_P (temp))
2737                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
2738                   if (XEXP (link, 0) == i2)
2739                     XEXP (link, 0) = i3;
2740
2741         if (i3notes)
2742           {
2743             rtx link = i3notes;
2744             while (XEXP (link, 1))
2745               link = XEXP (link, 1);
2746             XEXP (link, 1) = i2notes;
2747           }
2748         else
2749           i3notes = i2notes;
2750         i2notes = 0;
2751       }
2752
2753     LOG_LINKS (i3) = 0;
2754     REG_NOTES (i3) = 0;
2755     LOG_LINKS (i2) = 0;
2756     REG_NOTES (i2) = 0;
2757
2758     if (newi2pat)
2759       {
2760         INSN_CODE (i2) = i2_code_number;
2761         PATTERN (i2) = newi2pat;
2762       }
2763     else
2764       SET_INSN_DELETED (i2);
2765
2766     if (i1)
2767       {
2768         LOG_LINKS (i1) = 0;
2769         REG_NOTES (i1) = 0;
2770         SET_INSN_DELETED (i1);
2771       }
2772
2773     /* Get death notes for everything that is now used in either I3 or
2774        I2 and used to die in a previous insn.  If we built two new
2775        patterns, move from I1 to I2 then I2 to I3 so that we get the
2776        proper movement on registers that I2 modifies.  */
2777
2778     if (newi2pat)
2779       {
2780         move_deaths (newi2pat, NULL_RTX, INSN_CUID (i1), i2, &midnotes);
2781         move_deaths (newpat, newi2pat, INSN_CUID (i1), i3, &midnotes);
2782       }
2783     else
2784       move_deaths (newpat, NULL_RTX, i1 ? INSN_CUID (i1) : INSN_CUID (i2),
2785                    i3, &midnotes);
2786
2787     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
2788     if (i3notes)
2789       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX);
2790     if (i2notes)
2791       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX);
2792     if (i1notes)
2793       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX);
2794     if (midnotes)
2795       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2796
2797     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
2798        know these are REG_UNUSED and want them to go to the desired insn,
2799        so we always pass it as i3.  We have not counted the notes in
2800        reg_n_deaths yet, so we need to do so now.  */
2801
2802     if (newi2pat && new_i2_notes)
2803       {
2804         for (temp = new_i2_notes; temp; temp = XEXP (temp, 1))
2805           if (REG_P (XEXP (temp, 0)))
2806             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2807
2808         distribute_notes (new_i2_notes, i2, i2, NULL_RTX);
2809       }
2810
2811     if (new_i3_notes)
2812       {
2813         for (temp = new_i3_notes; temp; temp = XEXP (temp, 1))
2814           if (REG_P (XEXP (temp, 0)))
2815             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2816
2817         distribute_notes (new_i3_notes, i3, i3, NULL_RTX);
2818       }
2819
2820     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
2821        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
2822        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
2823        in that case, it might delete I2.  Similarly for I2 and I1.
2824        Show an additional death due to the REG_DEAD note we make here.  If
2825        we discard it in distribute_notes, we will decrement it again.  */
2826
2827     if (i3dest_killed)
2828       {
2829         if (REG_P (i3dest_killed))
2830           REG_N_DEATHS (REGNO (i3dest_killed))++;
2831
2832         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
2833           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2834                                                NULL_RTX),
2835                             NULL_RTX, i2, NULL_RTX);
2836         else
2837           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2838                                                NULL_RTX),
2839                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2840       }
2841
2842     if (i2dest_in_i2src)
2843       {
2844         if (REG_P (i2dest))
2845           REG_N_DEATHS (REGNO (i2dest))++;
2846
2847         if (newi2pat && reg_set_p (i2dest, newi2pat))
2848           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2849                             NULL_RTX, i2, NULL_RTX);
2850         else
2851           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2852                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2853       }
2854
2855     if (i1dest_in_i1src)
2856       {
2857         if (REG_P (i1dest))
2858           REG_N_DEATHS (REGNO (i1dest))++;
2859
2860         if (newi2pat && reg_set_p (i1dest, newi2pat))
2861           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2862                             NULL_RTX, i2, NULL_RTX);
2863         else
2864           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2865                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX);
2866       }
2867
2868     distribute_links (i3links);
2869     distribute_links (i2links);
2870     distribute_links (i1links);
2871
2872     if (REG_P (i2dest))
2873       {
2874         rtx link;
2875         rtx i2_insn = 0, i2_val = 0, set;
2876
2877         /* The insn that used to set this register doesn't exist, and
2878            this life of the register may not exist either.  See if one of
2879            I3's links points to an insn that sets I2DEST.  If it does,
2880            that is now the last known value for I2DEST. If we don't update
2881            this and I2 set the register to a value that depended on its old
2882            contents, we will get confused.  If this insn is used, thing
2883            will be set correctly in combine_instructions.  */
2884
2885         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2886           if ((set = single_set (XEXP (link, 0))) != 0
2887               && rtx_equal_p (i2dest, SET_DEST (set)))
2888             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
2889
2890         record_value_for_reg (i2dest, i2_insn, i2_val);
2891
2892         /* If the reg formerly set in I2 died only once and that was in I3,
2893            zero its use count so it won't make `reload' do any work.  */
2894         if (! added_sets_2
2895             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
2896             && ! i2dest_in_i2src)
2897           {
2898             regno = REGNO (i2dest);
2899             REG_N_SETS (regno)--;
2900           }
2901       }
2902
2903     if (i1 && REG_P (i1dest))
2904       {
2905         rtx link;
2906         rtx i1_insn = 0, i1_val = 0, set;
2907
2908         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2909           if ((set = single_set (XEXP (link, 0))) != 0
2910               && rtx_equal_p (i1dest, SET_DEST (set)))
2911             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
2912
2913         record_value_for_reg (i1dest, i1_insn, i1_val);
2914
2915         regno = REGNO (i1dest);
2916         if (! added_sets_1 && ! i1dest_in_i1src)
2917           REG_N_SETS (regno)--;
2918       }
2919
2920     /* Update reg_stat[].nonzero_bits et al for any changes that may have
2921        been made to this insn.  The order of
2922        set_nonzero_bits_and_sign_copies() is important.  Because newi2pat
2923        can affect nonzero_bits of newpat */
2924     if (newi2pat)
2925       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
2926     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
2927
2928     /* Set new_direct_jump_p if a new return or simple jump instruction
2929        has been created.
2930
2931        If I3 is now an unconditional jump, ensure that it has a
2932        BARRIER following it since it may have initially been a
2933        conditional jump.  It may also be the last nonnote insn.  */
2934
2935     if (returnjump_p (i3) || any_uncondjump_p (i3))
2936       {
2937         *new_direct_jump_p = 1;
2938         mark_jump_label (PATTERN (i3), i3, 0);
2939
2940         if ((temp = next_nonnote_insn (i3)) == NULL_RTX
2941             || !BARRIER_P (temp))
2942           emit_barrier_after (i3);
2943       }
2944
2945     if (undobuf.other_insn != NULL_RTX
2946         && (returnjump_p (undobuf.other_insn)
2947             || any_uncondjump_p (undobuf.other_insn)))
2948       {
2949         *new_direct_jump_p = 1;
2950
2951         if ((temp = next_nonnote_insn (undobuf.other_insn)) == NULL_RTX
2952             || !BARRIER_P (temp))
2953           emit_barrier_after (undobuf.other_insn);
2954       }
2955
2956     /* An NOOP jump does not need barrier, but it does need cleaning up
2957        of CFG.  */
2958     if (GET_CODE (newpat) == SET
2959         && SET_SRC (newpat) == pc_rtx
2960         && SET_DEST (newpat) == pc_rtx)
2961       *new_direct_jump_p = 1;
2962   }
2963
2964   combine_successes++;
2965   undo_commit ();
2966
2967   if (added_links_insn
2968       && (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2))
2969       && INSN_CUID (added_links_insn) < INSN_CUID (i3))
2970     return added_links_insn;
2971   else
2972     return newi2pat ? i2 : i3;
2973 }
2974 \f
2975 /* Undo all the modifications recorded in undobuf.  */
2976
2977 static void
2978 undo_all (void)
2979 {
2980   struct undo *undo, *next;
2981
2982   for (undo = undobuf.undos; undo; undo = next)
2983     {
2984       next = undo->next;
2985       if (undo->is_int)
2986         *undo->where.i = undo->old_contents.i;
2987       else
2988         *undo->where.r = undo->old_contents.r;
2989
2990       undo->next = undobuf.frees;
2991       undobuf.frees = undo;
2992     }
2993
2994   undobuf.undos = 0;
2995 }
2996
2997 /* We've committed to accepting the changes we made.  Move all
2998    of the undos to the free list.  */
2999
3000 static void
3001 undo_commit (void)
3002 {
3003   struct undo *undo, *next;
3004
3005   for (undo = undobuf.undos; undo; undo = next)
3006     {
3007       next = undo->next;
3008       undo->next = undobuf.frees;
3009       undobuf.frees = undo;
3010     }
3011   undobuf.undos = 0;
3012 }
3013
3014 \f
3015 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
3016    where we have an arithmetic expression and return that point.  LOC will
3017    be inside INSN.
3018
3019    try_combine will call this function to see if an insn can be split into
3020    two insns.  */
3021
3022 static rtx *
3023 find_split_point (rtx *loc, rtx insn)
3024 {
3025   rtx x = *loc;
3026   enum rtx_code code = GET_CODE (x);
3027   rtx *split;
3028   unsigned HOST_WIDE_INT len = 0;
3029   HOST_WIDE_INT pos = 0;
3030   int unsignedp = 0;
3031   rtx inner = NULL_RTX;
3032
3033   /* First special-case some codes.  */
3034   switch (code)
3035     {
3036     case SUBREG:
3037 #ifdef INSN_SCHEDULING
3038       /* If we are making a paradoxical SUBREG invalid, it becomes a split
3039          point.  */
3040       if (MEM_P (SUBREG_REG (x)))
3041         return loc;
3042 #endif
3043       return find_split_point (&SUBREG_REG (x), insn);
3044
3045     case MEM:
3046 #ifdef HAVE_lo_sum
3047       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
3048          using LO_SUM and HIGH.  */
3049       if (GET_CODE (XEXP (x, 0)) == CONST
3050           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
3051         {
3052           SUBST (XEXP (x, 0),
3053                  gen_rtx_LO_SUM (Pmode,
3054                                  gen_rtx_HIGH (Pmode, XEXP (x, 0)),
3055                                  XEXP (x, 0)));
3056           return &XEXP (XEXP (x, 0), 0);
3057         }
3058 #endif
3059
3060       /* If we have a PLUS whose second operand is a constant and the
3061          address is not valid, perhaps will can split it up using
3062          the machine-specific way to split large constants.  We use
3063          the first pseudo-reg (one of the virtual regs) as a placeholder;
3064          it will not remain in the result.  */
3065       if (GET_CODE (XEXP (x, 0)) == PLUS
3066           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3067           && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
3068         {
3069           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
3070           rtx seq = split_insns (gen_rtx_SET (VOIDmode, reg, XEXP (x, 0)),
3071                                  subst_insn);
3072
3073           /* This should have produced two insns, each of which sets our
3074              placeholder.  If the source of the second is a valid address,
3075              we can make put both sources together and make a split point
3076              in the middle.  */
3077
3078           if (seq
3079               && NEXT_INSN (seq) != NULL_RTX
3080               && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
3081               && NONJUMP_INSN_P (seq)
3082               && GET_CODE (PATTERN (seq)) == SET
3083               && SET_DEST (PATTERN (seq)) == reg
3084               && ! reg_mentioned_p (reg,
3085                                     SET_SRC (PATTERN (seq)))
3086               && NONJUMP_INSN_P (NEXT_INSN (seq))
3087               && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
3088               && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
3089               && memory_address_p (GET_MODE (x),
3090                                    SET_SRC (PATTERN (NEXT_INSN (seq)))))
3091             {
3092               rtx src1 = SET_SRC (PATTERN (seq));
3093               rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
3094
3095               /* Replace the placeholder in SRC2 with SRC1.  If we can
3096                  find where in SRC2 it was placed, that can become our
3097                  split point and we can replace this address with SRC2.
3098                  Just try two obvious places.  */
3099
3100               src2 = replace_rtx (src2, reg, src1);
3101               split = 0;
3102               if (XEXP (src2, 0) == src1)
3103                 split = &XEXP (src2, 0);
3104               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
3105                        && XEXP (XEXP (src2, 0), 0) == src1)
3106                 split = &XEXP (XEXP (src2, 0), 0);
3107
3108               if (split)
3109                 {
3110                   SUBST (XEXP (x, 0), src2);
3111                   return split;
3112                 }
3113             }
3114
3115           /* If that didn't work, perhaps the first operand is complex and
3116              needs to be computed separately, so make a split point there.
3117              This will occur on machines that just support REG + CONST
3118              and have a constant moved through some previous computation.  */
3119
3120           else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
3121                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
3122                          && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
3123             return &XEXP (XEXP (x, 0), 0);
3124         }
3125       break;
3126
3127     case SET:
3128 #ifdef HAVE_cc0
3129       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
3130          ZERO_EXTRACT, the most likely reason why this doesn't match is that
3131          we need to put the operand into a register.  So split at that
3132          point.  */
3133
3134       if (SET_DEST (x) == cc0_rtx
3135           && GET_CODE (SET_SRC (x)) != COMPARE
3136           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
3137           && !OBJECT_P (SET_SRC (x))
3138           && ! (GET_CODE (SET_SRC (x)) == SUBREG
3139                 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
3140         return &SET_SRC (x);
3141 #endif
3142
3143       /* See if we can split SET_SRC as it stands.  */
3144       split = find_split_point (&SET_SRC (x), insn);
3145       if (split && split != &SET_SRC (x))
3146         return split;
3147
3148       /* See if we can split SET_DEST as it stands.  */
3149       split = find_split_point (&SET_DEST (x), insn);
3150       if (split && split != &SET_DEST (x))
3151         return split;
3152
3153       /* See if this is a bitfield assignment with everything constant.  If
3154          so, this is an IOR of an AND, so split it into that.  */
3155       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
3156           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
3157               <= HOST_BITS_PER_WIDE_INT)
3158           && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
3159           && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
3160           && GET_CODE (SET_SRC (x)) == CONST_INT
3161           && ((INTVAL (XEXP (SET_DEST (x), 1))
3162                + INTVAL (XEXP (SET_DEST (x), 2)))
3163               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
3164           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
3165         {
3166           HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
3167           unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
3168           unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
3169           rtx dest = XEXP (SET_DEST (x), 0);
3170           enum machine_mode mode = GET_MODE (dest);
3171           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
3172
3173           if (BITS_BIG_ENDIAN)
3174             pos = GET_MODE_BITSIZE (mode) - len - pos;
3175
3176           if (src == mask)
3177             SUBST (SET_SRC (x),
3178                    gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
3179           else
3180             SUBST (SET_SRC (x),
3181                    gen_binary (IOR, mode,
3182                                gen_binary (AND, mode, dest,
3183                                            gen_int_mode (~(mask << pos),
3184                                                          mode)),
3185                                GEN_INT (src << pos)));
3186
3187           SUBST (SET_DEST (x), dest);
3188
3189           split = find_split_point (&SET_SRC (x), insn);
3190           if (split && split != &SET_SRC (x))
3191             return split;
3192         }
3193
3194       /* Otherwise, see if this is an operation that we can split into two.
3195          If so, try to split that.  */
3196       code = GET_CODE (SET_SRC (x));
3197
3198       switch (code)
3199         {
3200         case AND:
3201           /* If we are AND'ing with a large constant that is only a single
3202              bit and the result is only being used in a context where we
3203              need to know if it is zero or nonzero, replace it with a bit
3204              extraction.  This will avoid the large constant, which might
3205              have taken more than one insn to make.  If the constant were
3206              not a valid argument to the AND but took only one insn to make,
3207              this is no worse, but if it took more than one insn, it will
3208              be better.  */
3209
3210           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3211               && REG_P (XEXP (SET_SRC (x), 0))
3212               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
3213               && REG_P (SET_DEST (x))
3214               && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
3215               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
3216               && XEXP (*split, 0) == SET_DEST (x)
3217               && XEXP (*split, 1) == const0_rtx)
3218             {
3219               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
3220                                                 XEXP (SET_SRC (x), 0),
3221                                                 pos, NULL_RTX, 1, 1, 0, 0);
3222               if (extraction != 0)
3223                 {
3224                   SUBST (SET_SRC (x), extraction);
3225                   return find_split_point (loc, insn);
3226                 }
3227             }
3228           break;
3229
3230         case NE:
3231           /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
3232              is known to be on, this can be converted into a NEG of a shift.  */
3233           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
3234               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
3235               && 1 <= (pos = exact_log2
3236                        (nonzero_bits (XEXP (SET_SRC (x), 0),
3237                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
3238             {
3239               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
3240
3241               SUBST (SET_SRC (x),
3242                      gen_rtx_NEG (mode,
3243                                   gen_rtx_LSHIFTRT (mode,
3244                                                     XEXP (SET_SRC (x), 0),
3245                                                     GEN_INT (pos))));
3246
3247               split = find_split_point (&SET_SRC (x), insn);
3248               if (split && split != &SET_SRC (x))
3249                 return split;
3250             }
3251           break;
3252
3253         case SIGN_EXTEND:
3254           inner = XEXP (SET_SRC (x), 0);
3255
3256           /* We can't optimize if either mode is a partial integer
3257              mode as we don't know how many bits are significant
3258              in those modes.  */
3259           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
3260               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
3261             break;
3262
3263           pos = 0;
3264           len = GET_MODE_BITSIZE (GET_MODE (inner));
3265           unsignedp = 0;
3266           break;
3267
3268         case SIGN_EXTRACT:
3269         case ZERO_EXTRACT:
3270           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3271               && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
3272             {
3273               inner = XEXP (SET_SRC (x), 0);
3274               len = INTVAL (XEXP (SET_SRC (x), 1));
3275               pos = INTVAL (XEXP (SET_SRC (x), 2));
3276
3277               if (BITS_BIG_ENDIAN)
3278                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
3279               unsignedp = (code == ZERO_EXTRACT);
3280             }
3281           break;
3282
3283         default:
3284           break;
3285         }
3286
3287       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
3288         {
3289           enum machine_mode mode = GET_MODE (SET_SRC (x));
3290
3291           /* For unsigned, we have a choice of a shift followed by an
3292              AND or two shifts.  Use two shifts for field sizes where the
3293              constant might be too large.  We assume here that we can
3294              always at least get 8-bit constants in an AND insn, which is
3295              true for every current RISC.  */
3296
3297           if (unsignedp && len <= 8)
3298             {
3299               SUBST (SET_SRC (x),
3300                      gen_rtx_AND (mode,
3301                                   gen_rtx_LSHIFTRT
3302                                   (mode, gen_lowpart (mode, inner),
3303                                    GEN_INT (pos)),
3304                                   GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
3305
3306               split = find_split_point (&SET_SRC (x), insn);
3307               if (split && split != &SET_SRC (x))
3308                 return split;
3309             }
3310           else
3311             {
3312               SUBST (SET_SRC (x),
3313                      gen_rtx_fmt_ee
3314                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
3315                       gen_rtx_ASHIFT (mode,
3316                                       gen_lowpart (mode, inner),
3317                                       GEN_INT (GET_MODE_BITSIZE (mode)
3318                                                - len - pos)),
3319                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
3320
3321               split = find_split_point (&SET_SRC (x), insn);
3322               if (split && split != &SET_SRC (x))
3323                 return split;
3324             }
3325         }
3326
3327       /* See if this is a simple operation with a constant as the second
3328          operand.  It might be that this constant is out of range and hence
3329          could be used as a split point.  */
3330       if (BINARY_P (SET_SRC (x))
3331           && CONSTANT_P (XEXP (SET_SRC (x), 1))
3332           && (OBJECT_P (XEXP (SET_SRC (x), 0))
3333               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
3334                   && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
3335         return &XEXP (SET_SRC (x), 1);
3336
3337       /* Finally, see if this is a simple operation with its first operand
3338          not in a register.  The operation might require this operand in a
3339          register, so return it as a split point.  We can always do this
3340          because if the first operand were another operation, we would have
3341          already found it as a split point.  */
3342       if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
3343           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
3344         return &XEXP (SET_SRC (x), 0);
3345
3346       return 0;
3347
3348     case AND:
3349     case IOR:
3350       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
3351          it is better to write this as (not (ior A B)) so we can split it.
3352          Similarly for IOR.  */
3353       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
3354         {
3355           SUBST (*loc,
3356                  gen_rtx_NOT (GET_MODE (x),
3357                               gen_rtx_fmt_ee (code == IOR ? AND : IOR,
3358                                               GET_MODE (x),
3359                                               XEXP (XEXP (x, 0), 0),
3360                                               XEXP (XEXP (x, 1), 0))));
3361           return find_split_point (loc, insn);
3362         }
3363
3364       /* Many RISC machines have a large set of logical insns.  If the
3365          second operand is a NOT, put it first so we will try to split the
3366          other operand first.  */
3367       if (GET_CODE (XEXP (x, 1)) == NOT)
3368         {
3369           rtx tem = XEXP (x, 0);
3370           SUBST (XEXP (x, 0), XEXP (x, 1));
3371           SUBST (XEXP (x, 1), tem);
3372         }
3373       break;
3374
3375     default:
3376       break;
3377     }
3378
3379   /* Otherwise, select our actions depending on our rtx class.  */
3380   switch (GET_RTX_CLASS (code))
3381     {
3382     case RTX_BITFIELD_OPS:              /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
3383     case RTX_TERNARY:
3384       split = find_split_point (&XEXP (x, 2), insn);
3385       if (split)
3386         return split;
3387       /* ... fall through ...  */
3388     case RTX_BIN_ARITH:
3389     case RTX_COMM_ARITH:
3390     case RTX_COMPARE:
3391     case RTX_COMM_COMPARE:
3392       split = find_split_point (&XEXP (x, 1), insn);
3393       if (split)
3394         return split;
3395       /* ... fall through ...  */
3396     case RTX_UNARY:
3397       /* Some machines have (and (shift ...) ...) insns.  If X is not
3398          an AND, but XEXP (X, 0) is, use it as our split point.  */
3399       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
3400         return &XEXP (x, 0);
3401
3402       split = find_split_point (&XEXP (x, 0), insn);
3403       if (split)
3404         return split;
3405       return loc;
3406
3407     default:
3408       /* Otherwise, we don't have a split point.  */
3409       return 0;
3410     }
3411 }
3412 \f
3413 /* Throughout X, replace FROM with TO, and return the result.
3414    The result is TO if X is FROM;
3415    otherwise the result is X, but its contents may have been modified.
3416    If they were modified, a record was made in undobuf so that
3417    undo_all will (among other things) return X to its original state.
3418
3419    If the number of changes necessary is too much to record to undo,
3420    the excess changes are not made, so the result is invalid.
3421    The changes already made can still be undone.
3422    undobuf.num_undo is incremented for such changes, so by testing that
3423    the caller can tell whether the result is valid.
3424
3425    `n_occurrences' is incremented each time FROM is replaced.
3426
3427    IN_DEST is nonzero if we are processing the SET_DEST of a SET.
3428
3429    UNIQUE_COPY is nonzero if each substitution must be unique.  We do this
3430    by copying if `n_occurrences' is nonzero.  */
3431
3432 static rtx
3433 subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
3434 {
3435   enum rtx_code code = GET_CODE (x);
3436   enum machine_mode op0_mode = VOIDmode;
3437   const char *fmt;
3438   int len, i;
3439   rtx new;
3440
3441 /* Two expressions are equal if they are identical copies of a shared
3442    RTX or if they are both registers with the same register number
3443    and mode.  */
3444
3445 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
3446   ((X) == (Y)                                           \
3447    || (REG_P (X) && REG_P (Y)   \
3448        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
3449
3450   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
3451     {
3452       n_occurrences++;
3453       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
3454     }
3455
3456   /* If X and FROM are the same register but different modes, they will
3457      not have been seen as equal above.  However, flow.c will make a
3458      LOG_LINKS entry for that case.  If we do nothing, we will try to
3459      rerecognize our original insn and, when it succeeds, we will
3460      delete the feeding insn, which is incorrect.
3461
3462      So force this insn not to match in this (rare) case.  */
3463   if (! in_dest && code == REG && REG_P (from)
3464       && REGNO (x) == REGNO (from))
3465     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
3466
3467   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
3468      of which may contain things that can be combined.  */
3469   if (code != MEM && code != LO_SUM && OBJECT_P (x))
3470     return x;
3471
3472   /* It is possible to have a subexpression appear twice in the insn.
3473      Suppose that FROM is a register that appears within TO.
3474      Then, after that subexpression has been scanned once by `subst',
3475      the second time it is scanned, TO may be found.  If we were
3476      to scan TO here, we would find FROM within it and create a
3477      self-referent rtl structure which is completely wrong.  */
3478   if (COMBINE_RTX_EQUAL_P (x, to))
3479     return to;
3480
3481   /* Parallel asm_operands need special attention because all of the
3482      inputs are shared across the arms.  Furthermore, unsharing the
3483      rtl results in recognition failures.  Failure to handle this case
3484      specially can result in circular rtl.
3485
3486      Solve this by doing a normal pass across the first entry of the
3487      parallel, and only processing the SET_DESTs of the subsequent
3488      entries.  Ug.  */
3489
3490   if (code == PARALLEL
3491       && GET_CODE (XVECEXP (x, 0, 0)) == SET
3492       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
3493     {
3494       new = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
3495
3496       /* If this substitution failed, this whole thing fails.  */
3497       if (GET_CODE (new) == CLOBBER
3498           && XEXP (new, 0) == const0_rtx)
3499         return new;
3500
3501       SUBST (XVECEXP (x, 0, 0), new);
3502
3503       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
3504         {
3505           rtx dest = SET_DEST (XVECEXP (x, 0, i));
3506
3507           if (!REG_P (dest)
3508               && GET_CODE (dest) != CC0
3509               && GET_CODE (dest) != PC)
3510             {
3511               new = subst (dest, from, to, 0, unique_copy);
3512
3513               /* If this substitution failed, this whole thing fails.  */
3514               if (GET_CODE (new) == CLOBBER
3515                   && XEXP (new, 0) == const0_rtx)
3516                 return new;
3517
3518               SUBST (SET_DEST (XVECEXP (x, 0, i)), new);
3519             }
3520         }
3521     }
3522   else
3523     {
3524       len = GET_RTX_LENGTH (code);
3525       fmt = GET_RTX_FORMAT (code);
3526
3527       /* We don't need to process a SET_DEST that is a register, CC0,
3528          or PC, so set up to skip this common case.  All other cases
3529          where we want to suppress replacing something inside a
3530          SET_SRC are handled via the IN_DEST operand.  */
3531       if (code == SET
3532           && (REG_P (SET_DEST (x))
3533               || GET_CODE (SET_DEST (x)) == CC0
3534               || GET_CODE (SET_DEST (x)) == PC))
3535         fmt = "ie";
3536
3537       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
3538          constant.  */
3539       if (fmt[0] == 'e')
3540         op0_mode = GET_MODE (XEXP (x, 0));
3541
3542       for (i = 0; i < len; i++)
3543         {
3544           if (fmt[i] == 'E')
3545             {
3546               int j;
3547               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3548                 {
3549                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
3550                     {
3551                       new = (unique_copy && n_occurrences
3552                              ? copy_rtx (to) : to);
3553                       n_occurrences++;
3554                     }
3555                   else
3556                     {
3557                       new = subst (XVECEXP (x, i, j), from, to, 0,
3558                                    unique_copy);
3559
3560                       /* If this substitution failed, this whole thing
3561                          fails.  */
3562                       if (GET_CODE (new) == CLOBBER
3563                           && XEXP (new, 0) == const0_rtx)
3564                         return new;
3565                     }
3566
3567                   SUBST (XVECEXP (x, i, j), new);
3568                 }
3569             }
3570           else if (fmt[i] == 'e')
3571             {
3572               /* If this is a register being set, ignore it.  */
3573               new = XEXP (x, i);
3574               if (in_dest
3575                   && i == 0
3576                   && (((code == SUBREG || code == ZERO_EXTRACT)
3577                        && REG_P (new))
3578                       || code == STRICT_LOW_PART))
3579                 ;
3580
3581               else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
3582                 {
3583                   /* In general, don't install a subreg involving two
3584                      modes not tieable.  It can worsen register
3585                      allocation, and can even make invalid reload
3586                      insns, since the reg inside may need to be copied
3587                      from in the outside mode, and that may be invalid
3588                      if it is an fp reg copied in integer mode.
3589
3590                      We allow two exceptions to this: It is valid if
3591                      it is inside another SUBREG and the mode of that
3592                      SUBREG and the mode of the inside of TO is
3593                      tieable and it is valid if X is a SET that copies
3594                      FROM to CC0.  */
3595
3596                   if (GET_CODE (to) == SUBREG
3597                       && ! MODES_TIEABLE_P (GET_MODE (to),
3598                                             GET_MODE (SUBREG_REG (to)))
3599                       && ! (code == SUBREG
3600                             && MODES_TIEABLE_P (GET_MODE (x),
3601                                                 GET_MODE (SUBREG_REG (to))))
3602 #ifdef HAVE_cc0
3603                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
3604 #endif
3605                       )
3606                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3607
3608 #ifdef CANNOT_CHANGE_MODE_CLASS
3609                   if (code == SUBREG
3610                       && REG_P (to)
3611                       && REGNO (to) < FIRST_PSEUDO_REGISTER
3612                       && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
3613                                                    GET_MODE (to),
3614                                                    GET_MODE (x)))
3615                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3616 #endif
3617
3618                   new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
3619                   n_occurrences++;
3620                 }
3621               else
3622                 /* If we are in a SET_DEST, suppress most cases unless we
3623                    have gone inside a MEM, in which case we want to
3624                    simplify the address.  We assume here that things that
3625                    are actually part of the destination have their inner
3626                    parts in the first expression.  This is true for SUBREG,
3627                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
3628                    things aside from REG and MEM that should appear in a
3629                    SET_DEST.  */
3630                 new = subst (XEXP (x, i), from, to,
3631                              (((in_dest
3632                                 && (code == SUBREG || code == STRICT_LOW_PART
3633                                     || code == ZERO_EXTRACT))
3634                                || code == SET)
3635                               && i == 0), unique_copy);
3636
3637               /* If we found that we will have to reject this combination,
3638                  indicate that by returning the CLOBBER ourselves, rather than
3639                  an expression containing it.  This will speed things up as
3640                  well as prevent accidents where two CLOBBERs are considered
3641                  to be equal, thus producing an incorrect simplification.  */
3642
3643               if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
3644                 return new;
3645
3646               if (GET_CODE (x) == SUBREG
3647                   && (GET_CODE (new) == CONST_INT
3648                       || GET_CODE (new) == CONST_DOUBLE))
3649                 {
3650                   enum machine_mode mode = GET_MODE (x);
3651
3652                   x = simplify_subreg (GET_MODE (x), new,
3653                                        GET_MODE (SUBREG_REG (x)),
3654                                        SUBREG_BYTE (x));
3655                   if (! x)
3656                     x = gen_rtx_CLOBBER (mode, const0_rtx);
3657                 }
3658               else if (GET_CODE (new) == CONST_INT
3659                        && GET_CODE (x) == ZERO_EXTEND)
3660                 {
3661                   x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
3662                                                 new, GET_MODE (XEXP (x, 0)));
3663                   gcc_assert (x);
3664                 }
3665               else
3666                 SUBST (XEXP (x, i), new);
3667             }
3668         }
3669     }
3670
3671   /* Try to simplify X.  If the simplification changed the code, it is likely
3672      that further simplification will help, so loop, but limit the number
3673      of repetitions that will be performed.  */
3674
3675   for (i = 0; i < 4; i++)
3676     {
3677       /* If X is sufficiently simple, don't bother trying to do anything
3678          with it.  */
3679       if (code != CONST_INT && code != REG && code != CLOBBER)
3680         x = combine_simplify_rtx (x, op0_mode, in_dest);
3681
3682       if (GET_CODE (x) == code)
3683         break;
3684
3685       code = GET_CODE (x);
3686
3687       /* We no longer know the original mode of operand 0 since we
3688          have changed the form of X)  */
3689       op0_mode = VOIDmode;
3690     }
3691
3692   return x;
3693 }
3694 \f
3695 /* Simplify X, a piece of RTL.  We just operate on the expression at the
3696    outer level; call `subst' to simplify recursively.  Return the new
3697    expression.
3698
3699    OP0_MODE is the original mode of XEXP (x, 0).  IN_DEST is nonzero
3700    if we are inside a SET_DEST.  */
3701
3702 static rtx
3703 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
3704 {
3705   enum rtx_code code = GET_CODE (x);
3706   enum machine_mode mode = GET_MODE (x);
3707   rtx temp;
3708   rtx reversed;
3709   int i;
3710
3711   /* If this is a commutative operation, put a constant last and a complex
3712      expression first.  We don't need to do this for comparisons here.  */
3713   if (COMMUTATIVE_ARITH_P (x)
3714       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
3715     {
3716       temp = XEXP (x, 0);
3717       SUBST (XEXP (x, 0), XEXP (x, 1));
3718       SUBST (XEXP (x, 1), temp);
3719     }
3720
3721   /* If this is a PLUS, MINUS, or MULT, and the first operand is the
3722      sign extension of a PLUS with a constant, reverse the order of the sign
3723      extension and the addition. Note that this not the same as the original
3724      code, but overflow is undefined for signed values.  Also note that the
3725      PLUS will have been partially moved "inside" the sign-extension, so that
3726      the first operand of X will really look like:
3727          (ashiftrt (plus (ashift A C4) C5) C4).
3728      We convert this to
3729          (plus (ashiftrt (ashift A C4) C2) C4)
3730      and replace the first operand of X with that expression.  Later parts
3731      of this function may simplify the expression further.
3732
3733      For example, if we start with (mult (sign_extend (plus A C1)) C2),
3734      we swap the SIGN_EXTEND and PLUS.  Later code will apply the
3735      distributive law to produce (plus (mult (sign_extend X) C1) C3).
3736
3737      We do this to simplify address expressions.  */
3738
3739   if ((code == PLUS || code == MINUS || code == MULT)
3740       && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3741       && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
3742       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT
3743       && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT
3744       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3745       && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1)
3746       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
3747       && (temp = simplify_binary_operation (ASHIFTRT, mode,
3748                                             XEXP (XEXP (XEXP (x, 0), 0), 1),
3749                                             XEXP (XEXP (x, 0), 1))) != 0)
3750     {
3751       rtx new
3752         = simplify_shift_const (NULL_RTX, ASHIFT, mode,
3753                                 XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0),
3754                                 INTVAL (XEXP (XEXP (x, 0), 1)));
3755
3756       new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
3757                                   INTVAL (XEXP (XEXP (x, 0), 1)));
3758
3759       SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
3760     }
3761
3762   /* If this is a simple operation applied to an IF_THEN_ELSE, try
3763      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
3764      things.  Check for cases where both arms are testing the same
3765      condition.
3766
3767      Don't do anything if all operands are very simple.  */
3768
3769   if ((BINARY_P (x)
3770        && ((!OBJECT_P (XEXP (x, 0))
3771             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3772                   && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
3773            || (!OBJECT_P (XEXP (x, 1))
3774                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
3775                      && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
3776       || (UNARY_P (x)
3777           && (!OBJECT_P (XEXP (x, 0))
3778                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3779                      && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
3780     {
3781       rtx cond, true_rtx, false_rtx;
3782
3783       cond = if_then_else_cond (x, &true_rtx, &false_rtx);
3784       if (cond != 0
3785           /* If everything is a comparison, what we have is highly unlikely
3786              to be simpler, so don't use it.  */
3787           && ! (COMPARISON_P (x)
3788                 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
3789         {
3790           rtx cop1 = const0_rtx;
3791           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
3792
3793           if (cond_code == NE && COMPARISON_P (cond))
3794             return x;
3795
3796           /* Simplify the alternative arms; this may collapse the true and
3797              false arms to store-flag values.  Be careful to use copy_rtx
3798              here since true_rtx or false_rtx might share RTL with x as a
3799              result of the if_then_else_cond call above.  */
3800           true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0);
3801           false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0);
3802
3803           /* If true_rtx and false_rtx are not general_operands, an if_then_else
3804              is unlikely to be simpler.  */
3805           if (general_operand (true_rtx, VOIDmode)
3806               && general_operand (false_rtx, VOIDmode))
3807             {
3808               enum rtx_code reversed;
3809
3810               /* Restarting if we generate a store-flag expression will cause
3811                  us to loop.  Just drop through in this case.  */
3812
3813               /* If the result values are STORE_FLAG_VALUE and zero, we can
3814                  just make the comparison operation.  */
3815               if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
3816                 x = gen_binary (cond_code, mode, cond, cop1);
3817               else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
3818                        && ((reversed = reversed_comparison_code_parts
3819                                         (cond_code, cond, cop1, NULL))
3820                            != UNKNOWN))
3821                 x = gen_binary (reversed, mode, cond, cop1);
3822
3823               /* Likewise, we can make the negate of a comparison operation
3824                  if the result values are - STORE_FLAG_VALUE and zero.  */
3825               else if (GET_CODE (true_rtx) == CONST_INT
3826                        && INTVAL (true_rtx) == - STORE_FLAG_VALUE
3827                        && false_rtx == const0_rtx)
3828                 x = simplify_gen_unary (NEG, mode,
3829                                         gen_binary (cond_code, mode, cond,
3830                                                     cop1),
3831                                         mode);
3832               else if (GET_CODE (false_rtx) == CONST_INT
3833                        && INTVAL (false_rtx) == - STORE_FLAG_VALUE
3834                        && true_rtx == const0_rtx
3835                        && ((reversed = reversed_comparison_code_parts
3836                                         (cond_code, cond, cop1, NULL))
3837                            != UNKNOWN))
3838                 x = simplify_gen_unary (NEG, mode,
3839                                         gen_binary (reversed, mode,
3840                                                     cond, cop1),
3841                                         mode);
3842               else
3843                 return gen_rtx_IF_THEN_ELSE (mode,
3844                                              gen_binary (cond_code, VOIDmode,
3845                                                          cond, cop1),
3846                                              true_rtx, false_rtx);
3847
3848               code = GET_CODE (x);
3849               op0_mode = VOIDmode;
3850             }
3851         }
3852     }
3853
3854   /* Try to fold this expression in case we have constants that weren't
3855      present before.  */
3856   temp = 0;
3857   switch (GET_RTX_CLASS (code))
3858     {
3859     case RTX_UNARY:
3860       if (op0_mode == VOIDmode)
3861         op0_mode = GET_MODE (XEXP (x, 0));
3862       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
3863       break;
3864     case RTX_COMPARE:
3865     case RTX_COMM_COMPARE:
3866       {
3867         enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
3868         if (cmp_mode == VOIDmode)
3869           {
3870             cmp_mode = GET_MODE (XEXP (x, 1));
3871             if (cmp_mode == VOIDmode)
3872               cmp_mode = op0_mode;
3873           }
3874         temp = simplify_relational_operation (code, mode, cmp_mode,
3875                                               XEXP (x, 0), XEXP (x, 1));
3876       }
3877       break;
3878     case RTX_COMM_ARITH:
3879     case RTX_BIN_ARITH:
3880       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
3881       break;
3882     case RTX_BITFIELD_OPS:
3883     case RTX_TERNARY:
3884       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
3885                                          XEXP (x, 1), XEXP (x, 2));
3886       break;
3887     default:
3888       break;
3889     }
3890
3891   if (temp)
3892     {
3893       x = temp;
3894       code = GET_CODE (temp);
3895       op0_mode = VOIDmode;
3896       mode = GET_MODE (temp);
3897     }
3898
3899   /* First see if we can apply the inverse distributive law.  */
3900   if (code == PLUS || code == MINUS
3901       || code == AND || code == IOR || code == XOR)
3902     {
3903       x = apply_distributive_law (x);
3904       code = GET_CODE (x);
3905       op0_mode = VOIDmode;
3906     }
3907
3908   /* If CODE is an associative operation not otherwise handled, see if we
3909      can associate some operands.  This can win if they are constants or
3910      if they are logically related (i.e. (a & b) & a).  */
3911   if ((code == PLUS || code == MINUS || code == MULT || code == DIV
3912        || code == AND || code == IOR || code == XOR
3913        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
3914       && ((INTEGRAL_MODE_P (mode) && code != DIV)
3915           || (flag_unsafe_math_optimizations && FLOAT_MODE_P (mode))))
3916     {
3917       if (GET_CODE (XEXP (x, 0)) == code)
3918         {
3919           rtx other = XEXP (XEXP (x, 0), 0);
3920           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
3921           rtx inner_op1 = XEXP (x, 1);
3922           rtx inner;
3923
3924           /* Make sure we pass the constant operand if any as the second
3925              one if this is a commutative operation.  */
3926           if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
3927             {
3928               rtx tem = inner_op0;
3929               inner_op0 = inner_op1;
3930               inner_op1 = tem;
3931             }
3932           inner = simplify_binary_operation (code == MINUS ? PLUS
3933                                              : code == DIV ? MULT
3934                                              : code,
3935                                              mode, inner_op0, inner_op1);
3936
3937           /* For commutative operations, try the other pair if that one
3938              didn't simplify.  */
3939           if (inner == 0 && COMMUTATIVE_ARITH_P (x))
3940             {
3941               other = XEXP (XEXP (x, 0), 1);
3942               inner = simplify_binary_operation (code, mode,
3943                                                  XEXP (XEXP (x, 0), 0),
3944                                                  XEXP (x, 1));
3945             }
3946
3947           if (inner)
3948             return gen_binary (code, mode, other, inner);
3949         }
3950     }
3951
3952   /* A little bit of algebraic simplification here.  */
3953   switch (code)
3954     {
3955     case MEM:
3956       /* Ensure that our address has any ASHIFTs converted to MULT in case
3957          address-recognizing predicates are called later.  */
3958       temp = make_compound_operation (XEXP (x, 0), MEM);
3959       SUBST (XEXP (x, 0), temp);
3960       break;
3961
3962     case SUBREG:
3963       if (op0_mode == VOIDmode)
3964         op0_mode = GET_MODE (SUBREG_REG (x));
3965
3966       /* See if this can be moved to simplify_subreg.  */
3967       if (CONSTANT_P (SUBREG_REG (x))
3968           && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
3969              /* Don't call gen_lowpart if the inner mode
3970                 is VOIDmode and we cannot simplify it, as SUBREG without
3971                 inner mode is invalid.  */
3972           && (GET_MODE (SUBREG_REG (x)) != VOIDmode
3973               || gen_lowpart_common (mode, SUBREG_REG (x))))
3974         return gen_lowpart (mode, SUBREG_REG (x));
3975
3976       if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
3977         break;
3978       {
3979         rtx temp;
3980         temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
3981                                 SUBREG_BYTE (x));
3982         if (temp)
3983           return temp;
3984       }
3985
3986       /* Don't change the mode of the MEM if that would change the meaning
3987          of the address.  */
3988       if (MEM_P (SUBREG_REG (x))
3989           && (MEM_VOLATILE_P (SUBREG_REG (x))
3990               || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
3991         return gen_rtx_CLOBBER (mode, const0_rtx);
3992
3993       /* Note that we cannot do any narrowing for non-constants since
3994          we might have been counting on using the fact that some bits were
3995          zero.  We now do this in the SET.  */
3996
3997       break;
3998
3999     case NOT:
4000       if (GET_CODE (XEXP (x, 0)) == SUBREG
4001           && subreg_lowpart_p (XEXP (x, 0))
4002           && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
4003               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
4004           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
4005           && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
4006         {
4007           enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
4008
4009           x = gen_rtx_ROTATE (inner_mode,
4010                               simplify_gen_unary (NOT, inner_mode, const1_rtx,
4011                                                   inner_mode),
4012                               XEXP (SUBREG_REG (XEXP (x, 0)), 1));
4013           return gen_lowpart (mode, x);
4014         }
4015
4016       /* Apply De Morgan's laws to reduce number of patterns for machines
4017          with negating logical insns (and-not, nand, etc.).  If result has
4018          only one NOT, put it first, since that is how the patterns are
4019          coded.  */
4020
4021       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
4022         {
4023           rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
4024           enum machine_mode op_mode;
4025
4026           op_mode = GET_MODE (in1);
4027           in1 = simplify_gen_unary (NOT, op_mode, in1, op_mode);
4028
4029           op_mode = GET_MODE (in2);
4030           if (op_mode == VOIDmode)
4031             op_mode = mode;
4032           in2 = simplify_gen_unary (NOT, op_mode, in2, op_mode);
4033
4034           if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
4035             {
4036               rtx tem = in2;
4037               in2 = in1; in1 = tem;
4038             }
4039
4040           return gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
4041                                  mode, in1, in2);
4042         }
4043       break;
4044
4045     case NEG:
4046       /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1.  */
4047       if (GET_CODE (XEXP (x, 0)) == XOR
4048           && XEXP (XEXP (x, 0), 1) == const1_rtx
4049           && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
4050         return gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
4051
4052       temp = expand_compound_operation (XEXP (x, 0));
4053
4054       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
4055          replaced by (lshiftrt X C).  This will convert
4056          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
4057
4058       if (GET_CODE (temp) == ASHIFTRT
4059           && GET_CODE (XEXP (temp, 1)) == CONST_INT
4060           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
4061         return simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
4062                                      INTVAL (XEXP (temp, 1)));
4063
4064       /* If X has only a single bit that might be nonzero, say, bit I, convert
4065          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
4066          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
4067          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
4068          or a SUBREG of one since we'd be making the expression more
4069          complex if it was just a register.  */
4070
4071       if (!REG_P (temp)
4072           && ! (GET_CODE (temp) == SUBREG
4073                 && REG_P (SUBREG_REG (temp)))
4074           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
4075         {
4076           rtx temp1 = simplify_shift_const
4077             (NULL_RTX, ASHIFTRT, mode,
4078              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
4079                                    GET_MODE_BITSIZE (mode) - 1 - i),
4080              GET_MODE_BITSIZE (mode) - 1 - i);
4081
4082           /* If all we did was surround TEMP with the two shifts, we
4083              haven't improved anything, so don't use it.  Otherwise,
4084              we are better off with TEMP1.  */
4085           if (GET_CODE (temp1) != ASHIFTRT
4086               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
4087               || XEXP (XEXP (temp1, 0), 0) != temp)
4088             return temp1;
4089         }
4090       break;
4091
4092     case TRUNCATE:
4093       /* We can't handle truncation to a partial integer mode here
4094          because we don't know the real bitsize of the partial
4095          integer mode.  */
4096       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
4097         break;
4098
4099       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4100           && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4101                                     GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
4102         SUBST (XEXP (x, 0),
4103                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
4104                               GET_MODE_MASK (mode), NULL_RTX, 0));
4105
4106       /* (truncate:SI ({sign,zero}_extend:DI foo:SI)) == foo:SI.  */
4107       if ((GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4108            || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4109           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
4110         return XEXP (XEXP (x, 0), 0);
4111
4112       /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
4113          (OP:SI foo:SI) if OP is NEG or ABS.  */
4114       if ((GET_CODE (XEXP (x, 0)) == ABS
4115            || GET_CODE (XEXP (x, 0)) == NEG)
4116           && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SIGN_EXTEND
4117               || GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND)
4118           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
4119         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4120                                    XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
4121
4122       /* (truncate:SI (subreg:DI (truncate:SI X) 0)) is
4123          (truncate:SI x).  */
4124       if (GET_CODE (XEXP (x, 0)) == SUBREG
4125           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == TRUNCATE
4126           && subreg_lowpart_p (XEXP (x, 0)))
4127         return SUBREG_REG (XEXP (x, 0));
4128
4129       /* If we know that the value is already truncated, we can
4130          replace the TRUNCATE with a SUBREG if TRULY_NOOP_TRUNCATION
4131          is nonzero for the corresponding modes.  But don't do this
4132          for an (LSHIFTRT (MULT ...)) since this will cause problems
4133          with the umulXi3_highpart patterns.  */
4134       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4135                                  GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
4136           && num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4137              >= (unsigned int) (GET_MODE_BITSIZE (mode) + 1)
4138           && ! (GET_CODE (XEXP (x, 0)) == LSHIFTRT
4139                 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT))
4140         return gen_lowpart (mode, XEXP (x, 0));
4141
4142       /* A truncate of a comparison can be replaced with a subreg if
4143          STORE_FLAG_VALUE permits.  This is like the previous test,
4144          but it works even if the comparison is done in a mode larger
4145          than HOST_BITS_PER_WIDE_INT.  */
4146       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4147           && COMPARISON_P (XEXP (x, 0))
4148           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0)
4149         return gen_lowpart (mode, XEXP (x, 0));
4150
4151       /* Similarly, a truncate of a register whose value is a
4152          comparison can be replaced with a subreg if STORE_FLAG_VALUE
4153          permits.  */
4154       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4155           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
4156           && (temp = get_last_value (XEXP (x, 0)))
4157           && COMPARISON_P (temp))
4158         return gen_lowpart (mode, XEXP (x, 0));
4159
4160       break;
4161
4162     case FLOAT_TRUNCATE:
4163       /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF.  */
4164       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4165           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
4166         return XEXP (XEXP (x, 0), 0);
4167
4168       /* (float_truncate:SF (float_truncate:DF foo:XF))
4169          = (float_truncate:SF foo:XF).
4170          This may eliminate double rounding, so it is unsafe.
4171
4172          (float_truncate:SF (float_extend:XF foo:DF))
4173          = (float_truncate:SF foo:DF).
4174
4175          (float_truncate:DF (float_extend:XF foo:SF))
4176          = (float_extend:SF foo:DF).  */
4177       if ((GET_CODE (XEXP (x, 0)) == FLOAT_TRUNCATE
4178            && flag_unsafe_math_optimizations)
4179           || GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND)
4180         return simplify_gen_unary (GET_MODE_SIZE (GET_MODE (XEXP (XEXP (x, 0),
4181                                                             0)))
4182                                    > GET_MODE_SIZE (mode)
4183                                    ? FLOAT_TRUNCATE : FLOAT_EXTEND,
4184                                    mode,
4185                                    XEXP (XEXP (x, 0), 0), mode);
4186
4187       /*  (float_truncate (float x)) is (float x)  */
4188       if (GET_CODE (XEXP (x, 0)) == FLOAT
4189           && (flag_unsafe_math_optimizations
4190               || ((unsigned)significand_size (GET_MODE (XEXP (x, 0)))
4191                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
4192                       - num_sign_bit_copies (XEXP (XEXP (x, 0), 0),
4193                                              GET_MODE (XEXP (XEXP (x, 0), 0)))))))
4194         return simplify_gen_unary (FLOAT, mode,
4195                                    XEXP (XEXP (x, 0), 0),
4196                                    GET_MODE (XEXP (XEXP (x, 0), 0)));
4197
4198       /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
4199          (OP:SF foo:SF) if OP is NEG or ABS.  */
4200       if ((GET_CODE (XEXP (x, 0)) == ABS
4201            || GET_CODE (XEXP (x, 0)) == NEG)
4202           && GET_CODE (XEXP (XEXP (x, 0), 0)) == FLOAT_EXTEND
4203           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
4204         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4205                                    XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
4206
4207       /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
4208          is (float_truncate:SF x).  */
4209       if (GET_CODE (XEXP (x, 0)) == SUBREG
4210           && subreg_lowpart_p (XEXP (x, 0))
4211           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE)
4212         return SUBREG_REG (XEXP (x, 0));
4213       break;
4214     case FLOAT_EXTEND:
4215       /*  (float_extend (float_extend x)) is (float_extend x)
4216
4217           (float_extend (float x)) is (float x) assuming that double
4218           rounding can't happen.
4219           */
4220       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4221           || (GET_CODE (XEXP (x, 0)) == FLOAT
4222               && ((unsigned)significand_size (GET_MODE (XEXP (x, 0)))
4223                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
4224                       - num_sign_bit_copies (XEXP (XEXP (x, 0), 0),
4225                                              GET_MODE (XEXP (XEXP (x, 0), 0)))))))
4226         return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4227                                    XEXP (XEXP (x, 0), 0),
4228                                    GET_MODE (XEXP (XEXP (x, 0), 0)));
4229
4230       break;
4231 #ifdef HAVE_cc0
4232     case COMPARE:
4233       /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
4234          using cc0, in which case we want to leave it as a COMPARE
4235          so we can distinguish it from a register-register-copy.  */
4236       if (XEXP (x, 1) == const0_rtx)
4237         return XEXP (x, 0);
4238
4239       /* x - 0 is the same as x unless x's mode has signed zeros and
4240          allows rounding towards -infinity.  Under those conditions,
4241          0 - 0 is -0.  */
4242       if (!(HONOR_SIGNED_ZEROS (GET_MODE (XEXP (x, 0)))
4243             && HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (XEXP (x, 0))))
4244           && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
4245         return XEXP (x, 0);
4246       break;
4247 #endif
4248
4249     case CONST:
4250       /* (const (const X)) can become (const X).  Do it this way rather than
4251          returning the inner CONST since CONST can be shared with a
4252          REG_EQUAL note.  */
4253       if (GET_CODE (XEXP (x, 0)) == CONST)
4254         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4255       break;
4256
4257 #ifdef HAVE_lo_sum
4258     case LO_SUM:
4259       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
4260          can add in an offset.  find_split_point will split this address up
4261          again if it doesn't match.  */
4262       if (GET_CODE (XEXP (x, 0)) == HIGH
4263           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
4264         return XEXP (x, 1);
4265       break;
4266 #endif
4267
4268     case PLUS:
4269       /* Canonicalize (plus (mult (neg B) C) A) to (minus A (mult B C)).
4270        */
4271       if (GET_CODE (XEXP (x, 0)) == MULT
4272           && GET_CODE (XEXP (XEXP (x, 0), 0)) == NEG)
4273         {
4274           rtx in1, in2;
4275
4276           in1 = XEXP (XEXP (XEXP (x, 0), 0), 0);
4277           in2 = XEXP (XEXP (x, 0), 1);
4278           return gen_binary (MINUS, mode, XEXP (x, 1),
4279                              gen_binary (MULT, mode, in1, in2));
4280         }
4281
4282       /* If we have (plus (plus (A const) B)), associate it so that CONST is
4283          outermost.  That's because that's the way indexed addresses are
4284          supposed to appear.  This code used to check many more cases, but
4285          they are now checked elsewhere.  */
4286       if (GET_CODE (XEXP (x, 0)) == PLUS
4287           && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
4288         return gen_binary (PLUS, mode,
4289                            gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
4290                                        XEXP (x, 1)),
4291                            XEXP (XEXP (x, 0), 1));
4292
4293       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
4294          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
4295          bit-field and can be replaced by either a sign_extend or a
4296          sign_extract.  The `and' may be a zero_extend and the two
4297          <c>, -<c> constants may be reversed.  */
4298       if (GET_CODE (XEXP (x, 0)) == XOR
4299           && GET_CODE (XEXP (x, 1)) == CONST_INT
4300           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4301           && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
4302           && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
4303               || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
4304           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4305           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
4306                && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4307                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
4308                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
4309               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
4310                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
4311                       == (unsigned int) i + 1))))
4312         return simplify_shift_const
4313           (NULL_RTX, ASHIFTRT, mode,
4314            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4315                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
4316                                  GET_MODE_BITSIZE (mode) - (i + 1)),
4317            GET_MODE_BITSIZE (mode) - (i + 1));
4318
4319       /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
4320          C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
4321          is 1.  This produces better code than the alternative immediately
4322          below.  */
4323       if (COMPARISON_P (XEXP (x, 0))
4324           && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx)
4325               || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx))
4326           && (reversed = reversed_comparison (XEXP (x, 0), mode,
4327                                               XEXP (XEXP (x, 0), 0),
4328                                               XEXP (XEXP (x, 0), 1))))
4329         return
4330           simplify_gen_unary (NEG, mode, reversed, mode);
4331
4332       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
4333          can become (ashiftrt (ashift (xor x 1) C) C) where C is
4334          the bitsize of the mode - 1.  This allows simplification of
4335          "a = (b & 8) == 0;"  */
4336       if (XEXP (x, 1) == constm1_rtx
4337           && !REG_P (XEXP (x, 0))
4338           && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4339                 && REG_P (SUBREG_REG (XEXP (x, 0))))
4340           && nonzero_bits (XEXP (x, 0), mode) == 1)
4341         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
4342            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4343                                  gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
4344                                  GET_MODE_BITSIZE (mode) - 1),
4345            GET_MODE_BITSIZE (mode) - 1);
4346
4347       /* If we are adding two things that have no bits in common, convert
4348          the addition into an IOR.  This will often be further simplified,
4349          for example in cases like ((a & 1) + (a & 2)), which can
4350          become a & 3.  */
4351
4352       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4353           && (nonzero_bits (XEXP (x, 0), mode)
4354               & nonzero_bits (XEXP (x, 1), mode)) == 0)
4355         {
4356           /* Try to simplify the expression further.  */
4357           rtx tor = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
4358           temp = combine_simplify_rtx (tor, mode, in_dest);
4359
4360           /* If we could, great.  If not, do not go ahead with the IOR
4361              replacement, since PLUS appears in many special purpose
4362              address arithmetic instructions.  */
4363           if (GET_CODE (temp) != CLOBBER && temp != tor)
4364             return temp;
4365         }
4366       break;
4367
4368     case MINUS:
4369       /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
4370          by reversing the comparison code if valid.  */
4371       if (STORE_FLAG_VALUE == 1
4372           && XEXP (x, 0) == const1_rtx
4373           && COMPARISON_P (XEXP (x, 1))
4374           && (reversed = reversed_comparison (XEXP (x, 1), mode,
4375                                               XEXP (XEXP (x, 1), 0),
4376                                               XEXP (XEXP (x, 1), 1))))
4377         return reversed;
4378
4379       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
4380          (and <foo> (const_int pow2-1))  */
4381       if (GET_CODE (XEXP (x, 1)) == AND
4382           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
4383           && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
4384           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
4385         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
4386                                        -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
4387
4388       /* Canonicalize (minus A (mult (neg B) C)) to (plus (mult B C) A).
4389        */
4390       if (GET_CODE (XEXP (x, 1)) == MULT
4391           && GET_CODE (XEXP (XEXP (x, 1), 0)) == NEG)
4392         {
4393           rtx in1, in2;
4394
4395           in1 = XEXP (XEXP (XEXP (x, 1), 0), 0);
4396           in2 = XEXP (XEXP (x, 1), 1);
4397           return gen_binary (PLUS, mode, gen_binary (MULT, mode, in1, in2),
4398                              XEXP (x, 0));
4399         }
4400
4401       /* Canonicalize (minus (neg A) (mult B C)) to
4402          (minus (mult (neg B) C) A).  */
4403       if (GET_CODE (XEXP (x, 1)) == MULT
4404           && GET_CODE (XEXP (x, 0)) == NEG)
4405         {
4406           rtx in1, in2;
4407
4408           in1 = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 1), 0), mode);
4409           in2 = XEXP (XEXP (x, 1), 1);
4410           return gen_binary (MINUS, mode, gen_binary (MULT, mode, in1, in2),
4411                              XEXP (XEXP (x, 0), 0));
4412         }
4413
4414       /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
4415          integers.  */
4416       if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
4417         return gen_binary (MINUS, mode,
4418                            gen_binary (MINUS, mode, XEXP (x, 0),
4419                                        XEXP (XEXP (x, 1), 0)),
4420                            XEXP (XEXP (x, 1), 1));
4421       break;
4422
4423     case MULT:
4424       /* If we have (mult (plus A B) C), apply the distributive law and then
4425          the inverse distributive law to see if things simplify.  This
4426          occurs mostly in addresses, often when unrolling loops.  */
4427
4428       if (GET_CODE (XEXP (x, 0)) == PLUS)
4429         {
4430           x = apply_distributive_law
4431             (gen_binary (PLUS, mode,
4432                          gen_binary (MULT, mode,
4433                                      XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
4434                          gen_binary (MULT, mode,
4435                                      XEXP (XEXP (x, 0), 1),
4436                                      copy_rtx (XEXP (x, 1)))));
4437
4438           if (GET_CODE (x) != MULT)
4439             return x;
4440         }
4441       /* Try simplify a*(b/c) as (a*b)/c.  */
4442       if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
4443           && GET_CODE (XEXP (x, 0)) == DIV)
4444         {
4445           rtx tem = simplify_binary_operation (MULT, mode,
4446                                                XEXP (XEXP (x, 0), 0),
4447                                                XEXP (x, 1));
4448           if (tem)
4449             return gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
4450         }
4451       break;
4452
4453     case UDIV:
4454       /* If this is a divide by a power of two, treat it as a shift if
4455          its first operand is a shift.  */
4456       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4457           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
4458           && (GET_CODE (XEXP (x, 0)) == ASHIFT
4459               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
4460               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
4461               || GET_CODE (XEXP (x, 0)) == ROTATE
4462               || GET_CODE (XEXP (x, 0)) == ROTATERT))
4463         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
4464       break;
4465
4466     case EQ:  case NE:
4467     case GT:  case GTU:  case GE:  case GEU:
4468     case LT:  case LTU:  case LE:  case LEU:
4469     case UNEQ:  case LTGT:
4470     case UNGT:  case UNGE:
4471     case UNLT:  case UNLE:
4472     case UNORDERED: case ORDERED:
4473       /* If the first operand is a condition code, we can't do anything
4474          with it.  */
4475       if (GET_CODE (XEXP (x, 0)) == COMPARE
4476           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
4477               && ! CC0_P (XEXP (x, 0))))
4478         {
4479           rtx op0 = XEXP (x, 0);
4480           rtx op1 = XEXP (x, 1);
4481           enum rtx_code new_code;
4482
4483           if (GET_CODE (op0) == COMPARE)
4484             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4485
4486           /* Simplify our comparison, if possible.  */
4487           new_code = simplify_comparison (code, &op0, &op1);
4488
4489           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
4490              if only the low-order bit is possibly nonzero in X (such as when
4491              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
4492              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
4493              known to be either 0 or -1, NE becomes a NEG and EQ becomes
4494              (plus X 1).
4495
4496              Remove any ZERO_EXTRACT we made when thinking this was a
4497              comparison.  It may now be simpler to use, e.g., an AND.  If a
4498              ZERO_EXTRACT is indeed appropriate, it will be placed back by
4499              the call to make_compound_operation in the SET case.  */
4500
4501           if (STORE_FLAG_VALUE == 1
4502               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4503               && op1 == const0_rtx
4504               && mode == GET_MODE (op0)
4505               && nonzero_bits (op0, mode) == 1)
4506             return gen_lowpart (mode,
4507                                 expand_compound_operation (op0));
4508
4509           else if (STORE_FLAG_VALUE == 1
4510                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4511                    && op1 == const0_rtx
4512                    && mode == GET_MODE (op0)
4513                    && (num_sign_bit_copies (op0, mode)
4514                        == GET_MODE_BITSIZE (mode)))
4515             {
4516               op0 = expand_compound_operation (op0);
4517               return simplify_gen_unary (NEG, mode,
4518                                          gen_lowpart (mode, op0),
4519                                          mode);
4520             }
4521
4522           else if (STORE_FLAG_VALUE == 1
4523                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4524                    && op1 == const0_rtx
4525                    && mode == GET_MODE (op0)
4526                    && nonzero_bits (op0, mode) == 1)
4527             {
4528               op0 = expand_compound_operation (op0);
4529               return gen_binary (XOR, mode,
4530                                  gen_lowpart (mode, op0),
4531                                  const1_rtx);
4532             }
4533
4534           else if (STORE_FLAG_VALUE == 1
4535                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4536                    && op1 == const0_rtx
4537                    && mode == GET_MODE (op0)
4538                    && (num_sign_bit_copies (op0, mode)
4539                        == GET_MODE_BITSIZE (mode)))
4540             {
4541               op0 = expand_compound_operation (op0);
4542               return plus_constant (gen_lowpart (mode, op0), 1);
4543             }
4544
4545           /* If STORE_FLAG_VALUE is -1, we have cases similar to
4546              those above.  */
4547           if (STORE_FLAG_VALUE == -1
4548               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4549               && op1 == const0_rtx
4550               && (num_sign_bit_copies (op0, mode)
4551                   == GET_MODE_BITSIZE (mode)))
4552             return gen_lowpart (mode,
4553                                 expand_compound_operation (op0));
4554
4555           else if (STORE_FLAG_VALUE == -1
4556                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4557                    && op1 == const0_rtx
4558                    && mode == GET_MODE (op0)
4559                    && nonzero_bits (op0, mode) == 1)
4560             {
4561               op0 = expand_compound_operation (op0);
4562               return simplify_gen_unary (NEG, mode,
4563                                          gen_lowpart (mode, op0),
4564                                          mode);
4565             }
4566
4567           else if (STORE_FLAG_VALUE == -1
4568                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4569                    && op1 == const0_rtx
4570                    && mode == GET_MODE (op0)
4571                    && (num_sign_bit_copies (op0, mode)
4572                        == GET_MODE_BITSIZE (mode)))
4573             {
4574               op0 = expand_compound_operation (op0);
4575               return simplify_gen_unary (NOT, mode,
4576                                          gen_lowpart (mode, op0),
4577                                          mode);
4578             }
4579
4580           /* If X is 0/1, (eq X 0) is X-1.  */
4581           else if (STORE_FLAG_VALUE == -1
4582                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4583                    && op1 == const0_rtx
4584                    && mode == GET_MODE (op0)
4585                    && nonzero_bits (op0, mode) == 1)
4586             {
4587               op0 = expand_compound_operation (op0);
4588               return plus_constant (gen_lowpart (mode, op0), -1);
4589             }
4590
4591           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
4592              one bit that might be nonzero, we can convert (ne x 0) to
4593              (ashift x c) where C puts the bit in the sign bit.  Remove any
4594              AND with STORE_FLAG_VALUE when we are done, since we are only
4595              going to test the sign bit.  */
4596           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4597               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4598               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
4599                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
4600               && op1 == const0_rtx
4601               && mode == GET_MODE (op0)
4602               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
4603             {
4604               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
4605                                         expand_compound_operation (op0),
4606                                         GET_MODE_BITSIZE (mode) - 1 - i);
4607               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
4608                 return XEXP (x, 0);
4609               else
4610                 return x;
4611             }
4612
4613           /* If the code changed, return a whole new comparison.  */
4614           if (new_code != code)
4615             return gen_rtx_fmt_ee (new_code, mode, op0, op1);
4616
4617           /* Otherwise, keep this operation, but maybe change its operands.
4618              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
4619           SUBST (XEXP (x, 0), op0);
4620           SUBST (XEXP (x, 1), op1);
4621         }
4622       break;
4623
4624     case IF_THEN_ELSE:
4625       return simplify_if_then_else (x);
4626
4627     case ZERO_EXTRACT:
4628     case SIGN_EXTRACT:
4629     case ZERO_EXTEND:
4630     case SIGN_EXTEND:
4631       /* If we are processing SET_DEST, we are done.  */
4632       if (in_dest)
4633         return x;
4634
4635       return expand_compound_operation (x);
4636
4637     case SET:
4638       return simplify_set (x);
4639
4640     case AND:
4641     case IOR:
4642     case XOR:
4643       return simplify_logical (x);
4644
4645     case ABS:
4646       /* (abs (neg <foo>)) -> (abs <foo>) */
4647       if (GET_CODE (XEXP (x, 0)) == NEG)
4648         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4649
4650       /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
4651          do nothing.  */
4652       if (GET_MODE (XEXP (x, 0)) == VOIDmode)
4653         break;
4654
4655       /* If operand is something known to be positive, ignore the ABS.  */
4656       if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
4657           || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4658                <= HOST_BITS_PER_WIDE_INT)
4659               && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4660                    & ((HOST_WIDE_INT) 1
4661                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
4662                   == 0)))
4663         return XEXP (x, 0);
4664
4665       /* If operand is known to be only -1 or 0, convert ABS to NEG.  */
4666       if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
4667         return gen_rtx_NEG (mode, XEXP (x, 0));
4668
4669       break;
4670
4671     case FFS:
4672       /* (ffs (*_extend <X>)) = (ffs <X>) */
4673       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4674           || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4675         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4676       break;
4677
4678     case POPCOUNT:
4679     case PARITY:
4680       /* (pop* (zero_extend <X>)) = (pop* <X>) */
4681       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4682         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4683       break;
4684
4685     case FLOAT:
4686       /* (float (sign_extend <X>)) = (float <X>).  */
4687       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
4688         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4689       break;
4690
4691     case ASHIFT:
4692     case LSHIFTRT:
4693     case ASHIFTRT:
4694     case ROTATE:
4695     case ROTATERT:
4696       /* If this is a shift by a constant amount, simplify it.  */
4697       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4698         return simplify_shift_const (x, code, mode, XEXP (x, 0),
4699                                      INTVAL (XEXP (x, 1)));
4700
4701       else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
4702         SUBST (XEXP (x, 1),
4703                force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
4704                               ((HOST_WIDE_INT) 1
4705                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
4706                               - 1,
4707                               NULL_RTX, 0));
4708       break;
4709
4710     case VEC_SELECT:
4711       {
4712         rtx op0 = XEXP (x, 0);
4713         rtx op1 = XEXP (x, 1);
4714         int len;
4715
4716         gcc_assert (GET_CODE (op1) == PARALLEL);
4717         len = XVECLEN (op1, 0);
4718         if (len == 1
4719             && GET_CODE (XVECEXP (op1, 0, 0)) == CONST_INT
4720             && GET_CODE (op0) == VEC_CONCAT)
4721           {
4722             int offset = INTVAL (XVECEXP (op1, 0, 0)) * GET_MODE_SIZE (GET_MODE (x));
4723
4724             /* Try to find the element in the VEC_CONCAT.  */
4725             for (;;)
4726               {
4727                 if (GET_MODE (op0) == GET_MODE (x))
4728                   return op0;
4729                 if (GET_CODE (op0) == VEC_CONCAT)
4730                   {
4731                     HOST_WIDE_INT op0_size = GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)));
4732                     if (op0_size < offset)
4733                       op0 = XEXP (op0, 0);
4734                     else
4735                       {
4736                         offset -= op0_size;
4737                         op0 = XEXP (op0, 1);
4738                       }
4739                   }
4740                 else
4741                   break;
4742               }
4743           }
4744       }
4745
4746       break;
4747
4748     default:
4749       break;
4750     }
4751
4752   return x;
4753 }
4754 \f
4755 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
4756
4757 static rtx
4758 simplify_if_then_else (rtx x)
4759 {
4760   enum machine_mode mode = GET_MODE (x);
4761   rtx cond = XEXP (x, 0);
4762   rtx true_rtx = XEXP (x, 1);
4763   rtx false_rtx = XEXP (x, 2);
4764   enum rtx_code true_code = GET_CODE (cond);
4765   int comparison_p = COMPARISON_P (cond);
4766   rtx temp;
4767   int i;
4768   enum rtx_code false_code;
4769   rtx reversed;
4770
4771   /* Simplify storing of the truth value.  */
4772   if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
4773     return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1));
4774
4775   /* Also when the truth value has to be reversed.  */
4776   if (comparison_p
4777       && true_rtx == const0_rtx && false_rtx == const_true_rtx
4778       && (reversed = reversed_comparison (cond, mode, XEXP (cond, 0),
4779                                           XEXP (cond, 1))))
4780     return reversed;
4781
4782   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
4783      in it is being compared against certain values.  Get the true and false
4784      comparisons and see if that says anything about the value of each arm.  */
4785
4786   if (comparison_p
4787       && ((false_code = combine_reversed_comparison_code (cond))
4788           != UNKNOWN)
4789       && REG_P (XEXP (cond, 0)))
4790     {
4791       HOST_WIDE_INT nzb;
4792       rtx from = XEXP (cond, 0);
4793       rtx true_val = XEXP (cond, 1);
4794       rtx false_val = true_val;
4795       int swapped = 0;
4796
4797       /* If FALSE_CODE is EQ, swap the codes and arms.  */
4798
4799       if (false_code == EQ)
4800         {
4801           swapped = 1, true_code = EQ, false_code = NE;
4802           temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4803         }
4804
4805       /* If we are comparing against zero and the expression being tested has
4806          only a single bit that might be nonzero, that is its value when it is
4807          not equal to zero.  Similarly if it is known to be -1 or 0.  */
4808
4809       if (true_code == EQ && true_val == const0_rtx
4810           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
4811         false_code = EQ, false_val = GEN_INT (nzb);
4812       else if (true_code == EQ && true_val == const0_rtx
4813                && (num_sign_bit_copies (from, GET_MODE (from))
4814                    == GET_MODE_BITSIZE (GET_MODE (from))))
4815         false_code = EQ, false_val = constm1_rtx;
4816
4817       /* Now simplify an arm if we know the value of the register in the
4818          branch and it is used in the arm.  Be careful due to the potential
4819          of locally-shared RTL.  */
4820
4821       if (reg_mentioned_p (from, true_rtx))
4822         true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
4823                                       from, true_val),
4824                       pc_rtx, pc_rtx, 0, 0);
4825       if (reg_mentioned_p (from, false_rtx))
4826         false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
4827                                    from, false_val),
4828                        pc_rtx, pc_rtx, 0, 0);
4829
4830       SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
4831       SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
4832
4833       true_rtx = XEXP (x, 1);
4834       false_rtx = XEXP (x, 2);
4835       true_code = GET_CODE (cond);
4836     }
4837
4838   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
4839      reversed, do so to avoid needing two sets of patterns for
4840      subtract-and-branch insns.  Similarly if we have a constant in the true
4841      arm, the false arm is the same as the first operand of the comparison, or
4842      the false arm is more complicated than the true arm.  */
4843
4844   if (comparison_p
4845       && combine_reversed_comparison_code (cond) != UNKNOWN
4846       && (true_rtx == pc_rtx
4847           || (CONSTANT_P (true_rtx)
4848               && GET_CODE (false_rtx) != CONST_INT && false_rtx != pc_rtx)
4849           || true_rtx == const0_rtx
4850           || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
4851           || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
4852               && !OBJECT_P (false_rtx))
4853           || reg_mentioned_p (true_rtx, false_rtx)
4854           || rtx_equal_p (false_rtx, XEXP (cond, 0))))
4855     {
4856       true_code = reversed_comparison_code (cond, NULL);
4857       SUBST (XEXP (x, 0),
4858              reversed_comparison (cond, GET_MODE (cond), XEXP (cond, 0),
4859                                   XEXP (cond, 1)));
4860
4861       SUBST (XEXP (x, 1), false_rtx);
4862       SUBST (XEXP (x, 2), true_rtx);
4863
4864       temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4865       cond = XEXP (x, 0);
4866
4867       /* It is possible that the conditional has been simplified out.  */
4868       true_code = GET_CODE (cond);
4869       comparison_p = COMPARISON_P (cond);
4870     }
4871
4872   /* If the two arms are identical, we don't need the comparison.  */
4873
4874   if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
4875     return true_rtx;
4876
4877   /* Convert a == b ? b : a to "a".  */
4878   if (true_code == EQ && ! side_effects_p (cond)
4879       && !HONOR_NANS (mode)
4880       && rtx_equal_p (XEXP (cond, 0), false_rtx)
4881       && rtx_equal_p (XEXP (cond, 1), true_rtx))
4882     return false_rtx;
4883   else if (true_code == NE && ! side_effects_p (cond)
4884            && !HONOR_NANS (mode)
4885            && rtx_equal_p (XEXP (cond, 0), true_rtx)
4886            && rtx_equal_p (XEXP (cond, 1), false_rtx))
4887     return true_rtx;
4888
4889   /* Look for cases where we have (abs x) or (neg (abs X)).  */
4890
4891   if (GET_MODE_CLASS (mode) == MODE_INT
4892       && GET_CODE (false_rtx) == NEG
4893       && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
4894       && comparison_p
4895       && rtx_equal_p (true_rtx, XEXP (cond, 0))
4896       && ! side_effects_p (true_rtx))
4897     switch (true_code)
4898       {
4899       case GT:
4900       case GE:
4901         return simplify_gen_unary (ABS, mode, true_rtx, mode);
4902       case LT:
4903       case LE:
4904         return
4905           simplify_gen_unary (NEG, mode,
4906                               simplify_gen_unary (ABS, mode, true_rtx, mode),
4907                               mode);
4908       default:
4909         break;
4910       }
4911
4912   /* Look for MIN or MAX.  */
4913
4914   if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
4915       && comparison_p
4916       && rtx_equal_p (XEXP (cond, 0), true_rtx)
4917       && rtx_equal_p (XEXP (cond, 1), false_rtx)
4918       && ! side_effects_p (cond))
4919     switch (true_code)
4920       {
4921       case GE:
4922       case GT:
4923         return gen_binary (SMAX, mode, true_rtx, false_rtx);
4924       case LE:
4925       case LT:
4926         return gen_binary (SMIN, mode, true_rtx, false_rtx);
4927       case GEU:
4928       case GTU:
4929         return gen_binary (UMAX, mode, true_rtx, false_rtx);
4930       case LEU:
4931       case LTU:
4932         return gen_binary (UMIN, mode, true_rtx, false_rtx);
4933       default:
4934         break;
4935       }
4936
4937   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
4938      second operand is zero, this can be done as (OP Z (mult COND C2)) where
4939      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
4940      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
4941      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
4942      neither 1 or -1, but it isn't worth checking for.  */
4943
4944   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
4945       && comparison_p
4946       && GET_MODE_CLASS (mode) == MODE_INT
4947       && ! side_effects_p (x))
4948     {
4949       rtx t = make_compound_operation (true_rtx, SET);
4950       rtx f = make_compound_operation (false_rtx, SET);
4951       rtx cond_op0 = XEXP (cond, 0);
4952       rtx cond_op1 = XEXP (cond, 1);
4953       enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
4954       enum machine_mode m = mode;
4955       rtx z = 0, c1 = NULL_RTX;
4956
4957       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
4958            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
4959            || GET_CODE (t) == ASHIFT
4960            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
4961           && rtx_equal_p (XEXP (t, 0), f))
4962         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
4963
4964       /* If an identity-zero op is commutative, check whether there
4965          would be a match if we swapped the operands.  */
4966       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
4967                 || GET_CODE (t) == XOR)
4968                && rtx_equal_p (XEXP (t, 1), f))
4969         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
4970       else if (GET_CODE (t) == SIGN_EXTEND
4971                && (GET_CODE (XEXP (t, 0)) == PLUS
4972                    || GET_CODE (XEXP (t, 0)) == MINUS
4973                    || GET_CODE (XEXP (t, 0)) == IOR
4974                    || GET_CODE (XEXP (t, 0)) == XOR
4975                    || GET_CODE (XEXP (t, 0)) == ASHIFT
4976                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4977                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4978                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4979                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4980                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4981                && (num_sign_bit_copies (f, GET_MODE (f))
4982                    > (unsigned int)
4983                      (GET_MODE_BITSIZE (mode)
4984                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
4985         {
4986           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4987           extend_op = SIGN_EXTEND;
4988           m = GET_MODE (XEXP (t, 0));
4989         }
4990       else if (GET_CODE (t) == SIGN_EXTEND
4991                && (GET_CODE (XEXP (t, 0)) == PLUS
4992                    || GET_CODE (XEXP (t, 0)) == IOR
4993                    || GET_CODE (XEXP (t, 0)) == XOR)
4994                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4995                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4996                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4997                && (num_sign_bit_copies (f, GET_MODE (f))
4998                    > (unsigned int)
4999                      (GET_MODE_BITSIZE (mode)
5000                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
5001         {
5002           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5003           extend_op = SIGN_EXTEND;
5004           m = GET_MODE (XEXP (t, 0));
5005         }
5006       else if (GET_CODE (t) == ZERO_EXTEND
5007                && (GET_CODE (XEXP (t, 0)) == PLUS
5008                    || GET_CODE (XEXP (t, 0)) == MINUS
5009                    || GET_CODE (XEXP (t, 0)) == IOR
5010                    || GET_CODE (XEXP (t, 0)) == XOR
5011                    || GET_CODE (XEXP (t, 0)) == ASHIFT
5012                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5013                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5014                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5015                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5016                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5017                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5018                && ((nonzero_bits (f, GET_MODE (f))
5019                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
5020                    == 0))
5021         {
5022           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5023           extend_op = ZERO_EXTEND;
5024           m = GET_MODE (XEXP (t, 0));
5025         }
5026       else if (GET_CODE (t) == ZERO_EXTEND
5027                && (GET_CODE (XEXP (t, 0)) == PLUS
5028                    || GET_CODE (XEXP (t, 0)) == IOR
5029                    || GET_CODE (XEXP (t, 0)) == XOR)
5030                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5031                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5032                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5033                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5034                && ((nonzero_bits (f, GET_MODE (f))
5035                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
5036                    == 0))
5037         {
5038           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5039           extend_op = ZERO_EXTEND;
5040           m = GET_MODE (XEXP (t, 0));
5041         }
5042
5043       if (z)
5044         {
5045           temp = subst (gen_binary (true_code, m, cond_op0, cond_op1),
5046                         pc_rtx, pc_rtx, 0, 0);
5047           temp = gen_binary (MULT, m, temp,
5048                              gen_binary (MULT, m, c1, const_true_rtx));
5049           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
5050           temp = gen_binary (op, m, gen_lowpart (m, z), temp);
5051
5052           if (extend_op != UNKNOWN)
5053             temp = simplify_gen_unary (extend_op, mode, temp, m);
5054
5055           return temp;
5056         }
5057     }
5058
5059   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
5060      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
5061      negation of a single bit, we can convert this operation to a shift.  We
5062      can actually do this more generally, but it doesn't seem worth it.  */
5063
5064   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5065       && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
5066       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
5067            && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
5068           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
5069                == GET_MODE_BITSIZE (mode))
5070               && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
5071     return
5072       simplify_shift_const (NULL_RTX, ASHIFT, mode,
5073                             gen_lowpart (mode, XEXP (cond, 0)), i);
5074
5075   /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8.  */
5076   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5077       && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
5078       && GET_MODE (XEXP (cond, 0)) == mode
5079       && (INTVAL (true_rtx) & GET_MODE_MASK (mode))
5080           == nonzero_bits (XEXP (cond, 0), mode)
5081       && (i = exact_log2 (INTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
5082     return XEXP (cond, 0);
5083
5084   return x;
5085 }
5086 \f
5087 /* Simplify X, a SET expression.  Return the new expression.  */
5088
5089 static rtx
5090 simplify_set (rtx x)
5091 {
5092   rtx src = SET_SRC (x);
5093   rtx dest = SET_DEST (x);
5094   enum machine_mode mode
5095     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
5096   rtx other_insn;
5097   rtx *cc_use;
5098
5099   /* (set (pc) (return)) gets written as (return).  */
5100   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
5101     return src;
5102
5103   /* Now that we know for sure which bits of SRC we are using, see if we can
5104      simplify the expression for the object knowing that we only need the
5105      low-order bits.  */
5106
5107   if (GET_MODE_CLASS (mode) == MODE_INT
5108       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5109     {
5110       src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
5111       SUBST (SET_SRC (x), src);
5112     }
5113
5114   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
5115      the comparison result and try to simplify it unless we already have used
5116      undobuf.other_insn.  */
5117   if ((GET_MODE_CLASS (mode) == MODE_CC
5118        || GET_CODE (src) == COMPARE
5119        || CC0_P (dest))
5120       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
5121       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
5122       && COMPARISON_P (*cc_use)
5123       && rtx_equal_p (XEXP (*cc_use, 0), dest))
5124     {
5125       enum rtx_code old_code = GET_CODE (*cc_use);
5126       enum rtx_code new_code;
5127       rtx op0, op1, tmp;
5128       int other_changed = 0;
5129       enum machine_mode compare_mode = GET_MODE (dest);
5130
5131       if (GET_CODE (src) == COMPARE)
5132         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
5133       else
5134         op0 = src, op1 = CONST0_RTX (GET_MODE (src));
5135
5136       tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
5137                                            op0, op1);
5138       if (!tmp)
5139         new_code = old_code;
5140       else if (!CONSTANT_P (tmp))
5141         {
5142           new_code = GET_CODE (tmp);
5143           op0 = XEXP (tmp, 0);
5144           op1 = XEXP (tmp, 1);
5145         }
5146       else
5147         {
5148           rtx pat = PATTERN (other_insn);
5149           undobuf.other_insn = other_insn;
5150           SUBST (*cc_use, tmp);
5151
5152           /* Attempt to simplify CC user.  */
5153           if (GET_CODE (pat) == SET)
5154             {
5155               rtx new = simplify_rtx (SET_SRC (pat));
5156               if (new != NULL_RTX)
5157                 SUBST (SET_SRC (pat), new);
5158             }
5159
5160           /* Convert X into a no-op move.  */
5161           SUBST (SET_DEST (x), pc_rtx);
5162           SUBST (SET_SRC (x), pc_rtx);
5163           return x;
5164         }
5165
5166       /* Simplify our comparison, if possible.  */
5167       new_code = simplify_comparison (new_code, &op0, &op1);
5168
5169 #ifdef SELECT_CC_MODE
5170       /* If this machine has CC modes other than CCmode, check to see if we
5171          need to use a different CC mode here.  */
5172       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
5173         compare_mode = GET_MODE (op0);
5174       else
5175         compare_mode = SELECT_CC_MODE (new_code, op0, op1);
5176
5177 #ifndef HAVE_cc0
5178       /* If the mode changed, we have to change SET_DEST, the mode in the
5179          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
5180          a hard register, just build new versions with the proper mode.  If it
5181          is a pseudo, we lose unless it is only time we set the pseudo, in
5182          which case we can safely change its mode.  */
5183       if (compare_mode != GET_MODE (dest))
5184         {
5185           unsigned int regno = REGNO (dest);
5186           rtx new_dest = gen_rtx_REG (compare_mode, regno);
5187
5188           if (regno < FIRST_PSEUDO_REGISTER
5189               || (REG_N_SETS (regno) == 1 && ! REG_USERVAR_P (dest)))
5190             {
5191               if (regno >= FIRST_PSEUDO_REGISTER)
5192                 SUBST (regno_reg_rtx[regno], new_dest);
5193
5194               SUBST (SET_DEST (x), new_dest);
5195               SUBST (XEXP (*cc_use, 0), new_dest);
5196               other_changed = 1;
5197
5198               dest = new_dest;
5199             }
5200         }
5201 #endif  /* cc0 */
5202 #endif  /* SELECT_CC_MODE */
5203
5204       /* If the code changed, we have to build a new comparison in
5205          undobuf.other_insn.  */
5206       if (new_code != old_code)
5207         {
5208           int other_changed_previously = other_changed;
5209           unsigned HOST_WIDE_INT mask;
5210
5211           SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
5212                                           dest, const0_rtx));
5213           other_changed = 1;
5214
5215           /* If the only change we made was to change an EQ into an NE or
5216              vice versa, OP0 has only one bit that might be nonzero, and OP1
5217              is zero, check if changing the user of the condition code will
5218              produce a valid insn.  If it won't, we can keep the original code
5219              in that insn by surrounding our operation with an XOR.  */
5220
5221           if (((old_code == NE && new_code == EQ)
5222                || (old_code == EQ && new_code == NE))
5223               && ! other_changed_previously && op1 == const0_rtx
5224               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
5225               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
5226             {
5227               rtx pat = PATTERN (other_insn), note = 0;
5228
5229               if ((recog_for_combine (&pat, other_insn, &note) < 0
5230                    && ! check_asm_operands (pat)))
5231                 {
5232                   PUT_CODE (*cc_use, old_code);
5233                   other_changed = 0;
5234
5235                   op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask));
5236                 }
5237             }
5238         }
5239
5240       if (other_changed)
5241         undobuf.other_insn = other_insn;
5242
5243 #ifdef HAVE_cc0
5244       /* If we are now comparing against zero, change our source if
5245          needed.  If we do not use cc0, we always have a COMPARE.  */
5246       if (op1 == const0_rtx && dest == cc0_rtx)
5247         {
5248           SUBST (SET_SRC (x), op0);
5249           src = op0;
5250         }
5251       else
5252 #endif
5253
5254       /* Otherwise, if we didn't previously have a COMPARE in the
5255          correct mode, we need one.  */
5256       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
5257         {
5258           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
5259           src = SET_SRC (x);
5260         }
5261       else
5262         {
5263           /* Otherwise, update the COMPARE if needed.  */
5264           SUBST (XEXP (src, 0), op0);
5265           SUBST (XEXP (src, 1), op1);
5266         }
5267     }
5268   else
5269     {
5270       /* Get SET_SRC in a form where we have placed back any
5271          compound expressions.  Then do the checks below.  */
5272       src = make_compound_operation (src, SET);
5273       SUBST (SET_SRC (x), src);
5274     }
5275
5276   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
5277      and X being a REG or (subreg (reg)), we may be able to convert this to
5278      (set (subreg:m2 x) (op)).
5279
5280      We can always do this if M1 is narrower than M2 because that means that
5281      we only care about the low bits of the result.
5282
5283      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
5284      perform a narrower operation than requested since the high-order bits will
5285      be undefined.  On machine where it is defined, this transformation is safe
5286      as long as M1 and M2 have the same number of words.  */
5287
5288   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5289       && !OBJECT_P (SUBREG_REG (src))
5290       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
5291            / UNITS_PER_WORD)
5292           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5293                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
5294 #ifndef WORD_REGISTER_OPERATIONS
5295       && (GET_MODE_SIZE (GET_MODE (src))
5296         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5297 #endif
5298 #ifdef CANNOT_CHANGE_MODE_CLASS
5299       && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
5300             && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
5301                                          GET_MODE (SUBREG_REG (src)),
5302                                          GET_MODE (src)))
5303 #endif
5304       && (REG_P (dest)
5305           || (GET_CODE (dest) == SUBREG
5306               && REG_P (SUBREG_REG (dest)))))
5307     {
5308       SUBST (SET_DEST (x),
5309              gen_lowpart (GET_MODE (SUBREG_REG (src)),
5310                                       dest));
5311       SUBST (SET_SRC (x), SUBREG_REG (src));
5312
5313       src = SET_SRC (x), dest = SET_DEST (x);
5314     }
5315
5316 #ifdef HAVE_cc0
5317   /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
5318      in SRC.  */
5319   if (dest == cc0_rtx
5320       && GET_CODE (src) == SUBREG
5321       && subreg_lowpart_p (src)
5322       && (GET_MODE_BITSIZE (GET_MODE (src))
5323           < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
5324     {
5325       rtx inner = SUBREG_REG (src);
5326       enum machine_mode inner_mode = GET_MODE (inner);
5327
5328       /* Here we make sure that we don't have a sign bit on.  */
5329       if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
5330           && (nonzero_bits (inner, inner_mode)
5331               < ((unsigned HOST_WIDE_INT) 1
5332                  << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
5333         {
5334           SUBST (SET_SRC (x), inner);
5335           src = SET_SRC (x);
5336         }
5337     }
5338 #endif
5339
5340 #ifdef LOAD_EXTEND_OP
5341   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
5342      would require a paradoxical subreg.  Replace the subreg with a
5343      zero_extend to avoid the reload that would otherwise be required.  */
5344
5345   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5346       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != UNKNOWN
5347       && SUBREG_BYTE (src) == 0
5348       && (GET_MODE_SIZE (GET_MODE (src))
5349           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5350       && MEM_P (SUBREG_REG (src)))
5351     {
5352       SUBST (SET_SRC (x),
5353              gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
5354                             GET_MODE (src), SUBREG_REG (src)));
5355
5356       src = SET_SRC (x);
5357     }
5358 #endif
5359
5360   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
5361      are comparing an item known to be 0 or -1 against 0, use a logical
5362      operation instead. Check for one of the arms being an IOR of the other
5363      arm with some value.  We compute three terms to be IOR'ed together.  In
5364      practice, at most two will be nonzero.  Then we do the IOR's.  */
5365
5366   if (GET_CODE (dest) != PC
5367       && GET_CODE (src) == IF_THEN_ELSE
5368       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
5369       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
5370       && XEXP (XEXP (src, 0), 1) == const0_rtx
5371       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
5372 #ifdef HAVE_conditional_move
5373       && ! can_conditionally_move_p (GET_MODE (src))
5374 #endif
5375       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
5376                                GET_MODE (XEXP (XEXP (src, 0), 0)))
5377           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
5378       && ! side_effects_p (src))
5379     {
5380       rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
5381                       ? XEXP (src, 1) : XEXP (src, 2));
5382       rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
5383                    ? XEXP (src, 2) : XEXP (src, 1));
5384       rtx term1 = const0_rtx, term2, term3;
5385
5386       if (GET_CODE (true_rtx) == IOR
5387           && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
5388         term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
5389       else if (GET_CODE (true_rtx) == IOR
5390                && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
5391         term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
5392       else if (GET_CODE (false_rtx) == IOR
5393                && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
5394         term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
5395       else if (GET_CODE (false_rtx) == IOR
5396                && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
5397         term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
5398
5399       term2 = gen_binary (AND, GET_MODE (src),
5400                           XEXP (XEXP (src, 0), 0), true_rtx);
5401       term3 = gen_binary (AND, GET_MODE (src),
5402                           simplify_gen_unary (NOT, GET_MODE (src),
5403                                               XEXP (XEXP (src, 0), 0),
5404                                               GET_MODE (src)),
5405                           false_rtx);
5406
5407       SUBST (SET_SRC (x),
5408              gen_binary (IOR, GET_MODE (src),
5409                          gen_binary (IOR, GET_MODE (src), term1, term2),
5410                          term3));
5411
5412       src = SET_SRC (x);
5413     }
5414
5415   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
5416      whole thing fail.  */
5417   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
5418     return src;
5419   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
5420     return dest;
5421   else
5422     /* Convert this into a field assignment operation, if possible.  */
5423     return make_field_assignment (x);
5424 }
5425 \f
5426 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
5427    result.  */
5428
5429 static rtx
5430 simplify_logical (rtx x)
5431 {
5432   enum machine_mode mode = GET_MODE (x);
5433   rtx op0 = XEXP (x, 0);
5434   rtx op1 = XEXP (x, 1);
5435   rtx reversed;
5436
5437   switch (GET_CODE (x))
5438     {
5439     case AND:
5440       /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
5441          insn (and may simplify more).  */
5442       if (GET_CODE (op0) == XOR
5443           && rtx_equal_p (XEXP (op0, 0), op1)
5444           && ! side_effects_p (op1))
5445         x = gen_binary (AND, mode,
5446                         simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
5447                         op1);
5448
5449       if (GET_CODE (op0) == XOR
5450           && rtx_equal_p (XEXP (op0, 1), op1)
5451           && ! side_effects_p (op1))
5452         x = gen_binary (AND, mode,
5453                         simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
5454                         op1);
5455
5456       /* Similarly for (~(A ^ B)) & A.  */
5457       if (GET_CODE (op0) == NOT
5458           && GET_CODE (XEXP (op0, 0)) == XOR
5459           && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
5460           && ! side_effects_p (op1))
5461         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
5462
5463       if (GET_CODE (op0) == NOT
5464           && GET_CODE (XEXP (op0, 0)) == XOR
5465           && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
5466           && ! side_effects_p (op1))
5467         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
5468
5469       /* We can call simplify_and_const_int only if we don't lose
5470          any (sign) bits when converting INTVAL (op1) to
5471          "unsigned HOST_WIDE_INT".  */
5472       if (GET_CODE (op1) == CONST_INT
5473           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5474               || INTVAL (op1) > 0))
5475         {
5476           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
5477
5478           /* If we have (ior (and (X C1) C2)) and the next restart would be
5479              the last, simplify this by making C1 as small as possible
5480              and then exit.  Only do this if C1 actually changes: for now
5481              this only saves memory but, should this transformation be
5482              moved to simplify-rtx.c, we'd risk unbounded recursion there.  */
5483           if (GET_CODE (x) == IOR && GET_CODE (op0) == AND
5484               && GET_CODE (XEXP (op0, 1)) == CONST_INT
5485               && GET_CODE (op1) == CONST_INT
5486               && (INTVAL (XEXP (op0, 1)) & INTVAL (op1)) != 0)
5487             return gen_binary (IOR, mode,
5488                                gen_binary (AND, mode, XEXP (op0, 0),
5489                                            GEN_INT (INTVAL (XEXP (op0, 1))
5490                                                     & ~INTVAL (op1))), op1);
5491
5492           if (GET_CODE (x) != AND)
5493             return x;
5494
5495           op0 = XEXP (x, 0);
5496           op1 = XEXP (x, 1);
5497         }
5498
5499       /* Convert (A | B) & A to A.  */
5500       if (GET_CODE (op0) == IOR
5501           && (rtx_equal_p (XEXP (op0, 0), op1)
5502               || rtx_equal_p (XEXP (op0, 1), op1))
5503           && ! side_effects_p (XEXP (op0, 0))
5504           && ! side_effects_p (XEXP (op0, 1)))
5505         return op1;
5506
5507       /* In the following group of tests (and those in case IOR below),
5508          we start with some combination of logical operations and apply
5509          the distributive law followed by the inverse distributive law.
5510          Most of the time, this results in no change.  However, if some of
5511          the operands are the same or inverses of each other, simplifications
5512          will result.
5513
5514          For example, (and (ior A B) (not B)) can occur as the result of
5515          expanding a bit field assignment.  When we apply the distributive
5516          law to this, we get (ior (and (A (not B))) (and (B (not B)))),
5517          which then simplifies to (and (A (not B))).
5518
5519          If we have (and (ior A B) C), apply the distributive law and then
5520          the inverse distributive law to see if things simplify.  */
5521
5522       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
5523         {
5524           x = apply_distributive_law
5525             (gen_binary (GET_CODE (op0), mode,
5526                          gen_binary (AND, mode, XEXP (op0, 0), op1),
5527                          gen_binary (AND, mode, XEXP (op0, 1),
5528                                      copy_rtx (op1))));
5529           if (GET_CODE (x) != AND)
5530             return x;
5531         }
5532
5533       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
5534         return apply_distributive_law
5535           (gen_binary (GET_CODE (op1), mode,
5536                        gen_binary (AND, mode, XEXP (op1, 0), op0),
5537                        gen_binary (AND, mode, XEXP (op1, 1),
5538                                    copy_rtx (op0))));
5539
5540       /* Similarly, taking advantage of the fact that
5541          (and (not A) (xor B C)) == (xor (ior A B) (ior A C))  */
5542
5543       if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR)
5544         return apply_distributive_law
5545           (gen_binary (XOR, mode,
5546                        gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)),
5547                        gen_binary (IOR, mode, copy_rtx (XEXP (op0, 0)),
5548                                    XEXP (op1, 1))));
5549
5550       else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR)
5551         return apply_distributive_law
5552           (gen_binary (XOR, mode,
5553                        gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)),
5554                        gen_binary (IOR, mode, copy_rtx (XEXP (op1, 0)), XEXP (op0, 1))));
5555       break;
5556
5557     case IOR:
5558       /* (ior A C) is C if all bits of A that might be nonzero are on in C.  */
5559       if (GET_CODE (op1) == CONST_INT
5560           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5561           && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
5562         return op1;
5563
5564       /* Convert (A & B) | A to A.  */
5565       if (GET_CODE (op0) == AND
5566           && (rtx_equal_p (XEXP (op0, 0), op1)
5567               || rtx_equal_p (XEXP (op0, 1), op1))
5568           && ! side_effects_p (XEXP (op0, 0))
5569           && ! side_effects_p (XEXP (op0, 1)))
5570         return op1;
5571
5572       /* If we have (ior (and A B) C), apply the distributive law and then
5573          the inverse distributive law to see if things simplify.  */
5574
5575       if (GET_CODE (op0) == AND)
5576         {
5577           rtx tmp = apply_distributive_law
5578             (gen_binary (AND, mode,
5579                          gen_binary (IOR, mode, XEXP (op0, 0), op1),
5580                          gen_binary (IOR, mode, XEXP (op0, 1),
5581                                      copy_rtx (op1))));
5582
5583           if (GET_CODE (tmp) != IOR
5584               && rtx_cost (tmp, SET) < rtx_cost (x, SET))
5585             return tmp;
5586         }
5587
5588       if (GET_CODE (op1) == AND)
5589         {
5590           rtx tmp = apply_distributive_law
5591             (gen_binary (AND, mode,
5592                          gen_binary (IOR, mode, XEXP (op1, 0), op0),
5593                          gen_binary (IOR, mode, XEXP (op1, 1),
5594                                      copy_rtx (op0))));
5595
5596           if (GET_CODE (tmp) != IOR
5597               && rtx_cost (tmp, SET) < rtx_cost (x, SET))
5598             return tmp;
5599         }
5600
5601       /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
5602          mode size to (rotate A CX).  */
5603
5604       if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT)
5605            || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT))
5606           && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
5607           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5608           && GET_CODE (XEXP (op1, 1)) == CONST_INT
5609           && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
5610               == GET_MODE_BITSIZE (mode)))
5611         return gen_rtx_ROTATE (mode, XEXP (op0, 0),
5612                                (GET_CODE (op0) == ASHIFT
5613                                 ? XEXP (op0, 1) : XEXP (op1, 1)));
5614
5615       /* If OP0 is (ashiftrt (plus ...) C), it might actually be
5616          a (sign_extend (plus ...)).  If so, OP1 is a CONST_INT, and the PLUS
5617          does not affect any of the bits in OP1, it can really be done
5618          as a PLUS and we can associate.  We do this by seeing if OP1
5619          can be safely shifted left C bits.  */
5620       if (GET_CODE (op1) == CONST_INT && GET_CODE (op0) == ASHIFTRT
5621           && GET_CODE (XEXP (op0, 0)) == PLUS
5622           && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
5623           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5624           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT)
5625         {
5626           int count = INTVAL (XEXP (op0, 1));
5627           HOST_WIDE_INT mask = INTVAL (op1) << count;
5628
5629           if (mask >> count == INTVAL (op1)
5630               && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0)
5631             {
5632               SUBST (XEXP (XEXP (op0, 0), 1),
5633                      GEN_INT (INTVAL (XEXP (XEXP (op0, 0), 1)) | mask));
5634               return op0;
5635             }
5636         }
5637       break;
5638
5639     case XOR:
5640       /* If we are XORing two things that have no bits in common,
5641          convert them into an IOR.  This helps to detect rotation encoded
5642          using those methods and possibly other simplifications.  */
5643
5644       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5645           && (nonzero_bits (op0, mode)
5646               & nonzero_bits (op1, mode)) == 0)
5647         return (gen_binary (IOR, mode, op0, op1));
5648
5649       /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
5650          Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
5651          (NOT y).  */
5652       {
5653         int num_negated = 0;
5654
5655         if (GET_CODE (op0) == NOT)
5656           num_negated++, op0 = XEXP (op0, 0);
5657         if (GET_CODE (op1) == NOT)
5658           num_negated++, op1 = XEXP (op1, 0);
5659
5660         if (num_negated == 2)
5661           {
5662             SUBST (XEXP (x, 0), op0);
5663             SUBST (XEXP (x, 1), op1);
5664           }
5665         else if (num_negated == 1)
5666           return
5667             simplify_gen_unary (NOT, mode, gen_binary (XOR, mode, op0, op1),
5668                                 mode);
5669       }
5670
5671       /* Convert (xor (and A B) B) to (and (not A) B).  The latter may
5672          correspond to a machine insn or result in further simplifications
5673          if B is a constant.  */
5674
5675       if (GET_CODE (op0) == AND
5676           && rtx_equal_p (XEXP (op0, 1), op1)
5677           && ! side_effects_p (op1))
5678         return gen_binary (AND, mode,
5679                            simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
5680                            op1);
5681
5682       else if (GET_CODE (op0) == AND
5683                && rtx_equal_p (XEXP (op0, 0), op1)
5684                && ! side_effects_p (op1))
5685         return gen_binary (AND, mode,
5686                            simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
5687                            op1);
5688
5689       /* (xor (comparison foo bar) (const_int 1)) can become the reversed
5690          comparison if STORE_FLAG_VALUE is 1.  */
5691       if (STORE_FLAG_VALUE == 1
5692           && op1 == const1_rtx
5693           && COMPARISON_P (op0)
5694           && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5695                                               XEXP (op0, 1))))
5696         return reversed;
5697
5698       /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
5699          is (lt foo (const_int 0)), so we can perform the above
5700          simplification if STORE_FLAG_VALUE is 1.  */
5701
5702       if (STORE_FLAG_VALUE == 1
5703           && op1 == const1_rtx
5704           && GET_CODE (op0) == LSHIFTRT
5705           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5706           && INTVAL (XEXP (op0, 1)) == GET_MODE_BITSIZE (mode) - 1)
5707         return gen_rtx_GE (mode, XEXP (op0, 0), const0_rtx);
5708
5709       /* (xor (comparison foo bar) (const_int sign-bit))
5710          when STORE_FLAG_VALUE is the sign bit.  */
5711       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5712           && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5713               == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5714           && op1 == const_true_rtx
5715           && COMPARISON_P (op0)
5716           && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5717                                               XEXP (op0, 1))))
5718         return reversed;
5719
5720       break;
5721
5722     default:
5723       gcc_unreachable ();
5724     }
5725
5726   return x;
5727 }
5728 \f
5729 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
5730    operations" because they can be replaced with two more basic operations.
5731    ZERO_EXTEND is also considered "compound" because it can be replaced with
5732    an AND operation, which is simpler, though only one operation.
5733
5734    The function expand_compound_operation is called with an rtx expression
5735    and will convert it to the appropriate shifts and AND operations,
5736    simplifying at each stage.
5737
5738    The function make_compound_operation is called to convert an expression
5739    consisting of shifts and ANDs into the equivalent compound expression.
5740    It is the inverse of this function, loosely speaking.  */
5741
5742 static rtx
5743 expand_compound_operation (rtx x)
5744 {
5745   unsigned HOST_WIDE_INT pos = 0, len;
5746   int unsignedp = 0;
5747   unsigned int modewidth;
5748   rtx tem;
5749
5750   switch (GET_CODE (x))
5751     {
5752     case ZERO_EXTEND:
5753       unsignedp = 1;
5754     case SIGN_EXTEND:
5755       /* We can't necessarily use a const_int for a multiword mode;
5756          it depends on implicitly extending the value.
5757          Since we don't know the right way to extend it,
5758          we can't tell whether the implicit way is right.
5759
5760          Even for a mode that is no wider than a const_int,
5761          we can't win, because we need to sign extend one of its bits through
5762          the rest of it, and we don't know which bit.  */
5763       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
5764         return x;
5765
5766       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
5767          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
5768          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
5769          reloaded. If not for that, MEM's would very rarely be safe.
5770
5771          Reject MODEs bigger than a word, because we might not be able
5772          to reference a two-register group starting with an arbitrary register
5773          (and currently gen_lowpart might crash for a SUBREG).  */
5774
5775       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
5776         return x;
5777
5778       /* Reject MODEs that aren't scalar integers because turning vector
5779          or complex modes into shifts causes problems.  */
5780
5781       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
5782         return x;
5783
5784       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
5785       /* If the inner object has VOIDmode (the only way this can happen
5786          is if it is an ASM_OPERANDS), we can't do anything since we don't
5787          know how much masking to do.  */
5788       if (len == 0)
5789         return x;
5790
5791       break;
5792
5793     case ZERO_EXTRACT:
5794       unsignedp = 1;
5795
5796       /* ... fall through ...  */
5797
5798     case SIGN_EXTRACT:
5799       /* If the operand is a CLOBBER, just return it.  */
5800       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
5801         return XEXP (x, 0);
5802
5803       if (GET_CODE (XEXP (x, 1)) != CONST_INT
5804           || GET_CODE (XEXP (x, 2)) != CONST_INT
5805           || GET_MODE (XEXP (x, 0)) == VOIDmode)
5806         return x;
5807
5808       /* Reject MODEs that aren't scalar integers because turning vector
5809          or complex modes into shifts causes problems.  */
5810
5811       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
5812         return x;
5813
5814       len = INTVAL (XEXP (x, 1));
5815       pos = INTVAL (XEXP (x, 2));
5816
5817       /* If this goes outside the object being extracted, replace the object
5818          with a (use (mem ...)) construct that only combine understands
5819          and is used only for this purpose.  */
5820       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
5821         SUBST (XEXP (x, 0), gen_rtx_USE (GET_MODE (x), XEXP (x, 0)));
5822
5823       if (BITS_BIG_ENDIAN)
5824         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
5825
5826       break;
5827
5828     default:
5829       return x;
5830     }
5831   /* Convert sign extension to zero extension, if we know that the high
5832      bit is not set, as this is easier to optimize.  It will be converted
5833      back to cheaper alternative in make_extraction.  */
5834   if (GET_CODE (x) == SIGN_EXTEND
5835       && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5836           && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
5837                 & ~(((unsigned HOST_WIDE_INT)
5838                       GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
5839                      >> 1))
5840                == 0)))
5841     {
5842       rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
5843       rtx temp2 = expand_compound_operation (temp);
5844
5845       /* Make sure this is a profitable operation.  */
5846       if (rtx_cost (x, SET) > rtx_cost (temp2, SET))
5847        return temp2;
5848       else if (rtx_cost (x, SET) > rtx_cost (temp, SET))
5849        return temp;
5850       else
5851        return x;
5852     }
5853
5854   /* We can optimize some special cases of ZERO_EXTEND.  */
5855   if (GET_CODE (x) == ZERO_EXTEND)
5856     {
5857       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
5858          know that the last value didn't have any inappropriate bits
5859          set.  */
5860       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5861           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5862           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5863           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
5864               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5865         return XEXP (XEXP (x, 0), 0);
5866
5867       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5868       if (GET_CODE (XEXP (x, 0)) == SUBREG
5869           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5870           && subreg_lowpart_p (XEXP (x, 0))
5871           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5872           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
5873               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5874         return SUBREG_REG (XEXP (x, 0));
5875
5876       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
5877          is a comparison and STORE_FLAG_VALUE permits.  This is like
5878          the first case, but it works even when GET_MODE (x) is larger
5879          than HOST_WIDE_INT.  */
5880       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5881           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5882           && COMPARISON_P (XEXP (XEXP (x, 0), 0))
5883           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5884               <= HOST_BITS_PER_WIDE_INT)
5885           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5886               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5887         return XEXP (XEXP (x, 0), 0);
5888
5889       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5890       if (GET_CODE (XEXP (x, 0)) == SUBREG
5891           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5892           && subreg_lowpart_p (XEXP (x, 0))
5893           && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
5894           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5895               <= HOST_BITS_PER_WIDE_INT)
5896           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5897               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5898         return SUBREG_REG (XEXP (x, 0));
5899
5900     }
5901
5902   /* If we reach here, we want to return a pair of shifts.  The inner
5903      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
5904      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
5905      logical depending on the value of UNSIGNEDP.
5906
5907      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
5908      converted into an AND of a shift.
5909
5910      We must check for the case where the left shift would have a negative
5911      count.  This can happen in a case like (x >> 31) & 255 on machines
5912      that can't shift by a constant.  On those machines, we would first
5913      combine the shift with the AND to produce a variable-position
5914      extraction.  Then the constant of 31 would be substituted in to produce
5915      a such a position.  */
5916
5917   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
5918   if (modewidth + len >= pos)
5919     tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
5920                                 GET_MODE (x),
5921                                 simplify_shift_const (NULL_RTX, ASHIFT,
5922                                                       GET_MODE (x),
5923                                                       XEXP (x, 0),
5924                                                       modewidth - pos - len),
5925                                 modewidth - len);
5926
5927   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
5928     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
5929                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
5930                                                         GET_MODE (x),
5931                                                         XEXP (x, 0), pos),
5932                                   ((HOST_WIDE_INT) 1 << len) - 1);
5933   else
5934     /* Any other cases we can't handle.  */
5935     return x;
5936
5937   /* If we couldn't do this for some reason, return the original
5938      expression.  */
5939   if (GET_CODE (tem) == CLOBBER)
5940     return x;
5941
5942   return tem;
5943 }
5944 \f
5945 /* X is a SET which contains an assignment of one object into
5946    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
5947    or certain SUBREGS). If possible, convert it into a series of
5948    logical operations.
5949
5950    We half-heartedly support variable positions, but do not at all
5951    support variable lengths.  */
5952
5953 static rtx
5954 expand_field_assignment (rtx x)
5955 {
5956   rtx inner;
5957   rtx pos;                      /* Always counts from low bit.  */
5958   int len;
5959   rtx mask;
5960   enum machine_mode compute_mode;
5961
5962   /* Loop until we find something we can't simplify.  */
5963   while (1)
5964     {
5965       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
5966           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
5967         {
5968           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
5969           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
5970           pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
5971         }
5972       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
5973                && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
5974         {
5975           inner = XEXP (SET_DEST (x), 0);
5976           len = INTVAL (XEXP (SET_DEST (x), 1));
5977           pos = XEXP (SET_DEST (x), 2);
5978
5979           /* If the position is constant and spans the width of INNER,
5980              surround INNER  with a USE to indicate this.  */
5981           if (GET_CODE (pos) == CONST_INT
5982               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
5983             inner = gen_rtx_USE (GET_MODE (SET_DEST (x)), inner);
5984
5985           if (BITS_BIG_ENDIAN)
5986             {
5987               if (GET_CODE (pos) == CONST_INT)
5988                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
5989                                - INTVAL (pos));
5990               else if (GET_CODE (pos) == MINUS
5991                        && GET_CODE (XEXP (pos, 1)) == CONST_INT
5992                        && (INTVAL (XEXP (pos, 1))
5993                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
5994                 /* If position is ADJUST - X, new position is X.  */
5995                 pos = XEXP (pos, 0);
5996               else
5997                 pos = gen_binary (MINUS, GET_MODE (pos),
5998                                   GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
5999                                            - len),
6000                                   pos);
6001             }
6002         }
6003
6004       /* A SUBREG between two modes that occupy the same numbers of words
6005          can be done by moving the SUBREG to the source.  */
6006       else if (GET_CODE (SET_DEST (x)) == SUBREG
6007                /* We need SUBREGs to compute nonzero_bits properly.  */
6008                && nonzero_sign_valid
6009                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
6010                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6011                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
6012                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
6013         {
6014           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
6015                            gen_lowpart
6016                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
6017                             SET_SRC (x)));
6018           continue;
6019         }
6020       else
6021         break;
6022
6023       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6024         inner = SUBREG_REG (inner);
6025
6026       compute_mode = GET_MODE (inner);
6027
6028       /* Don't attempt bitwise arithmetic on non scalar integer modes.  */
6029       if (! SCALAR_INT_MODE_P (compute_mode))
6030         {
6031           enum machine_mode imode;
6032
6033           /* Don't do anything for vector or complex integral types.  */
6034           if (! FLOAT_MODE_P (compute_mode))
6035             break;
6036
6037           /* Try to find an integral mode to pun with.  */
6038           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
6039           if (imode == BLKmode)
6040             break;
6041
6042           compute_mode = imode;
6043           inner = gen_lowpart (imode, inner);
6044         }
6045
6046       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
6047       if (len < HOST_BITS_PER_WIDE_INT)
6048         mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
6049       else
6050         break;
6051
6052       /* Now compute the equivalent expression.  Make a copy of INNER
6053          for the SET_DEST in case it is a MEM into which we will substitute;
6054          we don't want shared RTL in that case.  */
6055       x = gen_rtx_SET
6056         (VOIDmode, copy_rtx (inner),
6057          gen_binary (IOR, compute_mode,
6058                      gen_binary (AND, compute_mode,
6059                                  simplify_gen_unary (NOT, compute_mode,
6060                                                      gen_binary (ASHIFT,
6061                                                                  compute_mode,
6062                                                                  mask, pos),
6063                                                      compute_mode),
6064                                  inner),
6065                      gen_binary (ASHIFT, compute_mode,
6066                                  gen_binary (AND, compute_mode,
6067                                              gen_lowpart
6068                                              (compute_mode, SET_SRC (x)),
6069                                              mask),
6070                                  pos)));
6071     }
6072
6073   return x;
6074 }
6075 \f
6076 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
6077    it is an RTX that represents a variable starting position; otherwise,
6078    POS is the (constant) starting bit position (counted from the LSB).
6079
6080    INNER may be a USE.  This will occur when we started with a bitfield
6081    that went outside the boundary of the object in memory, which is
6082    allowed on most machines.  To isolate this case, we produce a USE
6083    whose mode is wide enough and surround the MEM with it.  The only
6084    code that understands the USE is this routine.  If it is not removed,
6085    it will cause the resulting insn not to match.
6086
6087    UNSIGNEDP is nonzero for an unsigned reference and zero for a
6088    signed reference.
6089
6090    IN_DEST is nonzero if this is a reference in the destination of a
6091    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If nonzero,
6092    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
6093    be used.
6094
6095    IN_COMPARE is nonzero if we are in a COMPARE.  This means that a
6096    ZERO_EXTRACT should be built even for bits starting at bit 0.
6097
6098    MODE is the desired mode of the result (if IN_DEST == 0).
6099
6100    The result is an RTX for the extraction or NULL_RTX if the target
6101    can't handle it.  */
6102
6103 static rtx
6104 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
6105                  rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
6106                  int in_dest, int in_compare)
6107 {
6108   /* This mode describes the size of the storage area
6109      to fetch the overall value from.  Within that, we
6110      ignore the POS lowest bits, etc.  */
6111   enum machine_mode is_mode = GET_MODE (inner);
6112   enum machine_mode inner_mode;
6113   enum machine_mode wanted_inner_mode = byte_mode;
6114   enum machine_mode wanted_inner_reg_mode = word_mode;
6115   enum machine_mode pos_mode = word_mode;
6116   enum machine_mode extraction_mode = word_mode;
6117   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
6118   int spans_byte = 0;
6119   rtx new = 0;
6120   rtx orig_pos_rtx = pos_rtx;
6121   HOST_WIDE_INT orig_pos;
6122
6123   /* Get some information about INNER and get the innermost object.  */
6124   if (GET_CODE (inner) == USE)
6125     /* (use:SI (mem:QI foo)) stands for (mem:SI foo).  */
6126     /* We don't need to adjust the position because we set up the USE
6127        to pretend that it was a full-word object.  */
6128     spans_byte = 1, inner = XEXP (inner, 0);
6129   else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6130     {
6131       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
6132          consider just the QI as the memory to extract from.
6133          The subreg adds or removes high bits; its mode is
6134          irrelevant to the meaning of this extraction,
6135          since POS and LEN count from the lsb.  */
6136       if (MEM_P (SUBREG_REG (inner)))
6137         is_mode = GET_MODE (SUBREG_REG (inner));
6138       inner = SUBREG_REG (inner);
6139     }
6140   else if (GET_CODE (inner) == ASHIFT
6141            && GET_CODE (XEXP (inner, 1)) == CONST_INT
6142            && pos_rtx == 0 && pos == 0
6143            && len > (unsigned HOST_WIDE_INT) INTVAL (XEXP (inner, 1)))
6144     {
6145       /* We're extracting the least significant bits of an rtx
6146          (ashift X (const_int C)), where LEN > C.  Extract the
6147          least significant (LEN - C) bits of X, giving an rtx
6148          whose mode is MODE, then shift it left C times.  */
6149       new = make_extraction (mode, XEXP (inner, 0),
6150                              0, 0, len - INTVAL (XEXP (inner, 1)),
6151                              unsignedp, in_dest, in_compare);
6152       if (new != 0)
6153         return gen_rtx_ASHIFT (mode, new, XEXP (inner, 1));
6154     }
6155
6156   inner_mode = GET_MODE (inner);
6157
6158   if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
6159     pos = INTVAL (pos_rtx), pos_rtx = 0;
6160
6161   /* See if this can be done without an extraction.  We never can if the
6162      width of the field is not the same as that of some integer mode. For
6163      registers, we can only avoid the extraction if the position is at the
6164      low-order bit and this is either not in the destination or we have the
6165      appropriate STRICT_LOW_PART operation available.
6166
6167      For MEM, we can avoid an extract if the field starts on an appropriate
6168      boundary and we can change the mode of the memory reference.  However,
6169      we cannot directly access the MEM if we have a USE and the underlying
6170      MEM is not TMODE.  This combination means that MEM was being used in a
6171      context where bits outside its mode were being referenced; that is only
6172      valid in bit-field insns.  */
6173
6174   if (tmode != BLKmode
6175       && ! (spans_byte && inner_mode != tmode)
6176       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
6177            && !MEM_P (inner)
6178            && (! in_dest
6179                || (REG_P (inner)
6180                    && have_insn_for (STRICT_LOW_PART, tmode))))
6181           || (MEM_P (inner) && pos_rtx == 0
6182               && (pos
6183                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
6184                      : BITS_PER_UNIT)) == 0
6185               /* We can't do this if we are widening INNER_MODE (it
6186                  may not be aligned, for one thing).  */
6187               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
6188               && (inner_mode == tmode
6189                   || (! mode_dependent_address_p (XEXP (inner, 0))
6190                       && ! MEM_VOLATILE_P (inner))))))
6191     {
6192       /* If INNER is a MEM, make a new MEM that encompasses just the desired
6193          field.  If the original and current mode are the same, we need not
6194          adjust the offset.  Otherwise, we do if bytes big endian.
6195
6196          If INNER is not a MEM, get a piece consisting of just the field
6197          of interest (in this case POS % BITS_PER_WORD must be 0).  */
6198
6199       if (MEM_P (inner))
6200         {
6201           HOST_WIDE_INT offset;
6202
6203           /* POS counts from lsb, but make OFFSET count in memory order.  */
6204           if (BYTES_BIG_ENDIAN)
6205             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
6206           else
6207             offset = pos / BITS_PER_UNIT;
6208
6209           new = adjust_address_nv (inner, tmode, offset);
6210         }
6211       else if (REG_P (inner))
6212         {
6213           if (tmode != inner_mode)
6214             {
6215               /* We can't call gen_lowpart in a DEST since we
6216                  always want a SUBREG (see below) and it would sometimes
6217                  return a new hard register.  */
6218               if (pos || in_dest)
6219                 {
6220                   HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
6221
6222                   if (WORDS_BIG_ENDIAN
6223                       && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
6224                     final_word = ((GET_MODE_SIZE (inner_mode)
6225                                    - GET_MODE_SIZE (tmode))
6226                                   / UNITS_PER_WORD) - final_word;
6227
6228                   final_word *= UNITS_PER_WORD;
6229                   if (BYTES_BIG_ENDIAN &&
6230                       GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
6231                     final_word += (GET_MODE_SIZE (inner_mode)
6232                                    - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
6233
6234                   /* Avoid creating invalid subregs, for example when
6235                      simplifying (x>>32)&255.  */
6236                   if (final_word >= GET_MODE_SIZE (inner_mode))
6237                     return NULL_RTX;
6238
6239                   new = gen_rtx_SUBREG (tmode, inner, final_word);
6240                 }
6241               else
6242                 new = gen_lowpart (tmode, inner);
6243             }
6244           else
6245             new = inner;
6246         }
6247       else
6248         new = force_to_mode (inner, tmode,
6249                              len >= HOST_BITS_PER_WIDE_INT
6250                              ? ~(unsigned HOST_WIDE_INT) 0
6251                              : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
6252                              NULL_RTX, 0);
6253
6254       /* If this extraction is going into the destination of a SET,
6255          make a STRICT_LOW_PART unless we made a MEM.  */
6256
6257       if (in_dest)
6258         return (MEM_P (new) ? new
6259                 : (GET_CODE (new) != SUBREG
6260                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
6261                    : gen_rtx_STRICT_LOW_PART (VOIDmode, new)));
6262
6263       if (mode == tmode)
6264         return new;
6265
6266       if (GET_CODE (new) == CONST_INT)
6267         return gen_int_mode (INTVAL (new), mode);
6268
6269       /* If we know that no extraneous bits are set, and that the high
6270          bit is not set, convert the extraction to the cheaper of
6271          sign and zero extension, that are equivalent in these cases.  */
6272       if (flag_expensive_optimizations
6273           && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
6274               && ((nonzero_bits (new, tmode)
6275                    & ~(((unsigned HOST_WIDE_INT)
6276                         GET_MODE_MASK (tmode))
6277                        >> 1))
6278                   == 0)))
6279         {
6280           rtx temp = gen_rtx_ZERO_EXTEND (mode, new);
6281           rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new);
6282
6283           /* Prefer ZERO_EXTENSION, since it gives more information to
6284              backends.  */
6285           if (rtx_cost (temp, SET) <= rtx_cost (temp1, SET))
6286             return temp;
6287           return temp1;
6288         }
6289
6290       /* Otherwise, sign- or zero-extend unless we already are in the
6291          proper mode.  */
6292
6293       return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6294                              mode, new));
6295     }
6296
6297   /* Unless this is a COMPARE or we have a funny memory reference,
6298      don't do anything with zero-extending field extracts starting at
6299      the low-order bit since they are simple AND operations.  */
6300   if (pos_rtx == 0 && pos == 0 && ! in_dest
6301       && ! in_compare && ! spans_byte && unsignedp)
6302     return 0;
6303
6304   /* Unless we are allowed to span bytes or INNER is not MEM, reject this if
6305      we would be spanning bytes or if the position is not a constant and the
6306      length is not 1.  In all other cases, we would only be going outside
6307      our object in cases when an original shift would have been
6308      undefined.  */
6309   if (! spans_byte && MEM_P (inner)
6310       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6311           || (pos_rtx != 0 && len != 1)))
6312     return 0;
6313
6314   /* Get the mode to use should INNER not be a MEM, the mode for the position,
6315      and the mode for the result.  */
6316   if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
6317     {
6318       wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6319       pos_mode = mode_for_extraction (EP_insv, 2);
6320       extraction_mode = mode_for_extraction (EP_insv, 3);
6321     }
6322
6323   if (! in_dest && unsignedp
6324       && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
6325     {
6326       wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6327       pos_mode = mode_for_extraction (EP_extzv, 3);
6328       extraction_mode = mode_for_extraction (EP_extzv, 0);
6329     }
6330
6331   if (! in_dest && ! unsignedp
6332       && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
6333     {
6334       wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6335       pos_mode = mode_for_extraction (EP_extv, 3);
6336       extraction_mode = mode_for_extraction (EP_extv, 0);
6337     }
6338
6339   /* Never narrow an object, since that might not be safe.  */
6340
6341   if (mode != VOIDmode
6342       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6343     extraction_mode = mode;
6344
6345   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6346       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6347     pos_mode = GET_MODE (pos_rtx);
6348
6349   /* If this is not from memory, the desired mode is wanted_inner_reg_mode;
6350      if we have to change the mode of memory and cannot, the desired mode is
6351      EXTRACTION_MODE.  */
6352   if (!MEM_P (inner))
6353     wanted_inner_mode = wanted_inner_reg_mode;
6354   else if (inner_mode != wanted_inner_mode
6355            && (mode_dependent_address_p (XEXP (inner, 0))
6356                || MEM_VOLATILE_P (inner)))
6357     wanted_inner_mode = extraction_mode;
6358
6359   orig_pos = pos;
6360
6361   if (BITS_BIG_ENDIAN)
6362     {
6363       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6364          BITS_BIG_ENDIAN style.  If position is constant, compute new
6365          position.  Otherwise, build subtraction.
6366          Note that POS is relative to the mode of the original argument.
6367          If it's a MEM we need to recompute POS relative to that.
6368          However, if we're extracting from (or inserting into) a register,
6369          we want to recompute POS relative to wanted_inner_mode.  */
6370       int width = (MEM_P (inner)
6371                    ? GET_MODE_BITSIZE (is_mode)
6372                    : GET_MODE_BITSIZE (wanted_inner_mode));
6373
6374       if (pos_rtx == 0)
6375         pos = width - len - pos;
6376       else
6377         pos_rtx
6378           = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
6379       /* POS may be less than 0 now, but we check for that below.
6380          Note that it can only be less than 0 if !MEM_P (inner).  */
6381     }
6382
6383   /* If INNER has a wider mode, make it smaller.  If this is a constant
6384      extract, try to adjust the byte to point to the byte containing
6385      the value.  */
6386   if (wanted_inner_mode != VOIDmode
6387       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
6388       && ((MEM_P (inner)
6389            && (inner_mode == wanted_inner_mode
6390                || (! mode_dependent_address_p (XEXP (inner, 0))
6391                    && ! MEM_VOLATILE_P (inner))))))
6392     {
6393       int offset = 0;
6394
6395       /* The computations below will be correct if the machine is big
6396          endian in both bits and bytes or little endian in bits and bytes.
6397          If it is mixed, we must adjust.  */
6398
6399       /* If bytes are big endian and we had a paradoxical SUBREG, we must
6400          adjust OFFSET to compensate.  */
6401       if (BYTES_BIG_ENDIAN
6402           && ! spans_byte
6403           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6404         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
6405
6406       /* If this is a constant position, we can move to the desired byte.  */
6407       if (pos_rtx == 0)
6408         {
6409           offset += pos / BITS_PER_UNIT;
6410           pos %= GET_MODE_BITSIZE (wanted_inner_mode);
6411         }
6412
6413       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6414           && ! spans_byte
6415           && is_mode != wanted_inner_mode)
6416         offset = (GET_MODE_SIZE (is_mode)
6417                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
6418
6419       if (offset != 0 || inner_mode != wanted_inner_mode)
6420         inner = adjust_address_nv (inner, wanted_inner_mode, offset);
6421     }
6422
6423   /* If INNER is not memory, we can always get it into the proper mode.  If we
6424      are changing its mode, POS must be a constant and smaller than the size
6425      of the new mode.  */
6426   else if (!MEM_P (inner))
6427     {
6428       if (GET_MODE (inner) != wanted_inner_mode
6429           && (pos_rtx != 0
6430               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6431         return 0;
6432
6433       inner = force_to_mode (inner, wanted_inner_mode,
6434                              pos_rtx
6435                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
6436                              ? ~(unsigned HOST_WIDE_INT) 0
6437                              : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6438                                 << orig_pos),
6439                              NULL_RTX, 0);
6440     }
6441
6442   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
6443      have to zero extend.  Otherwise, we can just use a SUBREG.  */
6444   if (pos_rtx != 0
6445       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
6446     {
6447       rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
6448
6449       /* If we know that no extraneous bits are set, and that the high
6450          bit is not set, convert extraction to cheaper one - either
6451          SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6452          cases.  */
6453       if (flag_expensive_optimizations
6454           && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6455               && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
6456                    & ~(((unsigned HOST_WIDE_INT)
6457                         GET_MODE_MASK (GET_MODE (pos_rtx)))
6458                        >> 1))
6459                   == 0)))
6460         {
6461           rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
6462
6463           /* Prefer ZERO_EXTENSION, since it gives more information to
6464              backends.  */
6465           if (rtx_cost (temp1, SET) < rtx_cost (temp, SET))
6466             temp = temp1;
6467         }
6468       pos_rtx = temp;
6469     }
6470   else if (pos_rtx != 0
6471            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6472     pos_rtx = gen_lowpart (pos_mode, pos_rtx);
6473
6474   /* Make POS_RTX unless we already have it and it is correct.  If we don't
6475      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
6476      be a CONST_INT.  */
6477   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
6478     pos_rtx = orig_pos_rtx;
6479
6480   else if (pos_rtx == 0)
6481     pos_rtx = GEN_INT (pos);
6482
6483   /* Make the required operation.  See if we can use existing rtx.  */
6484   new = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
6485                          extraction_mode, inner, GEN_INT (len), pos_rtx);
6486   if (! in_dest)
6487     new = gen_lowpart (mode, new);
6488
6489   return new;
6490 }
6491 \f
6492 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
6493    with any other operations in X.  Return X without that shift if so.  */
6494
6495 static rtx
6496 extract_left_shift (rtx x, int count)
6497 {
6498   enum rtx_code code = GET_CODE (x);
6499   enum machine_mode mode = GET_MODE (x);
6500   rtx tem;
6501
6502   switch (code)
6503     {
6504     case ASHIFT:
6505       /* This is the shift itself.  If it is wide enough, we will return
6506          either the value being shifted if the shift count is equal to
6507          COUNT or a shift for the difference.  */
6508       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6509           && INTVAL (XEXP (x, 1)) >= count)
6510         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
6511                                      INTVAL (XEXP (x, 1)) - count);
6512       break;
6513
6514     case NEG:  case NOT:
6515       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6516         return simplify_gen_unary (code, mode, tem, mode);
6517
6518       break;
6519
6520     case PLUS:  case IOR:  case XOR:  case AND:
6521       /* If we can safely shift this constant and we find the inner shift,
6522          make a new operation.  */
6523       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6524           && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
6525           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6526         return gen_binary (code, mode, tem,
6527                            GEN_INT (INTVAL (XEXP (x, 1)) >> count));
6528
6529       break;
6530
6531     default:
6532       break;
6533     }
6534
6535   return 0;
6536 }
6537 \f
6538 /* Look at the expression rooted at X.  Look for expressions
6539    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
6540    Form these expressions.
6541
6542    Return the new rtx, usually just X.
6543
6544    Also, for machines like the VAX that don't have logical shift insns,
6545    try to convert logical to arithmetic shift operations in cases where
6546    they are equivalent.  This undoes the canonicalizations to logical
6547    shifts done elsewhere.
6548
6549    We try, as much as possible, to re-use rtl expressions to save memory.
6550
6551    IN_CODE says what kind of expression we are processing.  Normally, it is
6552    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
6553    being kludges), it is MEM.  When processing the arguments of a comparison
6554    or a COMPARE against zero, it is COMPARE.  */
6555
6556 static rtx
6557 make_compound_operation (rtx x, enum rtx_code in_code)
6558 {
6559   enum rtx_code code = GET_CODE (x);
6560   enum machine_mode mode = GET_MODE (x);
6561   int mode_width = GET_MODE_BITSIZE (mode);
6562   rtx rhs, lhs;
6563   enum rtx_code next_code;
6564   int i;
6565   rtx new = 0;
6566   rtx tem;
6567   const char *fmt;
6568
6569   /* Select the code to be used in recursive calls.  Once we are inside an
6570      address, we stay there.  If we have a comparison, set to COMPARE,
6571      but once inside, go back to our default of SET.  */
6572
6573   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
6574                : ((code == COMPARE || COMPARISON_P (x))
6575                   && XEXP (x, 1) == const0_rtx) ? COMPARE
6576                : in_code == COMPARE ? SET : in_code);
6577
6578   /* Process depending on the code of this operation.  If NEW is set
6579      nonzero, it will be returned.  */
6580
6581   switch (code)
6582     {
6583     case ASHIFT:
6584       /* Convert shifts by constants into multiplications if inside
6585          an address.  */
6586       if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
6587           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6588           && INTVAL (XEXP (x, 1)) >= 0)
6589         {
6590           new = make_compound_operation (XEXP (x, 0), next_code);
6591           new = gen_rtx_MULT (mode, new,
6592                               GEN_INT ((HOST_WIDE_INT) 1
6593                                        << INTVAL (XEXP (x, 1))));
6594         }
6595       break;
6596
6597     case AND:
6598       /* If the second operand is not a constant, we can't do anything
6599          with it.  */
6600       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6601         break;
6602
6603       /* If the constant is a power of two minus one and the first operand
6604          is a logical right shift, make an extraction.  */
6605       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6606           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6607         {
6608           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6609           new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1,
6610                                  0, in_code == COMPARE);
6611         }
6612
6613       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
6614       else if (GET_CODE (XEXP (x, 0)) == SUBREG
6615                && subreg_lowpart_p (XEXP (x, 0))
6616                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
6617                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6618         {
6619           new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
6620                                          next_code);
6621           new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0,
6622                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
6623                                  0, in_code == COMPARE);
6624         }
6625       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
6626       else if ((GET_CODE (XEXP (x, 0)) == XOR
6627                 || GET_CODE (XEXP (x, 0)) == IOR)
6628                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
6629                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
6630                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6631         {
6632           /* Apply the distributive law, and then try to make extractions.  */
6633           new = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
6634                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
6635                                              XEXP (x, 1)),
6636                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
6637                                              XEXP (x, 1)));
6638           new = make_compound_operation (new, in_code);
6639         }
6640
6641       /* If we are have (and (rotate X C) M) and C is larger than the number
6642          of bits in M, this is an extraction.  */
6643
6644       else if (GET_CODE (XEXP (x, 0)) == ROTATE
6645                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6646                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
6647                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
6648         {
6649           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6650           new = make_extraction (mode, new,
6651                                  (GET_MODE_BITSIZE (mode)
6652                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
6653                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
6654         }
6655
6656       /* On machines without logical shifts, if the operand of the AND is
6657          a logical shift and our mask turns off all the propagated sign
6658          bits, we can replace the logical shift with an arithmetic shift.  */
6659       else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6660                && !have_insn_for (LSHIFTRT, mode)
6661                && have_insn_for (ASHIFTRT, mode)
6662                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6663                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6664                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6665                && mode_width <= HOST_BITS_PER_WIDE_INT)
6666         {
6667           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
6668
6669           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
6670           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
6671             SUBST (XEXP (x, 0),
6672                    gen_rtx_ASHIFTRT (mode,
6673                                      make_compound_operation
6674                                      (XEXP (XEXP (x, 0), 0), next_code),
6675                                      XEXP (XEXP (x, 0), 1)));
6676         }
6677
6678       /* If the constant is one less than a power of two, this might be
6679          representable by an extraction even if no shift is present.
6680          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
6681          we are in a COMPARE.  */
6682       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6683         new = make_extraction (mode,
6684                                make_compound_operation (XEXP (x, 0),
6685                                                         next_code),
6686                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
6687
6688       /* If we are in a comparison and this is an AND with a power of two,
6689          convert this into the appropriate bit extract.  */
6690       else if (in_code == COMPARE
6691                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
6692         new = make_extraction (mode,
6693                                make_compound_operation (XEXP (x, 0),
6694                                                         next_code),
6695                                i, NULL_RTX, 1, 1, 0, 1);
6696
6697       break;
6698
6699     case LSHIFTRT:
6700       /* If the sign bit is known to be zero, replace this with an
6701          arithmetic shift.  */
6702       if (have_insn_for (ASHIFTRT, mode)
6703           && ! have_insn_for (LSHIFTRT, mode)
6704           && mode_width <= HOST_BITS_PER_WIDE_INT
6705           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
6706         {
6707           new = gen_rtx_ASHIFTRT (mode,
6708                                   make_compound_operation (XEXP (x, 0),
6709                                                            next_code),
6710                                   XEXP (x, 1));
6711           break;
6712         }
6713
6714       /* ... fall through ...  */
6715
6716     case ASHIFTRT:
6717       lhs = XEXP (x, 0);
6718       rhs = XEXP (x, 1);
6719
6720       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
6721          this is a SIGN_EXTRACT.  */
6722       if (GET_CODE (rhs) == CONST_INT
6723           && GET_CODE (lhs) == ASHIFT
6724           && GET_CODE (XEXP (lhs, 1)) == CONST_INT
6725           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)))
6726         {
6727           new = make_compound_operation (XEXP (lhs, 0), next_code);
6728           new = make_extraction (mode, new,
6729                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
6730                                  NULL_RTX, mode_width - INTVAL (rhs),
6731                                  code == LSHIFTRT, 0, in_code == COMPARE);
6732           break;
6733         }
6734
6735       /* See if we have operations between an ASHIFTRT and an ASHIFT.
6736          If so, try to merge the shifts into a SIGN_EXTEND.  We could
6737          also do this for some cases of SIGN_EXTRACT, but it doesn't
6738          seem worth the effort; the case checked for occurs on Alpha.  */
6739
6740       if (!OBJECT_P (lhs)
6741           && ! (GET_CODE (lhs) == SUBREG
6742                 && (OBJECT_P (SUBREG_REG (lhs))))
6743           && GET_CODE (rhs) == CONST_INT
6744           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
6745           && (new = extract_left_shift (lhs, INTVAL (rhs))) != 0)
6746         new = make_extraction (mode, make_compound_operation (new, next_code),
6747                                0, NULL_RTX, mode_width - INTVAL (rhs),
6748                                code == LSHIFTRT, 0, in_code == COMPARE);
6749
6750       break;
6751
6752     case SUBREG:
6753       /* Call ourselves recursively on the inner expression.  If we are
6754          narrowing the object and it has a different RTL code from
6755          what it originally did, do this SUBREG as a force_to_mode.  */
6756
6757       tem = make_compound_operation (SUBREG_REG (x), in_code);
6758       if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
6759           && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
6760           && subreg_lowpart_p (x))
6761         {
6762           rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
6763                                      NULL_RTX, 0);
6764
6765           /* If we have something other than a SUBREG, we might have
6766              done an expansion, so rerun ourselves.  */
6767           if (GET_CODE (newer) != SUBREG)
6768             newer = make_compound_operation (newer, in_code);
6769
6770           return newer;
6771         }
6772
6773       /* If this is a paradoxical subreg, and the new code is a sign or
6774          zero extension, omit the subreg and widen the extension.  If it
6775          is a regular subreg, we can still get rid of the subreg by not
6776          widening so much, or in fact removing the extension entirely.  */
6777       if ((GET_CODE (tem) == SIGN_EXTEND
6778            || GET_CODE (tem) == ZERO_EXTEND)
6779           && subreg_lowpart_p (x))
6780         {
6781           if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
6782               || (GET_MODE_SIZE (mode) >
6783                   GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
6784             {
6785               if (! SCALAR_INT_MODE_P (mode))
6786                 break;
6787               tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0));
6788             }
6789           else
6790             tem = gen_lowpart (mode, XEXP (tem, 0));
6791           return tem;
6792         }
6793       break;
6794
6795     default:
6796       break;
6797     }
6798
6799   if (new)
6800     {
6801       x = gen_lowpart (mode, new);
6802       code = GET_CODE (x);
6803     }
6804
6805   /* Now recursively process each operand of this operation.  */
6806   fmt = GET_RTX_FORMAT (code);
6807   for (i = 0; i < GET_RTX_LENGTH (code); i++)
6808     if (fmt[i] == 'e')
6809       {
6810         new = make_compound_operation (XEXP (x, i), next_code);
6811         SUBST (XEXP (x, i), new);
6812       }
6813
6814   return x;
6815 }
6816 \f
6817 /* Given M see if it is a value that would select a field of bits
6818    within an item, but not the entire word.  Return -1 if not.
6819    Otherwise, return the starting position of the field, where 0 is the
6820    low-order bit.
6821
6822    *PLEN is set to the length of the field.  */
6823
6824 static int
6825 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
6826 {
6827   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
6828   int pos = exact_log2 (m & -m);
6829   int len = 0;
6830
6831   if (pos >= 0)
6832     /* Now shift off the low-order zero bits and see if we have a
6833        power of two minus 1.  */
6834     len = exact_log2 ((m >> pos) + 1);
6835
6836   if (len <= 0)
6837     pos = -1;
6838
6839   *plen = len;
6840   return pos;
6841 }
6842 \f
6843 /* See if X can be simplified knowing that we will only refer to it in
6844    MODE and will only refer to those bits that are nonzero in MASK.
6845    If other bits are being computed or if masking operations are done
6846    that select a superset of the bits in MASK, they can sometimes be
6847    ignored.
6848
6849    Return a possibly simplified expression, but always convert X to
6850    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
6851
6852    Also, if REG is nonzero and X is a register equal in value to REG,
6853    replace X with REG.
6854
6855    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
6856    are all off in X.  This is used when X will be complemented, by either
6857    NOT, NEG, or XOR.  */
6858
6859 static rtx
6860 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
6861                rtx reg, int just_select)
6862 {
6863   enum rtx_code code = GET_CODE (x);
6864   int next_select = just_select || code == XOR || code == NOT || code == NEG;
6865   enum machine_mode op_mode;
6866   unsigned HOST_WIDE_INT fuller_mask, nonzero;
6867   rtx op0, op1, temp;
6868
6869   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
6870      code below will do the wrong thing since the mode of such an
6871      expression is VOIDmode.
6872
6873      Also do nothing if X is a CLOBBER; this can happen if X was
6874      the return value from a call to gen_lowpart.  */
6875   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
6876     return x;
6877
6878   /* We want to perform the operation is its present mode unless we know
6879      that the operation is valid in MODE, in which case we do the operation
6880      in MODE.  */
6881   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
6882               && have_insn_for (code, mode))
6883              ? mode : GET_MODE (x));
6884
6885   /* It is not valid to do a right-shift in a narrower mode
6886      than the one it came in with.  */
6887   if ((code == LSHIFTRT || code == ASHIFTRT)
6888       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
6889     op_mode = GET_MODE (x);
6890
6891   /* Truncate MASK to fit OP_MODE.  */
6892   if (op_mode)
6893     mask &= GET_MODE_MASK (op_mode);
6894
6895   /* When we have an arithmetic operation, or a shift whose count we
6896      do not know, we need to assume that all bits up to the highest-order
6897      bit in MASK will be needed.  This is how we form such a mask.  */
6898   if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
6899     fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
6900   else
6901     fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
6902                    - 1);
6903
6904   /* Determine what bits of X are guaranteed to be (non)zero.  */
6905   nonzero = nonzero_bits (x, mode);
6906
6907   /* If none of the bits in X are needed, return a zero.  */
6908   if (! just_select && (nonzero & mask) == 0)
6909     x = const0_rtx;
6910
6911   /* If X is a CONST_INT, return a new one.  Do this here since the
6912      test below will fail.  */
6913   if (GET_CODE (x) == CONST_INT)
6914     {
6915       if (SCALAR_INT_MODE_P (mode))
6916         return gen_int_mode (INTVAL (x) & mask, mode);
6917       else
6918         {
6919           x = GEN_INT (INTVAL (x) & mask);
6920           return gen_lowpart_common (mode, x);
6921         }
6922     }
6923
6924   /* If X is narrower than MODE and we want all the bits in X's mode, just
6925      get X in the proper mode.  */
6926   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
6927       && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
6928     return gen_lowpart (mode, x);
6929
6930   switch (code)
6931     {
6932     case CLOBBER:
6933       /* If X is a (clobber (const_int)), return it since we know we are
6934          generating something that won't match.  */
6935       return x;
6936
6937     case USE:
6938       /* X is a (use (mem ..)) that was made from a bit-field extraction that
6939          spanned the boundary of the MEM.  If we are now masking so it is
6940          within that boundary, we don't need the USE any more.  */
6941       if (! BITS_BIG_ENDIAN
6942           && (mask & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6943         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6944       break;
6945
6946     case SIGN_EXTEND:
6947     case ZERO_EXTEND:
6948     case ZERO_EXTRACT:
6949     case SIGN_EXTRACT:
6950       x = expand_compound_operation (x);
6951       if (GET_CODE (x) != code)
6952         return force_to_mode (x, mode, mask, reg, next_select);
6953       break;
6954
6955     case REG:
6956       if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
6957                        || rtx_equal_p (reg, get_last_value (x))))
6958         x = reg;
6959       break;
6960
6961     case SUBREG:
6962       if (subreg_lowpart_p (x)
6963           /* We can ignore the effect of this SUBREG if it narrows the mode or
6964              if the constant masks to zero all the bits the mode doesn't
6965              have.  */
6966           && ((GET_MODE_SIZE (GET_MODE (x))
6967                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
6968               || (0 == (mask
6969                         & GET_MODE_MASK (GET_MODE (x))
6970                         & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
6971         return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select);
6972       break;
6973
6974     case AND:
6975       /* If this is an AND with a constant, convert it into an AND
6976          whose constant is the AND of that constant with MASK.  If it
6977          remains an AND of MASK, delete it since it is redundant.  */
6978
6979       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6980         {
6981           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
6982                                       mask & INTVAL (XEXP (x, 1)));
6983
6984           /* If X is still an AND, see if it is an AND with a mask that
6985              is just some low-order bits.  If so, and it is MASK, we don't
6986              need it.  */
6987
6988           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6989               && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
6990                   == mask))
6991             x = XEXP (x, 0);
6992
6993           /* If it remains an AND, try making another AND with the bits
6994              in the mode mask that aren't in MASK turned on.  If the
6995              constant in the AND is wide enough, this might make a
6996              cheaper constant.  */
6997
6998           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6999               && GET_MODE_MASK (GET_MODE (x)) != mask
7000               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
7001             {
7002               HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
7003                                     | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
7004               int width = GET_MODE_BITSIZE (GET_MODE (x));
7005               rtx y;
7006
7007               /* If MODE is narrower than HOST_WIDE_INT and CVAL is a negative
7008                  number, sign extend it.  */
7009               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
7010                   && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7011                 cval |= (HOST_WIDE_INT) -1 << width;
7012
7013               y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval));
7014               if (rtx_cost (y, SET) < rtx_cost (x, SET))
7015                 x = y;
7016             }
7017
7018           break;
7019         }
7020
7021       goto binop;
7022
7023     case PLUS:
7024       /* In (and (plus FOO C1) M), if M is a mask that just turns off
7025          low-order bits (as in an alignment operation) and FOO is already
7026          aligned to that boundary, mask C1 to that boundary as well.
7027          This may eliminate that PLUS and, later, the AND.  */
7028
7029       {
7030         unsigned int width = GET_MODE_BITSIZE (mode);
7031         unsigned HOST_WIDE_INT smask = mask;
7032
7033         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
7034            number, sign extend it.  */
7035
7036         if (width < HOST_BITS_PER_WIDE_INT
7037             && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7038           smask |= (HOST_WIDE_INT) -1 << width;
7039
7040         if (GET_CODE (XEXP (x, 1)) == CONST_INT
7041             && exact_log2 (- smask) >= 0
7042             && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
7043             && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
7044           return force_to_mode (plus_constant (XEXP (x, 0),
7045                                                (INTVAL (XEXP (x, 1)) & smask)),
7046                                 mode, smask, reg, next_select);
7047       }
7048
7049       /* ... fall through ...  */
7050
7051     case MULT:
7052       /* For PLUS, MINUS and MULT, we need any bits less significant than the
7053          most significant bit in MASK since carries from those bits will
7054          affect the bits we are interested in.  */
7055       mask = fuller_mask;
7056       goto binop;
7057
7058     case MINUS:
7059       /* If X is (minus C Y) where C's least set bit is larger than any bit
7060          in the mask, then we may replace with (neg Y).  */
7061       if (GET_CODE (XEXP (x, 0)) == CONST_INT
7062           && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
7063                                         & -INTVAL (XEXP (x, 0))))
7064               > mask))
7065         {
7066           x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
7067                                   GET_MODE (x));
7068           return force_to_mode (x, mode, mask, reg, next_select);
7069         }
7070
7071       /* Similarly, if C contains every bit in the fuller_mask, then we may
7072          replace with (not Y).  */
7073       if (GET_CODE (XEXP (x, 0)) == CONST_INT
7074           && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) fuller_mask)
7075               == INTVAL (XEXP (x, 0))))
7076         {
7077           x = simplify_gen_unary (NOT, GET_MODE (x),
7078                                   XEXP (x, 1), GET_MODE (x));
7079           return force_to_mode (x, mode, mask, reg, next_select);
7080         }
7081
7082       mask = fuller_mask;
7083       goto binop;
7084
7085     case IOR:
7086     case XOR:
7087       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
7088          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
7089          operation which may be a bitfield extraction.  Ensure that the
7090          constant we form is not wider than the mode of X.  */
7091
7092       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7093           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7094           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7095           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7096           && GET_CODE (XEXP (x, 1)) == CONST_INT
7097           && ((INTVAL (XEXP (XEXP (x, 0), 1))
7098                + floor_log2 (INTVAL (XEXP (x, 1))))
7099               < GET_MODE_BITSIZE (GET_MODE (x)))
7100           && (INTVAL (XEXP (x, 1))
7101               & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
7102         {
7103           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
7104                           << INTVAL (XEXP (XEXP (x, 0), 1)));
7105           temp = gen_binary (GET_CODE (x), GET_MODE (x),
7106                              XEXP (XEXP (x, 0), 0), temp);
7107           x = gen_binary (LSHIFTRT, GET_MODE (x), temp,
7108                           XEXP (XEXP (x, 0), 1));
7109           return force_to_mode (x, mode, mask, reg, next_select);
7110         }
7111
7112     binop:
7113       /* For most binary operations, just propagate into the operation and
7114          change the mode if we have an operation of that mode.  */
7115
7116       op0 = gen_lowpart (op_mode,
7117                          force_to_mode (XEXP (x, 0), mode, mask,
7118                                         reg, next_select));
7119       op1 = gen_lowpart (op_mode,
7120                          force_to_mode (XEXP (x, 1), mode, mask,
7121                                         reg, next_select));
7122
7123       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7124         x = gen_binary (code, op_mode, op0, op1);
7125       break;
7126
7127     case ASHIFT:
7128       /* For left shifts, do the same, but just for the first operand.
7129          However, we cannot do anything with shifts where we cannot
7130          guarantee that the counts are smaller than the size of the mode
7131          because such a count will have a different meaning in a
7132          wider mode.  */
7133
7134       if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
7135              && INTVAL (XEXP (x, 1)) >= 0
7136              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
7137           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
7138                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
7139                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
7140         break;
7141
7142       /* If the shift count is a constant and we can do arithmetic in
7143          the mode of the shift, refine which bits we need.  Otherwise, use the
7144          conservative form of the mask.  */
7145       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7146           && INTVAL (XEXP (x, 1)) >= 0
7147           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
7148           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7149         mask >>= INTVAL (XEXP (x, 1));
7150       else
7151         mask = fuller_mask;
7152
7153       op0 = gen_lowpart (op_mode,
7154                          force_to_mode (XEXP (x, 0), op_mode,
7155                                         mask, reg, next_select));
7156
7157       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7158         x = gen_binary (code, op_mode, op0, XEXP (x, 1));
7159       break;
7160
7161     case LSHIFTRT:
7162       /* Here we can only do something if the shift count is a constant,
7163          this shift constant is valid for the host, and we can do arithmetic
7164          in OP_MODE.  */
7165
7166       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7167           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7168           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7169         {
7170           rtx inner = XEXP (x, 0);
7171           unsigned HOST_WIDE_INT inner_mask;
7172
7173           /* Select the mask of the bits we need for the shift operand.  */
7174           inner_mask = mask << INTVAL (XEXP (x, 1));
7175
7176           /* We can only change the mode of the shift if we can do arithmetic
7177              in the mode of the shift and INNER_MASK is no wider than the
7178              width of X's mode.  */
7179           if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
7180             op_mode = GET_MODE (x);
7181
7182           inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
7183
7184           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
7185             x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
7186         }
7187
7188       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
7189          shift and AND produces only copies of the sign bit (C2 is one less
7190          than a power of two), we can do this with just a shift.  */
7191
7192       if (GET_CODE (x) == LSHIFTRT
7193           && GET_CODE (XEXP (x, 1)) == CONST_INT
7194           /* The shift puts one of the sign bit copies in the least significant
7195              bit.  */
7196           && ((INTVAL (XEXP (x, 1))
7197                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
7198               >= GET_MODE_BITSIZE (GET_MODE (x)))
7199           && exact_log2 (mask + 1) >= 0
7200           /* Number of bits left after the shift must be more than the mask
7201              needs.  */
7202           && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
7203               <= GET_MODE_BITSIZE (GET_MODE (x)))
7204           /* Must be more sign bit copies than the mask needs.  */
7205           && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
7206               >= exact_log2 (mask + 1)))
7207         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7208                         GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
7209                                  - exact_log2 (mask + 1)));
7210
7211       goto shiftrt;
7212
7213     case ASHIFTRT:
7214       /* If we are just looking for the sign bit, we don't need this shift at
7215          all, even if it has a variable count.  */
7216       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7217           && (mask == ((unsigned HOST_WIDE_INT) 1
7218                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7219         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7220
7221       /* If this is a shift by a constant, get a mask that contains those bits
7222          that are not copies of the sign bit.  We then have two cases:  If
7223          MASK only includes those bits, this can be a logical shift, which may
7224          allow simplifications.  If MASK is a single-bit field not within
7225          those bits, we are requesting a copy of the sign bit and hence can
7226          shift the sign bit to the appropriate location.  */
7227
7228       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0
7229           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7230         {
7231           int i = -1;
7232
7233           /* If the considered data is wider than HOST_WIDE_INT, we can't
7234              represent a mask for all its bits in a single scalar.
7235              But we only care about the lower bits, so calculate these.  */
7236
7237           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
7238             {
7239               nonzero = ~(HOST_WIDE_INT) 0;
7240
7241               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7242                  is the number of bits a full-width mask would have set.
7243                  We need only shift if these are fewer than nonzero can
7244                  hold.  If not, we must keep all bits set in nonzero.  */
7245
7246               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7247                   < HOST_BITS_PER_WIDE_INT)
7248                 nonzero >>= INTVAL (XEXP (x, 1))
7249                             + HOST_BITS_PER_WIDE_INT
7250                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
7251             }
7252           else
7253             {
7254               nonzero = GET_MODE_MASK (GET_MODE (x));
7255               nonzero >>= INTVAL (XEXP (x, 1));
7256             }
7257
7258           if ((mask & ~nonzero) == 0
7259               || (i = exact_log2 (mask)) >= 0)
7260             {
7261               x = simplify_shift_const
7262                 (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7263                  i < 0 ? INTVAL (XEXP (x, 1))
7264                  : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
7265
7266               if (GET_CODE (x) != ASHIFTRT)
7267                 return force_to_mode (x, mode, mask, reg, next_select);
7268             }
7269         }
7270
7271       /* If MASK is 1, convert this to an LSHIFTRT.  This can be done
7272          even if the shift count isn't a constant.  */
7273       if (mask == 1)
7274         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1));
7275
7276     shiftrt:
7277
7278       /* If this is a zero- or sign-extension operation that just affects bits
7279          we don't care about, remove it.  Be sure the call above returned
7280          something that is still a shift.  */
7281
7282       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
7283           && GET_CODE (XEXP (x, 1)) == CONST_INT
7284           && INTVAL (XEXP (x, 1)) >= 0
7285           && (INTVAL (XEXP (x, 1))
7286               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
7287           && GET_CODE (XEXP (x, 0)) == ASHIFT
7288           && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
7289         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
7290                               reg, next_select);
7291
7292       break;
7293
7294     case ROTATE:
7295     case ROTATERT:
7296       /* If the shift count is constant and we can do computations
7297          in the mode of X, compute where the bits we care about are.
7298          Otherwise, we can't do anything.  Don't change the mode of
7299          the shift or propagate MODE into the shift, though.  */
7300       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7301           && INTVAL (XEXP (x, 1)) >= 0)
7302         {
7303           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
7304                                             GET_MODE (x), GEN_INT (mask),
7305                                             XEXP (x, 1));
7306           if (temp && GET_CODE (temp) == CONST_INT)
7307             SUBST (XEXP (x, 0),
7308                    force_to_mode (XEXP (x, 0), GET_MODE (x),
7309                                   INTVAL (temp), reg, next_select));
7310         }
7311       break;
7312
7313     case NEG:
7314       /* If we just want the low-order bit, the NEG isn't needed since it
7315          won't change the low-order bit.  */
7316       if (mask == 1)
7317         return force_to_mode (XEXP (x, 0), mode, mask, reg, just_select);
7318
7319       /* We need any bits less significant than the most significant bit in
7320          MASK since carries from those bits will affect the bits we are
7321          interested in.  */
7322       mask = fuller_mask;
7323       goto unop;
7324
7325     case NOT:
7326       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
7327          same as the XOR case above.  Ensure that the constant we form is not
7328          wider than the mode of X.  */
7329
7330       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7331           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7332           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7333           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
7334               < GET_MODE_BITSIZE (GET_MODE (x)))
7335           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
7336         {
7337           temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
7338                                GET_MODE (x));
7339           temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp);
7340           x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1));
7341
7342           return force_to_mode (x, mode, mask, reg, next_select);
7343         }
7344
7345       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
7346          use the full mask inside the NOT.  */
7347       mask = fuller_mask;
7348
7349     unop:
7350       op0 = gen_lowpart (op_mode,
7351                          force_to_mode (XEXP (x, 0), mode, mask,
7352                                         reg, next_select));
7353       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7354         x = simplify_gen_unary (code, op_mode, op0, op_mode);
7355       break;
7356
7357     case NE:
7358       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
7359          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
7360          which is equal to STORE_FLAG_VALUE.  */
7361       if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
7362           && GET_MODE (XEXP (x, 0)) == mode
7363           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
7364           && (nonzero_bits (XEXP (x, 0), mode)
7365               == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
7366         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7367
7368       break;
7369
7370     case IF_THEN_ELSE:
7371       /* We have no way of knowing if the IF_THEN_ELSE can itself be
7372          written in a narrower mode.  We play it safe and do not do so.  */
7373
7374       SUBST (XEXP (x, 1),
7375              gen_lowpart (GET_MODE (x),
7376                                       force_to_mode (XEXP (x, 1), mode,
7377                                                      mask, reg, next_select)));
7378       SUBST (XEXP (x, 2),
7379              gen_lowpart (GET_MODE (x),
7380                                       force_to_mode (XEXP (x, 2), mode,
7381                                                      mask, reg, next_select)));
7382       break;
7383
7384     default:
7385       break;
7386     }
7387
7388   /* Ensure we return a value of the proper mode.  */
7389   return gen_lowpart (mode, x);
7390 }
7391 \f
7392 /* Return nonzero if X is an expression that has one of two values depending on
7393    whether some other value is zero or nonzero.  In that case, we return the
7394    value that is being tested, *PTRUE is set to the value if the rtx being
7395    returned has a nonzero value, and *PFALSE is set to the other alternative.
7396
7397    If we return zero, we set *PTRUE and *PFALSE to X.  */
7398
7399 static rtx
7400 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
7401 {
7402   enum machine_mode mode = GET_MODE (x);
7403   enum rtx_code code = GET_CODE (x);
7404   rtx cond0, cond1, true0, true1, false0, false1;
7405   unsigned HOST_WIDE_INT nz;
7406
7407   /* If we are comparing a value against zero, we are done.  */
7408   if ((code == NE || code == EQ)
7409       && XEXP (x, 1) == const0_rtx)
7410     {
7411       *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
7412       *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
7413       return XEXP (x, 0);
7414     }
7415
7416   /* If this is a unary operation whose operand has one of two values, apply
7417      our opcode to compute those values.  */
7418   else if (UNARY_P (x)
7419            && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
7420     {
7421       *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
7422       *pfalse = simplify_gen_unary (code, mode, false0,
7423                                     GET_MODE (XEXP (x, 0)));
7424       return cond0;
7425     }
7426
7427   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
7428      make can't possibly match and would suppress other optimizations.  */
7429   else if (code == COMPARE)
7430     ;
7431
7432   /* If this is a binary operation, see if either side has only one of two
7433      values.  If either one does or if both do and they are conditional on
7434      the same value, compute the new true and false values.  */
7435   else if (BINARY_P (x))
7436     {
7437       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
7438       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
7439
7440       if ((cond0 != 0 || cond1 != 0)
7441           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
7442         {
7443           /* If if_then_else_cond returned zero, then true/false are the
7444              same rtl.  We must copy one of them to prevent invalid rtl
7445              sharing.  */
7446           if (cond0 == 0)
7447             true0 = copy_rtx (true0);
7448           else if (cond1 == 0)
7449             true1 = copy_rtx (true1);
7450
7451           *ptrue = gen_binary (code, mode, true0, true1);
7452           *pfalse = gen_binary (code, mode, false0, false1);
7453           return cond0 ? cond0 : cond1;
7454         }
7455
7456       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
7457          operands is zero when the other is nonzero, and vice-versa,
7458          and STORE_FLAG_VALUE is 1 or -1.  */
7459
7460       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7461           && (code == PLUS || code == IOR || code == XOR || code == MINUS
7462               || code == UMAX)
7463           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7464         {
7465           rtx op0 = XEXP (XEXP (x, 0), 1);
7466           rtx op1 = XEXP (XEXP (x, 1), 1);
7467
7468           cond0 = XEXP (XEXP (x, 0), 0);
7469           cond1 = XEXP (XEXP (x, 1), 0);
7470
7471           if (COMPARISON_P (cond0)
7472               && COMPARISON_P (cond1)
7473               && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
7474                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7475                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7476                   || ((swap_condition (GET_CODE (cond0))
7477                        == combine_reversed_comparison_code (cond1))
7478                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7479                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7480               && ! side_effects_p (x))
7481             {
7482               *ptrue = gen_binary (MULT, mode, op0, const_true_rtx);
7483               *pfalse = gen_binary (MULT, mode,
7484                                     (code == MINUS
7485                                      ? simplify_gen_unary (NEG, mode, op1,
7486                                                            mode)
7487                                      : op1),
7488                                     const_true_rtx);
7489               return cond0;
7490             }
7491         }
7492
7493       /* Similarly for MULT, AND and UMIN, except that for these the result
7494          is always zero.  */
7495       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7496           && (code == MULT || code == AND || code == UMIN)
7497           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7498         {
7499           cond0 = XEXP (XEXP (x, 0), 0);
7500           cond1 = XEXP (XEXP (x, 1), 0);
7501
7502           if (COMPARISON_P (cond0)
7503               && COMPARISON_P (cond1)
7504               && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
7505                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7506                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7507                   || ((swap_condition (GET_CODE (cond0))
7508                        == combine_reversed_comparison_code (cond1))
7509                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7510                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7511               && ! side_effects_p (x))
7512             {
7513               *ptrue = *pfalse = const0_rtx;
7514               return cond0;
7515             }
7516         }
7517     }
7518
7519   else if (code == IF_THEN_ELSE)
7520     {
7521       /* If we have IF_THEN_ELSE already, extract the condition and
7522          canonicalize it if it is NE or EQ.  */
7523       cond0 = XEXP (x, 0);
7524       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
7525       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
7526         return XEXP (cond0, 0);
7527       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
7528         {
7529           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
7530           return XEXP (cond0, 0);
7531         }
7532       else
7533         return cond0;
7534     }
7535
7536   /* If X is a SUBREG, we can narrow both the true and false values
7537      if the inner expression, if there is a condition.  */
7538   else if (code == SUBREG
7539            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
7540                                                &true0, &false0)))
7541     {
7542       true0 = simplify_gen_subreg (mode, true0,
7543                                    GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7544       false0 = simplify_gen_subreg (mode, false0,
7545                                     GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7546       if (true0 && false0)
7547         {
7548           *ptrue = true0;
7549           *pfalse = false0;
7550           return cond0;
7551         }
7552     }
7553
7554   /* If X is a constant, this isn't special and will cause confusions
7555      if we treat it as such.  Likewise if it is equivalent to a constant.  */
7556   else if (CONSTANT_P (x)
7557            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
7558     ;
7559
7560   /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
7561      will be least confusing to the rest of the compiler.  */
7562   else if (mode == BImode)
7563     {
7564       *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
7565       return x;
7566     }
7567
7568   /* If X is known to be either 0 or -1, those are the true and
7569      false values when testing X.  */
7570   else if (x == constm1_rtx || x == const0_rtx
7571            || (mode != VOIDmode
7572                && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
7573     {
7574       *ptrue = constm1_rtx, *pfalse = const0_rtx;
7575       return x;
7576     }
7577
7578   /* Likewise for 0 or a single bit.  */
7579   else if (SCALAR_INT_MODE_P (mode)
7580            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7581            && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
7582     {
7583       *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
7584       return x;
7585     }
7586
7587   /* Otherwise fail; show no condition with true and false values the same.  */
7588   *ptrue = *pfalse = x;
7589   return 0;
7590 }
7591 \f
7592 /* Return the value of expression X given the fact that condition COND
7593    is known to be true when applied to REG as its first operand and VAL
7594    as its second.  X is known to not be shared and so can be modified in
7595    place.
7596
7597    We only handle the simplest cases, and specifically those cases that
7598    arise with IF_THEN_ELSE expressions.  */
7599
7600 static rtx
7601 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
7602 {
7603   enum rtx_code code = GET_CODE (x);
7604   rtx temp;
7605   const char *fmt;
7606   int i, j;
7607
7608   if (side_effects_p (x))
7609     return x;
7610
7611   /* If either operand of the condition is a floating point value,
7612      then we have to avoid collapsing an EQ comparison.  */
7613   if (cond == EQ
7614       && rtx_equal_p (x, reg)
7615       && ! FLOAT_MODE_P (GET_MODE (x))
7616       && ! FLOAT_MODE_P (GET_MODE (val)))
7617     return val;
7618
7619   if (cond == UNEQ && rtx_equal_p (x, reg))
7620     return val;
7621
7622   /* If X is (abs REG) and we know something about REG's relationship
7623      with zero, we may be able to simplify this.  */
7624
7625   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
7626     switch (cond)
7627       {
7628       case GE:  case GT:  case EQ:
7629         return XEXP (x, 0);
7630       case LT:  case LE:
7631         return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
7632                                    XEXP (x, 0),
7633                                    GET_MODE (XEXP (x, 0)));
7634       default:
7635         break;
7636       }
7637
7638   /* The only other cases we handle are MIN, MAX, and comparisons if the
7639      operands are the same as REG and VAL.  */
7640
7641   else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
7642     {
7643       if (rtx_equal_p (XEXP (x, 0), val))
7644         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
7645
7646       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
7647         {
7648           if (COMPARISON_P (x))
7649             {
7650               if (comparison_dominates_p (cond, code))
7651                 return const_true_rtx;
7652
7653               code = combine_reversed_comparison_code (x);
7654               if (code != UNKNOWN
7655                   && comparison_dominates_p (cond, code))
7656                 return const0_rtx;
7657               else
7658                 return x;
7659             }
7660           else if (code == SMAX || code == SMIN
7661                    || code == UMIN || code == UMAX)
7662             {
7663               int unsignedp = (code == UMIN || code == UMAX);
7664
7665               /* Do not reverse the condition when it is NE or EQ.
7666                  This is because we cannot conclude anything about
7667                  the value of 'SMAX (x, y)' when x is not equal to y,
7668                  but we can when x equals y.  */
7669               if ((code == SMAX || code == UMAX)
7670                   && ! (cond == EQ || cond == NE))
7671                 cond = reverse_condition (cond);
7672
7673               switch (cond)
7674                 {
7675                 case GE:   case GT:
7676                   return unsignedp ? x : XEXP (x, 1);
7677                 case LE:   case LT:
7678                   return unsignedp ? x : XEXP (x, 0);
7679                 case GEU:  case GTU:
7680                   return unsignedp ? XEXP (x, 1) : x;
7681                 case LEU:  case LTU:
7682                   return unsignedp ? XEXP (x, 0) : x;
7683                 default:
7684                   break;
7685                 }
7686             }
7687         }
7688     }
7689   else if (code == SUBREG)
7690     {
7691       enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
7692       rtx new, r = known_cond (SUBREG_REG (x), cond, reg, val);
7693
7694       if (SUBREG_REG (x) != r)
7695         {
7696           /* We must simplify subreg here, before we lose track of the
7697              original inner_mode.  */
7698           new = simplify_subreg (GET_MODE (x), r,
7699                                  inner_mode, SUBREG_BYTE (x));
7700           if (new)
7701             return new;
7702           else
7703             SUBST (SUBREG_REG (x), r);
7704         }
7705
7706       return x;
7707     }
7708   /* We don't have to handle SIGN_EXTEND here, because even in the
7709      case of replacing something with a modeless CONST_INT, a
7710      CONST_INT is already (supposed to be) a valid sign extension for
7711      its narrower mode, which implies it's already properly
7712      sign-extended for the wider mode.  Now, for ZERO_EXTEND, the
7713      story is different.  */
7714   else if (code == ZERO_EXTEND)
7715     {
7716       enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
7717       rtx new, r = known_cond (XEXP (x, 0), cond, reg, val);
7718
7719       if (XEXP (x, 0) != r)
7720         {
7721           /* We must simplify the zero_extend here, before we lose
7722              track of the original inner_mode.  */
7723           new = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
7724                                           r, inner_mode);
7725           if (new)
7726             return new;
7727           else
7728             SUBST (XEXP (x, 0), r);
7729         }
7730
7731       return x;
7732     }
7733
7734   fmt = GET_RTX_FORMAT (code);
7735   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7736     {
7737       if (fmt[i] == 'e')
7738         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
7739       else if (fmt[i] == 'E')
7740         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7741           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
7742                                                 cond, reg, val));
7743     }
7744
7745   return x;
7746 }
7747 \f
7748 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
7749    assignment as a field assignment.  */
7750
7751 static int
7752 rtx_equal_for_field_assignment_p (rtx x, rtx y)
7753 {
7754   if (x == y || rtx_equal_p (x, y))
7755     return 1;
7756
7757   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
7758     return 0;
7759
7760   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
7761      Note that all SUBREGs of MEM are paradoxical; otherwise they
7762      would have been rewritten.  */
7763   if (MEM_P (x) && GET_CODE (y) == SUBREG
7764       && MEM_P (SUBREG_REG (y))
7765       && rtx_equal_p (SUBREG_REG (y),
7766                       gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
7767     return 1;
7768
7769   if (MEM_P (y) && GET_CODE (x) == SUBREG
7770       && MEM_P (SUBREG_REG (x))
7771       && rtx_equal_p (SUBREG_REG (x),
7772                       gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
7773     return 1;
7774
7775   /* We used to see if get_last_value of X and Y were the same but that's
7776      not correct.  In one direction, we'll cause the assignment to have
7777      the wrong destination and in the case, we'll import a register into this
7778      insn that might have already have been dead.   So fail if none of the
7779      above cases are true.  */
7780   return 0;
7781 }
7782 \f
7783 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
7784    Return that assignment if so.
7785
7786    We only handle the most common cases.  */
7787
7788 static rtx
7789 make_field_assignment (rtx x)
7790 {
7791   rtx dest = SET_DEST (x);
7792   rtx src = SET_SRC (x);
7793   rtx assign;
7794   rtx rhs, lhs;
7795   HOST_WIDE_INT c1;
7796   HOST_WIDE_INT pos;
7797   unsigned HOST_WIDE_INT len;
7798   rtx other;
7799   enum machine_mode mode;
7800
7801   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
7802      a clear of a one-bit field.  We will have changed it to
7803      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
7804      for a SUBREG.  */
7805
7806   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
7807       && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
7808       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
7809       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7810     {
7811       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7812                                 1, 1, 1, 0);
7813       if (assign != 0)
7814         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7815       return x;
7816     }
7817
7818   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
7819       && subreg_lowpart_p (XEXP (src, 0))
7820       && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
7821           < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
7822       && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
7823       && GET_CODE (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == CONST_INT
7824       && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
7825       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7826     {
7827       assign = make_extraction (VOIDmode, dest, 0,
7828                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
7829                                 1, 1, 1, 0);
7830       if (assign != 0)
7831         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7832       return x;
7833     }
7834
7835   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
7836      one-bit field.  */
7837   if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
7838       && XEXP (XEXP (src, 0), 0) == const1_rtx
7839       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7840     {
7841       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7842                                 1, 1, 1, 0);
7843       if (assign != 0)
7844         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
7845       return x;
7846     }
7847
7848   /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
7849      SRC is an AND with all bits of that field set, then we can discard
7850      the AND.  */
7851   if (GET_CODE (dest) == ZERO_EXTRACT
7852       && GET_CODE (XEXP (dest, 1)) == CONST_INT
7853       && GET_CODE (src) == AND
7854       && GET_CODE (XEXP (src, 1)) == CONST_INT)
7855     {
7856       HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
7857       unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
7858       unsigned HOST_WIDE_INT ze_mask;
7859
7860       if (width >= HOST_BITS_PER_WIDE_INT)
7861         ze_mask = -1;
7862       else
7863         ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
7864
7865       /* Complete overlap.  We can remove the source AND.  */
7866       if ((and_mask & ze_mask) == ze_mask)
7867         return gen_rtx_SET (VOIDmode, dest, XEXP (src, 0));
7868
7869       /* Partial overlap.  We can reduce the source AND.  */
7870       if ((and_mask & ze_mask) != and_mask)
7871         {
7872           mode = GET_MODE (src);
7873           src = gen_rtx_AND (mode, XEXP (src, 0),
7874                              gen_int_mode (and_mask & ze_mask, mode));
7875           return gen_rtx_SET (VOIDmode, dest, src);
7876         }
7877     }
7878
7879   /* The other case we handle is assignments into a constant-position
7880      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
7881      a mask that has all one bits except for a group of zero bits and
7882      OTHER is known to have zeros where C1 has ones, this is such an
7883      assignment.  Compute the position and length from C1.  Shift OTHER
7884      to the appropriate position, force it to the required mode, and
7885      make the extraction.  Check for the AND in both operands.  */
7886
7887   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
7888     return x;
7889
7890   rhs = expand_compound_operation (XEXP (src, 0));
7891   lhs = expand_compound_operation (XEXP (src, 1));
7892
7893   if (GET_CODE (rhs) == AND
7894       && GET_CODE (XEXP (rhs, 1)) == CONST_INT
7895       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
7896     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
7897   else if (GET_CODE (lhs) == AND
7898            && GET_CODE (XEXP (lhs, 1)) == CONST_INT
7899            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
7900     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
7901   else
7902     return x;
7903
7904   pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
7905   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
7906       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
7907       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
7908     return x;
7909
7910   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
7911   if (assign == 0)
7912     return x;
7913
7914   /* The mode to use for the source is the mode of the assignment, or of
7915      what is inside a possible STRICT_LOW_PART.  */
7916   mode = (GET_CODE (assign) == STRICT_LOW_PART
7917           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
7918
7919   /* Shift OTHER right POS places and make it the source, restricting it
7920      to the proper length and mode.  */
7921
7922   src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
7923                                              GET_MODE (src), other, pos),
7924                        mode,
7925                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
7926                        ? ~(unsigned HOST_WIDE_INT) 0
7927                        : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
7928                        dest, 0);
7929
7930   /* If SRC is masked by an AND that does not make a difference in
7931      the value being stored, strip it.  */
7932   if (GET_CODE (assign) == ZERO_EXTRACT
7933       && GET_CODE (XEXP (assign, 1)) == CONST_INT
7934       && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
7935       && GET_CODE (src) == AND
7936       && GET_CODE (XEXP (src, 1)) == CONST_INT
7937       && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (src, 1))
7938           == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1))
7939     src = XEXP (src, 0);
7940
7941   return gen_rtx_SET (VOIDmode, assign, src);
7942 }
7943 \f
7944 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
7945    if so.  */
7946
7947 static rtx
7948 apply_distributive_law (rtx x)
7949 {
7950   enum rtx_code code = GET_CODE (x);
7951   enum rtx_code inner_code;
7952   rtx lhs, rhs, other;
7953   rtx tem;
7954
7955   /* Distributivity is not true for floating point as it can change the
7956      value.  So we don't do it unless -funsafe-math-optimizations.  */
7957   if (FLOAT_MODE_P (GET_MODE (x))
7958       && ! flag_unsafe_math_optimizations)
7959     return x;
7960
7961   /* The outer operation can only be one of the following:  */
7962   if (code != IOR && code != AND && code != XOR
7963       && code != PLUS && code != MINUS)
7964     return x;
7965
7966   lhs = XEXP (x, 0);
7967   rhs = XEXP (x, 1);
7968
7969   /* If either operand is a primitive we can't do anything, so get out
7970      fast.  */
7971   if (OBJECT_P (lhs) || OBJECT_P (rhs))
7972     return x;
7973
7974   lhs = expand_compound_operation (lhs);
7975   rhs = expand_compound_operation (rhs);
7976   inner_code = GET_CODE (lhs);
7977   if (inner_code != GET_CODE (rhs))
7978     return x;
7979
7980   /* See if the inner and outer operations distribute.  */
7981   switch (inner_code)
7982     {
7983     case LSHIFTRT:
7984     case ASHIFTRT:
7985     case AND:
7986     case IOR:
7987       /* These all distribute except over PLUS.  */
7988       if (code == PLUS || code == MINUS)
7989         return x;
7990       break;
7991
7992     case MULT:
7993       if (code != PLUS && code != MINUS)
7994         return x;
7995       break;
7996
7997     case ASHIFT:
7998       /* This is also a multiply, so it distributes over everything.  */
7999       break;
8000
8001     case SUBREG:
8002       /* Non-paradoxical SUBREGs distributes over all operations, provided
8003          the inner modes and byte offsets are the same, this is an extraction
8004          of a low-order part, we don't convert an fp operation to int or
8005          vice versa, and we would not be converting a single-word
8006          operation into a multi-word operation.  The latter test is not
8007          required, but it prevents generating unneeded multi-word operations.
8008          Some of the previous tests are redundant given the latter test, but
8009          are retained because they are required for correctness.
8010
8011          We produce the result slightly differently in this case.  */
8012
8013       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
8014           || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
8015           || ! subreg_lowpart_p (lhs)
8016           || (GET_MODE_CLASS (GET_MODE (lhs))
8017               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
8018           || (GET_MODE_SIZE (GET_MODE (lhs))
8019               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
8020           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
8021         return x;
8022
8023       tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
8024                         SUBREG_REG (lhs), SUBREG_REG (rhs));
8025       return gen_lowpart (GET_MODE (x), tem);
8026
8027     default:
8028       return x;
8029     }
8030
8031   /* Set LHS and RHS to the inner operands (A and B in the example
8032      above) and set OTHER to the common operand (C in the example).
8033      There is only one way to do this unless the inner operation is
8034      commutative.  */
8035   if (COMMUTATIVE_ARITH_P (lhs)
8036       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
8037     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
8038   else if (COMMUTATIVE_ARITH_P (lhs)
8039            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
8040     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
8041   else if (COMMUTATIVE_ARITH_P (lhs)
8042            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
8043     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
8044   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
8045     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
8046   else
8047     return x;
8048
8049   /* Form the new inner operation, seeing if it simplifies first.  */
8050   tem = gen_binary (code, GET_MODE (x), lhs, rhs);
8051
8052   /* There is one exception to the general way of distributing:
8053      (a | c) ^ (b | c) -> (a ^ b) & ~c  */
8054   if (code == XOR && inner_code == IOR)
8055     {
8056       inner_code = AND;
8057       other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
8058     }
8059
8060   /* We may be able to continuing distributing the result, so call
8061      ourselves recursively on the inner operation before forming the
8062      outer operation, which we return.  */
8063   return gen_binary (inner_code, GET_MODE (x),
8064                      apply_distributive_law (tem), other);
8065 }
8066 \f
8067 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
8068    in MODE.
8069
8070    Return an equivalent form, if different from X.  Otherwise, return X.  If
8071    X is zero, we are to always construct the equivalent form.  */
8072
8073 static rtx
8074 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
8075                         unsigned HOST_WIDE_INT constop)
8076 {
8077   unsigned HOST_WIDE_INT nonzero;
8078   int i;
8079
8080   /* Simplify VAROP knowing that we will be only looking at some of the
8081      bits in it.
8082
8083      Note by passing in CONSTOP, we guarantee that the bits not set in
8084      CONSTOP are not significant and will never be examined.  We must
8085      ensure that is the case by explicitly masking out those bits
8086      before returning.  */
8087   varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
8088
8089   /* If VAROP is a CLOBBER, we will fail so return it.  */
8090   if (GET_CODE (varop) == CLOBBER)
8091     return varop;
8092
8093   /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
8094      to VAROP and return the new constant.  */
8095   if (GET_CODE (varop) == CONST_INT)
8096     return GEN_INT (trunc_int_for_mode (INTVAL (varop) & constop, mode));
8097
8098   /* See what bits may be nonzero in VAROP.  Unlike the general case of
8099      a call to nonzero_bits, here we don't care about bits outside
8100      MODE.  */
8101
8102   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
8103
8104   /* Turn off all bits in the constant that are known to already be zero.
8105      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
8106      which is tested below.  */
8107
8108   constop &= nonzero;
8109
8110   /* If we don't have any bits left, return zero.  */
8111   if (constop == 0)
8112     return const0_rtx;
8113
8114   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
8115      a power of two, we can replace this with an ASHIFT.  */
8116   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
8117       && (i = exact_log2 (constop)) >= 0)
8118     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
8119
8120   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
8121      or XOR, then try to apply the distributive law.  This may eliminate
8122      operations if either branch can be simplified because of the AND.
8123      It may also make some cases more complex, but those cases probably
8124      won't match a pattern either with or without this.  */
8125
8126   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
8127     return
8128       gen_lowpart
8129         (mode,
8130          apply_distributive_law
8131          (gen_binary (GET_CODE (varop), GET_MODE (varop),
8132                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
8133                                               XEXP (varop, 0), constop),
8134                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
8135                                               XEXP (varop, 1), constop))));
8136
8137   /* If VAROP is PLUS, and the constant is a mask of low bite, distribute
8138      the AND and see if one of the operands simplifies to zero.  If so, we
8139      may eliminate it.  */
8140
8141   if (GET_CODE (varop) == PLUS
8142       && exact_log2 (constop + 1) >= 0)
8143     {
8144       rtx o0, o1;
8145
8146       o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
8147       o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
8148       if (o0 == const0_rtx)
8149         return o1;
8150       if (o1 == const0_rtx)
8151         return o0;
8152     }
8153
8154   /* Get VAROP in MODE.  Try to get a SUBREG if not.  Don't make a new SUBREG
8155      if we already had one (just check for the simplest cases).  */
8156   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
8157       && GET_MODE (XEXP (x, 0)) == mode
8158       && SUBREG_REG (XEXP (x, 0)) == varop)
8159     varop = XEXP (x, 0);
8160   else
8161     varop = gen_lowpart (mode, varop);
8162
8163   /* If we can't make the SUBREG, try to return what we were given.  */
8164   if (GET_CODE (varop) == CLOBBER)
8165     return x ? x : varop;
8166
8167   /* If we are only masking insignificant bits, return VAROP.  */
8168   if (constop == nonzero)
8169     x = varop;
8170   else
8171     {
8172       /* Otherwise, return an AND.  */
8173       constop = trunc_int_for_mode (constop, mode);
8174       /* See how much, if any, of X we can use.  */
8175       if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
8176         x = gen_binary (AND, mode, varop, GEN_INT (constop));
8177
8178       else
8179         {
8180           if (GET_CODE (XEXP (x, 1)) != CONST_INT
8181               || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop)
8182             SUBST (XEXP (x, 1), GEN_INT (constop));
8183
8184           SUBST (XEXP (x, 0), varop);
8185         }
8186     }
8187
8188   return x;
8189 }
8190 \f
8191 /* Given a REG, X, compute which bits in X can be nonzero.
8192    We don't care about bits outside of those defined in MODE.
8193
8194    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
8195    a shift, AND, or zero_extract, we can do better.  */
8196
8197 static rtx
8198 reg_nonzero_bits_for_combine (rtx x, enum machine_mode mode,
8199                               rtx known_x ATTRIBUTE_UNUSED,
8200                               enum machine_mode known_mode ATTRIBUTE_UNUSED,
8201                               unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
8202                               unsigned HOST_WIDE_INT *nonzero)
8203 {
8204   rtx tem;
8205
8206   /* If X is a register whose nonzero bits value is current, use it.
8207      Otherwise, if X is a register whose value we can find, use that
8208      value.  Otherwise, use the previously-computed global nonzero bits
8209      for this register.  */
8210
8211   if (reg_stat[REGNO (x)].last_set_value != 0
8212       && (reg_stat[REGNO (x)].last_set_mode == mode
8213           || (GET_MODE_CLASS (reg_stat[REGNO (x)].last_set_mode) == MODE_INT
8214               && GET_MODE_CLASS (mode) == MODE_INT))
8215       && (reg_stat[REGNO (x)].last_set_label == label_tick
8216           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8217               && REG_N_SETS (REGNO (x)) == 1
8218               && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
8219                                     REGNO (x))))
8220       && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
8221     {
8222       *nonzero &= reg_stat[REGNO (x)].last_set_nonzero_bits;
8223       return NULL;
8224     }
8225
8226   tem = get_last_value (x);
8227
8228   if (tem)
8229     {
8230 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
8231       /* If X is narrower than MODE and TEM is a non-negative
8232          constant that would appear negative in the mode of X,
8233          sign-extend it for use in reg_nonzero_bits because some
8234          machines (maybe most) will actually do the sign-extension
8235          and this is the conservative approach.
8236
8237          ??? For 2.5, try to tighten up the MD files in this regard
8238          instead of this kludge.  */
8239
8240       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode)
8241           && GET_CODE (tem) == CONST_INT
8242           && INTVAL (tem) > 0
8243           && 0 != (INTVAL (tem)
8244                    & ((HOST_WIDE_INT) 1
8245                       << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
8246         tem = GEN_INT (INTVAL (tem)
8247                        | ((HOST_WIDE_INT) (-1)
8248                           << GET_MODE_BITSIZE (GET_MODE (x))));
8249 #endif
8250       return tem;
8251     }
8252   else if (nonzero_sign_valid && reg_stat[REGNO (x)].nonzero_bits)
8253     {
8254       unsigned HOST_WIDE_INT mask = reg_stat[REGNO (x)].nonzero_bits;
8255
8256       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode))
8257         /* We don't know anything about the upper bits.  */
8258         mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
8259       *nonzero &= mask;
8260     }
8261
8262   return NULL;
8263 }
8264
8265 /* Return the number of bits at the high-order end of X that are known to
8266    be equal to the sign bit.  X will be used in mode MODE; if MODE is
8267    VOIDmode, X will be used in its own mode.  The returned value  will always
8268    be between 1 and the number of bits in MODE.  */
8269
8270 static rtx
8271 reg_num_sign_bit_copies_for_combine (rtx x, enum machine_mode mode,
8272                                      rtx known_x ATTRIBUTE_UNUSED,
8273                                      enum machine_mode known_mode
8274                                      ATTRIBUTE_UNUSED,
8275                                      unsigned int known_ret ATTRIBUTE_UNUSED,
8276                                      unsigned int *result)
8277 {
8278   rtx tem;
8279
8280   if (reg_stat[REGNO (x)].last_set_value != 0
8281       && reg_stat[REGNO (x)].last_set_mode == mode
8282       && (reg_stat[REGNO (x)].last_set_label == label_tick
8283           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8284               && REG_N_SETS (REGNO (x)) == 1
8285               && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
8286                                     REGNO (x))))
8287       && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
8288     {
8289       *result = reg_stat[REGNO (x)].last_set_sign_bit_copies;
8290       return NULL;
8291     }
8292
8293   tem = get_last_value (x);
8294   if (tem != 0)
8295     return tem;
8296
8297   if (nonzero_sign_valid && reg_stat[REGNO (x)].sign_bit_copies != 0
8298       && GET_MODE_BITSIZE (GET_MODE (x)) == GET_MODE_BITSIZE (mode))
8299     *result = reg_stat[REGNO (x)].sign_bit_copies;
8300       
8301   return NULL;
8302 }
8303 \f
8304 /* Return the number of "extended" bits there are in X, when interpreted
8305    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
8306    unsigned quantities, this is the number of high-order zero bits.
8307    For signed quantities, this is the number of copies of the sign bit
8308    minus 1.  In both case, this function returns the number of "spare"
8309    bits.  For example, if two quantities for which this function returns
8310    at least 1 are added, the addition is known not to overflow.
8311
8312    This function will always return 0 unless called during combine, which
8313    implies that it must be called from a define_split.  */
8314
8315 unsigned int
8316 extended_count (rtx x, enum machine_mode mode, int unsignedp)
8317 {
8318   if (nonzero_sign_valid == 0)
8319     return 0;
8320
8321   return (unsignedp
8322           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8323              ? (unsigned int) (GET_MODE_BITSIZE (mode) - 1
8324                                - floor_log2 (nonzero_bits (x, mode)))
8325              : 0)
8326           : num_sign_bit_copies (x, mode) - 1);
8327 }
8328 \f
8329 /* This function is called from `simplify_shift_const' to merge two
8330    outer operations.  Specifically, we have already found that we need
8331    to perform operation *POP0 with constant *PCONST0 at the outermost
8332    position.  We would now like to also perform OP1 with constant CONST1
8333    (with *POP0 being done last).
8334
8335    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
8336    the resulting operation.  *PCOMP_P is set to 1 if we would need to
8337    complement the innermost operand, otherwise it is unchanged.
8338
8339    MODE is the mode in which the operation will be done.  No bits outside
8340    the width of this mode matter.  It is assumed that the width of this mode
8341    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
8342
8343    If *POP0 or OP1 are UNKNOWN, it means no operation is required.  Only NEG, PLUS,
8344    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
8345    result is simply *PCONST0.
8346
8347    If the resulting operation cannot be expressed as one operation, we
8348    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
8349
8350 static int
8351 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)
8352 {
8353   enum rtx_code op0 = *pop0;
8354   HOST_WIDE_INT const0 = *pconst0;
8355
8356   const0 &= GET_MODE_MASK (mode);
8357   const1 &= GET_MODE_MASK (mode);
8358
8359   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
8360   if (op0 == AND)
8361     const1 &= const0;
8362
8363   /* If OP0 or OP1 is UNKNOWN, this is easy.  Similarly if they are the same or
8364      if OP0 is SET.  */
8365
8366   if (op1 == UNKNOWN || op0 == SET)
8367     return 1;
8368
8369   else if (op0 == UNKNOWN)
8370     op0 = op1, const0 = const1;
8371
8372   else if (op0 == op1)
8373     {
8374       switch (op0)
8375         {
8376         case AND:
8377           const0 &= const1;
8378           break;
8379         case IOR:
8380           const0 |= const1;
8381           break;
8382         case XOR:
8383           const0 ^= const1;
8384           break;
8385         case PLUS:
8386           const0 += const1;
8387           break;
8388         case NEG:
8389           op0 = UNKNOWN;
8390           break;
8391         default:
8392           break;
8393         }
8394     }
8395
8396   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
8397   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
8398     return 0;
8399
8400   /* If the two constants aren't the same, we can't do anything.  The
8401      remaining six cases can all be done.  */
8402   else if (const0 != const1)
8403     return 0;
8404
8405   else
8406     switch (op0)
8407       {
8408       case IOR:
8409         if (op1 == AND)
8410           /* (a & b) | b == b */
8411           op0 = SET;
8412         else /* op1 == XOR */
8413           /* (a ^ b) | b == a | b */
8414           {;}
8415         break;
8416
8417       case XOR:
8418         if (op1 == AND)
8419           /* (a & b) ^ b == (~a) & b */
8420           op0 = AND, *pcomp_p = 1;
8421         else /* op1 == IOR */
8422           /* (a | b) ^ b == a & ~b */
8423           op0 = AND, const0 = ~const0;
8424         break;
8425
8426       case AND:
8427         if (op1 == IOR)
8428           /* (a | b) & b == b */
8429         op0 = SET;
8430         else /* op1 == XOR */
8431           /* (a ^ b) & b) == (~a) & b */
8432           *pcomp_p = 1;
8433         break;
8434       default:
8435         break;
8436       }
8437
8438   /* Check for NO-OP cases.  */
8439   const0 &= GET_MODE_MASK (mode);
8440   if (const0 == 0
8441       && (op0 == IOR || op0 == XOR || op0 == PLUS))
8442     op0 = UNKNOWN;
8443   else if (const0 == 0 && op0 == AND)
8444     op0 = SET;
8445   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
8446            && op0 == AND)
8447     op0 = UNKNOWN;
8448
8449   /* ??? Slightly redundant with the above mask, but not entirely.
8450      Moving this above means we'd have to sign-extend the mode mask
8451      for the final test.  */
8452   const0 = trunc_int_for_mode (const0, mode);
8453
8454   *pop0 = op0;
8455   *pconst0 = const0;
8456
8457   return 1;
8458 }
8459 \f
8460 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
8461    The result of the shift is RESULT_MODE.  X, if nonzero, is an expression
8462    that we started with.
8463
8464    The shift is normally computed in the widest mode we find in VAROP, as
8465    long as it isn't a different number of words than RESULT_MODE.  Exceptions
8466    are ASHIFTRT and ROTATE, which are always done in their original mode,  */
8467
8468 static rtx
8469 simplify_shift_const (rtx x, enum rtx_code code,
8470                       enum machine_mode result_mode, rtx varop,
8471                       int orig_count)
8472 {
8473   enum rtx_code orig_code = code;
8474   unsigned int count;
8475   int signed_count;
8476   enum machine_mode mode = result_mode;
8477   enum machine_mode shift_mode, tmode;
8478   unsigned int mode_words
8479     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
8480   /* We form (outer_op (code varop count) (outer_const)).  */
8481   enum rtx_code outer_op = UNKNOWN;
8482   HOST_WIDE_INT outer_const = 0;
8483   rtx const_rtx;
8484   int complement_p = 0;
8485   rtx new;
8486
8487   /* Make sure and truncate the "natural" shift on the way in.  We don't
8488      want to do this inside the loop as it makes it more difficult to
8489      combine shifts.  */
8490   if (SHIFT_COUNT_TRUNCATED)
8491     orig_count &= GET_MODE_BITSIZE (mode) - 1;
8492
8493   /* If we were given an invalid count, don't do anything except exactly
8494      what was requested.  */
8495
8496   if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
8497     {
8498       if (x)
8499         return x;
8500
8501       return gen_rtx_fmt_ee (code, mode, varop, GEN_INT (orig_count));
8502     }
8503
8504   count = orig_count;
8505
8506   /* Unless one of the branches of the `if' in this loop does a `continue',
8507      we will `break' the loop after the `if'.  */
8508
8509   while (count != 0)
8510     {
8511       /* If we have an operand of (clobber (const_int 0)), just return that
8512          value.  */
8513       if (GET_CODE (varop) == CLOBBER)
8514         return varop;
8515
8516       /* If we discovered we had to complement VAROP, leave.  Making a NOT
8517          here would cause an infinite loop.  */
8518       if (complement_p)
8519         break;
8520
8521       /* Convert ROTATERT to ROTATE.  */
8522       if (code == ROTATERT)
8523         {
8524           unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
8525           code = ROTATE;
8526           if (VECTOR_MODE_P (result_mode))
8527             count = bitsize / GET_MODE_NUNITS (result_mode) - count;
8528           else
8529             count = bitsize - count;
8530         }
8531
8532       /* We need to determine what mode we will do the shift in.  If the
8533          shift is a right shift or a ROTATE, we must always do it in the mode
8534          it was originally done in.  Otherwise, we can do it in MODE, the
8535          widest mode encountered.  */
8536       shift_mode
8537         = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
8538            ? result_mode : mode);
8539
8540       /* Handle cases where the count is greater than the size of the mode
8541          minus 1.  For ASHIFT, use the size minus one as the count (this can
8542          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
8543          take the count modulo the size.  For other shifts, the result is
8544          zero.
8545
8546          Since these shifts are being produced by the compiler by combining
8547          multiple operations, each of which are defined, we know what the
8548          result is supposed to be.  */
8549
8550       if (count > (unsigned int) (GET_MODE_BITSIZE (shift_mode) - 1))
8551         {
8552           if (code == ASHIFTRT)
8553             count = GET_MODE_BITSIZE (shift_mode) - 1;
8554           else if (code == ROTATE || code == ROTATERT)
8555             count %= GET_MODE_BITSIZE (shift_mode);
8556           else
8557             {
8558               /* We can't simply return zero because there may be an
8559                  outer op.  */
8560               varop = const0_rtx;
8561               count = 0;
8562               break;
8563             }
8564         }
8565
8566       /* An arithmetic right shift of a quantity known to be -1 or 0
8567          is a no-op.  */
8568       if (code == ASHIFTRT
8569           && (num_sign_bit_copies (varop, shift_mode)
8570               == GET_MODE_BITSIZE (shift_mode)))
8571         {
8572           count = 0;
8573           break;
8574         }
8575
8576       /* If we are doing an arithmetic right shift and discarding all but
8577          the sign bit copies, this is equivalent to doing a shift by the
8578          bitsize minus one.  Convert it into that shift because it will often
8579          allow other simplifications.  */
8580
8581       if (code == ASHIFTRT
8582           && (count + num_sign_bit_copies (varop, shift_mode)
8583               >= GET_MODE_BITSIZE (shift_mode)))
8584         count = GET_MODE_BITSIZE (shift_mode) - 1;
8585
8586       /* We simplify the tests below and elsewhere by converting
8587          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
8588          `make_compound_operation' will convert it to an ASHIFTRT for
8589          those machines (such as VAX) that don't have an LSHIFTRT.  */
8590       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
8591           && code == ASHIFTRT
8592           && ((nonzero_bits (varop, shift_mode)
8593                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
8594               == 0))
8595         code = LSHIFTRT;
8596
8597       if (code == LSHIFTRT
8598           && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
8599           && !(nonzero_bits (varop, shift_mode) >> count))
8600         varop = const0_rtx;
8601       if (code == ASHIFT
8602           && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
8603           && !((nonzero_bits (varop, shift_mode) << count)
8604                & GET_MODE_MASK (shift_mode)))
8605         varop = const0_rtx;
8606
8607       switch (GET_CODE (varop))
8608         {
8609         case SIGN_EXTEND:
8610         case ZERO_EXTEND:
8611         case SIGN_EXTRACT:
8612         case ZERO_EXTRACT:
8613           new = expand_compound_operation (varop);
8614           if (new != varop)
8615             {
8616               varop = new;
8617               continue;
8618             }
8619           break;
8620
8621         case MEM:
8622           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
8623              minus the width of a smaller mode, we can do this with a
8624              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
8625           if ((code == ASHIFTRT || code == LSHIFTRT)
8626               && ! mode_dependent_address_p (XEXP (varop, 0))
8627               && ! MEM_VOLATILE_P (varop)
8628               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8629                                          MODE_INT, 1)) != BLKmode)
8630             {
8631               new = adjust_address_nv (varop, tmode,
8632                                        BYTES_BIG_ENDIAN ? 0
8633                                        : count / BITS_PER_UNIT);
8634
8635               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
8636                                      : ZERO_EXTEND, mode, new);
8637               count = 0;
8638               continue;
8639             }
8640           break;
8641
8642         case USE:
8643           /* Similar to the case above, except that we can only do this if
8644              the resulting mode is the same as that of the underlying
8645              MEM and adjust the address depending on the *bits* endianness
8646              because of the way that bit-field extract insns are defined.  */
8647           if ((code == ASHIFTRT || code == LSHIFTRT)
8648               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8649                                          MODE_INT, 1)) != BLKmode
8650               && tmode == GET_MODE (XEXP (varop, 0)))
8651             {
8652               if (BITS_BIG_ENDIAN)
8653                 new = XEXP (varop, 0);
8654               else
8655                 {
8656                   new = copy_rtx (XEXP (varop, 0));
8657                   SUBST (XEXP (new, 0),
8658                          plus_constant (XEXP (new, 0),
8659                                         count / BITS_PER_UNIT));
8660                 }
8661
8662               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
8663                                      : ZERO_EXTEND, mode, new);
8664               count = 0;
8665               continue;
8666             }
8667           break;
8668
8669         case SUBREG:
8670           /* If VAROP is a SUBREG, strip it as long as the inner operand has
8671              the same number of words as what we've seen so far.  Then store
8672              the widest mode in MODE.  */
8673           if (subreg_lowpart_p (varop)
8674               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8675                   > GET_MODE_SIZE (GET_MODE (varop)))
8676               && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8677                                   + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
8678                  == mode_words)
8679             {
8680               varop = SUBREG_REG (varop);
8681               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
8682                 mode = GET_MODE (varop);
8683               continue;
8684             }
8685           break;
8686
8687         case MULT:
8688           /* Some machines use MULT instead of ASHIFT because MULT
8689              is cheaper.  But it is still better on those machines to
8690              merge two shifts into one.  */
8691           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8692               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
8693             {
8694               varop
8695                 = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
8696                               GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
8697               continue;
8698             }
8699           break;
8700
8701         case UDIV:
8702           /* Similar, for when divides are cheaper.  */
8703           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8704               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
8705             {
8706               varop
8707                 = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
8708                               GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
8709               continue;
8710             }
8711           break;
8712
8713         case ASHIFTRT:
8714           /* If we are extracting just the sign bit of an arithmetic
8715              right shift, that shift is not needed.  However, the sign
8716              bit of a wider mode may be different from what would be
8717              interpreted as the sign bit in a narrower mode, so, if
8718              the result is narrower, don't discard the shift.  */
8719           if (code == LSHIFTRT
8720               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
8721               && (GET_MODE_BITSIZE (result_mode)
8722                   >= GET_MODE_BITSIZE (GET_MODE (varop))))
8723             {
8724               varop = XEXP (varop, 0);
8725               continue;
8726             }
8727
8728           /* ... fall through ...  */
8729
8730         case LSHIFTRT:
8731         case ASHIFT:
8732         case ROTATE:
8733           /* Here we have two nested shifts.  The result is usually the
8734              AND of a new shift with a mask.  We compute the result below.  */
8735           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8736               && INTVAL (XEXP (varop, 1)) >= 0
8737               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
8738               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
8739               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
8740             {
8741               enum rtx_code first_code = GET_CODE (varop);
8742               unsigned int first_count = INTVAL (XEXP (varop, 1));
8743               unsigned HOST_WIDE_INT mask;
8744               rtx mask_rtx;
8745
8746               /* We have one common special case.  We can't do any merging if
8747                  the inner code is an ASHIFTRT of a smaller mode.  However, if
8748                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
8749                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
8750                  we can convert it to
8751                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
8752                  This simplifies certain SIGN_EXTEND operations.  */
8753               if (code == ASHIFT && first_code == ASHIFTRT
8754                   && count == (unsigned int)
8755                               (GET_MODE_BITSIZE (result_mode)
8756                                - GET_MODE_BITSIZE (GET_MODE (varop))))
8757                 {
8758                   /* C3 has the low-order C1 bits zero.  */
8759
8760                   mask = (GET_MODE_MASK (mode)
8761                           & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
8762
8763                   varop = simplify_and_const_int (NULL_RTX, result_mode,
8764                                                   XEXP (varop, 0), mask);
8765                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
8766                                                 varop, count);
8767                   count = first_count;
8768                   code = ASHIFTRT;
8769                   continue;
8770                 }
8771
8772               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
8773                  than C1 high-order bits equal to the sign bit, we can convert
8774                  this to either an ASHIFT or an ASHIFTRT depending on the
8775                  two counts.
8776
8777                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
8778
8779               if (code == ASHIFTRT && first_code == ASHIFT
8780                   && GET_MODE (varop) == shift_mode
8781                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
8782                       > first_count))
8783                 {
8784                   varop = XEXP (varop, 0);
8785
8786                   signed_count = count - first_count;
8787                   if (signed_count < 0)
8788                     count = -signed_count, code = ASHIFT;
8789                   else
8790                     count = signed_count;
8791
8792                   continue;
8793                 }
8794
8795               /* There are some cases we can't do.  If CODE is ASHIFTRT,
8796                  we can only do this if FIRST_CODE is also ASHIFTRT.
8797
8798                  We can't do the case when CODE is ROTATE and FIRST_CODE is
8799                  ASHIFTRT.
8800
8801                  If the mode of this shift is not the mode of the outer shift,
8802                  we can't do this if either shift is a right shift or ROTATE.
8803
8804                  Finally, we can't do any of these if the mode is too wide
8805                  unless the codes are the same.
8806
8807                  Handle the case where the shift codes are the same
8808                  first.  */
8809
8810               if (code == first_code)
8811                 {
8812                   if (GET_MODE (varop) != result_mode
8813                       && (code == ASHIFTRT || code == LSHIFTRT
8814                           || code == ROTATE))
8815                     break;
8816
8817                   count += first_count;
8818                   varop = XEXP (varop, 0);
8819                   continue;
8820                 }
8821
8822               if (code == ASHIFTRT
8823                   || (code == ROTATE && first_code == ASHIFTRT)
8824                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
8825                   || (GET_MODE (varop) != result_mode
8826                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
8827                           || first_code == ROTATE
8828                           || code == ROTATE)))
8829                 break;
8830
8831               /* To compute the mask to apply after the shift, shift the
8832                  nonzero bits of the inner shift the same way the
8833                  outer shift will.  */
8834
8835               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
8836
8837               mask_rtx
8838                 = simplify_binary_operation (code, result_mode, mask_rtx,
8839                                              GEN_INT (count));
8840
8841               /* Give up if we can't compute an outer operation to use.  */
8842               if (mask_rtx == 0
8843                   || GET_CODE (mask_rtx) != CONST_INT
8844                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
8845                                         INTVAL (mask_rtx),
8846                                         result_mode, &complement_p))
8847                 break;
8848
8849               /* If the shifts are in the same direction, we add the
8850                  counts.  Otherwise, we subtract them.  */
8851               signed_count = count;
8852               if ((code == ASHIFTRT || code == LSHIFTRT)
8853                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
8854                 signed_count += first_count;
8855               else
8856                 signed_count -= first_count;
8857
8858               /* If COUNT is positive, the new shift is usually CODE,
8859                  except for the two exceptions below, in which case it is
8860                  FIRST_CODE.  If the count is negative, FIRST_CODE should
8861                  always be used  */
8862               if (signed_count > 0
8863                   && ((first_code == ROTATE && code == ASHIFT)
8864                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
8865                 code = first_code, count = signed_count;
8866               else if (signed_count < 0)
8867                 code = first_code, count = -signed_count;
8868               else
8869                 count = signed_count;
8870
8871               varop = XEXP (varop, 0);
8872               continue;
8873             }
8874
8875           /* If we have (A << B << C) for any shift, we can convert this to
8876              (A << C << B).  This wins if A is a constant.  Only try this if
8877              B is not a constant.  */
8878
8879           else if (GET_CODE (varop) == code
8880                    && GET_CODE (XEXP (varop, 1)) != CONST_INT
8881                    && 0 != (new
8882                             = simplify_binary_operation (code, mode,
8883                                                          XEXP (varop, 0),
8884                                                          GEN_INT (count))))
8885             {
8886               varop = gen_rtx_fmt_ee (code, mode, new, XEXP (varop, 1));
8887               count = 0;
8888               continue;
8889             }
8890           break;
8891
8892         case NOT:
8893           /* Make this fit the case below.  */
8894           varop = gen_rtx_XOR (mode, XEXP (varop, 0),
8895                                GEN_INT (GET_MODE_MASK (mode)));
8896           continue;
8897
8898         case IOR:
8899         case AND:
8900         case XOR:
8901           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
8902              with C the size of VAROP - 1 and the shift is logical if
8903              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
8904              we have an (le X 0) operation.   If we have an arithmetic shift
8905              and STORE_FLAG_VALUE is 1 or we have a logical shift with
8906              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
8907
8908           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
8909               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
8910               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8911               && (code == LSHIFTRT || code == ASHIFTRT)
8912               && count == (unsigned int)
8913                           (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
8914               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
8915             {
8916               count = 0;
8917               varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
8918                                   const0_rtx);
8919
8920               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
8921                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
8922
8923               continue;
8924             }
8925
8926           /* If we have (shift (logical)), move the logical to the outside
8927              to allow it to possibly combine with another logical and the
8928              shift to combine with another shift.  This also canonicalizes to
8929              what a ZERO_EXTRACT looks like.  Also, some machines have
8930              (and (shift)) insns.  */
8931
8932           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8933               /* We can't do this if we have (ashiftrt (xor))  and the
8934                  constant has its sign bit set in shift_mode.  */
8935               && !(code == ASHIFTRT && GET_CODE (varop) == XOR
8936                    && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
8937                                               shift_mode))
8938               && (new = simplify_binary_operation (code, result_mode,
8939                                                    XEXP (varop, 1),
8940                                                    GEN_INT (count))) != 0
8941               && GET_CODE (new) == CONST_INT
8942               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
8943                                   INTVAL (new), result_mode, &complement_p))
8944             {
8945               varop = XEXP (varop, 0);
8946               continue;
8947             }
8948
8949           /* If we can't do that, try to simplify the shift in each arm of the
8950              logical expression, make a new logical expression, and apply
8951              the inverse distributive law.  This also can't be done
8952              for some (ashiftrt (xor)).  */
8953           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8954              && !(code == ASHIFTRT && GET_CODE (varop) == XOR
8955                   && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
8956                                              shift_mode)))
8957             {
8958               rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
8959                                               XEXP (varop, 0), count);
8960               rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
8961                                               XEXP (varop, 1), count);
8962
8963               varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs);
8964               varop = apply_distributive_law (varop);
8965
8966               count = 0;
8967               continue; 
8968             }
8969           break;
8970
8971         case EQ:
8972           /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
8973              says that the sign bit can be tested, FOO has mode MODE, C is
8974              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
8975              that may be nonzero.  */
8976           if (code == LSHIFTRT
8977               && XEXP (varop, 1) == const0_rtx
8978               && GET_MODE (XEXP (varop, 0)) == result_mode
8979               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
8980               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
8981               && ((STORE_FLAG_VALUE
8982                    & ((HOST_WIDE_INT) 1
8983                       < (GET_MODE_BITSIZE (result_mode) - 1))))
8984               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
8985               && merge_outer_ops (&outer_op, &outer_const, XOR,
8986                                   (HOST_WIDE_INT) 1, result_mode,
8987                                   &complement_p))
8988             {
8989               varop = XEXP (varop, 0);
8990               count = 0;
8991               continue;
8992             }
8993           break;
8994
8995         case NEG:
8996           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
8997              than the number of bits in the mode is equivalent to A.  */
8998           if (code == LSHIFTRT
8999               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9000               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
9001             {
9002               varop = XEXP (varop, 0);
9003               count = 0;
9004               continue;
9005             }
9006
9007           /* NEG commutes with ASHIFT since it is multiplication.  Move the
9008              NEG outside to allow shifts to combine.  */
9009           if (code == ASHIFT
9010               && merge_outer_ops (&outer_op, &outer_const, NEG,
9011                                   (HOST_WIDE_INT) 0, result_mode,
9012                                   &complement_p))
9013             {
9014               varop = XEXP (varop, 0);
9015               continue;
9016             }
9017           break;
9018
9019         case PLUS:
9020           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9021              is one less than the number of bits in the mode is
9022              equivalent to (xor A 1).  */
9023           if (code == LSHIFTRT
9024               && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9025               && XEXP (varop, 1) == constm1_rtx
9026               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9027               && merge_outer_ops (&outer_op, &outer_const, XOR,
9028                                   (HOST_WIDE_INT) 1, result_mode,
9029                                   &complement_p))
9030             {
9031               count = 0;
9032               varop = XEXP (varop, 0);
9033               continue;
9034             }
9035
9036           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
9037              that might be nonzero in BAR are those being shifted out and those
9038              bits are known zero in FOO, we can replace the PLUS with FOO.
9039              Similarly in the other operand order.  This code occurs when
9040              we are computing the size of a variable-size array.  */
9041
9042           if ((code == ASHIFTRT || code == LSHIFTRT)
9043               && count < HOST_BITS_PER_WIDE_INT
9044               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9045               && (nonzero_bits (XEXP (varop, 1), result_mode)
9046                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9047             {
9048               varop = XEXP (varop, 0);
9049               continue;
9050             }
9051           else if ((code == ASHIFTRT || code == LSHIFTRT)
9052                    && count < HOST_BITS_PER_WIDE_INT
9053                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9054                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9055                             >> count)
9056                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9057                             & nonzero_bits (XEXP (varop, 1),
9058                                                  result_mode)))
9059             {
9060               varop = XEXP (varop, 1);
9061               continue;
9062             }
9063
9064           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
9065           if (code == ASHIFT
9066               && GET_CODE (XEXP (varop, 1)) == CONST_INT
9067               && (new = simplify_binary_operation (ASHIFT, result_mode,
9068                                                    XEXP (varop, 1),
9069                                                    GEN_INT (count))) != 0
9070               && GET_CODE (new) == CONST_INT
9071               && merge_outer_ops (&outer_op, &outer_const, PLUS,
9072                                   INTVAL (new), result_mode, &complement_p))
9073             {
9074               varop = XEXP (varop, 0);
9075               continue;
9076             }
9077
9078           /* Check for 'PLUS signbit', which is the canonical form of 'XOR
9079              signbit', and attempt to change the PLUS to an XOR and move it to
9080              the outer operation as is done above in the AND/IOR/XOR case
9081              leg for shift(logical). See details in logical handling above
9082              for reasoning in doing so.  */
9083           if (code == LSHIFTRT
9084               && GET_CODE (XEXP (varop, 1)) == CONST_INT
9085               && mode_signbit_p (result_mode, XEXP (varop, 1))
9086               && (new = simplify_binary_operation (code, result_mode,
9087                                                    XEXP (varop, 1),
9088                                                    GEN_INT (count))) != 0
9089               && GET_CODE (new) == CONST_INT
9090               && merge_outer_ops (&outer_op, &outer_const, XOR,
9091                                   INTVAL (new), result_mode, &complement_p))
9092             {
9093               varop = XEXP (varop, 0);
9094               continue;
9095             }
9096
9097           break;
9098
9099         case MINUS:
9100           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9101              with C the size of VAROP - 1 and the shift is logical if
9102              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9103              we have a (gt X 0) operation.  If the shift is arithmetic with
9104              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9105              we have a (neg (gt X 0)) operation.  */
9106
9107           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9108               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9109               && count == (unsigned int)
9110                           (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9111               && (code == LSHIFTRT || code == ASHIFTRT)
9112               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9113               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (varop, 0), 1))
9114                  == count
9115               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9116             {
9117               count = 0;
9118               varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9119                                   const0_rtx);
9120
9121               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9122                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9123
9124               continue;
9125             }
9126           break;
9127
9128         case TRUNCATE:
9129           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9130              if the truncate does not affect the value.  */
9131           if (code == LSHIFTRT
9132               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9133               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9134               && (INTVAL (XEXP (XEXP (varop, 0), 1))
9135                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9136                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
9137             {
9138               rtx varop_inner = XEXP (varop, 0);
9139
9140               varop_inner
9141                 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
9142                                     XEXP (varop_inner, 0),
9143                                     GEN_INT
9144                                     (count + INTVAL (XEXP (varop_inner, 1))));
9145               varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
9146               count = 0;
9147               continue;
9148             }
9149           break;
9150
9151         default:
9152           break;
9153         }
9154
9155       break;
9156     }
9157
9158   /* We need to determine what mode to do the shift in.  If the shift is
9159      a right shift or ROTATE, we must always do it in the mode it was
9160      originally done in.  Otherwise, we can do it in MODE, the widest mode
9161      encountered.  The code we care about is that of the shift that will
9162      actually be done, not the shift that was originally requested.  */
9163   shift_mode
9164     = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9165        ? result_mode : mode);
9166
9167   /* We have now finished analyzing the shift.  The result should be
9168      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
9169      OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
9170      to the result of the shift.  OUTER_CONST is the relevant constant,
9171      but we must turn off all bits turned off in the shift.
9172
9173      If we were passed a value for X, see if we can use any pieces of
9174      it.  If not, make new rtx.  */
9175
9176   if (x && GET_RTX_CLASS (GET_CODE (x)) == RTX_BIN_ARITH
9177       && GET_CODE (XEXP (x, 1)) == CONST_INT
9178       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) == count)
9179     const_rtx = XEXP (x, 1);
9180   else
9181     const_rtx = GEN_INT (count);
9182
9183   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
9184       && GET_MODE (XEXP (x, 0)) == shift_mode
9185       && SUBREG_REG (XEXP (x, 0)) == varop)
9186     varop = XEXP (x, 0);
9187   else if (GET_MODE (varop) != shift_mode)
9188     varop = gen_lowpart (shift_mode, varop);
9189
9190   /* If we can't make the SUBREG, try to return what we were given.  */
9191   if (GET_CODE (varop) == CLOBBER)
9192     return x ? x : varop;
9193
9194   new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
9195   if (new != 0)
9196     x = new;
9197   else
9198     x = gen_rtx_fmt_ee (code, shift_mode, varop, const_rtx);
9199
9200   /* If we have an outer operation and we just made a shift, it is
9201      possible that we could have simplified the shift were it not
9202      for the outer operation.  So try to do the simplification
9203      recursively.  */
9204
9205   if (outer_op != UNKNOWN && GET_CODE (x) == code
9206       && GET_CODE (XEXP (x, 1)) == CONST_INT)
9207     x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0),
9208                               INTVAL (XEXP (x, 1)));
9209
9210   /* If we were doing an LSHIFTRT in a wider mode than it was originally,
9211      turn off all the bits that the shift would have turned off.  */
9212   if (orig_code == LSHIFTRT && result_mode != shift_mode)
9213     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
9214                                 GET_MODE_MASK (result_mode) >> orig_count);
9215
9216   /* Do the remainder of the processing in RESULT_MODE.  */
9217   x = gen_lowpart (result_mode, x);
9218
9219   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
9220      operation.  */
9221   if (complement_p)
9222     x = simplify_gen_unary (NOT, result_mode, x, result_mode);
9223
9224   if (outer_op != UNKNOWN)
9225     {
9226       if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
9227         outer_const = trunc_int_for_mode (outer_const, result_mode);
9228
9229       if (outer_op == AND)
9230         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
9231       else if (outer_op == SET)
9232         /* This means that we have determined that the result is
9233            equivalent to a constant.  This should be rare.  */
9234         x = GEN_INT (outer_const);
9235       else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
9236         x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
9237       else
9238         x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
9239     }
9240
9241   return x;
9242 }
9243 \f
9244 /* Like recog, but we receive the address of a pointer to a new pattern.
9245    We try to match the rtx that the pointer points to.
9246    If that fails, we may try to modify or replace the pattern,
9247    storing the replacement into the same pointer object.
9248
9249    Modifications include deletion or addition of CLOBBERs.
9250
9251    PNOTES is a pointer to a location where any REG_UNUSED notes added for
9252    the CLOBBERs are placed.
9253
9254    The value is the final insn code from the pattern ultimately matched,
9255    or -1.  */
9256
9257 static int
9258 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
9259 {
9260   rtx pat = *pnewpat;
9261   int insn_code_number;
9262   int num_clobbers_to_add = 0;
9263   int i;
9264   rtx notes = 0;
9265   rtx old_notes, old_pat;
9266
9267   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
9268      we use to indicate that something didn't match.  If we find such a
9269      thing, force rejection.  */
9270   if (GET_CODE (pat) == PARALLEL)
9271     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
9272       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
9273           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
9274         return -1;
9275
9276   old_pat = PATTERN (insn);
9277   old_notes = REG_NOTES (insn);
9278   PATTERN (insn) = pat;
9279   REG_NOTES (insn) = 0;
9280
9281   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9282
9283   /* If it isn't, there is the possibility that we previously had an insn
9284      that clobbered some register as a side effect, but the combined
9285      insn doesn't need to do that.  So try once more without the clobbers
9286      unless this represents an ASM insn.  */
9287
9288   if (insn_code_number < 0 && ! check_asm_operands (pat)
9289       && GET_CODE (pat) == PARALLEL)
9290     {
9291       int pos;
9292
9293       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
9294         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
9295           {
9296             if (i != pos)
9297               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
9298             pos++;
9299           }
9300
9301       SUBST_INT (XVECLEN (pat, 0), pos);
9302
9303       if (pos == 1)
9304         pat = XVECEXP (pat, 0, 0);
9305
9306       PATTERN (insn) = pat;
9307       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9308     }
9309   PATTERN (insn) = old_pat;
9310   REG_NOTES (insn) = old_notes;
9311
9312   /* Recognize all noop sets, these will be killed by followup pass.  */
9313   if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
9314     insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
9315
9316   /* If we had any clobbers to add, make a new pattern than contains
9317      them.  Then check to make sure that all of them are dead.  */
9318   if (num_clobbers_to_add)
9319     {
9320       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
9321                                      rtvec_alloc (GET_CODE (pat) == PARALLEL
9322                                                   ? (XVECLEN (pat, 0)
9323                                                      + num_clobbers_to_add)
9324                                                   : num_clobbers_to_add + 1));
9325
9326       if (GET_CODE (pat) == PARALLEL)
9327         for (i = 0; i < XVECLEN (pat, 0); i++)
9328           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
9329       else
9330         XVECEXP (newpat, 0, 0) = pat;
9331
9332       add_clobbers (newpat, insn_code_number);
9333
9334       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
9335            i < XVECLEN (newpat, 0); i++)
9336         {
9337           if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
9338               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
9339             return -1;
9340           notes = gen_rtx_EXPR_LIST (REG_UNUSED,
9341                                      XEXP (XVECEXP (newpat, 0, i), 0), notes);
9342         }
9343       pat = newpat;
9344     }
9345
9346   *pnewpat = pat;
9347   *pnotes = notes;
9348
9349   return insn_code_number;
9350 }
9351 \f
9352 /* Like gen_lowpart_general but for use by combine.  In combine it
9353    is not possible to create any new pseudoregs.  However, it is
9354    safe to create invalid memory addresses, because combine will
9355    try to recognize them and all they will do is make the combine
9356    attempt fail.
9357
9358    If for some reason this cannot do its job, an rtx
9359    (clobber (const_int 0)) is returned.
9360    An insn containing that will not be recognized.  */
9361
9362 static rtx
9363 gen_lowpart_for_combine (enum machine_mode omode, rtx x)
9364 {
9365   enum machine_mode imode = GET_MODE (x);
9366   unsigned int osize = GET_MODE_SIZE (omode);
9367   unsigned int isize = GET_MODE_SIZE (imode);
9368   rtx result;
9369
9370   if (omode == imode)
9371     return x;
9372
9373   /* Return identity if this is a CONST or symbolic reference.  */
9374   if (omode == Pmode
9375       && (GET_CODE (x) == CONST
9376           || GET_CODE (x) == SYMBOL_REF
9377           || GET_CODE (x) == LABEL_REF))
9378     return x;
9379
9380   /* We can only support MODE being wider than a word if X is a
9381      constant integer or has a mode the same size.  */
9382   if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
9383       && ! ((imode == VOIDmode
9384              && (GET_CODE (x) == CONST_INT
9385                  || GET_CODE (x) == CONST_DOUBLE))
9386             || isize == osize))
9387     goto fail;
9388
9389   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
9390      won't know what to do.  So we will strip off the SUBREG here and
9391      process normally.  */
9392   if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
9393     {
9394       x = SUBREG_REG (x);
9395
9396       /* For use in case we fall down into the address adjustments
9397          further below, we need to adjust the known mode and size of
9398          x; imode and isize, since we just adjusted x.  */
9399       imode = GET_MODE (x);
9400
9401       if (imode == omode)
9402         return x;
9403
9404       isize = GET_MODE_SIZE (imode);
9405     }
9406
9407   result = gen_lowpart_common (omode, x);
9408
9409 #ifdef CANNOT_CHANGE_MODE_CLASS
9410   if (result != 0 && GET_CODE (result) == SUBREG)
9411     record_subregs_of_mode (result);
9412 #endif
9413
9414   if (result)
9415     return result;
9416
9417   if (MEM_P (x))
9418     {
9419       int offset = 0;
9420
9421       /* Refuse to work on a volatile memory ref or one with a mode-dependent
9422          address.  */
9423       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
9424         goto fail;
9425
9426       /* If we want to refer to something bigger than the original memref,
9427          generate a paradoxical subreg instead.  That will force a reload
9428          of the original memref X.  */
9429       if (isize < osize)
9430         return gen_rtx_SUBREG (omode, x, 0);
9431
9432       if (WORDS_BIG_ENDIAN)
9433         offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
9434
9435       /* Adjust the address so that the address-after-the-data is unchanged. */
9436       if (BYTES_BIG_ENDIAN)
9437         offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
9438
9439       return adjust_address_nv (x, omode, offset);
9440     }
9441
9442   /* If X is a comparison operator, rewrite it in a new mode.  This
9443      probably won't match, but may allow further simplifications.  */
9444   else if (COMPARISON_P (x))
9445     return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
9446
9447   /* If we couldn't simplify X any other way, just enclose it in a
9448      SUBREG.  Normally, this SUBREG won't match, but some patterns may
9449      include an explicit SUBREG or we may simplify it further in combine.  */
9450   else
9451     {
9452       int offset = 0;
9453       rtx res;
9454
9455       offset = subreg_lowpart_offset (omode, imode);
9456       if (imode == VOIDmode)
9457         {
9458           imode = int_mode_for_mode (omode);
9459           x = gen_lowpart_common (imode, x);
9460           if (x == NULL)
9461             goto fail;
9462         }
9463       res = simplify_gen_subreg (omode, x, imode, offset);
9464       if (res)
9465         return res;
9466     }
9467
9468  fail:
9469   return gen_rtx_CLOBBER (imode, const0_rtx);
9470 }
9471 \f
9472 /* These routines make binary and unary operations by first seeing if they
9473    fold; if not, a new expression is allocated.  */
9474
9475 static rtx
9476 gen_binary (enum rtx_code code, enum machine_mode mode, rtx op0, rtx op1)
9477 {
9478   rtx result;
9479   rtx tem;
9480
9481   if (GET_CODE (op0) == CLOBBER)
9482     return op0;
9483   else if (GET_CODE (op1) == CLOBBER)
9484     return op1;
9485   
9486   if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
9487       && swap_commutative_operands_p (op0, op1))
9488     tem = op0, op0 = op1, op1 = tem;
9489
9490   if (GET_RTX_CLASS (code) == RTX_COMPARE
9491       || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
9492     {
9493       enum machine_mode op_mode = GET_MODE (op0);
9494
9495       /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get
9496          just (REL_OP X Y).  */
9497       if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
9498         {
9499           op1 = XEXP (op0, 1);
9500           op0 = XEXP (op0, 0);
9501           op_mode = GET_MODE (op0);
9502         }
9503
9504       if (op_mode == VOIDmode)
9505         op_mode = GET_MODE (op1);
9506       result = simplify_relational_operation (code, mode, op_mode, op0, op1);
9507     }
9508   else
9509     result = simplify_binary_operation (code, mode, op0, op1);
9510
9511   if (result)
9512     return result;
9513
9514   /* Put complex operands first and constants second.  */
9515   if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
9516       && swap_commutative_operands_p (op0, op1))
9517     return gen_rtx_fmt_ee (code, mode, op1, op0);
9518
9519   /* If we are turning off bits already known off in OP0, we need not do
9520      an AND.  */
9521   else if (code == AND && GET_CODE (op1) == CONST_INT
9522            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9523            && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
9524     return op0;
9525
9526   return gen_rtx_fmt_ee (code, mode, op0, op1);
9527 }
9528 \f
9529 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
9530    comparison code that will be tested.
9531
9532    The result is a possibly different comparison code to use.  *POP0 and
9533    *POP1 may be updated.
9534
9535    It is possible that we might detect that a comparison is either always
9536    true or always false.  However, we do not perform general constant
9537    folding in combine, so this knowledge isn't useful.  Such tautologies
9538    should have been detected earlier.  Hence we ignore all such cases.  */
9539
9540 static enum rtx_code
9541 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
9542 {
9543   rtx op0 = *pop0;
9544   rtx op1 = *pop1;
9545   rtx tem, tem1;
9546   int i;
9547   enum machine_mode mode, tmode;
9548
9549   /* Try a few ways of applying the same transformation to both operands.  */
9550   while (1)
9551     {
9552 #ifndef WORD_REGISTER_OPERATIONS
9553       /* The test below this one won't handle SIGN_EXTENDs on these machines,
9554          so check specially.  */
9555       if (code != GTU && code != GEU && code != LTU && code != LEU
9556           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
9557           && GET_CODE (XEXP (op0, 0)) == ASHIFT
9558           && GET_CODE (XEXP (op1, 0)) == ASHIFT
9559           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
9560           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
9561           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
9562               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
9563           && GET_CODE (XEXP (op0, 1)) == CONST_INT
9564           && XEXP (op0, 1) == XEXP (op1, 1)
9565           && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
9566           && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
9567           && (INTVAL (XEXP (op0, 1))
9568               == (GET_MODE_BITSIZE (GET_MODE (op0))
9569                   - (GET_MODE_BITSIZE
9570                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
9571         {
9572           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
9573           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
9574         }
9575 #endif
9576
9577       /* If both operands are the same constant shift, see if we can ignore the
9578          shift.  We can if the shift is a rotate or if the bits shifted out of
9579          this shift are known to be zero for both inputs and if the type of
9580          comparison is compatible with the shift.  */
9581       if (GET_CODE (op0) == GET_CODE (op1)
9582           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
9583           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
9584               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
9585                   && (code != GT && code != LT && code != GE && code != LE))
9586               || (GET_CODE (op0) == ASHIFTRT
9587                   && (code != GTU && code != LTU
9588                       && code != GEU && code != LEU)))
9589           && GET_CODE (XEXP (op0, 1)) == CONST_INT
9590           && INTVAL (XEXP (op0, 1)) >= 0
9591           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
9592           && XEXP (op0, 1) == XEXP (op1, 1))
9593         {
9594           enum machine_mode mode = GET_MODE (op0);
9595           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
9596           int shift_count = INTVAL (XEXP (op0, 1));
9597
9598           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
9599             mask &= (mask >> shift_count) << shift_count;
9600           else if (GET_CODE (op0) == ASHIFT)
9601             mask = (mask & (mask << shift_count)) >> shift_count;
9602
9603           if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
9604               && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
9605             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
9606           else
9607             break;
9608         }
9609
9610       /* If both operands are AND's of a paradoxical SUBREG by constant, the
9611          SUBREGs are of the same mode, and, in both cases, the AND would
9612          be redundant if the comparison was done in the narrower mode,
9613          do the comparison in the narrower mode (e.g., we are AND'ing with 1
9614          and the operand's possibly nonzero bits are 0xffffff01; in that case
9615          if we only care about QImode, we don't need the AND).  This case
9616          occurs if the output mode of an scc insn is not SImode and
9617          STORE_FLAG_VALUE == 1 (e.g., the 386).
9618
9619          Similarly, check for a case where the AND's are ZERO_EXTEND
9620          operations from some narrower mode even though a SUBREG is not
9621          present.  */
9622
9623       else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
9624                && GET_CODE (XEXP (op0, 1)) == CONST_INT
9625                && GET_CODE (XEXP (op1, 1)) == CONST_INT)
9626         {
9627           rtx inner_op0 = XEXP (op0, 0);
9628           rtx inner_op1 = XEXP (op1, 0);
9629           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
9630           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
9631           int changed = 0;
9632
9633           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
9634               && (GET_MODE_SIZE (GET_MODE (inner_op0))
9635                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
9636               && (GET_MODE (SUBREG_REG (inner_op0))
9637                   == GET_MODE (SUBREG_REG (inner_op1)))
9638               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
9639                   <= HOST_BITS_PER_WIDE_INT)
9640               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
9641                                              GET_MODE (SUBREG_REG (inner_op0)))))
9642               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
9643                                              GET_MODE (SUBREG_REG (inner_op1))))))
9644             {
9645               op0 = SUBREG_REG (inner_op0);
9646               op1 = SUBREG_REG (inner_op1);
9647
9648               /* The resulting comparison is always unsigned since we masked
9649                  off the original sign bit.  */
9650               code = unsigned_condition (code);
9651
9652               changed = 1;
9653             }
9654
9655           else if (c0 == c1)
9656             for (tmode = GET_CLASS_NARROWEST_MODE
9657                  (GET_MODE_CLASS (GET_MODE (op0)));
9658                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
9659               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
9660                 {
9661                   op0 = gen_lowpart (tmode, inner_op0);
9662                   op1 = gen_lowpart (tmode, inner_op1);
9663                   code = unsigned_condition (code);
9664                   changed = 1;
9665                   break;
9666                 }
9667
9668           if (! changed)
9669             break;
9670         }
9671
9672       /* If both operands are NOT, we can strip off the outer operation
9673          and adjust the comparison code for swapped operands; similarly for
9674          NEG, except that this must be an equality comparison.  */
9675       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
9676                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
9677                    && (code == EQ || code == NE)))
9678         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
9679
9680       else
9681         break;
9682     }
9683
9684   /* If the first operand is a constant, swap the operands and adjust the
9685      comparison code appropriately, but don't do this if the second operand
9686      is already a constant integer.  */
9687   if (swap_commutative_operands_p (op0, op1))
9688     {
9689       tem = op0, op0 = op1, op1 = tem;
9690       code = swap_condition (code);
9691     }
9692
9693   /* We now enter a loop during which we will try to simplify the comparison.
9694      For the most part, we only are concerned with comparisons with zero,
9695      but some things may really be comparisons with zero but not start
9696      out looking that way.  */
9697
9698   while (GET_CODE (op1) == CONST_INT)
9699     {
9700       enum machine_mode mode = GET_MODE (op0);
9701       unsigned int mode_width = GET_MODE_BITSIZE (mode);
9702       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
9703       int equality_comparison_p;
9704       int sign_bit_comparison_p;
9705       int unsigned_comparison_p;
9706       HOST_WIDE_INT const_op;
9707
9708       /* We only want to handle integral modes.  This catches VOIDmode,
9709          CCmode, and the floating-point modes.  An exception is that we
9710          can handle VOIDmode if OP0 is a COMPARE or a comparison
9711          operation.  */
9712
9713       if (GET_MODE_CLASS (mode) != MODE_INT
9714           && ! (mode == VOIDmode
9715                 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
9716         break;
9717
9718       /* Get the constant we are comparing against and turn off all bits
9719          not on in our mode.  */
9720       const_op = INTVAL (op1);
9721       if (mode != VOIDmode)
9722         const_op = trunc_int_for_mode (const_op, mode);
9723       op1 = GEN_INT (const_op);
9724
9725       /* If we are comparing against a constant power of two and the value
9726          being compared can only have that single bit nonzero (e.g., it was
9727          `and'ed with that bit), we can replace this with a comparison
9728          with zero.  */
9729       if (const_op
9730           && (code == EQ || code == NE || code == GE || code == GEU
9731               || code == LT || code == LTU)
9732           && mode_width <= HOST_BITS_PER_WIDE_INT
9733           && exact_log2 (const_op) >= 0
9734           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
9735         {
9736           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
9737           op1 = const0_rtx, const_op = 0;
9738         }
9739
9740       /* Similarly, if we are comparing a value known to be either -1 or
9741          0 with -1, change it to the opposite comparison against zero.  */
9742
9743       if (const_op == -1
9744           && (code == EQ || code == NE || code == GT || code == LE
9745               || code == GEU || code == LTU)
9746           && num_sign_bit_copies (op0, mode) == mode_width)
9747         {
9748           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
9749           op1 = const0_rtx, const_op = 0;
9750         }
9751
9752       /* Do some canonicalizations based on the comparison code.  We prefer
9753          comparisons against zero and then prefer equality comparisons.
9754          If we can reduce the size of a constant, we will do that too.  */
9755
9756       switch (code)
9757         {
9758         case LT:
9759           /* < C is equivalent to <= (C - 1) */
9760           if (const_op > 0)
9761             {
9762               const_op -= 1;
9763               op1 = GEN_INT (const_op);
9764               code = LE;
9765               /* ... fall through to LE case below.  */
9766             }
9767           else
9768             break;
9769
9770         case LE:
9771           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
9772           if (const_op < 0)
9773             {
9774               const_op += 1;
9775               op1 = GEN_INT (const_op);
9776               code = LT;
9777             }
9778
9779           /* If we are doing a <= 0 comparison on a value known to have
9780              a zero sign bit, we can replace this with == 0.  */
9781           else if (const_op == 0
9782                    && mode_width <= HOST_BITS_PER_WIDE_INT
9783                    && (nonzero_bits (op0, mode)
9784                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
9785             code = EQ;
9786           break;
9787
9788         case GE:
9789           /* >= C is equivalent to > (C - 1).  */
9790           if (const_op > 0)
9791             {
9792               const_op -= 1;
9793               op1 = GEN_INT (const_op);
9794               code = GT;
9795               /* ... fall through to GT below.  */
9796             }
9797           else
9798             break;
9799
9800         case GT:
9801           /* > C is equivalent to >= (C + 1); we do this for C < 0.  */
9802           if (const_op < 0)
9803             {
9804               const_op += 1;
9805               op1 = GEN_INT (const_op);
9806               code = GE;
9807             }
9808
9809           /* If we are doing a > 0 comparison on a value known to have
9810              a zero sign bit, we can replace this with != 0.  */
9811           else if (const_op == 0
9812                    && mode_width <= HOST_BITS_PER_WIDE_INT
9813                    && (nonzero_bits (op0, mode)
9814                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
9815             code = NE;
9816           break;
9817
9818         case LTU:
9819           /* < C is equivalent to <= (C - 1).  */
9820           if (const_op > 0)
9821             {
9822               const_op -= 1;
9823               op1 = GEN_INT (const_op);
9824               code = LEU;
9825               /* ... fall through ...  */
9826             }
9827
9828           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
9829           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9830                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
9831             {
9832               const_op = 0, op1 = const0_rtx;
9833               code = GE;
9834               break;
9835             }
9836           else
9837             break;
9838
9839         case LEU:
9840           /* unsigned <= 0 is equivalent to == 0 */
9841           if (const_op == 0)
9842             code = EQ;
9843
9844           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
9845           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9846                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
9847             {
9848               const_op = 0, op1 = const0_rtx;
9849               code = GE;
9850             }
9851           break;
9852
9853         case GEU:
9854           /* >= C is equivalent to > (C - 1).  */
9855           if (const_op > 1)
9856             {
9857               const_op -= 1;
9858               op1 = GEN_INT (const_op);
9859               code = GTU;
9860               /* ... fall through ...  */
9861             }
9862
9863           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
9864           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9865                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
9866             {
9867               const_op = 0, op1 = const0_rtx;
9868               code = LT;
9869               break;
9870             }
9871           else
9872             break;
9873
9874         case GTU:
9875           /* unsigned > 0 is equivalent to != 0 */
9876           if (const_op == 0)
9877             code = NE;
9878
9879           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
9880           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9881                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
9882             {
9883               const_op = 0, op1 = const0_rtx;
9884               code = LT;
9885             }
9886           break;
9887
9888         default:
9889           break;
9890         }
9891
9892       /* Compute some predicates to simplify code below.  */
9893
9894       equality_comparison_p = (code == EQ || code == NE);
9895       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
9896       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
9897                                || code == GEU);
9898
9899       /* If this is a sign bit comparison and we can do arithmetic in
9900          MODE, say that we will only be needing the sign bit of OP0.  */
9901       if (sign_bit_comparison_p
9902           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
9903         op0 = force_to_mode (op0, mode,
9904                              ((HOST_WIDE_INT) 1
9905                               << (GET_MODE_BITSIZE (mode) - 1)),
9906                              NULL_RTX, 0);
9907
9908       /* Now try cases based on the opcode of OP0.  If none of the cases
9909          does a "continue", we exit this loop immediately after the
9910          switch.  */
9911
9912       switch (GET_CODE (op0))
9913         {
9914         case ZERO_EXTRACT:
9915           /* If we are extracting a single bit from a variable position in
9916              a constant that has only a single bit set and are comparing it
9917              with zero, we can convert this into an equality comparison
9918              between the position and the location of the single bit.  */
9919           /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
9920              have already reduced the shift count modulo the word size.  */
9921           if (!SHIFT_COUNT_TRUNCATED
9922               && GET_CODE (XEXP (op0, 0)) == CONST_INT
9923               && XEXP (op0, 1) == const1_rtx
9924               && equality_comparison_p && const_op == 0
9925               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
9926             {
9927               if (BITS_BIG_ENDIAN)
9928                 {
9929                   enum machine_mode new_mode
9930                     = mode_for_extraction (EP_extzv, 1);
9931                   if (new_mode == MAX_MACHINE_MODE)
9932                     i = BITS_PER_WORD - 1 - i;
9933                   else
9934                     {
9935                       mode = new_mode;
9936                       i = (GET_MODE_BITSIZE (mode) - 1 - i);
9937                     }
9938                 }
9939
9940               op0 = XEXP (op0, 2);
9941               op1 = GEN_INT (i);
9942               const_op = i;
9943
9944               /* Result is nonzero iff shift count is equal to I.  */
9945               code = reverse_condition (code);
9946               continue;
9947             }
9948
9949           /* ... fall through ...  */
9950
9951         case SIGN_EXTRACT:
9952           tem = expand_compound_operation (op0);
9953           if (tem != op0)
9954             {
9955               op0 = tem;
9956               continue;
9957             }
9958           break;
9959
9960         case NOT:
9961           /* If testing for equality, we can take the NOT of the constant.  */
9962           if (equality_comparison_p
9963               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
9964             {
9965               op0 = XEXP (op0, 0);
9966               op1 = tem;
9967               continue;
9968             }
9969
9970           /* If just looking at the sign bit, reverse the sense of the
9971              comparison.  */
9972           if (sign_bit_comparison_p)
9973             {
9974               op0 = XEXP (op0, 0);
9975               code = (code == GE ? LT : GE);
9976               continue;
9977             }
9978           break;
9979
9980         case NEG:
9981           /* If testing for equality, we can take the NEG of the constant.  */
9982           if (equality_comparison_p
9983               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
9984             {
9985               op0 = XEXP (op0, 0);
9986               op1 = tem;
9987               continue;
9988             }
9989
9990           /* The remaining cases only apply to comparisons with zero.  */
9991           if (const_op != 0)
9992             break;
9993
9994           /* When X is ABS or is known positive,
9995              (neg X) is < 0 if and only if X != 0.  */
9996
9997           if (sign_bit_comparison_p
9998               && (GET_CODE (XEXP (op0, 0)) == ABS
9999                   || (mode_width <= HOST_BITS_PER_WIDE_INT
10000                       && (nonzero_bits (XEXP (op0, 0), mode)
10001                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10002             {
10003               op0 = XEXP (op0, 0);
10004               code = (code == LT ? NE : EQ);
10005               continue;
10006             }
10007
10008           /* If we have NEG of something whose two high-order bits are the
10009              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
10010           if (num_sign_bit_copies (op0, mode) >= 2)
10011             {
10012               op0 = XEXP (op0, 0);
10013               code = swap_condition (code);
10014               continue;
10015             }
10016           break;
10017
10018         case ROTATE:
10019           /* If we are testing equality and our count is a constant, we
10020              can perform the inverse operation on our RHS.  */
10021           if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10022               && (tem = simplify_binary_operation (ROTATERT, mode,
10023                                                    op1, XEXP (op0, 1))) != 0)
10024             {
10025               op0 = XEXP (op0, 0);
10026               op1 = tem;
10027               continue;
10028             }
10029
10030           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10031              a particular bit.  Convert it to an AND of a constant of that
10032              bit.  This will be converted into a ZERO_EXTRACT.  */
10033           if (const_op == 0 && sign_bit_comparison_p
10034               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10035               && mode_width <= HOST_BITS_PER_WIDE_INT)
10036             {
10037               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10038                                             ((HOST_WIDE_INT) 1
10039                                              << (mode_width - 1
10040                                                  - INTVAL (XEXP (op0, 1)))));
10041               code = (code == LT ? NE : EQ);
10042               continue;
10043             }
10044
10045           /* Fall through.  */
10046
10047         case ABS:
10048           /* ABS is ignorable inside an equality comparison with zero.  */
10049           if (const_op == 0 && equality_comparison_p)
10050             {
10051               op0 = XEXP (op0, 0);
10052               continue;
10053             }
10054           break;
10055
10056         case SIGN_EXTEND:
10057           /* Can simplify (compare (zero/sign_extend FOO) CONST)
10058              to (compare FOO CONST) if CONST fits in FOO's mode and we
10059              are either testing inequality or have an unsigned comparison
10060              with ZERO_EXTEND or a signed comparison with SIGN_EXTEND.  */
10061           if (! unsigned_comparison_p
10062               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10063                   <= HOST_BITS_PER_WIDE_INT)
10064               && ((unsigned HOST_WIDE_INT) const_op
10065                   < (((unsigned HOST_WIDE_INT) 1
10066                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1)))))
10067             {
10068               op0 = XEXP (op0, 0);
10069               continue;
10070             }
10071           break;
10072
10073         case SUBREG:
10074           /* Check for the case where we are comparing A - C1 with C2, that is
10075
10076                (subreg:MODE (plus (A) (-C1))) op (C2)
10077
10078              with C1 a constant, and try to lift the SUBREG, i.e. to do the
10079              comparison in the wider mode.  One of the following two conditions
10080              must be true in order for this to be valid:
10081
10082                1. The mode extension results in the same bit pattern being added
10083                   on both sides and the comparison is equality or unsigned.  As
10084                   C2 has been truncated to fit in MODE, the pattern can only be
10085                   all 0s or all 1s.
10086
10087                2. The mode extension results in the sign bit being copied on
10088                   each side.
10089
10090              The difficulty here is that we have predicates for A but not for
10091              (A - C1) so we need to check that C1 is within proper bounds so
10092              as to perturbate A as little as possible.  */
10093
10094           if (mode_width <= HOST_BITS_PER_WIDE_INT
10095               && subreg_lowpart_p (op0)
10096               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) > mode_width
10097               && GET_CODE (SUBREG_REG (op0)) == PLUS
10098               && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT)
10099             {
10100               enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
10101               rtx a = XEXP (SUBREG_REG (op0), 0);
10102               HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
10103
10104               if ((c1 > 0
10105                    && (unsigned HOST_WIDE_INT) c1
10106                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
10107                    && (equality_comparison_p || unsigned_comparison_p)
10108                    /* (A - C1) zero-extends if it is positive and sign-extends
10109                       if it is negative, C2 both zero- and sign-extends.  */
10110                    && ((0 == (nonzero_bits (a, inner_mode)
10111                               & ~GET_MODE_MASK (mode))
10112                         && const_op >= 0)
10113                        /* (A - C1) sign-extends if it is positive and 1-extends
10114                           if it is negative, C2 both sign- and 1-extends.  */
10115                        || (num_sign_bit_copies (a, inner_mode)
10116                            > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10117                                              - mode_width)
10118                            && const_op < 0)))
10119                   || ((unsigned HOST_WIDE_INT) c1
10120                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
10121                       /* (A - C1) always sign-extends, like C2.  */
10122                       && num_sign_bit_copies (a, inner_mode)
10123                          > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10124                                            - mode_width - 1)))
10125                 {
10126                   op0 = SUBREG_REG (op0);
10127                   continue;
10128                 }
10129             }
10130
10131           /* If the inner mode is narrower and we are extracting the low part,
10132              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
10133           if (subreg_lowpart_p (op0)
10134               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10135             /* Fall through */ ;
10136           else
10137             break;
10138
10139           /* ... fall through ...  */
10140
10141         case ZERO_EXTEND:
10142           if ((unsigned_comparison_p || equality_comparison_p)
10143               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10144                   <= HOST_BITS_PER_WIDE_INT)
10145               && ((unsigned HOST_WIDE_INT) const_op
10146                   < GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))))
10147             {
10148               op0 = XEXP (op0, 0);
10149               continue;
10150             }
10151           break;
10152
10153         case PLUS:
10154           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
10155              this for equality comparisons due to pathological cases involving
10156              overflows.  */
10157           if (equality_comparison_p
10158               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10159                                                         op1, XEXP (op0, 1))))
10160             {
10161               op0 = XEXP (op0, 0);
10162               op1 = tem;
10163               continue;
10164             }
10165
10166           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
10167           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10168               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10169             {
10170               op0 = XEXP (XEXP (op0, 0), 0);
10171               code = (code == LT ? EQ : NE);
10172               continue;
10173             }
10174           break;
10175
10176         case MINUS:
10177           /* We used to optimize signed comparisons against zero, but that
10178              was incorrect.  Unsigned comparisons against zero (GTU, LEU)
10179              arrive here as equality comparisons, or (GEU, LTU) are
10180              optimized away.  No need to special-case them.  */
10181
10182           /* (eq (minus A B) C) -> (eq A (plus B C)) or
10183              (eq B (minus A C)), whichever simplifies.  We can only do
10184              this for equality comparisons due to pathological cases involving
10185              overflows.  */
10186           if (equality_comparison_p
10187               && 0 != (tem = simplify_binary_operation (PLUS, mode,
10188                                                         XEXP (op0, 1), op1)))
10189             {
10190               op0 = XEXP (op0, 0);
10191               op1 = tem;
10192               continue;
10193             }
10194
10195           if (equality_comparison_p
10196               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10197                                                         XEXP (op0, 0), op1)))
10198             {
10199               op0 = XEXP (op0, 1);
10200               op1 = tem;
10201               continue;
10202             }
10203
10204           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10205              of bits in X minus 1, is one iff X > 0.  */
10206           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10207               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10208               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (op0, 0), 1))
10209                  == mode_width - 1
10210               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10211             {
10212               op0 = XEXP (op0, 1);
10213               code = (code == GE ? LE : GT);
10214               continue;
10215             }
10216           break;
10217
10218         case XOR:
10219           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
10220              if C is zero or B is a constant.  */
10221           if (equality_comparison_p
10222               && 0 != (tem = simplify_binary_operation (XOR, mode,
10223                                                         XEXP (op0, 1), op1)))
10224             {
10225               op0 = XEXP (op0, 0);
10226               op1 = tem;
10227               continue;
10228             }
10229           break;
10230
10231         case EQ:  case NE:
10232         case UNEQ:  case LTGT:
10233         case LT:  case LTU:  case UNLT:  case LE:  case LEU:  case UNLE:
10234         case GT:  case GTU:  case UNGT:  case GE:  case GEU:  case UNGE:
10235         case UNORDERED: case ORDERED:
10236           /* We can't do anything if OP0 is a condition code value, rather
10237              than an actual data value.  */
10238           if (const_op != 0
10239               || CC0_P (XEXP (op0, 0))
10240               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
10241             break;
10242
10243           /* Get the two operands being compared.  */
10244           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
10245             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
10246           else
10247             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
10248
10249           /* Check for the cases where we simply want the result of the
10250              earlier test or the opposite of that result.  */
10251           if (code == NE || code == EQ
10252               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10253                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10254                   && (STORE_FLAG_VALUE
10255                       & (((HOST_WIDE_INT) 1
10256                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
10257                   && (code == LT || code == GE)))
10258             {
10259               enum rtx_code new_code;
10260               if (code == LT || code == NE)
10261                 new_code = GET_CODE (op0);
10262               else
10263                 new_code = combine_reversed_comparison_code (op0);
10264
10265               if (new_code != UNKNOWN)
10266                 {
10267                   code = new_code;
10268                   op0 = tem;
10269                   op1 = tem1;
10270                   continue;
10271                 }
10272             }
10273           break;
10274
10275         case IOR:
10276           /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
10277              iff X <= 0.  */
10278           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
10279               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
10280               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10281             {
10282               op0 = XEXP (op0, 1);
10283               code = (code == GE ? GT : LE);
10284               continue;
10285             }
10286           break;
10287
10288         case AND:
10289           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
10290              will be converted to a ZERO_EXTRACT later.  */
10291           if (const_op == 0 && equality_comparison_p
10292               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10293               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
10294             {
10295               op0 = simplify_and_const_int
10296                 (op0, mode, gen_rtx_LSHIFTRT (mode,
10297                                               XEXP (op0, 1),
10298                                               XEXP (XEXP (op0, 0), 1)),
10299                  (HOST_WIDE_INT) 1);
10300               continue;
10301             }
10302
10303           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
10304              zero and X is a comparison and C1 and C2 describe only bits set
10305              in STORE_FLAG_VALUE, we can compare with X.  */
10306           if (const_op == 0 && equality_comparison_p
10307               && mode_width <= HOST_BITS_PER_WIDE_INT
10308               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10309               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10310               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10311               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
10312               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
10313             {
10314               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10315                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
10316               if ((~STORE_FLAG_VALUE & mask) == 0
10317                   && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
10318                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
10319                           && COMPARISON_P (tem))))
10320                 {
10321                   op0 = XEXP (XEXP (op0, 0), 0);
10322                   continue;
10323                 }
10324             }
10325
10326           /* If we are doing an equality comparison of an AND of a bit equal
10327              to the sign bit, replace this with a LT or GE comparison of
10328              the underlying value.  */
10329           if (equality_comparison_p
10330               && const_op == 0
10331               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10332               && mode_width <= HOST_BITS_PER_WIDE_INT
10333               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10334                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10335             {
10336               op0 = XEXP (op0, 0);
10337               code = (code == EQ ? GE : LT);
10338               continue;
10339             }
10340
10341           /* If this AND operation is really a ZERO_EXTEND from a narrower
10342              mode, the constant fits within that mode, and this is either an
10343              equality or unsigned comparison, try to do this comparison in
10344              the narrower mode.  */
10345           if ((equality_comparison_p || unsigned_comparison_p)
10346               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10347               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
10348                                    & GET_MODE_MASK (mode))
10349                                   + 1)) >= 0
10350               && const_op >> i == 0
10351               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
10352             {
10353               op0 = gen_lowpart (tmode, XEXP (op0, 0));
10354               continue;
10355             }
10356
10357           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
10358              fits in both M1 and M2 and the SUBREG is either paradoxical
10359              or represents the low part, permute the SUBREG and the AND
10360              and try again.  */
10361           if (GET_CODE (XEXP (op0, 0)) == SUBREG)
10362             {
10363               unsigned HOST_WIDE_INT c1;
10364               tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
10365               /* Require an integral mode, to avoid creating something like
10366                  (AND:SF ...).  */
10367               if (SCALAR_INT_MODE_P (tmode)
10368                   /* It is unsafe to commute the AND into the SUBREG if the
10369                      SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
10370                      not defined.  As originally written the upper bits
10371                      have a defined value due to the AND operation.
10372                      However, if we commute the AND inside the SUBREG then
10373                      they no longer have defined values and the meaning of
10374                      the code has been changed.  */
10375                   && (0
10376 #ifdef WORD_REGISTER_OPERATIONS
10377                       || (mode_width > GET_MODE_BITSIZE (tmode)
10378                           && mode_width <= BITS_PER_WORD)
10379 #endif
10380                       || (mode_width <= GET_MODE_BITSIZE (tmode)
10381                           && subreg_lowpart_p (XEXP (op0, 0))))
10382                   && GET_CODE (XEXP (op0, 1)) == CONST_INT
10383                   && mode_width <= HOST_BITS_PER_WIDE_INT
10384                   && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
10385                   && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
10386                   && (c1 & ~GET_MODE_MASK (tmode)) == 0
10387                   && c1 != mask
10388                   && c1 != GET_MODE_MASK (tmode))
10389                 {
10390                   op0 = gen_binary (AND, tmode,
10391                                     SUBREG_REG (XEXP (op0, 0)),
10392                                     gen_int_mode (c1, tmode));
10393                   op0 = gen_lowpart (mode, op0);
10394                   continue;
10395                 }
10396             }
10397
10398           /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0).  */
10399           if (const_op == 0 && equality_comparison_p
10400               && XEXP (op0, 1) == const1_rtx
10401               && GET_CODE (XEXP (op0, 0)) == NOT)
10402             {
10403               op0 = simplify_and_const_int
10404                 (NULL_RTX, mode, XEXP (XEXP (op0, 0), 0), (HOST_WIDE_INT) 1);
10405               code = (code == NE ? EQ : NE);
10406               continue;
10407             }
10408
10409           /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
10410              (eq (and (lshiftrt X) 1) 0).
10411              Also handle the case where (not X) is expressed using xor.  */
10412           if (const_op == 0 && equality_comparison_p
10413               && XEXP (op0, 1) == const1_rtx
10414               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
10415             {
10416               rtx shift_op = XEXP (XEXP (op0, 0), 0);
10417               rtx shift_count = XEXP (XEXP (op0, 0), 1);
10418
10419               if (GET_CODE (shift_op) == NOT
10420                   || (GET_CODE (shift_op) == XOR
10421                       && GET_CODE (XEXP (shift_op, 1)) == CONST_INT
10422                       && GET_CODE (shift_count) == CONST_INT
10423                       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
10424                       && (INTVAL (XEXP (shift_op, 1))
10425                           == (HOST_WIDE_INT) 1 << INTVAL (shift_count))))
10426                 {
10427                   op0 = simplify_and_const_int
10428                     (NULL_RTX, mode,
10429                      gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count),
10430                      (HOST_WIDE_INT) 1);
10431                   code = (code == NE ? EQ : NE);
10432                   continue;
10433                 }
10434             }
10435           break;
10436
10437         case ASHIFT:
10438           /* If we have (compare (ashift FOO N) (const_int C)) and
10439              the high order N bits of FOO (N+1 if an inequality comparison)
10440              are known to be zero, we can do this by comparing FOO with C
10441              shifted right N bits so long as the low-order N bits of C are
10442              zero.  */
10443           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10444               && INTVAL (XEXP (op0, 1)) >= 0
10445               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
10446                   < HOST_BITS_PER_WIDE_INT)
10447               && ((const_op
10448                    & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
10449               && mode_width <= HOST_BITS_PER_WIDE_INT
10450               && (nonzero_bits (XEXP (op0, 0), mode)
10451                   & ~(mask >> (INTVAL (XEXP (op0, 1))
10452                                + ! equality_comparison_p))) == 0)
10453             {
10454               /* We must perform a logical shift, not an arithmetic one,
10455                  as we want the top N bits of C to be zero.  */
10456               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
10457
10458               temp >>= INTVAL (XEXP (op0, 1));
10459               op1 = gen_int_mode (temp, mode);
10460               op0 = XEXP (op0, 0);
10461               continue;
10462             }
10463
10464           /* If we are doing a sign bit comparison, it means we are testing
10465              a particular bit.  Convert it to the appropriate AND.  */
10466           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10467               && mode_width <= HOST_BITS_PER_WIDE_INT)
10468             {
10469               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10470                                             ((HOST_WIDE_INT) 1
10471                                              << (mode_width - 1
10472                                                  - INTVAL (XEXP (op0, 1)))));
10473               code = (code == LT ? NE : EQ);
10474               continue;
10475             }
10476
10477           /* If this an equality comparison with zero and we are shifting
10478              the low bit to the sign bit, we can convert this to an AND of the
10479              low-order bit.  */
10480           if (const_op == 0 && equality_comparison_p
10481               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10482               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
10483                  == mode_width - 1)
10484             {
10485               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10486                                             (HOST_WIDE_INT) 1);
10487               continue;
10488             }
10489           break;
10490
10491         case ASHIFTRT:
10492           /* If this is an equality comparison with zero, we can do this
10493              as a logical shift, which might be much simpler.  */
10494           if (equality_comparison_p && const_op == 0
10495               && GET_CODE (XEXP (op0, 1)) == CONST_INT)
10496             {
10497               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
10498                                           XEXP (op0, 0),
10499                                           INTVAL (XEXP (op0, 1)));
10500               continue;
10501             }
10502
10503           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
10504              do the comparison in a narrower mode.  */
10505           if (! unsigned_comparison_p
10506               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10507               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10508               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10509               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10510                                          MODE_INT, 1)) != BLKmode
10511               && (((unsigned HOST_WIDE_INT) const_op
10512                    + (GET_MODE_MASK (tmode) >> 1) + 1)
10513                   <= GET_MODE_MASK (tmode)))
10514             {
10515               op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
10516               continue;
10517             }
10518
10519           /* Likewise if OP0 is a PLUS of a sign extension with a
10520              constant, which is usually represented with the PLUS
10521              between the shifts.  */
10522           if (! unsigned_comparison_p
10523               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10524               && GET_CODE (XEXP (op0, 0)) == PLUS
10525               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10526               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
10527               && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
10528               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10529                                          MODE_INT, 1)) != BLKmode
10530               && (((unsigned HOST_WIDE_INT) const_op
10531                    + (GET_MODE_MASK (tmode) >> 1) + 1)
10532                   <= GET_MODE_MASK (tmode)))
10533             {
10534               rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
10535               rtx add_const = XEXP (XEXP (op0, 0), 1);
10536               rtx new_const = gen_binary (ASHIFTRT, GET_MODE (op0), add_const,
10537                                           XEXP (op0, 1));
10538
10539               op0 = gen_binary (PLUS, tmode,
10540                                 gen_lowpart (tmode, inner),
10541                                 new_const);
10542               continue;
10543             }
10544
10545           /* ... fall through ...  */
10546         case LSHIFTRT:
10547           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
10548              the low order N bits of FOO are known to be zero, we can do this
10549              by comparing FOO with C shifted left N bits so long as no
10550              overflow occurs.  */
10551           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10552               && INTVAL (XEXP (op0, 1)) >= 0
10553               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10554               && mode_width <= HOST_BITS_PER_WIDE_INT
10555               && (nonzero_bits (XEXP (op0, 0), mode)
10556                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
10557               && (((unsigned HOST_WIDE_INT) const_op
10558                    + (GET_CODE (op0) != LSHIFTRT
10559                       ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
10560                          + 1)
10561                       : 0))
10562                   <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
10563             {
10564               /* If the shift was logical, then we must make the condition
10565                  unsigned.  */
10566               if (GET_CODE (op0) == LSHIFTRT)
10567                 code = unsigned_condition (code);
10568
10569               const_op <<= INTVAL (XEXP (op0, 1));
10570               op1 = GEN_INT (const_op);
10571               op0 = XEXP (op0, 0);
10572               continue;
10573             }
10574
10575           /* If we are using this shift to extract just the sign bit, we
10576              can replace this with an LT or GE comparison.  */
10577           if (const_op == 0
10578               && (equality_comparison_p || sign_bit_comparison_p)
10579               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10580               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
10581                  == mode_width - 1)
10582             {
10583               op0 = XEXP (op0, 0);
10584               code = (code == NE || code == GT ? LT : GE);
10585               continue;
10586             }
10587           break;
10588
10589         default:
10590           break;
10591         }
10592
10593       break;
10594     }
10595
10596   /* Now make any compound operations involved in this comparison.  Then,
10597      check for an outmost SUBREG on OP0 that is not doing anything or is
10598      paradoxical.  The latter transformation must only be performed when
10599      it is known that the "extra" bits will be the same in op0 and op1 or
10600      that they don't matter.  There are three cases to consider:
10601
10602      1. SUBREG_REG (op0) is a register.  In this case the bits are don't
10603      care bits and we can assume they have any convenient value.  So
10604      making the transformation is safe.
10605
10606      2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
10607      In this case the upper bits of op0 are undefined.  We should not make
10608      the simplification in that case as we do not know the contents of
10609      those bits.
10610
10611      3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
10612      UNKNOWN.  In that case we know those bits are zeros or ones.  We must
10613      also be sure that they are the same as the upper bits of op1.
10614
10615      We can never remove a SUBREG for a non-equality comparison because
10616      the sign bit is in a different place in the underlying object.  */
10617
10618   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
10619   op1 = make_compound_operation (op1, SET);
10620
10621   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
10622       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10623       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
10624       && (code == NE || code == EQ))
10625     {
10626       if (GET_MODE_SIZE (GET_MODE (op0))
10627           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
10628         {
10629           /* For paradoxical subregs, allow case 1 as above.  Case 3 isn't
10630              implemented.  */
10631           if (REG_P (SUBREG_REG (op0)))
10632             {
10633               op0 = SUBREG_REG (op0);
10634               op1 = gen_lowpart (GET_MODE (op0), op1);
10635             }
10636         }
10637       else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10638                 <= HOST_BITS_PER_WIDE_INT)
10639                && (nonzero_bits (SUBREG_REG (op0),
10640                                  GET_MODE (SUBREG_REG (op0)))
10641                    & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
10642         {
10643           tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
10644
10645           if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
10646                & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
10647             op0 = SUBREG_REG (op0), op1 = tem;
10648         }
10649     }
10650
10651   /* We now do the opposite procedure: Some machines don't have compare
10652      insns in all modes.  If OP0's mode is an integer mode smaller than a
10653      word and we can't do a compare in that mode, see if there is a larger
10654      mode for which we can do the compare.  There are a number of cases in
10655      which we can use the wider mode.  */
10656
10657   mode = GET_MODE (op0);
10658   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10659       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
10660       && ! have_insn_for (COMPARE, mode))
10661     for (tmode = GET_MODE_WIDER_MODE (mode);
10662          (tmode != VOIDmode
10663           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
10664          tmode = GET_MODE_WIDER_MODE (tmode))
10665       if (have_insn_for (COMPARE, tmode))
10666         {
10667           int zero_extended;
10668
10669           /* If the only nonzero bits in OP0 and OP1 are those in the
10670              narrower mode and this is an equality or unsigned comparison,
10671              we can use the wider mode.  Similarly for sign-extended
10672              values, in which case it is true for all comparisons.  */
10673           zero_extended = ((code == EQ || code == NE
10674                             || code == GEU || code == GTU
10675                             || code == LEU || code == LTU)
10676                            && (nonzero_bits (op0, tmode)
10677                                & ~GET_MODE_MASK (mode)) == 0
10678                            && ((GET_CODE (op1) == CONST_INT
10679                                 || (nonzero_bits (op1, tmode)
10680                                     & ~GET_MODE_MASK (mode)) == 0)));
10681
10682           if (zero_extended
10683               || ((num_sign_bit_copies (op0, tmode)
10684                    > (unsigned int) (GET_MODE_BITSIZE (tmode)
10685                                      - GET_MODE_BITSIZE (mode)))
10686                   && (num_sign_bit_copies (op1, tmode)
10687                       > (unsigned int) (GET_MODE_BITSIZE (tmode)
10688                                         - GET_MODE_BITSIZE (mode)))))
10689             {
10690               /* If OP0 is an AND and we don't have an AND in MODE either,
10691                  make a new AND in the proper mode.  */
10692               if (GET_CODE (op0) == AND
10693                   && !have_insn_for (AND, mode))
10694                 op0 = gen_binary (AND, tmode,
10695                                   gen_lowpart (tmode,
10696                                                XEXP (op0, 0)),
10697                                   gen_lowpart (tmode,
10698                                                XEXP (op0, 1)));
10699
10700               op0 = gen_lowpart (tmode, op0);
10701               if (zero_extended && GET_CODE (op1) == CONST_INT)
10702                 op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
10703               op1 = gen_lowpart (tmode, op1);
10704               break;
10705             }
10706
10707           /* If this is a test for negative, we can make an explicit
10708              test of the sign bit.  */
10709
10710           if (op1 == const0_rtx && (code == LT || code == GE)
10711               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10712             {
10713               op0 = gen_binary (AND, tmode,
10714                                 gen_lowpart (tmode, op0),
10715                                 GEN_INT ((HOST_WIDE_INT) 1
10716                                          << (GET_MODE_BITSIZE (mode) - 1)));
10717               code = (code == LT) ? NE : EQ;
10718               break;
10719             }
10720         }
10721
10722 #ifdef CANONICALIZE_COMPARISON
10723   /* If this machine only supports a subset of valid comparisons, see if we
10724      can convert an unsupported one into a supported one.  */
10725   CANONICALIZE_COMPARISON (code, op0, op1);
10726 #endif
10727
10728   *pop0 = op0;
10729   *pop1 = op1;
10730
10731   return code;
10732 }
10733 \f
10734 /* Like jump.c' reversed_comparison_code, but use combine infrastructure for
10735    searching backward.  */
10736 static enum rtx_code
10737 combine_reversed_comparison_code (rtx exp)
10738 {
10739   enum rtx_code code1 = reversed_comparison_code (exp, NULL);
10740   rtx x;
10741
10742   if (code1 != UNKNOWN
10743       || GET_MODE_CLASS (GET_MODE (XEXP (exp, 0))) != MODE_CC)
10744     return code1;
10745   /* Otherwise try and find where the condition codes were last set and
10746      use that.  */
10747   x = get_last_value (XEXP (exp, 0));
10748   if (!x || GET_CODE (x) != COMPARE)
10749     return UNKNOWN;
10750   return reversed_comparison_code_parts (GET_CODE (exp),
10751                                          XEXP (x, 0), XEXP (x, 1), NULL);
10752 }
10753
10754 /* Return comparison with reversed code of EXP and operands OP0 and OP1.
10755    Return NULL_RTX in case we fail to do the reversal.  */
10756 static rtx
10757 reversed_comparison (rtx exp, enum machine_mode mode, rtx op0, rtx op1)
10758 {
10759   enum rtx_code reversed_code = combine_reversed_comparison_code (exp);
10760   if (reversed_code == UNKNOWN)
10761     return NULL_RTX;
10762   else
10763     return gen_binary (reversed_code, mode, op0, op1);
10764 }
10765 \f
10766 /* Utility function for record_value_for_reg.  Count number of
10767    rtxs in X.  */
10768 static int
10769 count_rtxs (rtx x)
10770 {
10771   enum rtx_code code = GET_CODE (x);
10772   const char *fmt;
10773   int i, ret = 1;
10774
10775   if (GET_RTX_CLASS (code) == '2'
10776       || GET_RTX_CLASS (code) == 'c')
10777     {
10778       rtx x0 = XEXP (x, 0);
10779       rtx x1 = XEXP (x, 1);
10780
10781       if (x0 == x1)
10782         return 1 + 2 * count_rtxs (x0);
10783
10784       if ((GET_RTX_CLASS (GET_CODE (x1)) == '2'
10785            || GET_RTX_CLASS (GET_CODE (x1)) == 'c')
10786           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
10787         return 2 + 2 * count_rtxs (x0)
10788                + count_rtxs (x == XEXP (x1, 0)
10789                              ? XEXP (x1, 1) : XEXP (x1, 0));
10790
10791       if ((GET_RTX_CLASS (GET_CODE (x0)) == '2'
10792            || GET_RTX_CLASS (GET_CODE (x0)) == 'c')
10793           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
10794         return 2 + 2 * count_rtxs (x1)
10795                + count_rtxs (x == XEXP (x0, 0)
10796                              ? XEXP (x0, 1) : XEXP (x0, 0));
10797     }
10798
10799   fmt = GET_RTX_FORMAT (code);
10800   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
10801     if (fmt[i] == 'e')
10802       ret += count_rtxs (XEXP (x, i));
10803
10804   return ret;
10805 }
10806 \f
10807 /* Utility function for following routine.  Called when X is part of a value
10808    being stored into last_set_value.  Sets last_set_table_tick
10809    for each register mentioned.  Similar to mention_regs in cse.c  */
10810
10811 static void
10812 update_table_tick (rtx x)
10813 {
10814   enum rtx_code code = GET_CODE (x);
10815   const char *fmt = GET_RTX_FORMAT (code);
10816   int i;
10817
10818   if (code == REG)
10819     {
10820       unsigned int regno = REGNO (x);
10821       unsigned int endregno
10822         = regno + (regno < FIRST_PSEUDO_REGISTER
10823                    ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
10824       unsigned int r;
10825
10826       for (r = regno; r < endregno; r++)
10827         reg_stat[r].last_set_table_tick = label_tick;
10828
10829       return;
10830     }
10831
10832   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
10833     /* Note that we can't have an "E" in values stored; see
10834        get_last_value_validate.  */
10835     if (fmt[i] == 'e')
10836       {
10837         /* Check for identical subexpressions.  If x contains
10838            identical subexpression we only have to traverse one of
10839            them.  */
10840         if (i == 0 && ARITHMETIC_P (x))
10841           {
10842             /* Note that at this point x1 has already been
10843                processed.  */
10844             rtx x0 = XEXP (x, 0);
10845             rtx x1 = XEXP (x, 1);
10846
10847             /* If x0 and x1 are identical then there is no need to
10848                process x0.  */
10849             if (x0 == x1)
10850               break;
10851
10852             /* If x0 is identical to a subexpression of x1 then while
10853                processing x1, x0 has already been processed.  Thus we
10854                are done with x.  */
10855             if (ARITHMETIC_P (x1)
10856                 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
10857               break;
10858
10859             /* If x1 is identical to a subexpression of x0 then we
10860                still have to process the rest of x0.  */
10861             if (ARITHMETIC_P (x0)
10862                 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
10863               {
10864                 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
10865                 break;
10866               }
10867           }
10868
10869         update_table_tick (XEXP (x, i));
10870       }
10871 }
10872
10873 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
10874    are saying that the register is clobbered and we no longer know its
10875    value.  If INSN is zero, don't update reg_stat[].last_set; this is
10876    only permitted with VALUE also zero and is used to invalidate the
10877    register.  */
10878
10879 static void
10880 record_value_for_reg (rtx reg, rtx insn, rtx value)
10881 {
10882   unsigned int regno = REGNO (reg);
10883   unsigned int endregno
10884     = regno + (regno < FIRST_PSEUDO_REGISTER
10885                ? hard_regno_nregs[regno][GET_MODE (reg)] : 1);
10886   unsigned int i;
10887
10888   /* If VALUE contains REG and we have a previous value for REG, substitute
10889      the previous value.  */
10890   if (value && insn && reg_overlap_mentioned_p (reg, value))
10891     {
10892       rtx tem;
10893
10894       /* Set things up so get_last_value is allowed to see anything set up to
10895          our insn.  */
10896       subst_low_cuid = INSN_CUID (insn);
10897       tem = get_last_value (reg);
10898
10899       /* If TEM is simply a binary operation with two CLOBBERs as operands,
10900          it isn't going to be useful and will take a lot of time to process,
10901          so just use the CLOBBER.  */
10902
10903       if (tem)
10904         {
10905           if (ARITHMETIC_P (tem)
10906               && GET_CODE (XEXP (tem, 0)) == CLOBBER
10907               && GET_CODE (XEXP (tem, 1)) == CLOBBER)
10908             tem = XEXP (tem, 0);
10909           else if (count_occurrences (value, reg, 1) >= 2)
10910             {
10911               /* If there are two or more occurrences of REG in VALUE,
10912                  prevent the value from growing too much.  */
10913               if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
10914                 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
10915             }
10916
10917           value = replace_rtx (copy_rtx (value), reg, tem);
10918         }
10919     }
10920
10921   /* For each register modified, show we don't know its value, that
10922      we don't know about its bitwise content, that its value has been
10923      updated, and that we don't know the location of the death of the
10924      register.  */
10925   for (i = regno; i < endregno; i++)
10926     {
10927       if (insn)
10928         reg_stat[i].last_set = insn;
10929
10930       reg_stat[i].last_set_value = 0;
10931       reg_stat[i].last_set_mode = 0;
10932       reg_stat[i].last_set_nonzero_bits = 0;
10933       reg_stat[i].last_set_sign_bit_copies = 0;
10934       reg_stat[i].last_death = 0;
10935     }
10936
10937   /* Mark registers that are being referenced in this value.  */
10938   if (value)
10939     update_table_tick (value);
10940
10941   /* Now update the status of each register being set.
10942      If someone is using this register in this block, set this register
10943      to invalid since we will get confused between the two lives in this
10944      basic block.  This makes using this register always invalid.  In cse, we
10945      scan the table to invalidate all entries using this register, but this
10946      is too much work for us.  */
10947
10948   for (i = regno; i < endregno; i++)
10949     {
10950       reg_stat[i].last_set_label = label_tick;
10951       if (value && reg_stat[i].last_set_table_tick == label_tick)
10952         reg_stat[i].last_set_invalid = 1;
10953       else
10954         reg_stat[i].last_set_invalid = 0;
10955     }
10956
10957   /* The value being assigned might refer to X (like in "x++;").  In that
10958      case, we must replace it with (clobber (const_int 0)) to prevent
10959      infinite loops.  */
10960   if (value && ! get_last_value_validate (&value, insn,
10961                                           reg_stat[regno].last_set_label, 0))
10962     {
10963       value = copy_rtx (value);
10964       if (! get_last_value_validate (&value, insn,
10965                                      reg_stat[regno].last_set_label, 1))
10966         value = 0;
10967     }
10968
10969   /* For the main register being modified, update the value, the mode, the
10970      nonzero bits, and the number of sign bit copies.  */
10971
10972   reg_stat[regno].last_set_value = value;
10973
10974   if (value)
10975     {
10976       enum machine_mode mode = GET_MODE (reg);
10977       subst_low_cuid = INSN_CUID (insn);
10978       reg_stat[regno].last_set_mode = mode;
10979       if (GET_MODE_CLASS (mode) == MODE_INT
10980           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10981         mode = nonzero_bits_mode;
10982       reg_stat[regno].last_set_nonzero_bits = nonzero_bits (value, mode);
10983       reg_stat[regno].last_set_sign_bit_copies
10984         = num_sign_bit_copies (value, GET_MODE (reg));
10985     }
10986 }
10987
10988 /* Called via note_stores from record_dead_and_set_regs to handle one
10989    SET or CLOBBER in an insn.  DATA is the instruction in which the
10990    set is occurring.  */
10991
10992 static void
10993 record_dead_and_set_regs_1 (rtx dest, rtx setter, void *data)
10994 {
10995   rtx record_dead_insn = (rtx) data;
10996
10997   if (GET_CODE (dest) == SUBREG)
10998     dest = SUBREG_REG (dest);
10999
11000   if (REG_P (dest))
11001     {
11002       /* If we are setting the whole register, we know its value.  Otherwise
11003          show that we don't know the value.  We can handle SUBREG in
11004          some cases.  */
11005       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11006         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11007       else if (GET_CODE (setter) == SET
11008                && GET_CODE (SET_DEST (setter)) == SUBREG
11009                && SUBREG_REG (SET_DEST (setter)) == dest
11010                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
11011                && subreg_lowpart_p (SET_DEST (setter)))
11012         record_value_for_reg (dest, record_dead_insn,
11013                               gen_lowpart (GET_MODE (dest),
11014                                                        SET_SRC (setter)));
11015       else
11016         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
11017     }
11018   else if (MEM_P (dest)
11019            /* Ignore pushes, they clobber nothing.  */
11020            && ! push_operand (dest, GET_MODE (dest)))
11021     mem_last_set = INSN_CUID (record_dead_insn);
11022 }
11023
11024 /* Update the records of when each REG was most recently set or killed
11025    for the things done by INSN.  This is the last thing done in processing
11026    INSN in the combiner loop.
11027
11028    We update reg_stat[], in particular fields last_set, last_set_value,
11029    last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
11030    last_death, and also the similar information mem_last_set (which insn
11031    most recently modified memory) and last_call_cuid (which insn was the
11032    most recent subroutine call).  */
11033
11034 static void
11035 record_dead_and_set_regs (rtx insn)
11036 {
11037   rtx link;
11038   unsigned int i;
11039
11040   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11041     {
11042       if (REG_NOTE_KIND (link) == REG_DEAD
11043           && REG_P (XEXP (link, 0)))
11044         {
11045           unsigned int regno = REGNO (XEXP (link, 0));
11046           unsigned int endregno
11047             = regno + (regno < FIRST_PSEUDO_REGISTER
11048                        ? hard_regno_nregs[regno][GET_MODE (XEXP (link, 0))]
11049                        : 1);
11050
11051           for (i = regno; i < endregno; i++)
11052             reg_stat[i].last_death = insn;
11053         }
11054       else if (REG_NOTE_KIND (link) == REG_INC)
11055         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
11056     }
11057
11058   if (CALL_P (insn))
11059     {
11060       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11061         if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
11062           {
11063             reg_stat[i].last_set_value = 0;
11064             reg_stat[i].last_set_mode = 0;
11065             reg_stat[i].last_set_nonzero_bits = 0;
11066             reg_stat[i].last_set_sign_bit_copies = 0;
11067             reg_stat[i].last_death = 0;
11068           }
11069
11070       last_call_cuid = mem_last_set = INSN_CUID (insn);
11071
11072       /* Don't bother recording what this insn does.  It might set the
11073          return value register, but we can't combine into a call
11074          pattern anyway, so there's no point trying (and it may cause
11075          a crash, if e.g. we wind up asking for last_set_value of a
11076          SUBREG of the return value register).  */
11077       return;
11078     }
11079
11080   note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
11081 }
11082
11083 /* If a SUBREG has the promoted bit set, it is in fact a property of the
11084    register present in the SUBREG, so for each such SUBREG go back and
11085    adjust nonzero and sign bit information of the registers that are
11086    known to have some zero/sign bits set.
11087
11088    This is needed because when combine blows the SUBREGs away, the
11089    information on zero/sign bits is lost and further combines can be
11090    missed because of that.  */
11091
11092 static void
11093 record_promoted_value (rtx insn, rtx subreg)
11094 {
11095   rtx links, set;
11096   unsigned int regno = REGNO (SUBREG_REG (subreg));
11097   enum machine_mode mode = GET_MODE (subreg);
11098
11099   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
11100     return;
11101
11102   for (links = LOG_LINKS (insn); links;)
11103     {
11104       insn = XEXP (links, 0);
11105       set = single_set (insn);
11106
11107       if (! set || !REG_P (SET_DEST (set))
11108           || REGNO (SET_DEST (set)) != regno
11109           || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11110         {
11111           links = XEXP (links, 1);
11112           continue;
11113         }
11114
11115       if (reg_stat[regno].last_set == insn)
11116         {
11117           if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
11118             reg_stat[regno].last_set_nonzero_bits &= GET_MODE_MASK (mode);
11119         }
11120
11121       if (REG_P (SET_SRC (set)))
11122         {
11123           regno = REGNO (SET_SRC (set));
11124           links = LOG_LINKS (insn);
11125         }
11126       else
11127         break;
11128     }
11129 }
11130
11131 /* Scan X for promoted SUBREGs.  For each one found,
11132    note what it implies to the registers used in it.  */
11133
11134 static void
11135 check_promoted_subreg (rtx insn, rtx x)
11136 {
11137   if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x)
11138       && REG_P (SUBREG_REG (x)))
11139     record_promoted_value (insn, x);
11140   else
11141     {
11142       const char *format = GET_RTX_FORMAT (GET_CODE (x));
11143       int i, j;
11144
11145       for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
11146         switch (format[i])
11147           {
11148           case 'e':
11149             check_promoted_subreg (insn, XEXP (x, i));
11150             break;
11151           case 'V':
11152           case 'E':
11153             if (XVEC (x, i) != 0)
11154               for (j = 0; j < XVECLEN (x, i); j++)
11155                 check_promoted_subreg (insn, XVECEXP (x, i, j));
11156             break;
11157           }
11158     }
11159 }
11160 \f
11161 /* Utility routine for the following function.  Verify that all the registers
11162    mentioned in *LOC are valid when *LOC was part of a value set when
11163    label_tick == TICK.  Return 0 if some are not.
11164
11165    If REPLACE is nonzero, replace the invalid reference with
11166    (clobber (const_int 0)) and return 1.  This replacement is useful because
11167    we often can get useful information about the form of a value (e.g., if
11168    it was produced by a shift that always produces -1 or 0) even though
11169    we don't know exactly what registers it was produced from.  */
11170
11171 static int
11172 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
11173 {
11174   rtx x = *loc;
11175   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
11176   int len = GET_RTX_LENGTH (GET_CODE (x));
11177   int i;
11178
11179   if (REG_P (x))
11180     {
11181       unsigned int regno = REGNO (x);
11182       unsigned int endregno
11183         = regno + (regno < FIRST_PSEUDO_REGISTER
11184                    ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
11185       unsigned int j;
11186
11187       for (j = regno; j < endregno; j++)
11188         if (reg_stat[j].last_set_invalid
11189             /* If this is a pseudo-register that was only set once and not
11190                live at the beginning of the function, it is always valid.  */
11191             || (! (regno >= FIRST_PSEUDO_REGISTER
11192                    && REG_N_SETS (regno) == 1
11193                    && (! REGNO_REG_SET_P
11194                        (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))
11195                 && reg_stat[j].last_set_label > tick))
11196           {
11197             if (replace)
11198               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11199             return replace;
11200           }
11201
11202       return 1;
11203     }
11204   /* If this is a memory reference, make sure that there were
11205      no stores after it that might have clobbered the value.  We don't
11206      have alias info, so we assume any store invalidates it.  */
11207   else if (MEM_P (x) && !MEM_READONLY_P (x)
11208            && INSN_CUID (insn) <= mem_last_set)
11209     {
11210       if (replace)
11211         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11212       return replace;
11213     }
11214
11215   for (i = 0; i < len; i++)
11216     {
11217       if (fmt[i] == 'e')
11218         {
11219           /* Check for identical subexpressions.  If x contains
11220              identical subexpression we only have to traverse one of
11221              them.  */
11222           if (i == 1 && ARITHMETIC_P (x))
11223             {
11224               /* Note that at this point x0 has already been checked
11225                  and found valid.  */
11226               rtx x0 = XEXP (x, 0);
11227               rtx x1 = XEXP (x, 1);
11228
11229               /* If x0 and x1 are identical then x is also valid.  */
11230               if (x0 == x1)
11231                 return 1;
11232
11233               /* If x1 is identical to a subexpression of x0 then
11234                  while checking x0, x1 has already been checked.  Thus
11235                  it is valid and so as x.  */
11236               if (ARITHMETIC_P (x0)
11237                   && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11238                 return 1;
11239
11240               /* If x0 is identical to a subexpression of x1 then x is
11241                  valid iff the rest of x1 is valid.  */
11242               if (ARITHMETIC_P (x1)
11243                   && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11244                 return
11245                   get_last_value_validate (&XEXP (x1,
11246                                                   x0 == XEXP (x1, 0) ? 1 : 0),
11247                                            insn, tick, replace);
11248             }
11249
11250           if (get_last_value_validate (&XEXP (x, i), insn, tick,
11251                                        replace) == 0)
11252             return 0;
11253         }
11254       /* Don't bother with these.  They shouldn't occur anyway.  */
11255       else if (fmt[i] == 'E')
11256         return 0;
11257     }
11258
11259   /* If we haven't found a reason for it to be invalid, it is valid.  */
11260   return 1;
11261 }
11262
11263 /* Get the last value assigned to X, if known.  Some registers
11264    in the value may be replaced with (clobber (const_int 0)) if their value
11265    is known longer known reliably.  */
11266
11267 static rtx
11268 get_last_value (rtx x)
11269 {
11270   unsigned int regno;
11271   rtx value;
11272
11273   /* If this is a non-paradoxical SUBREG, get the value of its operand and
11274      then convert it to the desired mode.  If this is a paradoxical SUBREG,
11275      we cannot predict what values the "extra" bits might have.  */
11276   if (GET_CODE (x) == SUBREG
11277       && subreg_lowpart_p (x)
11278       && (GET_MODE_SIZE (GET_MODE (x))
11279           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
11280       && (value = get_last_value (SUBREG_REG (x))) != 0)
11281     return gen_lowpart (GET_MODE (x), value);
11282
11283   if (!REG_P (x))
11284     return 0;
11285
11286   regno = REGNO (x);
11287   value = reg_stat[regno].last_set_value;
11288
11289   /* If we don't have a value, or if it isn't for this basic block and
11290      it's either a hard register, set more than once, or it's a live
11291      at the beginning of the function, return 0.
11292
11293      Because if it's not live at the beginning of the function then the reg
11294      is always set before being used (is never used without being set).
11295      And, if it's set only once, and it's always set before use, then all
11296      uses must have the same last value, even if it's not from this basic
11297      block.  */
11298
11299   if (value == 0
11300       || (reg_stat[regno].last_set_label != label_tick
11301           && (regno < FIRST_PSEUDO_REGISTER
11302               || REG_N_SETS (regno) != 1
11303               || (REGNO_REG_SET_P
11304                   (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))))
11305     return 0;
11306
11307   /* If the value was set in a later insn than the ones we are processing,
11308      we can't use it even if the register was only set once.  */
11309   if (INSN_CUID (reg_stat[regno].last_set) >= subst_low_cuid)
11310     return 0;
11311
11312   /* If the value has all its registers valid, return it.  */
11313   if (get_last_value_validate (&value, reg_stat[regno].last_set,
11314                                reg_stat[regno].last_set_label, 0))
11315     return value;
11316
11317   /* Otherwise, make a copy and replace any invalid register with
11318      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
11319
11320   value = copy_rtx (value);
11321   if (get_last_value_validate (&value, reg_stat[regno].last_set,
11322                                reg_stat[regno].last_set_label, 1))
11323     return value;
11324
11325   return 0;
11326 }
11327 \f
11328 /* Return nonzero if expression X refers to a REG or to memory
11329    that is set in an instruction more recent than FROM_CUID.  */
11330
11331 static int
11332 use_crosses_set_p (rtx x, int from_cuid)
11333 {
11334   const char *fmt;
11335   int i;
11336   enum rtx_code code = GET_CODE (x);
11337
11338   if (code == REG)
11339     {
11340       unsigned int regno = REGNO (x);
11341       unsigned endreg = regno + (regno < FIRST_PSEUDO_REGISTER
11342                                  ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
11343
11344 #ifdef PUSH_ROUNDING
11345       /* Don't allow uses of the stack pointer to be moved,
11346          because we don't know whether the move crosses a push insn.  */
11347       if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
11348         return 1;
11349 #endif
11350       for (; regno < endreg; regno++)
11351         if (reg_stat[regno].last_set
11352             && INSN_CUID (reg_stat[regno].last_set) > from_cuid)
11353           return 1;
11354       return 0;
11355     }
11356
11357   if (code == MEM && mem_last_set > from_cuid)
11358     return 1;
11359
11360   fmt = GET_RTX_FORMAT (code);
11361
11362   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11363     {
11364       if (fmt[i] == 'E')
11365         {
11366           int j;
11367           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11368             if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
11369               return 1;
11370         }
11371       else if (fmt[i] == 'e'
11372                && use_crosses_set_p (XEXP (x, i), from_cuid))
11373         return 1;
11374     }
11375   return 0;
11376 }
11377 \f
11378 /* Define three variables used for communication between the following
11379    routines.  */
11380
11381 static unsigned int reg_dead_regno, reg_dead_endregno;
11382 static int reg_dead_flag;
11383
11384 /* Function called via note_stores from reg_dead_at_p.
11385
11386    If DEST is within [reg_dead_regno, reg_dead_endregno), set
11387    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
11388
11389 static void
11390 reg_dead_at_p_1 (rtx dest, rtx x, void *data ATTRIBUTE_UNUSED)
11391 {
11392   unsigned int regno, endregno;
11393
11394   if (!REG_P (dest))
11395     return;
11396
11397   regno = REGNO (dest);
11398   endregno = regno + (regno < FIRST_PSEUDO_REGISTER
11399                       ? hard_regno_nregs[regno][GET_MODE (dest)] : 1);
11400
11401   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
11402     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
11403 }
11404
11405 /* Return nonzero if REG is known to be dead at INSN.
11406
11407    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
11408    referencing REG, it is dead.  If we hit a SET referencing REG, it is
11409    live.  Otherwise, see if it is live or dead at the start of the basic
11410    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
11411    must be assumed to be always live.  */
11412
11413 static int
11414 reg_dead_at_p (rtx reg, rtx insn)
11415 {
11416   basic_block block;
11417   unsigned int i;
11418
11419   /* Set variables for reg_dead_at_p_1.  */
11420   reg_dead_regno = REGNO (reg);
11421   reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
11422                                         ? hard_regno_nregs[reg_dead_regno]
11423                                                           [GET_MODE (reg)]
11424                                         : 1);
11425
11426   reg_dead_flag = 0;
11427
11428   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  For fixed registers
11429      we allow the machine description to decide whether use-and-clobber
11430      patterns are OK.  */
11431   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
11432     {
11433       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11434         if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
11435           return 0;
11436     }
11437
11438   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
11439      beginning of function.  */
11440   for (; insn && !LABEL_P (insn) && !BARRIER_P (insn);
11441        insn = prev_nonnote_insn (insn))
11442     {
11443       note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
11444       if (reg_dead_flag)
11445         return reg_dead_flag == 1 ? 1 : 0;
11446
11447       if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
11448         return 1;
11449     }
11450
11451   /* Get the basic block that we were in.  */
11452   if (insn == 0)
11453     block = ENTRY_BLOCK_PTR->next_bb;
11454   else
11455     {
11456       FOR_EACH_BB (block)
11457         if (insn == BB_HEAD (block))
11458           break;
11459
11460       if (block == EXIT_BLOCK_PTR)
11461         return 0;
11462     }
11463
11464   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11465     if (REGNO_REG_SET_P (block->global_live_at_start, i))
11466       return 0;
11467
11468   return 1;
11469 }
11470 \f
11471 /* Note hard registers in X that are used.  This code is similar to
11472    that in flow.c, but much simpler since we don't care about pseudos.  */
11473
11474 static void
11475 mark_used_regs_combine (rtx x)
11476 {
11477   RTX_CODE code = GET_CODE (x);
11478   unsigned int regno;
11479   int i;
11480
11481   switch (code)
11482     {
11483     case LABEL_REF:
11484     case SYMBOL_REF:
11485     case CONST_INT:
11486     case CONST:
11487     case CONST_DOUBLE:
11488     case CONST_VECTOR:
11489     case PC:
11490     case ADDR_VEC:
11491     case ADDR_DIFF_VEC:
11492     case ASM_INPUT:
11493 #ifdef HAVE_cc0
11494     /* CC0 must die in the insn after it is set, so we don't need to take
11495        special note of it here.  */
11496     case CC0:
11497 #endif
11498       return;
11499
11500     case CLOBBER:
11501       /* If we are clobbering a MEM, mark any hard registers inside the
11502          address as used.  */
11503       if (MEM_P (XEXP (x, 0)))
11504         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
11505       return;
11506
11507     case REG:
11508       regno = REGNO (x);
11509       /* A hard reg in a wide mode may really be multiple registers.
11510          If so, mark all of them just like the first.  */
11511       if (regno < FIRST_PSEUDO_REGISTER)
11512         {
11513           unsigned int endregno, r;
11514
11515           /* None of this applies to the stack, frame or arg pointers.  */
11516           if (regno == STACK_POINTER_REGNUM
11517 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
11518               || regno == HARD_FRAME_POINTER_REGNUM
11519 #endif
11520 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
11521               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
11522 #endif
11523               || regno == FRAME_POINTER_REGNUM)
11524             return;
11525
11526           endregno = regno + hard_regno_nregs[regno][GET_MODE (x)];
11527           for (r = regno; r < endregno; r++)
11528             SET_HARD_REG_BIT (newpat_used_regs, r);
11529         }
11530       return;
11531
11532     case SET:
11533       {
11534         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
11535            the address.  */
11536         rtx testreg = SET_DEST (x);
11537
11538         while (GET_CODE (testreg) == SUBREG
11539                || GET_CODE (testreg) == ZERO_EXTRACT
11540                || GET_CODE (testreg) == STRICT_LOW_PART)
11541           testreg = XEXP (testreg, 0);
11542
11543         if (MEM_P (testreg))
11544           mark_used_regs_combine (XEXP (testreg, 0));
11545
11546         mark_used_regs_combine (SET_SRC (x));
11547       }
11548       return;
11549
11550     default:
11551       break;
11552     }
11553
11554   /* Recursively scan the operands of this expression.  */
11555
11556   {
11557     const char *fmt = GET_RTX_FORMAT (code);
11558
11559     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11560       {
11561         if (fmt[i] == 'e')
11562           mark_used_regs_combine (XEXP (x, i));
11563         else if (fmt[i] == 'E')
11564           {
11565             int j;
11566
11567             for (j = 0; j < XVECLEN (x, i); j++)
11568               mark_used_regs_combine (XVECEXP (x, i, j));
11569           }
11570       }
11571   }
11572 }
11573 \f
11574 /* Remove register number REGNO from the dead registers list of INSN.
11575
11576    Return the note used to record the death, if there was one.  */
11577
11578 rtx
11579 remove_death (unsigned int regno, rtx insn)
11580 {
11581   rtx note = find_regno_note (insn, REG_DEAD, regno);
11582
11583   if (note)
11584     {
11585       REG_N_DEATHS (regno)--;
11586       remove_note (insn, note);
11587     }
11588
11589   return note;
11590 }
11591
11592 /* For each register (hardware or pseudo) used within expression X, if its
11593    death is in an instruction with cuid between FROM_CUID (inclusive) and
11594    TO_INSN (exclusive), put a REG_DEAD note for that register in the
11595    list headed by PNOTES.
11596
11597    That said, don't move registers killed by maybe_kill_insn.
11598
11599    This is done when X is being merged by combination into TO_INSN.  These
11600    notes will then be distributed as needed.  */
11601
11602 static void
11603 move_deaths (rtx x, rtx maybe_kill_insn, int from_cuid, rtx to_insn,
11604              rtx *pnotes)
11605 {
11606   const char *fmt;
11607   int len, i;
11608   enum rtx_code code = GET_CODE (x);
11609
11610   if (code == REG)
11611     {
11612       unsigned int regno = REGNO (x);
11613       rtx where_dead = reg_stat[regno].last_death;
11614       rtx before_dead, after_dead;
11615
11616       /* Don't move the register if it gets killed in between from and to.  */
11617       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
11618           && ! reg_referenced_p (x, maybe_kill_insn))
11619         return;
11620
11621       /* WHERE_DEAD could be a USE insn made by combine, so first we
11622          make sure that we have insns with valid INSN_CUID values.  */
11623       before_dead = where_dead;
11624       while (before_dead && INSN_UID (before_dead) > max_uid_cuid)
11625         before_dead = PREV_INSN (before_dead);
11626
11627       after_dead = where_dead;
11628       while (after_dead && INSN_UID (after_dead) > max_uid_cuid)
11629         after_dead = NEXT_INSN (after_dead);
11630
11631       if (before_dead && after_dead
11632           && INSN_CUID (before_dead) >= from_cuid
11633           && (INSN_CUID (after_dead) < INSN_CUID (to_insn)
11634               || (where_dead != after_dead
11635                   && INSN_CUID (after_dead) == INSN_CUID (to_insn))))
11636         {
11637           rtx note = remove_death (regno, where_dead);
11638
11639           /* It is possible for the call above to return 0.  This can occur
11640              when last_death points to I2 or I1 that we combined with.
11641              In that case make a new note.
11642
11643              We must also check for the case where X is a hard register
11644              and NOTE is a death note for a range of hard registers
11645              including X.  In that case, we must put REG_DEAD notes for
11646              the remaining registers in place of NOTE.  */
11647
11648           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
11649               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11650                   > GET_MODE_SIZE (GET_MODE (x))))
11651             {
11652               unsigned int deadregno = REGNO (XEXP (note, 0));
11653               unsigned int deadend
11654                 = (deadregno + hard_regno_nregs[deadregno]
11655                                                [GET_MODE (XEXP (note, 0))]);
11656               unsigned int ourend
11657                 = regno + hard_regno_nregs[regno][GET_MODE (x)];
11658               unsigned int i;
11659
11660               for (i = deadregno; i < deadend; i++)
11661                 if (i < regno || i >= ourend)
11662                   REG_NOTES (where_dead)
11663                     = gen_rtx_EXPR_LIST (REG_DEAD,
11664                                          regno_reg_rtx[i],
11665                                          REG_NOTES (where_dead));
11666             }
11667
11668           /* If we didn't find any note, or if we found a REG_DEAD note that
11669              covers only part of the given reg, and we have a multi-reg hard
11670              register, then to be safe we must check for REG_DEAD notes
11671              for each register other than the first.  They could have
11672              their own REG_DEAD notes lying around.  */
11673           else if ((note == 0
11674                     || (note != 0
11675                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11676                             < GET_MODE_SIZE (GET_MODE (x)))))
11677                    && regno < FIRST_PSEUDO_REGISTER
11678                    && hard_regno_nregs[regno][GET_MODE (x)] > 1)
11679             {
11680               unsigned int ourend
11681                 = regno + hard_regno_nregs[regno][GET_MODE (x)];
11682               unsigned int i, offset;
11683               rtx oldnotes = 0;
11684
11685               if (note)
11686                 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
11687               else
11688                 offset = 1;
11689
11690               for (i = regno + offset; i < ourend; i++)
11691                 move_deaths (regno_reg_rtx[i],
11692                              maybe_kill_insn, from_cuid, to_insn, &oldnotes);
11693             }
11694
11695           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
11696             {
11697               XEXP (note, 1) = *pnotes;
11698               *pnotes = note;
11699             }
11700           else
11701             *pnotes = gen_rtx_EXPR_LIST (REG_DEAD, x, *pnotes);
11702
11703           REG_N_DEATHS (regno)++;
11704         }
11705
11706       return;
11707     }
11708
11709   else if (GET_CODE (x) == SET)
11710     {
11711       rtx dest = SET_DEST (x);
11712
11713       move_deaths (SET_SRC (x), maybe_kill_insn, from_cuid, to_insn, pnotes);
11714
11715       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
11716          that accesses one word of a multi-word item, some
11717          piece of everything register in the expression is used by
11718          this insn, so remove any old death.  */
11719       /* ??? So why do we test for equality of the sizes?  */
11720
11721       if (GET_CODE (dest) == ZERO_EXTRACT
11722           || GET_CODE (dest) == STRICT_LOW_PART
11723           || (GET_CODE (dest) == SUBREG
11724               && (((GET_MODE_SIZE (GET_MODE (dest))
11725                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
11726                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
11727                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
11728         {
11729           move_deaths (dest, maybe_kill_insn, from_cuid, to_insn, pnotes);
11730           return;
11731         }
11732
11733       /* If this is some other SUBREG, we know it replaces the entire
11734          value, so use that as the destination.  */
11735       if (GET_CODE (dest) == SUBREG)
11736         dest = SUBREG_REG (dest);
11737
11738       /* If this is a MEM, adjust deaths of anything used in the address.
11739          For a REG (the only other possibility), the entire value is
11740          being replaced so the old value is not used in this insn.  */
11741
11742       if (MEM_P (dest))
11743         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_cuid,
11744                      to_insn, pnotes);
11745       return;
11746     }
11747
11748   else if (GET_CODE (x) == CLOBBER)
11749     return;
11750
11751   len = GET_RTX_LENGTH (code);
11752   fmt = GET_RTX_FORMAT (code);
11753
11754   for (i = 0; i < len; i++)
11755     {
11756       if (fmt[i] == 'E')
11757         {
11758           int j;
11759           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11760             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_cuid,
11761                          to_insn, pnotes);
11762         }
11763       else if (fmt[i] == 'e')
11764         move_deaths (XEXP (x, i), maybe_kill_insn, from_cuid, to_insn, pnotes);
11765     }
11766 }
11767 \f
11768 /* Return 1 if X is the target of a bit-field assignment in BODY, the
11769    pattern of an insn.  X must be a REG.  */
11770
11771 static int
11772 reg_bitfield_target_p (rtx x, rtx body)
11773 {
11774   int i;
11775
11776   if (GET_CODE (body) == SET)
11777     {
11778       rtx dest = SET_DEST (body);
11779       rtx target;
11780       unsigned int regno, tregno, endregno, endtregno;
11781
11782       if (GET_CODE (dest) == ZERO_EXTRACT)
11783         target = XEXP (dest, 0);
11784       else if (GET_CODE (dest) == STRICT_LOW_PART)
11785         target = SUBREG_REG (XEXP (dest, 0));
11786       else
11787         return 0;
11788
11789       if (GET_CODE (target) == SUBREG)
11790         target = SUBREG_REG (target);
11791
11792       if (!REG_P (target))
11793         return 0;
11794
11795       tregno = REGNO (target), regno = REGNO (x);
11796       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
11797         return target == x;
11798
11799       endtregno = tregno + hard_regno_nregs[tregno][GET_MODE (target)];
11800       endregno = regno + hard_regno_nregs[regno][GET_MODE (x)];
11801
11802       return endregno > tregno && regno < endtregno;
11803     }
11804
11805   else if (GET_CODE (body) == PARALLEL)
11806     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
11807       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
11808         return 1;
11809
11810   return 0;
11811 }
11812 \f
11813 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
11814    as appropriate.  I3 and I2 are the insns resulting from the combination
11815    insns including FROM (I2 may be zero).
11816
11817    Each note in the list is either ignored or placed on some insns, depending
11818    on the type of note.  */
11819
11820 static void
11821 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2)
11822 {
11823   rtx note, next_note;
11824   rtx tem;
11825
11826   for (note = notes; note; note = next_note)
11827     {
11828       rtx place = 0, place2 = 0;
11829
11830       /* If this NOTE references a pseudo register, ensure it references
11831          the latest copy of that register.  */
11832       if (XEXP (note, 0) && REG_P (XEXP (note, 0))
11833           && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
11834         XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
11835
11836       next_note = XEXP (note, 1);
11837       switch (REG_NOTE_KIND (note))
11838         {
11839         case REG_BR_PROB:
11840         case REG_BR_PRED:
11841           /* Doesn't matter much where we put this, as long as it's somewhere.
11842              It is preferable to keep these notes on branches, which is most
11843              likely to be i3.  */
11844           place = i3;
11845           break;
11846
11847         case REG_VALUE_PROFILE:
11848           /* Just get rid of this note, as it is unused later anyway.  */
11849           break;
11850
11851         case REG_NON_LOCAL_GOTO:
11852           if (JUMP_P (i3))
11853             place = i3;
11854           else
11855             {
11856               gcc_assert (i2 && JUMP_P (i2));
11857               place = i2;
11858             }
11859           break;
11860
11861         case REG_EH_REGION:
11862           /* These notes must remain with the call or trapping instruction.  */
11863           if (CALL_P (i3))
11864             place = i3;
11865           else if (i2 && CALL_P (i2))
11866             place = i2;
11867           else
11868             {
11869               gcc_assert (flag_non_call_exceptions);
11870               if (may_trap_p (i3))
11871                 place = i3;
11872               else if (i2 && may_trap_p (i2))
11873                 place = i2;
11874               /* ??? Otherwise assume we've combined things such that we
11875                  can now prove that the instructions can't trap.  Drop the
11876                  note in this case.  */
11877             }
11878           break;
11879
11880         case REG_ALWAYS_RETURN:
11881         case REG_NORETURN:
11882         case REG_SETJMP:
11883           /* These notes must remain with the call.  It should not be
11884              possible for both I2 and I3 to be a call.  */
11885           if (CALL_P (i3))
11886             place = i3;
11887           else
11888             {
11889               gcc_assert (i2 && CALL_P (i2));
11890               place = i2;
11891             }
11892           break;
11893
11894         case REG_UNUSED:
11895           /* Any clobbers for i3 may still exist, and so we must process
11896              REG_UNUSED notes from that insn.
11897
11898              Any clobbers from i2 or i1 can only exist if they were added by
11899              recog_for_combine.  In that case, recog_for_combine created the
11900              necessary REG_UNUSED notes.  Trying to keep any original
11901              REG_UNUSED notes from these insns can cause incorrect output
11902              if it is for the same register as the original i3 dest.
11903              In that case, we will notice that the register is set in i3,
11904              and then add a REG_UNUSED note for the destination of i3, which
11905              is wrong.  However, it is possible to have REG_UNUSED notes from
11906              i2 or i1 for register which were both used and clobbered, so
11907              we keep notes from i2 or i1 if they will turn into REG_DEAD
11908              notes.  */
11909
11910           /* If this register is set or clobbered in I3, put the note there
11911              unless there is one already.  */
11912           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
11913             {
11914               if (from_insn != i3)
11915                 break;
11916
11917               if (! (REG_P (XEXP (note, 0))
11918                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
11919                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
11920                 place = i3;
11921             }
11922           /* Otherwise, if this register is used by I3, then this register
11923              now dies here, so we must put a REG_DEAD note here unless there
11924              is one already.  */
11925           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
11926                    && ! (REG_P (XEXP (note, 0))
11927                          ? find_regno_note (i3, REG_DEAD,
11928                                             REGNO (XEXP (note, 0)))
11929                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
11930             {
11931               PUT_REG_NOTE_KIND (note, REG_DEAD);
11932               place = i3;
11933             }
11934           break;
11935
11936         case REG_EQUAL:
11937         case REG_EQUIV:
11938         case REG_NOALIAS:
11939           /* These notes say something about results of an insn.  We can
11940              only support them if they used to be on I3 in which case they
11941              remain on I3.  Otherwise they are ignored.
11942
11943              If the note refers to an expression that is not a constant, we
11944              must also ignore the note since we cannot tell whether the
11945              equivalence is still true.  It might be possible to do
11946              slightly better than this (we only have a problem if I2DEST
11947              or I1DEST is present in the expression), but it doesn't
11948              seem worth the trouble.  */
11949
11950           if (from_insn == i3
11951               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
11952             place = i3;
11953           break;
11954
11955         case REG_INC:
11956         case REG_NO_CONFLICT:
11957           /* These notes say something about how a register is used.  They must
11958              be present on any use of the register in I2 or I3.  */
11959           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
11960             place = i3;
11961
11962           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
11963             {
11964               if (place)
11965                 place2 = i2;
11966               else
11967                 place = i2;
11968             }
11969           break;
11970
11971         case REG_LABEL:
11972           /* This can show up in several ways -- either directly in the
11973              pattern, or hidden off in the constant pool with (or without?)
11974              a REG_EQUAL note.  */
11975           /* ??? Ignore the without-reg_equal-note problem for now.  */
11976           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
11977               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
11978                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
11979                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
11980             place = i3;
11981
11982           if (i2
11983               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
11984                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
11985                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
11986                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
11987             {
11988               if (place)
11989                 place2 = i2;
11990               else
11991                 place = i2;
11992             }
11993
11994           /* Don't attach REG_LABEL note to a JUMP_INSN.  Add
11995              a JUMP_LABEL instead or decrement LABEL_NUSES.  */
11996           if (place && JUMP_P (place))
11997             {
11998               rtx label = JUMP_LABEL (place);
11999               
12000               if (!label)
12001                 JUMP_LABEL (place) = XEXP (note, 0);
12002               else
12003                 {
12004                   gcc_assert (label == XEXP (note, 0));
12005                   if (LABEL_P (label))
12006                     LABEL_NUSES (label)--;
12007                 }
12008               place = 0;
12009             }
12010           if (place2 && JUMP_P (place2))
12011             {
12012               rtx label = JUMP_LABEL (place2);
12013               
12014               if (!label)
12015                 JUMP_LABEL (place2) = XEXP (note, 0);
12016               else
12017                 {
12018                   gcc_assert (label == XEXP (note, 0));
12019                   if (LABEL_P (label))
12020                     LABEL_NUSES (label)--;
12021                 }
12022               place2 = 0;
12023             }
12024           break;
12025
12026         case REG_NONNEG:
12027           /* This note says something about the value of a register prior
12028              to the execution of an insn.  It is too much trouble to see
12029              if the note is still correct in all situations.  It is better
12030              to simply delete it.  */
12031           break;
12032
12033         case REG_RETVAL:
12034           /* If the insn previously containing this note still exists,
12035              put it back where it was.  Otherwise move it to the previous
12036              insn.  Adjust the corresponding REG_LIBCALL note.  */
12037           if (!NOTE_P (from_insn))
12038             place = from_insn;
12039           else
12040             {
12041               tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
12042               place = prev_real_insn (from_insn);
12043               if (tem && place)
12044                 XEXP (tem, 0) = place;
12045               /* If we're deleting the last remaining instruction of a
12046                  libcall sequence, don't add the notes.  */
12047               else if (XEXP (note, 0) == from_insn)
12048                 tem = place = 0;
12049               /* Don't add the dangling REG_RETVAL note.  */
12050               else if (! tem)
12051                 place = 0;
12052             }
12053           break;
12054
12055         case REG_LIBCALL:
12056           /* This is handled similarly to REG_RETVAL.  */
12057           if (!NOTE_P (from_insn))
12058             place = from_insn;
12059           else
12060             {
12061               tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
12062               place = next_real_insn (from_insn);
12063               if (tem && place)
12064                 XEXP (tem, 0) = place;
12065               /* If we're deleting the last remaining instruction of a
12066                  libcall sequence, don't add the notes.  */
12067               else if (XEXP (note, 0) == from_insn)
12068                 tem = place = 0;
12069               /* Don't add the dangling REG_LIBCALL note.  */
12070               else if (! tem)
12071                 place = 0;
12072             }
12073           break;
12074
12075         case REG_DEAD:
12076           /* If the register is used as an input in I3, it dies there.
12077              Similarly for I2, if it is nonzero and adjacent to I3.
12078
12079              If the register is not used as an input in either I3 or I2
12080              and it is not one of the registers we were supposed to eliminate,
12081              there are two possibilities.  We might have a non-adjacent I2
12082              or we might have somehow eliminated an additional register
12083              from a computation.  For example, we might have had A & B where
12084              we discover that B will always be zero.  In this case we will
12085              eliminate the reference to A.
12086
12087              In both cases, we must search to see if we can find a previous
12088              use of A and put the death note there.  */
12089
12090           if (from_insn
12091               && CALL_P (from_insn)
12092               && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
12093             place = from_insn;
12094           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
12095             place = i3;
12096           else if (i2 != 0 && next_nonnote_insn (i2) == i3
12097                    && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12098             place = i2;
12099
12100           if (place == 0)
12101             {
12102               basic_block bb = this_basic_block;
12103
12104               for (tem = PREV_INSN (i3); place == 0; tem = PREV_INSN (tem))
12105                 {
12106                   if (! INSN_P (tem))
12107                     {
12108                       if (tem == BB_HEAD (bb))
12109                         break;
12110                       continue;
12111                     }
12112
12113                   /* If the register is being set at TEM, see if that is all
12114                      TEM is doing.  If so, delete TEM.  Otherwise, make this
12115                      into a REG_UNUSED note instead. Don't delete sets to
12116                      global register vars.  */
12117                   if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
12118                        || !global_regs[REGNO (XEXP (note, 0))])
12119                       && reg_set_p (XEXP (note, 0), PATTERN (tem)))
12120                     {
12121                       rtx set = single_set (tem);
12122                       rtx inner_dest = 0;
12123 #ifdef HAVE_cc0
12124                       rtx cc0_setter = NULL_RTX;
12125 #endif
12126
12127                       if (set != 0)
12128                         for (inner_dest = SET_DEST (set);
12129                              (GET_CODE (inner_dest) == STRICT_LOW_PART
12130                               || GET_CODE (inner_dest) == SUBREG
12131                               || GET_CODE (inner_dest) == ZERO_EXTRACT);
12132                              inner_dest = XEXP (inner_dest, 0))
12133                           ;
12134
12135                       /* Verify that it was the set, and not a clobber that
12136                          modified the register.
12137
12138                          CC0 targets must be careful to maintain setter/user
12139                          pairs.  If we cannot delete the setter due to side
12140                          effects, mark the user with an UNUSED note instead
12141                          of deleting it.  */
12142
12143                       if (set != 0 && ! side_effects_p (SET_SRC (set))
12144                           && rtx_equal_p (XEXP (note, 0), inner_dest)
12145 #ifdef HAVE_cc0
12146                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
12147                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
12148                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
12149 #endif
12150                           )
12151                         {
12152                           /* Move the notes and links of TEM elsewhere.
12153                              This might delete other dead insns recursively.
12154                              First set the pattern to something that won't use
12155                              any register.  */
12156                           rtx old_notes = REG_NOTES (tem);
12157
12158                           PATTERN (tem) = pc_rtx;
12159                           REG_NOTES (tem) = NULL;
12160
12161                           distribute_notes (old_notes, tem, tem, NULL_RTX);
12162                           distribute_links (LOG_LINKS (tem));
12163
12164                           SET_INSN_DELETED (tem);
12165
12166 #ifdef HAVE_cc0
12167                           /* Delete the setter too.  */
12168                           if (cc0_setter)
12169                             {
12170                               PATTERN (cc0_setter) = pc_rtx;
12171                               old_notes = REG_NOTES (cc0_setter);
12172                               REG_NOTES (cc0_setter) = NULL;
12173
12174                               distribute_notes (old_notes, cc0_setter,
12175                                                 cc0_setter, NULL_RTX);
12176                               distribute_links (LOG_LINKS (cc0_setter));
12177
12178                               SET_INSN_DELETED (cc0_setter);
12179                             }
12180 #endif
12181                         }
12182                       else
12183                         {
12184                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
12185
12186                           /*  If there isn't already a REG_UNUSED note, put one
12187                               here.  Do not place a REG_DEAD note, even if
12188                               the register is also used here; that would not
12189                               match the algorithm used in lifetime analysis
12190                               and can cause the consistency check in the
12191                               scheduler to fail.  */
12192                           if (! find_regno_note (tem, REG_UNUSED,
12193                                                  REGNO (XEXP (note, 0))))
12194                             place = tem;
12195                           break;
12196                         }
12197                     }
12198                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
12199                            || (CALL_P (tem)
12200                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
12201                     {
12202                       place = tem;
12203
12204                       /* If we are doing a 3->2 combination, and we have a
12205                          register which formerly died in i3 and was not used
12206                          by i2, which now no longer dies in i3 and is used in
12207                          i2 but does not die in i2, and place is between i2
12208                          and i3, then we may need to move a link from place to
12209                          i2.  */
12210                       if (i2 && INSN_UID (place) <= max_uid_cuid
12211                           && INSN_CUID (place) > INSN_CUID (i2)
12212                           && from_insn
12213                           && INSN_CUID (from_insn) > INSN_CUID (i2)
12214                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12215                         {
12216                           rtx links = LOG_LINKS (place);
12217                           LOG_LINKS (place) = 0;
12218                           distribute_links (links);
12219                         }
12220                       break;
12221                     }
12222
12223                   if (tem == BB_HEAD (bb))
12224                     break;
12225                 }
12226
12227               /* We haven't found an insn for the death note and it
12228                  is still a REG_DEAD note, but we have hit the beginning
12229                  of the block.  If the existing life info says the reg
12230                  was dead, there's nothing left to do.  Otherwise, we'll
12231                  need to do a global life update after combine.  */
12232               if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
12233                   && REGNO_REG_SET_P (bb->global_live_at_start,
12234                                       REGNO (XEXP (note, 0))))
12235                 SET_BIT (refresh_blocks, this_basic_block->index);
12236             }
12237
12238           /* If the register is set or already dead at PLACE, we needn't do
12239              anything with this note if it is still a REG_DEAD note.
12240              We check here if it is set at all, not if is it totally replaced,
12241              which is what `dead_or_set_p' checks, so also check for it being
12242              set partially.  */
12243
12244           if (place && REG_NOTE_KIND (note) == REG_DEAD)
12245             {
12246               unsigned int regno = REGNO (XEXP (note, 0));
12247
12248               /* Similarly, if the instruction on which we want to place
12249                  the note is a noop, we'll need do a global live update
12250                  after we remove them in delete_noop_moves.  */
12251               if (noop_move_p (place))
12252                 SET_BIT (refresh_blocks, this_basic_block->index);
12253
12254               if (dead_or_set_p (place, XEXP (note, 0))
12255                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
12256                 {
12257                   /* Unless the register previously died in PLACE, clear
12258                      last_death.  [I no longer understand why this is
12259                      being done.] */
12260                   if (reg_stat[regno].last_death != place)
12261                     reg_stat[regno].last_death = 0;
12262                   place = 0;
12263                 }
12264               else
12265                 reg_stat[regno].last_death = place;
12266
12267               /* If this is a death note for a hard reg that is occupying
12268                  multiple registers, ensure that we are still using all
12269                  parts of the object.  If we find a piece of the object
12270                  that is unused, we must arrange for an appropriate REG_DEAD
12271                  note to be added for it.  However, we can't just emit a USE
12272                  and tag the note to it, since the register might actually
12273                  be dead; so we recourse, and the recursive call then finds
12274                  the previous insn that used this register.  */
12275
12276               if (place && regno < FIRST_PSEUDO_REGISTER
12277                   && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
12278                 {
12279                   unsigned int endregno
12280                     = regno + hard_regno_nregs[regno]
12281                                               [GET_MODE (XEXP (note, 0))];
12282                   int all_used = 1;
12283                   unsigned int i;
12284
12285                   for (i = regno; i < endregno; i++)
12286                     if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
12287                          && ! find_regno_fusage (place, USE, i))
12288                         || dead_or_set_regno_p (place, i))
12289                       all_used = 0;
12290
12291                   if (! all_used)
12292                     {
12293                       /* Put only REG_DEAD notes for pieces that are
12294                          not already dead or set.  */
12295
12296                       for (i = regno; i < endregno;
12297                            i += hard_regno_nregs[i][reg_raw_mode[i]])
12298                         {
12299                           rtx piece = regno_reg_rtx[i];
12300                           basic_block bb = this_basic_block;
12301
12302                           if (! dead_or_set_p (place, piece)
12303                               && ! reg_bitfield_target_p (piece,
12304                                                           PATTERN (place)))
12305                             {
12306                               rtx new_note
12307                                 = gen_rtx_EXPR_LIST (REG_DEAD, piece, NULL_RTX);
12308
12309                               distribute_notes (new_note, place, place,
12310                                                 NULL_RTX);
12311                             }
12312                           else if (! refers_to_regno_p (i, i + 1,
12313                                                         PATTERN (place), 0)
12314                                    && ! find_regno_fusage (place, USE, i))
12315                             for (tem = PREV_INSN (place); ;
12316                                  tem = PREV_INSN (tem))
12317                               {
12318                                 if (! INSN_P (tem))
12319                                   {
12320                                     if (tem == BB_HEAD (bb))
12321                                       {
12322                                         SET_BIT (refresh_blocks,
12323                                                  this_basic_block->index);
12324                                         break;
12325                                       }
12326                                     continue;
12327                                   }
12328                                 if (dead_or_set_p (tem, piece)
12329                                     || reg_bitfield_target_p (piece,
12330                                                               PATTERN (tem)))
12331                                   {
12332                                     REG_NOTES (tem)
12333                                       = gen_rtx_EXPR_LIST (REG_UNUSED, piece,
12334                                                            REG_NOTES (tem));
12335                                     break;
12336                                   }
12337                               }
12338
12339                         }
12340
12341                       place = 0;
12342                     }
12343                 }
12344             }
12345           break;
12346
12347         default:
12348           /* Any other notes should not be present at this point in the
12349              compilation.  */
12350           gcc_unreachable ();
12351         }
12352
12353       if (place)
12354         {
12355           XEXP (note, 1) = REG_NOTES (place);
12356           REG_NOTES (place) = note;
12357         }
12358       else if ((REG_NOTE_KIND (note) == REG_DEAD
12359                 || REG_NOTE_KIND (note) == REG_UNUSED)
12360                && REG_P (XEXP (note, 0)))
12361         REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
12362
12363       if (place2)
12364         {
12365           if ((REG_NOTE_KIND (note) == REG_DEAD
12366                || REG_NOTE_KIND (note) == REG_UNUSED)
12367               && REG_P (XEXP (note, 0)))
12368             REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
12369
12370           REG_NOTES (place2) = gen_rtx_fmt_ee (GET_CODE (note),
12371                                                REG_NOTE_KIND (note),
12372                                                XEXP (note, 0),
12373                                                REG_NOTES (place2));
12374         }
12375     }
12376 }
12377 \f
12378 /* Similarly to above, distribute the LOG_LINKS that used to be present on
12379    I3, I2, and I1 to new locations.  This is also called to add a link
12380    pointing at I3 when I3's destination is changed.  */
12381
12382 static void
12383 distribute_links (rtx links)
12384 {
12385   rtx link, next_link;
12386
12387   for (link = links; link; link = next_link)
12388     {
12389       rtx place = 0;
12390       rtx insn;
12391       rtx set, reg;
12392
12393       next_link = XEXP (link, 1);
12394
12395       /* If the insn that this link points to is a NOTE or isn't a single
12396          set, ignore it.  In the latter case, it isn't clear what we
12397          can do other than ignore the link, since we can't tell which
12398          register it was for.  Such links wouldn't be used by combine
12399          anyway.
12400
12401          It is not possible for the destination of the target of the link to
12402          have been changed by combine.  The only potential of this is if we
12403          replace I3, I2, and I1 by I3 and I2.  But in that case the
12404          destination of I2 also remains unchanged.  */
12405
12406       if (NOTE_P (XEXP (link, 0))
12407           || (set = single_set (XEXP (link, 0))) == 0)
12408         continue;
12409
12410       reg = SET_DEST (set);
12411       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
12412              || GET_CODE (reg) == STRICT_LOW_PART)
12413         reg = XEXP (reg, 0);
12414
12415       /* A LOG_LINK is defined as being placed on the first insn that uses
12416          a register and points to the insn that sets the register.  Start
12417          searching at the next insn after the target of the link and stop
12418          when we reach a set of the register or the end of the basic block.
12419
12420          Note that this correctly handles the link that used to point from
12421          I3 to I2.  Also note that not much searching is typically done here
12422          since most links don't point very far away.  */
12423
12424       for (insn = NEXT_INSN (XEXP (link, 0));
12425            (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
12426                      || BB_HEAD (this_basic_block->next_bb) != insn));
12427            insn = NEXT_INSN (insn))
12428         if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
12429           {
12430             if (reg_referenced_p (reg, PATTERN (insn)))
12431               place = insn;
12432             break;
12433           }
12434         else if (CALL_P (insn)
12435                  && find_reg_fusage (insn, USE, reg))
12436           {
12437             place = insn;
12438             break;
12439           }
12440         else if (INSN_P (insn) && reg_set_p (reg, insn))
12441           break;
12442
12443       /* If we found a place to put the link, place it there unless there
12444          is already a link to the same insn as LINK at that point.  */
12445
12446       if (place)
12447         {
12448           rtx link2;
12449
12450           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
12451             if (XEXP (link2, 0) == XEXP (link, 0))
12452               break;
12453
12454           if (link2 == 0)
12455             {
12456               XEXP (link, 1) = LOG_LINKS (place);
12457               LOG_LINKS (place) = link;
12458
12459               /* Set added_links_insn to the earliest insn we added a
12460                  link to.  */
12461               if (added_links_insn == 0
12462                   || INSN_CUID (added_links_insn) > INSN_CUID (place))
12463                 added_links_insn = place;
12464             }
12465         }
12466     }
12467 }
12468 \f
12469 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
12470    Check whether the expression pointer to by LOC is a register or
12471    memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
12472    Otherwise return zero.  */
12473
12474 static int
12475 unmentioned_reg_p_1 (rtx *loc, void *expr)
12476 {
12477   rtx x = *loc;
12478
12479   if (x != NULL_RTX
12480       && (REG_P (x) || MEM_P (x))
12481       && ! reg_mentioned_p (x, (rtx) expr))
12482     return 1;
12483   return 0;
12484 }
12485
12486 /* Check for any register or memory mentioned in EQUIV that is not
12487    mentioned in EXPR.  This is used to restrict EQUIV to "specializations"
12488    of EXPR where some registers may have been replaced by constants.  */
12489
12490 static bool
12491 unmentioned_reg_p (rtx equiv, rtx expr)
12492 {
12493   return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
12494 }
12495 \f
12496 /* Compute INSN_CUID for INSN, which is an insn made by combine.  */
12497
12498 static int
12499 insn_cuid (rtx insn)
12500 {
12501   while (insn != 0 && INSN_UID (insn) > max_uid_cuid
12502          && NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE)
12503     insn = NEXT_INSN (insn);
12504
12505   gcc_assert (INSN_UID (insn) <= max_uid_cuid);
12506
12507   return INSN_CUID (insn);
12508 }
12509 \f
12510 void
12511 dump_combine_stats (FILE *file)
12512 {
12513   fnotice
12514     (file,
12515      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
12516      combine_attempts, combine_merges, combine_extras, combine_successes);
12517 }
12518
12519 void
12520 dump_combine_total_stats (FILE *file)
12521 {
12522   fnotice
12523     (file,
12524      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
12525      total_attempts, total_merges, total_extras, total_successes);
12526 }