OSDN Git Service

Replace exact_log2(x & -x) in favor of more direct computation.
[pf3gnuchains/gcc-fork.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
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 isn't
53    completely updated (however this is only a local issue since it is
54    regenerated before the next pass that uses it):
55
56    - reg_live_length is not updated
57    - reg_n_refs is not adjusted in the rare case when a register is
58      no longer required in a computation
59    - there are extremely rare cases (see distribute_notes) when a
60      REG_DEAD note is lost
61    - a LOG_LINKS entry that refers to an insn with multiple SETs may be
62      removed because there is no way to know which register it was
63      linking
64
65    To simplify substitution, we combine only when the earlier insn(s)
66    consist of only a single assignment.  To simplify updating afterward,
67    we never combine when a subroutine call appears in the middle.
68
69    Since we do not represent assignments to CC0 explicitly except when that
70    is all an insn does, there is no LOG_LINKS entry in an insn that uses
71    the condition code for the insn that set the condition code.
72    Fortunately, these two insns must be consecutive.
73    Therefore, every JUMP_INSN is taken to have an implicit logical link
74    to the preceding insn.  This is not quite right, since non-jumps can
75    also use the condition code; but in practice such insns would not
76    combine anyway.  */
77
78 #include "config.h"
79 #include "system.h"
80 #include "coretypes.h"
81 #include "tm.h"
82 #include "rtl.h"
83 #include "tree.h"
84 #include "tm_p.h"
85 #include "flags.h"
86 #include "regs.h"
87 #include "hard-reg-set.h"
88 #include "basic-block.h"
89 #include "insn-config.h"
90 #include "function.h"
91 /* Include expr.h after insn-config.h so we get HAVE_conditional_move.  */
92 #include "expr.h"
93 #include "insn-attr.h"
94 #include "recog.h"
95 #include "diagnostic-core.h"
96 #include "toplev.h"
97 #include "target.h"
98 #include "optabs.h"
99 #include "insn-codes.h"
100 #include "rtlhooks-def.h"
101 /* Include output.h for dump_file.  */
102 #include "output.h"
103 #include "params.h"
104 #include "timevar.h"
105 #include "tree-pass.h"
106 #include "df.h"
107 #include "cgraph.h"
108
109 /* Number of attempts to combine instructions in this function.  */
110
111 static int combine_attempts;
112
113 /* Number of attempts that got as far as substitution in this function.  */
114
115 static int combine_merges;
116
117 /* Number of instructions combined with added SETs in this function.  */
118
119 static int combine_extras;
120
121 /* Number of instructions combined in this function.  */
122
123 static int combine_successes;
124
125 /* Totals over entire compilation.  */
126
127 static int total_attempts, total_merges, total_extras, total_successes;
128
129 /* combine_instructions may try to replace the right hand side of the
130    second instruction with the value of an associated REG_EQUAL note
131    before throwing it at try_combine.  That is problematic when there
132    is a REG_DEAD note for a register used in the old right hand side
133    and can cause distribute_notes to do wrong things.  This is the
134    second instruction if it has been so modified, null otherwise.  */
135
136 static rtx i2mod;
137
138 /* When I2MOD is nonnull, this is a copy of the old right hand side.  */
139
140 static rtx i2mod_old_rhs;
141
142 /* When I2MOD is nonnull, this is a copy of the new right hand side.  */
143
144 static rtx i2mod_new_rhs;
145 \f
146 typedef struct reg_stat_struct {
147   /* Record last point of death of (hard or pseudo) register n.  */
148   rtx                           last_death;
149
150   /* Record last point of modification of (hard or pseudo) register n.  */
151   rtx                           last_set;
152
153   /* The next group of fields allows the recording of the last value assigned
154      to (hard or pseudo) register n.  We use this information to see if an
155      operation being processed is redundant given a prior operation performed
156      on the register.  For example, an `and' with a constant is redundant if
157      all the zero bits are already known to be turned off.
158
159      We use an approach similar to that used by cse, but change it in the
160      following ways:
161
162      (1) We do not want to reinitialize at each label.
163      (2) It is useful, but not critical, to know the actual value assigned
164          to a register.  Often just its form is helpful.
165
166      Therefore, we maintain the following fields:
167
168      last_set_value             the last value assigned
169      last_set_label             records the value of label_tick when the
170                                 register was assigned
171      last_set_table_tick        records the value of label_tick when a
172                                 value using the register is assigned
173      last_set_invalid           set to nonzero when it is not valid
174                                 to use the value of this register in some
175                                 register's value
176
177      To understand the usage of these tables, it is important to understand
178      the distinction between the value in last_set_value being valid and
179      the register being validly contained in some other expression in the
180      table.
181
182      (The next two parameters are out of date).
183
184      reg_stat[i].last_set_value is valid if it is nonzero, and either
185      reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
186
187      Register I may validly appear in any expression returned for the value
188      of another register if reg_n_sets[i] is 1.  It may also appear in the
189      value for register J if reg_stat[j].last_set_invalid is zero, or
190      reg_stat[i].last_set_label < reg_stat[j].last_set_label.
191
192      If an expression is found in the table containing a register which may
193      not validly appear in an expression, the register is replaced by
194      something that won't match, (clobber (const_int 0)).  */
195
196   /* Record last value assigned to (hard or pseudo) register n.  */
197
198   rtx                           last_set_value;
199
200   /* Record the value of label_tick when an expression involving register n
201      is placed in last_set_value.  */
202
203   int                           last_set_table_tick;
204
205   /* Record the value of label_tick when the value for register n is placed in
206      last_set_value.  */
207
208   int                           last_set_label;
209
210   /* These fields are maintained in parallel with last_set_value and are
211      used to store the mode in which the register was last set, the bits
212      that were known to be zero when it was last set, and the number of
213      sign bits copies it was known to have when it was last set.  */
214
215   unsigned HOST_WIDE_INT        last_set_nonzero_bits;
216   char                          last_set_sign_bit_copies;
217   ENUM_BITFIELD(machine_mode)   last_set_mode : 8;
218
219   /* Set nonzero if references to register n in expressions should not be
220      used.  last_set_invalid is set nonzero when this register is being
221      assigned to and last_set_table_tick == label_tick.  */
222
223   char                          last_set_invalid;
224
225   /* Some registers that are set more than once and used in more than one
226      basic block are nevertheless always set in similar ways.  For example,
227      a QImode register may be loaded from memory in two places on a machine
228      where byte loads zero extend.
229
230      We record in the following fields if a register has some leading bits
231      that are always equal to the sign bit, and what we know about the
232      nonzero bits of a register, specifically which bits are known to be
233      zero.
234
235      If an entry is zero, it means that we don't know anything special.  */
236
237   unsigned char                 sign_bit_copies;
238
239   unsigned HOST_WIDE_INT        nonzero_bits;
240
241   /* Record the value of the label_tick when the last truncation
242      happened.  The field truncated_to_mode is only valid if
243      truncation_label == label_tick.  */
244
245   int                           truncation_label;
246
247   /* Record the last truncation seen for this register.  If truncation
248      is not a nop to this mode we might be able to save an explicit
249      truncation if we know that value already contains a truncated
250      value.  */
251
252   ENUM_BITFIELD(machine_mode)   truncated_to_mode : 8;
253 } reg_stat_type;
254
255 DEF_VEC_O(reg_stat_type);
256 DEF_VEC_ALLOC_O(reg_stat_type,heap);
257
258 static VEC(reg_stat_type,heap) *reg_stat;
259
260 /* Record the luid of the last insn that invalidated memory
261    (anything that writes memory, and subroutine calls, but not pushes).  */
262
263 static int mem_last_set;
264
265 /* Record the luid of the last CALL_INSN
266    so we can tell whether a potential combination crosses any calls.  */
267
268 static int last_call_luid;
269
270 /* When `subst' is called, this is the insn that is being modified
271    (by combining in a previous insn).  The PATTERN of this insn
272    is still the old pattern partially modified and it should not be
273    looked at, but this may be used to examine the successors of the insn
274    to judge whether a simplification is valid.  */
275
276 static rtx subst_insn;
277
278 /* This is the lowest LUID that `subst' is currently dealing with.
279    get_last_value will not return a value if the register was set at or
280    after this LUID.  If not for this mechanism, we could get confused if
281    I2 or I1 in try_combine were an insn that used the old value of a register
282    to obtain a new value.  In that case, we might erroneously get the
283    new value of the register when we wanted the old one.  */
284
285 static int subst_low_luid;
286
287 /* This contains any hard registers that are used in newpat; reg_dead_at_p
288    must consider all these registers to be always live.  */
289
290 static HARD_REG_SET newpat_used_regs;
291
292 /* This is an insn to which a LOG_LINKS entry has been added.  If this
293    insn is the earlier than I2 or I3, combine should rescan starting at
294    that location.  */
295
296 static rtx added_links_insn;
297
298 /* Basic block in which we are performing combines.  */
299 static basic_block this_basic_block;
300 static bool optimize_this_for_speed_p;
301
302 \f
303 /* Length of the currently allocated uid_insn_cost array.  */
304
305 static int max_uid_known;
306
307 /* The following array records the insn_rtx_cost for every insn
308    in the instruction stream.  */
309
310 static int *uid_insn_cost;
311
312 /* The following array records the LOG_LINKS for every insn in the
313    instruction stream as an INSN_LIST rtx.  */
314
315 static rtx *uid_log_links;
316
317 #define INSN_COST(INSN)         (uid_insn_cost[INSN_UID (INSN)])
318 #define LOG_LINKS(INSN)         (uid_log_links[INSN_UID (INSN)])
319
320 /* Incremented for each basic block.  */
321
322 static int label_tick;
323
324 /* Reset to label_tick for each extended basic block in scanning order.  */
325
326 static int label_tick_ebb_start;
327
328 /* Mode used to compute significance in reg_stat[].nonzero_bits.  It is the
329    largest integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
330
331 static enum machine_mode nonzero_bits_mode;
332
333 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
334    be safely used.  It is zero while computing them and after combine has
335    completed.  This former test prevents propagating values based on
336    previously set values, which can be incorrect if a variable is modified
337    in a loop.  */
338
339 static int nonzero_sign_valid;
340
341 \f
342 /* Record one modification to rtl structure
343    to be undone by storing old_contents into *where.  */
344
345 enum undo_kind { UNDO_RTX, UNDO_INT, UNDO_MODE };
346
347 struct undo
348 {
349   struct undo *next;
350   enum undo_kind kind;
351   union { rtx r; int i; enum machine_mode m; } old_contents;
352   union { rtx *r; int *i; } where;
353 };
354
355 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
356    num_undo says how many are currently recorded.
357
358    other_insn is nonzero if we have modified some other insn in the process
359    of working on subst_insn.  It must be verified too.  */
360
361 struct undobuf
362 {
363   struct undo *undos;
364   struct undo *frees;
365   rtx other_insn;
366 };
367
368 static struct undobuf undobuf;
369
370 /* Number of times the pseudo being substituted for
371    was found and replaced.  */
372
373 static int n_occurrences;
374
375 static rtx reg_nonzero_bits_for_combine (const_rtx, enum machine_mode, const_rtx,
376                                          enum machine_mode,
377                                          unsigned HOST_WIDE_INT,
378                                          unsigned HOST_WIDE_INT *);
379 static rtx reg_num_sign_bit_copies_for_combine (const_rtx, enum machine_mode, const_rtx,
380                                                 enum machine_mode,
381                                                 unsigned int, unsigned int *);
382 static void do_SUBST (rtx *, rtx);
383 static void do_SUBST_INT (int *, int);
384 static void init_reg_last (void);
385 static void setup_incoming_promotions (rtx);
386 static void set_nonzero_bits_and_sign_copies (rtx, const_rtx, void *);
387 static int cant_combine_insn_p (rtx);
388 static int can_combine_p (rtx, rtx, rtx, rtx, rtx *, rtx *);
389 static int combinable_i3pat (rtx, rtx *, rtx, rtx, int, rtx *);
390 static int contains_muldiv (rtx);
391 static rtx try_combine (rtx, rtx, rtx, int *);
392 static void undo_all (void);
393 static void undo_commit (void);
394 static rtx *find_split_point (rtx *, rtx, bool);
395 static rtx subst (rtx, rtx, rtx, int, int);
396 static rtx combine_simplify_rtx (rtx, enum machine_mode, int);
397 static rtx simplify_if_then_else (rtx);
398 static rtx simplify_set (rtx);
399 static rtx simplify_logical (rtx);
400 static rtx expand_compound_operation (rtx);
401 static const_rtx expand_field_assignment (const_rtx);
402 static rtx make_extraction (enum machine_mode, rtx, HOST_WIDE_INT,
403                             rtx, unsigned HOST_WIDE_INT, int, int, int);
404 static rtx extract_left_shift (rtx, int);
405 static rtx make_compound_operation (rtx, enum rtx_code);
406 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
407                               unsigned HOST_WIDE_INT *);
408 static rtx canon_reg_for_combine (rtx, rtx);
409 static rtx force_to_mode (rtx, enum machine_mode,
410                           unsigned HOST_WIDE_INT, int);
411 static rtx if_then_else_cond (rtx, rtx *, rtx *);
412 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
413 static int rtx_equal_for_field_assignment_p (rtx, rtx);
414 static rtx make_field_assignment (rtx);
415 static rtx apply_distributive_law (rtx);
416 static rtx distribute_and_simplify_rtx (rtx, int);
417 static rtx simplify_and_const_int_1 (enum machine_mode, rtx,
418                                      unsigned HOST_WIDE_INT);
419 static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
420                                    unsigned HOST_WIDE_INT);
421 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
422                             HOST_WIDE_INT, enum machine_mode, int *);
423 static rtx simplify_shift_const_1 (enum rtx_code, enum machine_mode, rtx, int);
424 static rtx simplify_shift_const (rtx, enum rtx_code, enum machine_mode, rtx,
425                                  int);
426 static int recog_for_combine (rtx *, rtx, rtx *);
427 static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
428 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
429 static void update_table_tick (rtx);
430 static void record_value_for_reg (rtx, rtx, rtx);
431 static void check_promoted_subreg (rtx, rtx);
432 static void record_dead_and_set_regs_1 (rtx, const_rtx, void *);
433 static void record_dead_and_set_regs (rtx);
434 static int get_last_value_validate (rtx *, rtx, int, int);
435 static rtx get_last_value (const_rtx);
436 static int use_crosses_set_p (const_rtx, int);
437 static void reg_dead_at_p_1 (rtx, const_rtx, void *);
438 static int reg_dead_at_p (rtx, rtx);
439 static void move_deaths (rtx, rtx, int, rtx, rtx *);
440 static int reg_bitfield_target_p (rtx, rtx);
441 static void distribute_notes (rtx, rtx, rtx, rtx, rtx, rtx);
442 static void distribute_links (rtx);
443 static void mark_used_regs_combine (rtx);
444 static void record_promoted_value (rtx, rtx);
445 static int unmentioned_reg_p_1 (rtx *, void *);
446 static bool unmentioned_reg_p (rtx, rtx);
447 static int record_truncated_value (rtx *, void *);
448 static void record_truncated_values (rtx *, void *);
449 static bool reg_truncated_to_mode (enum machine_mode, const_rtx);
450 static rtx gen_lowpart_or_truncate (enum machine_mode, rtx);
451 \f
452
453 /* It is not safe to use ordinary gen_lowpart in combine.
454    See comments in gen_lowpart_for_combine.  */
455 #undef RTL_HOOKS_GEN_LOWPART
456 #define RTL_HOOKS_GEN_LOWPART              gen_lowpart_for_combine
457
458 /* Our implementation of gen_lowpart never emits a new pseudo.  */
459 #undef RTL_HOOKS_GEN_LOWPART_NO_EMIT
460 #define RTL_HOOKS_GEN_LOWPART_NO_EMIT      gen_lowpart_for_combine
461
462 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
463 #define RTL_HOOKS_REG_NONZERO_REG_BITS     reg_nonzero_bits_for_combine
464
465 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
466 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES  reg_num_sign_bit_copies_for_combine
467
468 #undef RTL_HOOKS_REG_TRUNCATED_TO_MODE
469 #define RTL_HOOKS_REG_TRUNCATED_TO_MODE    reg_truncated_to_mode
470
471 static const struct rtl_hooks combine_rtl_hooks = RTL_HOOKS_INITIALIZER;
472
473 \f
474 /* Try to split PATTERN found in INSN.  This returns NULL_RTX if
475    PATTERN can not be split.  Otherwise, it returns an insn sequence.
476    This is a wrapper around split_insns which ensures that the
477    reg_stat vector is made larger if the splitter creates a new
478    register.  */
479
480 static rtx
481 combine_split_insns (rtx pattern, rtx insn)
482 {
483   rtx ret;
484   unsigned int nregs;
485
486   ret = split_insns (pattern, insn);
487   nregs = max_reg_num ();
488   if (nregs > VEC_length (reg_stat_type, reg_stat))
489     VEC_safe_grow_cleared (reg_stat_type, heap, reg_stat, nregs);
490   return ret;
491 }
492
493 /* This is used by find_single_use to locate an rtx in LOC that
494    contains exactly one use of DEST, which is typically either a REG
495    or CC0.  It returns a pointer to the innermost rtx expression
496    containing DEST.  Appearances of DEST that are being used to
497    totally replace it are not counted.  */
498
499 static rtx *
500 find_single_use_1 (rtx dest, rtx *loc)
501 {
502   rtx x = *loc;
503   enum rtx_code code = GET_CODE (x);
504   rtx *result = NULL;
505   rtx *this_result;
506   int i;
507   const char *fmt;
508
509   switch (code)
510     {
511     case CONST_INT:
512     case CONST:
513     case LABEL_REF:
514     case SYMBOL_REF:
515     case CONST_DOUBLE:
516     case CONST_VECTOR:
517     case CLOBBER:
518       return 0;
519
520     case SET:
521       /* If the destination is anything other than CC0, PC, a REG or a SUBREG
522          of a REG that occupies all of the REG, the insn uses DEST if
523          it is mentioned in the destination or the source.  Otherwise, we
524          need just check the source.  */
525       if (GET_CODE (SET_DEST (x)) != CC0
526           && GET_CODE (SET_DEST (x)) != PC
527           && !REG_P (SET_DEST (x))
528           && ! (GET_CODE (SET_DEST (x)) == SUBREG
529                 && REG_P (SUBREG_REG (SET_DEST (x)))
530                 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
531                       + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
532                     == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
533                          + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
534         break;
535
536       return find_single_use_1 (dest, &SET_SRC (x));
537
538     case MEM:
539     case SUBREG:
540       return find_single_use_1 (dest, &XEXP (x, 0));
541
542     default:
543       break;
544     }
545
546   /* If it wasn't one of the common cases above, check each expression and
547      vector of this code.  Look for a unique usage of DEST.  */
548
549   fmt = GET_RTX_FORMAT (code);
550   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
551     {
552       if (fmt[i] == 'e')
553         {
554           if (dest == XEXP (x, i)
555               || (REG_P (dest) && REG_P (XEXP (x, i))
556                   && REGNO (dest) == REGNO (XEXP (x, i))))
557             this_result = loc;
558           else
559             this_result = find_single_use_1 (dest, &XEXP (x, i));
560
561           if (result == NULL)
562             result = this_result;
563           else if (this_result)
564             /* Duplicate usage.  */
565             return NULL;
566         }
567       else if (fmt[i] == 'E')
568         {
569           int j;
570
571           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
572             {
573               if (XVECEXP (x, i, j) == dest
574                   || (REG_P (dest)
575                       && REG_P (XVECEXP (x, i, j))
576                       && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
577                 this_result = loc;
578               else
579                 this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
580
581               if (result == NULL)
582                 result = this_result;
583               else if (this_result)
584                 return NULL;
585             }
586         }
587     }
588
589   return result;
590 }
591
592
593 /* See if DEST, produced in INSN, is used only a single time in the
594    sequel.  If so, return a pointer to the innermost rtx expression in which
595    it is used.
596
597    If PLOC is nonzero, *PLOC is set to the insn containing the single use.
598
599    If DEST is cc0_rtx, we look only at the next insn.  In that case, we don't
600    care about REG_DEAD notes or LOG_LINKS.
601
602    Otherwise, we find the single use by finding an insn that has a
603    LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST.  If DEST is
604    only referenced once in that insn, we know that it must be the first
605    and last insn referencing DEST.  */
606
607 static rtx *
608 find_single_use (rtx dest, rtx insn, rtx *ploc)
609 {
610   basic_block bb;
611   rtx next;
612   rtx *result;
613   rtx link;
614
615 #ifdef HAVE_cc0
616   if (dest == cc0_rtx)
617     {
618       next = NEXT_INSN (insn);
619       if (next == 0
620           || (!NONJUMP_INSN_P (next) && !JUMP_P (next)))
621         return 0;
622
623       result = find_single_use_1 (dest, &PATTERN (next));
624       if (result && ploc)
625         *ploc = next;
626       return result;
627     }
628 #endif
629
630   if (!REG_P (dest))
631     return 0;
632
633   bb = BLOCK_FOR_INSN (insn);
634   for (next = NEXT_INSN (insn);
635        next && BLOCK_FOR_INSN (next) == bb;
636        next = NEXT_INSN (next))
637     if (INSN_P (next) && dead_or_set_p (next, dest))
638       {
639         for (link = LOG_LINKS (next); link; link = XEXP (link, 1))
640           if (XEXP (link, 0) == insn)
641             break;
642
643         if (link)
644           {
645             result = find_single_use_1 (dest, &PATTERN (next));
646             if (ploc)
647               *ploc = next;
648             return result;
649           }
650       }
651
652   return 0;
653 }
654 \f
655 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
656    insn.  The substitution can be undone by undo_all.  If INTO is already
657    set to NEWVAL, do not record this change.  Because computing NEWVAL might
658    also call SUBST, we have to compute it before we put anything into
659    the undo table.  */
660
661 static void
662 do_SUBST (rtx *into, rtx newval)
663 {
664   struct undo *buf;
665   rtx oldval = *into;
666
667   if (oldval == newval)
668     return;
669
670   /* We'd like to catch as many invalid transformations here as
671      possible.  Unfortunately, there are way too many mode changes
672      that are perfectly valid, so we'd waste too much effort for
673      little gain doing the checks here.  Focus on catching invalid
674      transformations involving integer constants.  */
675   if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
676       && CONST_INT_P (newval))
677     {
678       /* Sanity check that we're replacing oldval with a CONST_INT
679          that is a valid sign-extension for the original mode.  */
680       gcc_assert (INTVAL (newval)
681                   == trunc_int_for_mode (INTVAL (newval), GET_MODE (oldval)));
682
683       /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
684          CONST_INT is not valid, because after the replacement, the
685          original mode would be gone.  Unfortunately, we can't tell
686          when do_SUBST is called to replace the operand thereof, so we
687          perform this test on oldval instead, checking whether an
688          invalid replacement took place before we got here.  */
689       gcc_assert (!(GET_CODE (oldval) == SUBREG
690                     && CONST_INT_P (SUBREG_REG (oldval))));
691       gcc_assert (!(GET_CODE (oldval) == ZERO_EXTEND
692                     && CONST_INT_P (XEXP (oldval, 0))));
693     }
694
695   if (undobuf.frees)
696     buf = undobuf.frees, undobuf.frees = buf->next;
697   else
698     buf = XNEW (struct undo);
699
700   buf->kind = UNDO_RTX;
701   buf->where.r = into;
702   buf->old_contents.r = oldval;
703   *into = newval;
704
705   buf->next = undobuf.undos, undobuf.undos = buf;
706 }
707
708 #define SUBST(INTO, NEWVAL)     do_SUBST(&(INTO), (NEWVAL))
709
710 /* Similar to SUBST, but NEWVAL is an int expression.  Note that substitution
711    for the value of a HOST_WIDE_INT value (including CONST_INT) is
712    not safe.  */
713
714 static void
715 do_SUBST_INT (int *into, int newval)
716 {
717   struct undo *buf;
718   int oldval = *into;
719
720   if (oldval == newval)
721     return;
722
723   if (undobuf.frees)
724     buf = undobuf.frees, undobuf.frees = buf->next;
725   else
726     buf = XNEW (struct undo);
727
728   buf->kind = UNDO_INT;
729   buf->where.i = into;
730   buf->old_contents.i = oldval;
731   *into = newval;
732
733   buf->next = undobuf.undos, undobuf.undos = buf;
734 }
735
736 #define SUBST_INT(INTO, NEWVAL)  do_SUBST_INT(&(INTO), (NEWVAL))
737
738 /* Similar to SUBST, but just substitute the mode.  This is used when
739    changing the mode of a pseudo-register, so that any other
740    references to the entry in the regno_reg_rtx array will change as
741    well.  */
742
743 static void
744 do_SUBST_MODE (rtx *into, enum machine_mode newval)
745 {
746   struct undo *buf;
747   enum machine_mode oldval = GET_MODE (*into);
748
749   if (oldval == newval)
750     return;
751
752   if (undobuf.frees)
753     buf = undobuf.frees, undobuf.frees = buf->next;
754   else
755     buf = XNEW (struct undo);
756
757   buf->kind = UNDO_MODE;
758   buf->where.r = into;
759   buf->old_contents.m = oldval;
760   adjust_reg_mode (*into, newval);
761
762   buf->next = undobuf.undos, undobuf.undos = buf;
763 }
764
765 #define SUBST_MODE(INTO, NEWVAL)  do_SUBST_MODE(&(INTO), (NEWVAL))
766 \f
767 /* Subroutine of try_combine.  Determine whether the combine replacement
768    patterns NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to
769    insn_rtx_cost that the original instruction sequence I1, I2, I3 and
770    undobuf.other_insn.  Note that I1 and/or NEWI2PAT may be NULL_RTX.
771    NEWOTHERPAT and undobuf.other_insn may also both be NULL_RTX.  This
772    function returns false, if the costs of all instructions can be
773    estimated, and the replacements are more expensive than the original
774    sequence.  */
775
776 static bool
777 combine_validate_cost (rtx i1, rtx i2, rtx i3, rtx newpat, rtx newi2pat,
778                        rtx newotherpat)
779 {
780   int i1_cost, i2_cost, i3_cost;
781   int new_i2_cost, new_i3_cost;
782   int old_cost, new_cost;
783
784   /* Lookup the original insn_rtx_costs.  */
785   i2_cost = INSN_COST (i2);
786   i3_cost = INSN_COST (i3);
787
788   if (i1)
789     {
790       i1_cost = INSN_COST (i1);
791       old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0)
792                  ? i1_cost + i2_cost + i3_cost : 0;
793     }
794   else
795     {
796       old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
797       i1_cost = 0;
798     }
799
800   /* Calculate the replacement insn_rtx_costs.  */
801   new_i3_cost = insn_rtx_cost (newpat, optimize_this_for_speed_p);
802   if (newi2pat)
803     {
804       new_i2_cost = insn_rtx_cost (newi2pat, optimize_this_for_speed_p);
805       new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
806                  ? new_i2_cost + new_i3_cost : 0;
807     }
808   else
809     {
810       new_cost = new_i3_cost;
811       new_i2_cost = 0;
812     }
813
814   if (undobuf.other_insn)
815     {
816       int old_other_cost, new_other_cost;
817
818       old_other_cost = INSN_COST (undobuf.other_insn);
819       new_other_cost = insn_rtx_cost (newotherpat, optimize_this_for_speed_p);
820       if (old_other_cost > 0 && new_other_cost > 0)
821         {
822           old_cost += old_other_cost;
823           new_cost += new_other_cost;
824         }
825       else
826         old_cost = 0;
827     }
828
829   /* Disallow this recombination if both new_cost and old_cost are
830      greater than zero, and new_cost is greater than old cost.  */
831   if (old_cost > 0
832       && new_cost > old_cost)
833     {
834       if (dump_file)
835         {
836           if (i1)
837             {
838               fprintf (dump_file,
839                        "rejecting combination of insns %d, %d and %d\n",
840                        INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
841               fprintf (dump_file, "original costs %d + %d + %d = %d\n",
842                        i1_cost, i2_cost, i3_cost, old_cost);
843             }
844           else
845             {
846               fprintf (dump_file,
847                        "rejecting combination of insns %d and %d\n",
848                        INSN_UID (i2), INSN_UID (i3));
849               fprintf (dump_file, "original costs %d + %d = %d\n",
850                        i2_cost, i3_cost, old_cost);
851             }
852
853           if (newi2pat)
854             {
855               fprintf (dump_file, "replacement costs %d + %d = %d\n",
856                        new_i2_cost, new_i3_cost, new_cost);
857             }
858           else
859             fprintf (dump_file, "replacement cost %d\n", new_cost);
860         }
861
862       return false;
863     }
864
865   /* Update the uid_insn_cost array with the replacement costs.  */
866   INSN_COST (i2) = new_i2_cost;
867   INSN_COST (i3) = new_i3_cost;
868   if (i1)
869     INSN_COST (i1) = 0;
870
871   return true;
872 }
873
874
875 /* Delete any insns that copy a register to itself.  */
876
877 static void
878 delete_noop_moves (void)
879 {
880   rtx insn, next;
881   basic_block bb;
882
883   FOR_EACH_BB (bb)
884     {
885       for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
886         {
887           next = NEXT_INSN (insn);
888           if (INSN_P (insn) && noop_move_p (insn))
889             {
890               if (dump_file)
891                 fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn));
892
893               delete_insn_and_edges (insn);
894             }
895         }
896     }
897 }
898
899 \f
900 /* Fill in log links field for all insns.  */
901
902 static void
903 create_log_links (void)
904 {
905   basic_block bb;
906   rtx *next_use, insn;
907   df_ref *def_vec, *use_vec;
908
909   next_use = XCNEWVEC (rtx, max_reg_num ());
910
911   /* Pass through each block from the end, recording the uses of each
912      register and establishing log links when def is encountered.
913      Note that we do not clear next_use array in order to save time,
914      so we have to test whether the use is in the same basic block as def.
915
916      There are a few cases below when we do not consider the definition or
917      usage -- these are taken from original flow.c did. Don't ask me why it is
918      done this way; I don't know and if it works, I don't want to know.  */
919
920   FOR_EACH_BB (bb)
921     {
922       FOR_BB_INSNS_REVERSE (bb, insn)
923         {
924           if (!NONDEBUG_INSN_P (insn))
925             continue;
926
927           /* Log links are created only once.  */
928           gcc_assert (!LOG_LINKS (insn));
929
930           for (def_vec = DF_INSN_DEFS (insn); *def_vec; def_vec++)
931             {
932               df_ref def = *def_vec;
933               int regno = DF_REF_REGNO (def);
934               rtx use_insn;
935
936               if (!next_use[regno])
937                 continue;
938
939               /* Do not consider if it is pre/post modification in MEM.  */
940               if (DF_REF_FLAGS (def) & DF_REF_PRE_POST_MODIFY)
941                 continue;
942
943               /* Do not make the log link for frame pointer.  */
944               if ((regno == FRAME_POINTER_REGNUM
945                    && (! reload_completed || frame_pointer_needed))
946 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
947                   || (regno == HARD_FRAME_POINTER_REGNUM
948                       && (! reload_completed || frame_pointer_needed))
949 #endif
950 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
951                   || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
952 #endif
953                   )
954                 continue;
955
956               use_insn = next_use[regno];
957               if (BLOCK_FOR_INSN (use_insn) == bb)
958                 {
959                   /* flow.c claimed:
960
961                      We don't build a LOG_LINK for hard registers contained
962                      in ASM_OPERANDs.  If these registers get replaced,
963                      we might wind up changing the semantics of the insn,
964                      even if reload can make what appear to be valid
965                      assignments later.  */
966                   if (regno >= FIRST_PSEUDO_REGISTER
967                       || asm_noperands (PATTERN (use_insn)) < 0)
968                     {
969                       /* Don't add duplicate links between instructions.  */
970                       rtx links;
971                       for (links = LOG_LINKS (use_insn); links;
972                            links = XEXP (links, 1))
973                         if (insn == XEXP (links, 0))
974                           break;
975
976                       if (!links)
977                         LOG_LINKS (use_insn) =
978                           alloc_INSN_LIST (insn, LOG_LINKS (use_insn));
979                     }
980                 }
981               next_use[regno] = NULL_RTX;
982             }
983
984           for (use_vec = DF_INSN_USES (insn); *use_vec; use_vec++)
985             {
986               df_ref use = *use_vec;
987               int regno = DF_REF_REGNO (use);
988
989               /* Do not consider the usage of the stack pointer
990                  by function call.  */
991               if (DF_REF_FLAGS (use) & DF_REF_CALL_STACK_USAGE)
992                 continue;
993
994               next_use[regno] = insn;
995             }
996         }
997     }
998
999   free (next_use);
1000 }
1001
1002 /* Clear LOG_LINKS fields of insns.  */
1003
1004 static void
1005 clear_log_links (void)
1006 {
1007   rtx insn;
1008
1009   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1010     if (INSN_P (insn))
1011       free_INSN_LIST_list (&LOG_LINKS (insn));
1012 }
1013 \f
1014 /* Main entry point for combiner.  F is the first insn of the function.
1015    NREGS is the first unused pseudo-reg number.
1016
1017    Return nonzero if the combiner has turned an indirect jump
1018    instruction into a direct jump.  */
1019 static int
1020 combine_instructions (rtx f, unsigned int nregs)
1021 {
1022   rtx insn, next;
1023 #ifdef HAVE_cc0
1024   rtx prev;
1025 #endif
1026   rtx links, nextlinks;
1027   rtx first;
1028   basic_block last_bb;
1029
1030   int new_direct_jump_p = 0;
1031
1032   for (first = f; first && !INSN_P (first); )
1033     first = NEXT_INSN (first);
1034   if (!first)
1035     return 0;
1036
1037   combine_attempts = 0;
1038   combine_merges = 0;
1039   combine_extras = 0;
1040   combine_successes = 0;
1041
1042   rtl_hooks = combine_rtl_hooks;
1043
1044   VEC_safe_grow_cleared (reg_stat_type, heap, reg_stat, nregs);
1045
1046   init_recog_no_volatile ();
1047
1048   /* Allocate array for insn info.  */
1049   max_uid_known = get_max_uid ();
1050   uid_log_links = XCNEWVEC (rtx, max_uid_known + 1);
1051   uid_insn_cost = XCNEWVEC (int, max_uid_known + 1);
1052
1053   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1054
1055   /* Don't use reg_stat[].nonzero_bits when computing it.  This can cause
1056      problems when, for example, we have j <<= 1 in a loop.  */
1057
1058   nonzero_sign_valid = 0;
1059   label_tick = label_tick_ebb_start = 1;
1060
1061   /* Scan all SETs and see if we can deduce anything about what
1062      bits are known to be zero for some registers and how many copies
1063      of the sign bit are known to exist for those registers.
1064
1065      Also set any known values so that we can use it while searching
1066      for what bits are known to be set.  */
1067
1068   setup_incoming_promotions (first);
1069   /* Allow the entry block and the first block to fall into the same EBB.
1070      Conceptually the incoming promotions are assigned to the entry block.  */
1071   last_bb = ENTRY_BLOCK_PTR;
1072
1073   create_log_links ();
1074   FOR_EACH_BB (this_basic_block)
1075     {
1076       optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1077       last_call_luid = 0;
1078       mem_last_set = -1;
1079
1080       label_tick++;
1081       if (!single_pred_p (this_basic_block)
1082           || single_pred (this_basic_block) != last_bb)
1083         label_tick_ebb_start = label_tick;
1084       last_bb = this_basic_block;
1085
1086       FOR_BB_INSNS (this_basic_block, insn)
1087         if (INSN_P (insn) && BLOCK_FOR_INSN (insn))
1088           {
1089             subst_low_luid = DF_INSN_LUID (insn);
1090             subst_insn = insn;
1091
1092             note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
1093                          insn);
1094             record_dead_and_set_regs (insn);
1095
1096 #ifdef AUTO_INC_DEC
1097             for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
1098               if (REG_NOTE_KIND (links) == REG_INC)
1099                 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
1100                                                   insn);
1101 #endif
1102
1103             /* Record the current insn_rtx_cost of this instruction.  */
1104             if (NONJUMP_INSN_P (insn))
1105               INSN_COST (insn) = insn_rtx_cost (PATTERN (insn),
1106                                                 optimize_this_for_speed_p);
1107             if (dump_file)
1108               fprintf(dump_file, "insn_cost %d: %d\n",
1109                     INSN_UID (insn), INSN_COST (insn));
1110           }
1111     }
1112
1113   nonzero_sign_valid = 1;
1114
1115   /* Now scan all the insns in forward order.  */
1116   label_tick = label_tick_ebb_start = 1;
1117   init_reg_last ();
1118   setup_incoming_promotions (first);
1119   last_bb = ENTRY_BLOCK_PTR;
1120
1121   FOR_EACH_BB (this_basic_block)
1122     {
1123       optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1124       last_call_luid = 0;
1125       mem_last_set = -1;
1126
1127       label_tick++;
1128       if (!single_pred_p (this_basic_block)
1129           || single_pred (this_basic_block) != last_bb)
1130         label_tick_ebb_start = label_tick;
1131       last_bb = this_basic_block;
1132
1133       rtl_profile_for_bb (this_basic_block);
1134       for (insn = BB_HEAD (this_basic_block);
1135            insn != NEXT_INSN (BB_END (this_basic_block));
1136            insn = next ? next : NEXT_INSN (insn))
1137         {
1138           next = 0;
1139           if (NONDEBUG_INSN_P (insn))
1140             {
1141               /* See if we know about function return values before this
1142                  insn based upon SUBREG flags.  */
1143               check_promoted_subreg (insn, PATTERN (insn));
1144
1145               /* See if we can find hardregs and subreg of pseudos in
1146                  narrower modes.  This could help turning TRUNCATEs
1147                  into SUBREGs.  */
1148               note_uses (&PATTERN (insn), record_truncated_values, NULL);
1149
1150               /* Try this insn with each insn it links back to.  */
1151
1152               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1153                 if ((next = try_combine (insn, XEXP (links, 0),
1154                                          NULL_RTX, &new_direct_jump_p)) != 0)
1155                   goto retry;
1156
1157               /* Try each sequence of three linked insns ending with this one.  */
1158
1159               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1160                 {
1161                   rtx link = XEXP (links, 0);
1162
1163                   /* If the linked insn has been replaced by a note, then there
1164                      is no point in pursuing this chain any further.  */
1165                   if (NOTE_P (link))
1166                     continue;
1167
1168                   for (nextlinks = LOG_LINKS (link);
1169                        nextlinks;
1170                        nextlinks = XEXP (nextlinks, 1))
1171                     if ((next = try_combine (insn, link,
1172                                              XEXP (nextlinks, 0),
1173                                              &new_direct_jump_p)) != 0)
1174                       goto retry;
1175                 }
1176
1177 #ifdef HAVE_cc0
1178               /* Try to combine a jump insn that uses CC0
1179                  with a preceding insn that sets CC0, and maybe with its
1180                  logical predecessor as well.
1181                  This is how we make decrement-and-branch insns.
1182                  We need this special code because data flow connections
1183                  via CC0 do not get entered in LOG_LINKS.  */
1184
1185               if (JUMP_P (insn)
1186                   && (prev = prev_nonnote_insn (insn)) != 0
1187                   && NONJUMP_INSN_P (prev)
1188                   && sets_cc0_p (PATTERN (prev)))
1189                 {
1190                   if ((next = try_combine (insn, prev,
1191                                            NULL_RTX, &new_direct_jump_p)) != 0)
1192                     goto retry;
1193
1194                   for (nextlinks = LOG_LINKS (prev); nextlinks;
1195                        nextlinks = XEXP (nextlinks, 1))
1196                     if ((next = try_combine (insn, prev,
1197                                              XEXP (nextlinks, 0),
1198                                              &new_direct_jump_p)) != 0)
1199                       goto retry;
1200                 }
1201
1202               /* Do the same for an insn that explicitly references CC0.  */
1203               if (NONJUMP_INSN_P (insn)
1204                   && (prev = prev_nonnote_insn (insn)) != 0
1205                   && NONJUMP_INSN_P (prev)
1206                   && sets_cc0_p (PATTERN (prev))
1207                   && GET_CODE (PATTERN (insn)) == SET
1208                   && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
1209                 {
1210                   if ((next = try_combine (insn, prev,
1211                                            NULL_RTX, &new_direct_jump_p)) != 0)
1212                     goto retry;
1213
1214                   for (nextlinks = LOG_LINKS (prev); nextlinks;
1215                        nextlinks = XEXP (nextlinks, 1))
1216                     if ((next = try_combine (insn, prev,
1217                                              XEXP (nextlinks, 0),
1218                                              &new_direct_jump_p)) != 0)
1219                       goto retry;
1220                 }
1221
1222               /* Finally, see if any of the insns that this insn links to
1223                  explicitly references CC0.  If so, try this insn, that insn,
1224                  and its predecessor if it sets CC0.  */
1225               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1226                 if (NONJUMP_INSN_P (XEXP (links, 0))
1227                     && GET_CODE (PATTERN (XEXP (links, 0))) == SET
1228                     && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
1229                     && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
1230                     && NONJUMP_INSN_P (prev)
1231                     && sets_cc0_p (PATTERN (prev))
1232                     && (next = try_combine (insn, XEXP (links, 0),
1233                                             prev, &new_direct_jump_p)) != 0)
1234                   goto retry;
1235 #endif
1236
1237               /* Try combining an insn with two different insns whose results it
1238                  uses.  */
1239               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1240                 for (nextlinks = XEXP (links, 1); nextlinks;
1241                      nextlinks = XEXP (nextlinks, 1))
1242                   if ((next = try_combine (insn, XEXP (links, 0),
1243                                            XEXP (nextlinks, 0),
1244                                            &new_direct_jump_p)) != 0)
1245                     goto retry;
1246
1247               /* Try this insn with each REG_EQUAL note it links back to.  */
1248               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1249                 {
1250                   rtx set, note;
1251                   rtx temp = XEXP (links, 0);
1252                   if ((set = single_set (temp)) != 0
1253                       && (note = find_reg_equal_equiv_note (temp)) != 0
1254                       && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
1255                       /* Avoid using a register that may already been marked
1256                          dead by an earlier instruction.  */
1257                       && ! unmentioned_reg_p (note, SET_SRC (set))
1258                       && (GET_MODE (note) == VOIDmode
1259                           ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set)))
1260                           : GET_MODE (SET_DEST (set)) == GET_MODE (note)))
1261                     {
1262                       /* Temporarily replace the set's source with the
1263                          contents of the REG_EQUAL note.  The insn will
1264                          be deleted or recognized by try_combine.  */
1265                       rtx orig = SET_SRC (set);
1266                       SET_SRC (set) = note;
1267                       i2mod = temp;
1268                       i2mod_old_rhs = copy_rtx (orig);
1269                       i2mod_new_rhs = copy_rtx (note);
1270                       next = try_combine (insn, i2mod, NULL_RTX,
1271                                           &new_direct_jump_p);
1272                       i2mod = NULL_RTX;
1273                       if (next)
1274                         goto retry;
1275                       SET_SRC (set) = orig;
1276                     }
1277                 }
1278
1279               if (!NOTE_P (insn))
1280                 record_dead_and_set_regs (insn);
1281
1282             retry:
1283               ;
1284             }
1285         }
1286     }
1287
1288   default_rtl_profile ();
1289   clear_log_links ();
1290   clear_bb_flags ();
1291   new_direct_jump_p |= purge_all_dead_edges ();
1292   delete_noop_moves ();
1293
1294   /* Clean up.  */
1295   free (uid_log_links);
1296   free (uid_insn_cost);
1297   VEC_free (reg_stat_type, heap, reg_stat);
1298
1299   {
1300     struct undo *undo, *next;
1301     for (undo = undobuf.frees; undo; undo = next)
1302       {
1303         next = undo->next;
1304         free (undo);
1305       }
1306     undobuf.frees = 0;
1307   }
1308
1309   total_attempts += combine_attempts;
1310   total_merges += combine_merges;
1311   total_extras += combine_extras;
1312   total_successes += combine_successes;
1313
1314   nonzero_sign_valid = 0;
1315   rtl_hooks = general_rtl_hooks;
1316
1317   /* Make recognizer allow volatile MEMs again.  */
1318   init_recog ();
1319
1320   return new_direct_jump_p;
1321 }
1322
1323 /* Wipe the last_xxx fields of reg_stat in preparation for another pass.  */
1324
1325 static void
1326 init_reg_last (void)
1327 {
1328   unsigned int i;
1329   reg_stat_type *p;
1330
1331   for (i = 0; VEC_iterate (reg_stat_type, reg_stat, i, p); ++i)
1332     memset (p, 0, offsetof (reg_stat_type, sign_bit_copies));
1333 }
1334 \f
1335 /* Set up any promoted values for incoming argument registers.  */
1336
1337 static void
1338 setup_incoming_promotions (rtx first)
1339 {
1340   tree arg;
1341   bool strictly_local = false;
1342
1343   for (arg = DECL_ARGUMENTS (current_function_decl); arg;
1344        arg = DECL_CHAIN (arg))
1345     {
1346       rtx x, reg = DECL_INCOMING_RTL (arg);
1347       int uns1, uns3;
1348       enum machine_mode mode1, mode2, mode3, mode4;
1349
1350       /* Only continue if the incoming argument is in a register.  */
1351       if (!REG_P (reg))
1352         continue;
1353
1354       /* Determine, if possible, whether all call sites of the current
1355          function lie within the current compilation unit.  (This does
1356          take into account the exporting of a function via taking its
1357          address, and so forth.)  */
1358       strictly_local = cgraph_local_info (current_function_decl)->local;
1359
1360       /* The mode and signedness of the argument before any promotions happen
1361          (equal to the mode of the pseudo holding it at that stage).  */
1362       mode1 = TYPE_MODE (TREE_TYPE (arg));
1363       uns1 = TYPE_UNSIGNED (TREE_TYPE (arg));
1364
1365       /* The mode and signedness of the argument after any source language and
1366          TARGET_PROMOTE_PROTOTYPES-driven promotions.  */
1367       mode2 = TYPE_MODE (DECL_ARG_TYPE (arg));
1368       uns3 = TYPE_UNSIGNED (DECL_ARG_TYPE (arg));
1369
1370       /* The mode and signedness of the argument as it is actually passed,
1371          after any TARGET_PROMOTE_FUNCTION_ARGS-driven ABI promotions.  */
1372       mode3 = promote_function_mode (DECL_ARG_TYPE (arg), mode2, &uns3,
1373                                      TREE_TYPE (cfun->decl), 0);
1374
1375       /* The mode of the register in which the argument is being passed.  */
1376       mode4 = GET_MODE (reg);
1377
1378       /* Eliminate sign extensions in the callee when:
1379          (a) A mode promotion has occurred;  */
1380       if (mode1 == mode3)
1381         continue;
1382       /* (b) The mode of the register is the same as the mode of
1383              the argument as it is passed; */
1384       if (mode3 != mode4)
1385         continue;
1386       /* (c) There's no language level extension;  */
1387       if (mode1 == mode2)
1388         ;
1389       /* (c.1) All callers are from the current compilation unit.  If that's
1390          the case we don't have to rely on an ABI, we only have to know
1391          what we're generating right now, and we know that we will do the
1392          mode1 to mode2 promotion with the given sign.  */
1393       else if (!strictly_local)
1394         continue;
1395       /* (c.2) The combination of the two promotions is useful.  This is
1396          true when the signs match, or if the first promotion is unsigned.
1397          In the later case, (sign_extend (zero_extend x)) is the same as
1398          (zero_extend (zero_extend x)), so make sure to force UNS3 true.  */
1399       else if (uns1)
1400         uns3 = true;
1401       else if (uns3)
1402         continue;
1403
1404       /* Record that the value was promoted from mode1 to mode3,
1405          so that any sign extension at the head of the current
1406          function may be eliminated.  */
1407       x = gen_rtx_CLOBBER (mode1, const0_rtx);
1408       x = gen_rtx_fmt_e ((uns3 ? ZERO_EXTEND : SIGN_EXTEND), mode3, x);
1409       record_value_for_reg (reg, first, x);
1410     }
1411 }
1412
1413 /* Called via note_stores.  If X is a pseudo that is narrower than
1414    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1415
1416    If we are setting only a portion of X and we can't figure out what
1417    portion, assume all bits will be used since we don't know what will
1418    be happening.
1419
1420    Similarly, set how many bits of X are known to be copies of the sign bit
1421    at all locations in the function.  This is the smallest number implied
1422    by any set of X.  */
1423
1424 static void
1425 set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
1426 {
1427   rtx insn = (rtx) data;
1428   unsigned int num;
1429
1430   if (REG_P (x)
1431       && REGNO (x) >= FIRST_PSEUDO_REGISTER
1432       /* If this register is undefined at the start of the file, we can't
1433          say what its contents were.  */
1434       && ! REGNO_REG_SET_P
1435            (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x))
1436       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
1437     {
1438       reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
1439
1440       if (set == 0 || GET_CODE (set) == CLOBBER)
1441         {
1442           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1443           rsp->sign_bit_copies = 1;
1444           return;
1445         }
1446
1447       /* If this register is being initialized using itself, and the
1448          register is uninitialized in this basic block, and there are
1449          no LOG_LINKS which set the register, then part of the
1450          register is uninitialized.  In that case we can't assume
1451          anything about the number of nonzero bits.
1452
1453          ??? We could do better if we checked this in
1454          reg_{nonzero_bits,num_sign_bit_copies}_for_combine.  Then we
1455          could avoid making assumptions about the insn which initially
1456          sets the register, while still using the information in other
1457          insns.  We would have to be careful to check every insn
1458          involved in the combination.  */
1459
1460       if (insn
1461           && reg_referenced_p (x, PATTERN (insn))
1462           && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
1463                                REGNO (x)))
1464         {
1465           rtx link;
1466
1467           for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1468             {
1469               if (dead_or_set_p (XEXP (link, 0), x))
1470                 break;
1471             }
1472           if (!link)
1473             {
1474               rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1475               rsp->sign_bit_copies = 1;
1476               return;
1477             }
1478         }
1479
1480       /* If this is a complex assignment, see if we can convert it into a
1481          simple assignment.  */
1482       set = expand_field_assignment (set);
1483
1484       /* If this is a simple assignment, or we have a paradoxical SUBREG,
1485          set what we know about X.  */
1486
1487       if (SET_DEST (set) == x
1488           || (GET_CODE (SET_DEST (set)) == SUBREG
1489               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
1490                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
1491               && SUBREG_REG (SET_DEST (set)) == x))
1492         {
1493           rtx src = SET_SRC (set);
1494
1495 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
1496           /* If X is narrower than a word and SRC is a non-negative
1497              constant that would appear negative in the mode of X,
1498              sign-extend it for use in reg_stat[].nonzero_bits because some
1499              machines (maybe most) will actually do the sign-extension
1500              and this is the conservative approach.
1501
1502              ??? For 2.5, try to tighten up the MD files in this regard
1503              instead of this kludge.  */
1504
1505           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
1506               && CONST_INT_P (src)
1507               && INTVAL (src) > 0
1508               && 0 != (INTVAL (src)
1509                        & ((HOST_WIDE_INT) 1
1510                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
1511             src = GEN_INT (INTVAL (src)
1512                            | ((HOST_WIDE_INT) (-1)
1513                               << GET_MODE_BITSIZE (GET_MODE (x))));
1514 #endif
1515
1516           /* Don't call nonzero_bits if it cannot change anything.  */
1517           if (rsp->nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
1518             rsp->nonzero_bits |= nonzero_bits (src, nonzero_bits_mode);
1519           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1520           if (rsp->sign_bit_copies == 0
1521               || rsp->sign_bit_copies > num)
1522             rsp->sign_bit_copies = num;
1523         }
1524       else
1525         {
1526           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1527           rsp->sign_bit_copies = 1;
1528         }
1529     }
1530 }
1531 \f
1532 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
1533    insns that were previously combined into I3 or that will be combined
1534    into the merger of INSN and I3.
1535
1536    Return 0 if the combination is not allowed for any reason.
1537
1538    If the combination is allowed, *PDEST will be set to the single
1539    destination of INSN and *PSRC to the single source, and this function
1540    will return 1.  */
1541
1542 static int
1543 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
1544                rtx *pdest, rtx *psrc)
1545 {
1546   int i;
1547   const_rtx set = 0;
1548   rtx src, dest;
1549   rtx p;
1550 #ifdef AUTO_INC_DEC
1551   rtx link;
1552 #endif
1553   int all_adjacent = (succ ? (next_active_insn (insn) == succ
1554                               && next_active_insn (succ) == i3)
1555                       : next_active_insn (insn) == i3);
1556
1557   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1558      or a PARALLEL consisting of such a SET and CLOBBERs.
1559
1560      If INSN has CLOBBER parallel parts, ignore them for our processing.
1561      By definition, these happen during the execution of the insn.  When it
1562      is merged with another insn, all bets are off.  If they are, in fact,
1563      needed and aren't also supplied in I3, they may be added by
1564      recog_for_combine.  Otherwise, it won't match.
1565
1566      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1567      note.
1568
1569      Get the source and destination of INSN.  If more than one, can't
1570      combine.  */
1571
1572   if (GET_CODE (PATTERN (insn)) == SET)
1573     set = PATTERN (insn);
1574   else if (GET_CODE (PATTERN (insn)) == PARALLEL
1575            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1576     {
1577       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1578         {
1579           rtx elt = XVECEXP (PATTERN (insn), 0, i);
1580
1581           switch (GET_CODE (elt))
1582             {
1583             /* This is important to combine floating point insns
1584                for the SH4 port.  */
1585             case USE:
1586               /* Combining an isolated USE doesn't make sense.
1587                  We depend here on combinable_i3pat to reject them.  */
1588               /* The code below this loop only verifies that the inputs of
1589                  the SET in INSN do not change.  We call reg_set_between_p
1590                  to verify that the REG in the USE does not change between
1591                  I3 and INSN.
1592                  If the USE in INSN was for a pseudo register, the matching
1593                  insn pattern will likely match any register; combining this
1594                  with any other USE would only be safe if we knew that the
1595                  used registers have identical values, or if there was
1596                  something to tell them apart, e.g. different modes.  For
1597                  now, we forgo such complicated tests and simply disallow
1598                  combining of USES of pseudo registers with any other USE.  */
1599               if (REG_P (XEXP (elt, 0))
1600                   && GET_CODE (PATTERN (i3)) == PARALLEL)
1601                 {
1602                   rtx i3pat = PATTERN (i3);
1603                   int i = XVECLEN (i3pat, 0) - 1;
1604                   unsigned int regno = REGNO (XEXP (elt, 0));
1605
1606                   do
1607                     {
1608                       rtx i3elt = XVECEXP (i3pat, 0, i);
1609
1610                       if (GET_CODE (i3elt) == USE
1611                           && REG_P (XEXP (i3elt, 0))
1612                           && (REGNO (XEXP (i3elt, 0)) == regno
1613                               ? reg_set_between_p (XEXP (elt, 0),
1614                                                    PREV_INSN (insn), i3)
1615                               : regno >= FIRST_PSEUDO_REGISTER))
1616                         return 0;
1617                     }
1618                   while (--i >= 0);
1619                 }
1620               break;
1621
1622               /* We can ignore CLOBBERs.  */
1623             case CLOBBER:
1624               break;
1625
1626             case SET:
1627               /* Ignore SETs whose result isn't used but not those that
1628                  have side-effects.  */
1629               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1630                   && insn_nothrow_p (insn)
1631                   && !side_effects_p (elt))
1632                 break;
1633
1634               /* If we have already found a SET, this is a second one and
1635                  so we cannot combine with this insn.  */
1636               if (set)
1637                 return 0;
1638
1639               set = elt;
1640               break;
1641
1642             default:
1643               /* Anything else means we can't combine.  */
1644               return 0;
1645             }
1646         }
1647
1648       if (set == 0
1649           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1650              so don't do anything with it.  */
1651           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1652         return 0;
1653     }
1654   else
1655     return 0;
1656
1657   if (set == 0)
1658     return 0;
1659
1660   set = expand_field_assignment (set);
1661   src = SET_SRC (set), dest = SET_DEST (set);
1662
1663   /* Don't eliminate a store in the stack pointer.  */
1664   if (dest == stack_pointer_rtx
1665       /* Don't combine with an insn that sets a register to itself if it has
1666          a REG_EQUAL note.  This may be part of a LIBCALL sequence.  */
1667       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1668       /* Can't merge an ASM_OPERANDS.  */
1669       || GET_CODE (src) == ASM_OPERANDS
1670       /* Can't merge a function call.  */
1671       || GET_CODE (src) == CALL
1672       /* Don't eliminate a function call argument.  */
1673       || (CALL_P (i3)
1674           && (find_reg_fusage (i3, USE, dest)
1675               || (REG_P (dest)
1676                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
1677                   && global_regs[REGNO (dest)])))
1678       /* Don't substitute into an incremented register.  */
1679       || FIND_REG_INC_NOTE (i3, dest)
1680       || (succ && FIND_REG_INC_NOTE (succ, dest))
1681       /* Don't substitute into a non-local goto, this confuses CFG.  */
1682       || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1683       /* Make sure that DEST is not used after SUCC but before I3.  */
1684       || (succ && ! all_adjacent
1685           && reg_used_between_p (dest, succ, i3))
1686       /* Make sure that the value that is to be substituted for the register
1687          does not use any registers whose values alter in between.  However,
1688          If the insns are adjacent, a use can't cross a set even though we
1689          think it might (this can happen for a sequence of insns each setting
1690          the same destination; last_set of that register might point to
1691          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1692          equivalent to the memory so the substitution is valid even if there
1693          are intervening stores.  Also, don't move a volatile asm or
1694          UNSPEC_VOLATILE across any other insns.  */
1695       || (! all_adjacent
1696           && (((!MEM_P (src)
1697                 || ! find_reg_note (insn, REG_EQUIV, src))
1698                && use_crosses_set_p (src, DF_INSN_LUID (insn)))
1699               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1700               || GET_CODE (src) == UNSPEC_VOLATILE))
1701       /* Don't combine across a CALL_INSN, because that would possibly
1702          change whether the life span of some REGs crosses calls or not,
1703          and it is a pain to update that information.
1704          Exception: if source is a constant, moving it later can't hurt.
1705          Accept that as a special case.  */
1706       || (DF_INSN_LUID (insn) < last_call_luid && ! CONSTANT_P (src)))
1707     return 0;
1708
1709   /* DEST must either be a REG or CC0.  */
1710   if (REG_P (dest))
1711     {
1712       /* If register alignment is being enforced for multi-word items in all
1713          cases except for parameters, it is possible to have a register copy
1714          insn referencing a hard register that is not allowed to contain the
1715          mode being copied and which would not be valid as an operand of most
1716          insns.  Eliminate this problem by not combining with such an insn.
1717
1718          Also, on some machines we don't want to extend the life of a hard
1719          register.  */
1720
1721       if (REG_P (src)
1722           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1723                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1724               /* Don't extend the life of a hard register unless it is
1725                  user variable (if we have few registers) or it can't
1726                  fit into the desired register (meaning something special
1727                  is going on).
1728                  Also avoid substituting a return register into I3, because
1729                  reload can't handle a conflict with constraints of other
1730                  inputs.  */
1731               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1732                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1733         return 0;
1734     }
1735   else if (GET_CODE (dest) != CC0)
1736     return 0;
1737
1738
1739   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1740     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1741       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
1742         {
1743           /* Don't substitute for a register intended as a clobberable
1744              operand.  */
1745           rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
1746           if (rtx_equal_p (reg, dest))
1747             return 0;
1748
1749           /* If the clobber represents an earlyclobber operand, we must not
1750              substitute an expression containing the clobbered register.
1751              As we do not analyze the constraint strings here, we have to
1752              make the conservative assumption.  However, if the register is
1753              a fixed hard reg, the clobber cannot represent any operand;
1754              we leave it up to the machine description to either accept or
1755              reject use-and-clobber patterns.  */
1756           if (!REG_P (reg)
1757               || REGNO (reg) >= FIRST_PSEUDO_REGISTER
1758               || !fixed_regs[REGNO (reg)])
1759             if (reg_overlap_mentioned_p (reg, src))
1760               return 0;
1761         }
1762
1763   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1764      or not), reject, unless nothing volatile comes between it and I3 */
1765
1766   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1767     {
1768       /* Make sure succ doesn't contain a volatile reference.  */
1769       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1770         return 0;
1771
1772       for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1773         if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
1774           return 0;
1775     }
1776
1777   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1778      to be an explicit register variable, and was chosen for a reason.  */
1779
1780   if (GET_CODE (src) == ASM_OPERANDS
1781       && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1782     return 0;
1783
1784   /* If there are any volatile insns between INSN and I3, reject, because
1785      they might affect machine state.  */
1786
1787   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1788     if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
1789       return 0;
1790
1791   /* If INSN contains an autoincrement or autodecrement, make sure that
1792      register is not used between there and I3, and not already used in
1793      I3 either.  Neither must it be used in PRED or SUCC, if they exist.
1794      Also insist that I3 not be a jump; if it were one
1795      and the incremented register were spilled, we would lose.  */
1796
1797 #ifdef AUTO_INC_DEC
1798   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1799     if (REG_NOTE_KIND (link) == REG_INC
1800         && (JUMP_P (i3)
1801             || reg_used_between_p (XEXP (link, 0), insn, i3)
1802             || (pred != NULL_RTX
1803                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
1804             || (succ != NULL_RTX
1805                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
1806             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1807       return 0;
1808 #endif
1809
1810 #ifdef HAVE_cc0
1811   /* Don't combine an insn that follows a CC0-setting insn.
1812      An insn that uses CC0 must not be separated from the one that sets it.
1813      We do, however, allow I2 to follow a CC0-setting insn if that insn
1814      is passed as I1; in that case it will be deleted also.
1815      We also allow combining in this case if all the insns are adjacent
1816      because that would leave the two CC0 insns adjacent as well.
1817      It would be more logical to test whether CC0 occurs inside I1 or I2,
1818      but that would be much slower, and this ought to be equivalent.  */
1819
1820   p = prev_nonnote_insn (insn);
1821   if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
1822       && ! all_adjacent)
1823     return 0;
1824 #endif
1825
1826   /* If we get here, we have passed all the tests and the combination is
1827      to be allowed.  */
1828
1829   *pdest = dest;
1830   *psrc = src;
1831
1832   return 1;
1833 }
1834 \f
1835 /* LOC is the location within I3 that contains its pattern or the component
1836    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1837
1838    One problem is if I3 modifies its output, as opposed to replacing it
1839    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1840    so would produce an insn that is not equivalent to the original insns.
1841
1842    Consider:
1843
1844          (set (reg:DI 101) (reg:DI 100))
1845          (set (subreg:SI (reg:DI 101) 0) <foo>)
1846
1847    This is NOT equivalent to:
1848
1849          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1850                     (set (reg:DI 101) (reg:DI 100))])
1851
1852    Not only does this modify 100 (in which case it might still be valid
1853    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1854
1855    We can also run into a problem if I2 sets a register that I1
1856    uses and I1 gets directly substituted into I3 (not via I2).  In that
1857    case, we would be getting the wrong value of I2DEST into I3, so we
1858    must reject the combination.  This case occurs when I2 and I1 both
1859    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1860    If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
1861    of a SET must prevent combination from occurring.
1862
1863    Before doing the above check, we first try to expand a field assignment
1864    into a set of logical operations.
1865
1866    If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
1867    we place a register that is both set and used within I3.  If more than one
1868    such register is detected, we fail.
1869
1870    Return 1 if the combination is valid, zero otherwise.  */
1871
1872 static int
1873 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
1874                   int i1_not_in_src, rtx *pi3dest_killed)
1875 {
1876   rtx x = *loc;
1877
1878   if (GET_CODE (x) == SET)
1879     {
1880       rtx set = x ;
1881       rtx dest = SET_DEST (set);
1882       rtx src = SET_SRC (set);
1883       rtx inner_dest = dest;
1884       rtx subdest;
1885
1886       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1887              || GET_CODE (inner_dest) == SUBREG
1888              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1889         inner_dest = XEXP (inner_dest, 0);
1890
1891       /* Check for the case where I3 modifies its output, as discussed
1892          above.  We don't want to prevent pseudos from being combined
1893          into the address of a MEM, so only prevent the combination if
1894          i1 or i2 set the same MEM.  */
1895       if ((inner_dest != dest &&
1896            (!MEM_P (inner_dest)
1897             || rtx_equal_p (i2dest, inner_dest)
1898             || (i1dest && rtx_equal_p (i1dest, inner_dest)))
1899            && (reg_overlap_mentioned_p (i2dest, inner_dest)
1900                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1901
1902           /* This is the same test done in can_combine_p except we can't test
1903              all_adjacent; we don't have to, since this instruction will stay
1904              in place, thus we are not considering increasing the lifetime of
1905              INNER_DEST.
1906
1907              Also, if this insn sets a function argument, combining it with
1908              something that might need a spill could clobber a previous
1909              function argument; the all_adjacent test in can_combine_p also
1910              checks this; here, we do a more specific test for this case.  */
1911
1912           || (REG_P (inner_dest)
1913               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1914               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1915                                         GET_MODE (inner_dest))))
1916           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1917         return 0;
1918
1919       /* If DEST is used in I3, it is being killed in this insn, so
1920          record that for later.  We have to consider paradoxical
1921          subregs here, since they kill the whole register, but we
1922          ignore partial subregs, STRICT_LOW_PART, etc.
1923          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1924          STACK_POINTER_REGNUM, since these are always considered to be
1925          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1926       subdest = dest;
1927       if (GET_CODE (subdest) == SUBREG
1928           && (GET_MODE_SIZE (GET_MODE (subdest))
1929               >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
1930         subdest = SUBREG_REG (subdest);
1931       if (pi3dest_killed
1932           && REG_P (subdest)
1933           && reg_referenced_p (subdest, PATTERN (i3))
1934           && REGNO (subdest) != FRAME_POINTER_REGNUM
1935 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1936           && REGNO (subdest) != HARD_FRAME_POINTER_REGNUM
1937 #endif
1938 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1939           && (REGNO (subdest) != ARG_POINTER_REGNUM
1940               || ! fixed_regs [REGNO (subdest)])
1941 #endif
1942           && REGNO (subdest) != STACK_POINTER_REGNUM)
1943         {
1944           if (*pi3dest_killed)
1945             return 0;
1946
1947           *pi3dest_killed = subdest;
1948         }
1949     }
1950
1951   else if (GET_CODE (x) == PARALLEL)
1952     {
1953       int i;
1954
1955       for (i = 0; i < XVECLEN (x, 0); i++)
1956         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1957                                 i1_not_in_src, pi3dest_killed))
1958           return 0;
1959     }
1960
1961   return 1;
1962 }
1963 \f
1964 /* Return 1 if X is an arithmetic expression that contains a multiplication
1965    and division.  We don't count multiplications by powers of two here.  */
1966
1967 static int
1968 contains_muldiv (rtx x)
1969 {
1970   switch (GET_CODE (x))
1971     {
1972     case MOD:  case DIV:  case UMOD:  case UDIV:
1973       return 1;
1974
1975     case MULT:
1976       return ! (CONST_INT_P (XEXP (x, 1))
1977                 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1978     default:
1979       if (BINARY_P (x))
1980         return contains_muldiv (XEXP (x, 0))
1981             || contains_muldiv (XEXP (x, 1));
1982
1983       if (UNARY_P (x))
1984         return contains_muldiv (XEXP (x, 0));
1985
1986       return 0;
1987     }
1988 }
1989 \f
1990 /* Determine whether INSN can be used in a combination.  Return nonzero if
1991    not.  This is used in try_combine to detect early some cases where we
1992    can't perform combinations.  */
1993
1994 static int
1995 cant_combine_insn_p (rtx insn)
1996 {
1997   rtx set;
1998   rtx src, dest;
1999
2000   /* If this isn't really an insn, we can't do anything.
2001      This can occur when flow deletes an insn that it has merged into an
2002      auto-increment address.  */
2003   if (! INSN_P (insn))
2004     return 1;
2005
2006   /* Never combine loads and stores involving hard regs that are likely
2007      to be spilled.  The register allocator can usually handle such
2008      reg-reg moves by tying.  If we allow the combiner to make
2009      substitutions of likely-spilled regs, reload might die.
2010      As an exception, we allow combinations involving fixed regs; these are
2011      not available to the register allocator so there's no risk involved.  */
2012
2013   set = single_set (insn);
2014   if (! set)
2015     return 0;
2016   src = SET_SRC (set);
2017   dest = SET_DEST (set);
2018   if (GET_CODE (src) == SUBREG)
2019     src = SUBREG_REG (src);
2020   if (GET_CODE (dest) == SUBREG)
2021     dest = SUBREG_REG (dest);
2022   if (REG_P (src) && REG_P (dest)
2023       && ((REGNO (src) < FIRST_PSEUDO_REGISTER
2024            && ! fixed_regs[REGNO (src)]
2025            && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (src))))
2026           || (REGNO (dest) < FIRST_PSEUDO_REGISTER
2027               && ! fixed_regs[REGNO (dest)]
2028               && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (dest))))))
2029     return 1;
2030
2031   return 0;
2032 }
2033
2034 struct likely_spilled_retval_info
2035 {
2036   unsigned regno, nregs;
2037   unsigned mask;
2038 };
2039
2040 /* Called via note_stores by likely_spilled_retval_p.  Remove from info->mask
2041    hard registers that are known to be written to / clobbered in full.  */
2042 static void
2043 likely_spilled_retval_1 (rtx x, const_rtx set, void *data)
2044 {
2045   struct likely_spilled_retval_info *const info =
2046     (struct likely_spilled_retval_info *) data;
2047   unsigned regno, nregs;
2048   unsigned new_mask;
2049
2050   if (!REG_P (XEXP (set, 0)))
2051     return;
2052   regno = REGNO (x);
2053   if (regno >= info->regno + info->nregs)
2054     return;
2055   nregs = hard_regno_nregs[regno][GET_MODE (x)];
2056   if (regno + nregs <= info->regno)
2057     return;
2058   new_mask = (2U << (nregs - 1)) - 1;
2059   if (regno < info->regno)
2060     new_mask >>= info->regno - regno;
2061   else
2062     new_mask <<= regno - info->regno;
2063   info->mask &= ~new_mask;
2064 }
2065
2066 /* Return nonzero iff part of the return value is live during INSN, and
2067    it is likely spilled.  This can happen when more than one insn is needed
2068    to copy the return value, e.g. when we consider to combine into the
2069    second copy insn for a complex value.  */
2070
2071 static int
2072 likely_spilled_retval_p (rtx insn)
2073 {
2074   rtx use = BB_END (this_basic_block);
2075   rtx reg, p;
2076   unsigned regno, nregs;
2077   /* We assume here that no machine mode needs more than
2078      32 hard registers when the value overlaps with a register
2079      for which TARGET_FUNCTION_VALUE_REGNO_P is true.  */
2080   unsigned mask;
2081   struct likely_spilled_retval_info info;
2082
2083   if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
2084     return 0;
2085   reg = XEXP (PATTERN (use), 0);
2086   if (!REG_P (reg) || !targetm.calls.function_value_regno_p (REGNO (reg)))
2087     return 0;
2088   regno = REGNO (reg);
2089   nregs = hard_regno_nregs[regno][GET_MODE (reg)];
2090   if (nregs == 1)
2091     return 0;
2092   mask = (2U << (nregs - 1)) - 1;
2093
2094   /* Disregard parts of the return value that are set later.  */
2095   info.regno = regno;
2096   info.nregs = nregs;
2097   info.mask = mask;
2098   for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
2099     if (INSN_P (p))
2100       note_stores (PATTERN (p), likely_spilled_retval_1, &info);
2101   mask = info.mask;
2102
2103   /* Check if any of the (probably) live return value registers is
2104      likely spilled.  */
2105   nregs --;
2106   do
2107     {
2108       if ((mask & 1 << nregs)
2109           && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno + nregs)))
2110         return 1;
2111     } while (nregs--);
2112   return 0;
2113 }
2114
2115 /* Adjust INSN after we made a change to its destination.
2116
2117    Changing the destination can invalidate notes that say something about
2118    the results of the insn and a LOG_LINK pointing to the insn.  */
2119
2120 static void
2121 adjust_for_new_dest (rtx insn)
2122 {
2123   /* For notes, be conservative and simply remove them.  */
2124   remove_reg_equal_equiv_notes (insn);
2125
2126   /* The new insn will have a destination that was previously the destination
2127      of an insn just above it.  Call distribute_links to make a LOG_LINK from
2128      the next use of that destination.  */
2129   distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
2130
2131   df_insn_rescan (insn);
2132 }
2133
2134 /* Return TRUE if combine can reuse reg X in mode MODE.
2135    ADDED_SETS is nonzero if the original set is still required.  */
2136 static bool
2137 can_change_dest_mode (rtx x, int added_sets, enum machine_mode mode)
2138 {
2139   unsigned int regno;
2140
2141   if (!REG_P(x))
2142     return false;
2143
2144   regno = REGNO (x);
2145   /* Allow hard registers if the new mode is legal, and occupies no more
2146      registers than the old mode.  */
2147   if (regno < FIRST_PSEUDO_REGISTER)
2148     return (HARD_REGNO_MODE_OK (regno, mode)
2149             && (hard_regno_nregs[regno][GET_MODE (x)]
2150                 >= hard_regno_nregs[regno][mode]));
2151
2152   /* Or a pseudo that is only used once.  */
2153   return (REG_N_SETS (regno) == 1 && !added_sets
2154           && !REG_USERVAR_P (x));
2155 }
2156
2157
2158 /* Check whether X, the destination of a set, refers to part of
2159    the register specified by REG.  */
2160
2161 static bool
2162 reg_subword_p (rtx x, rtx reg)
2163 {
2164   /* Check that reg is an integer mode register.  */
2165   if (!REG_P (reg) || GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
2166     return false;
2167
2168   if (GET_CODE (x) == STRICT_LOW_PART
2169       || GET_CODE (x) == ZERO_EXTRACT)
2170     x = XEXP (x, 0);
2171
2172   return GET_CODE (x) == SUBREG
2173          && SUBREG_REG (x) == reg
2174          && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT;
2175 }
2176
2177 #ifdef AUTO_INC_DEC
2178 /* Replace auto-increment addressing modes with explicit operations to
2179    access the same addresses without modifying the corresponding
2180    registers.  If AFTER holds, SRC is meant to be reused after the
2181    side effect, otherwise it is to be reused before that.  */
2182
2183 static rtx
2184 cleanup_auto_inc_dec (rtx src, bool after, enum machine_mode mem_mode)
2185 {
2186   rtx x = src;
2187   const RTX_CODE code = GET_CODE (x);
2188   int i;
2189   const char *fmt;
2190
2191   switch (code)
2192     {
2193     case REG:
2194     case CONST_INT:
2195     case CONST_DOUBLE:
2196     case CONST_FIXED:
2197     case CONST_VECTOR:
2198     case SYMBOL_REF:
2199     case CODE_LABEL:
2200     case PC:
2201     case CC0:
2202     case SCRATCH:
2203       /* SCRATCH must be shared because they represent distinct values.  */
2204       return x;
2205     case CLOBBER:
2206       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2207         return x;
2208       break;
2209
2210     case CONST:
2211       if (shared_const_p (x))
2212         return x;
2213       break;
2214
2215     case MEM:
2216       mem_mode = GET_MODE (x);
2217       break;
2218
2219     case PRE_INC:
2220     case PRE_DEC:
2221     case POST_INC:
2222     case POST_DEC:
2223       gcc_assert (mem_mode != VOIDmode && mem_mode != BLKmode);
2224       if (after == (code == PRE_INC || code == PRE_DEC))
2225         x = cleanup_auto_inc_dec (XEXP (x, 0), after, mem_mode);
2226       else
2227         x = gen_rtx_PLUS (GET_MODE (x),
2228                           cleanup_auto_inc_dec (XEXP (x, 0), after, mem_mode),
2229                           GEN_INT ((code == PRE_INC || code == POST_INC)
2230                                    ? GET_MODE_SIZE (mem_mode)
2231                                    : -GET_MODE_SIZE (mem_mode)));
2232       return x;
2233
2234     case PRE_MODIFY:
2235     case POST_MODIFY:
2236       if (after == (code == PRE_MODIFY))
2237         x = XEXP (x, 0);
2238       else
2239         x = XEXP (x, 1);
2240       return cleanup_auto_inc_dec (x, after, mem_mode);
2241
2242     default:
2243       break;
2244     }
2245
2246   /* Copy the various flags, fields, and other information.  We assume
2247      that all fields need copying, and then clear the fields that should
2248      not be copied.  That is the sensible default behavior, and forces
2249      us to explicitly document why we are *not* copying a flag.  */
2250   x = shallow_copy_rtx (x);
2251
2252   /* We do not copy the USED flag, which is used as a mark bit during
2253      walks over the RTL.  */
2254   RTX_FLAG (x, used) = 0;
2255
2256   /* We do not copy FRAME_RELATED for INSNs.  */
2257   if (INSN_P (x))
2258     RTX_FLAG (x, frame_related) = 0;
2259
2260   fmt = GET_RTX_FORMAT (code);
2261   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2262     if (fmt[i] == 'e')
2263       XEXP (x, i) = cleanup_auto_inc_dec (XEXP (x, i), after, mem_mode);
2264     else if (fmt[i] == 'E' || fmt[i] == 'V')
2265       {
2266         int j;
2267         XVEC (x, i) = rtvec_alloc (XVECLEN (x, i));
2268         for (j = 0; j < XVECLEN (x, i); j++)
2269           XVECEXP (x, i, j)
2270             = cleanup_auto_inc_dec (XVECEXP (src, i, j), after, mem_mode);
2271       }
2272
2273   return x;
2274 }
2275 #endif
2276
2277 /* Auxiliary data structure for propagate_for_debug_stmt.  */
2278
2279 struct rtx_subst_pair
2280 {
2281   rtx to;
2282   bool adjusted;
2283   bool after;
2284 };
2285
2286 /* DATA points to an rtx_subst_pair.  Return the value that should be
2287    substituted.  */
2288
2289 static rtx
2290 propagate_for_debug_subst (rtx from, const_rtx old_rtx, void *data)
2291 {
2292   struct rtx_subst_pair *pair = (struct rtx_subst_pair *)data;
2293
2294   if (!rtx_equal_p (from, old_rtx))
2295     return NULL_RTX;
2296   if (!pair->adjusted)
2297     {
2298       pair->adjusted = true;
2299 #ifdef AUTO_INC_DEC
2300       pair->to = cleanup_auto_inc_dec (pair->to, pair->after, VOIDmode);
2301 #else
2302       pair->to = copy_rtx (pair->to);
2303 #endif
2304       pair->to = make_compound_operation (pair->to, SET);
2305       return pair->to;
2306     }
2307   return copy_rtx (pair->to);
2308 }
2309
2310 /* Replace occurrences of DEST with SRC in DEBUG_INSNs between INSN
2311    and LAST.  If MOVE holds, debug insns must also be moved past
2312    LAST.  */
2313
2314 static void
2315 propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src, bool move)
2316 {
2317   rtx next, move_pos = move ? last : NULL_RTX, loc;
2318
2319   struct rtx_subst_pair p;
2320   p.to = src;
2321   p.adjusted = false;
2322   p.after = move;
2323
2324   next = NEXT_INSN (insn);
2325   while (next != last)
2326     {
2327       insn = next;
2328       next = NEXT_INSN (insn);
2329       if (DEBUG_INSN_P (insn))
2330         {
2331           loc = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
2332                                          dest, propagate_for_debug_subst, &p);
2333           if (loc == INSN_VAR_LOCATION_LOC (insn))
2334             continue;
2335           INSN_VAR_LOCATION_LOC (insn) = loc;
2336           if (move_pos)
2337             {
2338               remove_insn (insn);
2339               PREV_INSN (insn) = NEXT_INSN (insn) = NULL_RTX;
2340               move_pos = emit_debug_insn_after (insn, move_pos);
2341             }
2342           else
2343             df_insn_rescan (insn);
2344         }
2345     }
2346 }
2347
2348 /* Delete the unconditional jump INSN and adjust the CFG correspondingly.
2349    Note that the INSN should be deleted *after* removing dead edges, so
2350    that the kept edge is the fallthrough edge for a (set (pc) (pc))
2351    but not for a (set (pc) (label_ref FOO)).  */
2352
2353 static void
2354 update_cfg_for_uncondjump (rtx insn)
2355 {
2356   basic_block bb = BLOCK_FOR_INSN (insn);
2357   bool at_end = (BB_END (bb) == insn);
2358
2359   if (at_end)
2360     purge_dead_edges (bb);
2361
2362   delete_insn (insn);
2363   if (at_end && EDGE_COUNT (bb->succs) == 1)
2364     single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2365 }
2366
2367
2368 /* Try to combine the insns I1 and I2 into I3.
2369    Here I1 and I2 appear earlier than I3.
2370    I1 can be zero; then we combine just I2 into I3.
2371
2372    If we are combining three insns and the resulting insn is not recognized,
2373    try splitting it into two insns.  If that happens, I2 and I3 are retained
2374    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
2375    are pseudo-deleted.
2376
2377    Return 0 if the combination does not work.  Then nothing is changed.
2378    If we did the combination, return the insn at which combine should
2379    resume scanning.
2380
2381    Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2382    new direct jump instruction.  */
2383
2384 static rtx
2385 try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
2386 {
2387   /* New patterns for I3 and I2, respectively.  */
2388   rtx newpat, newi2pat = 0;
2389   rtvec newpat_vec_with_clobbers = 0;
2390   int substed_i2 = 0, substed_i1 = 0;
2391   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
2392   int added_sets_1, added_sets_2;
2393   /* Total number of SETs to put into I3.  */
2394   int total_sets;
2395   /* Nonzero if I2's body now appears in I3.  */
2396   int i2_is_used;
2397   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
2398   int insn_code_number, i2_code_number = 0, other_code_number = 0;
2399   /* Contains I3 if the destination of I3 is used in its source, which means
2400      that the old life of I3 is being killed.  If that usage is placed into
2401      I2 and not in I3, a REG_DEAD note must be made.  */
2402   rtx i3dest_killed = 0;
2403   /* SET_DEST and SET_SRC of I2 and I1.  */
2404   rtx i2dest = 0, i2src = 0, i1dest = 0, i1src = 0;
2405   /* Set if I2DEST was reused as a scratch register.  */
2406   bool i2scratch = false;
2407   /* PATTERN (I1) and PATTERN (I2), or a copy of it in certain cases.  */
2408   rtx i1pat = 0, i2pat = 0;
2409   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
2410   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
2411   int i2dest_killed = 0, i1dest_killed = 0;
2412   int i1_feeds_i3 = 0;
2413   /* Notes that must be added to REG_NOTES in I3 and I2.  */
2414   rtx new_i3_notes, new_i2_notes;
2415   /* Notes that we substituted I3 into I2 instead of the normal case.  */
2416   int i3_subst_into_i2 = 0;
2417   /* Notes that I1, I2 or I3 is a MULT operation.  */
2418   int have_mult = 0;
2419   int swap_i2i3 = 0;
2420   int changed_i3_dest = 0;
2421
2422   int maxreg;
2423   rtx temp;
2424   rtx link;
2425   rtx other_pat = 0;
2426   rtx new_other_notes;
2427   int i;
2428
2429   /* Exit early if one of the insns involved can't be used for
2430      combinations.  */
2431   if (cant_combine_insn_p (i3)
2432       || cant_combine_insn_p (i2)
2433       || (i1 && cant_combine_insn_p (i1))
2434       || likely_spilled_retval_p (i3))
2435     return 0;
2436
2437   combine_attempts++;
2438   undobuf.other_insn = 0;
2439
2440   /* Reset the hard register usage information.  */
2441   CLEAR_HARD_REG_SET (newpat_used_regs);
2442
2443   if (dump_file && (dump_flags & TDF_DETAILS))
2444     {
2445       if (i1)
2446         fprintf (dump_file, "\nTrying %d, %d -> %d:\n",
2447                  INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2448       else
2449         fprintf (dump_file, "\nTrying %d -> %d:\n",
2450                  INSN_UID (i2), INSN_UID (i3));
2451     }
2452
2453   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
2454      code below, set I1 to be the earlier of the two insns.  */
2455   if (i1 && DF_INSN_LUID (i1) > DF_INSN_LUID (i2))
2456     temp = i1, i1 = i2, i2 = temp;
2457
2458   added_links_insn = 0;
2459
2460   /* First check for one important special-case that the code below will
2461      not handle.  Namely, the case where I1 is zero, I2 is a PARALLEL
2462      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
2463      we may be able to replace that destination with the destination of I3.
2464      This occurs in the common code where we compute both a quotient and
2465      remainder into a structure, in which case we want to do the computation
2466      directly into the structure to avoid register-register copies.
2467
2468      Note that this case handles both multiple sets in I2 and also
2469      cases where I2 has a number of CLOBBER or PARALLELs.
2470
2471      We make very conservative checks below and only try to handle the
2472      most common cases of this.  For example, we only handle the case
2473      where I2 and I3 are adjacent to avoid making difficult register
2474      usage tests.  */
2475
2476   if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
2477       && REG_P (SET_SRC (PATTERN (i3)))
2478       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
2479       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
2480       && GET_CODE (PATTERN (i2)) == PARALLEL
2481       && ! side_effects_p (SET_DEST (PATTERN (i3)))
2482       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2483          below would need to check what is inside (and reg_overlap_mentioned_p
2484          doesn't support those codes anyway).  Don't allow those destinations;
2485          the resulting insn isn't likely to be recognized anyway.  */
2486       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
2487       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
2488       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
2489                                     SET_DEST (PATTERN (i3)))
2490       && next_active_insn (i2) == i3)
2491     {
2492       rtx p2 = PATTERN (i2);
2493
2494       /* Make sure that the destination of I3,
2495          which we are going to substitute into one output of I2,
2496          is not used within another output of I2.  We must avoid making this:
2497          (parallel [(set (mem (reg 69)) ...)
2498                     (set (reg 69) ...)])
2499          which is not well-defined as to order of actions.
2500          (Besides, reload can't handle output reloads for this.)
2501
2502          The problem can also happen if the dest of I3 is a memory ref,
2503          if another dest in I2 is an indirect memory ref.  */
2504       for (i = 0; i < XVECLEN (p2, 0); i++)
2505         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2506              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2507             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
2508                                         SET_DEST (XVECEXP (p2, 0, i))))
2509           break;
2510
2511       if (i == XVECLEN (p2, 0))
2512         for (i = 0; i < XVECLEN (p2, 0); i++)
2513           if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2514                || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2515               && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
2516             {
2517               combine_merges++;
2518
2519               subst_insn = i3;
2520               subst_low_luid = DF_INSN_LUID (i2);
2521
2522               added_sets_2 = added_sets_1 = 0;
2523               i2src = SET_DEST (PATTERN (i3));
2524               i2dest = SET_SRC (PATTERN (i3));
2525               i2dest_killed = dead_or_set_p (i2, i2dest);
2526
2527               /* Replace the dest in I2 with our dest and make the resulting
2528                  insn the new pattern for I3.  Then skip to where we
2529                  validate the pattern.  Everything was set up above.  */
2530               SUBST (SET_DEST (XVECEXP (p2, 0, i)),
2531                      SET_DEST (PATTERN (i3)));
2532
2533               newpat = p2;
2534               i3_subst_into_i2 = 1;
2535               goto validate_replacement;
2536             }
2537     }
2538
2539   /* If I2 is setting a pseudo to a constant and I3 is setting some
2540      sub-part of it to another constant, merge them by making a new
2541      constant.  */
2542   if (i1 == 0
2543       && (temp = single_set (i2)) != 0
2544       && (CONST_INT_P (SET_SRC (temp))
2545           || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
2546       && GET_CODE (PATTERN (i3)) == SET
2547       && (CONST_INT_P (SET_SRC (PATTERN (i3)))
2548           || GET_CODE (SET_SRC (PATTERN (i3))) == CONST_DOUBLE)
2549       && reg_subword_p (SET_DEST (PATTERN (i3)), SET_DEST (temp)))
2550     {
2551       rtx dest = SET_DEST (PATTERN (i3));
2552       int offset = -1;
2553       int width = 0;
2554
2555       if (GET_CODE (dest) == ZERO_EXTRACT)
2556         {
2557           if (CONST_INT_P (XEXP (dest, 1))
2558               && CONST_INT_P (XEXP (dest, 2)))
2559             {
2560               width = INTVAL (XEXP (dest, 1));
2561               offset = INTVAL (XEXP (dest, 2));
2562               dest = XEXP (dest, 0);
2563               if (BITS_BIG_ENDIAN)
2564                 offset = GET_MODE_BITSIZE (GET_MODE (dest)) - width - offset;
2565             }
2566         }
2567       else
2568         {
2569           if (GET_CODE (dest) == STRICT_LOW_PART)
2570             dest = XEXP (dest, 0);
2571           width = GET_MODE_BITSIZE (GET_MODE (dest));
2572           offset = 0;
2573         }
2574
2575       if (offset >= 0)
2576         {
2577           /* If this is the low part, we're done.  */
2578           if (subreg_lowpart_p (dest))
2579             ;
2580           /* Handle the case where inner is twice the size of outer.  */
2581           else if (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2582                    == 2 * GET_MODE_BITSIZE (GET_MODE (dest)))
2583             offset += GET_MODE_BITSIZE (GET_MODE (dest));
2584           /* Otherwise give up for now.  */
2585           else
2586             offset = -1;
2587         }
2588
2589       if (offset >= 0
2590           && (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2591               <= HOST_BITS_PER_DOUBLE_INT))
2592         {
2593           double_int m, o, i;
2594           rtx inner = SET_SRC (PATTERN (i3));
2595           rtx outer = SET_SRC (temp);
2596
2597           o = rtx_to_double_int (outer);
2598           i = rtx_to_double_int (inner);
2599
2600           m = double_int_mask (width);
2601           i = double_int_and (i, m);
2602           m = double_int_lshift (m, offset, HOST_BITS_PER_DOUBLE_INT, false);
2603           i = double_int_lshift (i, offset, HOST_BITS_PER_DOUBLE_INT, false);
2604           o = double_int_ior (double_int_and_not (o, m), i);
2605
2606           combine_merges++;
2607           subst_insn = i3;
2608           subst_low_luid = DF_INSN_LUID (i2);
2609           added_sets_2 = added_sets_1 = 0;
2610           i2dest = SET_DEST (temp);
2611           i2dest_killed = dead_or_set_p (i2, i2dest);
2612
2613           /* Replace the source in I2 with the new constant and make the
2614              resulting insn the new pattern for I3.  Then skip to where we
2615              validate the pattern.  Everything was set up above.  */
2616           SUBST (SET_SRC (temp),
2617                  immed_double_int_const (o, GET_MODE (SET_DEST (temp))));
2618
2619           newpat = PATTERN (i2);
2620
2621           /* The dest of I3 has been replaced with the dest of I2.  */
2622           changed_i3_dest = 1;
2623           goto validate_replacement;
2624         }
2625     }
2626
2627 #ifndef HAVE_cc0
2628   /* If we have no I1 and I2 looks like:
2629         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
2630                    (set Y OP)])
2631      make up a dummy I1 that is
2632         (set Y OP)
2633      and change I2 to be
2634         (set (reg:CC X) (compare:CC Y (const_int 0)))
2635
2636      (We can ignore any trailing CLOBBERs.)
2637
2638      This undoes a previous combination and allows us to match a branch-and-
2639      decrement insn.  */
2640
2641   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
2642       && XVECLEN (PATTERN (i2), 0) >= 2
2643       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
2644       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
2645           == MODE_CC)
2646       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
2647       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
2648       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
2649       && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
2650       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
2651                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
2652     {
2653       for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
2654         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
2655           break;
2656
2657       if (i == 1)
2658         {
2659           /* We make I1 with the same INSN_UID as I2.  This gives it
2660              the same DF_INSN_LUID for value tracking.  Our fake I1 will
2661              never appear in the insn stream so giving it the same INSN_UID
2662              as I2 will not cause a problem.  */
2663
2664           i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
2665                              BLOCK_FOR_INSN (i2), XVECEXP (PATTERN (i2), 0, 1),
2666                              INSN_LOCATOR (i2), -1, NULL_RTX);
2667
2668           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
2669           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
2670                  SET_DEST (PATTERN (i1)));
2671         }
2672     }
2673 #endif
2674
2675   /* Verify that I2 and I1 are valid for combining.  */
2676   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
2677       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
2678     {
2679       undo_all ();
2680       return 0;
2681     }
2682
2683   /* Record whether I2DEST is used in I2SRC and similarly for the other
2684      cases.  Knowing this will help in register status updating below.  */
2685   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
2686   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
2687   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
2688   i2dest_killed = dead_or_set_p (i2, i2dest);
2689   i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
2690
2691   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
2692      in I2SRC.  */
2693   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
2694
2695   /* Ensure that I3's pattern can be the destination of combines.  */
2696   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
2697                           i1 && i2dest_in_i1src && i1_feeds_i3,
2698                           &i3dest_killed))
2699     {
2700       undo_all ();
2701       return 0;
2702     }
2703
2704   /* See if any of the insns is a MULT operation.  Unless one is, we will
2705      reject a combination that is, since it must be slower.  Be conservative
2706      here.  */
2707   if (GET_CODE (i2src) == MULT
2708       || (i1 != 0 && GET_CODE (i1src) == MULT)
2709       || (GET_CODE (PATTERN (i3)) == SET
2710           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
2711     have_mult = 1;
2712
2713   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
2714      We used to do this EXCEPT in one case: I3 has a post-inc in an
2715      output operand.  However, that exception can give rise to insns like
2716         mov r3,(r3)+
2717      which is a famous insn on the PDP-11 where the value of r3 used as the
2718      source was model-dependent.  Avoid this sort of thing.  */
2719
2720 #if 0
2721   if (!(GET_CODE (PATTERN (i3)) == SET
2722         && REG_P (SET_SRC (PATTERN (i3)))
2723         && MEM_P (SET_DEST (PATTERN (i3)))
2724         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
2725             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
2726     /* It's not the exception.  */
2727 #endif
2728 #ifdef AUTO_INC_DEC
2729     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
2730       if (REG_NOTE_KIND (link) == REG_INC
2731           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
2732               || (i1 != 0
2733                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
2734         {
2735           undo_all ();
2736           return 0;
2737         }
2738 #endif
2739
2740   /* See if the SETs in I1 or I2 need to be kept around in the merged
2741      instruction: whenever the value set there is still needed past I3.
2742      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
2743
2744      For the SET in I1, we have two cases:  If I1 and I2 independently
2745      feed into I3, the set in I1 needs to be kept around if I1DEST dies
2746      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
2747      in I1 needs to be kept around unless I1DEST dies or is set in either
2748      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
2749      I1DEST.  If so, we know I1 feeds into I2.  */
2750
2751   added_sets_2 = ! dead_or_set_p (i3, i2dest);
2752
2753   added_sets_1
2754     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
2755                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
2756
2757   /* If the set in I2 needs to be kept around, we must make a copy of
2758      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
2759      PATTERN (I2), we are only substituting for the original I1DEST, not into
2760      an already-substituted copy.  This also prevents making self-referential
2761      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
2762      I2DEST.  */
2763
2764   if (added_sets_2)
2765     {
2766       if (GET_CODE (PATTERN (i2)) == PARALLEL)
2767         i2pat = gen_rtx_SET (VOIDmode, i2dest, copy_rtx (i2src));
2768       else
2769         i2pat = copy_rtx (PATTERN (i2));
2770     }
2771
2772   if (added_sets_1)
2773     {
2774       if (GET_CODE (PATTERN (i1)) == PARALLEL)
2775         i1pat = gen_rtx_SET (VOIDmode, i1dest, copy_rtx (i1src));
2776       else
2777         i1pat = copy_rtx (PATTERN (i1));
2778     }
2779
2780   combine_merges++;
2781
2782   /* Substitute in the latest insn for the regs set by the earlier ones.  */
2783
2784   maxreg = max_reg_num ();
2785
2786   subst_insn = i3;
2787
2788 #ifndef HAVE_cc0
2789   /* Many machines that don't use CC0 have insns that can both perform an
2790      arithmetic operation and set the condition code.  These operations will
2791      be represented as a PARALLEL with the first element of the vector
2792      being a COMPARE of an arithmetic operation with the constant zero.
2793      The second element of the vector will set some pseudo to the result
2794      of the same arithmetic operation.  If we simplify the COMPARE, we won't
2795      match such a pattern and so will generate an extra insn.   Here we test
2796      for this case, where both the comparison and the operation result are
2797      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
2798      I2SRC.  Later we will make the PARALLEL that contains I2.  */
2799
2800   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
2801       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
2802       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
2803       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
2804     {
2805 #ifdef SELECT_CC_MODE
2806       rtx *cc_use;
2807       enum machine_mode compare_mode;
2808 #endif
2809
2810       newpat = PATTERN (i3);
2811       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
2812
2813       i2_is_used = 1;
2814
2815 #ifdef SELECT_CC_MODE
2816       /* See if a COMPARE with the operand we substituted in should be done
2817          with the mode that is currently being used.  If not, do the same
2818          processing we do in `subst' for a SET; namely, if the destination
2819          is used only once, try to replace it with a register of the proper
2820          mode and also replace the COMPARE.  */
2821       if (undobuf.other_insn == 0
2822           && (cc_use = find_single_use (SET_DEST (newpat), i3,
2823                                         &undobuf.other_insn))
2824           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
2825                                               i2src, const0_rtx))
2826               != GET_MODE (SET_DEST (newpat))))
2827         {
2828           if (can_change_dest_mode(SET_DEST (newpat), added_sets_2,
2829                                    compare_mode))
2830             {
2831               unsigned int regno = REGNO (SET_DEST (newpat));
2832               rtx new_dest;
2833
2834               if (regno < FIRST_PSEUDO_REGISTER)
2835                 new_dest = gen_rtx_REG (compare_mode, regno);
2836               else
2837                 {
2838                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
2839                   new_dest = regno_reg_rtx[regno];
2840                 }
2841
2842               SUBST (SET_DEST (newpat), new_dest);
2843               SUBST (XEXP (*cc_use, 0), new_dest);
2844               SUBST (SET_SRC (newpat),
2845                      gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
2846             }
2847           else
2848             undobuf.other_insn = 0;
2849         }
2850 #endif
2851     }
2852   else
2853 #endif
2854     {
2855       /* It is possible that the source of I2 or I1 may be performing
2856          an unneeded operation, such as a ZERO_EXTEND of something
2857          that is known to have the high part zero.  Handle that case
2858          by letting subst look at the innermost one of them.
2859
2860          Another way to do this would be to have a function that tries
2861          to simplify a single insn instead of merging two or more
2862          insns.  We don't do this because of the potential of infinite
2863          loops and because of the potential extra memory required.
2864          However, doing it the way we are is a bit of a kludge and
2865          doesn't catch all cases.
2866
2867          But only do this if -fexpensive-optimizations since it slows
2868          things down and doesn't usually win.
2869
2870          This is not done in the COMPARE case above because the
2871          unmodified I2PAT is used in the PARALLEL and so a pattern
2872          with a modified I2SRC would not match.  */
2873
2874       if (flag_expensive_optimizations)
2875         {
2876           /* Pass pc_rtx so no substitutions are done, just
2877              simplifications.  */
2878           if (i1)
2879             {
2880               subst_low_luid = DF_INSN_LUID (i1);
2881               i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
2882             }
2883           else
2884             {
2885               subst_low_luid = DF_INSN_LUID (i2);
2886               i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
2887             }
2888         }
2889
2890       n_occurrences = 0;                /* `subst' counts here */
2891
2892       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
2893          need to make a unique copy of I2SRC each time we substitute it
2894          to avoid self-referential rtl.  */
2895
2896       subst_low_luid = DF_INSN_LUID (i2);
2897       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
2898                       ! i1_feeds_i3 && i1dest_in_i1src);
2899       substed_i2 = 1;
2900
2901       /* Record whether i2's body now appears within i3's body.  */
2902       i2_is_used = n_occurrences;
2903     }
2904
2905   /* If we already got a failure, don't try to do more.  Otherwise,
2906      try to substitute in I1 if we have it.  */
2907
2908   if (i1 && GET_CODE (newpat) != CLOBBER)
2909     {
2910       /* Check that an autoincrement side-effect on I1 has not been lost.
2911          This happens if I1DEST is mentioned in I2 and dies there, and
2912          has disappeared from the new pattern.  */
2913       if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2914            && !i1_feeds_i3
2915            && dead_or_set_p (i2, i1dest)
2916            && !reg_overlap_mentioned_p (i1dest, newpat))
2917           /* Before we can do this substitution, we must redo the test done
2918              above (see detailed comments there) that ensures  that I1DEST
2919              isn't mentioned in any SETs in NEWPAT that are field assignments.  */
2920           || !combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, 0, 0))
2921         {
2922           undo_all ();
2923           return 0;
2924         }
2925
2926       n_occurrences = 0;
2927       subst_low_luid = DF_INSN_LUID (i1);
2928       newpat = subst (newpat, i1dest, i1src, 0, 0);
2929       substed_i1 = 1;
2930     }
2931
2932   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
2933      to count all the ways that I2SRC and I1SRC can be used.  */
2934   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
2935        && i2_is_used + added_sets_2 > 1)
2936       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2937           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
2938               > 1))
2939       /* Fail if we tried to make a new register.  */
2940       || max_reg_num () != maxreg
2941       /* Fail if we couldn't do something and have a CLOBBER.  */
2942       || GET_CODE (newpat) == CLOBBER
2943       /* Fail if this new pattern is a MULT and we didn't have one before
2944          at the outer level.  */
2945       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
2946           && ! have_mult))
2947     {
2948       undo_all ();
2949       return 0;
2950     }
2951
2952   /* If the actions of the earlier insns must be kept
2953      in addition to substituting them into the latest one,
2954      we must make a new PARALLEL for the latest insn
2955      to hold additional the SETs.  */
2956
2957   if (added_sets_1 || added_sets_2)
2958     {
2959       combine_extras++;
2960
2961       if (GET_CODE (newpat) == PARALLEL)
2962         {
2963           rtvec old = XVEC (newpat, 0);
2964           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
2965           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2966           memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
2967                   sizeof (old->elem[0]) * old->num_elem);
2968         }
2969       else
2970         {
2971           rtx old = newpat;
2972           total_sets = 1 + added_sets_1 + added_sets_2;
2973           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2974           XVECEXP (newpat, 0, 0) = old;
2975         }
2976
2977       if (added_sets_1)
2978         XVECEXP (newpat, 0, --total_sets) = i1pat;
2979
2980       if (added_sets_2)
2981         {
2982           /* If there is no I1, use I2's body as is.  We used to also not do
2983              the subst call below if I2 was substituted into I3,
2984              but that could lose a simplification.  */
2985           if (i1 == 0)
2986             XVECEXP (newpat, 0, --total_sets) = i2pat;
2987           else
2988             /* See comment where i2pat is assigned.  */
2989             XVECEXP (newpat, 0, --total_sets)
2990               = subst (i2pat, i1dest, i1src, 0, 0);
2991         }
2992     }
2993
2994  validate_replacement:
2995
2996   /* Note which hard regs this insn has as inputs.  */
2997   mark_used_regs_combine (newpat);
2998
2999   /* If recog_for_combine fails, it strips existing clobbers.  If we'll
3000      consider splitting this pattern, we might need these clobbers.  */
3001   if (i1 && GET_CODE (newpat) == PARALLEL
3002       && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
3003     {
3004       int len = XVECLEN (newpat, 0);
3005
3006       newpat_vec_with_clobbers = rtvec_alloc (len);
3007       for (i = 0; i < len; i++)
3008         RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
3009     }
3010
3011   /* Is the result of combination a valid instruction?  */
3012   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3013
3014   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
3015      the second SET's destination is a register that is unused and isn't
3016      marked as an instruction that might trap in an EH region.  In that case,
3017      we just need the first SET.   This can occur when simplifying a divmod
3018      insn.  We *must* test for this case here because the code below that
3019      splits two independent SETs doesn't handle this case correctly when it
3020      updates the register status.
3021
3022      It's pointless doing this if we originally had two sets, one from
3023      i3, and one from i2.  Combining then splitting the parallel results
3024      in the original i2 again plus an invalid insn (which we delete).
3025      The net effect is only to move instructions around, which makes
3026      debug info less accurate.
3027
3028      Also check the case where the first SET's destination is unused.
3029      That would not cause incorrect code, but does cause an unneeded
3030      insn to remain.  */
3031
3032   if (insn_code_number < 0
3033       && !(added_sets_2 && i1 == 0)
3034       && GET_CODE (newpat) == PARALLEL
3035       && XVECLEN (newpat, 0) == 2
3036       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3037       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3038       && asm_noperands (newpat) < 0)
3039     {
3040       rtx set0 = XVECEXP (newpat, 0, 0);
3041       rtx set1 = XVECEXP (newpat, 0, 1);
3042
3043       if (((REG_P (SET_DEST (set1))
3044             && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
3045            || (GET_CODE (SET_DEST (set1)) == SUBREG
3046                && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
3047           && insn_nothrow_p (i3)
3048           && !side_effects_p (SET_SRC (set1)))
3049         {
3050           newpat = set0;
3051           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3052         }
3053
3054       else if (((REG_P (SET_DEST (set0))
3055                  && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
3056                 || (GET_CODE (SET_DEST (set0)) == SUBREG
3057                     && find_reg_note (i3, REG_UNUSED,
3058                                       SUBREG_REG (SET_DEST (set0)))))
3059                && insn_nothrow_p (i3)
3060                && !side_effects_p (SET_SRC (set0)))
3061         {
3062           newpat = set1;
3063           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3064
3065           if (insn_code_number >= 0)
3066             changed_i3_dest = 1;
3067         }
3068     }
3069
3070   /* If we were combining three insns and the result is a simple SET
3071      with no ASM_OPERANDS that wasn't recognized, try to split it into two
3072      insns.  There are two ways to do this.  It can be split using a
3073      machine-specific method (like when you have an addition of a large
3074      constant) or by combine in the function find_split_point.  */
3075
3076   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
3077       && asm_noperands (newpat) < 0)
3078     {
3079       rtx parallel, m_split, *split;
3080
3081       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
3082          use I2DEST as a scratch register will help.  In the latter case,
3083          convert I2DEST to the mode of the source of NEWPAT if we can.  */
3084
3085       m_split = combine_split_insns (newpat, i3);
3086
3087       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
3088          inputs of NEWPAT.  */
3089
3090       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
3091          possible to try that as a scratch reg.  This would require adding
3092          more code to make it work though.  */
3093
3094       if (m_split == 0 && ! reg_overlap_mentioned_p (i2dest, newpat))
3095         {
3096           enum machine_mode new_mode = GET_MODE (SET_DEST (newpat));
3097
3098           /* First try to split using the original register as a
3099              scratch register.  */
3100           parallel = gen_rtx_PARALLEL (VOIDmode,
3101                                        gen_rtvec (2, newpat,
3102                                                   gen_rtx_CLOBBER (VOIDmode,
3103                                                                    i2dest)));
3104           m_split = combine_split_insns (parallel, i3);
3105
3106           /* If that didn't work, try changing the mode of I2DEST if
3107              we can.  */
3108           if (m_split == 0
3109               && new_mode != GET_MODE (i2dest)
3110               && new_mode != VOIDmode
3111               && can_change_dest_mode (i2dest, added_sets_2, new_mode))
3112             {
3113               enum machine_mode old_mode = GET_MODE (i2dest);
3114               rtx ni2dest;
3115
3116               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3117                 ni2dest = gen_rtx_REG (new_mode, REGNO (i2dest));
3118               else
3119                 {
3120                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], new_mode);
3121                   ni2dest = regno_reg_rtx[REGNO (i2dest)];
3122                 }
3123
3124               parallel = (gen_rtx_PARALLEL
3125                           (VOIDmode,
3126                            gen_rtvec (2, newpat,
3127                                       gen_rtx_CLOBBER (VOIDmode,
3128                                                        ni2dest))));
3129               m_split = combine_split_insns (parallel, i3);
3130
3131               if (m_split == 0
3132                   && REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
3133                 {
3134                   struct undo *buf;
3135
3136                   adjust_reg_mode (regno_reg_rtx[REGNO (i2dest)], old_mode);
3137                   buf = undobuf.undos;
3138                   undobuf.undos = buf->next;
3139                   buf->next = undobuf.frees;
3140                   undobuf.frees = buf;
3141                 }
3142             }
3143
3144           i2scratch = m_split != 0;
3145         }
3146
3147       /* If recog_for_combine has discarded clobbers, try to use them
3148          again for the split.  */
3149       if (m_split == 0 && newpat_vec_with_clobbers)
3150         {
3151           parallel = gen_rtx_PARALLEL (VOIDmode, newpat_vec_with_clobbers);
3152           m_split = combine_split_insns (parallel, i3);
3153         }
3154
3155       if (m_split && NEXT_INSN (m_split) == NULL_RTX)
3156         {
3157           m_split = PATTERN (m_split);
3158           insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
3159           if (insn_code_number >= 0)
3160             newpat = m_split;
3161         }
3162       else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
3163                && (next_real_insn (i2) == i3
3164                    || ! use_crosses_set_p (PATTERN (m_split), DF_INSN_LUID (i2))))
3165         {
3166           rtx i2set, i3set;
3167           rtx newi3pat = PATTERN (NEXT_INSN (m_split));
3168           newi2pat = PATTERN (m_split);
3169
3170           i3set = single_set (NEXT_INSN (m_split));
3171           i2set = single_set (m_split);
3172
3173           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3174
3175           /* If I2 or I3 has multiple SETs, we won't know how to track
3176              register status, so don't use these insns.  If I2's destination
3177              is used between I2 and I3, we also can't use these insns.  */
3178
3179           if (i2_code_number >= 0 && i2set && i3set
3180               && (next_real_insn (i2) == i3
3181                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
3182             insn_code_number = recog_for_combine (&newi3pat, i3,
3183                                                   &new_i3_notes);
3184           if (insn_code_number >= 0)
3185             newpat = newi3pat;
3186
3187           /* It is possible that both insns now set the destination of I3.
3188              If so, we must show an extra use of it.  */
3189
3190           if (insn_code_number >= 0)
3191             {
3192               rtx new_i3_dest = SET_DEST (i3set);
3193               rtx new_i2_dest = SET_DEST (i2set);
3194
3195               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
3196                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
3197                      || GET_CODE (new_i3_dest) == SUBREG)
3198                 new_i3_dest = XEXP (new_i3_dest, 0);
3199
3200               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
3201                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
3202                      || GET_CODE (new_i2_dest) == SUBREG)
3203                 new_i2_dest = XEXP (new_i2_dest, 0);
3204
3205               if (REG_P (new_i3_dest)
3206                   && REG_P (new_i2_dest)
3207                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
3208                 INC_REG_N_SETS (REGNO (new_i2_dest), 1);
3209             }
3210         }
3211
3212       /* If we can split it and use I2DEST, go ahead and see if that
3213          helps things be recognized.  Verify that none of the registers
3214          are set between I2 and I3.  */
3215       if (insn_code_number < 0
3216           && (split = find_split_point (&newpat, i3, false)) != 0
3217 #ifdef HAVE_cc0
3218           && REG_P (i2dest)
3219 #endif
3220           /* We need I2DEST in the proper mode.  If it is a hard register
3221              or the only use of a pseudo, we can change its mode.
3222              Make sure we don't change a hard register to have a mode that
3223              isn't valid for it, or change the number of registers.  */
3224           && (GET_MODE (*split) == GET_MODE (i2dest)
3225               || GET_MODE (*split) == VOIDmode
3226               || can_change_dest_mode (i2dest, added_sets_2,
3227                                        GET_MODE (*split)))
3228           && (next_real_insn (i2) == i3
3229               || ! use_crosses_set_p (*split, DF_INSN_LUID (i2)))
3230           /* We can't overwrite I2DEST if its value is still used by
3231              NEWPAT.  */
3232           && ! reg_referenced_p (i2dest, newpat))
3233         {
3234           rtx newdest = i2dest;
3235           enum rtx_code split_code = GET_CODE (*split);
3236           enum machine_mode split_mode = GET_MODE (*split);
3237           bool subst_done = false;
3238           newi2pat = NULL_RTX;
3239
3240           i2scratch = true;
3241
3242           /* *SPLIT may be part of I2SRC, so make sure we have the
3243              original expression around for later debug processing.
3244              We should not need I2SRC any more in other cases.  */
3245           if (MAY_HAVE_DEBUG_INSNS)
3246             i2src = copy_rtx (i2src);
3247           else
3248             i2src = NULL;
3249
3250           /* Get NEWDEST as a register in the proper mode.  We have already
3251              validated that we can do this.  */
3252           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
3253             {
3254               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3255                 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
3256               else
3257                 {
3258                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
3259                   newdest = regno_reg_rtx[REGNO (i2dest)];
3260                 }
3261             }
3262
3263           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3264              an ASHIFT.  This can occur if it was inside a PLUS and hence
3265              appeared to be a memory address.  This is a kludge.  */
3266           if (split_code == MULT
3267               && CONST_INT_P (XEXP (*split, 1))
3268               && INTVAL (XEXP (*split, 1)) > 0
3269               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
3270             {
3271               SUBST (*split, gen_rtx_ASHIFT (split_mode,
3272                                              XEXP (*split, 0), GEN_INT (i)));
3273               /* Update split_code because we may not have a multiply
3274                  anymore.  */
3275               split_code = GET_CODE (*split);
3276             }
3277
3278 #ifdef INSN_SCHEDULING
3279           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3280              be written as a ZERO_EXTEND.  */
3281           if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
3282             {
3283 #ifdef LOAD_EXTEND_OP
3284               /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3285                  what it really is.  */
3286               if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
3287                   == SIGN_EXTEND)
3288                 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
3289                                                     SUBREG_REG (*split)));
3290               else
3291 #endif
3292                 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
3293                                                     SUBREG_REG (*split)));
3294             }
3295 #endif
3296
3297           /* Attempt to split binary operators using arithmetic identities.  */
3298           if (BINARY_P (SET_SRC (newpat))
3299               && split_mode == GET_MODE (SET_SRC (newpat))
3300               && ! side_effects_p (SET_SRC (newpat)))
3301             {
3302               rtx setsrc = SET_SRC (newpat);
3303               enum machine_mode mode = GET_MODE (setsrc);
3304               enum rtx_code code = GET_CODE (setsrc);
3305               rtx src_op0 = XEXP (setsrc, 0);
3306               rtx src_op1 = XEXP (setsrc, 1);
3307
3308               /* Split "X = Y op Y" as "Z = Y; X = Z op Z".  */
3309               if (rtx_equal_p (src_op0, src_op1))
3310                 {
3311                   newi2pat = gen_rtx_SET (VOIDmode, newdest, src_op0);
3312                   SUBST (XEXP (setsrc, 0), newdest);
3313                   SUBST (XEXP (setsrc, 1), newdest);
3314                   subst_done = true;
3315                 }
3316               /* Split "((P op Q) op R) op S" where op is PLUS or MULT.  */
3317               else if ((code == PLUS || code == MULT)
3318                        && GET_CODE (src_op0) == code
3319                        && GET_CODE (XEXP (src_op0, 0)) == code
3320                        && (INTEGRAL_MODE_P (mode)
3321                            || (FLOAT_MODE_P (mode)
3322                                && flag_unsafe_math_optimizations)))
3323                 {
3324                   rtx p = XEXP (XEXP (src_op0, 0), 0);
3325                   rtx q = XEXP (XEXP (src_op0, 0), 1);
3326                   rtx r = XEXP (src_op0, 1);
3327                   rtx s = src_op1;
3328
3329                   /* Split both "((X op Y) op X) op Y" and
3330                      "((X op Y) op Y) op X" as "T op T" where T is
3331                      "X op Y".  */
3332                   if ((rtx_equal_p (p,r) && rtx_equal_p (q,s))
3333                        || (rtx_equal_p (p,s) && rtx_equal_p (q,r)))
3334                     {
3335                       newi2pat = gen_rtx_SET (VOIDmode, newdest,
3336                                               XEXP (src_op0, 0));
3337                       SUBST (XEXP (setsrc, 0), newdest);
3338                       SUBST (XEXP (setsrc, 1), newdest);
3339                       subst_done = true;
3340                     }
3341                   /* Split "((X op X) op Y) op Y)" as "T op T" where
3342                      T is "X op Y".  */
3343                   else if (rtx_equal_p (p,q) && rtx_equal_p (r,s))
3344                     {
3345                       rtx tmp = simplify_gen_binary (code, mode, p, r);
3346                       newi2pat = gen_rtx_SET (VOIDmode, newdest, tmp);
3347                       SUBST (XEXP (setsrc, 0), newdest);
3348                       SUBST (XEXP (setsrc, 1), newdest);
3349                       subst_done = true;
3350                     }
3351                 }
3352             }
3353
3354           if (!subst_done)
3355             {
3356               newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
3357               SUBST (*split, newdest);
3358             }
3359
3360           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3361
3362           /* recog_for_combine might have added CLOBBERs to newi2pat.
3363              Make sure NEWPAT does not depend on the clobbered regs.  */
3364           if (GET_CODE (newi2pat) == PARALLEL)
3365             for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3366               if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3367                 {
3368                   rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3369                   if (reg_overlap_mentioned_p (reg, newpat))
3370                     {
3371                       undo_all ();
3372                       return 0;
3373                     }
3374                 }
3375
3376           /* If the split point was a MULT and we didn't have one before,
3377              don't use one now.  */
3378           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
3379             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3380         }
3381     }
3382
3383   /* Check for a case where we loaded from memory in a narrow mode and
3384      then sign extended it, but we need both registers.  In that case,
3385      we have a PARALLEL with both loads from the same memory location.
3386      We can split this into a load from memory followed by a register-register
3387      copy.  This saves at least one insn, more if register allocation can
3388      eliminate the copy.
3389
3390      We cannot do this if the destination of the first assignment is a
3391      condition code register or cc0.  We eliminate this case by making sure
3392      the SET_DEST and SET_SRC have the same mode.
3393
3394      We cannot do this if the destination of the second assignment is
3395      a register that we have already assumed is zero-extended.  Similarly
3396      for a SUBREG of such a register.  */
3397
3398   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3399            && GET_CODE (newpat) == PARALLEL
3400            && XVECLEN (newpat, 0) == 2
3401            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3402            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
3403            && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
3404                == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
3405            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3406            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3407                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
3408            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3409                                    DF_INSN_LUID (i2))
3410            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3411            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3412            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
3413                  (REG_P (temp)
3414                   && VEC_index (reg_stat_type, reg_stat,
3415                                 REGNO (temp))->nonzero_bits != 0
3416                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3417                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3418                   && (VEC_index (reg_stat_type, reg_stat,
3419                                  REGNO (temp))->nonzero_bits
3420                       != GET_MODE_MASK (word_mode))))
3421            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
3422                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
3423                      (REG_P (temp)
3424                       && VEC_index (reg_stat_type, reg_stat,
3425                                     REGNO (temp))->nonzero_bits != 0
3426                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3427                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3428                       && (VEC_index (reg_stat_type, reg_stat,
3429                                      REGNO (temp))->nonzero_bits
3430                           != GET_MODE_MASK (word_mode)))))
3431            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3432                                          SET_SRC (XVECEXP (newpat, 0, 1)))
3433            && ! find_reg_note (i3, REG_UNUSED,
3434                                SET_DEST (XVECEXP (newpat, 0, 0))))
3435     {
3436       rtx ni2dest;
3437
3438       newi2pat = XVECEXP (newpat, 0, 0);
3439       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
3440       newpat = XVECEXP (newpat, 0, 1);
3441       SUBST (SET_SRC (newpat),
3442              gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
3443       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3444
3445       if (i2_code_number >= 0)
3446         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3447
3448       if (insn_code_number >= 0)
3449         swap_i2i3 = 1;
3450     }
3451
3452   /* Similarly, check for a case where we have a PARALLEL of two independent
3453      SETs but we started with three insns.  In this case, we can do the sets
3454      as two separate insns.  This case occurs when some SET allows two
3455      other insns to combine, but the destination of that SET is still live.  */
3456
3457   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3458            && GET_CODE (newpat) == PARALLEL
3459            && XVECLEN (newpat, 0) == 2
3460            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3461            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
3462            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
3463            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3464            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3465            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3466            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3467                                    DF_INSN_LUID (i2))
3468            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3469                                   XVECEXP (newpat, 0, 0))
3470            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
3471                                   XVECEXP (newpat, 0, 1))
3472            && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
3473                  && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1))))
3474 #ifdef HAVE_cc0
3475            /* We cannot split the parallel into two sets if both sets
3476               reference cc0.  */
3477            && ! (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0))
3478                  && reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 1)))
3479 #endif
3480            )
3481     {
3482       /* Normally, it doesn't matter which of the two is done first,
3483          but it does if one references cc0.  In that case, it has to
3484          be first.  */
3485 #ifdef HAVE_cc0
3486       if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
3487         {
3488           newi2pat = XVECEXP (newpat, 0, 0);
3489           newpat = XVECEXP (newpat, 0, 1);
3490         }
3491       else
3492 #endif
3493         {
3494           newi2pat = XVECEXP (newpat, 0, 1);
3495           newpat = XVECEXP (newpat, 0, 0);
3496         }
3497
3498       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3499
3500       if (i2_code_number >= 0)
3501         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3502     }
3503
3504   /* If it still isn't recognized, fail and change things back the way they
3505      were.  */
3506   if ((insn_code_number < 0
3507        /* Is the result a reasonable ASM_OPERANDS?  */
3508        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
3509     {
3510       undo_all ();
3511       return 0;
3512     }
3513
3514   /* If we had to change another insn, make sure it is valid also.  */
3515   if (undobuf.other_insn)
3516     {
3517       CLEAR_HARD_REG_SET (newpat_used_regs);
3518
3519       other_pat = PATTERN (undobuf.other_insn);
3520       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
3521                                              &new_other_notes);
3522
3523       if (other_code_number < 0 && ! check_asm_operands (other_pat))
3524         {
3525           undo_all ();
3526           return 0;
3527         }
3528     }
3529
3530 #ifdef HAVE_cc0
3531   /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
3532      they are adjacent to each other or not.  */
3533   {
3534     rtx p = prev_nonnote_insn (i3);
3535     if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
3536         && sets_cc0_p (newi2pat))
3537       {
3538         undo_all ();
3539         return 0;
3540       }
3541   }
3542 #endif
3543
3544   /* Only allow this combination if insn_rtx_costs reports that the
3545      replacement instructions are cheaper than the originals.  */
3546   if (!combine_validate_cost (i1, i2, i3, newpat, newi2pat, other_pat))
3547     {
3548       undo_all ();
3549       return 0;
3550     }
3551
3552   if (MAY_HAVE_DEBUG_INSNS)
3553     {
3554       struct undo *undo;
3555
3556       for (undo = undobuf.undos; undo; undo = undo->next)
3557         if (undo->kind == UNDO_MODE)
3558           {
3559             rtx reg = *undo->where.r;
3560             enum machine_mode new_mode = GET_MODE (reg);
3561             enum machine_mode old_mode = undo->old_contents.m;
3562
3563             /* Temporarily revert mode back.  */
3564             adjust_reg_mode (reg, old_mode);
3565
3566             if (reg == i2dest && i2scratch)
3567               {
3568                 /* If we used i2dest as a scratch register with a
3569                    different mode, substitute it for the original
3570                    i2src while its original mode is temporarily
3571                    restored, and then clear i2scratch so that we don't
3572                    do it again later.  */
3573                 propagate_for_debug (i2, i3, reg, i2src, false);
3574                 i2scratch = false;
3575                 /* Put back the new mode.  */
3576                 adjust_reg_mode (reg, new_mode);
3577               }
3578             else
3579               {
3580                 rtx tempreg = gen_raw_REG (old_mode, REGNO (reg));
3581                 rtx first, last;
3582
3583                 if (reg == i2dest)
3584                   {
3585                     first = i2;
3586                     last = i3;
3587                   }
3588                 else
3589                   {
3590                     first = i3;
3591                     last = undobuf.other_insn;
3592                     gcc_assert (last);
3593                   }
3594
3595                 /* We're dealing with a reg that changed mode but not
3596                    meaning, so we want to turn it into a subreg for
3597                    the new mode.  However, because of REG sharing and
3598                    because its mode had already changed, we have to do
3599                    it in two steps.  First, replace any debug uses of
3600                    reg, with its original mode temporarily restored,
3601                    with this copy we have created; then, replace the
3602                    copy with the SUBREG of the original shared reg,
3603                    once again changed to the new mode.  */
3604                 propagate_for_debug (first, last, reg, tempreg, false);
3605                 adjust_reg_mode (reg, new_mode);
3606                 propagate_for_debug (first, last, tempreg,
3607                                      lowpart_subreg (old_mode, reg, new_mode),
3608                                      false);
3609               }
3610           }
3611     }
3612
3613   /* If we will be able to accept this, we have made a
3614      change to the destination of I3.  This requires us to
3615      do a few adjustments.  */
3616
3617   if (changed_i3_dest)
3618     {
3619       PATTERN (i3) = newpat;
3620       adjust_for_new_dest (i3);
3621     }
3622
3623   /* We now know that we can do this combination.  Merge the insns and
3624      update the status of registers and LOG_LINKS.  */
3625
3626   if (undobuf.other_insn)
3627     {
3628       rtx note, next;
3629
3630       PATTERN (undobuf.other_insn) = other_pat;
3631
3632       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
3633          are still valid.  Then add any non-duplicate notes added by
3634          recog_for_combine.  */
3635       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
3636         {
3637           next = XEXP (note, 1);
3638
3639           if (REG_NOTE_KIND (note) == REG_UNUSED
3640               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
3641             remove_note (undobuf.other_insn, note);
3642         }
3643
3644       distribute_notes (new_other_notes, undobuf.other_insn,
3645                         undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
3646     }
3647
3648   if (swap_i2i3)
3649     {
3650       rtx insn;
3651       rtx link;
3652       rtx ni2dest;
3653
3654       /* I3 now uses what used to be its destination and which is now
3655          I2's destination.  This requires us to do a few adjustments.  */
3656       PATTERN (i3) = newpat;
3657       adjust_for_new_dest (i3);
3658
3659       /* We need a LOG_LINK from I3 to I2.  But we used to have one,
3660          so we still will.
3661
3662          However, some later insn might be using I2's dest and have
3663          a LOG_LINK pointing at I3.  We must remove this link.
3664          The simplest way to remove the link is to point it at I1,
3665          which we know will be a NOTE.  */
3666
3667       /* newi2pat is usually a SET here; however, recog_for_combine might
3668          have added some clobbers.  */
3669       if (GET_CODE (newi2pat) == PARALLEL)
3670         ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
3671       else
3672         ni2dest = SET_DEST (newi2pat);
3673
3674       for (insn = NEXT_INSN (i3);
3675            insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
3676                     || insn != BB_HEAD (this_basic_block->next_bb));
3677            insn = NEXT_INSN (insn))
3678         {
3679           if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
3680             {
3681               for (link = LOG_LINKS (insn); link;
3682                    link = XEXP (link, 1))
3683                 if (XEXP (link, 0) == i3)
3684                   XEXP (link, 0) = i1;
3685
3686               break;
3687             }
3688         }
3689     }
3690
3691   {
3692     rtx i3notes, i2notes, i1notes = 0;
3693     rtx i3links, i2links, i1links = 0;
3694     rtx midnotes = 0;
3695     unsigned int regno;
3696     /* Compute which registers we expect to eliminate.  newi2pat may be setting
3697        either i3dest or i2dest, so we must check it.  Also, i1dest may be the
3698        same as i3dest, in which case newi2pat may be setting i1dest.  */
3699     rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
3700                    || i2dest_in_i2src || i2dest_in_i1src
3701                    || !i2dest_killed
3702                    ? 0 : i2dest);
3703     rtx elim_i1 = (i1 == 0 || i1dest_in_i1src
3704                    || (newi2pat && reg_set_p (i1dest, newi2pat))
3705                    || !i1dest_killed
3706                    ? 0 : i1dest);
3707
3708     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
3709        clear them.  */
3710     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
3711     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
3712     if (i1)
3713       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
3714
3715     /* Ensure that we do not have something that should not be shared but
3716        occurs multiple times in the new insns.  Check this by first
3717        resetting all the `used' flags and then copying anything is shared.  */
3718
3719     reset_used_flags (i3notes);
3720     reset_used_flags (i2notes);
3721     reset_used_flags (i1notes);
3722     reset_used_flags (newpat);
3723     reset_used_flags (newi2pat);
3724     if (undobuf.other_insn)
3725       reset_used_flags (PATTERN (undobuf.other_insn));
3726
3727     i3notes = copy_rtx_if_shared (i3notes);
3728     i2notes = copy_rtx_if_shared (i2notes);
3729     i1notes = copy_rtx_if_shared (i1notes);
3730     newpat = copy_rtx_if_shared (newpat);
3731     newi2pat = copy_rtx_if_shared (newi2pat);
3732     if (undobuf.other_insn)
3733       reset_used_flags (PATTERN (undobuf.other_insn));
3734
3735     INSN_CODE (i3) = insn_code_number;
3736     PATTERN (i3) = newpat;
3737
3738     if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
3739       {
3740         rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
3741
3742         reset_used_flags (call_usage);
3743         call_usage = copy_rtx (call_usage);
3744
3745         if (substed_i2)
3746           {
3747             /* I2SRC must still be meaningful at this point.  Some splitting
3748                operations can invalidate I2SRC, but those operations do not
3749                apply to calls.  */
3750             gcc_assert (i2src);
3751             replace_rtx (call_usage, i2dest, i2src);
3752           }
3753
3754         if (substed_i1)
3755           replace_rtx (call_usage, i1dest, i1src);
3756
3757         CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
3758       }
3759
3760     if (undobuf.other_insn)
3761       INSN_CODE (undobuf.other_insn) = other_code_number;
3762
3763     /* We had one special case above where I2 had more than one set and
3764        we replaced a destination of one of those sets with the destination
3765        of I3.  In that case, we have to update LOG_LINKS of insns later
3766        in this basic block.  Note that this (expensive) case is rare.
3767
3768        Also, in this case, we must pretend that all REG_NOTEs for I2
3769        actually came from I3, so that REG_UNUSED notes from I2 will be
3770        properly handled.  */
3771
3772     if (i3_subst_into_i2)
3773       {
3774         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
3775           if ((GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == SET
3776                || GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == CLOBBER)
3777               && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
3778               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
3779               && ! find_reg_note (i2, REG_UNUSED,
3780                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
3781             for (temp = NEXT_INSN (i2);
3782                  temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
3783                           || BB_HEAD (this_basic_block) != temp);
3784                  temp = NEXT_INSN (temp))
3785               if (temp != i3 && INSN_P (temp))
3786                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
3787                   if (XEXP (link, 0) == i2)
3788                     XEXP (link, 0) = i3;
3789
3790         if (i3notes)
3791           {
3792             rtx link = i3notes;
3793             while (XEXP (link, 1))
3794               link = XEXP (link, 1);
3795             XEXP (link, 1) = i2notes;
3796           }
3797         else
3798           i3notes = i2notes;
3799         i2notes = 0;
3800       }
3801
3802     LOG_LINKS (i3) = 0;
3803     REG_NOTES (i3) = 0;
3804     LOG_LINKS (i2) = 0;
3805     REG_NOTES (i2) = 0;
3806
3807     if (newi2pat)
3808       {
3809         if (MAY_HAVE_DEBUG_INSNS && i2scratch)
3810           propagate_for_debug (i2, i3, i2dest, i2src, false);
3811         INSN_CODE (i2) = i2_code_number;
3812         PATTERN (i2) = newi2pat;
3813       }
3814     else
3815       {
3816         if (MAY_HAVE_DEBUG_INSNS && i2src)
3817           propagate_for_debug (i2, i3, i2dest, i2src, i3_subst_into_i2);
3818         SET_INSN_DELETED (i2);
3819       }
3820
3821     if (i1)
3822       {
3823         LOG_LINKS (i1) = 0;
3824         REG_NOTES (i1) = 0;
3825         if (MAY_HAVE_DEBUG_INSNS)
3826           propagate_for_debug (i1, i3, i1dest, i1src, false);
3827         SET_INSN_DELETED (i1);
3828       }
3829
3830     /* Get death notes for everything that is now used in either I3 or
3831        I2 and used to die in a previous insn.  If we built two new
3832        patterns, move from I1 to I2 then I2 to I3 so that we get the
3833        proper movement on registers that I2 modifies.  */
3834
3835     if (newi2pat)
3836       {
3837         move_deaths (newi2pat, NULL_RTX, DF_INSN_LUID (i1), i2, &midnotes);
3838         move_deaths (newpat, newi2pat, DF_INSN_LUID (i1), i3, &midnotes);
3839       }
3840     else
3841       move_deaths (newpat, NULL_RTX, i1 ? DF_INSN_LUID (i1) : DF_INSN_LUID (i2),
3842                    i3, &midnotes);
3843
3844     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
3845     if (i3notes)
3846       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
3847                         elim_i2, elim_i1);
3848     if (i2notes)
3849       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
3850                         elim_i2, elim_i1);
3851     if (i1notes)
3852       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
3853                         elim_i2, elim_i1);
3854     if (midnotes)
3855       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3856                         elim_i2, elim_i1);
3857
3858     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
3859        know these are REG_UNUSED and want them to go to the desired insn,
3860        so we always pass it as i3.  */
3861
3862     if (newi2pat && new_i2_notes)
3863       distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3864
3865     if (new_i3_notes)
3866       distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
3867
3868     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
3869        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
3870        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
3871        in that case, it might delete I2.  Similarly for I2 and I1.
3872        Show an additional death due to the REG_DEAD note we make here.  If
3873        we discard it in distribute_notes, we will decrement it again.  */
3874
3875     if (i3dest_killed)
3876       {
3877         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
3878           distribute_notes (alloc_reg_note (REG_DEAD, i3dest_killed,
3879                                             NULL_RTX),
3880                             NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1);
3881         else
3882           distribute_notes (alloc_reg_note (REG_DEAD, i3dest_killed,
3883                                             NULL_RTX),
3884                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3885                             elim_i2, elim_i1);
3886       }
3887
3888     if (i2dest_in_i2src)
3889       {
3890         if (newi2pat && reg_set_p (i2dest, newi2pat))
3891           distribute_notes (alloc_reg_note (REG_DEAD, i2dest, NULL_RTX),
3892                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3893         else
3894           distribute_notes (alloc_reg_note (REG_DEAD, i2dest, NULL_RTX),
3895                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3896                             NULL_RTX, NULL_RTX);
3897       }
3898
3899     if (i1dest_in_i1src)
3900       {
3901         if (newi2pat && reg_set_p (i1dest, newi2pat))
3902           distribute_notes (alloc_reg_note (REG_DEAD, i1dest, NULL_RTX),
3903                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3904         else
3905           distribute_notes (alloc_reg_note (REG_DEAD, i1dest, NULL_RTX),
3906                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3907                             NULL_RTX, NULL_RTX);
3908       }
3909
3910     distribute_links (i3links);
3911     distribute_links (i2links);
3912     distribute_links (i1links);
3913
3914     if (REG_P (i2dest))
3915       {
3916         rtx link;
3917         rtx i2_insn = 0, i2_val = 0, set;
3918
3919         /* The insn that used to set this register doesn't exist, and
3920            this life of the register may not exist either.  See if one of
3921            I3's links points to an insn that sets I2DEST.  If it does,
3922            that is now the last known value for I2DEST. If we don't update
3923            this and I2 set the register to a value that depended on its old
3924            contents, we will get confused.  If this insn is used, thing
3925            will be set correctly in combine_instructions.  */
3926
3927         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3928           if ((set = single_set (XEXP (link, 0))) != 0
3929               && rtx_equal_p (i2dest, SET_DEST (set)))
3930             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
3931
3932         record_value_for_reg (i2dest, i2_insn, i2_val);
3933
3934         /* If the reg formerly set in I2 died only once and that was in I3,
3935            zero its use count so it won't make `reload' do any work.  */
3936         if (! added_sets_2
3937             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
3938             && ! i2dest_in_i2src)
3939           {
3940             regno = REGNO (i2dest);
3941             INC_REG_N_SETS (regno, -1);
3942           }
3943       }
3944
3945     if (i1 && REG_P (i1dest))
3946       {
3947         rtx link;
3948         rtx i1_insn = 0, i1_val = 0, set;
3949
3950         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3951           if ((set = single_set (XEXP (link, 0))) != 0
3952               && rtx_equal_p (i1dest, SET_DEST (set)))
3953             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
3954
3955         record_value_for_reg (i1dest, i1_insn, i1_val);
3956
3957         regno = REGNO (i1dest);
3958         if (! added_sets_1 && ! i1dest_in_i1src)
3959           INC_REG_N_SETS (regno, -1);
3960       }
3961
3962     /* Update reg_stat[].nonzero_bits et al for any changes that may have
3963        been made to this insn.  The order of
3964        set_nonzero_bits_and_sign_copies() is important.  Because newi2pat
3965        can affect nonzero_bits of newpat */
3966     if (newi2pat)
3967       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
3968     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
3969   }
3970
3971   if (undobuf.other_insn != NULL_RTX)
3972     {
3973       if (dump_file)
3974         {
3975           fprintf (dump_file, "modifying other_insn ");
3976           dump_insn_slim (dump_file, undobuf.other_insn);
3977         }
3978       df_insn_rescan (undobuf.other_insn);
3979     }
3980
3981   if (i1 && !(NOTE_P(i1) && (NOTE_KIND (i1) == NOTE_INSN_DELETED)))
3982     {
3983       if (dump_file)
3984         {
3985           fprintf (dump_file, "modifying insn i1 ");
3986           dump_insn_slim (dump_file, i1);
3987         }
3988       df_insn_rescan (i1);
3989     }
3990
3991   if (i2 && !(NOTE_P(i2) && (NOTE_KIND (i2) == NOTE_INSN_DELETED)))
3992     {
3993       if (dump_file)
3994         {
3995           fprintf (dump_file, "modifying insn i2 ");
3996           dump_insn_slim (dump_file, i2);
3997         }
3998       df_insn_rescan (i2);
3999     }
4000
4001   if (i3 && !(NOTE_P(i3) && (NOTE_KIND (i3) == NOTE_INSN_DELETED)))
4002     {
4003       if (dump_file)
4004         {
4005           fprintf (dump_file, "modifying insn i3 ");
4006           dump_insn_slim (dump_file, i3);
4007         }
4008       df_insn_rescan (i3);
4009     }
4010
4011   /* Set new_direct_jump_p if a new return or simple jump instruction
4012      has been created.  Adjust the CFG accordingly.  */
4013
4014   if (returnjump_p (i3) || any_uncondjump_p (i3))
4015     {
4016       *new_direct_jump_p = 1;
4017       mark_jump_label (PATTERN (i3), i3, 0);
4018       update_cfg_for_uncondjump (i3);
4019     }
4020
4021   if (undobuf.other_insn != NULL_RTX
4022       && (returnjump_p (undobuf.other_insn)
4023           || any_uncondjump_p (undobuf.other_insn)))
4024     {
4025       *new_direct_jump_p = 1;
4026       update_cfg_for_uncondjump (undobuf.other_insn);
4027     }
4028
4029   /* A noop might also need cleaning up of CFG, if it comes from the
4030      simplification of a jump.  */
4031   if (GET_CODE (newpat) == SET
4032       && SET_SRC (newpat) == pc_rtx
4033       && SET_DEST (newpat) == pc_rtx)
4034     {
4035       *new_direct_jump_p = 1;
4036       update_cfg_for_uncondjump (i3);
4037     }
4038
4039   combine_successes++;
4040   undo_commit ();
4041
4042   if (added_links_insn
4043       && (newi2pat == 0 || DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i2))
4044       && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i3))
4045     return added_links_insn;
4046   else
4047     return newi2pat ? i2 : i3;
4048 }
4049 \f
4050 /* Undo all the modifications recorded in undobuf.  */
4051
4052 static void
4053 undo_all (void)
4054 {
4055   struct undo *undo, *next;
4056
4057   for (undo = undobuf.undos; undo; undo = next)
4058     {
4059       next = undo->next;
4060       switch (undo->kind)
4061         {
4062         case UNDO_RTX:
4063           *undo->where.r = undo->old_contents.r;
4064           break;
4065         case UNDO_INT:
4066           *undo->where.i = undo->old_contents.i;
4067           break;
4068         case UNDO_MODE:
4069           adjust_reg_mode (*undo->where.r, undo->old_contents.m);
4070           break;
4071         default:
4072           gcc_unreachable ();
4073         }
4074
4075       undo->next = undobuf.frees;
4076       undobuf.frees = undo;
4077     }
4078
4079   undobuf.undos = 0;
4080 }
4081
4082 /* We've committed to accepting the changes we made.  Move all
4083    of the undos to the free list.  */
4084
4085 static void
4086 undo_commit (void)
4087 {
4088   struct undo *undo, *next;
4089
4090   for (undo = undobuf.undos; undo; undo = next)
4091     {
4092       next = undo->next;
4093       undo->next = undobuf.frees;
4094       undobuf.frees = undo;
4095     }
4096   undobuf.undos = 0;
4097 }
4098 \f
4099 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
4100    where we have an arithmetic expression and return that point.  LOC will
4101    be inside INSN.
4102
4103    try_combine will call this function to see if an insn can be split into
4104    two insns.  */
4105
4106 static rtx *
4107 find_split_point (rtx *loc, rtx insn, bool set_src)
4108 {
4109   rtx x = *loc;
4110   enum rtx_code code = GET_CODE (x);
4111   rtx *split;
4112   unsigned HOST_WIDE_INT len = 0;
4113   HOST_WIDE_INT pos = 0;
4114   int unsignedp = 0;
4115   rtx inner = NULL_RTX;
4116
4117   /* First special-case some codes.  */
4118   switch (code)
4119     {
4120     case SUBREG:
4121 #ifdef INSN_SCHEDULING
4122       /* If we are making a paradoxical SUBREG invalid, it becomes a split
4123          point.  */
4124       if (MEM_P (SUBREG_REG (x)))
4125         return loc;
4126 #endif
4127       return find_split_point (&SUBREG_REG (x), insn, false);
4128
4129     case MEM:
4130 #ifdef HAVE_lo_sum
4131       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
4132          using LO_SUM and HIGH.  */
4133       if (GET_CODE (XEXP (x, 0)) == CONST
4134           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
4135         {
4136           enum machine_mode address_mode
4137             = targetm.addr_space.address_mode (MEM_ADDR_SPACE (x));
4138
4139           SUBST (XEXP (x, 0),
4140                  gen_rtx_LO_SUM (address_mode,
4141                                  gen_rtx_HIGH (address_mode, XEXP (x, 0)),
4142                                  XEXP (x, 0)));
4143           return &XEXP (XEXP (x, 0), 0);
4144         }
4145 #endif
4146
4147       /* If we have a PLUS whose second operand is a constant and the
4148          address is not valid, perhaps will can split it up using
4149          the machine-specific way to split large constants.  We use
4150          the first pseudo-reg (one of the virtual regs) as a placeholder;
4151          it will not remain in the result.  */
4152       if (GET_CODE (XEXP (x, 0)) == PLUS
4153           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
4154           && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4155                                             MEM_ADDR_SPACE (x)))
4156         {
4157           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
4158           rtx seq = combine_split_insns (gen_rtx_SET (VOIDmode, reg,
4159                                                       XEXP (x, 0)),
4160                                          subst_insn);
4161
4162           /* This should have produced two insns, each of which sets our
4163              placeholder.  If the source of the second is a valid address,
4164              we can make put both sources together and make a split point
4165              in the middle.  */
4166
4167           if (seq
4168               && NEXT_INSN (seq) != NULL_RTX
4169               && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
4170               && NONJUMP_INSN_P (seq)
4171               && GET_CODE (PATTERN (seq)) == SET
4172               && SET_DEST (PATTERN (seq)) == reg
4173               && ! reg_mentioned_p (reg,
4174                                     SET_SRC (PATTERN (seq)))
4175               && NONJUMP_INSN_P (NEXT_INSN (seq))
4176               && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
4177               && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
4178               && memory_address_addr_space_p
4179                    (GET_MODE (x), SET_SRC (PATTERN (NEXT_INSN (seq))),
4180                     MEM_ADDR_SPACE (x)))
4181             {
4182               rtx src1 = SET_SRC (PATTERN (seq));
4183               rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
4184
4185               /* Replace the placeholder in SRC2 with SRC1.  If we can
4186                  find where in SRC2 it was placed, that can become our
4187                  split point and we can replace this address with SRC2.
4188                  Just try two obvious places.  */
4189
4190               src2 = replace_rtx (src2, reg, src1);
4191               split = 0;
4192               if (XEXP (src2, 0) == src1)
4193                 split = &XEXP (src2, 0);
4194               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
4195                        && XEXP (XEXP (src2, 0), 0) == src1)
4196                 split = &XEXP (XEXP (src2, 0), 0);
4197
4198               if (split)
4199                 {
4200                   SUBST (XEXP (x, 0), src2);
4201                   return split;
4202                 }
4203             }
4204
4205           /* If that didn't work, perhaps the first operand is complex and
4206              needs to be computed separately, so make a split point there.
4207              This will occur on machines that just support REG + CONST
4208              and have a constant moved through some previous computation.  */
4209
4210           else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
4211                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4212                          && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4213             return &XEXP (XEXP (x, 0), 0);
4214         }
4215
4216       /* If we have a PLUS whose first operand is complex, try computing it
4217          separately by making a split there.  */
4218       if (GET_CODE (XEXP (x, 0)) == PLUS
4219           && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4220                                             MEM_ADDR_SPACE (x))
4221           && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
4222           && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4223                 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4224         return &XEXP (XEXP (x, 0), 0);
4225       break;
4226
4227     case SET:
4228 #ifdef HAVE_cc0
4229       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
4230          ZERO_EXTRACT, the most likely reason why this doesn't match is that
4231          we need to put the operand into a register.  So split at that
4232          point.  */
4233
4234       if (SET_DEST (x) == cc0_rtx
4235           && GET_CODE (SET_SRC (x)) != COMPARE
4236           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
4237           && !OBJECT_P (SET_SRC (x))
4238           && ! (GET_CODE (SET_SRC (x)) == SUBREG
4239                 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
4240         return &SET_SRC (x);
4241 #endif
4242
4243       /* See if we can split SET_SRC as it stands.  */
4244       split = find_split_point (&SET_SRC (x), insn, true);
4245       if (split && split != &SET_SRC (x))
4246         return split;
4247
4248       /* See if we can split SET_DEST as it stands.  */
4249       split = find_split_point (&SET_DEST (x), insn, false);
4250       if (split && split != &SET_DEST (x))
4251         return split;
4252
4253       /* See if this is a bitfield assignment with everything constant.  If
4254          so, this is an IOR of an AND, so split it into that.  */
4255       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
4256           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
4257               <= HOST_BITS_PER_WIDE_INT)
4258           && CONST_INT_P (XEXP (SET_DEST (x), 1))
4259           && CONST_INT_P (XEXP (SET_DEST (x), 2))
4260           && CONST_INT_P (SET_SRC (x))
4261           && ((INTVAL (XEXP (SET_DEST (x), 1))
4262                + INTVAL (XEXP (SET_DEST (x), 2)))
4263               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
4264           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
4265         {
4266           HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
4267           unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
4268           unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
4269           rtx dest = XEXP (SET_DEST (x), 0);
4270           enum machine_mode mode = GET_MODE (dest);
4271           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
4272           rtx or_mask;
4273
4274           if (BITS_BIG_ENDIAN)
4275             pos = GET_MODE_BITSIZE (mode) - len - pos;
4276
4277           or_mask = gen_int_mode (src << pos, mode);
4278           if (src == mask)
4279             SUBST (SET_SRC (x),
4280                    simplify_gen_binary (IOR, mode, dest, or_mask));
4281           else
4282             {
4283               rtx negmask = gen_int_mode (~(mask << pos), mode);
4284               SUBST (SET_SRC (x),
4285                      simplify_gen_binary (IOR, mode,
4286                                           simplify_gen_binary (AND, mode,
4287                                                                dest, negmask),
4288                                           or_mask));
4289             }
4290
4291           SUBST (SET_DEST (x), dest);
4292
4293           split = find_split_point (&SET_SRC (x), insn, true);
4294           if (split && split != &SET_SRC (x))
4295             return split;
4296         }
4297
4298       /* Otherwise, see if this is an operation that we can split into two.
4299          If so, try to split that.  */
4300       code = GET_CODE (SET_SRC (x));
4301
4302       switch (code)
4303         {
4304         case AND:
4305           /* If we are AND'ing with a large constant that is only a single
4306              bit and the result is only being used in a context where we
4307              need to know if it is zero or nonzero, replace it with a bit
4308              extraction.  This will avoid the large constant, which might
4309              have taken more than one insn to make.  If the constant were
4310              not a valid argument to the AND but took only one insn to make,
4311              this is no worse, but if it took more than one insn, it will
4312              be better.  */
4313
4314           if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4315               && REG_P (XEXP (SET_SRC (x), 0))
4316               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
4317               && REG_P (SET_DEST (x))
4318               && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
4319               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
4320               && XEXP (*split, 0) == SET_DEST (x)
4321               && XEXP (*split, 1) == const0_rtx)
4322             {
4323               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
4324                                                 XEXP (SET_SRC (x), 0),
4325                                                 pos, NULL_RTX, 1, 1, 0, 0);
4326               if (extraction != 0)
4327                 {
4328                   SUBST (SET_SRC (x), extraction);
4329                   return find_split_point (loc, insn, false);
4330                 }
4331             }
4332           break;
4333
4334         case NE:
4335           /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
4336              is known to be on, this can be converted into a NEG of a shift.  */
4337           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
4338               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
4339               && 1 <= (pos = exact_log2
4340                        (nonzero_bits (XEXP (SET_SRC (x), 0),
4341                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
4342             {
4343               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
4344
4345               SUBST (SET_SRC (x),
4346                      gen_rtx_NEG (mode,
4347                                   gen_rtx_LSHIFTRT (mode,
4348                                                     XEXP (SET_SRC (x), 0),
4349                                                     GEN_INT (pos))));
4350
4351               split = find_split_point (&SET_SRC (x), insn, true);
4352               if (split && split != &SET_SRC (x))
4353                 return split;
4354             }
4355           break;
4356
4357         case SIGN_EXTEND:
4358           inner = XEXP (SET_SRC (x), 0);
4359
4360           /* We can't optimize if either mode is a partial integer
4361              mode as we don't know how many bits are significant
4362              in those modes.  */
4363           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
4364               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
4365             break;
4366
4367           pos = 0;
4368           len = GET_MODE_BITSIZE (GET_MODE (inner));
4369           unsignedp = 0;
4370           break;
4371
4372         case SIGN_EXTRACT:
4373         case ZERO_EXTRACT:
4374           if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4375               && CONST_INT_P (XEXP (SET_SRC (x), 2)))
4376             {
4377               inner = XEXP (SET_SRC (x), 0);
4378               len = INTVAL (XEXP (SET_SRC (x), 1));
4379               pos = INTVAL (XEXP (SET_SRC (x), 2));
4380
4381               if (BITS_BIG_ENDIAN)
4382                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
4383               unsignedp = (code == ZERO_EXTRACT);
4384             }
4385           break;
4386
4387         default:
4388           break;
4389         }
4390
4391       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
4392         {
4393           enum machine_mode mode = GET_MODE (SET_SRC (x));
4394
4395           /* For unsigned, we have a choice of a shift followed by an
4396              AND or two shifts.  Use two shifts for field sizes where the
4397              constant might be too large.  We assume here that we can
4398              always at least get 8-bit constants in an AND insn, which is
4399              true for every current RISC.  */
4400
4401           if (unsignedp && len <= 8)
4402             {
4403               SUBST (SET_SRC (x),
4404                      gen_rtx_AND (mode,
4405                                   gen_rtx_LSHIFTRT
4406                                   (mode, gen_lowpart (mode, inner),
4407                                    GEN_INT (pos)),
4408                                   GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
4409
4410               split = find_split_point (&SET_SRC (x), insn, true);
4411               if (split && split != &SET_SRC (x))
4412                 return split;
4413             }
4414           else
4415             {
4416               SUBST (SET_SRC (x),
4417                      gen_rtx_fmt_ee
4418                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
4419                       gen_rtx_ASHIFT (mode,
4420                                       gen_lowpart (mode, inner),
4421                                       GEN_INT (GET_MODE_BITSIZE (mode)
4422                                                - len - pos)),
4423                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
4424
4425               split = find_split_point (&SET_SRC (x), insn, true);
4426               if (split && split != &SET_SRC (x))
4427                 return split;
4428             }
4429         }
4430
4431       /* See if this is a simple operation with a constant as the second
4432          operand.  It might be that this constant is out of range and hence
4433          could be used as a split point.  */
4434       if (BINARY_P (SET_SRC (x))
4435           && CONSTANT_P (XEXP (SET_SRC (x), 1))
4436           && (OBJECT_P (XEXP (SET_SRC (x), 0))
4437               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
4438                   && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
4439         return &XEXP (SET_SRC (x), 1);
4440
4441       /* Finally, see if this is a simple operation with its first operand
4442          not in a register.  The operation might require this operand in a
4443          register, so return it as a split point.  We can always do this
4444          because if the first operand were another operation, we would have
4445          already found it as a split point.  */
4446       if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
4447           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
4448         return &XEXP (SET_SRC (x), 0);
4449
4450       return 0;
4451
4452     case AND:
4453     case IOR:
4454       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
4455          it is better to write this as (not (ior A B)) so we can split it.
4456          Similarly for IOR.  */
4457       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
4458         {
4459           SUBST (*loc,
4460                  gen_rtx_NOT (GET_MODE (x),
4461                               gen_rtx_fmt_ee (code == IOR ? AND : IOR,
4462                                               GET_MODE (x),
4463                                               XEXP (XEXP (x, 0), 0),
4464                                               XEXP (XEXP (x, 1), 0))));
4465           return find_split_point (loc, insn, set_src);
4466         }
4467
4468       /* Many RISC machines have a large set of logical insns.  If the
4469          second operand is a NOT, put it first so we will try to split the
4470          other operand first.  */
4471       if (GET_CODE (XEXP (x, 1)) == NOT)
4472         {
4473           rtx tem = XEXP (x, 0);
4474           SUBST (XEXP (x, 0), XEXP (x, 1));
4475           SUBST (XEXP (x, 1), tem);
4476         }
4477       break;
4478
4479     case PLUS:
4480     case MINUS:
4481       /* Split at a multiply-accumulate instruction.  However if this is
4482          the SET_SRC, we likely do not have such an instruction and it's
4483          worthless to try this split.  */
4484       if (!set_src && GET_CODE (XEXP (x, 0)) == MULT)
4485         return loc;
4486
4487     default:
4488       break;
4489     }
4490
4491   /* Otherwise, select our actions depending on our rtx class.  */
4492   switch (GET_RTX_CLASS (code))
4493     {
4494     case RTX_BITFIELD_OPS:              /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
4495     case RTX_TERNARY:
4496       split = find_split_point (&XEXP (x, 2), insn, false);
4497       if (split)
4498         return split;
4499       /* ... fall through ...  */
4500     case RTX_BIN_ARITH:
4501     case RTX_COMM_ARITH:
4502     case RTX_COMPARE:
4503     case RTX_COMM_COMPARE:
4504       split = find_split_point (&XEXP (x, 1), insn, false);
4505       if (split)
4506         return split;
4507       /* ... fall through ...  */
4508     case RTX_UNARY:
4509       /* Some machines have (and (shift ...) ...) insns.  If X is not
4510          an AND, but XEXP (X, 0) is, use it as our split point.  */
4511       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
4512         return &XEXP (x, 0);
4513
4514       split = find_split_point (&XEXP (x, 0), insn, false);
4515       if (split)
4516         return split;
4517       return loc;
4518
4519     default:
4520       /* Otherwise, we don't have a split point.  */
4521       return 0;
4522     }
4523 }
4524 \f
4525 /* Throughout X, replace FROM with TO, and return the result.
4526    The result is TO if X is FROM;
4527    otherwise the result is X, but its contents may have been modified.
4528    If they were modified, a record was made in undobuf so that
4529    undo_all will (among other things) return X to its original state.
4530
4531    If the number of changes necessary is too much to record to undo,
4532    the excess changes are not made, so the result is invalid.
4533    The changes already made can still be undone.
4534    undobuf.num_undo is incremented for such changes, so by testing that
4535    the caller can tell whether the result is valid.
4536
4537    `n_occurrences' is incremented each time FROM is replaced.
4538
4539    IN_DEST is nonzero if we are processing the SET_DEST of a SET.
4540
4541    UNIQUE_COPY is nonzero if each substitution must be unique.  We do this
4542    by copying if `n_occurrences' is nonzero.  */
4543
4544 static rtx
4545 subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
4546 {
4547   enum rtx_code code = GET_CODE (x);
4548   enum machine_mode op0_mode = VOIDmode;
4549   const char *fmt;
4550   int len, i;
4551   rtx new_rtx;
4552
4553 /* Two expressions are equal if they are identical copies of a shared
4554    RTX or if they are both registers with the same register number
4555    and mode.  */
4556
4557 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
4558   ((X) == (Y)                                           \
4559    || (REG_P (X) && REG_P (Y)   \
4560        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
4561
4562   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
4563     {
4564       n_occurrences++;
4565       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
4566     }
4567
4568   /* If X and FROM are the same register but different modes, they
4569      will not have been seen as equal above.  However, the log links code
4570      will make a LOG_LINKS entry for that case.  If we do nothing, we
4571      will try to rerecognize our original insn and, when it succeeds,
4572      we will delete the feeding insn, which is incorrect.
4573
4574      So force this insn not to match in this (rare) case.  */
4575   if (! in_dest && code == REG && REG_P (from)
4576       && reg_overlap_mentioned_p (x, from))
4577     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
4578
4579   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
4580      of which may contain things that can be combined.  */
4581   if (code != MEM && code != LO_SUM && OBJECT_P (x))
4582     return x;
4583
4584   /* It is possible to have a subexpression appear twice in the insn.
4585      Suppose that FROM is a register that appears within TO.
4586      Then, after that subexpression has been scanned once by `subst',
4587      the second time it is scanned, TO may be found.  If we were
4588      to scan TO here, we would find FROM within it and create a
4589      self-referent rtl structure which is completely wrong.  */
4590   if (COMBINE_RTX_EQUAL_P (x, to))
4591     return to;
4592
4593   /* Parallel asm_operands need special attention because all of the
4594      inputs are shared across the arms.  Furthermore, unsharing the
4595      rtl results in recognition failures.  Failure to handle this case
4596      specially can result in circular rtl.
4597
4598      Solve this by doing a normal pass across the first entry of the
4599      parallel, and only processing the SET_DESTs of the subsequent
4600      entries.  Ug.  */
4601
4602   if (code == PARALLEL
4603       && GET_CODE (XVECEXP (x, 0, 0)) == SET
4604       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
4605     {
4606       new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
4607
4608       /* If this substitution failed, this whole thing fails.  */
4609       if (GET_CODE (new_rtx) == CLOBBER
4610           && XEXP (new_rtx, 0) == const0_rtx)
4611         return new_rtx;
4612
4613       SUBST (XVECEXP (x, 0, 0), new_rtx);
4614
4615       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
4616         {
4617           rtx dest = SET_DEST (XVECEXP (x, 0, i));
4618
4619           if (!REG_P (dest)
4620               && GET_CODE (dest) != CC0
4621               && GET_CODE (dest) != PC)
4622             {
4623               new_rtx = subst (dest, from, to, 0, unique_copy);
4624
4625               /* If this substitution failed, this whole thing fails.  */
4626               if (GET_CODE (new_rtx) == CLOBBER
4627                   && XEXP (new_rtx, 0) == const0_rtx)
4628                 return new_rtx;
4629
4630               SUBST (SET_DEST (XVECEXP (x, 0, i)), new_rtx);
4631             }
4632         }
4633     }
4634   else
4635     {
4636       len = GET_RTX_LENGTH (code);
4637       fmt = GET_RTX_FORMAT (code);
4638
4639       /* We don't need to process a SET_DEST that is a register, CC0,
4640          or PC, so set up to skip this common case.  All other cases
4641          where we want to suppress replacing something inside a
4642          SET_SRC are handled via the IN_DEST operand.  */
4643       if (code == SET
4644           && (REG_P (SET_DEST (x))
4645               || GET_CODE (SET_DEST (x)) == CC0
4646               || GET_CODE (SET_DEST (x)) == PC))
4647         fmt = "ie";
4648
4649       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
4650          constant.  */
4651       if (fmt[0] == 'e')
4652         op0_mode = GET_MODE (XEXP (x, 0));
4653
4654       for (i = 0; i < len; i++)
4655         {
4656           if (fmt[i] == 'E')
4657             {
4658               int j;
4659               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
4660                 {
4661                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
4662                     {
4663                       new_rtx = (unique_copy && n_occurrences
4664                              ? copy_rtx (to) : to);
4665                       n_occurrences++;
4666                     }
4667                   else
4668                     {
4669                       new_rtx = subst (XVECEXP (x, i, j), from, to, 0,
4670                                    unique_copy);
4671
4672                       /* If this substitution failed, this whole thing
4673                          fails.  */
4674                       if (GET_CODE (new_rtx) == CLOBBER
4675                           && XEXP (new_rtx, 0) == const0_rtx)
4676                         return new_rtx;
4677                     }
4678
4679                   SUBST (XVECEXP (x, i, j), new_rtx);
4680                 }
4681             }
4682           else if (fmt[i] == 'e')
4683             {
4684               /* If this is a register being set, ignore it.  */
4685               new_rtx = XEXP (x, i);
4686               if (in_dest
4687                   && i == 0
4688                   && (((code == SUBREG || code == ZERO_EXTRACT)
4689                        && REG_P (new_rtx))
4690                       || code == STRICT_LOW_PART))
4691                 ;
4692
4693               else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
4694                 {
4695                   /* In general, don't install a subreg involving two
4696                      modes not tieable.  It can worsen register
4697                      allocation, and can even make invalid reload
4698                      insns, since the reg inside may need to be copied
4699                      from in the outside mode, and that may be invalid
4700                      if it is an fp reg copied in integer mode.
4701
4702                      We allow two exceptions to this: It is valid if
4703                      it is inside another SUBREG and the mode of that
4704                      SUBREG and the mode of the inside of TO is
4705                      tieable and it is valid if X is a SET that copies
4706                      FROM to CC0.  */
4707
4708                   if (GET_CODE (to) == SUBREG
4709                       && ! MODES_TIEABLE_P (GET_MODE (to),
4710                                             GET_MODE (SUBREG_REG (to)))
4711                       && ! (code == SUBREG
4712                             && MODES_TIEABLE_P (GET_MODE (x),
4713                                                 GET_MODE (SUBREG_REG (to))))
4714 #ifdef HAVE_cc0
4715                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
4716 #endif
4717                       )
4718                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
4719
4720 #ifdef CANNOT_CHANGE_MODE_CLASS
4721                   if (code == SUBREG
4722                       && REG_P (to)
4723                       && REGNO (to) < FIRST_PSEUDO_REGISTER
4724                       && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
4725                                                    GET_MODE (to),
4726                                                    GET_MODE (x)))
4727                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
4728 #endif
4729
4730                   new_rtx = (unique_copy && n_occurrences ? copy_rtx (to) : to);
4731                   n_occurrences++;
4732                 }
4733               else
4734                 /* If we are in a SET_DEST, suppress most cases unless we
4735                    have gone inside a MEM, in which case we want to
4736                    simplify the address.  We assume here that things that
4737                    are actually part of the destination have their inner
4738                    parts in the first expression.  This is true for SUBREG,
4739                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
4740                    things aside from REG and MEM that should appear in a
4741                    SET_DEST.  */
4742                 new_rtx = subst (XEXP (x, i), from, to,
4743                              (((in_dest
4744                                 && (code == SUBREG || code == STRICT_LOW_PART
4745                                     || code == ZERO_EXTRACT))
4746                                || code == SET)
4747                               && i == 0), unique_copy);
4748
4749               /* If we found that we will have to reject this combination,
4750                  indicate that by returning the CLOBBER ourselves, rather than
4751                  an expression containing it.  This will speed things up as
4752                  well as prevent accidents where two CLOBBERs are considered
4753                  to be equal, thus producing an incorrect simplification.  */
4754
4755               if (GET_CODE (new_rtx) == CLOBBER && XEXP (new_rtx, 0) == const0_rtx)
4756                 return new_rtx;
4757
4758               if (GET_CODE (x) == SUBREG
4759                   && (CONST_INT_P (new_rtx)
4760                       || GET_CODE (new_rtx) == CONST_DOUBLE))
4761                 {
4762                   enum machine_mode mode = GET_MODE (x);
4763
4764                   x = simplify_subreg (GET_MODE (x), new_rtx,
4765                                        GET_MODE (SUBREG_REG (x)),
4766                                        SUBREG_BYTE (x));
4767                   if (! x)
4768                     x = gen_rtx_CLOBBER (mode, const0_rtx);
4769                 }
4770               else if (CONST_INT_P (new_rtx)
4771                        && GET_CODE (x) == ZERO_EXTEND)
4772                 {
4773                   x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
4774                                                 new_rtx, GET_MODE (XEXP (x, 0)));
4775                   gcc_assert (x);
4776                 }
4777               else
4778                 SUBST (XEXP (x, i), new_rtx);
4779             }
4780         }
4781     }
4782
4783   /* Check if we are loading something from the constant pool via float
4784      extension; in this case we would undo compress_float_constant
4785      optimization and degenerate constant load to an immediate value.  */
4786   if (GET_CODE (x) == FLOAT_EXTEND
4787       && MEM_P (XEXP (x, 0))
4788       && MEM_READONLY_P (XEXP (x, 0)))
4789     {
4790       rtx tmp = avoid_constant_pool_reference (x);
4791       if (x != tmp)
4792         return x;
4793     }
4794
4795   /* Try to simplify X.  If the simplification changed the code, it is likely
4796      that further simplification will help, so loop, but limit the number
4797      of repetitions that will be performed.  */
4798
4799   for (i = 0; i < 4; i++)
4800     {
4801       /* If X is sufficiently simple, don't bother trying to do anything
4802          with it.  */
4803       if (code != CONST_INT && code != REG && code != CLOBBER)
4804         x = combine_simplify_rtx (x, op0_mode, in_dest);
4805
4806       if (GET_CODE (x) == code)
4807         break;
4808
4809       code = GET_CODE (x);
4810
4811       /* We no longer know the original mode of operand 0 since we
4812          have changed the form of X)  */
4813       op0_mode = VOIDmode;
4814     }
4815
4816   return x;
4817 }
4818 \f
4819 /* Simplify X, a piece of RTL.  We just operate on the expression at the
4820    outer level; call `subst' to simplify recursively.  Return the new
4821    expression.
4822
4823    OP0_MODE is the original mode of XEXP (x, 0).  IN_DEST is nonzero
4824    if we are inside a SET_DEST.  */
4825
4826 static rtx
4827 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
4828 {
4829   enum rtx_code code = GET_CODE (x);
4830   enum machine_mode mode = GET_MODE (x);
4831   rtx temp;
4832   int i;
4833
4834   /* If this is a commutative operation, put a constant last and a complex
4835      expression first.  We don't need to do this for comparisons here.  */
4836   if (COMMUTATIVE_ARITH_P (x)
4837       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
4838     {
4839       temp = XEXP (x, 0);
4840       SUBST (XEXP (x, 0), XEXP (x, 1));
4841       SUBST (XEXP (x, 1), temp);
4842     }
4843
4844   /* If this is a simple operation applied to an IF_THEN_ELSE, try
4845      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
4846      things.  Check for cases where both arms are testing the same
4847      condition.
4848
4849      Don't do anything if all operands are very simple.  */
4850
4851   if ((BINARY_P (x)
4852        && ((!OBJECT_P (XEXP (x, 0))
4853             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4854                   && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
4855            || (!OBJECT_P (XEXP (x, 1))
4856                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
4857                      && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
4858       || (UNARY_P (x)
4859           && (!OBJECT_P (XEXP (x, 0))
4860                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4861                      && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
4862     {
4863       rtx cond, true_rtx, false_rtx;
4864
4865       cond = if_then_else_cond (x, &true_rtx, &false_rtx);
4866       if (cond != 0
4867           /* If everything is a comparison, what we have is highly unlikely
4868              to be simpler, so don't use it.  */
4869           && ! (COMPARISON_P (x)
4870                 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
4871         {
4872           rtx cop1 = const0_rtx;
4873           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
4874
4875           if (cond_code == NE && COMPARISON_P (cond))
4876             return x;
4877
4878           /* Simplify the alternative arms; this may collapse the true and
4879              false arms to store-flag values.  Be careful to use copy_rtx
4880              here since true_rtx or false_rtx might share RTL with x as a
4881              result of the if_then_else_cond call above.  */
4882           true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0);
4883           false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0);
4884
4885           /* If true_rtx and false_rtx are not general_operands, an if_then_else
4886              is unlikely to be simpler.  */
4887           if (general_operand (true_rtx, VOIDmode)
4888               && general_operand (false_rtx, VOIDmode))
4889             {
4890               enum rtx_code reversed;
4891
4892               /* Restarting if we generate a store-flag expression will cause
4893                  us to loop.  Just drop through in this case.  */
4894
4895               /* If the result values are STORE_FLAG_VALUE and zero, we can
4896                  just make the comparison operation.  */
4897               if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
4898                 x = simplify_gen_relational (cond_code, mode, VOIDmode,
4899                                              cond, cop1);
4900               else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
4901                        && ((reversed = reversed_comparison_code_parts
4902                                         (cond_code, cond, cop1, NULL))
4903                            != UNKNOWN))
4904                 x = simplify_gen_relational (reversed, mode, VOIDmode,
4905                                              cond, cop1);
4906
4907               /* Likewise, we can make the negate of a comparison operation
4908                  if the result values are - STORE_FLAG_VALUE and zero.  */
4909               else if (CONST_INT_P (true_rtx)
4910                        && INTVAL (true_rtx) == - STORE_FLAG_VALUE
4911                        && false_rtx == const0_rtx)
4912                 x = simplify_gen_unary (NEG, mode,
4913                                         simplify_gen_relational (cond_code,
4914                                                                  mode, VOIDmode,
4915                                                                  cond, cop1),
4916                                         mode);
4917               else if (CONST_INT_P (false_rtx)
4918                        && INTVAL (false_rtx) == - STORE_FLAG_VALUE
4919                        && true_rtx == const0_rtx
4920                        && ((reversed = reversed_comparison_code_parts
4921                                         (cond_code, cond, cop1, NULL))
4922                            != UNKNOWN))
4923                 x = simplify_gen_unary (NEG, mode,
4924                                         simplify_gen_relational (reversed,
4925                                                                  mode, VOIDmode,
4926                                                                  cond, cop1),
4927                                         mode);
4928               else
4929                 return gen_rtx_IF_THEN_ELSE (mode,
4930                                              simplify_gen_relational (cond_code,
4931                                                                       mode,
4932                                                                       VOIDmode,
4933                                                                       cond,
4934                                                                       cop1),
4935                                              true_rtx, false_rtx);
4936
4937               code = GET_CODE (x);
4938               op0_mode = VOIDmode;
4939             }
4940         }
4941     }
4942
4943   /* Try to fold this expression in case we have constants that weren't
4944      present before.  */
4945   temp = 0;
4946   switch (GET_RTX_CLASS (code))
4947     {
4948     case RTX_UNARY:
4949       if (op0_mode == VOIDmode)
4950         op0_mode = GET_MODE (XEXP (x, 0));
4951       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
4952       break;
4953     case RTX_COMPARE:
4954     case RTX_COMM_COMPARE:
4955       {
4956         enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
4957         if (cmp_mode == VOIDmode)
4958           {
4959             cmp_mode = GET_MODE (XEXP (x, 1));
4960             if (cmp_mode == VOIDmode)
4961               cmp_mode = op0_mode;
4962           }
4963         temp = simplify_relational_operation (code, mode, cmp_mode,
4964                                               XEXP (x, 0), XEXP (x, 1));
4965       }
4966       break;
4967     case RTX_COMM_ARITH:
4968     case RTX_BIN_ARITH:
4969       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
4970       break;
4971     case RTX_BITFIELD_OPS:
4972     case RTX_TERNARY:
4973       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
4974                                          XEXP (x, 1), XEXP (x, 2));
4975       break;
4976     default:
4977       break;
4978     }
4979
4980   if (temp)
4981     {
4982       x = temp;
4983       code = GET_CODE (temp);
4984       op0_mode = VOIDmode;
4985       mode = GET_MODE (temp);
4986     }
4987
4988   /* First see if we can apply the inverse distributive law.  */
4989   if (code == PLUS || code == MINUS
4990       || code == AND || code == IOR || code == XOR)
4991     {
4992       x = apply_distributive_law (x);
4993       code = GET_CODE (x);
4994       op0_mode = VOIDmode;
4995     }
4996
4997   /* If CODE is an associative operation not otherwise handled, see if we
4998      can associate some operands.  This can win if they are constants or
4999      if they are logically related (i.e. (a & b) & a).  */
5000   if ((code == PLUS || code == MINUS || code == MULT || code == DIV
5001        || code == AND || code == IOR || code == XOR
5002        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
5003       && ((INTEGRAL_MODE_P (mode) && code != DIV)
5004           || (flag_associative_math && FLOAT_MODE_P (mode))))
5005     {
5006       if (GET_CODE (XEXP (x, 0)) == code)
5007         {
5008           rtx other = XEXP (XEXP (x, 0), 0);
5009           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
5010           rtx inner_op1 = XEXP (x, 1);
5011           rtx inner;
5012
5013           /* Make sure we pass the constant operand if any as the second
5014              one if this is a commutative operation.  */
5015           if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
5016             {
5017               rtx tem = inner_op0;
5018               inner_op0 = inner_op1;
5019               inner_op1 = tem;
5020             }
5021           inner = simplify_binary_operation (code == MINUS ? PLUS
5022                                              : code == DIV ? MULT
5023                                              : code,
5024                                              mode, inner_op0, inner_op1);
5025
5026           /* For commutative operations, try the other pair if that one
5027              didn't simplify.  */
5028           if (inner == 0 && COMMUTATIVE_ARITH_P (x))
5029             {
5030               other = XEXP (XEXP (x, 0), 1);
5031               inner = simplify_binary_operation (code, mode,
5032                                                  XEXP (XEXP (x, 0), 0),
5033                                                  XEXP (x, 1));
5034             }
5035
5036           if (inner)
5037             return simplify_gen_binary (code, mode, other, inner);
5038         }
5039     }
5040
5041   /* A little bit of algebraic simplification here.  */
5042   switch (code)
5043     {
5044     case MEM:
5045       /* Ensure that our address has any ASHIFTs converted to MULT in case
5046          address-recognizing predicates are called later.  */
5047       temp = make_compound_operation (XEXP (x, 0), MEM);
5048       SUBST (XEXP (x, 0), temp);
5049       break;
5050
5051     case SUBREG:
5052       if (op0_mode == VOIDmode)
5053         op0_mode = GET_MODE (SUBREG_REG (x));
5054
5055       /* See if this can be moved to simplify_subreg.  */
5056       if (CONSTANT_P (SUBREG_REG (x))
5057           && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
5058              /* Don't call gen_lowpart if the inner mode
5059                 is VOIDmode and we cannot simplify it, as SUBREG without
5060                 inner mode is invalid.  */
5061           && (GET_MODE (SUBREG_REG (x)) != VOIDmode
5062               || gen_lowpart_common (mode, SUBREG_REG (x))))
5063         return gen_lowpart (mode, SUBREG_REG (x));
5064
5065       if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
5066         break;
5067       {
5068         rtx temp;
5069         temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
5070                                 SUBREG_BYTE (x));
5071         if (temp)
5072           return temp;
5073       }
5074
5075       /* Don't change the mode of the MEM if that would change the meaning
5076          of the address.  */
5077       if (MEM_P (SUBREG_REG (x))
5078           && (MEM_VOLATILE_P (SUBREG_REG (x))
5079               || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
5080         return gen_rtx_CLOBBER (mode, const0_rtx);
5081
5082       /* Note that we cannot do any narrowing for non-constants since
5083          we might have been counting on using the fact that some bits were
5084          zero.  We now do this in the SET.  */
5085
5086       break;
5087
5088     case NEG:
5089       temp = expand_compound_operation (XEXP (x, 0));
5090
5091       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
5092          replaced by (lshiftrt X C).  This will convert
5093          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
5094
5095       if (GET_CODE (temp) == ASHIFTRT
5096           && CONST_INT_P (XEXP (temp, 1))
5097           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
5098         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (temp, 0),
5099                                      INTVAL (XEXP (temp, 1)));
5100
5101       /* If X has only a single bit that might be nonzero, say, bit I, convert
5102          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
5103          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
5104          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
5105          or a SUBREG of one since we'd be making the expression more
5106          complex if it was just a register.  */
5107
5108       if (!REG_P (temp)
5109           && ! (GET_CODE (temp) == SUBREG
5110                 && REG_P (SUBREG_REG (temp)))
5111           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
5112         {
5113           rtx temp1 = simplify_shift_const
5114             (NULL_RTX, ASHIFTRT, mode,
5115              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
5116                                    GET_MODE_BITSIZE (mode) - 1 - i),
5117              GET_MODE_BITSIZE (mode) - 1 - i);
5118
5119           /* If all we did was surround TEMP with the two shifts, we
5120              haven't improved anything, so don't use it.  Otherwise,
5121              we are better off with TEMP1.  */
5122           if (GET_CODE (temp1) != ASHIFTRT
5123               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
5124               || XEXP (XEXP (temp1, 0), 0) != temp)
5125             return temp1;
5126         }
5127       break;
5128
5129     case TRUNCATE:
5130       /* We can't handle truncation to a partial integer mode here
5131          because we don't know the real bitsize of the partial
5132          integer mode.  */
5133       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
5134         break;
5135
5136       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5137         SUBST (XEXP (x, 0),
5138                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
5139                               GET_MODE_MASK (mode), 0));
5140
5141       /* We can truncate a constant value and return it.  */
5142       if (CONST_INT_P (XEXP (x, 0)))
5143         return gen_int_mode (INTVAL (XEXP (x, 0)), mode);
5144
5145       /* Similarly to what we do in simplify-rtx.c, a truncate of a register
5146          whose value is a comparison can be replaced with a subreg if
5147          STORE_FLAG_VALUE permits.  */
5148       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5149           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
5150           && (temp = get_last_value (XEXP (x, 0)))
5151           && COMPARISON_P (temp))
5152         return gen_lowpart (mode, XEXP (x, 0));
5153       break;
5154
5155     case CONST:
5156       /* (const (const X)) can become (const X).  Do it this way rather than
5157          returning the inner CONST since CONST can be shared with a
5158          REG_EQUAL note.  */
5159       if (GET_CODE (XEXP (x, 0)) == CONST)
5160         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
5161       break;
5162
5163 #ifdef HAVE_lo_sum
5164     case LO_SUM:
5165       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
5166          can add in an offset.  find_split_point will split this address up
5167          again if it doesn't match.  */
5168       if (GET_CODE (XEXP (x, 0)) == HIGH
5169           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
5170         return XEXP (x, 1);
5171       break;
5172 #endif
5173
5174     case PLUS:
5175       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
5176          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
5177          bit-field and can be replaced by either a sign_extend or a
5178          sign_extract.  The `and' may be a zero_extend and the two
5179          <c>, -<c> constants may be reversed.  */
5180       if (GET_CODE (XEXP (x, 0)) == XOR
5181           && CONST_INT_P (XEXP (x, 1))
5182           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
5183           && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
5184           && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
5185               || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
5186           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5187           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
5188                && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
5189                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
5190                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
5191               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
5192                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
5193                       == (unsigned int) i + 1))))
5194         return simplify_shift_const
5195           (NULL_RTX, ASHIFTRT, mode,
5196            simplify_shift_const (NULL_RTX, ASHIFT, mode,
5197                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
5198                                  GET_MODE_BITSIZE (mode) - (i + 1)),
5199            GET_MODE_BITSIZE (mode) - (i + 1));
5200
5201       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
5202          can become (ashiftrt (ashift (xor x 1) C) C) where C is
5203          the bitsize of the mode - 1.  This allows simplification of
5204          "a = (b & 8) == 0;"  */
5205       if (XEXP (x, 1) == constm1_rtx
5206           && !REG_P (XEXP (x, 0))
5207           && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5208                 && REG_P (SUBREG_REG (XEXP (x, 0))))
5209           && nonzero_bits (XEXP (x, 0), mode) == 1)
5210         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
5211            simplify_shift_const (NULL_RTX, ASHIFT, mode,
5212                                  gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
5213                                  GET_MODE_BITSIZE (mode) - 1),
5214            GET_MODE_BITSIZE (mode) - 1);
5215
5216       /* If we are adding two things that have no bits in common, convert
5217          the addition into an IOR.  This will often be further simplified,
5218          for example in cases like ((a & 1) + (a & 2)), which can
5219          become a & 3.  */
5220
5221       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5222           && (nonzero_bits (XEXP (x, 0), mode)
5223               & nonzero_bits (XEXP (x, 1), mode)) == 0)
5224         {
5225           /* Try to simplify the expression further.  */
5226           rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
5227           temp = combine_simplify_rtx (tor, mode, in_dest);
5228
5229           /* If we could, great.  If not, do not go ahead with the IOR
5230              replacement, since PLUS appears in many special purpose
5231              address arithmetic instructions.  */
5232           if (GET_CODE (temp) != CLOBBER && temp != tor)
5233             return temp;
5234         }
5235       break;
5236
5237     case MINUS:
5238       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
5239          (and <foo> (const_int pow2-1))  */
5240       if (GET_CODE (XEXP (x, 1)) == AND
5241           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
5242           && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
5243           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
5244         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
5245                                        -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
5246       break;
5247
5248     case MULT:
5249       /* If we have (mult (plus A B) C), apply the distributive law and then
5250          the inverse distributive law to see if things simplify.  This
5251          occurs mostly in addresses, often when unrolling loops.  */
5252
5253       if (GET_CODE (XEXP (x, 0)) == PLUS)
5254         {
5255           rtx result = distribute_and_simplify_rtx (x, 0);
5256           if (result)
5257             return result;
5258         }
5259
5260       /* Try simplify a*(b/c) as (a*b)/c.  */
5261       if (FLOAT_MODE_P (mode) && flag_associative_math
5262           && GET_CODE (XEXP (x, 0)) == DIV)
5263         {
5264           rtx tem = simplify_binary_operation (MULT, mode,
5265                                                XEXP (XEXP (x, 0), 0),
5266                                                XEXP (x, 1));
5267           if (tem)
5268             return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
5269         }
5270       break;
5271
5272     case UDIV:
5273       /* If this is a divide by a power of two, treat it as a shift if
5274          its first operand is a shift.  */
5275       if (CONST_INT_P (XEXP (x, 1))
5276           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
5277           && (GET_CODE (XEXP (x, 0)) == ASHIFT
5278               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
5279               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
5280               || GET_CODE (XEXP (x, 0)) == ROTATE
5281               || GET_CODE (XEXP (x, 0)) == ROTATERT))
5282         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
5283       break;
5284
5285     case EQ:  case NE:
5286     case GT:  case GTU:  case GE:  case GEU:
5287     case LT:  case LTU:  case LE:  case LEU:
5288     case UNEQ:  case LTGT:
5289     case UNGT:  case UNGE:
5290     case UNLT:  case UNLE:
5291     case UNORDERED: case ORDERED:
5292       /* If the first operand is a condition code, we can't do anything
5293          with it.  */
5294       if (GET_CODE (XEXP (x, 0)) == COMPARE
5295           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
5296               && ! CC0_P (XEXP (x, 0))))
5297         {
5298           rtx op0 = XEXP (x, 0);
5299           rtx op1 = XEXP (x, 1);
5300           enum rtx_code new_code;
5301
5302           if (GET_CODE (op0) == COMPARE)
5303             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
5304
5305           /* Simplify our comparison, if possible.  */
5306           new_code = simplify_comparison (code, &op0, &op1);
5307
5308           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
5309              if only the low-order bit is possibly nonzero in X (such as when
5310              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
5311              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
5312              known to be either 0 or -1, NE becomes a NEG and EQ becomes
5313              (plus X 1).
5314
5315              Remove any ZERO_EXTRACT we made when thinking this was a
5316              comparison.  It may now be simpler to use, e.g., an AND.  If a
5317              ZERO_EXTRACT is indeed appropriate, it will be placed back by
5318              the call to make_compound_operation in the SET case.  */
5319
5320           if (STORE_FLAG_VALUE == 1
5321               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5322               && op1 == const0_rtx
5323               && mode == GET_MODE (op0)
5324               && nonzero_bits (op0, mode) == 1)
5325             return gen_lowpart (mode,
5326                                 expand_compound_operation (op0));
5327
5328           else if (STORE_FLAG_VALUE == 1
5329                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5330                    && op1 == const0_rtx
5331                    && mode == GET_MODE (op0)
5332                    && (num_sign_bit_copies (op0, mode)
5333                        == GET_MODE_BITSIZE (mode)))
5334             {
5335               op0 = expand_compound_operation (op0);
5336               return simplify_gen_unary (NEG, mode,
5337                                          gen_lowpart (mode, op0),
5338                                          mode);
5339             }
5340
5341           else if (STORE_FLAG_VALUE == 1
5342                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5343                    && op1 == const0_rtx
5344                    && mode == GET_MODE (op0)
5345                    && nonzero_bits (op0, mode) == 1)
5346             {
5347               op0 = expand_compound_operation (op0);
5348               return simplify_gen_binary (XOR, mode,
5349                                           gen_lowpart (mode, op0),
5350                                           const1_rtx);
5351             }
5352
5353           else if (STORE_FLAG_VALUE == 1
5354                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5355                    && op1 == const0_rtx
5356                    && mode == GET_MODE (op0)
5357                    && (num_sign_bit_copies (op0, mode)
5358                        == GET_MODE_BITSIZE (mode)))
5359             {
5360               op0 = expand_compound_operation (op0);
5361               return plus_constant (gen_lowpart (mode, op0), 1);
5362             }
5363
5364           /* If STORE_FLAG_VALUE is -1, we have cases similar to
5365              those above.  */
5366           if (STORE_FLAG_VALUE == -1
5367               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5368               && op1 == const0_rtx
5369               && (num_sign_bit_copies (op0, mode)
5370                   == GET_MODE_BITSIZE (mode)))
5371             return gen_lowpart (mode,
5372                                 expand_compound_operation (op0));
5373
5374           else if (STORE_FLAG_VALUE == -1
5375                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5376                    && op1 == const0_rtx
5377                    && mode == GET_MODE (op0)
5378                    && nonzero_bits (op0, mode) == 1)
5379             {
5380               op0 = expand_compound_operation (op0);
5381               return simplify_gen_unary (NEG, mode,
5382                                          gen_lowpart (mode, op0),
5383                                          mode);
5384             }
5385
5386           else if (STORE_FLAG_VALUE == -1
5387                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5388                    && op1 == const0_rtx
5389                    && mode == GET_MODE (op0)
5390                    && (num_sign_bit_copies (op0, mode)
5391                        == GET_MODE_BITSIZE (mode)))
5392             {
5393               op0 = expand_compound_operation (op0);
5394               return simplify_gen_unary (NOT, mode,
5395                                          gen_lowpart (mode, op0),
5396                                          mode);
5397             }
5398
5399           /* If X is 0/1, (eq X 0) is X-1.  */
5400           else if (STORE_FLAG_VALUE == -1
5401                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5402                    && op1 == const0_rtx
5403                    && mode == GET_MODE (op0)
5404                    && nonzero_bits (op0, mode) == 1)
5405             {
5406               op0 = expand_compound_operation (op0);
5407               return plus_constant (gen_lowpart (mode, op0), -1);
5408             }
5409
5410           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
5411              one bit that might be nonzero, we can convert (ne x 0) to
5412              (ashift x c) where C puts the bit in the sign bit.  Remove any
5413              AND with STORE_FLAG_VALUE when we are done, since we are only
5414              going to test the sign bit.  */
5415           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5416               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5417               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5418                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5419               && op1 == const0_rtx
5420               && mode == GET_MODE (op0)
5421               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
5422             {
5423               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
5424                                         expand_compound_operation (op0),
5425                                         GET_MODE_BITSIZE (mode) - 1 - i);
5426               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
5427                 return XEXP (x, 0);
5428               else
5429                 return x;
5430             }
5431
5432           /* If the code changed, return a whole new comparison.  */
5433           if (new_code != code)
5434             return gen_rtx_fmt_ee (new_code, mode, op0, op1);
5435
5436           /* Otherwise, keep this operation, but maybe change its operands.
5437              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
5438           SUBST (XEXP (x, 0), op0);
5439           SUBST (XEXP (x, 1), op1);
5440         }
5441       break;
5442
5443     case IF_THEN_ELSE:
5444       return simplify_if_then_else (x);
5445
5446     case ZERO_EXTRACT:
5447     case SIGN_EXTRACT:
5448     case ZERO_EXTEND:
5449     case SIGN_EXTEND:
5450       /* If we are processing SET_DEST, we are done.  */
5451       if (in_dest)
5452         return x;
5453
5454       return expand_compound_operation (x);
5455
5456     case SET:
5457       return simplify_set (x);
5458
5459     case AND:
5460     case IOR:
5461       return simplify_logical (x);
5462
5463     case ASHIFT:
5464     case LSHIFTRT:
5465     case ASHIFTRT:
5466     case ROTATE:
5467     case ROTATERT:
5468       /* If this is a shift by a constant amount, simplify it.  */
5469       if (CONST_INT_P (XEXP (x, 1)))
5470         return simplify_shift_const (x, code, mode, XEXP (x, 0),
5471                                      INTVAL (XEXP (x, 1)));
5472
5473       else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
5474         SUBST (XEXP (x, 1),
5475                force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
5476                               ((HOST_WIDE_INT) 1
5477                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
5478                               - 1,
5479                               0));
5480       break;
5481
5482     default:
5483       break;
5484     }
5485
5486   return x;
5487 }
5488 \f
5489 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
5490
5491 static rtx
5492 simplify_if_then_else (rtx x)
5493 {
5494   enum machine_mode mode = GET_MODE (x);
5495   rtx cond = XEXP (x, 0);
5496   rtx true_rtx = XEXP (x, 1);
5497   rtx false_rtx = XEXP (x, 2);
5498   enum rtx_code true_code = GET_CODE (cond);
5499   int comparison_p = COMPARISON_P (cond);
5500   rtx temp;
5501   int i;
5502   enum rtx_code false_code;
5503   rtx reversed;
5504
5505   /* Simplify storing of the truth value.  */
5506   if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
5507     return simplify_gen_relational (true_code, mode, VOIDmode,
5508                                     XEXP (cond, 0), XEXP (cond, 1));
5509
5510   /* Also when the truth value has to be reversed.  */
5511   if (comparison_p
5512       && true_rtx == const0_rtx && false_rtx == const_true_rtx
5513       && (reversed = reversed_comparison (cond, mode)))
5514     return reversed;
5515
5516   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
5517      in it is being compared against certain values.  Get the true and false
5518      comparisons and see if that says anything about the value of each arm.  */
5519
5520   if (comparison_p
5521       && ((false_code = reversed_comparison_code (cond, NULL))
5522           != UNKNOWN)
5523       && REG_P (XEXP (cond, 0)))
5524     {
5525       HOST_WIDE_INT nzb;
5526       rtx from = XEXP (cond, 0);
5527       rtx true_val = XEXP (cond, 1);
5528       rtx false_val = true_val;
5529       int swapped = 0;
5530
5531       /* If FALSE_CODE is EQ, swap the codes and arms.  */
5532
5533       if (false_code == EQ)
5534         {
5535           swapped = 1, true_code = EQ, false_code = NE;
5536           temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5537         }
5538
5539       /* If we are comparing against zero and the expression being tested has
5540          only a single bit that might be nonzero, that is its value when it is
5541          not equal to zero.  Similarly if it is known to be -1 or 0.  */
5542
5543       if (true_code == EQ && true_val == const0_rtx
5544           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
5545         {
5546           false_code = EQ;
5547           false_val = GEN_INT (trunc_int_for_mode (nzb, GET_MODE (from)));
5548         }
5549       else if (true_code == EQ && true_val == const0_rtx
5550                && (num_sign_bit_copies (from, GET_MODE (from))
5551                    == GET_MODE_BITSIZE (GET_MODE (from))))
5552         {
5553           false_code = EQ;
5554           false_val = constm1_rtx;
5555         }
5556
5557       /* Now simplify an arm if we know the value of the register in the
5558          branch and it is used in the arm.  Be careful due to the potential
5559          of locally-shared RTL.  */
5560
5561       if (reg_mentioned_p (from, true_rtx))
5562         true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
5563                                       from, true_val),
5564                       pc_rtx, pc_rtx, 0, 0);
5565       if (reg_mentioned_p (from, false_rtx))
5566         false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
5567                                    from, false_val),
5568                        pc_rtx, pc_rtx, 0, 0);
5569
5570       SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
5571       SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
5572
5573       true_rtx = XEXP (x, 1);
5574       false_rtx = XEXP (x, 2);
5575       true_code = GET_CODE (cond);
5576     }
5577
5578   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
5579      reversed, do so to avoid needing two sets of patterns for
5580      subtract-and-branch insns.  Similarly if we have a constant in the true
5581      arm, the false arm is the same as the first operand of the comparison, or
5582      the false arm is more complicated than the true arm.  */
5583
5584   if (comparison_p
5585       && reversed_comparison_code (cond, NULL) != UNKNOWN
5586       && (true_rtx == pc_rtx
5587           || (CONSTANT_P (true_rtx)
5588               && !CONST_INT_P (false_rtx) && false_rtx != pc_rtx)
5589           || true_rtx == const0_rtx
5590           || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
5591           || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
5592               && !OBJECT_P (false_rtx))
5593           || reg_mentioned_p (true_rtx, false_rtx)
5594           || rtx_equal_p (false_rtx, XEXP (cond, 0))))
5595     {
5596       true_code = reversed_comparison_code (cond, NULL);
5597       SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
5598       SUBST (XEXP (x, 1), false_rtx);
5599       SUBST (XEXP (x, 2), true_rtx);
5600
5601       temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5602       cond = XEXP (x, 0);
5603
5604       /* It is possible that the conditional has been simplified out.  */
5605       true_code = GET_CODE (cond);
5606       comparison_p = COMPARISON_P (cond);
5607     }
5608
5609   /* If the two arms are identical, we don't need the comparison.  */
5610
5611   if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
5612     return true_rtx;
5613
5614   /* Convert a == b ? b : a to "a".  */
5615   if (true_code == EQ && ! side_effects_p (cond)
5616       && !HONOR_NANS (mode)
5617       && rtx_equal_p (XEXP (cond, 0), false_rtx)
5618       && rtx_equal_p (XEXP (cond, 1), true_rtx))
5619     return false_rtx;
5620   else if (true_code == NE && ! side_effects_p (cond)
5621            && !HONOR_NANS (mode)
5622            && rtx_equal_p (XEXP (cond, 0), true_rtx)
5623            && rtx_equal_p (XEXP (cond, 1), false_rtx))
5624     return true_rtx;
5625
5626   /* Look for cases where we have (abs x) or (neg (abs X)).  */
5627
5628   if (GET_MODE_CLASS (mode) == MODE_INT
5629       && comparison_p
5630       && XEXP (cond, 1) == const0_rtx
5631       && GET_CODE (false_rtx) == NEG
5632       && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
5633       && rtx_equal_p (true_rtx, XEXP (cond, 0))
5634       && ! side_effects_p (true_rtx))
5635     switch (true_code)
5636       {
5637       case GT:
5638       case GE:
5639         return simplify_gen_unary (ABS, mode, true_rtx, mode);
5640       case LT:
5641       case LE:
5642         return
5643           simplify_gen_unary (NEG, mode,
5644                               simplify_gen_unary (ABS, mode, true_rtx, mode),
5645                               mode);
5646       default:
5647         break;
5648       }
5649
5650   /* Look for MIN or MAX.  */
5651
5652   if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
5653       && comparison_p
5654       && rtx_equal_p (XEXP (cond, 0), true_rtx)
5655       && rtx_equal_p (XEXP (cond, 1), false_rtx)
5656       && ! side_effects_p (cond))
5657     switch (true_code)
5658       {
5659       case GE:
5660       case GT:
5661         return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
5662       case LE:
5663       case LT:
5664         return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
5665       case GEU:
5666       case GTU:
5667         return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
5668       case LEU:
5669       case LTU:
5670         return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
5671       default:
5672         break;
5673       }
5674
5675   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
5676      second operand is zero, this can be done as (OP Z (mult COND C2)) where
5677      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
5678      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
5679      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
5680      neither 1 or -1, but it isn't worth checking for.  */
5681
5682   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
5683       && comparison_p
5684       && GET_MODE_CLASS (mode) == MODE_INT
5685       && ! side_effects_p (x))
5686     {
5687       rtx t = make_compound_operation (true_rtx, SET);
5688       rtx f = make_compound_operation (false_rtx, SET);
5689       rtx cond_op0 = XEXP (cond, 0);
5690       rtx cond_op1 = XEXP (cond, 1);
5691       enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
5692       enum machine_mode m = mode;
5693       rtx z = 0, c1 = NULL_RTX;
5694
5695       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
5696            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
5697            || GET_CODE (t) == ASHIFT
5698            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
5699           && rtx_equal_p (XEXP (t, 0), f))
5700         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
5701
5702       /* If an identity-zero op is commutative, check whether there
5703          would be a match if we swapped the operands.  */
5704       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
5705                 || GET_CODE (t) == XOR)
5706                && rtx_equal_p (XEXP (t, 1), f))
5707         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
5708       else if (GET_CODE (t) == SIGN_EXTEND
5709                && (GET_CODE (XEXP (t, 0)) == PLUS
5710                    || GET_CODE (XEXP (t, 0)) == MINUS
5711                    || GET_CODE (XEXP (t, 0)) == IOR
5712                    || GET_CODE (XEXP (t, 0)) == XOR
5713                    || GET_CODE (XEXP (t, 0)) == ASHIFT
5714                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5715                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5716                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5717                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5718                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5719                && (num_sign_bit_copies (f, GET_MODE (f))
5720                    > (unsigned int)
5721                      (GET_MODE_BITSIZE (mode)
5722                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
5723         {
5724           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5725           extend_op = SIGN_EXTEND;
5726           m = GET_MODE (XEXP (t, 0));
5727         }
5728       else if (GET_CODE (t) == SIGN_EXTEND
5729                && (GET_CODE (XEXP (t, 0)) == PLUS
5730                    || GET_CODE (XEXP (t, 0)) == IOR
5731                    || GET_CODE (XEXP (t, 0)) == XOR)
5732                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5733                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5734                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5735                && (num_sign_bit_copies (f, GET_MODE (f))
5736                    > (unsigned int)
5737                      (GET_MODE_BITSIZE (mode)
5738                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
5739         {
5740           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5741           extend_op = SIGN_EXTEND;
5742           m = GET_MODE (XEXP (t, 0));
5743         }
5744       else if (GET_CODE (t) == ZERO_EXTEND
5745                && (GET_CODE (XEXP (t, 0)) == PLUS
5746                    || GET_CODE (XEXP (t, 0)) == MINUS
5747                    || GET_CODE (XEXP (t, 0)) == IOR
5748                    || GET_CODE (XEXP (t, 0)) == XOR
5749                    || GET_CODE (XEXP (t, 0)) == ASHIFT
5750                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5751                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5752                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5753                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5754                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5755                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5756                && ((nonzero_bits (f, GET_MODE (f))
5757                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
5758                    == 0))
5759         {
5760           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5761           extend_op = ZERO_EXTEND;
5762           m = GET_MODE (XEXP (t, 0));
5763         }
5764       else if (GET_CODE (t) == ZERO_EXTEND
5765                && (GET_CODE (XEXP (t, 0)) == PLUS
5766                    || GET_CODE (XEXP (t, 0)) == IOR
5767                    || GET_CODE (XEXP (t, 0)) == XOR)
5768                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5769                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5770                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5771                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5772                && ((nonzero_bits (f, GET_MODE (f))
5773                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
5774                    == 0))
5775         {
5776           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5777           extend_op = ZERO_EXTEND;
5778           m = GET_MODE (XEXP (t, 0));
5779         }
5780
5781       if (z)
5782         {
5783           temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
5784                                                  cond_op0, cond_op1),
5785                         pc_rtx, pc_rtx, 0, 0);
5786           temp = simplify_gen_binary (MULT, m, temp,
5787                                       simplify_gen_binary (MULT, m, c1,
5788                                                            const_true_rtx));
5789           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
5790           temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
5791
5792           if (extend_op != UNKNOWN)
5793             temp = simplify_gen_unary (extend_op, mode, temp, m);
5794
5795           return temp;
5796         }
5797     }
5798
5799   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
5800      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
5801      negation of a single bit, we can convert this operation to a shift.  We
5802      can actually do this more generally, but it doesn't seem worth it.  */
5803
5804   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5805       && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
5806       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
5807            && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
5808           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
5809                == GET_MODE_BITSIZE (mode))
5810               && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
5811     return
5812       simplify_shift_const (NULL_RTX, ASHIFT, mode,
5813                             gen_lowpart (mode, XEXP (cond, 0)), i);
5814
5815   /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8.  */
5816   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5817       && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
5818       && GET_MODE (XEXP (cond, 0)) == mode
5819       && (INTVAL (true_rtx) & GET_MODE_MASK (mode))
5820           == nonzero_bits (XEXP (cond, 0), mode)
5821       && (i = exact_log2 (INTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
5822     return XEXP (cond, 0);
5823
5824   return x;
5825 }
5826 \f
5827 /* Simplify X, a SET expression.  Return the new expression.  */
5828
5829 static rtx
5830 simplify_set (rtx x)
5831 {
5832   rtx src = SET_SRC (x);
5833   rtx dest = SET_DEST (x);
5834   enum machine_mode mode
5835     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
5836   rtx other_insn;
5837   rtx *cc_use;
5838
5839   /* (set (pc) (return)) gets written as (return).  */
5840   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
5841     return src;
5842
5843   /* Now that we know for sure which bits of SRC we are using, see if we can
5844      simplify the expression for the object knowing that we only need the
5845      low-order bits.  */
5846
5847   if (GET_MODE_CLASS (mode) == MODE_INT
5848       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5849     {
5850       src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, 0);
5851       SUBST (SET_SRC (x), src);
5852     }
5853
5854   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
5855      the comparison result and try to simplify it unless we already have used
5856      undobuf.other_insn.  */
5857   if ((GET_MODE_CLASS (mode) == MODE_CC
5858        || GET_CODE (src) == COMPARE
5859        || CC0_P (dest))
5860       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
5861       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
5862       && COMPARISON_P (*cc_use)
5863       && rtx_equal_p (XEXP (*cc_use, 0), dest))
5864     {
5865       enum rtx_code old_code = GET_CODE (*cc_use);
5866       enum rtx_code new_code;
5867       rtx op0, op1, tmp;
5868       int other_changed = 0;
5869       enum machine_mode compare_mode = GET_MODE (dest);
5870
5871       if (GET_CODE (src) == COMPARE)
5872         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
5873       else
5874         op0 = src, op1 = CONST0_RTX (GET_MODE (src));
5875
5876       tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
5877                                            op0, op1);
5878       if (!tmp)
5879         new_code = old_code;
5880       else if (!CONSTANT_P (tmp))
5881         {
5882           new_code = GET_CODE (tmp);
5883           op0 = XEXP (tmp, 0);
5884           op1 = XEXP (tmp, 1);
5885         }
5886       else
5887         {
5888           rtx pat = PATTERN (other_insn);
5889           undobuf.other_insn = other_insn;
5890           SUBST (*cc_use, tmp);
5891
5892           /* Attempt to simplify CC user.  */
5893           if (GET_CODE (pat) == SET)
5894             {
5895               rtx new_rtx = simplify_rtx (SET_SRC (pat));
5896               if (new_rtx != NULL_RTX)
5897                 SUBST (SET_SRC (pat), new_rtx);
5898             }
5899
5900           /* Convert X into a no-op move.  */
5901           SUBST (SET_DEST (x), pc_rtx);
5902           SUBST (SET_SRC (x), pc_rtx);
5903           return x;
5904         }
5905
5906       /* Simplify our comparison, if possible.  */
5907       new_code = simplify_comparison (new_code, &op0, &op1);
5908
5909 #ifdef SELECT_CC_MODE
5910       /* If this machine has CC modes other than CCmode, check to see if we
5911          need to use a different CC mode here.  */
5912       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
5913         compare_mode = GET_MODE (op0);
5914       else
5915         compare_mode = SELECT_CC_MODE (new_code, op0, op1);
5916
5917 #ifndef HAVE_cc0
5918       /* If the mode changed, we have to change SET_DEST, the mode in the
5919          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
5920          a hard register, just build new versions with the proper mode.  If it
5921          is a pseudo, we lose unless it is only time we set the pseudo, in
5922          which case we can safely change its mode.  */
5923       if (compare_mode != GET_MODE (dest))
5924         {
5925           if (can_change_dest_mode (dest, 0, compare_mode))
5926             {
5927               unsigned int regno = REGNO (dest);
5928               rtx new_dest;
5929
5930               if (regno < FIRST_PSEUDO_REGISTER)
5931                 new_dest = gen_rtx_REG (compare_mode, regno);
5932               else
5933                 {
5934                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
5935                   new_dest = regno_reg_rtx[regno];
5936                 }
5937
5938               SUBST (SET_DEST (x), new_dest);
5939               SUBST (XEXP (*cc_use, 0), new_dest);
5940               other_changed = 1;
5941
5942               dest = new_dest;
5943             }
5944         }
5945 #endif  /* cc0 */
5946 #endif  /* SELECT_CC_MODE */
5947
5948       /* If the code changed, we have to build a new comparison in
5949          undobuf.other_insn.  */
5950       if (new_code != old_code)
5951         {
5952           int other_changed_previously = other_changed;
5953           unsigned HOST_WIDE_INT mask;
5954           rtx old_cc_use = *cc_use;
5955
5956           SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
5957                                           dest, const0_rtx));
5958           other_changed = 1;
5959
5960           /* If the only change we made was to change an EQ into an NE or
5961              vice versa, OP0 has only one bit that might be nonzero, and OP1
5962              is zero, check if changing the user of the condition code will
5963              produce a valid insn.  If it won't, we can keep the original code
5964              in that insn by surrounding our operation with an XOR.  */
5965
5966           if (((old_code == NE && new_code == EQ)
5967                || (old_code == EQ && new_code == NE))
5968               && ! other_changed_previously && op1 == const0_rtx
5969               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
5970               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
5971             {
5972               rtx pat = PATTERN (other_insn), note = 0;
5973
5974               if ((recog_for_combine (&pat, other_insn, &note) < 0
5975                    && ! check_asm_operands (pat)))
5976                 {
5977                   *cc_use = old_cc_use;
5978                   other_changed = 0;
5979
5980                   op0 = simplify_gen_binary (XOR, GET_MODE (op0),
5981                                              op0, GEN_INT (mask));
5982                 }
5983             }
5984         }
5985
5986       if (other_changed)
5987         undobuf.other_insn = other_insn;
5988
5989       /* Otherwise, if we didn't previously have a COMPARE in the
5990          correct mode, we need one.  */
5991       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
5992         {
5993           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
5994           src = SET_SRC (x);
5995         }
5996       else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
5997         {
5998           SUBST (SET_SRC (x), op0);
5999           src = SET_SRC (x);
6000         }
6001       /* Otherwise, update the COMPARE if needed.  */
6002       else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
6003         {
6004           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6005           src = SET_SRC (x);
6006         }
6007     }
6008   else
6009     {
6010       /* Get SET_SRC in a form where we have placed back any
6011          compound expressions.  Then do the checks below.  */
6012       src = make_compound_operation (src, SET);
6013       SUBST (SET_SRC (x), src);
6014     }
6015
6016   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
6017      and X being a REG or (subreg (reg)), we may be able to convert this to
6018      (set (subreg:m2 x) (op)).
6019
6020      We can always do this if M1 is narrower than M2 because that means that
6021      we only care about the low bits of the result.
6022
6023      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
6024      perform a narrower operation than requested since the high-order bits will
6025      be undefined.  On machine where it is defined, this transformation is safe
6026      as long as M1 and M2 have the same number of words.  */
6027
6028   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6029       && !OBJECT_P (SUBREG_REG (src))
6030       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
6031            / UNITS_PER_WORD)
6032           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
6033                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
6034 #ifndef WORD_REGISTER_OPERATIONS
6035       && (GET_MODE_SIZE (GET_MODE (src))
6036         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
6037 #endif
6038 #ifdef CANNOT_CHANGE_MODE_CLASS
6039       && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
6040             && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
6041                                          GET_MODE (SUBREG_REG (src)),
6042                                          GET_MODE (src)))
6043 #endif
6044       && (REG_P (dest)
6045           || (GET_CODE (dest) == SUBREG
6046               && REG_P (SUBREG_REG (dest)))))
6047     {
6048       SUBST (SET_DEST (x),
6049              gen_lowpart (GET_MODE (SUBREG_REG (src)),
6050                                       dest));
6051       SUBST (SET_SRC (x), SUBREG_REG (src));
6052
6053       src = SET_SRC (x), dest = SET_DEST (x);
6054     }
6055
6056 #ifdef HAVE_cc0
6057   /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
6058      in SRC.  */
6059   if (dest == cc0_rtx
6060       && GET_CODE (src) == SUBREG
6061       && subreg_lowpart_p (src)
6062       && (GET_MODE_BITSIZE (GET_MODE (src))
6063           < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
6064     {
6065       rtx inner = SUBREG_REG (src);
6066       enum machine_mode inner_mode = GET_MODE (inner);
6067
6068       /* Here we make sure that we don't have a sign bit on.  */
6069       if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
6070           && (nonzero_bits (inner, inner_mode)
6071               < ((unsigned HOST_WIDE_INT) 1
6072                  << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
6073         {
6074           SUBST (SET_SRC (x), inner);
6075           src = SET_SRC (x);
6076         }
6077     }
6078 #endif
6079
6080 #ifdef LOAD_EXTEND_OP
6081   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
6082      would require a paradoxical subreg.  Replace the subreg with a
6083      zero_extend to avoid the reload that would otherwise be required.  */
6084
6085   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6086       && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (src)))
6087       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != UNKNOWN
6088       && SUBREG_BYTE (src) == 0
6089       && (GET_MODE_SIZE (GET_MODE (src))
6090           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
6091       && MEM_P (SUBREG_REG (src)))
6092     {
6093       SUBST (SET_SRC (x),
6094              gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
6095                             GET_MODE (src), SUBREG_REG (src)));
6096
6097       src = SET_SRC (x);
6098     }
6099 #endif
6100
6101   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
6102      are comparing an item known to be 0 or -1 against 0, use a logical
6103      operation instead. Check for one of the arms being an IOR of the other
6104      arm with some value.  We compute three terms to be IOR'ed together.  In
6105      practice, at most two will be nonzero.  Then we do the IOR's.  */
6106
6107   if (GET_CODE (dest) != PC
6108       && GET_CODE (src) == IF_THEN_ELSE
6109       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
6110       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
6111       && XEXP (XEXP (src, 0), 1) == const0_rtx
6112       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
6113 #ifdef HAVE_conditional_move
6114       && ! can_conditionally_move_p (GET_MODE (src))
6115 #endif
6116       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
6117                                GET_MODE (XEXP (XEXP (src, 0), 0)))
6118           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
6119       && ! side_effects_p (src))
6120     {
6121       rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
6122                       ? XEXP (src, 1) : XEXP (src, 2));
6123       rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
6124                    ? XEXP (src, 2) : XEXP (src, 1));
6125       rtx term1 = const0_rtx, term2, term3;
6126
6127       if (GET_CODE (true_rtx) == IOR
6128           && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
6129         term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
6130       else if (GET_CODE (true_rtx) == IOR
6131                && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
6132         term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
6133       else if (GET_CODE (false_rtx) == IOR
6134                && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
6135         term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
6136       else if (GET_CODE (false_rtx) == IOR
6137                && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
6138         term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
6139
6140       term2 = simplify_gen_binary (AND, GET_MODE (src),
6141                                    XEXP (XEXP (src, 0), 0), true_rtx);
6142       term3 = simplify_gen_binary (AND, GET_MODE (src),
6143                                    simplify_gen_unary (NOT, GET_MODE (src),
6144                                                        XEXP (XEXP (src, 0), 0),
6145                                                        GET_MODE (src)),
6146                                    false_rtx);
6147
6148       SUBST (SET_SRC (x),
6149              simplify_gen_binary (IOR, GET_MODE (src),
6150                                   simplify_gen_binary (IOR, GET_MODE (src),
6151                                                        term1, term2),
6152                                   term3));
6153
6154       src = SET_SRC (x);
6155     }
6156
6157   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
6158      whole thing fail.  */
6159   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
6160     return src;
6161   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
6162     return dest;
6163   else
6164     /* Convert this into a field assignment operation, if possible.  */
6165     return make_field_assignment (x);
6166 }
6167 \f
6168 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
6169    result.  */
6170
6171 static rtx
6172 simplify_logical (rtx x)
6173 {
6174   enum machine_mode mode = GET_MODE (x);
6175   rtx op0 = XEXP (x, 0);
6176   rtx op1 = XEXP (x, 1);
6177
6178   switch (GET_CODE (x))
6179     {
6180     case AND:
6181       /* We can call simplify_and_const_int only if we don't lose
6182          any (sign) bits when converting INTVAL (op1) to
6183          "unsigned HOST_WIDE_INT".  */
6184       if (CONST_INT_P (op1)
6185           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
6186               || INTVAL (op1) > 0))
6187         {
6188           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
6189           if (GET_CODE (x) != AND)
6190             return x;
6191
6192           op0 = XEXP (x, 0);
6193           op1 = XEXP (x, 1);
6194         }
6195
6196       /* If we have any of (and (ior A B) C) or (and (xor A B) C),
6197          apply the distributive law and then the inverse distributive
6198          law to see if things simplify.  */
6199       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
6200         {
6201           rtx result = distribute_and_simplify_rtx (x, 0);
6202           if (result)
6203             return result;
6204         }
6205       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
6206         {
6207           rtx result = distribute_and_simplify_rtx (x, 1);
6208           if (result)
6209             return result;
6210         }
6211       break;
6212
6213     case IOR:
6214       /* If we have (ior (and A B) C), apply the distributive law and then
6215          the inverse distributive law to see if things simplify.  */
6216
6217       if (GET_CODE (op0) == AND)
6218         {
6219           rtx result = distribute_and_simplify_rtx (x, 0);
6220           if (result)
6221             return result;
6222         }
6223
6224       if (GET_CODE (op1) == AND)
6225         {
6226           rtx result = distribute_and_simplify_rtx (x, 1);
6227           if (result)
6228             return result;
6229         }
6230       break;
6231
6232     default:
6233       gcc_unreachable ();
6234     }
6235
6236   return x;
6237 }
6238 \f
6239 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
6240    operations" because they can be replaced with two more basic operations.
6241    ZERO_EXTEND is also considered "compound" because it can be replaced with
6242    an AND operation, which is simpler, though only one operation.
6243
6244    The function expand_compound_operation is called with an rtx expression
6245    and will convert it to the appropriate shifts and AND operations,
6246    simplifying at each stage.
6247
6248    The function make_compound_operation is called to convert an expression
6249    consisting of shifts and ANDs into the equivalent compound expression.
6250    It is the inverse of this function, loosely speaking.  */
6251
6252 static rtx
6253 expand_compound_operation (rtx x)
6254 {
6255   unsigned HOST_WIDE_INT pos = 0, len;
6256   int unsignedp = 0;
6257   unsigned int modewidth;
6258   rtx tem;
6259
6260   switch (GET_CODE (x))
6261     {
6262     case ZERO_EXTEND:
6263       unsignedp = 1;
6264     case SIGN_EXTEND:
6265       /* We can't necessarily use a const_int for a multiword mode;
6266          it depends on implicitly extending the value.
6267          Since we don't know the right way to extend it,
6268          we can't tell whether the implicit way is right.
6269
6270          Even for a mode that is no wider than a const_int,
6271          we can't win, because we need to sign extend one of its bits through
6272          the rest of it, and we don't know which bit.  */
6273       if (CONST_INT_P (XEXP (x, 0)))
6274         return x;
6275
6276       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
6277          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
6278          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
6279          reloaded. If not for that, MEM's would very rarely be safe.
6280
6281          Reject MODEs bigger than a word, because we might not be able
6282          to reference a two-register group starting with an arbitrary register
6283          (and currently gen_lowpart might crash for a SUBREG).  */
6284
6285       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
6286         return x;
6287
6288       /* Reject MODEs that aren't scalar integers because turning vector
6289          or complex modes into shifts causes problems.  */
6290
6291       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6292         return x;
6293
6294       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
6295       /* If the inner object has VOIDmode (the only way this can happen
6296          is if it is an ASM_OPERANDS), we can't do anything since we don't
6297          know how much masking to do.  */
6298       if (len == 0)
6299         return x;
6300
6301       break;
6302
6303     case ZERO_EXTRACT:
6304       unsignedp = 1;
6305
6306       /* ... fall through ...  */
6307
6308     case SIGN_EXTRACT:
6309       /* If the operand is a CLOBBER, just return it.  */
6310       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
6311         return XEXP (x, 0);
6312
6313       if (!CONST_INT_P (XEXP (x, 1))
6314           || !CONST_INT_P (XEXP (x, 2))
6315           || GET_MODE (XEXP (x, 0)) == VOIDmode)
6316         return x;
6317
6318       /* Reject MODEs that aren't scalar integers because turning vector
6319          or complex modes into shifts causes problems.  */
6320
6321       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6322         return x;
6323
6324       len = INTVAL (XEXP (x, 1));
6325       pos = INTVAL (XEXP (x, 2));
6326
6327       /* This should stay within the object being extracted, fail otherwise.  */
6328       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
6329         return x;
6330
6331       if (BITS_BIG_ENDIAN)
6332         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
6333
6334       break;
6335
6336     default:
6337       return x;
6338     }
6339   /* Convert sign extension to zero extension, if we know that the high
6340      bit is not set, as this is easier to optimize.  It will be converted
6341      back to cheaper alternative in make_extraction.  */
6342   if (GET_CODE (x) == SIGN_EXTEND
6343       && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6344           && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
6345                 & ~(((unsigned HOST_WIDE_INT)
6346                       GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
6347                      >> 1))
6348                == 0)))
6349     {
6350       rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
6351       rtx temp2 = expand_compound_operation (temp);
6352
6353       /* Make sure this is a profitable operation.  */
6354       if (rtx_cost (x, SET, optimize_this_for_speed_p)
6355           > rtx_cost (temp2, SET, optimize_this_for_speed_p))
6356        return temp2;
6357       else if (rtx_cost (x, SET, optimize_this_for_speed_p)
6358                > rtx_cost (temp, SET, optimize_this_for_speed_p))
6359        return temp;
6360       else
6361        return x;
6362     }
6363
6364   /* We can optimize some special cases of ZERO_EXTEND.  */
6365   if (GET_CODE (x) == ZERO_EXTEND)
6366     {
6367       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
6368          know that the last value didn't have any inappropriate bits
6369          set.  */
6370       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6371           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6372           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6373           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
6374               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6375         return XEXP (XEXP (x, 0), 0);
6376
6377       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6378       if (GET_CODE (XEXP (x, 0)) == SUBREG
6379           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6380           && subreg_lowpart_p (XEXP (x, 0))
6381           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6382           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
6383               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6384         return SUBREG_REG (XEXP (x, 0));
6385
6386       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
6387          is a comparison and STORE_FLAG_VALUE permits.  This is like
6388          the first case, but it works even when GET_MODE (x) is larger
6389          than HOST_WIDE_INT.  */
6390       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6391           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6392           && COMPARISON_P (XEXP (XEXP (x, 0), 0))
6393           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6394               <= HOST_BITS_PER_WIDE_INT)
6395           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6396               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6397         return XEXP (XEXP (x, 0), 0);
6398
6399       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6400       if (GET_CODE (XEXP (x, 0)) == SUBREG
6401           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6402           && subreg_lowpart_p (XEXP (x, 0))
6403           && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
6404           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6405               <= HOST_BITS_PER_WIDE_INT)
6406           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6407               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6408         return SUBREG_REG (XEXP (x, 0));
6409
6410     }
6411
6412   /* If we reach here, we want to return a pair of shifts.  The inner
6413      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
6414      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
6415      logical depending on the value of UNSIGNEDP.
6416
6417      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
6418      converted into an AND of a shift.
6419
6420      We must check for the case where the left shift would have a negative
6421      count.  This can happen in a case like (x >> 31) & 255 on machines
6422      that can't shift by a constant.  On those machines, we would first
6423      combine the shift with the AND to produce a variable-position
6424      extraction.  Then the constant of 31 would be substituted in to produce
6425      a such a position.  */
6426
6427   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
6428   if (modewidth + len >= pos)
6429     {
6430       enum machine_mode mode = GET_MODE (x);
6431       tem = gen_lowpart (mode, XEXP (x, 0));
6432       if (!tem || GET_CODE (tem) == CLOBBER)
6433         return x;
6434       tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
6435                                   tem, modewidth - pos - len);
6436       tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
6437                                   mode, tem, modewidth - len);
6438     }
6439   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
6440     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
6441                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
6442                                                         GET_MODE (x),
6443                                                         XEXP (x, 0), pos),
6444                                   ((HOST_WIDE_INT) 1 << len) - 1);
6445   else
6446     /* Any other cases we can't handle.  */
6447     return x;
6448
6449   /* If we couldn't do this for some reason, return the original
6450      expression.  */
6451   if (GET_CODE (tem) == CLOBBER)
6452     return x;
6453
6454   return tem;
6455 }
6456 \f
6457 /* X is a SET which contains an assignment of one object into
6458    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
6459    or certain SUBREGS). If possible, convert it into a series of
6460    logical operations.
6461
6462    We half-heartedly support variable positions, but do not at all
6463    support variable lengths.  */
6464
6465 static const_rtx
6466 expand_field_assignment (const_rtx x)
6467 {
6468   rtx inner;
6469   rtx pos;                      /* Always counts from low bit.  */
6470   int len;
6471   rtx mask, cleared, masked;
6472   enum machine_mode compute_mode;
6473
6474   /* Loop until we find something we can't simplify.  */
6475   while (1)
6476     {
6477       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
6478           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
6479         {
6480           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
6481           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
6482           pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
6483         }
6484       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
6485                && CONST_INT_P (XEXP (SET_DEST (x), 1)))
6486         {
6487           inner = XEXP (SET_DEST (x), 0);
6488           len = INTVAL (XEXP (SET_DEST (x), 1));
6489           pos = XEXP (SET_DEST (x), 2);
6490
6491           /* A constant position should stay within the width of INNER.  */
6492           if (CONST_INT_P (pos)
6493               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
6494             break;
6495
6496           if (BITS_BIG_ENDIAN)
6497             {
6498               if (CONST_INT_P (pos))
6499                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
6500                                - INTVAL (pos));
6501               else if (GET_CODE (pos) == MINUS
6502                        && CONST_INT_P (XEXP (pos, 1))
6503                        && (INTVAL (XEXP (pos, 1))
6504                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
6505                 /* If position is ADJUST - X, new position is X.  */
6506                 pos = XEXP (pos, 0);
6507               else
6508                 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
6509                                            GEN_INT (GET_MODE_BITSIZE (
6510                                                     GET_MODE (inner))
6511                                                     - len),
6512                                            pos);
6513             }
6514         }
6515
6516       /* A SUBREG between two modes that occupy the same numbers of words
6517          can be done by moving the SUBREG to the source.  */
6518       else if (GET_CODE (SET_DEST (x)) == SUBREG
6519                /* We need SUBREGs to compute nonzero_bits properly.  */
6520                && nonzero_sign_valid
6521                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
6522                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6523                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
6524                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
6525         {
6526           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
6527                            gen_lowpart
6528                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
6529                             SET_SRC (x)));
6530           continue;
6531         }
6532       else
6533         break;
6534
6535       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6536         inner = SUBREG_REG (inner);
6537
6538       compute_mode = GET_MODE (inner);
6539
6540       /* Don't attempt bitwise arithmetic on non scalar integer modes.  */
6541       if (! SCALAR_INT_MODE_P (compute_mode))
6542         {
6543           enum machine_mode imode;
6544
6545           /* Don't do anything for vector or complex integral types.  */
6546           if (! FLOAT_MODE_P (compute_mode))
6547             break;
6548
6549           /* Try to find an integral mode to pun with.  */
6550           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
6551           if (imode == BLKmode)
6552             break;
6553
6554           compute_mode = imode;
6555           inner = gen_lowpart (imode, inner);
6556         }
6557
6558       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
6559       if (len >= HOST_BITS_PER_WIDE_INT)
6560         break;
6561
6562       /* Now compute the equivalent expression.  Make a copy of INNER
6563          for the SET_DEST in case it is a MEM into which we will substitute;
6564          we don't want shared RTL in that case.  */
6565       mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
6566       cleared = simplify_gen_binary (AND, compute_mode,
6567                                      simplify_gen_unary (NOT, compute_mode,
6568                                        simplify_gen_binary (ASHIFT,
6569                                                             compute_mode,
6570                                                             mask, pos),
6571                                        compute_mode),
6572                                      inner);
6573       masked = simplify_gen_binary (ASHIFT, compute_mode,
6574                                     simplify_gen_binary (
6575                                       AND, compute_mode,
6576                                       gen_lowpart (compute_mode, SET_SRC (x)),
6577                                       mask),
6578                                     pos);
6579
6580       x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
6581                        simplify_gen_binary (IOR, compute_mode,
6582                                             cleared, masked));
6583     }
6584
6585   return x;
6586 }
6587 \f
6588 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
6589    it is an RTX that represents a variable starting position; otherwise,
6590    POS is the (constant) starting bit position (counted from the LSB).
6591
6592    UNSIGNEDP is nonzero for an unsigned reference and zero for a
6593    signed reference.
6594
6595    IN_DEST is nonzero if this is a reference in the destination of a
6596    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If nonzero,
6597    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
6598    be used.
6599
6600    IN_COMPARE is nonzero if we are in a COMPARE.  This means that a
6601    ZERO_EXTRACT should be built even for bits starting at bit 0.
6602
6603    MODE is the desired mode of the result (if IN_DEST == 0).
6604
6605    The result is an RTX for the extraction or NULL_RTX if the target
6606    can't handle it.  */
6607
6608 static rtx
6609 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
6610                  rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
6611                  int in_dest, int in_compare)
6612 {
6613   /* This mode describes the size of the storage area
6614      to fetch the overall value from.  Within that, we
6615      ignore the POS lowest bits, etc.  */
6616   enum machine_mode is_mode = GET_MODE (inner);
6617   enum machine_mode inner_mode;
6618   enum machine_mode wanted_inner_mode;
6619   enum machine_mode wanted_inner_reg_mode = word_mode;
6620   enum machine_mode pos_mode = word_mode;
6621   enum machine_mode extraction_mode = word_mode;
6622   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
6623   rtx new_rtx = 0;
6624   rtx orig_pos_rtx = pos_rtx;
6625   HOST_WIDE_INT orig_pos;
6626
6627   if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6628     {
6629       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
6630          consider just the QI as the memory to extract from.
6631          The subreg adds or removes high bits; its mode is
6632          irrelevant to the meaning of this extraction,
6633          since POS and LEN count from the lsb.  */
6634       if (MEM_P (SUBREG_REG (inner)))
6635         is_mode = GET_MODE (SUBREG_REG (inner));
6636       inner = SUBREG_REG (inner);
6637     }
6638   else if (GET_CODE (inner) == ASHIFT
6639            && CONST_INT_P (XEXP (inner, 1))
6640            && pos_rtx == 0 && pos == 0
6641            && len > (unsigned HOST_WIDE_INT) INTVAL (XEXP (inner, 1)))
6642     {
6643       /* We're extracting the least significant bits of an rtx
6644          (ashift X (const_int C)), where LEN > C.  Extract the
6645          least significant (LEN - C) bits of X, giving an rtx
6646          whose mode is MODE, then shift it left C times.  */
6647       new_rtx = make_extraction (mode, XEXP (inner, 0),
6648                              0, 0, len - INTVAL (XEXP (inner, 1)),
6649                              unsignedp, in_dest, in_compare);
6650       if (new_rtx != 0)
6651         return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
6652     }
6653
6654   inner_mode = GET_MODE (inner);
6655
6656   if (pos_rtx && CONST_INT_P (pos_rtx))
6657     pos = INTVAL (pos_rtx), pos_rtx = 0;
6658
6659   /* See if this can be done without an extraction.  We never can if the
6660      width of the field is not the same as that of some integer mode. For
6661      registers, we can only avoid the extraction if the position is at the
6662      low-order bit and this is either not in the destination or we have the
6663      appropriate STRICT_LOW_PART operation available.
6664
6665      For MEM, we can avoid an extract if the field starts on an appropriate
6666      boundary and we can change the mode of the memory reference.  */
6667
6668   if (tmode != BLKmode
6669       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
6670            && !MEM_P (inner)
6671            && (inner_mode == tmode
6672                || !REG_P (inner)
6673                || TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
6674                                          GET_MODE_BITSIZE (inner_mode))
6675                || reg_truncated_to_mode (tmode, inner))
6676            && (! in_dest
6677                || (REG_P (inner)
6678                    && have_insn_for (STRICT_LOW_PART, tmode))))
6679           || (MEM_P (inner) && pos_rtx == 0
6680               && (pos
6681                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
6682                      : BITS_PER_UNIT)) == 0
6683               /* We can't do this if we are widening INNER_MODE (it
6684                  may not be aligned, for one thing).  */
6685               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
6686               && (inner_mode == tmode
6687                   || (! mode_dependent_address_p (XEXP (inner, 0))
6688                       && ! MEM_VOLATILE_P (inner))))))
6689     {
6690       /* If INNER is a MEM, make a new MEM that encompasses just the desired
6691          field.  If the original and current mode are the same, we need not
6692          adjust the offset.  Otherwise, we do if bytes big endian.
6693
6694          If INNER is not a MEM, get a piece consisting of just the field
6695          of interest (in this case POS % BITS_PER_WORD must be 0).  */
6696
6697       if (MEM_P (inner))
6698         {
6699           HOST_WIDE_INT offset;
6700
6701           /* POS counts from lsb, but make OFFSET count in memory order.  */
6702           if (BYTES_BIG_ENDIAN)
6703             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
6704           else
6705             offset = pos / BITS_PER_UNIT;
6706
6707           new_rtx = adjust_address_nv (inner, tmode, offset);
6708         }
6709       else if (REG_P (inner))
6710         {
6711           if (tmode != inner_mode)
6712             {
6713               /* We can't call gen_lowpart in a DEST since we
6714                  always want a SUBREG (see below) and it would sometimes
6715                  return a new hard register.  */
6716               if (pos || in_dest)
6717                 {
6718                   HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
6719
6720                   if (WORDS_BIG_ENDIAN
6721                       && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
6722                     final_word = ((GET_MODE_SIZE (inner_mode)
6723                                    - GET_MODE_SIZE (tmode))
6724                                   / UNITS_PER_WORD) - final_word;
6725
6726                   final_word *= UNITS_PER_WORD;
6727                   if (BYTES_BIG_ENDIAN &&
6728                       GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
6729                     final_word += (GET_MODE_SIZE (inner_mode)
6730                                    - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
6731
6732                   /* Avoid creating invalid subregs, for example when
6733                      simplifying (x>>32)&255.  */
6734                   if (!validate_subreg (tmode, inner_mode, inner, final_word))
6735                     return NULL_RTX;
6736
6737                   new_rtx = gen_rtx_SUBREG (tmode, inner, final_word);
6738                 }
6739               else
6740                 new_rtx = gen_lowpart (tmode, inner);
6741             }
6742           else
6743             new_rtx = inner;
6744         }
6745       else
6746         new_rtx = force_to_mode (inner, tmode,
6747                              len >= HOST_BITS_PER_WIDE_INT
6748                              ? ~(unsigned HOST_WIDE_INT) 0
6749                              : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
6750                              0);
6751
6752       /* If this extraction is going into the destination of a SET,
6753          make a STRICT_LOW_PART unless we made a MEM.  */
6754
6755       if (in_dest)
6756         return (MEM_P (new_rtx) ? new_rtx
6757                 : (GET_CODE (new_rtx) != SUBREG
6758                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
6759                    : gen_rtx_STRICT_LOW_PART (VOIDmode, new_rtx)));
6760
6761       if (mode == tmode)
6762         return new_rtx;
6763
6764       if (CONST_INT_P (new_rtx)
6765           || GET_CODE (new_rtx) == CONST_DOUBLE)
6766         return simplify_unary_operation (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6767                                          mode, new_rtx, tmode);
6768
6769       /* If we know that no extraneous bits are set, and that the high
6770          bit is not set, convert the extraction to the cheaper of
6771          sign and zero extension, that are equivalent in these cases.  */
6772       if (flag_expensive_optimizations
6773           && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
6774               && ((nonzero_bits (new_rtx, tmode)
6775                    & ~(((unsigned HOST_WIDE_INT)
6776                         GET_MODE_MASK (tmode))
6777                        >> 1))
6778                   == 0)))
6779         {
6780           rtx temp = gen_rtx_ZERO_EXTEND (mode, new_rtx);
6781           rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new_rtx);
6782
6783           /* Prefer ZERO_EXTENSION, since it gives more information to
6784              backends.  */
6785           if (rtx_cost (temp, SET, optimize_this_for_speed_p)
6786               <= rtx_cost (temp1, SET, optimize_this_for_speed_p))
6787             return temp;
6788           return temp1;
6789         }
6790
6791       /* Otherwise, sign- or zero-extend unless we already are in the
6792          proper mode.  */
6793
6794       return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6795                              mode, new_rtx));
6796     }
6797
6798   /* Unless this is a COMPARE or we have a funny memory reference,
6799      don't do anything with zero-extending field extracts starting at
6800      the low-order bit since they are simple AND operations.  */
6801   if (pos_rtx == 0 && pos == 0 && ! in_dest
6802       && ! in_compare && unsignedp)
6803     return 0;
6804
6805   /* Unless INNER is not MEM, reject this if we would be spanning bytes or
6806      if the position is not a constant and the length is not 1.  In all
6807      other cases, we would only be going outside our object in cases when
6808      an original shift would have been undefined.  */
6809   if (MEM_P (inner)
6810       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6811           || (pos_rtx != 0 && len != 1)))
6812     return 0;
6813
6814   /* Get the mode to use should INNER not be a MEM, the mode for the position,
6815      and the mode for the result.  */
6816   if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
6817     {
6818       wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6819       pos_mode = mode_for_extraction (EP_insv, 2);
6820       extraction_mode = mode_for_extraction (EP_insv, 3);
6821     }
6822
6823   if (! in_dest && unsignedp
6824       && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
6825     {
6826       wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6827       pos_mode = mode_for_extraction (EP_extzv, 3);
6828       extraction_mode = mode_for_extraction (EP_extzv, 0);
6829     }
6830
6831   if (! in_dest && ! unsignedp
6832       && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
6833     {
6834       wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6835       pos_mode = mode_for_extraction (EP_extv, 3);
6836       extraction_mode = mode_for_extraction (EP_extv, 0);
6837     }
6838
6839   /* Never narrow an object, since that might not be safe.  */
6840
6841   if (mode != VOIDmode
6842       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6843     extraction_mode = mode;
6844
6845   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6846       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6847     pos_mode = GET_MODE (pos_rtx);
6848
6849   /* If this is not from memory, the desired mode is the preferred mode
6850      for an extraction pattern's first input operand, or word_mode if there
6851      is none.  */
6852   if (!MEM_P (inner))
6853     wanted_inner_mode = wanted_inner_reg_mode;
6854   else
6855     {
6856       /* Be careful not to go beyond the extracted object and maintain the
6857          natural alignment of the memory.  */
6858       wanted_inner_mode = smallest_mode_for_size (len, MODE_INT);
6859       while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
6860              > GET_MODE_BITSIZE (wanted_inner_mode))
6861         {
6862           wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode);
6863           gcc_assert (wanted_inner_mode != VOIDmode);
6864         }
6865
6866       /* If we have to change the mode of memory and cannot, the desired mode
6867          is EXTRACTION_MODE.  */
6868       if (inner_mode != wanted_inner_mode
6869           && (mode_dependent_address_p (XEXP (inner, 0))
6870               || MEM_VOLATILE_P (inner)
6871               || pos_rtx))
6872         wanted_inner_mode = extraction_mode;
6873     }
6874
6875   orig_pos = pos;
6876
6877   if (BITS_BIG_ENDIAN)
6878     {
6879       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6880          BITS_BIG_ENDIAN style.  If position is constant, compute new
6881          position.  Otherwise, build subtraction.
6882          Note that POS is relative to the mode of the original argument.
6883          If it's a MEM we need to recompute POS relative to that.
6884          However, if we're extracting from (or inserting into) a register,
6885          we want to recompute POS relative to wanted_inner_mode.  */
6886       int width = (MEM_P (inner)
6887                    ? GET_MODE_BITSIZE (is_mode)
6888                    : GET_MODE_BITSIZE (wanted_inner_mode));
6889
6890       if (pos_rtx == 0)
6891         pos = width - len - pos;
6892       else
6893         pos_rtx
6894           = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
6895       /* POS may be less than 0 now, but we check for that below.
6896          Note that it can only be less than 0 if !MEM_P (inner).  */
6897     }
6898
6899   /* If INNER has a wider mode, and this is a constant extraction, try to
6900      make it smaller and adjust the byte to point to the byte containing
6901      the value.  */
6902   if (wanted_inner_mode != VOIDmode
6903       && inner_mode != wanted_inner_mode
6904       && ! pos_rtx
6905       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
6906       && MEM_P (inner)
6907       && ! mode_dependent_address_p (XEXP (inner, 0))
6908       && ! MEM_VOLATILE_P (inner))
6909     {
6910       int offset = 0;
6911
6912       /* The computations below will be correct if the machine is big
6913          endian in both bits and bytes or little endian in bits and bytes.
6914          If it is mixed, we must adjust.  */
6915
6916       /* If bytes are big endian and we had a paradoxical SUBREG, we must
6917          adjust OFFSET to compensate.  */
6918       if (BYTES_BIG_ENDIAN
6919           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6920         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
6921
6922       /* We can now move to the desired byte.  */
6923       offset += (pos / GET_MODE_BITSIZE (wanted_inner_mode))
6924                 * GET_MODE_SIZE (wanted_inner_mode);
6925       pos %= GET_MODE_BITSIZE (wanted_inner_mode);
6926
6927       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6928           && is_mode != wanted_inner_mode)
6929         offset = (GET_MODE_SIZE (is_mode)
6930                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
6931
6932       inner = adjust_address_nv (inner, wanted_inner_mode, offset);
6933     }
6934
6935   /* If INNER is not memory, get it into the proper mode.  If we are changing
6936      its mode, POS must be a constant and smaller than the size of the new
6937      mode.  */
6938   else if (!MEM_P (inner))
6939     {
6940       /* On the LHS, don't create paradoxical subregs implicitely truncating
6941          the register unless TRULY_NOOP_TRUNCATION.  */
6942       if (in_dest
6943           && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (inner)),
6944                                      GET_MODE_BITSIZE (wanted_inner_mode)))
6945         return NULL_RTX;
6946
6947       if (GET_MODE (inner) != wanted_inner_mode
6948           && (pos_rtx != 0
6949               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6950         return NULL_RTX;
6951
6952       if (orig_pos < 0)
6953         return NULL_RTX;
6954
6955       inner = force_to_mode (inner, wanted_inner_mode,
6956                              pos_rtx
6957                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
6958                              ? ~(unsigned HOST_WIDE_INT) 0
6959                              : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6960                                 << orig_pos),
6961                              0);
6962     }
6963
6964   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
6965      have to zero extend.  Otherwise, we can just use a SUBREG.  */
6966   if (pos_rtx != 0
6967       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
6968     {
6969       rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
6970
6971       /* If we know that no extraneous bits are set, and that the high
6972          bit is not set, convert extraction to cheaper one - either
6973          SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6974          cases.  */
6975       if (flag_expensive_optimizations
6976           && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6977               && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
6978                    & ~(((unsigned HOST_WIDE_INT)
6979                         GET_MODE_MASK (GET_MODE (pos_rtx)))
6980                        >> 1))
6981                   == 0)))
6982         {
6983           rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
6984
6985           /* Prefer ZERO_EXTENSION, since it gives more information to
6986              backends.  */
6987           if (rtx_cost (temp1, SET, optimize_this_for_speed_p)
6988               < rtx_cost (temp, SET, optimize_this_for_speed_p))
6989             temp = temp1;
6990         }
6991       pos_rtx = temp;
6992     }
6993   else if (pos_rtx != 0
6994            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6995     pos_rtx = gen_lowpart (pos_mode, pos_rtx);
6996
6997   /* Make POS_RTX unless we already have it and it is correct.  If we don't
6998      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
6999      be a CONST_INT.  */
7000   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
7001     pos_rtx = orig_pos_rtx;
7002
7003   else if (pos_rtx == 0)
7004     pos_rtx = GEN_INT (pos);
7005
7006   /* Make the required operation.  See if we can use existing rtx.  */
7007   new_rtx = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
7008                          extraction_mode, inner, GEN_INT (len), pos_rtx);
7009   if (! in_dest)
7010     new_rtx = gen_lowpart (mode, new_rtx);
7011
7012   return new_rtx;
7013 }
7014 \f
7015 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
7016    with any other operations in X.  Return X without that shift if so.  */
7017
7018 static rtx
7019 extract_left_shift (rtx x, int count)
7020 {
7021   enum rtx_code code = GET_CODE (x);
7022   enum machine_mode mode = GET_MODE (x);
7023   rtx tem;
7024
7025   switch (code)
7026     {
7027     case ASHIFT:
7028       /* This is the shift itself.  If it is wide enough, we will return
7029          either the value being shifted if the shift count is equal to
7030          COUNT or a shift for the difference.  */
7031       if (CONST_INT_P (XEXP (x, 1))
7032           && INTVAL (XEXP (x, 1)) >= count)
7033         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
7034                                      INTVAL (XEXP (x, 1)) - count);
7035       break;
7036
7037     case NEG:  case NOT:
7038       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7039         return simplify_gen_unary (code, mode, tem, mode);
7040
7041       break;
7042
7043     case PLUS:  case IOR:  case XOR:  case AND:
7044       /* If we can safely shift this constant and we find the inner shift,
7045          make a new operation.  */
7046       if (CONST_INT_P (XEXP (x, 1))
7047           && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
7048           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7049         return simplify_gen_binary (code, mode, tem,
7050                                     GEN_INT (INTVAL (XEXP (x, 1)) >> count));
7051
7052       break;
7053
7054     default:
7055       break;
7056     }
7057
7058   return 0;
7059 }
7060 \f
7061 /* Look at the expression rooted at X.  Look for expressions
7062    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
7063    Form these expressions.
7064
7065    Return the new rtx, usually just X.
7066
7067    Also, for machines like the VAX that don't have logical shift insns,
7068    try to convert logical to arithmetic shift operations in cases where
7069    they are equivalent.  This undoes the canonicalizations to logical
7070    shifts done elsewhere.
7071
7072    We try, as much as possible, to re-use rtl expressions to save memory.
7073
7074    IN_CODE says what kind of expression we are processing.  Normally, it is
7075    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
7076    being kludges), it is MEM.  When processing the arguments of a comparison
7077    or a COMPARE against zero, it is COMPARE.  */
7078
7079 static rtx
7080 make_compound_operation (rtx x, enum rtx_code in_code)
7081 {
7082   enum rtx_code code = GET_CODE (x);
7083   enum machine_mode mode = GET_MODE (x);
7084   int mode_width = GET_MODE_BITSIZE (mode);
7085   rtx rhs, lhs;
7086   enum rtx_code next_code;
7087   int i, j;
7088   rtx new_rtx = 0;
7089   rtx tem;
7090   const char *fmt;
7091
7092   /* Select the code to be used in recursive calls.  Once we are inside an
7093      address, we stay there.  If we have a comparison, set to COMPARE,
7094      but once inside, go back to our default of SET.  */
7095
7096   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
7097                : ((code == COMPARE || COMPARISON_P (x))
7098                   && XEXP (x, 1) == const0_rtx) ? COMPARE
7099                : in_code == COMPARE ? SET : in_code);
7100
7101   /* Process depending on the code of this operation.  If NEW is set
7102      nonzero, it will be returned.  */
7103
7104   switch (code)
7105     {
7106     case ASHIFT:
7107       /* Convert shifts by constants into multiplications if inside
7108          an address.  */
7109       if (in_code == MEM && CONST_INT_P (XEXP (x, 1))
7110           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7111           && INTVAL (XEXP (x, 1)) >= 0)
7112         {
7113           HOST_WIDE_INT count = INTVAL (XEXP (x, 1));
7114           HOST_WIDE_INT multval = (HOST_WIDE_INT) 1 << count;
7115
7116           new_rtx = make_compound_operation (XEXP (x, 0), next_code);
7117           if (GET_CODE (new_rtx) == NEG)
7118             {
7119               new_rtx = XEXP (new_rtx, 0);
7120               multval = -multval;
7121             }
7122           multval = trunc_int_for_mode (multval, mode);
7123           new_rtx = gen_rtx_MULT (mode, new_rtx, GEN_INT (multval));
7124         }
7125       break;
7126
7127     case PLUS:
7128       lhs = XEXP (x, 0);
7129       rhs = XEXP (x, 1);
7130       lhs = make_compound_operation (lhs, MEM);
7131       rhs = make_compound_operation (rhs, MEM);
7132       if (GET_CODE (lhs) == MULT && GET_CODE (XEXP (lhs, 0)) == NEG
7133           && SCALAR_INT_MODE_P (mode))
7134         {
7135           tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (lhs, 0), 0),
7136                                      XEXP (lhs, 1));
7137           new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7138         }
7139       else if (GET_CODE (lhs) == MULT
7140                && (CONST_INT_P (XEXP (lhs, 1)) && INTVAL (XEXP (lhs, 1)) < 0))
7141         {
7142           tem = simplify_gen_binary (MULT, mode, XEXP (lhs, 0),
7143                                      simplify_gen_unary (NEG, mode,
7144                                                          XEXP (lhs, 1),
7145                                                          mode));
7146           new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7147         }
7148       else
7149         {
7150           SUBST (XEXP (x, 0), lhs);
7151           SUBST (XEXP (x, 1), rhs);
7152           goto maybe_swap;
7153         }
7154       x = gen_lowpart (mode, new_rtx);
7155       goto maybe_swap;
7156
7157     case MINUS:
7158       lhs = XEXP (x, 0);
7159       rhs = XEXP (x, 1);
7160       lhs = make_compound_operation (lhs, MEM);
7161       rhs = make_compound_operation (rhs, MEM);
7162       if (GET_CODE (rhs) == MULT && GET_CODE (XEXP (rhs, 0)) == NEG
7163           && SCALAR_INT_MODE_P (mode))
7164         {
7165           tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (rhs, 0), 0),
7166                                      XEXP (rhs, 1));
7167           new_rtx = simplify_gen_binary (PLUS, mode, tem, lhs);
7168         }
7169       else if (GET_CODE (rhs) == MULT
7170                && (CONST_INT_P (XEXP (rhs, 1)) && INTVAL (XEXP (rhs, 1)) < 0))
7171         {
7172           tem = simplify_gen_binary (MULT, mode, XEXP (rhs, 0),
7173                                      simplify_gen_unary (NEG, mode,
7174                                                          XEXP (rhs, 1),
7175                                                          mode));
7176           new_rtx = simplify_gen_binary (PLUS, mode, tem, lhs);
7177         }
7178       else
7179         {
7180           SUBST (XEXP (x, 0), lhs);
7181           SUBST (XEXP (x, 1), rhs);
7182           return x;
7183         }
7184       return gen_lowpart (mode, new_rtx);
7185
7186     case AND:
7187       /* If the second operand is not a constant, we can't do anything
7188          with it.  */
7189       if (!CONST_INT_P (XEXP (x, 1)))
7190         break;
7191
7192       /* If the constant is a power of two minus one and the first operand
7193          is a logical right shift, make an extraction.  */
7194       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7195           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7196         {
7197           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7198           new_rtx = make_extraction (mode, new_rtx, 0, XEXP (XEXP (x, 0), 1), i, 1,
7199                                  0, in_code == COMPARE);
7200         }
7201
7202       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
7203       else if (GET_CODE (XEXP (x, 0)) == SUBREG
7204                && subreg_lowpart_p (XEXP (x, 0))
7205                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
7206                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7207         {
7208           new_rtx = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
7209                                          next_code);
7210           new_rtx = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new_rtx, 0,
7211                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
7212                                  0, in_code == COMPARE);
7213         }
7214       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
7215       else if ((GET_CODE (XEXP (x, 0)) == XOR
7216                 || GET_CODE (XEXP (x, 0)) == IOR)
7217                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
7218                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
7219                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7220         {
7221           /* Apply the distributive law, and then try to make extractions.  */
7222           new_rtx = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
7223                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
7224                                              XEXP (x, 1)),
7225                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
7226                                              XEXP (x, 1)));
7227           new_rtx = make_compound_operation (new_rtx, in_code);
7228         }
7229
7230       /* If we are have (and (rotate X C) M) and C is larger than the number
7231          of bits in M, this is an extraction.  */
7232
7233       else if (GET_CODE (XEXP (x, 0)) == ROTATE
7234                && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7235                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
7236                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
7237         {
7238           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7239           new_rtx = make_extraction (mode, new_rtx,
7240                                  (GET_MODE_BITSIZE (mode)
7241                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
7242                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
7243         }
7244
7245       /* On machines without logical shifts, if the operand of the AND is
7246          a logical shift and our mask turns off all the propagated sign
7247          bits, we can replace the logical shift with an arithmetic shift.  */
7248       else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7249                && !have_insn_for (LSHIFTRT, mode)
7250                && have_insn_for (ASHIFTRT, mode)
7251                && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7252                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7253                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7254                && mode_width <= HOST_BITS_PER_WIDE_INT)
7255         {
7256           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
7257
7258           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
7259           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
7260             SUBST (XEXP (x, 0),
7261                    gen_rtx_ASHIFTRT (mode,
7262                                      make_compound_operation
7263                                      (XEXP (XEXP (x, 0), 0), next_code),
7264                                      XEXP (XEXP (x, 0), 1)));
7265         }
7266
7267       /* If the constant is one less than a power of two, this might be
7268          representable by an extraction even if no shift is present.
7269          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
7270          we are in a COMPARE.  */
7271       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7272         new_rtx = make_extraction (mode,
7273                                make_compound_operation (XEXP (x, 0),
7274                                                         next_code),
7275                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
7276
7277       /* If we are in a comparison and this is an AND with a power of two,
7278          convert this into the appropriate bit extract.  */
7279       else if (in_code == COMPARE
7280                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
7281         new_rtx = make_extraction (mode,
7282                                make_compound_operation (XEXP (x, 0),
7283                                                         next_code),
7284                                i, NULL_RTX, 1, 1, 0, 1);
7285
7286       break;
7287
7288     case LSHIFTRT:
7289       /* If the sign bit is known to be zero, replace this with an
7290          arithmetic shift.  */
7291       if (have_insn_for (ASHIFTRT, mode)
7292           && ! have_insn_for (LSHIFTRT, mode)
7293           && mode_width <= HOST_BITS_PER_WIDE_INT
7294           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
7295         {
7296           new_rtx = gen_rtx_ASHIFTRT (mode,
7297                                   make_compound_operation (XEXP (x, 0),
7298                                                            next_code),
7299                                   XEXP (x, 1));
7300           break;
7301         }
7302
7303       /* ... fall through ...  */
7304
7305     case ASHIFTRT:
7306       lhs = XEXP (x, 0);
7307       rhs = XEXP (x, 1);
7308
7309       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
7310          this is a SIGN_EXTRACT.  */
7311       if (CONST_INT_P (rhs)
7312           && GET_CODE (lhs) == ASHIFT
7313           && CONST_INT_P (XEXP (lhs, 1))
7314           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
7315           && INTVAL (rhs) < mode_width)
7316         {
7317           new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
7318           new_rtx = make_extraction (mode, new_rtx,
7319                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
7320                                  NULL_RTX, mode_width - INTVAL (rhs),
7321                                  code == LSHIFTRT, 0, in_code == COMPARE);
7322           break;
7323         }
7324
7325       /* See if we have operations between an ASHIFTRT and an ASHIFT.
7326          If so, try to merge the shifts into a SIGN_EXTEND.  We could
7327          also do this for some cases of SIGN_EXTRACT, but it doesn't
7328          seem worth the effort; the case checked for occurs on Alpha.  */
7329
7330       if (!OBJECT_P (lhs)
7331           && ! (GET_CODE (lhs) == SUBREG
7332                 && (OBJECT_P (SUBREG_REG (lhs))))
7333           && CONST_INT_P (rhs)
7334           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
7335           && INTVAL (rhs) < mode_width
7336           && (new_rtx = extract_left_shift (lhs, INTVAL (rhs))) != 0)
7337         new_rtx = make_extraction (mode, make_compound_operation (new_rtx, next_code),
7338                                0, NULL_RTX, mode_width - INTVAL (rhs),
7339                                code == LSHIFTRT, 0, in_code == COMPARE);
7340
7341       break;
7342
7343     case SUBREG:
7344       /* Call ourselves recursively on the inner expression.  If we are
7345          narrowing the object and it has a different RTL code from
7346          what it originally did, do this SUBREG as a force_to_mode.  */
7347       {
7348         rtx inner = SUBREG_REG (x), simplified;
7349         
7350         tem = make_compound_operation (inner, in_code);
7351
7352         simplified
7353           = simplify_subreg (mode, tem, GET_MODE (inner), SUBREG_BYTE (x));
7354         if (simplified)
7355           tem = simplified;
7356
7357         if (GET_CODE (tem) != GET_CODE (inner)
7358             && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner))
7359             && subreg_lowpart_p (x))
7360           {
7361             rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0, 0);
7362
7363             /* If we have something other than a SUBREG, we might have
7364                done an expansion, so rerun ourselves.  */
7365             if (GET_CODE (newer) != SUBREG)
7366               newer = make_compound_operation (newer, in_code);
7367
7368             /* force_to_mode can expand compounds.  If it just re-expanded the
7369                compound, use gen_lowpart to convert to the desired mode.  */
7370             if (rtx_equal_p (newer, x)
7371                 /* Likewise if it re-expanded the compound only partially.
7372                    This happens for SUBREG of ZERO_EXTRACT if they extract
7373                    the same number of bits.  */
7374                 || (GET_CODE (newer) == SUBREG
7375                     && (GET_CODE (SUBREG_REG (newer)) == LSHIFTRT
7376                         || GET_CODE (SUBREG_REG (newer)) == ASHIFTRT)
7377                     && GET_CODE (inner) == AND
7378                     && rtx_equal_p (SUBREG_REG (newer), XEXP (inner, 0))))
7379               return gen_lowpart (GET_MODE (x), tem);
7380
7381             return newer;
7382           }
7383
7384         if (simplified)
7385           return tem;
7386       }
7387       break;
7388
7389     default:
7390       break;
7391     }
7392
7393   if (new_rtx)
7394     {
7395       x = gen_lowpart (mode, new_rtx);
7396       code = GET_CODE (x);
7397     }
7398
7399   /* Now recursively process each operand of this operation.  */
7400   fmt = GET_RTX_FORMAT (code);
7401   for (i = 0; i < GET_RTX_LENGTH (code); i++)
7402     if (fmt[i] == 'e')
7403       {
7404         new_rtx = make_compound_operation (XEXP (x, i), next_code);
7405         SUBST (XEXP (x, i), new_rtx);
7406       }
7407     else if (fmt[i] == 'E')
7408       for (j = 0; j < XVECLEN (x, i); j++)
7409         {
7410           new_rtx = make_compound_operation (XVECEXP (x, i, j), next_code);
7411           SUBST (XVECEXP (x, i, j), new_rtx);
7412         }
7413
7414  maybe_swap:
7415   /* If this is a commutative operation, the changes to the operands
7416      may have made it noncanonical.  */
7417   if (COMMUTATIVE_ARITH_P (x)
7418       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
7419     {
7420       tem = XEXP (x, 0);
7421       SUBST (XEXP (x, 0), XEXP (x, 1));
7422       SUBST (XEXP (x, 1), tem);
7423     }
7424
7425   return x;
7426 }
7427 \f
7428 /* Given M see if it is a value that would select a field of bits
7429    within an item, but not the entire word.  Return -1 if not.
7430    Otherwise, return the starting position of the field, where 0 is the
7431    low-order bit.
7432
7433    *PLEN is set to the length of the field.  */
7434
7435 static int
7436 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
7437 {
7438   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
7439   int pos = m ? ctz_hwi (m) : -1;
7440   int len = 0;
7441
7442   if (pos >= 0)
7443     /* Now shift off the low-order zero bits and see if we have a
7444        power of two minus 1.  */
7445     len = exact_log2 ((m >> pos) + 1);
7446
7447   if (len <= 0)
7448     pos = -1;
7449
7450   *plen = len;
7451   return pos;
7452 }
7453 \f
7454 /* If X refers to a register that equals REG in value, replace these
7455    references with REG.  */
7456 static rtx
7457 canon_reg_for_combine (rtx x, rtx reg)
7458 {
7459   rtx op0, op1, op2;
7460   const char *fmt;
7461   int i;
7462   bool copied;
7463
7464   enum rtx_code code = GET_CODE (x);
7465   switch (GET_RTX_CLASS (code))
7466     {
7467     case RTX_UNARY:
7468       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7469       if (op0 != XEXP (x, 0))
7470         return simplify_gen_unary (GET_CODE (x), GET_MODE (x), op0,
7471                                    GET_MODE (reg));
7472       break;
7473
7474     case RTX_BIN_ARITH:
7475     case RTX_COMM_ARITH:
7476       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7477       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7478       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7479         return simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
7480       break;
7481
7482     case RTX_COMPARE:
7483     case RTX_COMM_COMPARE:
7484       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7485       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7486       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7487         return simplify_gen_relational (GET_CODE (x), GET_MODE (x),
7488                                         GET_MODE (op0), op0, op1);
7489       break;
7490
7491     case RTX_TERNARY:
7492     case RTX_BITFIELD_OPS:
7493       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7494       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7495       op2 = canon_reg_for_combine (XEXP (x, 2), reg);
7496       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1) || op2 != XEXP (x, 2))
7497         return simplify_gen_ternary (GET_CODE (x), GET_MODE (x),
7498                                      GET_MODE (op0), op0, op1, op2);
7499
7500     case RTX_OBJ:
7501       if (REG_P (x))
7502         {
7503           if (rtx_equal_p (get_last_value (reg), x)
7504               || rtx_equal_p (reg, get_last_value (x)))
7505             return reg;
7506           else
7507             break;
7508         }
7509
7510       /* fall through */
7511
7512     default:
7513       fmt = GET_RTX_FORMAT (code);
7514       copied = false;
7515       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7516         if (fmt[i] == 'e')
7517           {
7518             rtx op = canon_reg_for_combine (XEXP (x, i), reg);
7519             if (op != XEXP (x, i))
7520               {
7521                 if (!copied)
7522                   {
7523                     copied = true;
7524                     x = copy_rtx (x);
7525                   }
7526                 XEXP (x, i) = op;
7527               }
7528           }
7529         else if (fmt[i] == 'E')
7530           {
7531             int j;
7532             for (j = 0; j < XVECLEN (x, i); j++)
7533               {
7534                 rtx op = canon_reg_for_combine (XVECEXP (x, i, j), reg);
7535                 if (op != XVECEXP (x, i, j))
7536                   {
7537                     if (!copied)
7538                       {
7539                         copied = true;
7540                         x = copy_rtx (x);
7541                       }
7542                     XVECEXP (x, i, j) = op;
7543                   }
7544               }
7545           }
7546
7547       break;
7548     }
7549
7550   return x;
7551 }
7552
7553 /* Return X converted to MODE.  If the value is already truncated to
7554    MODE we can just return a subreg even though in the general case we
7555    would need an explicit truncation.  */
7556
7557 static rtx
7558 gen_lowpart_or_truncate (enum machine_mode mode, rtx x)
7559 {
7560   if (!CONST_INT_P (x)
7561       && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x))
7562       && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
7563                                  GET_MODE_BITSIZE (GET_MODE (x)))
7564       && !(REG_P (x) && reg_truncated_to_mode (mode, x)))
7565     {
7566       /* Bit-cast X into an integer mode.  */
7567       if (!SCALAR_INT_MODE_P (GET_MODE (x)))
7568         x = gen_lowpart (int_mode_for_mode (GET_MODE (x)), x);
7569       x = simplify_gen_unary (TRUNCATE, int_mode_for_mode (mode),
7570                               x, GET_MODE (x));
7571     }
7572
7573   return gen_lowpart (mode, x);
7574 }
7575
7576 /* See if X can be simplified knowing that we will only refer to it in
7577    MODE and will only refer to those bits that are nonzero in MASK.
7578    If other bits are being computed or if masking operations are done
7579    that select a superset of the bits in MASK, they can sometimes be
7580    ignored.
7581
7582    Return a possibly simplified expression, but always convert X to
7583    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
7584
7585    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
7586    are all off in X.  This is used when X will be complemented, by either
7587    NOT, NEG, or XOR.  */
7588
7589 static rtx
7590 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
7591                int just_select)
7592 {
7593   enum rtx_code code = GET_CODE (x);
7594   int next_select = just_select || code == XOR || code == NOT || code == NEG;
7595   enum machine_mode op_mode;
7596   unsigned HOST_WIDE_INT fuller_mask, nonzero;
7597   rtx op0, op1, temp;
7598
7599   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
7600      code below will do the wrong thing since the mode of such an
7601      expression is VOIDmode.
7602
7603      Also do nothing if X is a CLOBBER; this can happen if X was
7604      the return value from a call to gen_lowpart.  */
7605   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
7606     return x;
7607
7608   /* We want to perform the operation is its present mode unless we know
7609      that the operation is valid in MODE, in which case we do the operation
7610      in MODE.  */
7611   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
7612               && have_insn_for (code, mode))
7613              ? mode : GET_MODE (x));
7614
7615   /* It is not valid to do a right-shift in a narrower mode
7616      than the one it came in with.  */
7617   if ((code == LSHIFTRT || code == ASHIFTRT)
7618       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
7619     op_mode = GET_MODE (x);
7620
7621   /* Truncate MASK to fit OP_MODE.  */
7622   if (op_mode)
7623     mask &= GET_MODE_MASK (op_mode);
7624
7625   /* When we have an arithmetic operation, or a shift whose count we
7626      do not know, we need to assume that all bits up to the highest-order
7627      bit in MASK will be needed.  This is how we form such a mask.  */
7628   if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
7629     fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
7630   else
7631     fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
7632                    - 1);
7633
7634   /* Determine what bits of X are guaranteed to be (non)zero.  */
7635   nonzero = nonzero_bits (x, mode);
7636
7637   /* If none of the bits in X are needed, return a zero.  */
7638   if (!just_select && (nonzero & mask) == 0 && !side_effects_p (x))
7639     x = const0_rtx;
7640
7641   /* If X is a CONST_INT, return a new one.  Do this here since the
7642      test below will fail.  */
7643   if (CONST_INT_P (x))
7644     {
7645       if (SCALAR_INT_MODE_P (mode))
7646         return gen_int_mode (INTVAL (x) & mask, mode);
7647       else
7648         {
7649           x = GEN_INT (INTVAL (x) & mask);
7650           return gen_lowpart_common (mode, x);
7651         }
7652     }
7653
7654   /* If X is narrower than MODE and we want all the bits in X's mode, just
7655      get X in the proper mode.  */
7656   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
7657       && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
7658     return gen_lowpart (mode, x);
7659
7660   /* We can ignore the effect of a SUBREG if it narrows the mode or
7661      if the constant masks to zero all the bits the mode doesn't have.  */
7662   if (GET_CODE (x) == SUBREG
7663       && subreg_lowpart_p (x)
7664       && ((GET_MODE_SIZE (GET_MODE (x))
7665            < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
7666           || (0 == (mask
7667                     & GET_MODE_MASK (GET_MODE (x))
7668                     & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
7669     return force_to_mode (SUBREG_REG (x), mode, mask, next_select);
7670
7671   /* The arithmetic simplifications here only work for scalar integer modes.  */
7672   if (!SCALAR_INT_MODE_P (mode) || !SCALAR_INT_MODE_P (GET_MODE (x)))
7673     return gen_lowpart_or_truncate (mode, x);
7674
7675   switch (code)
7676     {
7677     case CLOBBER:
7678       /* If X is a (clobber (const_int)), return it since we know we are
7679          generating something that won't match.  */
7680       return x;
7681
7682     case SIGN_EXTEND:
7683     case ZERO_EXTEND:
7684     case ZERO_EXTRACT:
7685     case SIGN_EXTRACT:
7686       x = expand_compound_operation (x);
7687       if (GET_CODE (x) != code)
7688         return force_to_mode (x, mode, mask, next_select);
7689       break;
7690
7691     case TRUNCATE:
7692       /* Similarly for a truncate.  */
7693       return force_to_mode (XEXP (x, 0), mode, mask, next_select);
7694
7695     case AND:
7696       /* If this is an AND with a constant, convert it into an AND
7697          whose constant is the AND of that constant with MASK.  If it
7698          remains an AND of MASK, delete it since it is redundant.  */
7699
7700       if (CONST_INT_P (XEXP (x, 1)))
7701         {
7702           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
7703                                       mask & INTVAL (XEXP (x, 1)));
7704
7705           /* If X is still an AND, see if it is an AND with a mask that
7706              is just some low-order bits.  If so, and it is MASK, we don't
7707              need it.  */
7708
7709           if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
7710               && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
7711                   == mask))
7712             x = XEXP (x, 0);
7713
7714           /* If it remains an AND, try making another AND with the bits
7715              in the mode mask that aren't in MASK turned on.  If the
7716              constant in the AND is wide enough, this might make a
7717              cheaper constant.  */
7718
7719           if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
7720               && GET_MODE_MASK (GET_MODE (x)) != mask
7721               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
7722             {
7723               HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
7724                                     | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
7725               int width = GET_MODE_BITSIZE (GET_MODE (x));
7726               rtx y;
7727
7728               /* If MODE is narrower than HOST_WIDE_INT and CVAL is a negative
7729                  number, sign extend it.  */
7730               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
7731                   && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7732                 cval |= (HOST_WIDE_INT) -1 << width;
7733
7734               y = simplify_gen_binary (AND, GET_MODE (x),
7735                                        XEXP (x, 0), GEN_INT (cval));
7736               if (rtx_cost (y, SET, optimize_this_for_speed_p)
7737                   < rtx_cost (x, SET, optimize_this_for_speed_p))
7738                 x = y;
7739             }
7740
7741           break;
7742         }
7743
7744       goto binop;
7745
7746     case PLUS:
7747       /* In (and (plus FOO C1) M), if M is a mask that just turns off
7748          low-order bits (as in an alignment operation) and FOO is already
7749          aligned to that boundary, mask C1 to that boundary as well.
7750          This may eliminate that PLUS and, later, the AND.  */
7751
7752       {
7753         unsigned int width = GET_MODE_BITSIZE (mode);
7754         unsigned HOST_WIDE_INT smask = mask;
7755
7756         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
7757            number, sign extend it.  */
7758
7759         if (width < HOST_BITS_PER_WIDE_INT
7760             && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7761           smask |= (HOST_WIDE_INT) -1 << width;
7762
7763         if (CONST_INT_P (XEXP (x, 1))
7764             && exact_log2 (- smask) >= 0
7765             && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
7766             && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
7767           return force_to_mode (plus_constant (XEXP (x, 0),
7768                                                (INTVAL (XEXP (x, 1)) & smask)),
7769                                 mode, smask, next_select);
7770       }
7771
7772       /* ... fall through ...  */
7773
7774     case MULT:
7775       /* For PLUS, MINUS and MULT, we need any bits less significant than the
7776          most significant bit in MASK since carries from those bits will
7777          affect the bits we are interested in.  */
7778       mask = fuller_mask;
7779       goto binop;
7780
7781     case MINUS:
7782       /* If X is (minus C Y) where C's least set bit is larger than any bit
7783          in the mask, then we may replace with (neg Y).  */
7784       if (CONST_INT_P (XEXP (x, 0))
7785           && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
7786                                         & -INTVAL (XEXP (x, 0))))
7787               > mask))
7788         {
7789           x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
7790                                   GET_MODE (x));
7791           return force_to_mode (x, mode, mask, next_select);
7792         }
7793
7794       /* Similarly, if C contains every bit in the fuller_mask, then we may
7795          replace with (not Y).  */
7796       if (CONST_INT_P (XEXP (x, 0))
7797           && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) fuller_mask)
7798               == INTVAL (XEXP (x, 0))))
7799         {
7800           x = simplify_gen_unary (NOT, GET_MODE (x),
7801                                   XEXP (x, 1), GET_MODE (x));
7802           return force_to_mode (x, mode, mask, next_select);
7803         }
7804
7805       mask = fuller_mask;
7806       goto binop;
7807
7808     case IOR:
7809     case XOR:
7810       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
7811          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
7812          operation which may be a bitfield extraction.  Ensure that the
7813          constant we form is not wider than the mode of X.  */
7814
7815       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7816           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7817           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7818           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7819           && CONST_INT_P (XEXP (x, 1))
7820           && ((INTVAL (XEXP (XEXP (x, 0), 1))
7821                + floor_log2 (INTVAL (XEXP (x, 1))))
7822               < GET_MODE_BITSIZE (GET_MODE (x)))
7823           && (INTVAL (XEXP (x, 1))
7824               & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
7825         {
7826           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
7827                           << INTVAL (XEXP (XEXP (x, 0), 1)));
7828           temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
7829                                       XEXP (XEXP (x, 0), 0), temp);
7830           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
7831                                    XEXP (XEXP (x, 0), 1));
7832           return force_to_mode (x, mode, mask, next_select);
7833         }
7834
7835     binop:
7836       /* For most binary operations, just propagate into the operation and
7837          change the mode if we have an operation of that mode.  */
7838
7839       op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
7840       op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
7841
7842       /* If we ended up truncating both operands, truncate the result of the
7843          operation instead.  */
7844       if (GET_CODE (op0) == TRUNCATE
7845           && GET_CODE (op1) == TRUNCATE)
7846         {
7847           op0 = XEXP (op0, 0);
7848           op1 = XEXP (op1, 0);
7849         }
7850
7851       op0 = gen_lowpart_or_truncate (op_mode, op0);
7852       op1 = gen_lowpart_or_truncate (op_mode, op1);
7853
7854       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7855         x = simplify_gen_binary (code, op_mode, op0, op1);
7856       break;
7857
7858     case ASHIFT:
7859       /* For left shifts, do the same, but just for the first operand.
7860          However, we cannot do anything with shifts where we cannot
7861          guarantee that the counts are smaller than the size of the mode
7862          because such a count will have a different meaning in a
7863          wider mode.  */
7864
7865       if (! (CONST_INT_P (XEXP (x, 1))
7866              && INTVAL (XEXP (x, 1)) >= 0
7867              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
7868           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
7869                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
7870                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
7871         break;
7872
7873       /* If the shift count is a constant and we can do arithmetic in
7874          the mode of the shift, refine which bits we need.  Otherwise, use the
7875          conservative form of the mask.  */
7876       if (CONST_INT_P (XEXP (x, 1))
7877           && INTVAL (XEXP (x, 1)) >= 0
7878           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
7879           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7880         mask >>= INTVAL (XEXP (x, 1));
7881       else
7882         mask = fuller_mask;
7883
7884       op0 = gen_lowpart_or_truncate (op_mode,
7885                                      force_to_mode (XEXP (x, 0), op_mode,
7886                                                     mask, next_select));
7887
7888       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7889         x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
7890       break;
7891
7892     case LSHIFTRT:
7893       /* Here we can only do something if the shift count is a constant,
7894          this shift constant is valid for the host, and we can do arithmetic
7895          in OP_MODE.  */
7896
7897       if (CONST_INT_P (XEXP (x, 1))
7898           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7899           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7900         {
7901           rtx inner = XEXP (x, 0);
7902           unsigned HOST_WIDE_INT inner_mask;
7903
7904           /* Select the mask of the bits we need for the shift operand.  */
7905           inner_mask = mask << INTVAL (XEXP (x, 1));
7906
7907           /* We can only change the mode of the shift if we can do arithmetic
7908              in the mode of the shift and INNER_MASK is no wider than the
7909              width of X's mode.  */
7910           if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
7911             op_mode = GET_MODE (x);
7912
7913           inner = force_to_mode (inner, op_mode, inner_mask, next_select);
7914
7915           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
7916             x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
7917         }
7918
7919       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
7920          shift and AND produces only copies of the sign bit (C2 is one less
7921          than a power of two), we can do this with just a shift.  */
7922
7923       if (GET_CODE (x) == LSHIFTRT
7924           && CONST_INT_P (XEXP (x, 1))
7925           /* The shift puts one of the sign bit copies in the least significant
7926              bit.  */
7927           && ((INTVAL (XEXP (x, 1))
7928                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
7929               >= GET_MODE_BITSIZE (GET_MODE (x)))
7930           && exact_log2 (mask + 1) >= 0
7931           /* Number of bits left after the shift must be more than the mask
7932              needs.  */
7933           && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
7934               <= GET_MODE_BITSIZE (GET_MODE (x)))
7935           /* Must be more sign bit copies than the mask needs.  */
7936           && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
7937               >= exact_log2 (mask + 1)))
7938         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7939                                  GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
7940                                           - exact_log2 (mask + 1)));
7941
7942       goto shiftrt;
7943
7944     case ASHIFTRT:
7945       /* If we are just looking for the sign bit, we don't need this shift at
7946          all, even if it has a variable count.  */
7947       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7948           && (mask == ((unsigned HOST_WIDE_INT) 1
7949                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7950         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
7951
7952       /* If this is a shift by a constant, get a mask that contains those bits
7953          that are not copies of the sign bit.  We then have two cases:  If
7954          MASK only includes those bits, this can be a logical shift, which may
7955          allow simplifications.  If MASK is a single-bit field not within
7956          those bits, we are requesting a copy of the sign bit and hence can
7957          shift the sign bit to the appropriate location.  */
7958
7959       if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0
7960           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7961         {
7962           int i;
7963
7964           /* If the considered data is wider than HOST_WIDE_INT, we can't
7965              represent a mask for all its bits in a single scalar.
7966              But we only care about the lower bits, so calculate these.  */
7967
7968           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
7969             {
7970               nonzero = ~(HOST_WIDE_INT) 0;
7971
7972               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7973                  is the number of bits a full-width mask would have set.
7974                  We need only shift if these are fewer than nonzero can
7975                  hold.  If not, we must keep all bits set in nonzero.  */
7976
7977               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7978                   < HOST_BITS_PER_WIDE_INT)
7979                 nonzero >>= INTVAL (XEXP (x, 1))
7980                             + HOST_BITS_PER_WIDE_INT
7981                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
7982             }
7983           else
7984             {
7985               nonzero = GET_MODE_MASK (GET_MODE (x));
7986               nonzero >>= INTVAL (XEXP (x, 1));
7987             }
7988
7989           if ((mask & ~nonzero) == 0)
7990             {
7991               x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x),
7992                                         XEXP (x, 0), INTVAL (XEXP (x, 1)));
7993               if (GET_CODE (x) != ASHIFTRT)
7994                 return force_to_mode (x, mode, mask, next_select);
7995             }
7996
7997           else if ((i = exact_log2 (mask)) >= 0)
7998             {
7999               x = simplify_shift_const
8000                   (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
8001                    GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
8002
8003               if (GET_CODE (x) != ASHIFTRT)
8004                 return force_to_mode (x, mode, mask, next_select);
8005             }
8006         }
8007
8008       /* If MASK is 1, convert this to an LSHIFTRT.  This can be done
8009          even if the shift count isn't a constant.  */
8010       if (mask == 1)
8011         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8012                                  XEXP (x, 0), XEXP (x, 1));
8013
8014     shiftrt:
8015
8016       /* If this is a zero- or sign-extension operation that just affects bits
8017          we don't care about, remove it.  Be sure the call above returned
8018          something that is still a shift.  */
8019
8020       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
8021           && CONST_INT_P (XEXP (x, 1))
8022           && INTVAL (XEXP (x, 1)) >= 0
8023           && (INTVAL (XEXP (x, 1))
8024               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
8025           && GET_CODE (XEXP (x, 0)) == ASHIFT
8026           && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
8027         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
8028                               next_select);
8029
8030       break;
8031
8032     case ROTATE:
8033     case ROTATERT:
8034       /* If the shift count is constant and we can do computations
8035          in the mode of X, compute where the bits we care about are.
8036          Otherwise, we can't do anything.  Don't change the mode of
8037          the shift or propagate MODE into the shift, though.  */
8038       if (CONST_INT_P (XEXP (x, 1))
8039           && INTVAL (XEXP (x, 1)) >= 0)
8040         {
8041           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
8042                                             GET_MODE (x), GEN_INT (mask),
8043                                             XEXP (x, 1));
8044           if (temp && CONST_INT_P (temp))
8045             SUBST (XEXP (x, 0),
8046                    force_to_mode (XEXP (x, 0), GET_MODE (x),
8047                                   INTVAL (temp), next_select));
8048         }
8049       break;
8050
8051     case NEG:
8052       /* If we just want the low-order bit, the NEG isn't needed since it
8053          won't change the low-order bit.  */
8054       if (mask == 1)
8055         return force_to_mode (XEXP (x, 0), mode, mask, just_select);
8056
8057       /* We need any bits less significant than the most significant bit in
8058          MASK since carries from those bits will affect the bits we are
8059          interested in.  */
8060       mask = fuller_mask;
8061       goto unop;
8062
8063     case NOT:
8064       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
8065          same as the XOR case above.  Ensure that the constant we form is not
8066          wider than the mode of X.  */
8067
8068       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8069           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8070           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8071           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
8072               < GET_MODE_BITSIZE (GET_MODE (x)))
8073           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
8074         {
8075           temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
8076                                GET_MODE (x));
8077           temp = simplify_gen_binary (XOR, GET_MODE (x),
8078                                       XEXP (XEXP (x, 0), 0), temp);
8079           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8080                                    temp, XEXP (XEXP (x, 0), 1));
8081
8082           return force_to_mode (x, mode, mask, next_select);
8083         }
8084
8085       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
8086          use the full mask inside the NOT.  */
8087       mask = fuller_mask;
8088
8089     unop:
8090       op0 = gen_lowpart_or_truncate (op_mode,
8091                                      force_to_mode (XEXP (x, 0), mode, mask,
8092                                                     next_select));
8093       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8094         x = simplify_gen_unary (code, op_mode, op0, op_mode);
8095       break;
8096
8097     case NE:
8098       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
8099          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
8100          which is equal to STORE_FLAG_VALUE.  */
8101       if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
8102           && GET_MODE (XEXP (x, 0)) == mode
8103           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
8104           && (nonzero_bits (XEXP (x, 0), mode)
8105               == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
8106         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8107
8108       break;
8109
8110     case IF_THEN_ELSE:
8111       /* We have no way of knowing if the IF_THEN_ELSE can itself be
8112          written in a narrower mode.  We play it safe and do not do so.  */
8113
8114       SUBST (XEXP (x, 1),
8115              gen_lowpart_or_truncate (GET_MODE (x),
8116                                       force_to_mode (XEXP (x, 1), mode,
8117                                                      mask, next_select)));
8118       SUBST (XEXP (x, 2),
8119              gen_lowpart_or_truncate (GET_MODE (x),
8120                                       force_to_mode (XEXP (x, 2), mode,
8121                                                      mask, next_select)));
8122       break;
8123
8124     default:
8125       break;
8126     }
8127
8128   /* Ensure we return a value of the proper mode.  */
8129   return gen_lowpart_or_truncate (mode, x);
8130 }
8131 \f
8132 /* Return nonzero if X is an expression that has one of two values depending on
8133    whether some other value is zero or nonzero.  In that case, we return the
8134    value that is being tested, *PTRUE is set to the value if the rtx being
8135    returned has a nonzero value, and *PFALSE is set to the other alternative.
8136
8137    If we return zero, we set *PTRUE and *PFALSE to X.  */
8138
8139 static rtx
8140 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
8141 {
8142   enum machine_mode mode = GET_MODE (x);
8143   enum rtx_code code = GET_CODE (x);
8144   rtx cond0, cond1, true0, true1, false0, false1;
8145   unsigned HOST_WIDE_INT nz;
8146
8147   /* If we are comparing a value against zero, we are done.  */
8148   if ((code == NE || code == EQ)
8149       && XEXP (x, 1) == const0_rtx)
8150     {
8151       *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
8152       *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
8153       return XEXP (x, 0);
8154     }
8155
8156   /* If this is a unary operation whose operand has one of two values, apply
8157      our opcode to compute those values.  */
8158   else if (UNARY_P (x)
8159            && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
8160     {
8161       *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
8162       *pfalse = simplify_gen_unary (code, mode, false0,
8163                                     GET_MODE (XEXP (x, 0)));
8164       return cond0;
8165     }
8166
8167   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
8168      make can't possibly match and would suppress other optimizations.  */
8169   else if (code == COMPARE)
8170     ;
8171
8172   /* If this is a binary operation, see if either side has only one of two
8173      values.  If either one does or if both do and they are conditional on
8174      the same value, compute the new true and false values.  */
8175   else if (BINARY_P (x))
8176     {
8177       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
8178       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
8179
8180       if ((cond0 != 0 || cond1 != 0)
8181           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
8182         {
8183           /* If if_then_else_cond returned zero, then true/false are the
8184              same rtl.  We must copy one of them to prevent invalid rtl
8185              sharing.  */
8186           if (cond0 == 0)
8187             true0 = copy_rtx (true0);
8188           else if (cond1 == 0)
8189             true1 = copy_rtx (true1);
8190
8191           if (COMPARISON_P (x))
8192             {
8193               *ptrue = simplify_gen_relational (code, mode, VOIDmode,
8194                                                 true0, true1);
8195               *pfalse = simplify_gen_relational (code, mode, VOIDmode,
8196                                                  false0, false1);
8197              }
8198           else
8199             {
8200               *ptrue = simplify_gen_binary (code, mode, true0, true1);
8201               *pfalse = simplify_gen_binary (code, mode, false0, false1);
8202             }
8203
8204           return cond0 ? cond0 : cond1;
8205         }
8206
8207       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
8208          operands is zero when the other is nonzero, and vice-versa,
8209          and STORE_FLAG_VALUE is 1 or -1.  */
8210
8211       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8212           && (code == PLUS || code == IOR || code == XOR || code == MINUS
8213               || code == UMAX)
8214           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8215         {
8216           rtx op0 = XEXP (XEXP (x, 0), 1);
8217           rtx op1 = XEXP (XEXP (x, 1), 1);
8218
8219           cond0 = XEXP (XEXP (x, 0), 0);
8220           cond1 = XEXP (XEXP (x, 1), 0);
8221
8222           if (COMPARISON_P (cond0)
8223               && COMPARISON_P (cond1)
8224               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8225                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8226                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8227                   || ((swap_condition (GET_CODE (cond0))
8228                        == reversed_comparison_code (cond1, NULL))
8229                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8230                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8231               && ! side_effects_p (x))
8232             {
8233               *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
8234               *pfalse = simplify_gen_binary (MULT, mode,
8235                                              (code == MINUS
8236                                               ? simplify_gen_unary (NEG, mode,
8237                                                                     op1, mode)
8238                                               : op1),
8239                                               const_true_rtx);
8240               return cond0;
8241             }
8242         }
8243
8244       /* Similarly for MULT, AND and UMIN, except that for these the result
8245          is always zero.  */
8246       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8247           && (code == MULT || code == AND || code == UMIN)
8248           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8249         {
8250           cond0 = XEXP (XEXP (x, 0), 0);
8251           cond1 = XEXP (XEXP (x, 1), 0);
8252
8253           if (COMPARISON_P (cond0)
8254               && COMPARISON_P (cond1)
8255               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8256                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8257                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8258                   || ((swap_condition (GET_CODE (cond0))
8259                        == reversed_comparison_code (cond1, NULL))
8260                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8261                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8262               && ! side_effects_p (x))
8263             {
8264               *ptrue = *pfalse = const0_rtx;
8265               return cond0;
8266             }
8267         }
8268     }
8269
8270   else if (code == IF_THEN_ELSE)
8271     {
8272       /* If we have IF_THEN_ELSE already, extract the condition and
8273          canonicalize it if it is NE or EQ.  */
8274       cond0 = XEXP (x, 0);
8275       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
8276       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
8277         return XEXP (cond0, 0);
8278       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
8279         {
8280           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
8281           return XEXP (cond0, 0);
8282         }
8283       else
8284         return cond0;
8285     }
8286
8287   /* If X is a SUBREG, we can narrow both the true and false values
8288      if the inner expression, if there is a condition.  */
8289   else if (code == SUBREG
8290            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
8291                                                &true0, &false0)))
8292     {
8293       true0 = simplify_gen_subreg (mode, true0,
8294                                    GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8295       false0 = simplify_gen_subreg (mode, false0,
8296                                     GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8297       if (true0 && false0)
8298         {
8299           *ptrue = true0;
8300           *pfalse = false0;
8301           return cond0;
8302         }
8303     }
8304
8305   /* If X is a constant, this isn't special and will cause confusions
8306      if we treat it as such.  Likewise if it is equivalent to a constant.  */
8307   else if (CONSTANT_P (x)
8308            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
8309     ;
8310
8311   /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
8312      will be least confusing to the rest of the compiler.  */
8313   else if (mode == BImode)
8314     {
8315       *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
8316       return x;
8317     }
8318
8319   /* If X is known to be either 0 or -1, those are the true and
8320      false values when testing X.  */
8321   else if (x == constm1_rtx || x == const0_rtx
8322            || (mode != VOIDmode
8323                && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
8324     {
8325       *ptrue = constm1_rtx, *pfalse = const0_rtx;
8326       return x;
8327     }
8328
8329   /* Likewise for 0 or a single bit.  */
8330   else if (SCALAR_INT_MODE_P (mode)
8331            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8332            && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
8333     {
8334       *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
8335       return x;
8336     }
8337
8338   /* Otherwise fail; show no condition with true and false values the same.  */
8339   *ptrue = *pfalse = x;
8340   return 0;
8341 }
8342 \f
8343 /* Return the value of expression X given the fact that condition COND
8344    is known to be true when applied to REG as its first operand and VAL
8345    as its second.  X is known to not be shared and so can be modified in
8346    place.
8347
8348    We only handle the simplest cases, and specifically those cases that
8349    arise with IF_THEN_ELSE expressions.  */
8350
8351 static rtx
8352 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
8353 {
8354   enum rtx_code code = GET_CODE (x);
8355   rtx temp;
8356   const char *fmt;
8357   int i, j;
8358
8359   if (side_effects_p (x))
8360     return x;
8361
8362   /* If either operand of the condition is a floating point value,
8363      then we have to avoid collapsing an EQ comparison.  */
8364   if (cond == EQ
8365       && rtx_equal_p (x, reg)
8366       && ! FLOAT_MODE_P (GET_MODE (x))
8367       && ! FLOAT_MODE_P (GET_MODE (val)))
8368     return val;
8369
8370   if (cond == UNEQ && rtx_equal_p (x, reg))
8371     return val;
8372
8373   /* If X is (abs REG) and we know something about REG's relationship
8374      with zero, we may be able to simplify this.  */
8375
8376   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
8377     switch (cond)
8378       {
8379       case GE:  case GT:  case EQ:
8380         return XEXP (x, 0);
8381       case LT:  case LE:
8382         return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
8383                                    XEXP (x, 0),
8384                                    GET_MODE (XEXP (x, 0)));
8385       default:
8386         break;
8387       }
8388
8389   /* The only other cases we handle are MIN, MAX, and comparisons if the
8390      operands are the same as REG and VAL.  */
8391
8392   else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
8393     {
8394       if (rtx_equal_p (XEXP (x, 0), val))
8395         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
8396
8397       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
8398         {
8399           if (COMPARISON_P (x))
8400             {
8401               if (comparison_dominates_p (cond, code))
8402                 return const_true_rtx;
8403
8404               code = reversed_comparison_code (x, NULL);
8405               if (code != UNKNOWN
8406                   && comparison_dominates_p (cond, code))
8407                 return const0_rtx;
8408               else
8409                 return x;
8410             }
8411           else if (code == SMAX || code == SMIN
8412                    || code == UMIN || code == UMAX)
8413             {
8414               int unsignedp = (code == UMIN || code == UMAX);
8415
8416               /* Do not reverse the condition when it is NE or EQ.
8417                  This is because we cannot conclude anything about
8418                  the value of 'SMAX (x, y)' when x is not equal to y,
8419                  but we can when x equals y.  */
8420               if ((code == SMAX || code == UMAX)
8421                   && ! (cond == EQ || cond == NE))
8422                 cond = reverse_condition (cond);
8423
8424               switch (cond)
8425                 {
8426                 case GE:   case GT:
8427                   return unsignedp ? x : XEXP (x, 1);
8428                 case LE:   case LT:
8429                   return unsignedp ? x : XEXP (x, 0);
8430                 case GEU:  case GTU:
8431                   return unsignedp ? XEXP (x, 1) : x;
8432                 case LEU:  case LTU:
8433                   return unsignedp ? XEXP (x, 0) : x;
8434                 default:
8435                   break;
8436                 }
8437             }
8438         }
8439     }
8440   else if (code == SUBREG)
8441     {
8442       enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
8443       rtx new_rtx, r = known_cond (SUBREG_REG (x), cond, reg, val);
8444
8445       if (SUBREG_REG (x) != r)
8446         {
8447           /* We must simplify subreg here, before we lose track of the
8448              original inner_mode.  */
8449           new_rtx = simplify_subreg (GET_MODE (x), r,
8450                                  inner_mode, SUBREG_BYTE (x));
8451           if (new_rtx)
8452             return new_rtx;
8453           else
8454             SUBST (SUBREG_REG (x), r);
8455         }
8456
8457       return x;
8458     }
8459   /* We don't have to handle SIGN_EXTEND here, because even in the
8460      case of replacing something with a modeless CONST_INT, a
8461      CONST_INT is already (supposed to be) a valid sign extension for
8462      its narrower mode, which implies it's already properly
8463      sign-extended for the wider mode.  Now, for ZERO_EXTEND, the
8464      story is different.  */
8465   else if (code == ZERO_EXTEND)
8466     {
8467       enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
8468       rtx new_rtx, r = known_cond (XEXP (x, 0), cond, reg, val);
8469
8470       if (XEXP (x, 0) != r)
8471         {
8472           /* We must simplify the zero_extend here, before we lose
8473              track of the original inner_mode.  */
8474           new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
8475                                           r, inner_mode);
8476           if (new_rtx)
8477             return new_rtx;
8478           else
8479             SUBST (XEXP (x, 0), r);
8480         }
8481
8482       return x;
8483     }
8484
8485   fmt = GET_RTX_FORMAT (code);
8486   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8487     {
8488       if (fmt[i] == 'e')
8489         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
8490       else if (fmt[i] == 'E')
8491         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8492           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
8493                                                 cond, reg, val));
8494     }
8495
8496   return x;
8497 }
8498 \f
8499 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
8500    assignment as a field assignment.  */
8501
8502 static int
8503 rtx_equal_for_field_assignment_p (rtx x, rtx y)
8504 {
8505   if (x == y || rtx_equal_p (x, y))
8506     return 1;
8507
8508   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
8509     return 0;
8510
8511   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
8512      Note that all SUBREGs of MEM are paradoxical; otherwise they
8513      would have been rewritten.  */
8514   if (MEM_P (x) && GET_CODE (y) == SUBREG
8515       && MEM_P (SUBREG_REG (y))
8516       && rtx_equal_p (SUBREG_REG (y),
8517                       gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
8518     return 1;
8519
8520   if (MEM_P (y) && GET_CODE (x) == SUBREG
8521       && MEM_P (SUBREG_REG (x))
8522       && rtx_equal_p (SUBREG_REG (x),
8523                       gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
8524     return 1;
8525
8526   /* We used to see if get_last_value of X and Y were the same but that's
8527      not correct.  In one direction, we'll cause the assignment to have
8528      the wrong destination and in the case, we'll import a register into this
8529      insn that might have already have been dead.   So fail if none of the
8530      above cases are true.  */
8531   return 0;
8532 }
8533 \f
8534 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
8535    Return that assignment if so.
8536
8537    We only handle the most common cases.  */
8538
8539 static rtx
8540 make_field_assignment (rtx x)
8541 {
8542   rtx dest = SET_DEST (x);
8543   rtx src = SET_SRC (x);
8544   rtx assign;
8545   rtx rhs, lhs;
8546   HOST_WIDE_INT c1;
8547   HOST_WIDE_INT pos;
8548   unsigned HOST_WIDE_INT len;
8549   rtx other;
8550   enum machine_mode mode;
8551
8552   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
8553      a clear of a one-bit field.  We will have changed it to
8554      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
8555      for a SUBREG.  */
8556
8557   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
8558       && CONST_INT_P (XEXP (XEXP (src, 0), 0))
8559       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
8560       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8561     {
8562       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8563                                 1, 1, 1, 0);
8564       if (assign != 0)
8565         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8566       return x;
8567     }
8568
8569   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
8570       && subreg_lowpart_p (XEXP (src, 0))
8571       && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
8572           < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
8573       && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
8574       && CONST_INT_P (XEXP (SUBREG_REG (XEXP (src, 0)), 0))
8575       && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
8576       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8577     {
8578       assign = make_extraction (VOIDmode, dest, 0,
8579                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
8580                                 1, 1, 1, 0);
8581       if (assign != 0)
8582         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8583       return x;
8584     }
8585
8586   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
8587      one-bit field.  */
8588   if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
8589       && XEXP (XEXP (src, 0), 0) == const1_rtx
8590       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8591     {
8592       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8593                                 1, 1, 1, 0);
8594       if (assign != 0)
8595         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
8596       return x;
8597     }
8598
8599   /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
8600      SRC is an AND with all bits of that field set, then we can discard
8601      the AND.  */
8602   if (GET_CODE (dest) == ZERO_EXTRACT
8603       && CONST_INT_P (XEXP (dest, 1))
8604       && GET_CODE (src) == AND
8605       && CONST_INT_P (XEXP (src, 1)))
8606     {
8607       HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
8608       unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
8609       unsigned HOST_WIDE_INT ze_mask;
8610
8611       if (width >= HOST_BITS_PER_WIDE_INT)
8612         ze_mask = -1;
8613       else
8614         ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
8615
8616       /* Complete overlap.  We can remove the source AND.  */
8617       if ((and_mask & ze_mask) == ze_mask)
8618         return gen_rtx_SET (VOIDmode, dest, XEXP (src, 0));
8619
8620       /* Partial overlap.  We can reduce the source AND.  */
8621       if ((and_mask & ze_mask) != and_mask)
8622         {
8623           mode = GET_MODE (src);
8624           src = gen_rtx_AND (mode, XEXP (src, 0),
8625                              gen_int_mode (and_mask & ze_mask, mode));
8626           return gen_rtx_SET (VOIDmode, dest, src);
8627         }
8628     }
8629
8630   /* The other case we handle is assignments into a constant-position
8631      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
8632      a mask that has all one bits except for a group of zero bits and
8633      OTHER is known to have zeros where C1 has ones, this is such an
8634      assignment.  Compute the position and length from C1.  Shift OTHER
8635      to the appropriate position, force it to the required mode, and
8636      make the extraction.  Check for the AND in both operands.  */
8637
8638   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
8639     return x;
8640
8641   rhs = expand_compound_operation (XEXP (src, 0));
8642   lhs = expand_compound_operation (XEXP (src, 1));
8643
8644   if (GET_CODE (rhs) == AND
8645       && CONST_INT_P (XEXP (rhs, 1))
8646       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
8647     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
8648   else if (GET_CODE (lhs) == AND
8649            && CONST_INT_P (XEXP (lhs, 1))
8650            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
8651     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
8652   else
8653     return x;
8654
8655   pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
8656   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
8657       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
8658       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
8659     return x;
8660
8661   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
8662   if (assign == 0)
8663     return x;
8664
8665   /* The mode to use for the source is the mode of the assignment, or of
8666      what is inside a possible STRICT_LOW_PART.  */
8667   mode = (GET_CODE (assign) == STRICT_LOW_PART
8668           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
8669
8670   /* Shift OTHER right POS places and make it the source, restricting it
8671      to the proper length and mode.  */
8672
8673   src = canon_reg_for_combine (simplify_shift_const (NULL_RTX, LSHIFTRT,
8674                                                      GET_MODE (src),
8675                                                      other, pos),
8676                                dest);
8677   src = force_to_mode (src, mode,
8678                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
8679                        ? ~(unsigned HOST_WIDE_INT) 0
8680                        : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
8681                        0);
8682
8683   /* If SRC is masked by an AND that does not make a difference in
8684      the value being stored, strip it.  */
8685   if (GET_CODE (assign) == ZERO_EXTRACT
8686       && CONST_INT_P (XEXP (assign, 1))
8687       && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
8688       && GET_CODE (src) == AND
8689       && CONST_INT_P (XEXP (src, 1))
8690       && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (src, 1))
8691           == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1))
8692     src = XEXP (src, 0);
8693
8694   return gen_rtx_SET (VOIDmode, assign, src);
8695 }
8696 \f
8697 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
8698    if so.  */
8699
8700 static rtx
8701 apply_distributive_law (rtx x)
8702 {
8703   enum rtx_code code = GET_CODE (x);
8704   enum rtx_code inner_code;
8705   rtx lhs, rhs, other;
8706   rtx tem;
8707
8708   /* Distributivity is not true for floating point as it can change the
8709      value.  So we don't do it unless -funsafe-math-optimizations.  */
8710   if (FLOAT_MODE_P (GET_MODE (x))
8711       && ! flag_unsafe_math_optimizations)
8712     return x;
8713
8714   /* The outer operation can only be one of the following:  */
8715   if (code != IOR && code != AND && code != XOR
8716       && code != PLUS && code != MINUS)
8717     return x;
8718
8719   lhs = XEXP (x, 0);
8720   rhs = XEXP (x, 1);
8721
8722   /* If either operand is a primitive we can't do anything, so get out
8723      fast.  */
8724   if (OBJECT_P (lhs) || OBJECT_P (rhs))
8725     return x;
8726
8727   lhs = expand_compound_operation (lhs);
8728   rhs = expand_compound_operation (rhs);
8729   inner_code = GET_CODE (lhs);
8730   if (inner_code != GET_CODE (rhs))
8731     return x;
8732
8733   /* See if the inner and outer operations distribute.  */
8734   switch (inner_code)
8735     {
8736     case LSHIFTRT:
8737     case ASHIFTRT:
8738     case AND:
8739     case IOR:
8740       /* These all distribute except over PLUS.  */
8741       if (code == PLUS || code == MINUS)
8742         return x;
8743       break;
8744
8745     case MULT:
8746       if (code != PLUS && code != MINUS)
8747         return x;
8748       break;
8749
8750     case ASHIFT:
8751       /* This is also a multiply, so it distributes over everything.  */
8752       break;
8753
8754     case SUBREG:
8755       /* Non-paradoxical SUBREGs distributes over all operations,
8756          provided the inner modes and byte offsets are the same, this
8757          is an extraction of a low-order part, we don't convert an fp
8758          operation to int or vice versa, this is not a vector mode,
8759          and we would not be converting a single-word operation into a
8760          multi-word operation.  The latter test is not required, but
8761          it prevents generating unneeded multi-word operations.  Some
8762          of the previous tests are redundant given the latter test,
8763          but are retained because they are required for correctness.
8764
8765          We produce the result slightly differently in this case.  */
8766
8767       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
8768           || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
8769           || ! subreg_lowpart_p (lhs)
8770           || (GET_MODE_CLASS (GET_MODE (lhs))
8771               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
8772           || (GET_MODE_SIZE (GET_MODE (lhs))
8773               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
8774           || VECTOR_MODE_P (GET_MODE (lhs))
8775           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD
8776           /* Result might need to be truncated.  Don't change mode if
8777              explicit truncation is needed.  */
8778           || !TRULY_NOOP_TRUNCATION
8779                (GET_MODE_BITSIZE (GET_MODE (x)),
8780                 GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (lhs)))))
8781         return x;
8782
8783       tem = simplify_gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
8784                                  SUBREG_REG (lhs), SUBREG_REG (rhs));
8785       return gen_lowpart (GET_MODE (x), tem);
8786
8787     default:
8788       return x;
8789     }
8790
8791   /* Set LHS and RHS to the inner operands (A and B in the example
8792      above) and set OTHER to the common operand (C in the example).
8793      There is only one way to do this unless the inner operation is
8794      commutative.  */
8795   if (COMMUTATIVE_ARITH_P (lhs)
8796       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
8797     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
8798   else if (COMMUTATIVE_ARITH_P (lhs)
8799            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
8800     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
8801   else if (COMMUTATIVE_ARITH_P (lhs)
8802            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
8803     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
8804   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
8805     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
8806   else
8807     return x;
8808
8809   /* Form the new inner operation, seeing if it simplifies first.  */
8810   tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
8811
8812   /* There is one exception to the general way of distributing:
8813      (a | c) ^ (b | c) -> (a ^ b) & ~c  */
8814   if (code == XOR && inner_code == IOR)
8815     {
8816       inner_code = AND;
8817       other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
8818     }
8819
8820   /* We may be able to continuing distributing the result, so call
8821      ourselves recursively on the inner operation before forming the
8822      outer operation, which we return.  */
8823   return simplify_gen_binary (inner_code, GET_MODE (x),
8824                               apply_distributive_law (tem), other);
8825 }
8826
8827 /* See if X is of the form (* (+ A B) C), and if so convert to
8828    (+ (* A C) (* B C)) and try to simplify.
8829
8830    Most of the time, this results in no change.  However, if some of
8831    the operands are the same or inverses of each other, simplifications
8832    will result.
8833
8834    For example, (and (ior A B) (not B)) can occur as the result of
8835    expanding a bit field assignment.  When we apply the distributive
8836    law to this, we get (ior (and (A (not B))) (and (B (not B)))),
8837    which then simplifies to (and (A (not B))).
8838
8839    Note that no checks happen on the validity of applying the inverse
8840    distributive law.  This is pointless since we can do it in the
8841    few places where this routine is called.
8842
8843    N is the index of the term that is decomposed (the arithmetic operation,
8844    i.e. (+ A B) in the first example above).  !N is the index of the term that
8845    is distributed, i.e. of C in the first example above.  */
8846 static rtx
8847 distribute_and_simplify_rtx (rtx x, int n)
8848 {
8849   enum machine_mode mode;
8850   enum rtx_code outer_code, inner_code;
8851   rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
8852
8853   /* Distributivity is not true for floating point as it can change the
8854      value.  So we don't do it unless -funsafe-math-optimizations.  */
8855   if (FLOAT_MODE_P (GET_MODE (x))
8856       && ! flag_unsafe_math_optimizations)
8857     return NULL_RTX;
8858
8859   decomposed = XEXP (x, n);
8860   if (!ARITHMETIC_P (decomposed))
8861     return NULL_RTX;
8862
8863   mode = GET_MODE (x);
8864   outer_code = GET_CODE (x);
8865   distributed = XEXP (x, !n);
8866
8867   inner_code = GET_CODE (decomposed);
8868   inner_op0 = XEXP (decomposed, 0);
8869   inner_op1 = XEXP (decomposed, 1);
8870
8871   /* Special case (and (xor B C) (not A)), which is equivalent to
8872      (xor (ior A B) (ior A C))  */
8873   if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
8874     {
8875       distributed = XEXP (distributed, 0);
8876       outer_code = IOR;
8877     }
8878
8879   if (n == 0)
8880     {
8881       /* Distribute the second term.  */
8882       new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
8883       new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
8884     }
8885   else
8886     {
8887       /* Distribute the first term.  */
8888       new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
8889       new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
8890     }
8891
8892   tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
8893                                                      new_op0, new_op1));
8894   if (GET_CODE (tmp) != outer_code
8895       && rtx_cost (tmp, SET, optimize_this_for_speed_p)
8896          < rtx_cost (x, SET, optimize_this_for_speed_p))
8897     return tmp;
8898
8899   return NULL_RTX;
8900 }
8901 \f
8902 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
8903    in MODE.  Return an equivalent form, if different from (and VAROP
8904    (const_int CONSTOP)).  Otherwise, return NULL_RTX.  */
8905
8906 static rtx
8907 simplify_and_const_int_1 (enum machine_mode mode, rtx varop,
8908                           unsigned HOST_WIDE_INT constop)
8909 {
8910   unsigned HOST_WIDE_INT nonzero;
8911   unsigned HOST_WIDE_INT orig_constop;
8912   rtx orig_varop;
8913   int i;
8914
8915   orig_varop = varop;
8916   orig_constop = constop;
8917   if (GET_CODE (varop) == CLOBBER)
8918     return NULL_RTX;
8919
8920   /* Simplify VAROP knowing that we will be only looking at some of the
8921      bits in it.
8922
8923      Note by passing in CONSTOP, we guarantee that the bits not set in
8924      CONSTOP are not significant and will never be examined.  We must
8925      ensure that is the case by explicitly masking out those bits
8926      before returning.  */
8927   varop = force_to_mode (varop, mode, constop, 0);
8928
8929   /* If VAROP is a CLOBBER, we will fail so return it.  */
8930   if (GET_CODE (varop) == CLOBBER)
8931     return varop;
8932
8933   /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
8934      to VAROP and return the new constant.  */
8935   if (CONST_INT_P (varop))
8936     return gen_int_mode (INTVAL (varop) & constop, mode);
8937
8938   /* See what bits may be nonzero in VAROP.  Unlike the general case of
8939      a call to nonzero_bits, here we don't care about bits outside
8940      MODE.  */
8941
8942   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
8943
8944   /* Turn off all bits in the constant that are known to already be zero.
8945      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
8946      which is tested below.  */
8947
8948   constop &= nonzero;
8949
8950   /* If we don't have any bits left, return zero.  */
8951   if (constop == 0)
8952     return const0_rtx;
8953
8954   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
8955      a power of two, we can replace this with an ASHIFT.  */
8956   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
8957       && (i = exact_log2 (constop)) >= 0)
8958     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
8959
8960   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
8961      or XOR, then try to apply the distributive law.  This may eliminate
8962      operations if either branch can be simplified because of the AND.
8963      It may also make some cases more complex, but those cases probably
8964      won't match a pattern either with or without this.  */
8965
8966   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
8967     return
8968       gen_lowpart
8969         (mode,
8970          apply_distributive_law
8971          (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
8972                                simplify_and_const_int (NULL_RTX,
8973                                                        GET_MODE (varop),
8974                                                        XEXP (varop, 0),
8975                                                        constop),
8976                                simplify_and_const_int (NULL_RTX,
8977                                                        GET_MODE (varop),
8978                                                        XEXP (varop, 1),
8979                                                        constop))));
8980
8981   /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
8982      the AND and see if one of the operands simplifies to zero.  If so, we
8983      may eliminate it.  */
8984
8985   if (GET_CODE (varop) == PLUS
8986       && exact_log2 (constop + 1) >= 0)
8987     {
8988       rtx o0, o1;
8989
8990       o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
8991       o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
8992       if (o0 == const0_rtx)
8993         return o1;
8994       if (o1 == const0_rtx)
8995         return o0;
8996     }
8997
8998   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
8999   varop = gen_lowpart (mode, varop);
9000   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
9001     return NULL_RTX;
9002
9003   /* If we are only masking insignificant bits, return VAROP.  */
9004   if (constop == nonzero)
9005     return varop;
9006
9007   if (varop == orig_varop && constop == orig_constop)
9008     return NULL_RTX;
9009
9010   /* Otherwise, return an AND.  */
9011   return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode));
9012 }
9013
9014
9015 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
9016    in MODE.
9017
9018    Return an equivalent form, if different from X.  Otherwise, return X.  If
9019    X is zero, we are to always construct the equivalent form.  */
9020
9021 static rtx
9022 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
9023                         unsigned HOST_WIDE_INT constop)
9024 {
9025   rtx tem = simplify_and_const_int_1 (mode, varop, constop);
9026   if (tem)
9027     return tem;
9028
9029   if (!x)
9030     x = simplify_gen_binary (AND, GET_MODE (varop), varop,
9031                              gen_int_mode (constop, mode));
9032   if (GET_MODE (x) != mode)
9033     x = gen_lowpart (mode, x);
9034   return x;
9035 }
9036 \f
9037 /* Given a REG, X, compute which bits in X can be nonzero.
9038    We don't care about bits outside of those defined in MODE.
9039
9040    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
9041    a shift, AND, or zero_extract, we can do better.  */
9042
9043 static rtx
9044 reg_nonzero_bits_for_combine (const_rtx x, enum machine_mode mode,
9045                               const_rtx known_x ATTRIBUTE_UNUSED,
9046                               enum machine_mode known_mode ATTRIBUTE_UNUSED,
9047                               unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
9048                               unsigned HOST_WIDE_INT *nonzero)
9049 {
9050   rtx tem;
9051   reg_stat_type *rsp;
9052
9053   /* If X is a register whose nonzero bits value is current, use it.
9054      Otherwise, if X is a register whose value we can find, use that
9055      value.  Otherwise, use the previously-computed global nonzero bits
9056      for this register.  */
9057
9058   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
9059   if (rsp->last_set_value != 0
9060       && (rsp->last_set_mode == mode
9061           || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
9062               && GET_MODE_CLASS (mode) == MODE_INT))
9063       && ((rsp->last_set_label >= label_tick_ebb_start
9064            && rsp->last_set_label < label_tick)
9065           || (rsp->last_set_label == label_tick
9066               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9067           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9068               && REG_N_SETS (REGNO (x)) == 1
9069               && !REGNO_REG_SET_P
9070                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
9071     {
9072       *nonzero &= rsp->last_set_nonzero_bits;
9073       return NULL;
9074     }
9075
9076   tem = get_last_value (x);
9077
9078   if (tem)
9079     {
9080 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
9081       /* If X is narrower than MODE and TEM is a non-negative
9082          constant that would appear negative in the mode of X,
9083          sign-extend it for use in reg_nonzero_bits because some
9084          machines (maybe most) will actually do the sign-extension
9085          and this is the conservative approach.
9086
9087          ??? For 2.5, try to tighten up the MD files in this regard
9088          instead of this kludge.  */
9089
9090       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode)
9091           && CONST_INT_P (tem)
9092           && INTVAL (tem) > 0
9093           && 0 != (INTVAL (tem)
9094                    & ((HOST_WIDE_INT) 1
9095                       << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
9096         tem = GEN_INT (INTVAL (tem)
9097                        | ((HOST_WIDE_INT) (-1)
9098                           << GET_MODE_BITSIZE (GET_MODE (x))));
9099 #endif
9100       return tem;
9101     }
9102   else if (nonzero_sign_valid && rsp->nonzero_bits)
9103     {
9104       unsigned HOST_WIDE_INT mask = rsp->nonzero_bits;
9105
9106       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode))
9107         /* We don't know anything about the upper bits.  */
9108         mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
9109       *nonzero &= mask;
9110     }
9111
9112   return NULL;
9113 }
9114
9115 /* Return the number of bits at the high-order end of X that are known to
9116    be equal to the sign bit.  X will be used in mode MODE; if MODE is
9117    VOIDmode, X will be used in its own mode.  The returned value  will always
9118    be between 1 and the number of bits in MODE.  */
9119
9120 static rtx
9121 reg_num_sign_bit_copies_for_combine (const_rtx x, enum machine_mode mode,
9122                                      const_rtx known_x ATTRIBUTE_UNUSED,
9123                                      enum machine_mode known_mode
9124                                      ATTRIBUTE_UNUSED,
9125                                      unsigned int known_ret ATTRIBUTE_UNUSED,
9126                                      unsigned int *result)
9127 {
9128   rtx tem;
9129   reg_stat_type *rsp;
9130
9131   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
9132   if (rsp->last_set_value != 0
9133       && rsp->last_set_mode == mode
9134       && ((rsp->last_set_label >= label_tick_ebb_start
9135            && rsp->last_set_label < label_tick)
9136           || (rsp->last_set_label == label_tick
9137               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9138           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9139               && REG_N_SETS (REGNO (x)) == 1
9140               && !REGNO_REG_SET_P
9141                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
9142     {
9143       *result = rsp->last_set_sign_bit_copies;
9144       return NULL;
9145     }
9146
9147   tem = get_last_value (x);
9148   if (tem != 0)
9149     return tem;
9150
9151   if (nonzero_sign_valid && rsp->sign_bit_copies != 0
9152       && GET_MODE_BITSIZE (GET_MODE (x)) == GET_MODE_BITSIZE (mode))
9153     *result = rsp->sign_bit_copies;
9154
9155   return NULL;
9156 }
9157 \f
9158 /* Return the number of "extended" bits there are in X, when interpreted
9159    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
9160    unsigned quantities, this is the number of high-order zero bits.
9161    For signed quantities, this is the number of copies of the sign bit
9162    minus 1.  In both case, this function returns the number of "spare"
9163    bits.  For example, if two quantities for which this function returns
9164    at least 1 are added, the addition is known not to overflow.
9165
9166    This function will always return 0 unless called during combine, which
9167    implies that it must be called from a define_split.  */
9168
9169 unsigned int
9170 extended_count (const_rtx x, enum machine_mode mode, int unsignedp)
9171 {
9172   if (nonzero_sign_valid == 0)
9173     return 0;
9174
9175   return (unsignedp
9176           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9177              ? (unsigned int) (GET_MODE_BITSIZE (mode) - 1
9178                                - floor_log2 (nonzero_bits (x, mode)))
9179              : 0)
9180           : num_sign_bit_copies (x, mode) - 1);
9181 }
9182 \f
9183 /* This function is called from `simplify_shift_const' to merge two
9184    outer operations.  Specifically, we have already found that we need
9185    to perform operation *POP0 with constant *PCONST0 at the outermost
9186    position.  We would now like to also perform OP1 with constant CONST1
9187    (with *POP0 being done last).
9188
9189    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
9190    the resulting operation.  *PCOMP_P is set to 1 if we would need to
9191    complement the innermost operand, otherwise it is unchanged.
9192
9193    MODE is the mode in which the operation will be done.  No bits outside
9194    the width of this mode matter.  It is assumed that the width of this mode
9195    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
9196
9197    If *POP0 or OP1 are UNKNOWN, it means no operation is required.  Only NEG, PLUS,
9198    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
9199    result is simply *PCONST0.
9200
9201    If the resulting operation cannot be expressed as one operation, we
9202    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
9203
9204 static int
9205 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)
9206 {
9207   enum rtx_code op0 = *pop0;
9208   HOST_WIDE_INT const0 = *pconst0;
9209
9210   const0 &= GET_MODE_MASK (mode);
9211   const1 &= GET_MODE_MASK (mode);
9212
9213   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
9214   if (op0 == AND)
9215     const1 &= const0;
9216
9217   /* If OP0 or OP1 is UNKNOWN, this is easy.  Similarly if they are the same or
9218      if OP0 is SET.  */
9219
9220   if (op1 == UNKNOWN || op0 == SET)
9221     return 1;
9222
9223   else if (op0 == UNKNOWN)
9224     op0 = op1, const0 = const1;
9225
9226   else if (op0 == op1)
9227     {
9228       switch (op0)
9229         {
9230         case AND:
9231           const0 &= const1;
9232           break;
9233         case IOR:
9234           const0 |= const1;
9235           break;
9236         case XOR:
9237           const0 ^= const1;
9238           break;
9239         case PLUS:
9240           const0 += const1;
9241           break;
9242         case NEG:
9243           op0 = UNKNOWN;
9244           break;
9245         default:
9246           break;
9247         }
9248     }
9249
9250   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
9251   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
9252     return 0;
9253
9254   /* If the two constants aren't the same, we can't do anything.  The
9255      remaining six cases can all be done.  */
9256   else if (const0 != const1)
9257     return 0;
9258
9259   else
9260     switch (op0)
9261       {
9262       case IOR:
9263         if (op1 == AND)
9264           /* (a & b) | b == b */
9265           op0 = SET;
9266         else /* op1 == XOR */
9267           /* (a ^ b) | b == a | b */
9268           {;}
9269         break;
9270
9271       case XOR:
9272         if (op1 == AND)
9273           /* (a & b) ^ b == (~a) & b */
9274           op0 = AND, *pcomp_p = 1;
9275         else /* op1 == IOR */
9276           /* (a | b) ^ b == a & ~b */
9277           op0 = AND, const0 = ~const0;
9278         break;
9279
9280       case AND:
9281         if (op1 == IOR)
9282           /* (a | b) & b == b */
9283         op0 = SET;
9284         else /* op1 == XOR */
9285           /* (a ^ b) & b) == (~a) & b */
9286           *pcomp_p = 1;
9287         break;
9288       default:
9289         break;
9290       }
9291
9292   /* Check for NO-OP cases.  */
9293   const0 &= GET_MODE_MASK (mode);
9294   if (const0 == 0
9295       && (op0 == IOR || op0 == XOR || op0 == PLUS))
9296     op0 = UNKNOWN;
9297   else if (const0 == 0 && op0 == AND)
9298     op0 = SET;
9299   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
9300            && op0 == AND)
9301     op0 = UNKNOWN;
9302
9303   *pop0 = op0;
9304
9305   /* ??? Slightly redundant with the above mask, but not entirely.
9306      Moving this above means we'd have to sign-extend the mode mask
9307      for the final test.  */
9308   if (op0 != UNKNOWN && op0 != NEG)
9309     *pconst0 = trunc_int_for_mode (const0, mode);
9310
9311   return 1;
9312 }
9313 \f
9314 /* A helper to simplify_shift_const_1 to determine the mode we can perform
9315    the shift in.  The original shift operation CODE is performed on OP in
9316    ORIG_MODE.  Return the wider mode MODE if we can perform the operation
9317    in that mode.  Return ORIG_MODE otherwise.  We can also assume that the
9318    result of the shift is subject to operation OUTER_CODE with operand
9319    OUTER_CONST.  */
9320
9321 static enum machine_mode
9322 try_widen_shift_mode (enum rtx_code code, rtx op, int count,
9323                       enum machine_mode orig_mode, enum machine_mode mode,
9324                       enum rtx_code outer_code, HOST_WIDE_INT outer_const)
9325 {
9326   if (orig_mode == mode)
9327     return mode;
9328   gcc_assert (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (orig_mode));
9329
9330   /* In general we can't perform in wider mode for right shift and rotate.  */
9331   switch (code)
9332     {
9333     case ASHIFTRT:
9334       /* We can still widen if the bits brought in from the left are identical
9335          to the sign bit of ORIG_MODE.  */
9336       if (num_sign_bit_copies (op, mode)
9337           > (unsigned) (GET_MODE_BITSIZE (mode)
9338                         - GET_MODE_BITSIZE (orig_mode)))
9339         return mode;
9340       return orig_mode;
9341
9342     case LSHIFTRT:
9343       /* Similarly here but with zero bits.  */
9344       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9345           && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
9346         return mode;
9347
9348       /* We can also widen if the bits brought in will be masked off.  This
9349          operation is performed in ORIG_MODE.  */
9350       if (outer_code == AND)
9351         {
9352           int care_bits = low_bitmask_len (orig_mode, outer_const);
9353
9354           if (care_bits >= 0
9355               && GET_MODE_BITSIZE (orig_mode) - care_bits >= count)
9356             return mode;
9357         }
9358       /* fall through */
9359
9360     case ROTATE:
9361       return orig_mode;
9362
9363     case ROTATERT:
9364       gcc_unreachable ();
9365
9366     default:
9367       return mode;
9368     }
9369 }
9370
9371 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
9372    The result of the shift is RESULT_MODE.  Return NULL_RTX if we cannot
9373    simplify it.  Otherwise, return a simplified value.
9374
9375    The shift is normally computed in the widest mode we find in VAROP, as
9376    long as it isn't a different number of words than RESULT_MODE.  Exceptions
9377    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
9378
9379 static rtx
9380 simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode,
9381                         rtx varop, int orig_count)
9382 {
9383   enum rtx_code orig_code = code;
9384   rtx orig_varop = varop;
9385   int count;
9386   enum machine_mode mode = result_mode;
9387   enum machine_mode shift_mode, tmode;
9388   unsigned int mode_words
9389     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
9390   /* We form (outer_op (code varop count) (outer_const)).  */
9391   enum rtx_code outer_op = UNKNOWN;
9392   HOST_WIDE_INT outer_const = 0;
9393   int complement_p = 0;
9394   rtx new_rtx, x;
9395
9396   /* Make sure and truncate the "natural" shift on the way in.  We don't
9397      want to do this inside the loop as it makes it more difficult to
9398      combine shifts.  */
9399   if (SHIFT_COUNT_TRUNCATED)
9400     orig_count &= GET_MODE_BITSIZE (mode) - 1;
9401
9402   /* If we were given an invalid count, don't do anything except exactly
9403      what was requested.  */
9404
9405   if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
9406     return NULL_RTX;
9407
9408   count = orig_count;
9409
9410   /* Unless one of the branches of the `if' in this loop does a `continue',
9411      we will `break' the loop after the `if'.  */
9412
9413   while (count != 0)
9414     {
9415       /* If we have an operand of (clobber (const_int 0)), fail.  */
9416       if (GET_CODE (varop) == CLOBBER)
9417         return NULL_RTX;
9418
9419       /* Convert ROTATERT to ROTATE.  */
9420       if (code == ROTATERT)
9421         {
9422           unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
9423           code = ROTATE;
9424           if (VECTOR_MODE_P (result_mode))
9425             count = bitsize / GET_MODE_NUNITS (result_mode) - count;
9426           else
9427             count = bitsize - count;
9428         }
9429
9430       shift_mode = try_widen_shift_mode (code, varop, count, result_mode,
9431                                          mode, outer_op, outer_const);
9432
9433       /* Handle cases where the count is greater than the size of the mode
9434          minus 1.  For ASHIFT, use the size minus one as the count (this can
9435          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
9436          take the count modulo the size.  For other shifts, the result is
9437          zero.
9438
9439          Since these shifts are being produced by the compiler by combining
9440          multiple operations, each of which are defined, we know what the
9441          result is supposed to be.  */
9442
9443       if (count > (GET_MODE_BITSIZE (shift_mode) - 1))
9444         {
9445           if (code == ASHIFTRT)
9446             count = GET_MODE_BITSIZE (shift_mode) - 1;
9447           else if (code == ROTATE || code == ROTATERT)
9448             count %= GET_MODE_BITSIZE (shift_mode);
9449           else
9450             {
9451               /* We can't simply return zero because there may be an
9452                  outer op.  */
9453               varop = const0_rtx;
9454               count = 0;
9455               break;
9456             }
9457         }
9458
9459       /* If we discovered we had to complement VAROP, leave.  Making a NOT
9460          here would cause an infinite loop.  */
9461       if (complement_p)
9462         break;
9463
9464       /* An arithmetic right shift of a quantity known to be -1 or 0
9465          is a no-op.  */
9466       if (code == ASHIFTRT
9467           && (num_sign_bit_copies (varop, shift_mode)
9468               == GET_MODE_BITSIZE (shift_mode)))
9469         {
9470           count = 0;
9471           break;
9472         }
9473
9474       /* If we are doing an arithmetic right shift and discarding all but
9475          the sign bit copies, this is equivalent to doing a shift by the
9476          bitsize minus one.  Convert it into that shift because it will often
9477          allow other simplifications.  */
9478
9479       if (code == ASHIFTRT
9480           && (count + num_sign_bit_copies (varop, shift_mode)
9481               >= GET_MODE_BITSIZE (shift_mode)))
9482         count = GET_MODE_BITSIZE (shift_mode) - 1;
9483
9484       /* We simplify the tests below and elsewhere by converting
9485          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
9486          `make_compound_operation' will convert it to an ASHIFTRT for
9487          those machines (such as VAX) that don't have an LSHIFTRT.  */
9488       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9489           && code == ASHIFTRT
9490           && ((nonzero_bits (varop, shift_mode)
9491                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
9492               == 0))
9493         code = LSHIFTRT;
9494
9495       if (((code == LSHIFTRT
9496             && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9497             && !(nonzero_bits (varop, shift_mode) >> count))
9498            || (code == ASHIFT
9499                && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9500                && !((nonzero_bits (varop, shift_mode) << count)
9501                     & GET_MODE_MASK (shift_mode))))
9502           && !side_effects_p (varop))
9503         varop = const0_rtx;
9504
9505       switch (GET_CODE (varop))
9506         {
9507         case SIGN_EXTEND:
9508         case ZERO_EXTEND:
9509         case SIGN_EXTRACT:
9510         case ZERO_EXTRACT:
9511           new_rtx = expand_compound_operation (varop);
9512           if (new_rtx != varop)
9513             {
9514               varop = new_rtx;
9515               continue;
9516             }
9517           break;
9518
9519         case MEM:
9520           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
9521              minus the width of a smaller mode, we can do this with a
9522              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
9523           if ((code == ASHIFTRT || code == LSHIFTRT)
9524               && ! mode_dependent_address_p (XEXP (varop, 0))
9525               && ! MEM_VOLATILE_P (varop)
9526               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9527                                          MODE_INT, 1)) != BLKmode)
9528             {
9529               new_rtx = adjust_address_nv (varop, tmode,
9530                                        BYTES_BIG_ENDIAN ? 0
9531                                        : count / BITS_PER_UNIT);
9532
9533               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9534                                      : ZERO_EXTEND, mode, new_rtx);
9535               count = 0;
9536               continue;
9537             }
9538           break;
9539
9540         case SUBREG:
9541           /* If VAROP is a SUBREG, strip it as long as the inner operand has
9542              the same number of words as what we've seen so far.  Then store
9543              the widest mode in MODE.  */
9544           if (subreg_lowpart_p (varop)
9545               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9546                   > GET_MODE_SIZE (GET_MODE (varop)))
9547               && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9548                                   + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9549                  == mode_words)
9550             {
9551               varop = SUBREG_REG (varop);
9552               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9553                 mode = GET_MODE (varop);
9554               continue;
9555             }
9556           break;
9557
9558         case MULT:
9559           /* Some machines use MULT instead of ASHIFT because MULT
9560              is cheaper.  But it is still better on those machines to
9561              merge two shifts into one.  */
9562           if (CONST_INT_P (XEXP (varop, 1))
9563               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9564             {
9565               varop
9566                 = simplify_gen_binary (ASHIFT, GET_MODE (varop),
9567                                        XEXP (varop, 0),
9568                                        GEN_INT (exact_log2 (
9569                                                 INTVAL (XEXP (varop, 1)))));
9570               continue;
9571             }
9572           break;
9573
9574         case UDIV:
9575           /* Similar, for when divides are cheaper.  */
9576           if (CONST_INT_P (XEXP (varop, 1))
9577               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9578             {
9579               varop
9580                 = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
9581                                        XEXP (varop, 0),
9582                                        GEN_INT (exact_log2 (
9583                                                 INTVAL (XEXP (varop, 1)))));
9584               continue;
9585             }
9586           break;
9587
9588         case ASHIFTRT:
9589           /* If we are extracting just the sign bit of an arithmetic
9590              right shift, that shift is not needed.  However, the sign
9591              bit of a wider mode may be different from what would be
9592              interpreted as the sign bit in a narrower mode, so, if
9593              the result is narrower, don't discard the shift.  */
9594           if (code == LSHIFTRT
9595               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9596               && (GET_MODE_BITSIZE (result_mode)
9597                   >= GET_MODE_BITSIZE (GET_MODE (varop))))
9598             {
9599               varop = XEXP (varop, 0);
9600               continue;
9601             }
9602
9603           /* ... fall through ...  */
9604
9605         case LSHIFTRT:
9606         case ASHIFT:
9607         case ROTATE:
9608           /* Here we have two nested shifts.  The result is usually the
9609              AND of a new shift with a mask.  We compute the result below.  */
9610           if (CONST_INT_P (XEXP (varop, 1))
9611               && INTVAL (XEXP (varop, 1)) >= 0
9612               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
9613               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9614               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9615               && !VECTOR_MODE_P (result_mode))
9616             {
9617               enum rtx_code first_code = GET_CODE (varop);
9618               unsigned int first_count = INTVAL (XEXP (varop, 1));
9619               unsigned HOST_WIDE_INT mask;
9620               rtx mask_rtx;
9621
9622               /* We have one common special case.  We can't do any merging if
9623                  the inner code is an ASHIFTRT of a smaller mode.  However, if
9624                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
9625                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
9626                  we can convert it to
9627                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
9628                  This simplifies certain SIGN_EXTEND operations.  */
9629               if (code == ASHIFT && first_code == ASHIFTRT
9630                   && count == (GET_MODE_BITSIZE (result_mode)
9631                                - GET_MODE_BITSIZE (GET_MODE (varop))))
9632                 {
9633                   /* C3 has the low-order C1 bits zero.  */
9634
9635                   mask = (GET_MODE_MASK (mode)
9636                           & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
9637
9638                   varop = simplify_and_const_int (NULL_RTX, result_mode,
9639                                                   XEXP (varop, 0), mask);
9640                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
9641                                                 varop, count);
9642                   count = first_count;
9643                   code = ASHIFTRT;
9644                   continue;
9645                 }
9646
9647               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
9648                  than C1 high-order bits equal to the sign bit, we can convert
9649                  this to either an ASHIFT or an ASHIFTRT depending on the
9650                  two counts.
9651
9652                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
9653
9654               if (code == ASHIFTRT && first_code == ASHIFT
9655                   && GET_MODE (varop) == shift_mode
9656                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
9657                       > first_count))
9658                 {
9659                   varop = XEXP (varop, 0);
9660                   count -= first_count;
9661                   if (count < 0)
9662                     {
9663                       count = -count;
9664                       code = ASHIFT;
9665                     }
9666
9667                   continue;
9668                 }
9669
9670               /* There are some cases we can't do.  If CODE is ASHIFTRT,
9671                  we can only do this if FIRST_CODE is also ASHIFTRT.
9672
9673                  We can't do the case when CODE is ROTATE and FIRST_CODE is
9674                  ASHIFTRT.
9675
9676                  If the mode of this shift is not the mode of the outer shift,
9677                  we can't do this if either shift is a right shift or ROTATE.
9678
9679                  Finally, we can't do any of these if the mode is too wide
9680                  unless the codes are the same.
9681
9682                  Handle the case where the shift codes are the same
9683                  first.  */
9684
9685               if (code == first_code)
9686                 {
9687                   if (GET_MODE (varop) != result_mode
9688                       && (code == ASHIFTRT || code == LSHIFTRT
9689                           || code == ROTATE))
9690                     break;
9691
9692                   count += first_count;
9693                   varop = XEXP (varop, 0);
9694                   continue;
9695                 }
9696
9697               if (code == ASHIFTRT
9698                   || (code == ROTATE && first_code == ASHIFTRT)
9699                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
9700                   || (GET_MODE (varop) != result_mode
9701                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
9702                           || first_code == ROTATE
9703                           || code == ROTATE)))
9704                 break;
9705
9706               /* To compute the mask to apply after the shift, shift the
9707                  nonzero bits of the inner shift the same way the
9708                  outer shift will.  */
9709
9710               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
9711
9712               mask_rtx
9713                 = simplify_const_binary_operation (code, result_mode, mask_rtx,
9714                                                    GEN_INT (count));
9715
9716               /* Give up if we can't compute an outer operation to use.  */
9717               if (mask_rtx == 0
9718                   || !CONST_INT_P (mask_rtx)
9719                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
9720                                         INTVAL (mask_rtx),
9721                                         result_mode, &complement_p))
9722                 break;
9723
9724               /* If the shifts are in the same direction, we add the
9725                  counts.  Otherwise, we subtract them.  */
9726               if ((code == ASHIFTRT || code == LSHIFTRT)
9727                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
9728                 count += first_count;
9729               else
9730                 count -= first_count;
9731
9732               /* If COUNT is positive, the new shift is usually CODE,
9733                  except for the two exceptions below, in which case it is
9734                  FIRST_CODE.  If the count is negative, FIRST_CODE should
9735                  always be used  */
9736               if (count > 0
9737                   && ((first_code == ROTATE && code == ASHIFT)
9738                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
9739                 code = first_code;
9740               else if (count < 0)
9741                 code = first_code, count = -count;
9742
9743               varop = XEXP (varop, 0);
9744               continue;
9745             }
9746
9747           /* If we have (A << B << C) for any shift, we can convert this to
9748              (A << C << B).  This wins if A is a constant.  Only try this if
9749              B is not a constant.  */
9750
9751           else if (GET_CODE (varop) == code
9752                    && CONST_INT_P (XEXP (varop, 0))
9753                    && !CONST_INT_P (XEXP (varop, 1)))
9754             {
9755               rtx new_rtx = simplify_const_binary_operation (code, mode,
9756                                                          XEXP (varop, 0),
9757                                                          GEN_INT (count));
9758               varop = gen_rtx_fmt_ee (code, mode, new_rtx, XEXP (varop, 1));
9759               count = 0;
9760               continue;
9761             }
9762           break;
9763
9764         case NOT:
9765           if (VECTOR_MODE_P (mode))
9766             break;
9767
9768           /* Make this fit the case below.  */
9769           varop = gen_rtx_XOR (mode, XEXP (varop, 0),
9770                                GEN_INT (GET_MODE_MASK (mode)));
9771           continue;
9772
9773         case IOR:
9774         case AND:
9775         case XOR:
9776           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
9777              with C the size of VAROP - 1 and the shift is logical if
9778              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9779              we have an (le X 0) operation.   If we have an arithmetic shift
9780              and STORE_FLAG_VALUE is 1 or we have a logical shift with
9781              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
9782
9783           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
9784               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
9785               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9786               && (code == LSHIFTRT || code == ASHIFTRT)
9787               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9788               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9789             {
9790               count = 0;
9791               varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
9792                                   const0_rtx);
9793
9794               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9795                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9796
9797               continue;
9798             }
9799
9800           /* If we have (shift (logical)), move the logical to the outside
9801              to allow it to possibly combine with another logical and the
9802              shift to combine with another shift.  This also canonicalizes to
9803              what a ZERO_EXTRACT looks like.  Also, some machines have
9804              (and (shift)) insns.  */
9805
9806           if (CONST_INT_P (XEXP (varop, 1))
9807               /* We can't do this if we have (ashiftrt (xor))  and the
9808                  constant has its sign bit set in shift_mode.  */
9809               && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9810                    && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9811                                               shift_mode))
9812               && (new_rtx = simplify_const_binary_operation (code, result_mode,
9813                                                          XEXP (varop, 1),
9814                                                          GEN_INT (count))) != 0
9815               && CONST_INT_P (new_rtx)
9816               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
9817                                   INTVAL (new_rtx), result_mode, &complement_p))
9818             {
9819               varop = XEXP (varop, 0);
9820               continue;
9821             }
9822
9823           /* If we can't do that, try to simplify the shift in each arm of the
9824              logical expression, make a new logical expression, and apply
9825              the inverse distributive law.  This also can't be done
9826              for some (ashiftrt (xor)).  */
9827           if (CONST_INT_P (XEXP (varop, 1))
9828              && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9829                   && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9830                                              shift_mode)))
9831             {
9832               rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9833                                               XEXP (varop, 0), count);
9834               rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9835                                               XEXP (varop, 1), count);
9836
9837               varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
9838                                            lhs, rhs);
9839               varop = apply_distributive_law (varop);
9840
9841               count = 0;
9842               continue;
9843             }
9844           break;
9845
9846         case EQ:
9847           /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
9848              says that the sign bit can be tested, FOO has mode MODE, C is
9849              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
9850              that may be nonzero.  */
9851           if (code == LSHIFTRT
9852               && XEXP (varop, 1) == const0_rtx
9853               && GET_MODE (XEXP (varop, 0)) == result_mode
9854               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9855               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9856               && STORE_FLAG_VALUE == -1
9857               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9858               && merge_outer_ops (&outer_op, &outer_const, XOR,
9859                                   (HOST_WIDE_INT) 1, result_mode,
9860                                   &complement_p))
9861             {
9862               varop = XEXP (varop, 0);
9863               count = 0;
9864               continue;
9865             }
9866           break;
9867
9868         case NEG:
9869           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
9870              than the number of bits in the mode is equivalent to A.  */
9871           if (code == LSHIFTRT
9872               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9873               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
9874             {
9875               varop = XEXP (varop, 0);
9876               count = 0;
9877               continue;
9878             }
9879
9880           /* NEG commutes with ASHIFT since it is multiplication.  Move the
9881              NEG outside to allow shifts to combine.  */
9882           if (code == ASHIFT
9883               && merge_outer_ops (&outer_op, &outer_const, NEG,
9884                                   (HOST_WIDE_INT) 0, result_mode,
9885                                   &complement_p))
9886             {
9887               varop = XEXP (varop, 0);
9888               continue;
9889             }
9890           break;
9891
9892         case PLUS:
9893           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9894              is one less than the number of bits in the mode is
9895              equivalent to (xor A 1).  */
9896           if (code == LSHIFTRT
9897               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9898               && XEXP (varop, 1) == constm1_rtx
9899               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9900               && merge_outer_ops (&outer_op, &outer_const, XOR,
9901                                   (HOST_WIDE_INT) 1, result_mode,
9902                                   &complement_p))
9903             {
9904               count = 0;
9905               varop = XEXP (varop, 0);
9906               continue;
9907             }
9908
9909           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
9910              that might be nonzero in BAR are those being shifted out and those
9911              bits are known zero in FOO, we can replace the PLUS with FOO.
9912              Similarly in the other operand order.  This code occurs when
9913              we are computing the size of a variable-size array.  */
9914
9915           if ((code == ASHIFTRT || code == LSHIFTRT)
9916               && count < HOST_BITS_PER_WIDE_INT
9917               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9918               && (nonzero_bits (XEXP (varop, 1), result_mode)
9919                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9920             {
9921               varop = XEXP (varop, 0);
9922               continue;
9923             }
9924           else if ((code == ASHIFTRT || code == LSHIFTRT)
9925                    && count < HOST_BITS_PER_WIDE_INT
9926                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9927                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9928                             >> count)
9929                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9930                             & nonzero_bits (XEXP (varop, 1),
9931                                                  result_mode)))
9932             {
9933               varop = XEXP (varop, 1);
9934               continue;
9935             }
9936
9937           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
9938           if (code == ASHIFT
9939               && CONST_INT_P (XEXP (varop, 1))
9940               && (new_rtx = simplify_const_binary_operation (ASHIFT, result_mode,
9941                                                          XEXP (varop, 1),
9942                                                          GEN_INT (count))) != 0
9943               && CONST_INT_P (new_rtx)
9944               && merge_outer_ops (&outer_op, &outer_const, PLUS,
9945                                   INTVAL (new_rtx), result_mode, &complement_p))
9946             {
9947               varop = XEXP (varop, 0);
9948               continue;
9949             }
9950
9951           /* Check for 'PLUS signbit', which is the canonical form of 'XOR
9952              signbit', and attempt to change the PLUS to an XOR and move it to
9953              the outer operation as is done above in the AND/IOR/XOR case
9954              leg for shift(logical). See details in logical handling above
9955              for reasoning in doing so.  */
9956           if (code == LSHIFTRT
9957               && CONST_INT_P (XEXP (varop, 1))
9958               && mode_signbit_p (result_mode, XEXP (varop, 1))
9959               && (new_rtx = simplify_const_binary_operation (code, result_mode,
9960                                                          XEXP (varop, 1),
9961                                                          GEN_INT (count))) != 0
9962               && CONST_INT_P (new_rtx)
9963               && merge_outer_ops (&outer_op, &outer_const, XOR,
9964                                   INTVAL (new_rtx), result_mode, &complement_p))
9965             {
9966               varop = XEXP (varop, 0);
9967               continue;
9968             }
9969
9970           break;
9971
9972         case MINUS:
9973           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9974              with C the size of VAROP - 1 and the shift is logical if
9975              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9976              we have a (gt X 0) operation.  If the shift is arithmetic with
9977              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9978              we have a (neg (gt X 0)) operation.  */
9979
9980           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9981               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9982               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9983               && (code == LSHIFTRT || code == ASHIFTRT)
9984               && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
9985               && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
9986               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9987             {
9988               count = 0;
9989               varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9990                                   const0_rtx);
9991
9992               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9993                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9994
9995               continue;
9996             }
9997           break;
9998
9999         case TRUNCATE:
10000           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
10001              if the truncate does not affect the value.  */
10002           if (code == LSHIFTRT
10003               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
10004               && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
10005               && (INTVAL (XEXP (XEXP (varop, 0), 1))
10006                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
10007                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
10008             {
10009               rtx varop_inner = XEXP (varop, 0);
10010
10011               varop_inner
10012                 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
10013                                     XEXP (varop_inner, 0),
10014                                     GEN_INT
10015                                     (count + INTVAL (XEXP (varop_inner, 1))));
10016               varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
10017               count = 0;
10018               continue;
10019             }
10020           break;
10021
10022         default:
10023           break;
10024         }
10025
10026       break;
10027     }
10028
10029   shift_mode = try_widen_shift_mode (code, varop, count, result_mode, mode,
10030                                      outer_op, outer_const);
10031
10032   /* We have now finished analyzing the shift.  The result should be
10033      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
10034      OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
10035      to the result of the shift.  OUTER_CONST is the relevant constant,
10036      but we must turn off all bits turned off in the shift.  */
10037
10038   if (outer_op == UNKNOWN
10039       && orig_code == code && orig_count == count
10040       && varop == orig_varop
10041       && shift_mode == GET_MODE (varop))
10042     return NULL_RTX;
10043
10044   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
10045   varop = gen_lowpart (shift_mode, varop);
10046   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
10047     return NULL_RTX;
10048
10049   /* If we have an outer operation and we just made a shift, it is
10050      possible that we could have simplified the shift were it not
10051      for the outer operation.  So try to do the simplification
10052      recursively.  */
10053
10054   if (outer_op != UNKNOWN)
10055     x = simplify_shift_const_1 (code, shift_mode, varop, count);
10056   else
10057     x = NULL_RTX;
10058
10059   if (x == NULL_RTX)
10060     x = simplify_gen_binary (code, shift_mode, varop, GEN_INT (count));
10061
10062   /* If we were doing an LSHIFTRT in a wider mode than it was originally,
10063      turn off all the bits that the shift would have turned off.  */
10064   if (orig_code == LSHIFTRT && result_mode != shift_mode)
10065     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
10066                                 GET_MODE_MASK (result_mode) >> orig_count);
10067
10068   /* Do the remainder of the processing in RESULT_MODE.  */
10069   x = gen_lowpart_or_truncate (result_mode, x);
10070
10071   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
10072      operation.  */
10073   if (complement_p)
10074     x = simplify_gen_unary (NOT, result_mode, x, result_mode);
10075
10076   if (outer_op != UNKNOWN)
10077     {
10078       if (GET_RTX_CLASS (outer_op) != RTX_UNARY
10079           && GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
10080         outer_const = trunc_int_for_mode (outer_const, result_mode);
10081
10082       if (outer_op == AND)
10083         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
10084       else if (outer_op == SET)
10085         {
10086           /* This means that we have determined that the result is
10087              equivalent to a constant.  This should be rare.  */
10088           if (!side_effects_p (x))
10089             x = GEN_INT (outer_const);
10090         }
10091       else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
10092         x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
10093       else
10094         x = simplify_gen_binary (outer_op, result_mode, x,
10095                                  GEN_INT (outer_const));
10096     }
10097
10098   return x;
10099 }
10100
10101 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
10102    The result of the shift is RESULT_MODE.  If we cannot simplify it,
10103    return X or, if it is NULL, synthesize the expression with
10104    simplify_gen_binary.  Otherwise, return a simplified value.
10105
10106    The shift is normally computed in the widest mode we find in VAROP, as
10107    long as it isn't a different number of words than RESULT_MODE.  Exceptions
10108    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
10109
10110 static rtx
10111 simplify_shift_const (rtx x, enum rtx_code code, enum machine_mode result_mode,
10112                       rtx varop, int count)
10113 {
10114   rtx tem = simplify_shift_const_1 (code, result_mode, varop, count);
10115   if (tem)
10116     return tem;
10117
10118   if (!x)
10119     x = simplify_gen_binary (code, GET_MODE (varop), varop, GEN_INT (count));
10120   if (GET_MODE (x) != result_mode)
10121     x = gen_lowpart (result_mode, x);
10122   return x;
10123 }
10124
10125 \f
10126 /* Like recog, but we receive the address of a pointer to a new pattern.
10127    We try to match the rtx that the pointer points to.
10128    If that fails, we may try to modify or replace the pattern,
10129    storing the replacement into the same pointer object.
10130
10131    Modifications include deletion or addition of CLOBBERs.
10132
10133    PNOTES is a pointer to a location where any REG_UNUSED notes added for
10134    the CLOBBERs are placed.
10135
10136    The value is the final insn code from the pattern ultimately matched,
10137    or -1.  */
10138
10139 static int
10140 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
10141 {
10142   rtx pat = *pnewpat;
10143   int insn_code_number;
10144   int num_clobbers_to_add = 0;
10145   int i;
10146   rtx notes = 0;
10147   rtx old_notes, old_pat;
10148
10149   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
10150      we use to indicate that something didn't match.  If we find such a
10151      thing, force rejection.  */
10152   if (GET_CODE (pat) == PARALLEL)
10153     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
10154       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
10155           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
10156         return -1;
10157
10158   old_pat = PATTERN (insn);
10159   old_notes = REG_NOTES (insn);
10160   PATTERN (insn) = pat;
10161   REG_NOTES (insn) = 0;
10162
10163   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10164   if (dump_file && (dump_flags & TDF_DETAILS))
10165     {
10166       if (insn_code_number < 0)
10167         fputs ("Failed to match this instruction:\n", dump_file);
10168       else
10169         fputs ("Successfully matched this instruction:\n", dump_file);
10170       print_rtl_single (dump_file, pat);
10171     }
10172
10173   /* If it isn't, there is the possibility that we previously had an insn
10174      that clobbered some register as a side effect, but the combined
10175      insn doesn't need to do that.  So try once more without the clobbers
10176      unless this represents an ASM insn.  */
10177
10178   if (insn_code_number < 0 && ! check_asm_operands (pat)
10179       && GET_CODE (pat) == PARALLEL)
10180     {
10181       int pos;
10182
10183       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
10184         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
10185           {
10186             if (i != pos)
10187               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
10188             pos++;
10189           }
10190
10191       SUBST_INT (XVECLEN (pat, 0), pos);
10192
10193       if (pos == 1)
10194         pat = XVECEXP (pat, 0, 0);
10195
10196       PATTERN (insn) = pat;
10197       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10198       if (dump_file && (dump_flags & TDF_DETAILS))
10199         {
10200           if (insn_code_number < 0)
10201             fputs ("Failed to match this instruction:\n", dump_file);
10202           else
10203             fputs ("Successfully matched this instruction:\n", dump_file);
10204           print_rtl_single (dump_file, pat);
10205         }
10206     }
10207   PATTERN (insn) = old_pat;
10208   REG_NOTES (insn) = old_notes;
10209
10210   /* Recognize all noop sets, these will be killed by followup pass.  */
10211   if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
10212     insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
10213
10214   /* If we had any clobbers to add, make a new pattern than contains
10215      them.  Then check to make sure that all of them are dead.  */
10216   if (num_clobbers_to_add)
10217     {
10218       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
10219                                      rtvec_alloc (GET_CODE (pat) == PARALLEL
10220                                                   ? (XVECLEN (pat, 0)
10221                                                      + num_clobbers_to_add)
10222                                                   : num_clobbers_to_add + 1));
10223
10224       if (GET_CODE (pat) == PARALLEL)
10225         for (i = 0; i < XVECLEN (pat, 0); i++)
10226           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
10227       else
10228         XVECEXP (newpat, 0, 0) = pat;
10229
10230       add_clobbers (newpat, insn_code_number);
10231
10232       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
10233            i < XVECLEN (newpat, 0); i++)
10234         {
10235           if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
10236               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
10237             return -1;
10238           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) != SCRATCH)
10239             {
10240               gcc_assert (REG_P (XEXP (XVECEXP (newpat, 0, i), 0)));
10241               notes = alloc_reg_note (REG_UNUSED,
10242                                       XEXP (XVECEXP (newpat, 0, i), 0), notes);
10243             }
10244         }
10245       pat = newpat;
10246     }
10247
10248   *pnewpat = pat;
10249   *pnotes = notes;
10250
10251   return insn_code_number;
10252 }
10253 \f
10254 /* Like gen_lowpart_general but for use by combine.  In combine it
10255    is not possible to create any new pseudoregs.  However, it is
10256    safe to create invalid memory addresses, because combine will
10257    try to recognize them and all they will do is make the combine
10258    attempt fail.
10259
10260    If for some reason this cannot do its job, an rtx
10261    (clobber (const_int 0)) is returned.
10262    An insn containing that will not be recognized.  */
10263
10264 static rtx
10265 gen_lowpart_for_combine (enum machine_mode omode, rtx x)
10266 {
10267   enum machine_mode imode = GET_MODE (x);
10268   unsigned int osize = GET_MODE_SIZE (omode);
10269   unsigned int isize = GET_MODE_SIZE (imode);
10270   rtx result;
10271
10272   if (omode == imode)
10273     return x;
10274
10275   /* Return identity if this is a CONST or symbolic reference.  */
10276   if (omode == Pmode
10277       && (GET_CODE (x) == CONST
10278           || GET_CODE (x) == SYMBOL_REF
10279           || GET_CODE (x) == LABEL_REF))
10280     return x;
10281
10282   /* We can only support MODE being wider than a word if X is a
10283      constant integer or has a mode the same size.  */
10284   if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
10285       && ! ((imode == VOIDmode
10286              && (CONST_INT_P (x)
10287                  || GET_CODE (x) == CONST_DOUBLE))
10288             || isize == osize))
10289     goto fail;
10290
10291   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
10292      won't know what to do.  So we will strip off the SUBREG here and
10293      process normally.  */
10294   if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
10295     {
10296       x = SUBREG_REG (x);
10297
10298       /* For use in case we fall down into the address adjustments
10299          further below, we need to adjust the known mode and size of
10300          x; imode and isize, since we just adjusted x.  */
10301       imode = GET_MODE (x);
10302
10303       if (imode == omode)
10304         return x;
10305
10306       isize = GET_MODE_SIZE (imode);
10307     }
10308
10309   result = gen_lowpart_common (omode, x);
10310
10311   if (result)
10312     return result;
10313
10314   if (MEM_P (x))
10315     {
10316       int offset = 0;
10317
10318       /* Refuse to work on a volatile memory ref or one with a mode-dependent
10319          address.  */
10320       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
10321         goto fail;
10322
10323       /* If we want to refer to something bigger than the original memref,
10324          generate a paradoxical subreg instead.  That will force a reload
10325          of the original memref X.  */
10326       if (isize < osize)
10327         return gen_rtx_SUBREG (omode, x, 0);
10328
10329       if (WORDS_BIG_ENDIAN)
10330         offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
10331
10332       /* Adjust the address so that the address-after-the-data is
10333          unchanged.  */
10334       if (BYTES_BIG_ENDIAN)
10335         offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
10336
10337       return adjust_address_nv (x, omode, offset);
10338     }
10339
10340   /* If X is a comparison operator, rewrite it in a new mode.  This
10341      probably won't match, but may allow further simplifications.  */
10342   else if (COMPARISON_P (x))
10343     return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
10344
10345   /* If we couldn't simplify X any other way, just enclose it in a
10346      SUBREG.  Normally, this SUBREG won't match, but some patterns may
10347      include an explicit SUBREG or we may simplify it further in combine.  */
10348   else
10349     {
10350       int offset = 0;
10351       rtx res;
10352
10353       offset = subreg_lowpart_offset (omode, imode);
10354       if (imode == VOIDmode)
10355         {
10356           imode = int_mode_for_mode (omode);
10357           x = gen_lowpart_common (imode, x);
10358           if (x == NULL)
10359             goto fail;
10360         }
10361       res = simplify_gen_subreg (omode, x, imode, offset);
10362       if (res)
10363         return res;
10364     }
10365
10366  fail:
10367   return gen_rtx_CLOBBER (omode, const0_rtx);
10368 }
10369 \f
10370 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
10371    comparison code that will be tested.
10372
10373    The result is a possibly different comparison code to use.  *POP0 and
10374    *POP1 may be updated.
10375
10376    It is possible that we might detect that a comparison is either always
10377    true or always false.  However, we do not perform general constant
10378    folding in combine, so this knowledge isn't useful.  Such tautologies
10379    should have been detected earlier.  Hence we ignore all such cases.  */
10380
10381 static enum rtx_code
10382 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
10383 {
10384   rtx op0 = *pop0;
10385   rtx op1 = *pop1;
10386   rtx tem, tem1;
10387   int i;
10388   enum machine_mode mode, tmode;
10389
10390   /* Try a few ways of applying the same transformation to both operands.  */
10391   while (1)
10392     {
10393 #ifndef WORD_REGISTER_OPERATIONS
10394       /* The test below this one won't handle SIGN_EXTENDs on these machines,
10395          so check specially.  */
10396       if (code != GTU && code != GEU && code != LTU && code != LEU
10397           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
10398           && GET_CODE (XEXP (op0, 0)) == ASHIFT
10399           && GET_CODE (XEXP (op1, 0)) == ASHIFT
10400           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
10401           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
10402           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
10403               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
10404           && CONST_INT_P (XEXP (op0, 1))
10405           && XEXP (op0, 1) == XEXP (op1, 1)
10406           && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10407           && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
10408           && (INTVAL (XEXP (op0, 1))
10409               == (GET_MODE_BITSIZE (GET_MODE (op0))
10410                   - (GET_MODE_BITSIZE
10411                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
10412         {
10413           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
10414           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
10415         }
10416 #endif
10417
10418       /* If both operands are the same constant shift, see if we can ignore the
10419          shift.  We can if the shift is a rotate or if the bits shifted out of
10420          this shift are known to be zero for both inputs and if the type of
10421          comparison is compatible with the shift.  */
10422       if (GET_CODE (op0) == GET_CODE (op1)
10423           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10424           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
10425               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
10426                   && (code != GT && code != LT && code != GE && code != LE))
10427               || (GET_CODE (op0) == ASHIFTRT
10428                   && (code != GTU && code != LTU
10429                       && code != GEU && code != LEU)))
10430           && CONST_INT_P (XEXP (op0, 1))
10431           && INTVAL (XEXP (op0, 1)) >= 0
10432           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10433           && XEXP (op0, 1) == XEXP (op1, 1))
10434         {
10435           enum machine_mode mode = GET_MODE (op0);
10436           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10437           int shift_count = INTVAL (XEXP (op0, 1));
10438
10439           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
10440             mask &= (mask >> shift_count) << shift_count;
10441           else if (GET_CODE (op0) == ASHIFT)
10442             mask = (mask & (mask << shift_count)) >> shift_count;
10443
10444           if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
10445               && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
10446             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
10447           else
10448             break;
10449         }
10450
10451       /* If both operands are AND's of a paradoxical SUBREG by constant, the
10452          SUBREGs are of the same mode, and, in both cases, the AND would
10453          be redundant if the comparison was done in the narrower mode,
10454          do the comparison in the narrower mode (e.g., we are AND'ing with 1
10455          and the operand's possibly nonzero bits are 0xffffff01; in that case
10456          if we only care about QImode, we don't need the AND).  This case
10457          occurs if the output mode of an scc insn is not SImode and
10458          STORE_FLAG_VALUE == 1 (e.g., the 386).
10459
10460          Similarly, check for a case where the AND's are ZERO_EXTEND
10461          operations from some narrower mode even though a SUBREG is not
10462          present.  */
10463
10464       else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
10465                && CONST_INT_P (XEXP (op0, 1))
10466                && CONST_INT_P (XEXP (op1, 1)))
10467         {
10468           rtx inner_op0 = XEXP (op0, 0);
10469           rtx inner_op1 = XEXP (op1, 0);
10470           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
10471           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
10472           int changed = 0;
10473
10474           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
10475               && (GET_MODE_SIZE (GET_MODE (inner_op0))
10476                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
10477               && (GET_MODE (SUBREG_REG (inner_op0))
10478                   == GET_MODE (SUBREG_REG (inner_op1)))
10479               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
10480                   <= HOST_BITS_PER_WIDE_INT)
10481               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
10482                                              GET_MODE (SUBREG_REG (inner_op0)))))
10483               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
10484                                              GET_MODE (SUBREG_REG (inner_op1))))))
10485             {
10486               op0 = SUBREG_REG (inner_op0);
10487               op1 = SUBREG_REG (inner_op1);
10488
10489               /* The resulting comparison is always unsigned since we masked
10490                  off the original sign bit.  */
10491               code = unsigned_condition (code);
10492
10493               changed = 1;
10494             }
10495
10496           else if (c0 == c1)
10497             for (tmode = GET_CLASS_NARROWEST_MODE
10498                  (GET_MODE_CLASS (GET_MODE (op0)));
10499                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
10500               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
10501                 {
10502                   op0 = gen_lowpart (tmode, inner_op0);
10503                   op1 = gen_lowpart (tmode, inner_op1);
10504                   code = unsigned_condition (code);
10505                   changed = 1;
10506                   break;
10507                 }
10508
10509           if (! changed)
10510             break;
10511         }
10512
10513       /* If both operands are NOT, we can strip off the outer operation
10514          and adjust the comparison code for swapped operands; similarly for
10515          NEG, except that this must be an equality comparison.  */
10516       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
10517                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
10518                    && (code == EQ || code == NE)))
10519         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
10520
10521       else
10522         break;
10523     }
10524
10525   /* If the first operand is a constant, swap the operands and adjust the
10526      comparison code appropriately, but don't do this if the second operand
10527      is already a constant integer.  */
10528   if (swap_commutative_operands_p (op0, op1))
10529     {
10530       tem = op0, op0 = op1, op1 = tem;
10531       code = swap_condition (code);
10532     }
10533
10534   /* We now enter a loop during which we will try to simplify the comparison.
10535      For the most part, we only are concerned with comparisons with zero,
10536      but some things may really be comparisons with zero but not start
10537      out looking that way.  */
10538
10539   while (CONST_INT_P (op1))
10540     {
10541       enum machine_mode mode = GET_MODE (op0);
10542       unsigned int mode_width = GET_MODE_BITSIZE (mode);
10543       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10544       int equality_comparison_p;
10545       int sign_bit_comparison_p;
10546       int unsigned_comparison_p;
10547       HOST_WIDE_INT const_op;
10548
10549       /* We only want to handle integral modes.  This catches VOIDmode,
10550          CCmode, and the floating-point modes.  An exception is that we
10551          can handle VOIDmode if OP0 is a COMPARE or a comparison
10552          operation.  */
10553
10554       if (GET_MODE_CLASS (mode) != MODE_INT
10555           && ! (mode == VOIDmode
10556                 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
10557         break;
10558
10559       /* Get the constant we are comparing against and turn off all bits
10560          not on in our mode.  */
10561       const_op = INTVAL (op1);
10562       if (mode != VOIDmode)
10563         const_op = trunc_int_for_mode (const_op, mode);
10564       op1 = GEN_INT (const_op);
10565
10566       /* If we are comparing against a constant power of two and the value
10567          being compared can only have that single bit nonzero (e.g., it was
10568          `and'ed with that bit), we can replace this with a comparison
10569          with zero.  */
10570       if (const_op
10571           && (code == EQ || code == NE || code == GE || code == GEU
10572               || code == LT || code == LTU)
10573           && mode_width <= HOST_BITS_PER_WIDE_INT
10574           && exact_log2 (const_op) >= 0
10575           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
10576         {
10577           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10578           op1 = const0_rtx, const_op = 0;
10579         }
10580
10581       /* Similarly, if we are comparing a value known to be either -1 or
10582          0 with -1, change it to the opposite comparison against zero.  */
10583
10584       if (const_op == -1
10585           && (code == EQ || code == NE || code == GT || code == LE
10586               || code == GEU || code == LTU)
10587           && num_sign_bit_copies (op0, mode) == mode_width)
10588         {
10589           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10590           op1 = const0_rtx, const_op = 0;
10591         }
10592
10593       /* Do some canonicalizations based on the comparison code.  We prefer
10594          comparisons against zero and then prefer equality comparisons.
10595          If we can reduce the size of a constant, we will do that too.  */
10596
10597       switch (code)
10598         {
10599         case LT:
10600           /* < C is equivalent to <= (C - 1) */
10601           if (const_op > 0)
10602             {
10603               const_op -= 1;
10604               op1 = GEN_INT (const_op);
10605               code = LE;
10606               /* ... fall through to LE case below.  */
10607             }
10608           else
10609             break;
10610
10611         case LE:
10612           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
10613           if (const_op < 0)
10614             {
10615               const_op += 1;
10616               op1 = GEN_INT (const_op);
10617               code = LT;
10618             }
10619
10620           /* If we are doing a <= 0 comparison on a value known to have
10621              a zero sign bit, we can replace this with == 0.  */
10622           else if (const_op == 0
10623                    && mode_width <= HOST_BITS_PER_WIDE_INT
10624                    && (nonzero_bits (op0, mode)
10625                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10626             code = EQ;
10627           break;
10628
10629         case GE:
10630           /* >= C is equivalent to > (C - 1).  */
10631           if (const_op > 0)
10632             {
10633               const_op -= 1;
10634               op1 = GEN_INT (const_op);
10635               code = GT;
10636               /* ... fall through to GT below.  */
10637             }
10638           else
10639             break;
10640
10641         case GT:
10642           /* > C is equivalent to >= (C + 1); we do this for C < 0.  */
10643           if (const_op < 0)
10644             {
10645               const_op += 1;
10646               op1 = GEN_INT (const_op);
10647               code = GE;
10648             }
10649
10650           /* If we are doing a > 0 comparison on a value known to have
10651              a zero sign bit, we can replace this with != 0.  */
10652           else if (const_op == 0
10653                    && mode_width <= HOST_BITS_PER_WIDE_INT
10654                    && (nonzero_bits (op0, mode)
10655                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10656             code = NE;
10657           break;
10658
10659         case LTU:
10660           /* < C is equivalent to <= (C - 1).  */
10661           if (const_op > 0)
10662             {
10663               const_op -= 1;
10664               op1 = GEN_INT (const_op);
10665               code = LEU;
10666               /* ... fall through ...  */
10667             }
10668
10669           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
10670           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10671                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10672             {
10673               const_op = 0, op1 = const0_rtx;
10674               code = GE;
10675               break;
10676             }
10677           else
10678             break;
10679
10680         case LEU:
10681           /* unsigned <= 0 is equivalent to == 0 */
10682           if (const_op == 0)
10683             code = EQ;
10684
10685           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
10686           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10687                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10688             {
10689               const_op = 0, op1 = const0_rtx;
10690               code = GE;
10691             }
10692           break;
10693
10694         case GEU:
10695           /* >= C is equivalent to > (C - 1).  */
10696           if (const_op > 1)
10697             {
10698               const_op -= 1;
10699               op1 = GEN_INT (const_op);
10700               code = GTU;
10701               /* ... fall through ...  */
10702             }
10703
10704           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
10705           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10706                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10707             {
10708               const_op = 0, op1 = const0_rtx;
10709               code = LT;
10710               break;
10711             }
10712           else
10713             break;
10714
10715         case GTU:
10716           /* unsigned > 0 is equivalent to != 0 */
10717           if (const_op == 0)
10718             code = NE;
10719
10720           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
10721           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10722                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10723             {
10724               const_op = 0, op1 = const0_rtx;
10725               code = LT;
10726             }
10727           break;
10728
10729         default:
10730           break;
10731         }
10732
10733       /* Compute some predicates to simplify code below.  */
10734
10735       equality_comparison_p = (code == EQ || code == NE);
10736       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
10737       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
10738                                || code == GEU);
10739
10740       /* If this is a sign bit comparison and we can do arithmetic in
10741          MODE, say that we will only be needing the sign bit of OP0.  */
10742       if (sign_bit_comparison_p
10743           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10744         op0 = force_to_mode (op0, mode,
10745                              ((HOST_WIDE_INT) 1
10746                               << (GET_MODE_BITSIZE (mode) - 1)),
10747                              0);
10748
10749       /* Now try cases based on the opcode of OP0.  If none of the cases
10750          does a "continue", we exit this loop immediately after the
10751          switch.  */
10752
10753       switch (GET_CODE (op0))
10754         {
10755         case ZERO_EXTRACT:
10756           /* If we are extracting a single bit from a variable position in
10757              a constant that has only a single bit set and are comparing it
10758              with zero, we can convert this into an equality comparison
10759              between the position and the location of the single bit.  */
10760           /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
10761              have already reduced the shift count modulo the word size.  */
10762           if (!SHIFT_COUNT_TRUNCATED
10763               && CONST_INT_P (XEXP (op0, 0))
10764               && XEXP (op0, 1) == const1_rtx
10765               && equality_comparison_p && const_op == 0
10766               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
10767             {
10768               if (BITS_BIG_ENDIAN)
10769                 {
10770                   enum machine_mode new_mode
10771                     = mode_for_extraction (EP_extzv, 1);
10772                   if (new_mode == MAX_MACHINE_MODE)
10773                     i = BITS_PER_WORD - 1 - i;
10774                   else
10775                     {
10776                       mode = new_mode;
10777                       i = (GET_MODE_BITSIZE (mode) - 1 - i);
10778                     }
10779                 }
10780
10781               op0 = XEXP (op0, 2);
10782               op1 = GEN_INT (i);
10783               const_op = i;
10784
10785               /* Result is nonzero iff shift count is equal to I.  */
10786               code = reverse_condition (code);
10787               continue;
10788             }
10789
10790           /* ... fall through ...  */
10791
10792         case SIGN_EXTRACT:
10793           tem = expand_compound_operation (op0);
10794           if (tem != op0)
10795             {
10796               op0 = tem;
10797               continue;
10798             }
10799           break;
10800
10801         case NOT:
10802           /* If testing for equality, we can take the NOT of the constant.  */
10803           if (equality_comparison_p
10804               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
10805             {
10806               op0 = XEXP (op0, 0);
10807               op1 = tem;
10808               continue;
10809             }
10810
10811           /* If just looking at the sign bit, reverse the sense of the
10812              comparison.  */
10813           if (sign_bit_comparison_p)
10814             {
10815               op0 = XEXP (op0, 0);
10816               code = (code == GE ? LT : GE);
10817               continue;
10818             }
10819           break;
10820
10821         case NEG:
10822           /* If testing for equality, we can take the NEG of the constant.  */
10823           if (equality_comparison_p
10824               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10825             {
10826               op0 = XEXP (op0, 0);
10827               op1 = tem;
10828               continue;
10829             }
10830
10831           /* The remaining cases only apply to comparisons with zero.  */
10832           if (const_op != 0)
10833             break;
10834
10835           /* When X is ABS or is known positive,
10836              (neg X) is < 0 if and only if X != 0.  */
10837
10838           if (sign_bit_comparison_p
10839               && (GET_CODE (XEXP (op0, 0)) == ABS
10840                   || (mode_width <= HOST_BITS_PER_WIDE_INT
10841                       && (nonzero_bits (XEXP (op0, 0), mode)
10842                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10843             {
10844               op0 = XEXP (op0, 0);
10845               code = (code == LT ? NE : EQ);
10846               continue;
10847             }
10848
10849           /* If we have NEG of something whose two high-order bits are the
10850              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
10851           if (num_sign_bit_copies (op0, mode) >= 2)
10852             {
10853               op0 = XEXP (op0, 0);
10854               code = swap_condition (code);
10855               continue;
10856             }
10857           break;
10858
10859         case ROTATE:
10860           /* If we are testing equality and our count is a constant, we
10861              can perform the inverse operation on our RHS.  */
10862           if (equality_comparison_p && CONST_INT_P (XEXP (op0, 1))
10863               && (tem = simplify_binary_operation (ROTATERT, mode,
10864                                                    op1, XEXP (op0, 1))) != 0)
10865             {
10866               op0 = XEXP (op0, 0);
10867               op1 = tem;
10868               continue;
10869             }
10870
10871           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10872              a particular bit.  Convert it to an AND of a constant of that
10873              bit.  This will be converted into a ZERO_EXTRACT.  */
10874           if (const_op == 0 && sign_bit_comparison_p
10875               && CONST_INT_P (XEXP (op0, 1))
10876               && mode_width <= HOST_BITS_PER_WIDE_INT)
10877             {
10878               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10879                                             ((HOST_WIDE_INT) 1
10880                                              << (mode_width - 1
10881                                                  - INTVAL (XEXP (op0, 1)))));
10882               code = (code == LT ? NE : EQ);
10883               continue;
10884             }
10885
10886           /* Fall through.  */
10887
10888         case ABS:
10889           /* ABS is ignorable inside an equality comparison with zero.  */
10890           if (const_op == 0 && equality_comparison_p)
10891             {
10892               op0 = XEXP (op0, 0);
10893               continue;
10894             }
10895           break;
10896
10897         case SIGN_EXTEND:
10898           /* Can simplify (compare (zero/sign_extend FOO) CONST) to
10899              (compare FOO CONST) if CONST fits in FOO's mode and we
10900              are either testing inequality or have an unsigned
10901              comparison with ZERO_EXTEND or a signed comparison with
10902              SIGN_EXTEND.  But don't do it if we don't have a compare
10903              insn of the given mode, since we'd have to revert it
10904              later on, and then we wouldn't know whether to sign- or
10905              zero-extend.  */
10906           mode = GET_MODE (XEXP (op0, 0));
10907           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10908               && ! unsigned_comparison_p
10909               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10910               && ((unsigned HOST_WIDE_INT) const_op
10911                   < (((unsigned HOST_WIDE_INT) 1
10912                       << (GET_MODE_BITSIZE (mode) - 1))))
10913               && have_insn_for (COMPARE, mode))
10914             {
10915               op0 = XEXP (op0, 0);
10916               continue;
10917             }
10918           break;
10919
10920         case SUBREG:
10921           /* Check for the case where we are comparing A - C1 with C2, that is
10922
10923                (subreg:MODE (plus (A) (-C1))) op (C2)
10924
10925              with C1 a constant, and try to lift the SUBREG, i.e. to do the
10926              comparison in the wider mode.  One of the following two conditions
10927              must be true in order for this to be valid:
10928
10929                1. The mode extension results in the same bit pattern being added
10930                   on both sides and the comparison is equality or unsigned.  As
10931                   C2 has been truncated to fit in MODE, the pattern can only be
10932                   all 0s or all 1s.
10933
10934                2. The mode extension results in the sign bit being copied on
10935                   each side.
10936
10937              The difficulty here is that we have predicates for A but not for
10938              (A - C1) so we need to check that C1 is within proper bounds so
10939              as to perturbate A as little as possible.  */
10940
10941           if (mode_width <= HOST_BITS_PER_WIDE_INT
10942               && subreg_lowpart_p (op0)
10943               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) > mode_width
10944               && GET_CODE (SUBREG_REG (op0)) == PLUS
10945               && CONST_INT_P (XEXP (SUBREG_REG (op0), 1)))
10946             {
10947               enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
10948               rtx a = XEXP (SUBREG_REG (op0), 0);
10949               HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
10950
10951               if ((c1 > 0
10952                    && (unsigned HOST_WIDE_INT) c1
10953                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
10954                    && (equality_comparison_p || unsigned_comparison_p)
10955                    /* (A - C1) zero-extends if it is positive and sign-extends
10956                       if it is negative, C2 both zero- and sign-extends.  */
10957                    && ((0 == (nonzero_bits (a, inner_mode)
10958                               & ~GET_MODE_MASK (mode))
10959                         && const_op >= 0)
10960                        /* (A - C1) sign-extends if it is positive and 1-extends
10961                           if it is negative, C2 both sign- and 1-extends.  */
10962                        || (num_sign_bit_copies (a, inner_mode)
10963                            > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10964                                              - mode_width)
10965                            && const_op < 0)))
10966                   || ((unsigned HOST_WIDE_INT) c1
10967                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
10968                       /* (A - C1) always sign-extends, like C2.  */
10969                       && num_sign_bit_copies (a, inner_mode)
10970                          > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10971                                            - (mode_width - 1))))
10972                 {
10973                   op0 = SUBREG_REG (op0);
10974                   continue;
10975                 }
10976             }
10977
10978           /* If the inner mode is narrower and we are extracting the low part,
10979              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
10980           if (subreg_lowpart_p (op0)
10981               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10982             /* Fall through */ ;
10983           else
10984             break;
10985
10986           /* ... fall through ...  */
10987
10988         case ZERO_EXTEND:
10989           mode = GET_MODE (XEXP (op0, 0));
10990           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10991               && (unsigned_comparison_p || equality_comparison_p)
10992               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10993               && ((unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode))
10994               && have_insn_for (COMPARE, mode))
10995             {
10996               op0 = XEXP (op0, 0);
10997               continue;
10998             }
10999           break;
11000
11001         case PLUS:
11002           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
11003              this for equality comparisons due to pathological cases involving
11004              overflows.  */
11005           if (equality_comparison_p
11006               && 0 != (tem = simplify_binary_operation (MINUS, mode,
11007                                                         op1, XEXP (op0, 1))))
11008             {
11009               op0 = XEXP (op0, 0);
11010               op1 = tem;
11011               continue;
11012             }
11013
11014           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
11015           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
11016               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
11017             {
11018               op0 = XEXP (XEXP (op0, 0), 0);
11019               code = (code == LT ? EQ : NE);
11020               continue;
11021             }
11022           break;
11023
11024         case MINUS:
11025           /* We used to optimize signed comparisons against zero, but that
11026              was incorrect.  Unsigned comparisons against zero (GTU, LEU)
11027              arrive here as equality comparisons, or (GEU, LTU) are
11028              optimized away.  No need to special-case them.  */
11029
11030           /* (eq (minus A B) C) -> (eq A (plus B C)) or
11031              (eq B (minus A C)), whichever simplifies.  We can only do
11032              this for equality comparisons due to pathological cases involving
11033              overflows.  */
11034           if (equality_comparison_p
11035               && 0 != (tem = simplify_binary_operation (PLUS, mode,
11036                                                         XEXP (op0, 1), op1)))
11037             {
11038               op0 = XEXP (op0, 0);
11039               op1 = tem;
11040               continue;
11041             }
11042
11043           if (equality_comparison_p
11044               && 0 != (tem = simplify_binary_operation (MINUS, mode,
11045                                                         XEXP (op0, 0), op1)))
11046             {
11047               op0 = XEXP (op0, 1);
11048               op1 = tem;
11049               continue;
11050             }
11051
11052           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
11053              of bits in X minus 1, is one iff X > 0.  */
11054           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
11055               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11056               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (op0, 0), 1))
11057                  == mode_width - 1
11058               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11059             {
11060               op0 = XEXP (op0, 1);
11061               code = (code == GE ? LE : GT);
11062               continue;
11063             }
11064           break;
11065
11066         case XOR:
11067           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
11068              if C is zero or B is a constant.  */
11069           if (equality_comparison_p
11070               && 0 != (tem = simplify_binary_operation (XOR, mode,
11071                                                         XEXP (op0, 1), op1)))
11072             {
11073               op0 = XEXP (op0, 0);
11074               op1 = tem;
11075               continue;
11076             }
11077           break;
11078
11079         case EQ:  case NE:
11080         case UNEQ:  case LTGT:
11081         case LT:  case LTU:  case UNLT:  case LE:  case LEU:  case UNLE:
11082         case GT:  case GTU:  case UNGT:  case GE:  case GEU:  case UNGE:
11083         case UNORDERED: case ORDERED:
11084           /* We can't do anything if OP0 is a condition code value, rather
11085              than an actual data value.  */
11086           if (const_op != 0
11087               || CC0_P (XEXP (op0, 0))
11088               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
11089             break;
11090
11091           /* Get the two operands being compared.  */
11092           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
11093             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
11094           else
11095             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
11096
11097           /* Check for the cases where we simply want the result of the
11098              earlier test or the opposite of that result.  */
11099           if (code == NE || code == EQ
11100               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
11101                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11102                   && (STORE_FLAG_VALUE
11103                       & (((HOST_WIDE_INT) 1
11104                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
11105                   && (code == LT || code == GE)))
11106             {
11107               enum rtx_code new_code;
11108               if (code == LT || code == NE)
11109                 new_code = GET_CODE (op0);
11110               else
11111                 new_code = reversed_comparison_code (op0, NULL);
11112
11113               if (new_code != UNKNOWN)
11114                 {
11115                   code = new_code;
11116                   op0 = tem;
11117                   op1 = tem1;
11118                   continue;
11119                 }
11120             }
11121           break;
11122
11123         case IOR:
11124           /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
11125              iff X <= 0.  */
11126           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
11127               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
11128               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11129             {
11130               op0 = XEXP (op0, 1);
11131               code = (code == GE ? GT : LE);
11132               continue;
11133             }
11134           break;
11135
11136         case AND:
11137           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
11138              will be converted to a ZERO_EXTRACT later.  */
11139           if (const_op == 0 && equality_comparison_p
11140               && GET_CODE (XEXP (op0, 0)) == ASHIFT
11141               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
11142             {
11143               op0 = simplify_and_const_int
11144                 (NULL_RTX, mode, gen_rtx_LSHIFTRT (mode,
11145                                                    XEXP (op0, 1),
11146                                                    XEXP (XEXP (op0, 0), 1)),
11147                  (HOST_WIDE_INT) 1);
11148               continue;
11149             }
11150
11151           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
11152              zero and X is a comparison and C1 and C2 describe only bits set
11153              in STORE_FLAG_VALUE, we can compare with X.  */
11154           if (const_op == 0 && equality_comparison_p
11155               && mode_width <= HOST_BITS_PER_WIDE_INT
11156               && CONST_INT_P (XEXP (op0, 1))
11157               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
11158               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11159               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
11160               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
11161             {
11162               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11163                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
11164               if ((~STORE_FLAG_VALUE & mask) == 0
11165                   && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
11166                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
11167                           && COMPARISON_P (tem))))
11168                 {
11169                   op0 = XEXP (XEXP (op0, 0), 0);
11170                   continue;
11171                 }
11172             }
11173
11174           /* If we are doing an equality comparison of an AND of a bit equal
11175              to the sign bit, replace this with a LT or GE comparison of
11176              the underlying value.  */
11177           if (equality_comparison_p
11178               && const_op == 0
11179               && CONST_INT_P (XEXP (op0, 1))
11180               && mode_width <= HOST_BITS_PER_WIDE_INT
11181               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11182                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
11183             {
11184               op0 = XEXP (op0, 0);
11185               code = (code == EQ ? GE : LT);
11186               continue;
11187             }
11188
11189           /* If this AND operation is really a ZERO_EXTEND from a narrower
11190              mode, the constant fits within that mode, and this is either an
11191              equality or unsigned comparison, try to do this comparison in
11192              the narrower mode.
11193
11194              Note that in:
11195
11196              (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
11197              -> (ne:DI (reg:SI 4) (const_int 0))
11198
11199              unless TRULY_NOOP_TRUNCATION allows it or the register is
11200              known to hold a value of the required mode the
11201              transformation is invalid.  */
11202           if ((equality_comparison_p || unsigned_comparison_p)
11203               && CONST_INT_P (XEXP (op0, 1))
11204               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
11205                                    & GET_MODE_MASK (mode))
11206                                   + 1)) >= 0
11207               && const_op >> i == 0
11208               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode
11209               && (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
11210                                          GET_MODE_BITSIZE (GET_MODE (op0)))
11211                   || (REG_P (XEXP (op0, 0))
11212                       && reg_truncated_to_mode (tmode, XEXP (op0, 0)))))
11213             {
11214               op0 = gen_lowpart (tmode, XEXP (op0, 0));
11215               continue;
11216             }
11217
11218           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
11219              fits in both M1 and M2 and the SUBREG is either paradoxical
11220              or represents the low part, permute the SUBREG and the AND
11221              and try again.  */
11222           if (GET_CODE (XEXP (op0, 0)) == SUBREG)
11223             {
11224               unsigned HOST_WIDE_INT c1;
11225               tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
11226               /* Require an integral mode, to avoid creating something like
11227                  (AND:SF ...).  */
11228               if (SCALAR_INT_MODE_P (tmode)
11229                   /* It is unsafe to commute the AND into the SUBREG if the
11230                      SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
11231                      not defined.  As originally written the upper bits
11232                      have a defined value due to the AND operation.
11233                      However, if we commute the AND inside the SUBREG then
11234                      they no longer have defined values and the meaning of
11235                      the code has been changed.  */
11236                   && (0
11237 #ifdef WORD_REGISTER_OPERATIONS
11238                       || (mode_width > GET_MODE_BITSIZE (tmode)
11239                           && mode_width <= BITS_PER_WORD)
11240 #endif
11241                       || (mode_width <= GET_MODE_BITSIZE (tmode)
11242                           && subreg_lowpart_p (XEXP (op0, 0))))
11243                   && CONST_INT_P (XEXP (op0, 1))
11244                   && mode_width <= HOST_BITS_PER_WIDE_INT
11245                   && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
11246                   && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
11247                   && (c1 & ~GET_MODE_MASK (tmode)) == 0
11248                   && c1 != mask
11249                   && c1 != GET_MODE_MASK (tmode))
11250                 {
11251                   op0 = simplify_gen_binary (AND, tmode,
11252                                              SUBREG_REG (XEXP (op0, 0)),
11253                                              gen_int_mode (c1, tmode));
11254                   op0 = gen_lowpart (mode, op0);
11255                   continue;
11256                 }
11257             }
11258
11259           /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0).  */
11260           if (const_op == 0 && equality_comparison_p
11261               && XEXP (op0, 1) == const1_rtx
11262               && GET_CODE (XEXP (op0, 0)) == NOT)
11263             {
11264               op0 = simplify_and_const_int
11265                 (NULL_RTX, mode, XEXP (XEXP (op0, 0), 0), (HOST_WIDE_INT) 1);
11266               code = (code == NE ? EQ : NE);
11267               continue;
11268             }
11269
11270           /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
11271              (eq (and (lshiftrt X) 1) 0).
11272              Also handle the case where (not X) is expressed using xor.  */
11273           if (const_op == 0 && equality_comparison_p
11274               && XEXP (op0, 1) == const1_rtx
11275               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
11276             {
11277               rtx shift_op = XEXP (XEXP (op0, 0), 0);
11278               rtx shift_count = XEXP (XEXP (op0, 0), 1);
11279
11280               if (GET_CODE (shift_op) == NOT
11281                   || (GET_CODE (shift_op) == XOR
11282                       && CONST_INT_P (XEXP (shift_op, 1))
11283                       && CONST_INT_P (shift_count)
11284                       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
11285                       && (INTVAL (XEXP (shift_op, 1))
11286                           == (HOST_WIDE_INT) 1 << INTVAL (shift_count))))
11287                 {
11288                   op0 = simplify_and_const_int
11289                     (NULL_RTX, mode,
11290                      gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count),
11291                      (HOST_WIDE_INT) 1);
11292                   code = (code == NE ? EQ : NE);
11293                   continue;
11294                 }
11295             }
11296           break;
11297
11298         case ASHIFT:
11299           /* If we have (compare (ashift FOO N) (const_int C)) and
11300              the high order N bits of FOO (N+1 if an inequality comparison)
11301              are known to be zero, we can do this by comparing FOO with C
11302              shifted right N bits so long as the low-order N bits of C are
11303              zero.  */
11304           if (CONST_INT_P (XEXP (op0, 1))
11305               && INTVAL (XEXP (op0, 1)) >= 0
11306               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
11307                   < HOST_BITS_PER_WIDE_INT)
11308               && ((const_op
11309                    & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
11310               && mode_width <= HOST_BITS_PER_WIDE_INT
11311               && (nonzero_bits (XEXP (op0, 0), mode)
11312                   & ~(mask >> (INTVAL (XEXP (op0, 1))
11313                                + ! equality_comparison_p))) == 0)
11314             {
11315               /* We must perform a logical shift, not an arithmetic one,
11316                  as we want the top N bits of C to be zero.  */
11317               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
11318
11319               temp >>= INTVAL (XEXP (op0, 1));
11320               op1 = gen_int_mode (temp, mode);
11321               op0 = XEXP (op0, 0);
11322               continue;
11323             }
11324
11325           /* If we are doing a sign bit comparison, it means we are testing
11326              a particular bit.  Convert it to the appropriate AND.  */
11327           if (sign_bit_comparison_p && CONST_INT_P (XEXP (op0, 1))
11328               && mode_width <= HOST_BITS_PER_WIDE_INT)
11329             {
11330               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11331                                             ((HOST_WIDE_INT) 1
11332                                              << (mode_width - 1
11333                                                  - INTVAL (XEXP (op0, 1)))));
11334               code = (code == LT ? NE : EQ);
11335               continue;
11336             }
11337
11338           /* If this an equality comparison with zero and we are shifting
11339              the low bit to the sign bit, we can convert this to an AND of the
11340              low-order bit.  */
11341           if (const_op == 0 && equality_comparison_p
11342               && CONST_INT_P (XEXP (op0, 1))
11343               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
11344                  == mode_width - 1)
11345             {
11346               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11347                                             (HOST_WIDE_INT) 1);
11348               continue;
11349             }
11350           break;
11351
11352         case ASHIFTRT:
11353           /* If this is an equality comparison with zero, we can do this
11354              as a logical shift, which might be much simpler.  */
11355           if (equality_comparison_p && const_op == 0
11356               && CONST_INT_P (XEXP (op0, 1)))
11357             {
11358               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
11359                                           XEXP (op0, 0),
11360                                           INTVAL (XEXP (op0, 1)));
11361               continue;
11362             }
11363
11364           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
11365              do the comparison in a narrower mode.  */
11366           if (! unsigned_comparison_p
11367               && CONST_INT_P (XEXP (op0, 1))
11368               && GET_CODE (XEXP (op0, 0)) == ASHIFT
11369               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
11370               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11371                                          MODE_INT, 1)) != BLKmode
11372               && (((unsigned HOST_WIDE_INT) const_op
11373                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11374                   <= GET_MODE_MASK (tmode)))
11375             {
11376               op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
11377               continue;
11378             }
11379
11380           /* Likewise if OP0 is a PLUS of a sign extension with a
11381              constant, which is usually represented with the PLUS
11382              between the shifts.  */
11383           if (! unsigned_comparison_p
11384               && CONST_INT_P (XEXP (op0, 1))
11385               && GET_CODE (XEXP (op0, 0)) == PLUS
11386               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11387               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
11388               && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
11389               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11390                                          MODE_INT, 1)) != BLKmode
11391               && (((unsigned HOST_WIDE_INT) const_op
11392                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11393                   <= GET_MODE_MASK (tmode)))
11394             {
11395               rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
11396               rtx add_const = XEXP (XEXP (op0, 0), 1);
11397               rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
11398                                                    add_const, XEXP (op0, 1));
11399
11400               op0 = simplify_gen_binary (PLUS, tmode,
11401                                          gen_lowpart (tmode, inner),
11402                                          new_const);
11403               continue;
11404             }
11405
11406           /* ... fall through ...  */
11407         case LSHIFTRT:
11408           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
11409              the low order N bits of FOO are known to be zero, we can do this
11410              by comparing FOO with C shifted left N bits so long as no
11411              overflow occurs.  */
11412           if (CONST_INT_P (XEXP (op0, 1))
11413               && INTVAL (XEXP (op0, 1)) >= 0
11414               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11415               && mode_width <= HOST_BITS_PER_WIDE_INT
11416               && (nonzero_bits (XEXP (op0, 0), mode)
11417                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
11418               && (((unsigned HOST_WIDE_INT) const_op
11419                    + (GET_CODE (op0) != LSHIFTRT
11420                       ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
11421                          + 1)
11422                       : 0))
11423                   <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
11424             {
11425               /* If the shift was logical, then we must make the condition
11426                  unsigned.  */
11427               if (GET_CODE (op0) == LSHIFTRT)
11428                 code = unsigned_condition (code);
11429
11430               const_op <<= INTVAL (XEXP (op0, 1));
11431               op1 = GEN_INT (const_op);
11432               op0 = XEXP (op0, 0);
11433               continue;
11434             }
11435
11436           /* If we are using this shift to extract just the sign bit, we
11437              can replace this with an LT or GE comparison.  */
11438           if (const_op == 0
11439               && (equality_comparison_p || sign_bit_comparison_p)
11440               && CONST_INT_P (XEXP (op0, 1))
11441               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
11442                  == mode_width - 1)
11443             {
11444               op0 = XEXP (op0, 0);
11445               code = (code == NE || code == GT ? LT : GE);
11446               continue;
11447             }
11448           break;
11449
11450         default:
11451           break;
11452         }
11453
11454       break;
11455     }
11456
11457   /* Now make any compound operations involved in this comparison.  Then,
11458      check for an outmost SUBREG on OP0 that is not doing anything or is
11459      paradoxical.  The latter transformation must only be performed when
11460      it is known that the "extra" bits will be the same in op0 and op1 or
11461      that they don't matter.  There are three cases to consider:
11462
11463      1. SUBREG_REG (op0) is a register.  In this case the bits are don't
11464      care bits and we can assume they have any convenient value.  So
11465      making the transformation is safe.
11466
11467      2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
11468      In this case the upper bits of op0 are undefined.  We should not make
11469      the simplification in that case as we do not know the contents of
11470      those bits.
11471
11472      3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
11473      UNKNOWN.  In that case we know those bits are zeros or ones.  We must
11474      also be sure that they are the same as the upper bits of op1.
11475
11476      We can never remove a SUBREG for a non-equality comparison because
11477      the sign bit is in a different place in the underlying object.  */
11478
11479   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
11480   op1 = make_compound_operation (op1, SET);
11481
11482   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
11483       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11484       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
11485       && (code == NE || code == EQ))
11486     {
11487       if (GET_MODE_SIZE (GET_MODE (op0))
11488           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
11489         {
11490           /* For paradoxical subregs, allow case 1 as above.  Case 3 isn't
11491              implemented.  */
11492           if (REG_P (SUBREG_REG (op0)))
11493             {
11494               op0 = SUBREG_REG (op0);
11495               op1 = gen_lowpart (GET_MODE (op0), op1);
11496             }
11497         }
11498       else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
11499                 <= HOST_BITS_PER_WIDE_INT)
11500                && (nonzero_bits (SUBREG_REG (op0),
11501                                  GET_MODE (SUBREG_REG (op0)))
11502                    & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11503         {
11504           tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
11505
11506           if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
11507                & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11508             op0 = SUBREG_REG (op0), op1 = tem;
11509         }
11510     }
11511
11512   /* We now do the opposite procedure: Some machines don't have compare
11513      insns in all modes.  If OP0's mode is an integer mode smaller than a
11514      word and we can't do a compare in that mode, see if there is a larger
11515      mode for which we can do the compare.  There are a number of cases in
11516      which we can use the wider mode.  */
11517
11518   mode = GET_MODE (op0);
11519   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11520       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
11521       && ! have_insn_for (COMPARE, mode))
11522     for (tmode = GET_MODE_WIDER_MODE (mode);
11523          (tmode != VOIDmode
11524           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
11525          tmode = GET_MODE_WIDER_MODE (tmode))
11526       if (have_insn_for (COMPARE, tmode))
11527         {
11528           int zero_extended;
11529
11530           /* If this is a test for negative, we can make an explicit
11531              test of the sign bit.  Test this first so we can use
11532              a paradoxical subreg to extend OP0.  */
11533
11534           if (op1 == const0_rtx && (code == LT || code == GE)
11535               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11536             {
11537               op0 = simplify_gen_binary (AND, tmode,
11538                                          gen_lowpart (tmode, op0),
11539                                          GEN_INT ((HOST_WIDE_INT) 1
11540                                                   << (GET_MODE_BITSIZE (mode)
11541                                                       - 1)));
11542               code = (code == LT) ? NE : EQ;
11543               break;
11544             }
11545
11546           /* If the only nonzero bits in OP0 and OP1 are those in the
11547              narrower mode and this is an equality or unsigned comparison,
11548              we can use the wider mode.  Similarly for sign-extended
11549              values, in which case it is true for all comparisons.  */
11550           zero_extended = ((code == EQ || code == NE
11551                             || code == GEU || code == GTU
11552                             || code == LEU || code == LTU)
11553                            && (nonzero_bits (op0, tmode)
11554                                & ~GET_MODE_MASK (mode)) == 0
11555                            && ((CONST_INT_P (op1)
11556                                 || (nonzero_bits (op1, tmode)
11557                                     & ~GET_MODE_MASK (mode)) == 0)));
11558
11559           if (zero_extended
11560               || ((num_sign_bit_copies (op0, tmode)
11561                    > (unsigned int) (GET_MODE_BITSIZE (tmode)
11562                                      - GET_MODE_BITSIZE (mode)))
11563                   && (num_sign_bit_copies (op1, tmode)
11564                       > (unsigned int) (GET_MODE_BITSIZE (tmode)
11565                                         - GET_MODE_BITSIZE (mode)))))
11566             {
11567               /* If OP0 is an AND and we don't have an AND in MODE either,
11568                  make a new AND in the proper mode.  */
11569               if (GET_CODE (op0) == AND
11570                   && !have_insn_for (AND, mode))
11571                 op0 = simplify_gen_binary (AND, tmode,
11572                                            gen_lowpart (tmode,
11573                                                         XEXP (op0, 0)),
11574                                            gen_lowpart (tmode,
11575                                                         XEXP (op0, 1)));
11576               else
11577                 {
11578                   if (zero_extended)
11579                     {
11580                       op0 = simplify_gen_unary (ZERO_EXTEND, tmode, op0, mode);
11581                       op1 = simplify_gen_unary (ZERO_EXTEND, tmode, op1, mode);
11582                     }
11583                   else
11584                     {
11585                       op0 = simplify_gen_unary (SIGN_EXTEND, tmode, op0, mode);
11586                       op1 = simplify_gen_unary (SIGN_EXTEND, tmode, op1, mode);
11587                     }
11588                   break;
11589                 }
11590             }
11591         }
11592
11593 #ifdef CANONICALIZE_COMPARISON
11594   /* If this machine only supports a subset of valid comparisons, see if we
11595      can convert an unsupported one into a supported one.  */
11596   CANONICALIZE_COMPARISON (code, op0, op1);
11597 #endif
11598
11599   *pop0 = op0;
11600   *pop1 = op1;
11601
11602   return code;
11603 }
11604 \f
11605 /* Utility function for record_value_for_reg.  Count number of
11606    rtxs in X.  */
11607 static int
11608 count_rtxs (rtx x)
11609 {
11610   enum rtx_code code = GET_CODE (x);
11611   const char *fmt;
11612   int i, j, ret = 1;
11613
11614   if (GET_RTX_CLASS (code) == '2'
11615       || GET_RTX_CLASS (code) == 'c')
11616     {
11617       rtx x0 = XEXP (x, 0);
11618       rtx x1 = XEXP (x, 1);
11619
11620       if (x0 == x1)
11621         return 1 + 2 * count_rtxs (x0);
11622
11623       if ((GET_RTX_CLASS (GET_CODE (x1)) == '2'
11624            || GET_RTX_CLASS (GET_CODE (x1)) == 'c')
11625           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11626         return 2 + 2 * count_rtxs (x0)
11627                + count_rtxs (x == XEXP (x1, 0)
11628                              ? XEXP (x1, 1) : XEXP (x1, 0));
11629
11630       if ((GET_RTX_CLASS (GET_CODE (x0)) == '2'
11631            || GET_RTX_CLASS (GET_CODE (x0)) == 'c')
11632           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11633         return 2 + 2 * count_rtxs (x1)
11634                + count_rtxs (x == XEXP (x0, 0)
11635                              ? XEXP (x0, 1) : XEXP (x0, 0));
11636     }
11637
11638   fmt = GET_RTX_FORMAT (code);
11639   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11640     if (fmt[i] == 'e')
11641       ret += count_rtxs (XEXP (x, i));
11642     else if (fmt[i] == 'E')
11643       for (j = 0; j < XVECLEN (x, i); j++)
11644         ret += count_rtxs (XVECEXP (x, i, j));
11645
11646   return ret;
11647 }
11648 \f
11649 /* Utility function for following routine.  Called when X is part of a value
11650    being stored into last_set_value.  Sets last_set_table_tick
11651    for each register mentioned.  Similar to mention_regs in cse.c  */
11652
11653 static void
11654 update_table_tick (rtx x)
11655 {
11656   enum rtx_code code = GET_CODE (x);
11657   const char *fmt = GET_RTX_FORMAT (code);
11658   int i, j;
11659
11660   if (code == REG)
11661     {
11662       unsigned int regno = REGNO (x);
11663       unsigned int endregno = END_REGNO (x);
11664       unsigned int r;
11665
11666       for (r = regno; r < endregno; r++)
11667         {
11668           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, r);
11669           rsp->last_set_table_tick = label_tick;
11670         }
11671
11672       return;
11673     }
11674
11675   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11676     if (fmt[i] == 'e')
11677       {
11678         /* Check for identical subexpressions.  If x contains
11679            identical subexpression we only have to traverse one of
11680            them.  */
11681         if (i == 0 && ARITHMETIC_P (x))
11682           {
11683             /* Note that at this point x1 has already been
11684                processed.  */
11685             rtx x0 = XEXP (x, 0);
11686             rtx x1 = XEXP (x, 1);
11687
11688             /* If x0 and x1 are identical then there is no need to
11689                process x0.  */
11690             if (x0 == x1)
11691               break;
11692
11693             /* If x0 is identical to a subexpression of x1 then while
11694                processing x1, x0 has already been processed.  Thus we
11695                are done with x.  */
11696             if (ARITHMETIC_P (x1)
11697                 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11698               break;
11699
11700             /* If x1 is identical to a subexpression of x0 then we
11701                still have to process the rest of x0.  */
11702             if (ARITHMETIC_P (x0)
11703                 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11704               {
11705                 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
11706                 break;
11707               }
11708           }
11709
11710         update_table_tick (XEXP (x, i));
11711       }
11712     else if (fmt[i] == 'E')
11713       for (j = 0; j < XVECLEN (x, i); j++)
11714         update_table_tick (XVECEXP (x, i, j));
11715 }
11716
11717 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
11718    are saying that the register is clobbered and we no longer know its
11719    value.  If INSN is zero, don't update reg_stat[].last_set; this is
11720    only permitted with VALUE also zero and is used to invalidate the
11721    register.  */
11722
11723 static void
11724 record_value_for_reg (rtx reg, rtx insn, rtx value)
11725 {
11726   unsigned int regno = REGNO (reg);
11727   unsigned int endregno = END_REGNO (reg);
11728   unsigned int i;
11729   reg_stat_type *rsp;
11730
11731   /* If VALUE contains REG and we have a previous value for REG, substitute
11732      the previous value.  */
11733   if (value && insn && reg_overlap_mentioned_p (reg, value))
11734     {
11735       rtx tem;
11736
11737       /* Set things up so get_last_value is allowed to see anything set up to
11738          our insn.  */
11739       subst_low_luid = DF_INSN_LUID (insn);
11740       tem = get_last_value (reg);
11741
11742       /* If TEM is simply a binary operation with two CLOBBERs as operands,
11743          it isn't going to be useful and will take a lot of time to process,
11744          so just use the CLOBBER.  */
11745
11746       if (tem)
11747         {
11748           if (ARITHMETIC_P (tem)
11749               && GET_CODE (XEXP (tem, 0)) == CLOBBER
11750               && GET_CODE (XEXP (tem, 1)) == CLOBBER)
11751             tem = XEXP (tem, 0);
11752           else if (count_occurrences (value, reg, 1) >= 2)
11753             {
11754               /* If there are two or more occurrences of REG in VALUE,
11755                  prevent the value from growing too much.  */
11756               if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
11757                 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
11758             }
11759
11760           value = replace_rtx (copy_rtx (value), reg, tem);
11761         }
11762     }
11763
11764   /* For each register modified, show we don't know its value, that
11765      we don't know about its bitwise content, that its value has been
11766      updated, and that we don't know the location of the death of the
11767      register.  */
11768   for (i = regno; i < endregno; i++)
11769     {
11770       rsp = VEC_index (reg_stat_type, reg_stat, i);
11771
11772       if (insn)
11773         rsp->last_set = insn;
11774
11775       rsp->last_set_value = 0;
11776       rsp->last_set_mode = VOIDmode;
11777       rsp->last_set_nonzero_bits = 0;
11778       rsp->last_set_sign_bit_copies = 0;
11779       rsp->last_death = 0;
11780       rsp->truncated_to_mode = VOIDmode;
11781     }
11782
11783   /* Mark registers that are being referenced in this value.  */
11784   if (value)
11785     update_table_tick (value);
11786
11787   /* Now update the status of each register being set.
11788      If someone is using this register in this block, set this register
11789      to invalid since we will get confused between the two lives in this
11790      basic block.  This makes using this register always invalid.  In cse, we
11791      scan the table to invalidate all entries using this register, but this
11792      is too much work for us.  */
11793
11794   for (i = regno; i < endregno; i++)
11795     {
11796       rsp = VEC_index (reg_stat_type, reg_stat, i);
11797       rsp->last_set_label = label_tick;
11798       if (!insn
11799           || (value && rsp->last_set_table_tick >= label_tick_ebb_start))
11800         rsp->last_set_invalid = 1;
11801       else
11802         rsp->last_set_invalid = 0;
11803     }
11804
11805   /* The value being assigned might refer to X (like in "x++;").  In that
11806      case, we must replace it with (clobber (const_int 0)) to prevent
11807      infinite loops.  */
11808   rsp = VEC_index (reg_stat_type, reg_stat, regno);
11809   if (value && !get_last_value_validate (&value, insn, label_tick, 0))
11810     {
11811       value = copy_rtx (value);
11812       if (!get_last_value_validate (&value, insn, label_tick, 1))
11813         value = 0;
11814     }
11815
11816   /* For the main register being modified, update the value, the mode, the
11817      nonzero bits, and the number of sign bit copies.  */
11818
11819   rsp->last_set_value = value;
11820
11821   if (value)
11822     {
11823       enum machine_mode mode = GET_MODE (reg);
11824       subst_low_luid = DF_INSN_LUID (insn);
11825       rsp->last_set_mode = mode;
11826       if (GET_MODE_CLASS (mode) == MODE_INT
11827           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11828         mode = nonzero_bits_mode;
11829       rsp->last_set_nonzero_bits = nonzero_bits (value, mode);
11830       rsp->last_set_sign_bit_copies
11831         = num_sign_bit_copies (value, GET_MODE (reg));
11832     }
11833 }
11834
11835 /* Called via note_stores from record_dead_and_set_regs to handle one
11836    SET or CLOBBER in an insn.  DATA is the instruction in which the
11837    set is occurring.  */
11838
11839 static void
11840 record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data)
11841 {
11842   rtx record_dead_insn = (rtx) data;
11843
11844   if (GET_CODE (dest) == SUBREG)
11845     dest = SUBREG_REG (dest);
11846
11847   if (!record_dead_insn)
11848     {
11849       if (REG_P (dest))
11850         record_value_for_reg (dest, NULL_RTX, NULL_RTX);
11851       return;
11852     }
11853
11854   if (REG_P (dest))
11855     {
11856       /* If we are setting the whole register, we know its value.  Otherwise
11857          show that we don't know the value.  We can handle SUBREG in
11858          some cases.  */
11859       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11860         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11861       else if (GET_CODE (setter) == SET
11862                && GET_CODE (SET_DEST (setter)) == SUBREG
11863                && SUBREG_REG (SET_DEST (setter)) == dest
11864                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
11865                && subreg_lowpart_p (SET_DEST (setter)))
11866         record_value_for_reg (dest, record_dead_insn,
11867                               gen_lowpart (GET_MODE (dest),
11868                                                        SET_SRC (setter)));
11869       else
11870         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
11871     }
11872   else if (MEM_P (dest)
11873            /* Ignore pushes, they clobber nothing.  */
11874            && ! push_operand (dest, GET_MODE (dest)))
11875     mem_last_set = DF_INSN_LUID (record_dead_insn);
11876 }
11877
11878 /* Update the records of when each REG was most recently set or killed
11879    for the things done by INSN.  This is the last thing done in processing
11880    INSN in the combiner loop.
11881
11882    We update reg_stat[], in particular fields last_set, last_set_value,
11883    last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
11884    last_death, and also the similar information mem_last_set (which insn
11885    most recently modified memory) and last_call_luid (which insn was the
11886    most recent subroutine call).  */
11887
11888 static void
11889 record_dead_and_set_regs (rtx insn)
11890 {
11891   rtx link;
11892   unsigned int i;
11893
11894   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11895     {
11896       if (REG_NOTE_KIND (link) == REG_DEAD
11897           && REG_P (XEXP (link, 0)))
11898         {
11899           unsigned int regno = REGNO (XEXP (link, 0));
11900           unsigned int endregno = END_REGNO (XEXP (link, 0));
11901
11902           for (i = regno; i < endregno; i++)
11903             {
11904               reg_stat_type *rsp;
11905
11906               rsp = VEC_index (reg_stat_type, reg_stat, i);
11907               rsp->last_death = insn;
11908             }
11909         }
11910       else if (REG_NOTE_KIND (link) == REG_INC)
11911         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
11912     }
11913
11914   if (CALL_P (insn))
11915     {
11916       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11917         if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
11918           {
11919             reg_stat_type *rsp;
11920
11921             rsp = VEC_index (reg_stat_type, reg_stat, i);
11922             rsp->last_set_invalid = 1;
11923             rsp->last_set = insn;
11924             rsp->last_set_value = 0;
11925             rsp->last_set_mode = VOIDmode;
11926             rsp->last_set_nonzero_bits = 0;
11927             rsp->last_set_sign_bit_copies = 0;
11928             rsp->last_death = 0;
11929             rsp->truncated_to_mode = VOIDmode;
11930           }
11931
11932       last_call_luid = mem_last_set = DF_INSN_LUID (insn);
11933
11934       /* We can't combine into a call pattern.  Remember, though, that
11935          the return value register is set at this LUID.  We could
11936          still replace a register with the return value from the
11937          wrong subroutine call!  */
11938       note_stores (PATTERN (insn), record_dead_and_set_regs_1, NULL_RTX);
11939     }
11940   else
11941     note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
11942 }
11943
11944 /* If a SUBREG has the promoted bit set, it is in fact a property of the
11945    register present in the SUBREG, so for each such SUBREG go back and
11946    adjust nonzero and sign bit information of the registers that are
11947    known to have some zero/sign bits set.
11948
11949    This is needed because when combine blows the SUBREGs away, the
11950    information on zero/sign bits is lost and further combines can be
11951    missed because of that.  */
11952
11953 static void
11954 record_promoted_value (rtx insn, rtx subreg)
11955 {
11956   rtx links, set;
11957   unsigned int regno = REGNO (SUBREG_REG (subreg));
11958   enum machine_mode mode = GET_MODE (subreg);
11959
11960   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
11961     return;
11962
11963   for (links = LOG_LINKS (insn); links;)
11964     {
11965       reg_stat_type *rsp;
11966
11967       insn = XEXP (links, 0);
11968       set = single_set (insn);
11969
11970       if (! set || !REG_P (SET_DEST (set))
11971           || REGNO (SET_DEST (set)) != regno
11972           || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11973         {
11974           links = XEXP (links, 1);
11975           continue;
11976         }
11977
11978       rsp = VEC_index (reg_stat_type, reg_stat, regno);
11979       if (rsp->last_set == insn)
11980         {
11981           if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
11982             rsp->last_set_nonzero_bits &= GET_MODE_MASK (mode);
11983         }
11984
11985       if (REG_P (SET_SRC (set)))
11986         {
11987           regno = REGNO (SET_SRC (set));
11988           links = LOG_LINKS (insn);
11989         }
11990       else
11991         break;
11992     }
11993 }
11994
11995 /* Check if X, a register, is known to contain a value already
11996    truncated to MODE.  In this case we can use a subreg to refer to
11997    the truncated value even though in the generic case we would need
11998    an explicit truncation.  */
11999
12000 static bool
12001 reg_truncated_to_mode (enum machine_mode mode, const_rtx x)
12002 {
12003   reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
12004   enum machine_mode truncated = rsp->truncated_to_mode;
12005
12006   if (truncated == 0
12007       || rsp->truncation_label < label_tick_ebb_start)
12008     return false;
12009   if (GET_MODE_SIZE (truncated) <= GET_MODE_SIZE (mode))
12010     return true;
12011   if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
12012                              GET_MODE_BITSIZE (truncated)))
12013     return true;
12014   return false;
12015 }
12016
12017 /* Callback for for_each_rtx.  If *P is a hard reg or a subreg record the mode
12018    that the register is accessed in.  For non-TRULY_NOOP_TRUNCATION targets we
12019    might be able to turn a truncate into a subreg using this information.
12020    Return -1 if traversing *P is complete or 0 otherwise.  */
12021
12022 static int
12023 record_truncated_value (rtx *p, void *data ATTRIBUTE_UNUSED)
12024 {
12025   rtx x = *p;
12026   enum machine_mode truncated_mode;
12027   reg_stat_type *rsp;
12028
12029   if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)))
12030     {
12031       enum machine_mode original_mode = GET_MODE (SUBREG_REG (x));
12032       truncated_mode = GET_MODE (x);
12033
12034       if (GET_MODE_SIZE (original_mode) <= GET_MODE_SIZE (truncated_mode))
12035         return -1;
12036
12037       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (truncated_mode),
12038                                  GET_MODE_BITSIZE (original_mode)))
12039         return -1;
12040
12041       x = SUBREG_REG (x);
12042     }
12043   /* ??? For hard-regs we now record everything.  We might be able to
12044      optimize this using last_set_mode.  */
12045   else if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
12046     truncated_mode = GET_MODE (x);
12047   else
12048     return 0;
12049
12050   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
12051   if (rsp->truncated_to_mode == 0
12052       || rsp->truncation_label < label_tick_ebb_start
12053       || (GET_MODE_SIZE (truncated_mode)
12054           < GET_MODE_SIZE (rsp->truncated_to_mode)))
12055     {
12056       rsp->truncated_to_mode = truncated_mode;
12057       rsp->truncation_label = label_tick;
12058     }
12059
12060   return -1;
12061 }
12062
12063 /* Callback for note_uses.  Find hardregs and subregs of pseudos and
12064    the modes they are used in.  This can help truning TRUNCATEs into
12065    SUBREGs.  */
12066
12067 static void
12068 record_truncated_values (rtx *x, void *data ATTRIBUTE_UNUSED)
12069 {
12070   for_each_rtx (x, record_truncated_value, NULL);
12071 }
12072
12073 /* Scan X for promoted SUBREGs.  For each one found,
12074    note what it implies to the registers used in it.  */
12075
12076 static void
12077 check_promoted_subreg (rtx insn, rtx x)
12078 {
12079   if (GET_CODE (x) == SUBREG
12080       && SUBREG_PROMOTED_VAR_P (x)
12081       && REG_P (SUBREG_REG (x)))
12082     record_promoted_value (insn, x);
12083   else
12084     {
12085       const char *format = GET_RTX_FORMAT (GET_CODE (x));
12086       int i, j;
12087
12088       for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
12089         switch (format[i])
12090           {
12091           case 'e':
12092             check_promoted_subreg (insn, XEXP (x, i));
12093             break;
12094           case 'V':
12095           case 'E':
12096             if (XVEC (x, i) != 0)
12097               for (j = 0; j < XVECLEN (x, i); j++)
12098                 check_promoted_subreg (insn, XVECEXP (x, i, j));
12099             break;
12100           }
12101     }
12102 }
12103 \f
12104 /* Verify that all the registers and memory references mentioned in *LOC are
12105    still valid.  *LOC was part of a value set in INSN when label_tick was
12106    equal to TICK.  Return 0 if some are not.  If REPLACE is nonzero, replace
12107    the invalid references with (clobber (const_int 0)) and return 1.  This
12108    replacement is useful because we often can get useful information about
12109    the form of a value (e.g., if it was produced by a shift that always
12110    produces -1 or 0) even though we don't know exactly what registers it
12111    was produced from.  */
12112
12113 static int
12114 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
12115 {
12116   rtx x = *loc;
12117   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
12118   int len = GET_RTX_LENGTH (GET_CODE (x));
12119   int i, j;
12120
12121   if (REG_P (x))
12122     {
12123       unsigned int regno = REGNO (x);
12124       unsigned int endregno = END_REGNO (x);
12125       unsigned int j;
12126
12127       for (j = regno; j < endregno; j++)
12128         {
12129           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, j);
12130           if (rsp->last_set_invalid
12131               /* If this is a pseudo-register that was only set once and not
12132                  live at the beginning of the function, it is always valid.  */
12133               || (! (regno >= FIRST_PSEUDO_REGISTER
12134                      && REG_N_SETS (regno) == 1
12135                      && (!REGNO_REG_SET_P
12136                          (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno)))
12137                   && rsp->last_set_label > tick))
12138           {
12139             if (replace)
12140               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12141             return replace;
12142           }
12143         }
12144
12145       return 1;
12146     }
12147   /* If this is a memory reference, make sure that there were no stores after
12148      it that might have clobbered the value.  We don't have alias info, so we
12149      assume any store invalidates it.  Moreover, we only have local UIDs, so
12150      we also assume that there were stores in the intervening basic blocks.  */
12151   else if (MEM_P (x) && !MEM_READONLY_P (x)
12152            && (tick != label_tick || DF_INSN_LUID (insn) <= mem_last_set))
12153     {
12154       if (replace)
12155         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12156       return replace;
12157     }
12158
12159   for (i = 0; i < len; i++)
12160     {
12161       if (fmt[i] == 'e')
12162         {
12163           /* Check for identical subexpressions.  If x contains
12164              identical subexpression we only have to traverse one of
12165              them.  */
12166           if (i == 1 && ARITHMETIC_P (x))
12167             {
12168               /* Note that at this point x0 has already been checked
12169                  and found valid.  */
12170               rtx x0 = XEXP (x, 0);
12171               rtx x1 = XEXP (x, 1);
12172
12173               /* If x0 and x1 are identical then x is also valid.  */
12174               if (x0 == x1)
12175                 return 1;
12176
12177               /* If x1 is identical to a subexpression of x0 then
12178                  while checking x0, x1 has already been checked.  Thus
12179                  it is valid and so as x.  */
12180               if (ARITHMETIC_P (x0)
12181                   && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12182                 return 1;
12183
12184               /* If x0 is identical to a subexpression of x1 then x is
12185                  valid iff the rest of x1 is valid.  */
12186               if (ARITHMETIC_P (x1)
12187                   && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12188                 return
12189                   get_last_value_validate (&XEXP (x1,
12190                                                   x0 == XEXP (x1, 0) ? 1 : 0),
12191                                            insn, tick, replace);
12192             }
12193
12194           if (get_last_value_validate (&XEXP (x, i), insn, tick,
12195                                        replace) == 0)
12196             return 0;
12197         }
12198       else if (fmt[i] == 'E')
12199         for (j = 0; j < XVECLEN (x, i); j++)
12200           if (get_last_value_validate (&XVECEXP (x, i, j),
12201                                        insn, tick, replace) == 0)
12202             return 0;
12203     }
12204
12205   /* If we haven't found a reason for it to be invalid, it is valid.  */
12206   return 1;
12207 }
12208
12209 /* Get the last value assigned to X, if known.  Some registers
12210    in the value may be replaced with (clobber (const_int 0)) if their value
12211    is known longer known reliably.  */
12212
12213 static rtx
12214 get_last_value (const_rtx x)
12215 {
12216   unsigned int regno;
12217   rtx value;
12218   reg_stat_type *rsp;
12219
12220   /* If this is a non-paradoxical SUBREG, get the value of its operand and
12221      then convert it to the desired mode.  If this is a paradoxical SUBREG,
12222      we cannot predict what values the "extra" bits might have.  */
12223   if (GET_CODE (x) == SUBREG
12224       && subreg_lowpart_p (x)
12225       && (GET_MODE_SIZE (GET_MODE (x))
12226           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
12227       && (value = get_last_value (SUBREG_REG (x))) != 0)
12228     return gen_lowpart (GET_MODE (x), value);
12229
12230   if (!REG_P (x))
12231     return 0;
12232
12233   regno = REGNO (x);
12234   rsp = VEC_index (reg_stat_type, reg_stat, regno);
12235   value = rsp->last_set_value;
12236
12237   /* If we don't have a value, or if it isn't for this basic block and
12238      it's either a hard register, set more than once, or it's a live
12239      at the beginning of the function, return 0.
12240
12241      Because if it's not live at the beginning of the function then the reg
12242      is always set before being used (is never used without being set).
12243      And, if it's set only once, and it's always set before use, then all
12244      uses must have the same last value, even if it's not from this basic
12245      block.  */
12246
12247   if (value == 0
12248       || (rsp->last_set_label < label_tick_ebb_start
12249           && (regno < FIRST_PSEUDO_REGISTER
12250               || REG_N_SETS (regno) != 1
12251               || REGNO_REG_SET_P
12252                  (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno))))
12253     return 0;
12254
12255   /* If the value was set in a later insn than the ones we are processing,
12256      we can't use it even if the register was only set once.  */
12257   if (rsp->last_set_label == label_tick
12258       && DF_INSN_LUID (rsp->last_set) >= subst_low_luid)
12259     return 0;
12260
12261   /* If the value has all its registers valid, return it.  */
12262   if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 0))
12263     return value;
12264
12265   /* Otherwise, make a copy and replace any invalid register with
12266      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
12267
12268   value = copy_rtx (value);
12269   if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 1))
12270     return value;
12271
12272   return 0;
12273 }
12274 \f
12275 /* Return nonzero if expression X refers to a REG or to memory
12276    that is set in an instruction more recent than FROM_LUID.  */
12277
12278 static int
12279 use_crosses_set_p (const_rtx x, int from_luid)
12280 {
12281   const char *fmt;
12282   int i;
12283   enum rtx_code code = GET_CODE (x);
12284
12285   if (code == REG)
12286     {
12287       unsigned int regno = REGNO (x);
12288       unsigned endreg = END_REGNO (x);
12289
12290 #ifdef PUSH_ROUNDING
12291       /* Don't allow uses of the stack pointer to be moved,
12292          because we don't know whether the move crosses a push insn.  */
12293       if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
12294         return 1;
12295 #endif
12296       for (; regno < endreg; regno++)
12297         {
12298           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
12299           if (rsp->last_set
12300               && rsp->last_set_label == label_tick
12301               && DF_INSN_LUID (rsp->last_set) > from_luid)
12302             return 1;
12303         }
12304       return 0;
12305     }
12306
12307   if (code == MEM && mem_last_set > from_luid)
12308     return 1;
12309
12310   fmt = GET_RTX_FORMAT (code);
12311
12312   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12313     {
12314       if (fmt[i] == 'E')
12315         {
12316           int j;
12317           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12318             if (use_crosses_set_p (XVECEXP (x, i, j), from_luid))
12319               return 1;
12320         }
12321       else if (fmt[i] == 'e'
12322                && use_crosses_set_p (XEXP (x, i), from_luid))
12323         return 1;
12324     }
12325   return 0;
12326 }
12327 \f
12328 /* Define three variables used for communication between the following
12329    routines.  */
12330
12331 static unsigned int reg_dead_regno, reg_dead_endregno;
12332 static int reg_dead_flag;
12333
12334 /* Function called via note_stores from reg_dead_at_p.
12335
12336    If DEST is within [reg_dead_regno, reg_dead_endregno), set
12337    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
12338
12339 static void
12340 reg_dead_at_p_1 (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
12341 {
12342   unsigned int regno, endregno;
12343
12344   if (!REG_P (dest))
12345     return;
12346
12347   regno = REGNO (dest);
12348   endregno = END_REGNO (dest);
12349   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
12350     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
12351 }
12352
12353 /* Return nonzero if REG is known to be dead at INSN.
12354
12355    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
12356    referencing REG, it is dead.  If we hit a SET referencing REG, it is
12357    live.  Otherwise, see if it is live or dead at the start of the basic
12358    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
12359    must be assumed to be always live.  */
12360
12361 static int
12362 reg_dead_at_p (rtx reg, rtx insn)
12363 {
12364   basic_block block;
12365   unsigned int i;
12366
12367   /* Set variables for reg_dead_at_p_1.  */
12368   reg_dead_regno = REGNO (reg);
12369   reg_dead_endregno = END_REGNO (reg);
12370
12371   reg_dead_flag = 0;
12372
12373   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  For fixed registers
12374      we allow the machine description to decide whether use-and-clobber
12375      patterns are OK.  */
12376   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
12377     {
12378       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12379         if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
12380           return 0;
12381     }
12382
12383   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
12384      beginning of basic block.  */
12385   block = BLOCK_FOR_INSN (insn);
12386   for (;;)
12387     {
12388       if (INSN_P (insn))
12389         {
12390           note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
12391           if (reg_dead_flag)
12392             return reg_dead_flag == 1 ? 1 : 0;
12393
12394           if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
12395             return 1;
12396         }
12397
12398       if (insn == BB_HEAD (block))
12399         break;
12400
12401       insn = PREV_INSN (insn);
12402     }
12403
12404   /* Look at live-in sets for the basic block that we were in.  */
12405   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12406     if (REGNO_REG_SET_P (df_get_live_in (block), i))
12407       return 0;
12408
12409   return 1;
12410 }
12411 \f
12412 /* Note hard registers in X that are used.  */
12413
12414 static void
12415 mark_used_regs_combine (rtx x)
12416 {
12417   RTX_CODE code = GET_CODE (x);
12418   unsigned int regno;
12419   int i;
12420
12421   switch (code)
12422     {
12423     case LABEL_REF:
12424     case SYMBOL_REF:
12425     case CONST_INT:
12426     case CONST:
12427     case CONST_DOUBLE:
12428     case CONST_VECTOR:
12429     case PC:
12430     case ADDR_VEC:
12431     case ADDR_DIFF_VEC:
12432     case ASM_INPUT:
12433 #ifdef HAVE_cc0
12434     /* CC0 must die in the insn after it is set, so we don't need to take
12435        special note of it here.  */
12436     case CC0:
12437 #endif
12438       return;
12439
12440     case CLOBBER:
12441       /* If we are clobbering a MEM, mark any hard registers inside the
12442          address as used.  */
12443       if (MEM_P (XEXP (x, 0)))
12444         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
12445       return;
12446
12447     case REG:
12448       regno = REGNO (x);
12449       /* A hard reg in a wide mode may really be multiple registers.
12450          If so, mark all of them just like the first.  */
12451       if (regno < FIRST_PSEUDO_REGISTER)
12452         {
12453           /* None of this applies to the stack, frame or arg pointers.  */
12454           if (regno == STACK_POINTER_REGNUM
12455 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
12456               || regno == HARD_FRAME_POINTER_REGNUM
12457 #endif
12458 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
12459               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
12460 #endif
12461               || regno == FRAME_POINTER_REGNUM)
12462             return;
12463
12464           add_to_hard_reg_set (&newpat_used_regs, GET_MODE (x), regno);
12465         }
12466       return;
12467
12468     case SET:
12469       {
12470         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
12471            the address.  */
12472         rtx testreg = SET_DEST (x);
12473
12474         while (GET_CODE (testreg) == SUBREG
12475                || GET_CODE (testreg) == ZERO_EXTRACT
12476                || GET_CODE (testreg) == STRICT_LOW_PART)
12477           testreg = XEXP (testreg, 0);
12478
12479         if (MEM_P (testreg))
12480           mark_used_regs_combine (XEXP (testreg, 0));
12481
12482         mark_used_regs_combine (SET_SRC (x));
12483       }
12484       return;
12485
12486     default:
12487       break;
12488     }
12489
12490   /* Recursively scan the operands of this expression.  */
12491
12492   {
12493     const char *fmt = GET_RTX_FORMAT (code);
12494
12495     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12496       {
12497         if (fmt[i] == 'e')
12498           mark_used_regs_combine (XEXP (x, i));
12499         else if (fmt[i] == 'E')
12500           {
12501             int j;
12502
12503             for (j = 0; j < XVECLEN (x, i); j++)
12504               mark_used_regs_combine (XVECEXP (x, i, j));
12505           }
12506       }
12507   }
12508 }
12509 \f
12510 /* Remove register number REGNO from the dead registers list of INSN.
12511
12512    Return the note used to record the death, if there was one.  */
12513
12514 rtx
12515 remove_death (unsigned int regno, rtx insn)
12516 {
12517   rtx note = find_regno_note (insn, REG_DEAD, regno);
12518
12519   if (note)
12520     remove_note (insn, note);
12521
12522   return note;
12523 }
12524
12525 /* For each register (hardware or pseudo) used within expression X, if its
12526    death is in an instruction with luid between FROM_LUID (inclusive) and
12527    TO_INSN (exclusive), put a REG_DEAD note for that register in the
12528    list headed by PNOTES.
12529
12530    That said, don't move registers killed by maybe_kill_insn.
12531
12532    This is done when X is being merged by combination into TO_INSN.  These
12533    notes will then be distributed as needed.  */
12534
12535 static void
12536 move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx to_insn,
12537              rtx *pnotes)
12538 {
12539   const char *fmt;
12540   int len, i;
12541   enum rtx_code code = GET_CODE (x);
12542
12543   if (code == REG)
12544     {
12545       unsigned int regno = REGNO (x);
12546       rtx where_dead = VEC_index (reg_stat_type, reg_stat, regno)->last_death;
12547
12548       /* Don't move the register if it gets killed in between from and to.  */
12549       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
12550           && ! reg_referenced_p (x, maybe_kill_insn))
12551         return;
12552
12553       if (where_dead
12554           && BLOCK_FOR_INSN (where_dead) == BLOCK_FOR_INSN (to_insn)
12555           && DF_INSN_LUID (where_dead) >= from_luid
12556           && DF_INSN_LUID (where_dead) < DF_INSN_LUID (to_insn))
12557         {
12558           rtx note = remove_death (regno, where_dead);
12559
12560           /* It is possible for the call above to return 0.  This can occur
12561              when last_death points to I2 or I1 that we combined with.
12562              In that case make a new note.
12563
12564              We must also check for the case where X is a hard register
12565              and NOTE is a death note for a range of hard registers
12566              including X.  In that case, we must put REG_DEAD notes for
12567              the remaining registers in place of NOTE.  */
12568
12569           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
12570               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12571                   > GET_MODE_SIZE (GET_MODE (x))))
12572             {
12573               unsigned int deadregno = REGNO (XEXP (note, 0));
12574               unsigned int deadend = END_HARD_REGNO (XEXP (note, 0));
12575               unsigned int ourend = END_HARD_REGNO (x);
12576               unsigned int i;
12577
12578               for (i = deadregno; i < deadend; i++)
12579                 if (i < regno || i >= ourend)
12580                   add_reg_note (where_dead, REG_DEAD, regno_reg_rtx[i]);
12581             }
12582
12583           /* If we didn't find any note, or if we found a REG_DEAD note that
12584              covers only part of the given reg, and we have a multi-reg hard
12585              register, then to be safe we must check for REG_DEAD notes
12586              for each register other than the first.  They could have
12587              their own REG_DEAD notes lying around.  */
12588           else if ((note == 0
12589                     || (note != 0
12590                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12591                             < GET_MODE_SIZE (GET_MODE (x)))))
12592                    && regno < FIRST_PSEUDO_REGISTER
12593                    && hard_regno_nregs[regno][GET_MODE (x)] > 1)
12594             {
12595               unsigned int ourend = END_HARD_REGNO (x);
12596               unsigned int i, offset;
12597               rtx oldnotes = 0;
12598
12599               if (note)
12600                 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
12601               else
12602                 offset = 1;
12603
12604               for (i = regno + offset; i < ourend; i++)
12605                 move_deaths (regno_reg_rtx[i],
12606                              maybe_kill_insn, from_luid, to_insn, &oldnotes);
12607             }
12608
12609           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
12610             {
12611               XEXP (note, 1) = *pnotes;
12612               *pnotes = note;
12613             }
12614           else
12615             *pnotes = alloc_reg_note (REG_DEAD, x, *pnotes);
12616         }
12617
12618       return;
12619     }
12620
12621   else if (GET_CODE (x) == SET)
12622     {
12623       rtx dest = SET_DEST (x);
12624
12625       move_deaths (SET_SRC (x), maybe_kill_insn, from_luid, to_insn, pnotes);
12626
12627       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
12628          that accesses one word of a multi-word item, some
12629          piece of everything register in the expression is used by
12630          this insn, so remove any old death.  */
12631       /* ??? So why do we test for equality of the sizes?  */
12632
12633       if (GET_CODE (dest) == ZERO_EXTRACT
12634           || GET_CODE (dest) == STRICT_LOW_PART
12635           || (GET_CODE (dest) == SUBREG
12636               && (((GET_MODE_SIZE (GET_MODE (dest))
12637                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
12638                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
12639                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
12640         {
12641           move_deaths (dest, maybe_kill_insn, from_luid, to_insn, pnotes);
12642           return;
12643         }
12644
12645       /* If this is some other SUBREG, we know it replaces the entire
12646          value, so use that as the destination.  */
12647       if (GET_CODE (dest) == SUBREG)
12648         dest = SUBREG_REG (dest);
12649
12650       /* If this is a MEM, adjust deaths of anything used in the address.
12651          For a REG (the only other possibility), the entire value is
12652          being replaced so the old value is not used in this insn.  */
12653
12654       if (MEM_P (dest))
12655         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_luid,
12656                      to_insn, pnotes);
12657       return;
12658     }
12659
12660   else if (GET_CODE (x) == CLOBBER)
12661     return;
12662
12663   len = GET_RTX_LENGTH (code);
12664   fmt = GET_RTX_FORMAT (code);
12665
12666   for (i = 0; i < len; i++)
12667     {
12668       if (fmt[i] == 'E')
12669         {
12670           int j;
12671           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12672             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_luid,
12673                          to_insn, pnotes);
12674         }
12675       else if (fmt[i] == 'e')
12676         move_deaths (XEXP (x, i), maybe_kill_insn, from_luid, to_insn, pnotes);
12677     }
12678 }
12679 \f
12680 /* Return 1 if X is the target of a bit-field assignment in BODY, the
12681    pattern of an insn.  X must be a REG.  */
12682
12683 static int
12684 reg_bitfield_target_p (rtx x, rtx body)
12685 {
12686   int i;
12687
12688   if (GET_CODE (body) == SET)
12689     {
12690       rtx dest = SET_DEST (body);
12691       rtx target;
12692       unsigned int regno, tregno, endregno, endtregno;
12693
12694       if (GET_CODE (dest) == ZERO_EXTRACT)
12695         target = XEXP (dest, 0);
12696       else if (GET_CODE (dest) == STRICT_LOW_PART)
12697         target = SUBREG_REG (XEXP (dest, 0));
12698       else
12699         return 0;
12700
12701       if (GET_CODE (target) == SUBREG)
12702         target = SUBREG_REG (target);
12703
12704       if (!REG_P (target))
12705         return 0;
12706
12707       tregno = REGNO (target), regno = REGNO (x);
12708       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
12709         return target == x;
12710
12711       endtregno = end_hard_regno (GET_MODE (target), tregno);
12712       endregno = end_hard_regno (GET_MODE (x), regno);
12713
12714       return endregno > tregno && regno < endtregno;
12715     }
12716
12717   else if (GET_CODE (body) == PARALLEL)
12718     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
12719       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
12720         return 1;
12721
12722   return 0;
12723 }
12724 \f
12725 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
12726    as appropriate.  I3 and I2 are the insns resulting from the combination
12727    insns including FROM (I2 may be zero).
12728
12729    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
12730    not need REG_DEAD notes because they are being substituted for.  This
12731    saves searching in the most common cases.
12732
12733    Each note in the list is either ignored or placed on some insns, depending
12734    on the type of note.  */
12735
12736 static void
12737 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
12738                   rtx elim_i1)
12739 {
12740   rtx note, next_note;
12741   rtx tem;
12742
12743   for (note = notes; note; note = next_note)
12744     {
12745       rtx place = 0, place2 = 0;
12746
12747       next_note = XEXP (note, 1);
12748       switch (REG_NOTE_KIND (note))
12749         {
12750         case REG_BR_PROB:
12751         case REG_BR_PRED:
12752           /* Doesn't matter much where we put this, as long as it's somewhere.
12753              It is preferable to keep these notes on branches, which is most
12754              likely to be i3.  */
12755           place = i3;
12756           break;
12757
12758         case REG_VALUE_PROFILE:
12759           /* Just get rid of this note, as it is unused later anyway.  */
12760           break;
12761
12762         case REG_NON_LOCAL_GOTO:
12763           if (JUMP_P (i3))
12764             place = i3;
12765           else
12766             {
12767               gcc_assert (i2 && JUMP_P (i2));
12768               place = i2;
12769             }
12770           break;
12771
12772         case REG_EH_REGION:
12773           /* These notes must remain with the call or trapping instruction.  */
12774           if (CALL_P (i3))
12775             place = i3;
12776           else if (i2 && CALL_P (i2))
12777             place = i2;
12778           else
12779             {
12780               gcc_assert (cfun->can_throw_non_call_exceptions);
12781               if (may_trap_p (i3))
12782                 place = i3;
12783               else if (i2 && may_trap_p (i2))
12784                 place = i2;
12785               /* ??? Otherwise assume we've combined things such that we
12786                  can now prove that the instructions can't trap.  Drop the
12787                  note in this case.  */
12788             }
12789           break;
12790
12791         case REG_NORETURN:
12792         case REG_SETJMP:
12793           /* These notes must remain with the call.  It should not be
12794              possible for both I2 and I3 to be a call.  */
12795           if (CALL_P (i3))
12796             place = i3;
12797           else
12798             {
12799               gcc_assert (i2 && CALL_P (i2));
12800               place = i2;
12801             }
12802           break;
12803
12804         case REG_UNUSED:
12805           /* Any clobbers for i3 may still exist, and so we must process
12806              REG_UNUSED notes from that insn.
12807
12808              Any clobbers from i2 or i1 can only exist if they were added by
12809              recog_for_combine.  In that case, recog_for_combine created the
12810              necessary REG_UNUSED notes.  Trying to keep any original
12811              REG_UNUSED notes from these insns can cause incorrect output
12812              if it is for the same register as the original i3 dest.
12813              In that case, we will notice that the register is set in i3,
12814              and then add a REG_UNUSED note for the destination of i3, which
12815              is wrong.  However, it is possible to have REG_UNUSED notes from
12816              i2 or i1 for register which were both used and clobbered, so
12817              we keep notes from i2 or i1 if they will turn into REG_DEAD
12818              notes.  */
12819
12820           /* If this register is set or clobbered in I3, put the note there
12821              unless there is one already.  */
12822           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
12823             {
12824               if (from_insn != i3)
12825                 break;
12826
12827               if (! (REG_P (XEXP (note, 0))
12828                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
12829                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
12830                 place = i3;
12831             }
12832           /* Otherwise, if this register is used by I3, then this register
12833              now dies here, so we must put a REG_DEAD note here unless there
12834              is one already.  */
12835           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
12836                    && ! (REG_P (XEXP (note, 0))
12837                          ? find_regno_note (i3, REG_DEAD,
12838                                             REGNO (XEXP (note, 0)))
12839                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
12840             {
12841               PUT_REG_NOTE_KIND (note, REG_DEAD);
12842               place = i3;
12843             }
12844           break;
12845
12846         case REG_EQUAL:
12847         case REG_EQUIV:
12848         case REG_NOALIAS:
12849           /* These notes say something about results of an insn.  We can
12850              only support them if they used to be on I3 in which case they
12851              remain on I3.  Otherwise they are ignored.
12852
12853              If the note refers to an expression that is not a constant, we
12854              must also ignore the note since we cannot tell whether the
12855              equivalence is still true.  It might be possible to do
12856              slightly better than this (we only have a problem if I2DEST
12857              or I1DEST is present in the expression), but it doesn't
12858              seem worth the trouble.  */
12859
12860           if (from_insn == i3
12861               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
12862             place = i3;
12863           break;
12864
12865         case REG_INC:
12866           /* These notes say something about how a register is used.  They must
12867              be present on any use of the register in I2 or I3.  */
12868           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
12869             place = i3;
12870
12871           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
12872             {
12873               if (place)
12874                 place2 = i2;
12875               else
12876                 place = i2;
12877             }
12878           break;
12879
12880         case REG_LABEL_TARGET:
12881         case REG_LABEL_OPERAND:
12882           /* This can show up in several ways -- either directly in the
12883              pattern, or hidden off in the constant pool with (or without?)
12884              a REG_EQUAL note.  */
12885           /* ??? Ignore the without-reg_equal-note problem for now.  */
12886           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
12887               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
12888                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12889                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
12890             place = i3;
12891
12892           if (i2
12893               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
12894                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
12895                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12896                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
12897             {
12898               if (place)
12899                 place2 = i2;
12900               else
12901                 place = i2;
12902             }
12903
12904           /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
12905              as a JUMP_LABEL or decrement LABEL_NUSES if it's already
12906              there.  */
12907           if (place && JUMP_P (place)
12908               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
12909               && (JUMP_LABEL (place) == NULL
12910                   || JUMP_LABEL (place) == XEXP (note, 0)))
12911             {
12912               rtx label = JUMP_LABEL (place);
12913
12914               if (!label)
12915                 JUMP_LABEL (place) = XEXP (note, 0);
12916               else if (LABEL_P (label))
12917                 LABEL_NUSES (label)--;
12918             }
12919
12920           if (place2 && JUMP_P (place2)
12921               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
12922               && (JUMP_LABEL (place2) == NULL
12923                   || JUMP_LABEL (place2) == XEXP (note, 0)))
12924             {
12925               rtx label = JUMP_LABEL (place2);
12926
12927               if (!label)
12928                 JUMP_LABEL (place2) = XEXP (note, 0);
12929               else if (LABEL_P (label))
12930                 LABEL_NUSES (label)--;
12931               place2 = 0;
12932             }
12933           break;
12934
12935         case REG_NONNEG:
12936           /* This note says something about the value of a register prior
12937              to the execution of an insn.  It is too much trouble to see
12938              if the note is still correct in all situations.  It is better
12939              to simply delete it.  */
12940           break;
12941
12942         case REG_DEAD:
12943           /* If we replaced the right hand side of FROM_INSN with a
12944              REG_EQUAL note, the original use of the dying register
12945              will not have been combined into I3 and I2.  In such cases,
12946              FROM_INSN is guaranteed to be the first of the combined
12947              instructions, so we simply need to search back before
12948              FROM_INSN for the previous use or set of this register,
12949              then alter the notes there appropriately.
12950
12951              If the register is used as an input in I3, it dies there.
12952              Similarly for I2, if it is nonzero and adjacent to I3.
12953
12954              If the register is not used as an input in either I3 or I2
12955              and it is not one of the registers we were supposed to eliminate,
12956              there are two possibilities.  We might have a non-adjacent I2
12957              or we might have somehow eliminated an additional register
12958              from a computation.  For example, we might have had A & B where
12959              we discover that B will always be zero.  In this case we will
12960              eliminate the reference to A.
12961
12962              In both cases, we must search to see if we can find a previous
12963              use of A and put the death note there.  */
12964
12965           if (from_insn
12966               && from_insn == i2mod
12967               && !reg_overlap_mentioned_p (XEXP (note, 0), i2mod_new_rhs))
12968             tem = from_insn;
12969           else
12970             {
12971               if (from_insn
12972                   && CALL_P (from_insn)
12973                   && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
12974                 place = from_insn;
12975               else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
12976                 place = i3;
12977               else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
12978                        && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12979                 place = i2;
12980               else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
12981                         && !(i2mod
12982                              && reg_overlap_mentioned_p (XEXP (note, 0),
12983                                                          i2mod_old_rhs)))
12984                        || rtx_equal_p (XEXP (note, 0), elim_i1))
12985                 break;
12986               tem = i3;
12987             }
12988
12989           if (place == 0)
12990             {
12991               basic_block bb = this_basic_block;
12992
12993               for (tem = PREV_INSN (tem); place == 0; tem = PREV_INSN (tem))
12994                 {
12995                   if (!NONDEBUG_INSN_P (tem))
12996                     {
12997                       if (tem == BB_HEAD (bb))
12998                         break;
12999                       continue;
13000                     }
13001
13002                   /* If the register is being set at TEM, see if that is all
13003                      TEM is doing.  If so, delete TEM.  Otherwise, make this
13004                      into a REG_UNUSED note instead. Don't delete sets to
13005                      global register vars.  */
13006                   if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
13007                        || !global_regs[REGNO (XEXP (note, 0))])
13008                       && reg_set_p (XEXP (note, 0), PATTERN (tem)))
13009                     {
13010                       rtx set = single_set (tem);
13011                       rtx inner_dest = 0;
13012 #ifdef HAVE_cc0
13013                       rtx cc0_setter = NULL_RTX;
13014 #endif
13015
13016                       if (set != 0)
13017                         for (inner_dest = SET_DEST (set);
13018                              (GET_CODE (inner_dest) == STRICT_LOW_PART
13019                               || GET_CODE (inner_dest) == SUBREG
13020                               || GET_CODE (inner_dest) == ZERO_EXTRACT);
13021                              inner_dest = XEXP (inner_dest, 0))
13022                           ;
13023
13024                       /* Verify that it was the set, and not a clobber that
13025                          modified the register.
13026
13027                          CC0 targets must be careful to maintain setter/user
13028                          pairs.  If we cannot delete the setter due to side
13029                          effects, mark the user with an UNUSED note instead
13030                          of deleting it.  */
13031
13032                       if (set != 0 && ! side_effects_p (SET_SRC (set))
13033                           && rtx_equal_p (XEXP (note, 0), inner_dest)
13034 #ifdef HAVE_cc0
13035                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
13036                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
13037                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
13038 #endif
13039                           )
13040                         {
13041                           /* Move the notes and links of TEM elsewhere.
13042                              This might delete other dead insns recursively.
13043                              First set the pattern to something that won't use
13044                              any register.  */
13045                           rtx old_notes = REG_NOTES (tem);
13046
13047                           PATTERN (tem) = pc_rtx;
13048                           REG_NOTES (tem) = NULL;
13049
13050                           distribute_notes (old_notes, tem, tem, NULL_RTX,
13051                                             NULL_RTX, NULL_RTX);
13052                           distribute_links (LOG_LINKS (tem));
13053
13054                           SET_INSN_DELETED (tem);
13055                           if (tem == i2)
13056                             i2 = NULL_RTX;
13057
13058 #ifdef HAVE_cc0
13059                           /* Delete the setter too.  */
13060                           if (cc0_setter)
13061                             {
13062                               PATTERN (cc0_setter) = pc_rtx;
13063                               old_notes = REG_NOTES (cc0_setter);
13064                               REG_NOTES (cc0_setter) = NULL;
13065
13066                               distribute_notes (old_notes, cc0_setter,
13067                                                 cc0_setter, NULL_RTX,
13068                                                 NULL_RTX, NULL_RTX);
13069                               distribute_links (LOG_LINKS (cc0_setter));
13070
13071                               SET_INSN_DELETED (cc0_setter);
13072                               if (cc0_setter == i2)
13073                                 i2 = NULL_RTX;
13074                             }
13075 #endif
13076                         }
13077                       else
13078                         {
13079                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
13080
13081                           /*  If there isn't already a REG_UNUSED note, put one
13082                               here.  Do not place a REG_DEAD note, even if
13083                               the register is also used here; that would not
13084                               match the algorithm used in lifetime analysis
13085                               and can cause the consistency check in the
13086                               scheduler to fail.  */
13087                           if (! find_regno_note (tem, REG_UNUSED,
13088                                                  REGNO (XEXP (note, 0))))
13089                             place = tem;
13090                           break;
13091                         }
13092                     }
13093                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
13094                            || (CALL_P (tem)
13095                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
13096                     {
13097                       place = tem;
13098
13099                       /* If we are doing a 3->2 combination, and we have a
13100                          register which formerly died in i3 and was not used
13101                          by i2, which now no longer dies in i3 and is used in
13102                          i2 but does not die in i2, and place is between i2
13103                          and i3, then we may need to move a link from place to
13104                          i2.  */
13105                       if (i2 && DF_INSN_LUID (place) > DF_INSN_LUID (i2)
13106                           && from_insn
13107                           && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
13108                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
13109                         {
13110                           rtx links = LOG_LINKS (place);
13111                           LOG_LINKS (place) = 0;
13112                           distribute_links (links);
13113                         }
13114                       break;
13115                     }
13116
13117                   if (tem == BB_HEAD (bb))
13118                     break;
13119                 }
13120
13121             }
13122
13123           /* If the register is set or already dead at PLACE, we needn't do
13124              anything with this note if it is still a REG_DEAD note.
13125              We check here if it is set at all, not if is it totally replaced,
13126              which is what `dead_or_set_p' checks, so also check for it being
13127              set partially.  */
13128
13129           if (place && REG_NOTE_KIND (note) == REG_DEAD)
13130             {
13131               unsigned int regno = REGNO (XEXP (note, 0));
13132               reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
13133
13134               if (dead_or_set_p (place, XEXP (note, 0))
13135                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
13136                 {
13137                   /* Unless the register previously died in PLACE, clear
13138                      last_death.  [I no longer understand why this is
13139                      being done.] */
13140                   if (rsp->last_death != place)
13141                     rsp->last_death = 0;
13142                   place = 0;
13143                 }
13144               else
13145                 rsp->last_death = place;
13146
13147               /* If this is a death note for a hard reg that is occupying
13148                  multiple registers, ensure that we are still using all
13149                  parts of the object.  If we find a piece of the object
13150                  that is unused, we must arrange for an appropriate REG_DEAD
13151                  note to be added for it.  However, we can't just emit a USE
13152                  and tag the note to it, since the register might actually
13153                  be dead; so we recourse, and the recursive call then finds
13154                  the previous insn that used this register.  */
13155
13156               if (place && regno < FIRST_PSEUDO_REGISTER
13157                   && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
13158                 {
13159                   unsigned int endregno = END_HARD_REGNO (XEXP (note, 0));
13160                   int all_used = 1;
13161                   unsigned int i;
13162
13163                   for (i = regno; i < endregno; i++)
13164                     if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
13165                          && ! find_regno_fusage (place, USE, i))
13166                         || dead_or_set_regno_p (place, i))
13167                       all_used = 0;
13168
13169                   if (! all_used)
13170                     {
13171                       /* Put only REG_DEAD notes for pieces that are
13172                          not already dead or set.  */
13173
13174                       for (i = regno; i < endregno;
13175                            i += hard_regno_nregs[i][reg_raw_mode[i]])
13176                         {
13177                           rtx piece = regno_reg_rtx[i];
13178                           basic_block bb = this_basic_block;
13179
13180                           if (! dead_or_set_p (place, piece)
13181                               && ! reg_bitfield_target_p (piece,
13182                                                           PATTERN (place)))
13183                             {
13184                               rtx new_note = alloc_reg_note (REG_DEAD, piece,
13185                                                              NULL_RTX);
13186
13187                               distribute_notes (new_note, place, place,
13188                                                 NULL_RTX, NULL_RTX, NULL_RTX);
13189                             }
13190                           else if (! refers_to_regno_p (i, i + 1,
13191                                                         PATTERN (place), 0)
13192                                    && ! find_regno_fusage (place, USE, i))
13193                             for (tem = PREV_INSN (place); ;
13194                                  tem = PREV_INSN (tem))
13195                               {
13196                                 if (!NONDEBUG_INSN_P (tem))
13197                                   {
13198                                     if (tem == BB_HEAD (bb))
13199                                       break;
13200                                     continue;
13201                                   }
13202                                 if (dead_or_set_p (tem, piece)
13203                                     || reg_bitfield_target_p (piece,
13204                                                               PATTERN (tem)))
13205                                   {
13206                                     add_reg_note (tem, REG_UNUSED, piece);
13207                                     break;
13208                                   }
13209                               }
13210
13211                         }
13212
13213                       place = 0;
13214                     }
13215                 }
13216             }
13217           break;
13218
13219         default:
13220           /* Any other notes should not be present at this point in the
13221              compilation.  */
13222           gcc_unreachable ();
13223         }
13224
13225       if (place)
13226         {
13227           XEXP (note, 1) = REG_NOTES (place);
13228           REG_NOTES (place) = note;
13229         }
13230
13231       if (place2)
13232         add_reg_note (place2, REG_NOTE_KIND (note), XEXP (note, 0));
13233     }
13234 }
13235 \f
13236 /* Similarly to above, distribute the LOG_LINKS that used to be present on
13237    I3, I2, and I1 to new locations.  This is also called to add a link
13238    pointing at I3 when I3's destination is changed.  */
13239
13240 static void
13241 distribute_links (rtx links)
13242 {
13243   rtx link, next_link;
13244
13245   for (link = links; link; link = next_link)
13246     {
13247       rtx place = 0;
13248       rtx insn;
13249       rtx set, reg;
13250
13251       next_link = XEXP (link, 1);
13252
13253       /* If the insn that this link points to is a NOTE or isn't a single
13254          set, ignore it.  In the latter case, it isn't clear what we
13255          can do other than ignore the link, since we can't tell which
13256          register it was for.  Such links wouldn't be used by combine
13257          anyway.
13258
13259          It is not possible for the destination of the target of the link to
13260          have been changed by combine.  The only potential of this is if we
13261          replace I3, I2, and I1 by I3 and I2.  But in that case the
13262          destination of I2 also remains unchanged.  */
13263
13264       if (NOTE_P (XEXP (link, 0))
13265           || (set = single_set (XEXP (link, 0))) == 0)
13266         continue;
13267
13268       reg = SET_DEST (set);
13269       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
13270              || GET_CODE (reg) == STRICT_LOW_PART)
13271         reg = XEXP (reg, 0);
13272
13273       /* A LOG_LINK is defined as being placed on the first insn that uses
13274          a register and points to the insn that sets the register.  Start
13275          searching at the next insn after the target of the link and stop
13276          when we reach a set of the register or the end of the basic block.
13277
13278          Note that this correctly handles the link that used to point from
13279          I3 to I2.  Also note that not much searching is typically done here
13280          since most links don't point very far away.  */
13281
13282       for (insn = NEXT_INSN (XEXP (link, 0));
13283            (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
13284                      || BB_HEAD (this_basic_block->next_bb) != insn));
13285            insn = NEXT_INSN (insn))
13286         if (DEBUG_INSN_P (insn))
13287           continue;
13288         else if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
13289           {
13290             if (reg_referenced_p (reg, PATTERN (insn)))
13291               place = insn;
13292             break;
13293           }
13294         else if (CALL_P (insn)
13295                  && find_reg_fusage (insn, USE, reg))
13296           {
13297             place = insn;
13298             break;
13299           }
13300         else if (INSN_P (insn) && reg_set_p (reg, insn))
13301           break;
13302
13303       /* If we found a place to put the link, place it there unless there
13304          is already a link to the same insn as LINK at that point.  */
13305
13306       if (place)
13307         {
13308           rtx link2;
13309
13310           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
13311             if (XEXP (link2, 0) == XEXP (link, 0))
13312               break;
13313
13314           if (link2 == 0)
13315             {
13316               XEXP (link, 1) = LOG_LINKS (place);
13317               LOG_LINKS (place) = link;
13318
13319               /* Set added_links_insn to the earliest insn we added a
13320                  link to.  */
13321               if (added_links_insn == 0
13322                   || DF_INSN_LUID (added_links_insn) > DF_INSN_LUID (place))
13323                 added_links_insn = place;
13324             }
13325         }
13326     }
13327 }
13328 \f
13329 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
13330    Check whether the expression pointer to by LOC is a register or
13331    memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
13332    Otherwise return zero.  */
13333
13334 static int
13335 unmentioned_reg_p_1 (rtx *loc, void *expr)
13336 {
13337   rtx x = *loc;
13338
13339   if (x != NULL_RTX
13340       && (REG_P (x) || MEM_P (x))
13341       && ! reg_mentioned_p (x, (rtx) expr))
13342     return 1;
13343   return 0;
13344 }
13345
13346 /* Check for any register or memory mentioned in EQUIV that is not
13347    mentioned in EXPR.  This is used to restrict EQUIV to "specializations"
13348    of EXPR where some registers may have been replaced by constants.  */
13349
13350 static bool
13351 unmentioned_reg_p (rtx equiv, rtx expr)
13352 {
13353   return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
13354 }
13355 \f
13356 void
13357 dump_combine_stats (FILE *file)
13358 {
13359   fprintf
13360     (file,
13361      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
13362      combine_attempts, combine_merges, combine_extras, combine_successes);
13363 }
13364
13365 void
13366 dump_combine_total_stats (FILE *file)
13367 {
13368   fprintf
13369     (file,
13370      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
13371      total_attempts, total_merges, total_extras, total_successes);
13372 }
13373 \f
13374 static bool
13375 gate_handle_combine (void)
13376 {
13377   return (optimize > 0);
13378 }
13379
13380 /* Try combining insns through substitution.  */
13381 static unsigned int
13382 rest_of_handle_combine (void)
13383 {
13384   int rebuild_jump_labels_after_combine;
13385
13386   df_set_flags (DF_LR_RUN_DCE + DF_DEFER_INSN_RESCAN);
13387   df_note_add_problem ();
13388   df_analyze ();
13389
13390   regstat_init_n_sets_and_refs ();
13391
13392   rebuild_jump_labels_after_combine
13393     = combine_instructions (get_insns (), max_reg_num ());
13394
13395   /* Combining insns may have turned an indirect jump into a
13396      direct jump.  Rebuild the JUMP_LABEL fields of jumping
13397      instructions.  */
13398   if (rebuild_jump_labels_after_combine)
13399     {
13400       timevar_push (TV_JUMP);
13401       rebuild_jump_labels (get_insns ());
13402       cleanup_cfg (0);
13403       timevar_pop (TV_JUMP);
13404     }
13405
13406   regstat_free_n_sets_and_refs ();
13407   return 0;
13408 }
13409
13410 struct rtl_opt_pass pass_combine =
13411 {
13412  {
13413   RTL_PASS,
13414   "combine",                            /* name */
13415   gate_handle_combine,                  /* gate */
13416   rest_of_handle_combine,               /* execute */
13417   NULL,                                 /* sub */
13418   NULL,                                 /* next */
13419   0,                                    /* static_pass_number */
13420   TV_COMBINE,                           /* tv_id */
13421   PROP_cfglayout,                       /* properties_required */
13422   0,                                    /* properties_provided */
13423   0,                                    /* properties_destroyed */
13424   0,                                    /* todo_flags_start */
13425   TODO_dump_func |
13426   TODO_df_finish | TODO_verify_rtl_sharing |
13427   TODO_ggc_collect,                     /* todo_flags_finish */
13428  }
13429 };